Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Flipper-Zero/STM32CubeWB.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Labbene <ali.labbene@st.com>2020-04-17 10:29:58 +0300
committerAli Labbene <ali.labbene@st.com>2020-04-17 10:51:45 +0300
commitd8e9414ce0284d50c815a3472727fe6670c3678a (patch)
tree4f5f77a0d17fcbbd736da7977a53ed3c25fb95a1
parentf23dd7def77aeafd886aa69a56259143f8db7a6d (diff)
Release v1.6.0v1.6.0
-rw-r--r--Documentation/STM32CubeWBGettingStarted.pdfbin588649 -> 591741 bytes
-rw-r--r--Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildDspLibs.bat116
-rw-r--r--Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildRefLibs.bat116
-rw-r--r--Drivers/CMSIS/DSP/DSP_Lib_TestSuite/runTest.bat129
-rw-r--r--Drivers/CMSIS/DSP/Projects/ARM/arm_cortexM_math_Build.bat83
-rw-r--r--Drivers/CMSIS/DSP/Projects/GCC/arm_cortexM_math_Build.bat83
-rw-r--r--Drivers/CMSIS/DSP/Projects/IAR/arm_cortexM_math_Build.bat104
-rw-r--r--Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/runTest.bat57
-rw-r--r--Middlewares/ST/STM32_WPAN/Release_Notes.html301
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/ble_common.h8
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c37
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h27
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.h8
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.h45
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h7
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h11
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/doc/STM32WB_BLE_Wireless_Interface.html26
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h29
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h24
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h43
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h43
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h43
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h62
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h78
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h24
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h42
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h41
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h42
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h24
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h22
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h22
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h22
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h21
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h470
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h40
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC.abin0 -> 134442 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_fpu.abin0 -> 134462 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot.abin0 -> 192110 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot_fpu.abin0 -> 192154 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.abin0 -> 359254 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_fpu.abin0 -> 359242 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc.abin0 -> 239764 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc_fpu.abin0 -> 239752 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.libbin0 -> 209100 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf_fpu.libbin0 -> 225024 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf.libbin0 -> 222564 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf_fpu.libbin0 -> 238236 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h22
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h6
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC.abin358334 -> 358504 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC_DEBUG.abin3713088 -> 3730666 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.abin500654 -> 503392 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR_DEBUG.abin2726184 -> 2721556 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.libbin525496 -> 527130 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil_DEBUG.libbin3620812 -> 3626474 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h28
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/config_client.h24
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h41
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h65
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_lc.h69
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/blob.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c350
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c58
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c539
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c970
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c650
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/meshdfu_node.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c77
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c6
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c1
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c1078
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c39
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c1
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c25
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c50
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/svc/Inc/uuid.h11
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c286
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/hw.h15
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/lhci/lhci.c12
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c18
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c107
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/mbox_def.h19
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c94
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl.h19
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c162
-rw-r--r--Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc/802_15_4_mac_config.h2
-rw-r--r--Middlewares/ST/STM32_WPAN/mac_802_15_4/core/src/mac_802_15_4_core_wb.c3
-rw-r--r--Middlewares/ST/STM32_WPAN/stm32_wpan_common.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c3
-rw-r--r--Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c10
-rw-r--r--Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/stm32wbxx_core_interface_def.h3
-rw-r--r--Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c29
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/SLA0044.txt65
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/STM32WB_ZigbeeGettingStarted.pdfbin0 -> 1353831 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/core/inc/stm32wbxx_core_interface_def.h226
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/core/inc/zigbee_interface.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c1599
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewd1440
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewp1385
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewt1527
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.eww10
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvoptx1440
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvprojx932
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib.abin3011600 -> 4251936 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib_keil.libbin0 -> 14145966 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/platform/ee.c700
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/platform/ee.h213
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/platform/ee_cfg.h29
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.c152
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.h103
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/readme.txt6
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras/zigbee.extras.h43
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/ieee802154_enums.h85
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/llist.h13
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/mcp_enums.h586
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.drlc.h227
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.keepalive.h40
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.attr.gbcs.h577
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.h696
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.attr.gbcs.h35
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.h318
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.tunnel.h156
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_ace.h5
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_wd.h5
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_zone.h10
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.alarm.h7
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.color.h619
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h256
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.dehum.ctrl.h40
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h111
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h946
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.elec.meas.h384
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h60
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h120
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.h227
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.identify.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.illum.level.h70
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.level.h220
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.nearest.gw.h27
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.h8
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.swconfig.h50
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h430
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.payload.h177
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.poll.control.h171
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.config.h158
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.profile.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.pump.h65
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.rssi.loc.h259
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h333
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h299
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.voice.h141
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.water.content.meas.h67
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.window.h190
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.aps.h270
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.bdb.h17
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h75
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.nwk.h226
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.security.h53
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.startup.h12
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zdo.h195
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zgp.h11
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c7
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/EWARM/Thread_Cli_Cmd.ewp2563
-rw-r--r--Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/App/ibeacon_service.c30
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/Target/hw_ipcc.c72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/App/app_ble.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/Target/hw_ipcc.c72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Src/main.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.cproject27
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.project137
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Binary/BLE_HeartRateFreeRTOS_ANCS_reference.hex4898
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/FreeRTOSConfig.h159
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_common.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_conf.h563
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_debug.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_entry.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_conf.h198
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_if.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/main.h72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32_lpm_if.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_hal_conf.h359
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_it.h77
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/utilities_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/vcp_conf.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_debug.c399
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_entry.c346
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_freertos.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/freertos_port.c339
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c713
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32_lpm_if.c278
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_msp.c336
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_timebase_tim.c152
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_it.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewd (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewd)59
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewp1342
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/startup_stm32wb55xx_cm4.s (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/startup_stm32wb55xx_cm4.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/stm32wb55xx_flash_cm4.icf (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/stm32wb55xx_flash_cm4.icf)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.c2275
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.h288
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.c1183
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_conf.h104
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.c221
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.h77
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c256
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/Target/hw_ipcc.c523
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/readme.txt140
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Binary/BLE_HeartRate_ANCS_reference.hex3854
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_common.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_conf.h575
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_debug.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_entry.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_conf.h196
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_if.h251
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/main.h72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32_lpm_if.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_hal_conf.h359
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_it.h79
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/utilities_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_debug.c399
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_entry.c309
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/main.c634
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32_lpm_if.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_hal_msp.c331
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_it.c315
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewp1260
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/startup_stm32wb55xx_cm4.s (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/startup_stm32wb55xx_cm4.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.c2236
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.h288
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.c1125
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_conf.h104
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.c221
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.h77
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.c231
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/Target/hw_ipcc.c523
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/readme.txt142
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Binary/BLE_HeartRate_ota_reference.binbin17288 -> 17464 bytes
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_common.h7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_conf.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_debug.h72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/hw_conf.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_hal_conf.h7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_debug.c82
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/main.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_hal_msp.c13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/system_stm32wbxx.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/app_ble.c137
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/hrs_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/SW4STM32/syscalls.c9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h78
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/readme.txt130
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h)6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/main.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/main.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd2834
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp1339
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/Project.eww (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/Project.eww)2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/stm32wb55xx_flash_cm4.icf)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx1188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx847
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/startup_stm32wb55xx_cm4.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/stm32wb55xx_flash_cm4.sct)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.c)459
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.h)20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.c)44
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.h)7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.h)1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.c)65
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.h)1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.c)11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.c)274
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.h)32
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c621
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.c)4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_dbg_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/cube_hal.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/data.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/hal_common.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg.h)11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h618
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.c)23
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/pal_nvm.c)13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/svcctl_conf.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_if.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/vcp_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/target/hw_ipcc.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.cproject (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.cproject)10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project394
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/stm32wb55xx_flash_cm4.ld)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/startup_stm32wb55xx_cm4.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/syscalls.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/readme.txt225
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h547
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/main.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h66
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c414
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c)4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/main.c)6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c233
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd2834
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp1339
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx1188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx847
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/startup_stm32wb55xx_cm4.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/stm32wb55xx_flash_cm4.sct)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.c)2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.c)459
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.h)20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.c)44
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.h)7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.h)1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.c)65
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.h)1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c185
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.c)276
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.h)32
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c621
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.c)4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_dbg_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/cube_hal.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/data.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/hal_common.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h257
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h646
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.c)23
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/pal_nvm.c)9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/svcctl_conf.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_if.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/vcp_conf.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/target/hw_ipcc.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject181
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project394
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/stm32wb55xx_flash_cm4.ld)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/startup_stm32wb55xx_cm4.s)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/syscalls.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt225
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h118
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_conf.h547
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_debug.h45
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_entry.h44
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_flash.h87
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/lp_timer.h60
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_hal_conf.h350
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_it.h66
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/vcp_conf.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_debug.c349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_entry.c414
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_flash.c152
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_uart.c471
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/lp_timer.c134
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/main.c432
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32wbxx_it.c233
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewd2834
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewp)33
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvoptx)36
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvprojx)360
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.c109
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.c300
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.h35
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.c661
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.h79
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.c1981
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.h89
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.c457
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.c101
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.h44
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.c1312
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.h196
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.c102
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c185
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c.ref (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.c)4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.h89
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.c1785
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h127
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h.ref127
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.c)447
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.h92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.c633
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.h103
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.c505
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.h43
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_conf.h74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_dbg_conf.h207
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/cube_hal.h47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/data.s50
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/hal_common.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h257
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h.ref (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg.h)9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h673
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h.ref (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg_usr.h)152
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.c627
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.h50
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/pal_nvm.c446
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/svcctl_conf.c82
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_conf.h33
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_if.c47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.c364
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/vcp_conf.h52
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/target/hw_ipcc.c517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.cproject181
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.project (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.project)2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/startup_stm32wb55xx_cm4.s445
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/syscalls.c204
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/readme.txt315
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/SW4STM32/BLE_Peripheral_Lite/.cproject313
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Binary/BLE_RfWithFlash_reference.hex2258
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_common.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_conf.h613
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_debug.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_entry.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/flash_driver.h179
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_conf.h248
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/main.h72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_hal_conf.h359
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_it.h80
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_debug.c399
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_entry.c309
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/flash_driver.c322
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/main.c623
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_hal_msp.c333
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_it.c320
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewp1253
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvoptx133
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvprojx746
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.c1491
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_conf.h70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.c389
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/Target/hw_ipcc.c519
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.cproject153
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.project308
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/startup_stm32wb55xx_cm4.s445
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/syscalls.c204
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt140
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/SW4STM32/BLE_TransparentMode/.cproject2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/BLE_p2pServer.ioc7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Src/main.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Binary/BLE_p2pServer_ota_reference.binbin34312 -> 34504 bytes
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_common.h7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_conf.h72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_debug.h72
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/hw_conf.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_hal_conf.h7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_debug.c80
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_entry.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/main.c13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_hal_msp.c13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/system_stm32wbxx.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/app_ble.c126
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_dbg_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c106
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/SW4STM32/syscalls.c9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_conf.h46
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Src/app_entry.c109
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/ble_zigbee_static.ewp3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/stm32wb55xx_flash_cm4.icf3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.c329
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/p2p_server_app.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/CKS/CKS_Crypt/Keys/Store_keys.bat21
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/EWARM/.gitignore4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/app_common.h7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/main.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/stm32wbxx_hal_msp.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/EWARM/.gitignore4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4_process.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/EWARM/.gitignore4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h360
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h359
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h59
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c430
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c616
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_hal_msp.c336
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c383
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewp1540
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvoptx133
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvprojx861
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c1299
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h137
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h5033
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c519
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.cproject170
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.project414
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s427
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c204
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Thread_Coap_DataTransfer.ioc246
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/readme.txt226
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_common.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_conf.h358
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_hal_conf.h359
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm_logging.h59
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/vcp_conf.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/app_entry.c430
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/main.c616
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_hal_msp.c336
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_it.c383
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Project.eww10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewp1374
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvoptx1221
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvprojx847
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.c965
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.h137
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/Target/hw_ipcc.c519
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.cproject176
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.project434
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/startup_stm32wb55xx_cm4.s445
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/syscalls.c207
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/readme.txt162
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_conf.h355
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_conf.h219
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/app_entry.c500
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32_lpm_if.c275
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewp1258
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.c996
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/readme.txt211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_conf.h358
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_conf.h219
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/app_entry.c500
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32_lpm_if.c275
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewp1258
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.c913
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/readme.txt211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/App/app_zigbee.c12
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/app_entry.c501
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.c688
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/readme.txt144
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_conf.h351
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/app_entry.c499
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.c618
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/readme.txt144
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_conf.h354
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/app_entry.c502
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.c880
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/readme.txt212
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_conf.h359
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/app_entry.c501
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.c1392
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/readme.txt212
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/app_entry.c501
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.c766
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/readme.txt156
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/app_entry.c499
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.c694
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/readme.txt156
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvoptx861
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvprojx692
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.cproject201
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.project253
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/startup_stm32wb55xx_cm4.s445
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/syscalls.c207
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_conf.h357
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/app_entry.c500
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.c822
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/readme.txt161
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_common.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_conf.h354
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/main.h71
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_it.h83
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm_logging.h55
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/app_entry.c500
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_uart.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/main.c521
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_hal_msp.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_it.c411
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm_logging.c205
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/system_stm32wbxx.c353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewp1261
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.c746
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/Target/hw_ipcc.c513
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/readme.txt161
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html63
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_lpm.c90
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h78
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/readme.txt129
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h118
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h)10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h45
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h44
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h87
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h60
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h350
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h)0
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h53
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c)15
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c152
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c471
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c134
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c432
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c)0
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd2834
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewp)50
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/Project.eww (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/Project.eww)2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx1324
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvprojx)359
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c109
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h69
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c300
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h35
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c661
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h79
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c1979
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h89
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c457
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h115
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c101
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h44
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c1312
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h196
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c102
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h62
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c185
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h89
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c1529
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h126
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.c)502
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h92
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c633
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h103
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c505
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h43
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h207
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h47
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s50
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h55
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h257
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h618
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c627
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h50
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c446
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c82
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h33
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c47
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c364
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h62
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h52
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c517
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.cproject (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.cproject)118
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project444
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s445
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c204
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/readme.txt224
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h118
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h545
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h45
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h44
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h247
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h87
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h60
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h350
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h70
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h53
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c350
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c384
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c152
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c471
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c134
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c432
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c265
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd2834
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp1378
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvoptx)239
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx907
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c109
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h69
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c300
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h35
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c661
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h79
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c1978
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h89
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c457
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h115
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c101
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h44
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c1312
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h196
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c102
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h62
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c185
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h89
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c1529
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h126
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c621
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h92
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c633
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h103
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c505
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h43
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h207
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h47
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s50
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h55
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h257
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg_usr.h)262
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c627
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h50
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c446
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c82
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h33
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c47
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c364
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h62
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h52
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c517
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject187
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project444
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s445
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c204
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt224
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/App/tm.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Binary/Thread_Cli_Cmd_reference.hex4143
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h117
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h378
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h45
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h250
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h55
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h351
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h77
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h54
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c431
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c471
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c333
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c297
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c191
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewd (renamed from Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewd)9
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewp1383
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf47
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvoptx133
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvprojx891
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s368
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct21
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c1258
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h110
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h5033
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c519
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.cproject170
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.project (renamed from Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.project)334
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld187
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s427
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c204
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/readme.txt197
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c74
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c13
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c7
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html24
-rw-r--r--Projects/STM32CubeProjectsList.html168
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html267
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCILayer_fw.binbin96720 -> 96600 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_full_fw.binbin164872 -> 164824 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_light_fw.binbin107704 -> 107104 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Mac_802_15_4_fw.binbin63300 -> 64596 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_FTD_fw.binbin347344 -> 348260 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_MTD_fw.binbin258216 -> 259100 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html463
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCILayer_fw.binbin96712 -> 96592 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_full_fw.binbin164864 -> 164816 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_light_fw.binbin107696 -> 107096 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_fw.binbin506700 -> 506888 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_static_fw.binbin490128 -> 488868 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_FUS_fw.binbin24344 -> 24492 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Mac_802_15_4_fw.binbin63460 -> 64752 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_FTD_fw.binbin347320 -> 348236 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_MTD_fw.binbin258192 -> 259076 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_Full_fw.binbin306580 -> 306144 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.binbin0 -> 265500 bytes
-rw-r--r--README.md10
-rw-r--r--Release_Notes.html590
-rw-r--r--Utilities/lpm/tiny_lpm/Release_Notes.md116
-rw-r--r--package.xml2
1385 files changed, 336621 insertions, 15175 deletions
diff --git a/Documentation/STM32CubeWBGettingStarted.pdf b/Documentation/STM32CubeWBGettingStarted.pdf
index 15d5ecd72..f4c1a125e 100644
--- a/Documentation/STM32CubeWBGettingStarted.pdf
+++ b/Documentation/STM32CubeWBGettingStarted.pdf
Binary files differ
diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildDspLibs.bat b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildDspLibs.bat
new file mode 100644
index 000000000..62d259de3
--- /dev/null
+++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildDspLibs.bat
@@ -0,0 +1,116 @@
+@echo off
+
+set UVEXE=C:\Keil_v5\UV4\UV4.EXE
+set CURDIR=%CD%
+
+if .%1==. goto help
+for %%a in (ARM GCC) do if %1==%%a goto startBuild
+goto help
+
+:startBuild
+echo.
+echo Building DSP Libraries %1
+
+if %1==ARM goto buildARM
+if %1==GCC goto buildGCC
+goto err
+
+:buildARM
+:buildGCC
+cd ..\DSP_Lib\Source\%1
+
+echo Building DSP Library for Cortex-M0 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM0l" -o "DspLib_cortexM0l_build.log"
+
+echo Building DSP Library for Cortex-M3 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM3l" -o "DspLib_cortexM3l_build.log"
+
+echo Building DSP Library for Cortex-M4 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4l" -o "DspLib_cortexM4l_build.log"
+
+echo Building DSP Library for Cortex-M4 Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4lf" -o "DspLib_cortexM4lf_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7l" -o "DspLib_cortexM7l_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7lfsp" -o "DspLib_cortexM7lfsp_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian with double precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7lfdp" -o "DspLib_cortexM7lfdp_build.log"
+
+echo Building DSP Library for ARMv8-M Baseline Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MBLl" -o "DspLib_ARMv8MBLl_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLl" -o "DspLib_ARMv8MMLl_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLlfsp" -o "DspLib_ARMv8MMLlfsp_build.log"
+
+REM echo Building DSP Library for ARMv8-M Mainline Little Endian with double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLlfdp" -o "DspLib_ARMv8MMLlfdp_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLld" -o "DspLib_ARMv8MMLld_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLldfsp" -o "DspLib_ARMv8MMLldfsp_build.log"
+
+REM echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLldfdp" -o "DspLib_ARMv8MMLldfdp_build.log"
+
+
+REM big endian libraries are skipped!
+
+REM echo Building DSP Library for Cortex-M0 Big Endian
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM0b" -o "DspLib_cortexM0b_build.log"
+
+REM echo Building DSP Library for Cortex-M3 Big Endian
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM3b" -o "DspLib_cortexM3b_build.log"
+
+REM echo Building DSP Library for Cortex-M4 Big Endian
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4b" -o "DspLib_cortexM4b_build.log"
+
+REM echo Building DSP Library for Cortex-M4 Big Endian with single precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4bf" -o "DspLib_cortexM4bf_build.log"
+
+REM echo Building DSP Library for Cortex-M7 Big Endian
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7b" -o "DspLib_cortexM7b_build.log"
+
+REM echo Building DSP Library for Cortex-M7 Big Endian with single precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7bfsp" -o "DspLib_cortexM7bfsp_build.log"
+
+REM echo Building DSP Library for Cortex-M7 Big Endian with double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7bfdp" -o "DspLib_cortexM7bfdp_build.log"
+
+goto deleteIntermediateFiles
+
+
+:deleteIntermediateFiles
+echo.
+echo Deleting intermediate files
+rmdir /S /Q IntermediateFiles
+del /Q *.bak
+del /Q *.dep
+del /Q *.uvguix.*
+del /Q ArInp.*
+
+goto changeDir
+
+
+:changeDir
+cd %CURDIR%
+goto end
+
+:err
+
+:help
+echo Syntax: buildDspLibs toolchain
+echo.
+echo toolchain: ARM ^| GCC
+echo.
+echo e.g.: buildDspLibs ARM
+
+:end
diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildRefLibs.bat b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildRefLibs.bat
new file mode 100644
index 000000000..05bc66e7f
--- /dev/null
+++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/buildRefLibs.bat
@@ -0,0 +1,116 @@
+@echo off
+
+set UVEXE=C:\Keil_v5\UV4\UV4.EXE
+set CURDIR=%CD%
+
+if .%1==. goto help
+for %%a in (ARM GCC) do if %1==%%a goto startBuild
+goto help
+
+:startBuild
+echo.
+echo Building DSP Reference Libraries %1
+
+if %1==ARM goto buildARM
+if %1==GCC goto buildGCC
+goto err
+
+:buildARM
+:buildGCC
+cd .\RefLibs\%1
+
+echo Building DSP Reference Library for Cortex-M0 Little Endian
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM0l" -o "RefLib_cortexM0l_build.log"
+
+echo Building DSP Reference Library for Cortex-M3 Little Endian
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM3l" -o "RefLib_cortexM3l_build.log"
+
+echo Building DSP Reference Library for Cortex-M4 Little Endian
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM4l" -o "RefLib_cortexM4l_build.log"
+
+echo Building DSP Reference Library for Cortex-M4 Little Endian with single precision FPU
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM4lf" -o "RefLib_cortexM4lf_build.log"
+
+echo Building DSP Reference Library for Cortex-M7 Little Endian
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM7l" -o "RefLib_cortexM7l_build.log"
+
+echo Building DSP Reference Library for Cortex-M7 Little Endian with single precision FPU
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM7lfsp" -o "RefLib_cortexM7lfsp_build.log"
+
+echo Building DSP Reference Library for Cortex-M7 Little Endian with double precision FPU
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM7lfdp" -o "RefLib_cortexM7lfdp_build.log"
+
+echo Building DSP Reference Library for ARMv8-M Baseline Little Endian
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MBLl" -o "RefLib_ARMv8MBLl_build.log"
+
+echo Building DSP Reference Library for ARMv8-M Mainline Little Endian
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MMLl" -o "RefLib_ARMv8MMLl_build.log"
+
+echo Building DSP Reference Library for ARMv8-M Mainline Little Endian with single precision FPU
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MMLlfsp" -o "RefLib_ARMv8MMLlfsp_build.log"
+
+REM echo Building DSP Reference Library for ARMv8-M Mainline Little Endian with double precision FPU
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MMLlfdp" -o "RefLib_ARMv8MMLlfdp_build.log"
+
+echo Building DSP Reference Library for ARMv8-M Mainline Little Endian with DSP instructions
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MMLld" -o "RefLib_ARMv8MMLld_build.log"
+
+echo Building DSP Reference Library for ARMv8-M Mainline Little Endian with DSP instructions, single precision FPU
+%UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MMLldfsp" -o "RefLib_ARMv8MMLldfsp_build.log"
+
+REM echo Building DSP Reference Library for ARMv8-M Mainline Little Endian with DSP instructions, double precision FPU
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t "ARMv8MMLldfdp" -o "RefLib_ARMv8MMLldfdp_build.log"
+
+
+REM big endian libraries are skipped!
+
+REM echo Building DSP Reference Library for Cortex-M0 Big Endian
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t"cortexM0b" -o "RefLib_cortexM0b_build.log"
+
+REM echo Building DSP Reference Library for Cortex-M3 Big Endian
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t"cortexM3b" -o "RefLib_cortexM3b_build.log"
+
+REM echo Building DSP Reference Library for Cortex-M4 Big Endian
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t"cortexM4b" -o "RefLib_cortexM4b_build.log"
+
+REM echo Building DSP Reference Library for Cortex-M4 Big Endian Big Endian with single precision FPU
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t"cortexM4bf" -o "RefLib_cortexM4bf_build.log"
+
+REM echo Building DSP Reference Library for Cortex-M7 Big Endian
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM7b" -o "RefLib_cortexM7b_build.log"
+
+REM echo Building DSP Reference Library for Cortex-M7 Big Endian with single precision FPU
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM7bfsp" -o "RefLib_cortexM7bfsp_build.log"
+
+REM echo Building DSP Reference Library for Cortex-M7 Big Endian with double precision FPU
+REM %UVEXE% -rb -j0 RefLibs.uvprojx -t "cortexM7bfdp" -o "RefLib_cortexM7bfdp_build.log"
+
+goto deleteIntermediateFiles
+
+
+:deleteIntermediateFiles
+echo.
+echo Deleting intermediate files
+rmdir /S /Q IntermediateFiles
+del /Q *.bak
+del /Q *.dep
+del /Q *.uvguix.*
+del /Q ArInp.*
+
+goto changeDir
+
+
+:changeDir
+cd %CURDIR%
+goto end
+
+:err
+
+:help
+echo Syntax: buildRefLibs toolchain
+echo.
+echo toolchain: ARM ^| GCC
+echo.
+echo e.g.: buildRefLibs ARM
+
+:end
diff --git a/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/runTest.bat b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/runTest.bat
new file mode 100644
index 000000000..1d45a4c74
--- /dev/null
+++ b/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/runTest.bat
@@ -0,0 +1,129 @@
+@echo off
+
+set UVEXE=C:\Keil_v5\UV4\UV4.EXE
+
+if .%1==. goto help
+for %%a in (ARM GCC) do if %1==%%a goto checkParam2
+echo parameter %1 not supported.
+goto help
+
+:checkParam2
+if .%2==. goto help
+for %%a in ( ^
+ cortexM0l ^
+ cortexM3l ^
+ cortexM4l ^
+ cortexM4lf ^
+ cortexM7l ^
+ cortexM7lfsp ^
+ cortexM7lfdp ^
+ ARMv8MBLl ^
+ ARMv8MMLl ^
+ ARMv8MMLlfsp ^
+ ARMv8MMLlfdp ^
+ ARMv8MMLld ^
+ ARMv8MMLldfsp ^
+ ARMv8MMLldfdp ^
+ ) do if %2==%%a goto checkParam3
+echo parameter %2 not supported.
+goto help
+
+:checkParam3
+if .%3==. goto help
+for %%a in (MPS2 FVP Simulator) do if %3==%%a goto CheckLibraries
+echo parameter %3 not supported.
+goto help
+
+:CheckLibraries
+if %1==ARM goto CheckLibrariesARM
+if %1==GCC goto CheckLibrariesGCC
+
+:CheckLibrariesARM
+if not exist ".\RefLibs\%1\Lib\arm_%2_ref.lib" (echo ".\RefLibs\%1\Lib\arm_%2_ref.lib" not found. & goto end)
+if not exist "..\Lib\%1\arm_%2_math.lib" (echo "..\Lib\%1\arm_%2_ref.lib" not found. & goto end)
+goto CopyLibrariesARM
+
+:CheckLibrariesGCC
+if not exist ".\RefLibs\%1\Lib\libarm_%2_ref.a" (echo ".\RefLibs\%1\Lib\libarm_%2_ref.a" not found. & goto end)
+if not exist "..\Lib\%1\libarm_%2_math.a" (echo "..\Lib\%1\libarm_%2_math.a" not found. & goto end)
+goto CopyLibrariesGCC
+
+:CopyLibrariesARM
+copy /B ".\RefLibs\%1\Lib\arm_%2_ref.lib" .\DspLibTest_%3\%1\Lib\arm_ref.lib /B /Y
+copy /B "..\Lib\%1\arm_%2_math.lib" .\DspLibTest_%3\%1\Lib\arm_math.lib /B /Y
+goto buildProject
+
+:CopyLibrariesGCC
+copy /B ".\RefLibs\%1\Lib\libarm_%2_ref.a" .\DspLibTest_%3\%1\Lib\libarm_ref.a /B /Y
+copy /B "..\Lib\%1\libarm_%2_math.a" .\DspLibTest_%3\%1\Lib\libarm_math.a /B /Y
+goto buildProject
+
+:buildProject
+ echo Build Test Project ...
+%UVEXE% -r -j0 .\DspLibTest_%3\%1\DspLibTest_%3.uvprojx -t "%2" -o ".\Logs\DspLibTest_%3_%2_build.log"
+
+ echo Run Test ...
+del /Q ".\DspLibTest_%3\%1\Logs\DspLibTest_%3.log" 2>NUL
+del /Q ".\DspLibTest_%3\%1\Logs\DspLibTest_%3_%2.log" 2>NUL
+
+rem get start time (The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99)
+set STARTTIME=%TIME%
+
+rem run the test
+%UVEXE% -d .\DspLibTest_%3\%1\DspLibTest_%3.uvprojx -t "%2"
+
+rem get end time
+set ENDTIME=%TIME%
+
+rem calculate duration
+rem Change formatting for the start and end times
+for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do (
+ set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
+)
+
+for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do (
+ set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
+)
+
+rem Test midnight rollover. If so, add 1 day=8640000 1/100ths secs
+if %end% lss %start% set /a end+=8640000
+
+rem Calculate the elapsed time by subtracting values
+set /A elapsed=end-start
+
+rem Format the results for output
+set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
+if %hh% lss 10 set hh=0%hh%
+if %mm% lss 10 set mm=0%mm%
+if %ss% lss 10 set ss=0%ss%
+if %cc% lss 10 set cc=0%cc%
+
+set DURATION=%hh%:%mm%:%ss%,%cc%
+
+rem write time to file
+echo Test %1 %2 : > ".\DspLibTest_%3\%1\Logs\DspLibTest_%3_%2_time.log"
+echo Start time: %STARTTIME% >> ".\DspLibTest_%3\%1\Logs\DspLibTest_%3_%2_time.log"
+echo End time: %ENDTIME% >> ".\DspLibTest_%3\%1\Logs\DspLibTest_%3_%2_time.log"
+echo Duration: %DURATION% >> ".\DspLibTest_%3\%1\Logs\DspLibTest_%3_%2_time.log"
+
+ echo Copy Logfile ...
+copy /B ".\DspLibTest_%3\%1\Logs\DspLibTest_%3.log" ".\DspLibTest_%3\%1\Logs\DspLibTest_%3_%2.log"
+
+goto end
+
+
+:help
+echo.
+echo Syntax: runTest toolchain core test
+echo.
+echo toolchain: ARM ^| GCC
+echo core: cortexM0l ^| cortexM3l ^| cortexM4l ^| cortexM4lf ^| cortexM7l ^| cortexM7lfsp ^| cortexM7lfdp
+echo ARMv8MBLl
+echo ARMv8MMLl ^| ARMv8MMLlfsp ^| ARMv8MMLlfdp
+echo ARMv8MMLld ^| ARMv8MMLldfsp ^| ARMv8MMLldfdp
+echo test: MPS2 ^| FVP ^| Simulator
+echo.
+echo e.g.: runTest ARM cortexM3l Simulator
+
+:end
+@echo on
diff --git a/Drivers/CMSIS/DSP/Projects/ARM/arm_cortexM_math_Build.bat b/Drivers/CMSIS/DSP/Projects/ARM/arm_cortexM_math_Build.bat
new file mode 100644
index 000000000..d521939d5
--- /dev/null
+++ b/Drivers/CMSIS/DSP/Projects/ARM/arm_cortexM_math_Build.bat
@@ -0,0 +1,83 @@
+@echo off
+
+mkdir Temp
+set TMP=Temp
+set TEMP=Temp
+set UVEXE=C:\Keil_v5\UV4\UV4.EXE
+
+echo.
+echo Building DSP Libraries ARM
+echo Building DSP Library for Cortex-M0 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM0l" -o "DspLib_cortexM0l_build.log"
+
+echo Building DSP Library for Cortex-M3 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM3l" -o "DspLib_cortexM3l_build.log"
+
+echo Building DSP Library for Cortex-M4 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4l" -o "DspLib_cortexM4l_build.log"
+
+echo Building DSP Library for Cortex-M4 Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4lf" -o "DspLib_cortexM4lf_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7l" -o "DspLib_cortexM7l_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7lfsp" -o "DspLib_cortexM7lfsp_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian with double precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7lfdp" -o "DspLib_cortexM7lfdp_build.log"
+
+echo Building DSP Library for ARMv8-M Baseline Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MBLl" -o "DspLib_ARMv8MBLl_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLl" -o "DspLib_ARMv8MMLl_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLlfsp" -o "DspLib_ARMv8MMLlfsp_build.log"
+
+REM echo Building DSP Library for ARMv8-M Mainline Little Endian with double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLlfdp" -o "DspLib_ARMv8MMLlfdp_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLld" -o "DspLib_ARMv8MMLld_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLldfsp" -o "DspLib_ARMv8MMLldfsp_build.log"
+
+REM echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLldfdp" -o "DspLib_ARMv8MMLldfdp_build.log"
+
+
+REM big endian libraries
+
+echo Building DSP Library for Cortex-M0 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM0b" -o "DspLib_cortexM0b_build.log"
+
+echo Building DSP Library for Cortex-M3 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM3b" -o "DspLib_cortexM3b_build.log"
+
+echo Building DSP Library for Cortex-M4 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4b" -o "DspLib_cortexM4b_build.log"
+
+echo Building DSP Library for Cortex-M4 Big Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4bf" -o "DspLib_cortexM4bf_build.log"
+
+echo Building DSP Library for Cortex-M7 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7b" -o "DspLib_cortexM7b_build.log"
+
+echo Building DSP Library for Cortex-M7 Big Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7bfsp" -o "DspLib_cortexM7bfsp_build.log"
+
+echo Building DSP Library for Cortex-M7 Big Endian with double precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7bfdp" -o "DspLib_cortexM7bfdp_build.log"
+
+echo.
+echo Deleting intermediate files
+rmdir /S /Q Temp
+rmdir /S /Q IntermediateFiles
+del /Q *.bak
+del /Q *.dep
+del /Q *.uvguix.*
+del /Q ArInp.* \ No newline at end of file
diff --git a/Drivers/CMSIS/DSP/Projects/GCC/arm_cortexM_math_Build.bat b/Drivers/CMSIS/DSP/Projects/GCC/arm_cortexM_math_Build.bat
new file mode 100644
index 000000000..7b3a44bfe
--- /dev/null
+++ b/Drivers/CMSIS/DSP/Projects/GCC/arm_cortexM_math_Build.bat
@@ -0,0 +1,83 @@
+@echo off
+
+mkdir Temp
+set TMP=Temp
+set TEMP=Temp
+set UVEXE=C:\Keil_v5\UV4\UV4.EXE
+
+echo.
+echo Building DSP Libraries GCC
+echo.
+echo Building DSP Library for Cortex-M0 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM0l" -o "DspLib_cortexM0l_build.log"
+
+echo Building DSP Library for Cortex-M3 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM3l" -o "DspLib_cortexM3l_build.log"
+
+echo Building DSP Library for Cortex-M4 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4l" -o "DspLib_cortexM4l_build.log"
+
+echo Building DSP Library for Cortex-M4 Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4lf" -o "DspLib_cortexM4lf_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7l" -o "DspLib_cortexM7l_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7lfsp" -o "DspLib_cortexM7lfsp_build.log"
+
+echo Building DSP Library for Cortex-M7 Little Endian with double precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7lfdp" -o "DspLib_cortexM7lfdp_build.log"
+
+echo Building DSP Library for ARMv8-M Baseline Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MBLl" -o "DspLib_ARMv8MBLl_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLl" -o "DspLib_ARMv8MMLl_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLlfsp" -o "DspLib_ARMv8MMLlfsp_build.log"
+
+REM echo Building DSP Library for ARMv8-M Mainline Little Endian with double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLlfdp" -o "DspLib_ARMv8MMLlfdp_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLld" -o "DspLib_ARMv8MMLld_build.log"
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLldfsp" -o "DspLib_ARMv8MMLldfsp_build.log"
+
+REM echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, double precision FPU
+REM %UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "ARMv8MMLldfdp" -o "DspLib_ARMv8MMLldfdp_build.log"
+
+REM big endian libraries
+
+echo Building DSP Library for Cortex-M0 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM0b" -o "DspLib_cortexM0b_build.log"
+
+echo Building DSP Library for Cortex-M3 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM3b" -o "DspLib_cortexM3b_build.log"
+
+echo Building DSP Library for Cortex-M4 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4b" -o "DspLib_cortexM4b_build.log"
+
+echo Building DSP Library for Cortex-M4 Big Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM4bf" -o "DspLib_cortexM4bf_build.log"
+
+echo Building DSP Library for Cortex-M7 Big Endian
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7b" -o "DspLib_cortexM7b_build.log"
+
+echo Building DSP Library for Cortex-M7 Big Endian with single precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7bfsp" -o "DspLib_cortexM7bfsp_build.log"
+
+echo Building DSP Library for Cortex-M7 Big Endian with double precision FPU
+%UVEXE% -rb -j0 arm_cortexM_math.uvprojx -t "cortexM7bfdp" -o "DspLib_cortexM7bfdp_build.log"
+
+echo.
+echo Deleting intermediate files
+rmdir /S /Q Temp
+rmdir /S /Q IntermediateFiles
+del /Q *.bak
+del /Q *.dep
+del /Q *.uvguix.*
+del /Q ArInp.* \ No newline at end of file
diff --git a/Drivers/CMSIS/DSP/Projects/IAR/arm_cortexM_math_Build.bat b/Drivers/CMSIS/DSP/Projects/IAR/arm_cortexM_math_Build.bat
new file mode 100644
index 000000000..5e96c1971
--- /dev/null
+++ b/Drivers/CMSIS/DSP/Projects/IAR/arm_cortexM_math_Build.bat
@@ -0,0 +1,104 @@
+@echo off
+
+mkdir Temp
+set TMP=Temp
+set TEMP=Temp
+rem set IAREXE=..\..\..\..\..\common\bin\iarbuild.exe
+set IAREXE=iarbuild.exe
+
+echo.
+echo Building DSP Libraries ARM
+echo Building DSP Library for Cortex-M0 Little Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM0l
+
+echo Building DSP Library for Cortex-M3 Little Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM3l
+
+echo Building DSP Library for Cortex-M4 Little Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM4l
+
+echo Building DSP Library for Cortex-M4 Little Endian with single precision FPU
+%IAREXE% arm_cortexM_math.ewp -build cortexM4lf
+
+echo Building DSP Library for Cortex-M7 Little Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM7l
+
+echo Building DSP Library for Cortex-M7 Little Endian with single precision FPU
+%IAREXE% arm_cortexM_math.ewp -build cortexM7lfsp
+
+echo Building DSP Library for Cortex-M7 Little Endian with double precision FPU
+%IAREXE% arm_cortexM_math.ewp -build cortexM7lfdp
+
+echo Building DSP Library for ARMv8-M Baseline Little Endian
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MBLl
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MMLl
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with single precision FPU
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MMLlfsp
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with double precision FPU
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MMLlfdp
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MMLld
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, single precision FPU
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MMLldfsp
+
+echo Building DSP Library for ARMv8-M Mainline Little Endian with DSP instructions, double precision FPU
+%IAREXE% arm_cortexM_math.ewp -build ARMv8MMLldfdp
+
+REM big endian libraries
+
+echo Building DSP Library for Cortex-M0 Big Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM0b
+
+echo Building DSP Library for Cortex-M3 Big Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM3b
+
+echo Building DSP Library for Cortex-M4 Big Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM4b
+
+echo Building DSP Library for Cortex-M4 Big Endian with single precision FPU
+%IAREXE% arm_cortexM_math.ewp -build cortexM4bf
+
+echo Building DSP Library for Cortex-M7 Big Endian
+%IAREXE% arm_cortexM_math.ewp -build cortexM7b
+
+echo Building DSP Library for Cortex-M7 Big Endian with single precision FPU
+%IAREXE% arm_cortexM_math.ewp -build cortexM7bfsp
+
+echo Building DSP Library for Cortex-M7 Big Endian with double precision FPU
+%IAREXE% arm_cortexM_math.ewp -build cortexM7bfdp
+
+echo Copy libs to CMSIS\lib\IAR
+mkdir ..\..\..\lib\IAR
+copy ReleaseM0BE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM0LE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM3BE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM3LE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM4BE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM4BE_FPU\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM4LE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM4LE_FPU\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM7BE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM7BE_FPU_DP\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM7BE_FPU_SP\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM7LE\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM7LE_FPU_DP\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ReleaseM7LE_FPU_SP\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MBLl\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MMLl\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MMLld\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MMLldfdp\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MMLldfsp\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MMLlfdp\Exe\*.a ..\..\..\lib\IAR\ /Y
+copy ARMv8MMLlfsp\Exe\*.a ..\..\..\lib\IAR\ /Y
+
+echo.
+echo Deleting intermediate files
+for /d %%a in (Temp ARMv8M* ReleaseM*) do rmdir /s /q "%%~a"
+del /Q *.bak
+del /Q *.dep
diff --git a/Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/runTest.bat b/Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/runTest.bat
new file mode 100644
index 000000000..fbf8cdb50
--- /dev/null
+++ b/Drivers/CMSIS/NN/NN_Lib_Tests/nn_test/runTest.bat
@@ -0,0 +1,57 @@
+@echo off
+
+set UVEXE=C:\Keil_v5\UV4\UV4.EXE
+
+echo Building NN Test for Cortex-M7 Single Precision Little Endian
+%UVEXE% -rb -j0 arm_nnexamples_nn_test.uvprojx -t "ARMCM7_SP" -o "NN_Test_ARMCM7_SP_build.log"
+
+echo Running NN Test for Cortex-M7 Single Precision Little Endian
+%UVEXE% -d arm_nnexamples_nn_test.uvprojx -t "ARMCM7_SP" -j0
+
+type NN_TEST.log
+del NN_TEST.log
+
+echo Building NN Test for Cortex-M4 FP Little Endian
+%UVEXE% -rb -j0 arm_nnexamples_nn_test.uvprojx -t "ARMCM4_FP" -o "NN_Test_ARMCM4_FP_build.log"
+
+echo Running NN Test for Cortex-M4 FP Little Endian
+%UVEXE% -d arm_nnexamples_nn_test.uvprojx -t "ARMCM4_FP" -j0
+
+type NN_TEST.log
+del NN_TEST.log
+
+echo Building NN Test for Cortex-M4 FP Little Endian Truncate
+%UVEXE% -rb -j0 arm_nnexamples_nn_test.uvprojx -t "ARMCM4_FP_truncate" -o "NN_Test_ARMCM4_FP_truncate_build.log"
+
+echo Running NN Test for Cortex-M4 FP Little Endian Truncate
+%UVEXE% -d arm_nnexamples_nn_test.uvprojx -t "ARMCM4_FP_truncate" -j0
+
+type NN_TEST.log
+del NN_TEST.log
+
+echo Building NN Test for Cortex-M7 Single Precision Big Endian
+%UVEXE% -rb -j0 arm_nnexamples_nn_test.uvprojx -t "ARMCM7b_SP" -o "NN_Test_ARMCM7b_SP_build.log"
+
+echo Running NN Test for Cortex-M7 Single Precision Big Endian
+%UVEXE% -d arm_nnexamples_nn_test.uvprojx -t "ARMCM7b_SP" -j0
+
+type NN_TEST.log
+del NN_TEST.log
+
+echo Building NN Test for Cortex-M4 FP Big Endian
+%UVEXE% -rb -j0 arm_nnexamples_nn_test.uvprojx -t "ARMCM4b_FP" -o "NN_Test_ARMCM4b_FP_build.log"
+
+echo Running NN Test for Cortex-M4 FP Big Endian
+%UVEXE% -d arm_nnexamples_nn_test.uvprojx -t "ARMCM4b_FP" -j0
+
+type NN_TEST.log
+del NN_TEST.log
+
+echo Building NN Test for Cortex-M3
+%UVEXE% -rb -j0 arm_nnexamples_nn_test.uvprojx -t "ARMCM3" -o "NN_Test_ARMCM3_build.log"
+
+echo Running NN Test for Cortex-M3
+%UVEXE% -d arm_nnexamples_nn_test.uvprojx -t "ARMCM3" -j0
+
+type NN_TEST.log
+del NN_TEST.log \ No newline at end of file
diff --git a/Middlewares/ST/STM32_WPAN/Release_Notes.html b/Middlewares/ST/STM32_WPAN/Release_Notes.html
index 6504ed2d7..3444edc4a 100644
--- a/Middlewares/ST/STM32_WPAN/Release_Notes.html
+++ b/Middlewares/ST/STM32_WPAN/Release_Notes.html
@@ -11,7 +11,7 @@
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
</style>
- <link rel="stylesheet" href="./_htmresc/mini-st.css" />
+ <link rel="stylesheet" href="_htmresc/mini-st.css" />
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
@@ -42,16 +42,295 @@
<li><p>Zigbee Applications</p></li>
</ul>
<p><strong>NOTE</strong> : Depending on the kind of Application targeted, the appropriate Wireless Coprocessor Firmware needs to be loaded.</p>
-<p>All available binaries are located under/Projects/STM32_Copro_Wireless_Binaries directory.</p>
-<p>Refer to UM2237 to learn how to use/install STM32CubeProgrammer.</p>
-<p>Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the Coprocessor binary.</p>
+<ul>
+<li><strong>Zigbee</strong> clusters are provided as a library.
+<ul>
+<li>Available on <strong>IAR/SW4STM32</strong>(<strong>stm32wb_zigbee_wb_lib.a</strong>) and <strong>Keil</strong>(<strong>stm32wb_zigbee_wb_lib_keil.lib</strong>) under Middlewares/ST/STM32_WPAN/zigbee/lib.</li>
+<li>To get access to Zigbee clusters source code, please contact ST local office.</li>
+</ul></li>
+<li><p>All available binaries are located under/Projects/STM32_Copro_Wireless_Binaries directory.</p></li>
+<li><p>Refer to UM2237 to learn how to use/install STM32CubeProgrammer.</p></li>
+<li>Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the Coprocessor binary.</li>
+</ul>
</div>
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section7" checked aria-hidden="true"> <label for="collapse-section7" aria-hidden="false">V1.5.0 / 22-January-2020</label>
+<input type="checkbox" id="collapse-section8" checked aria-hidden="true"> <label for="collapse-section8" aria-hidden="false">V1.6.0 / 27-March-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<p>BLE-Mesh:</p>
+<ul>
+<li>BLE-Mesh library version 1.12.007
+<ul>
+<li>Updated for Delta level set binding to Light lightness</li>
+<li>Multi Key updates.</li>
+<li>Correction of FSM issues in the LC Model: no way to consume a packet internally.</li>
+<li>Correction of Sensor_LC_Light_Publish sending wrong property (and LC Model handling wrong property).</li>
+<li>Updates on Generic Models for Certification tests: Generic OnOff, Level, Power OnOff, Transition Time<br />
+</li>
+<li>Update Multi elements support</li>
+<li>Changes for DYNAMIC_PROVISIONER in Provisioner project</li>
+</ul></li>
+<li>New Cryptographic library v3.1.3</li>
+</ul>
+<p>Zigbee:</p>
+<ul>
+<li>Libarry available on IAR/SW4STM32(stm32wb_zigbee_wb_lib.a) and Keil(stm32wb_zigbee_wb_lib_keil.lib)</li>
+<li>Support following list (47 clusters):</li>
+</ul>
+<table>
+<thead>
+<tr class="header">
+<th>Cluster Number</th>
+<th>Cluster ID</th>
+<th style="text-align: left;">Cluster Name</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>1</td>
+<td>0x0000</td>
+<td style="text-align: left;">Basic</td>
+</tr>
+<tr class="even">
+<td>2</td>
+<td>0x0001</td>
+<td style="text-align: left;">Power Configuration</td>
+</tr>
+<tr class="odd">
+<td>3</td>
+<td>0x0003</td>
+<td style="text-align: left;">Identify6</td>
+</tr>
+<tr class="even">
+<td>4</td>
+<td>0x0004</td>
+<td style="text-align: left;">Groups</td>
+</tr>
+<tr class="odd">
+<td>5</td>
+<td>0x0005</td>
+<td style="text-align: left;">Scenes</td>
+</tr>
+<tr class="even">
+<td>6</td>
+<td>0x0006</td>
+<td style="text-align: left;">On/Off</td>
+</tr>
+<tr class="odd">
+<td>7</td>
+<td>0x0008</td>
+<td style="text-align: left;">Level Control</td>
+</tr>
+<tr class="even">
+<td>8</td>
+<td>0x000a</td>
+<td style="text-align: left;">Time</td>
+</tr>
+<tr class="odd">
+<td>9</td>
+<td>0x0019</td>
+<td style="text-align: left;">OTA Upgrade</td>
+</tr>
+<tr class="even">
+<td>10</td>
+<td>0x0020</td>
+<td style="text-align: left;">Poll Control</td>
+</tr>
+<tr class="odd">
+<td>11</td>
+<td>0x0021</td>
+<td style="text-align: left;">Green Power Proxy</td>
+</tr>
+<tr class="even">
+<td>12</td>
+<td>0x0102</td>
+<td style="text-align: left;">Window Covering</td>
+</tr>
+<tr class="odd">
+<td>13</td>
+<td>0x0202</td>
+<td style="text-align: left;">Fan Control</td>
+</tr>
+<tr class="even">
+<td>14</td>
+<td>0x0204</td>
+<td style="text-align: left;">Thermostat User Interface Configuration</td>
+</tr>
+<tr class="odd">
+<td>15</td>
+<td>0x0300</td>
+<td style="text-align: left;">Color control</td>
+</tr>
+<tr class="even">
+<td>16</td>
+<td>0x0301</td>
+<td style="text-align: left;">Ballast Configuration</td>
+</tr>
+<tr class="odd">
+<td>17</td>
+<td>0x0400</td>
+<td style="text-align: left;">Illuminance Measurement</td>
+</tr>
+<tr class="even">
+<td>18</td>
+<td>0x0402</td>
+<td style="text-align: left;">Temperature Measurement</td>
+</tr>
+<tr class="odd">
+<td>19</td>
+<td>0x0406</td>
+<td style="text-align: left;">Occupancy Sensing</td>
+</tr>
+<tr class="even">
+<td>20</td>
+<td>0x0502</td>
+<td style="text-align: left;">IAS Warning Device (WD)</td>
+</tr>
+<tr class="odd">
+<td>21</td>
+<td>0x0b05</td>
+<td style="text-align: left;">Diagnostics</td>
+</tr>
+<tr class="even">
+<td>22</td>
+<td>0x1000</td>
+<td style="text-align: left;">Touchlink</td>
+</tr>
+<tr class="odd">
+<td>23</td>
+<td>0x0002</td>
+<td style="text-align: left;">Device Temperature Configuration</td>
+</tr>
+<tr class="even">
+<td>24</td>
+<td>0x0007</td>
+<td style="text-align: left;">On/Off Switch Configuration</td>
+</tr>
+<tr class="odd">
+<td>25</td>
+<td>0x0009</td>
+<td style="text-align: left;">Alarms</td>
+</tr>
+<tr class="even">
+<td>26</td>
+<td>0x000b</td>
+<td style="text-align: left;">RSSI Location</td>
+</tr>
+<tr class="odd">
+<td>27</td>
+<td>0x0015</td>
+<td style="text-align: left;">Commissioning</td>
+</tr>
+<tr class="even">
+<td>28</td>
+<td>0x001a</td>
+<td style="text-align: left;">Power Profile Cluster</td>
+</tr>
+<tr class="odd">
+<td>29</td>
+<td>0x0024</td>
+<td style="text-align: left;">Nearest Gateway Cluster</td>
+</tr>
+<tr class="even">
+<td>30</td>
+<td>0x0101</td>
+<td style="text-align: left;">Door Lock</td>
+</tr>
+<tr class="odd">
+<td>31</td>
+<td>0x0200</td>
+<td style="text-align: left;">Pump Configuration and Control</td>
+</tr>
+<tr class="even">
+<td>32</td>
+<td>0x0201</td>
+<td style="text-align: left;">Thermostat</td>
+</tr>
+<tr class="odd">
+<td>33</td>
+<td>0x0203</td>
+<td style="text-align: left;">Dehumidification Control</td>
+</tr>
+<tr class="even">
+<td>34</td>
+<td>0x0401</td>
+<td style="text-align: left;">Illuminance Level Sensing</td>
+</tr>
+<tr class="odd">
+<td>35</td>
+<td>0x0403</td>
+<td style="text-align: left;">Pressure Measurement</td>
+</tr>
+<tr class="even">
+<td>36</td>
+<td>0x0405</td>
+<td style="text-align: left;">Relative Humidity Measurement</td>
+</tr>
+<tr class="odd">
+<td>37</td>
+<td>0x0500</td>
+<td style="text-align: left;">IAS Zone</td>
+</tr>
+<tr class="even">
+<td>38</td>
+<td>0x0501</td>
+<td style="text-align: left;">IAS Ancillary Control Equipment (ACE)</td>
+</tr>
+<tr class="odd">
+<td>39</td>
+<td>0x0700</td>
+<td style="text-align: left;">Price</td>
+</tr>
+<tr class="even">
+<td>40</td>
+<td>0x0701</td>
+<td style="text-align: left;">Demand Response and Load Control</td>
+</tr>
+<tr class="odd">
+<td>41</td>
+<td>0x0702</td>
+<td style="text-align: left;">Metering</td>
+</tr>
+<tr class="even">
+<td>42</td>
+<td>0x0703</td>
+<td style="text-align: left;">Messaging</td>
+</tr>
+<tr class="odd">
+<td>43</td>
+<td>0x0704</td>
+<td style="text-align: left;">Smart Energy Tunneling (Complex Metering)</td>
+</tr>
+<tr class="even">
+<td>44</td>
+<td>0x0800</td>
+<td style="text-align: left;">Key Establishment</td>
+</tr>
+<tr class="odd">
+<td>45</td>
+<td>0x0904</td>
+<td style="text-align: left;">Voice Over ZigBee</td>
+</tr>
+<tr class="even">
+<td>46</td>
+<td>0x0b01</td>
+<td style="text-align: left;">Meter Identification</td>
+</tr>
+<tr class="odd">
+<td>47</td>
+<td>0x0b04</td>
+<td style="text-align: left;">Electrical Measurement</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="false">V1.5.0 / 22-January-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<p>Interface:</p>
<ul>
<li>Added new commmand SHCI_C2_SetFlashActivityControl() to configure BLE timing protection</li>
@@ -94,7 +373,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.4.0 / 22-November-2019</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<p>Interface:</p>
<ul>
<li>Added new commmand SHCI_C2_ExtpaConfig() to support external PA</li>
@@ -110,7 +389,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.3.0 / 4-September-2019</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<p>General:</p>
<ul>
<li>Introducing support of Zigbee</li>
@@ -148,7 +427,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.2.0 / 27-June-2019</label>
<div>
-<h2 id="main-changes-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<p>General:</p>
<ul>
<li>Following utilities : Scheduler and Low Power Manager reworked and moved to ā€œUtilitiesā€ directory</li>
@@ -174,7 +453,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.1.1 / 10-May-2019</label>
<div>
-<h2 id="main-changes-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<p>BLE:</p>
<ul>
<li>Fix race condition in transport layer when an operating system is used.</li>
@@ -220,7 +499,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.1.0 / 29-March-2019</label>
<div>
-<h2 id="main-changes-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<p>General:</p>
<ul>
<li>Licenses in utilities and patterns moved from sla0044 to 3-clauses BSD</li>
@@ -246,7 +525,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.0.0 / 31-January-2019</label>
<div>
-<h2 id="main-changes-6">Main Changes</h2>
+<h2 id="main-changes-7">Main Changes</h2>
<p>First release</p>
</div>
</div>
diff --git a/Middlewares/ST/STM32_WPAN/ble/ble_common.h b/Middlewares/ST/STM32_WPAN/ble/ble_common.h
index b464be9b4..db5bb1fa1 100644
--- a/Middlewares/ST/STM32_WPAN/ble/ble_common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/ble_common.h
@@ -62,9 +62,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
-#define MAX( x, y ) (((x)>(y))?(x):(y))
+#ifndef MAX
+#define MAX( a, b ) (((a) > (b)) ? (a) : (b))
+#endif
-#define MIN( x, y ) (((x)<(y))?(x):(y))
+#ifndef MIN
+#define MIN( a, b ) (((a) < (b)) ? (a) : (b))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c
index 1c73c66c8..4aa72f254 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c
@@ -1,7 +1,7 @@
/******************************************************************************
* @file ble_events.c
* @author MCD Application Team
- * @date 22 January 2020
+ * @date 04 March 2020
* @brief Source file for STM32WB (Event callbacks)
* Auto-generated file: do not edit!
******************************************************************************
@@ -25,7 +25,6 @@ void hci_encryption_change_event_process(uint8_t *buffer_in);
void hci_read_remote_version_information_complete_event_process(uint8_t *buffer_in);
void hci_hardware_error_event_process(uint8_t *buffer_in);
void hci_number_of_completed_packets_event_process(uint8_t *buffer_in);
-void hci_data_buffer_overflow_event_process(uint8_t *buffer_in);
void hci_encryption_key_refresh_complete_event_process(uint8_t *buffer_in);
void aci_hal_end_of_radio_activity_event_process(uint8_t *buffer_in);
void aci_hal_scan_req_report_event_process(uint8_t *buffer_in);
@@ -94,8 +93,6 @@ const hci_event_table_t hci_event_table[HCI_EVENT_TABLE_SIZE] =
{ 0x0010, hci_hardware_error_event_process },
/* hci_number_of_completed_packets_event */
{ 0x0013, hci_number_of_completed_packets_event_process },
- /* hci_data_buffer_overflow_event */
- { 0x001a, hci_data_buffer_overflow_event_process },
/* hci_encryption_key_refresh_complete_event */
{ 0x0030, hci_encryption_key_refresh_complete_event_process },
};
@@ -376,25 +373,6 @@ void hci_number_of_completed_packets_event_process(uint8_t *buffer_in)
rp0->Handle_Packets_Pair_Entry);
}
-/* hci_data_buffer_overflow_event */
-/* Event len: 1 */
-/**
- * @brief 'This event is used to indicate that the Controller's data buffers have been overflowed.
-This can occur if the Host has sent more packets than allowed. The
-Link_Type parameter is used to indicate that the overflow was caused by ACL data.
- * @param Link_Type On wich type of channel overflow has occurred.
- * Values:
- - 0x01: ACL Buffer Overflow
- * @retval None
-*/
-
-void hci_data_buffer_overflow_event_process(uint8_t *buffer_in)
-{
- /* Input params */
- hci_data_buffer_overflow_event_rp0 *rp0 = (hci_data_buffer_overflow_event_rp0 *)buffer_in;
- hci_data_buffer_overflow_event(rp0->Link_Type);
-}
-
/* hci_encryption_key_refresh_complete_event */
/* Event len: 1 + 2 */
/**
@@ -503,8 +481,8 @@ void aci_hal_scan_req_report_event_process(uint8_t *buffer_in)
* @param FW_Error_Type FW Error type
* Values:
- 0x01: L2CAP recombination failure
- - 0x02: GATT UNEXPECTED RESPONSE ERROR
- - 0x03: NVM LEVEL WARNING
+ - 0x02: GATT unexpected peer message
+ - 0x03: NVM level warning
* @param Data_Length Length of Data in octets
* @param Data The error event info
* @retval None
@@ -540,12 +518,13 @@ procedure timeout has occurred or the pairing has failed. This is to notify the
we have paired with a remote device so that it can take further actions or to notify that a
timeout has occurred so that the upper layer can decide to disconnect the link.
* @param Connection_Handle Connection handle on which the pairing procedure completed
- * @param Status Specific pairing status (0:Success,1:Timeout,2:Failed)
+ * @param Status Pairing status
* Values:
- 0x00: Success
- - 0x01: Timeout
- - 0x02: Failed
- * @param Reason Pairing reason error code
+ - 0x01: SMP timeout
+ - 0x02: Pairing failed
+ - 0x03: Encryption failed
+ * @param Reason Pairing reason error code (valid in case of pairing failed status)
* Values:
- 0x02: OOB_NOT_AVAILABLE
- 0x03: AUTH_REQ_CANNOT_BE_MET
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h
index 4aa35e2b0..e5051bcd8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h
@@ -1,7 +1,7 @@
/******************************************************************************
* @file ble_events.h
* @author MCD Application Team
- * @date 22 January 2020
+ * @date 04 March 2020
* @brief Header file for STM32WB (Event callbacks)
* Auto-generated file: do not edit!
******************************************************************************
@@ -31,7 +31,7 @@ typedef struct
void (*process)(uint8_t *buffer_in);
} hci_event_table_t;
-#define HCI_EVENT_TABLE_SIZE 7
+#define HCI_EVENT_TABLE_SIZE 6
#define HCI_LE_META_EVENT_TABLE_SIZE 11
#define HCI_VENDOR_SPECIFIC_EVENT_TABLE_SIZE 43
extern const hci_event_table_t hci_event_table[HCI_EVENT_TABLE_SIZE];
@@ -159,16 +159,6 @@ flushed.
WEAK_FUNCTION(void hci_number_of_completed_packets_event(uint8_t Number_of_Handles,
Handle_Packets_Pair_Entry_t Handle_Packets_Pair_Entry[]));
/**
- * @brief 'This event is used to indicate that the Controller's data buffers have been overflowed.
-This can occur if the Host has sent more packets than allowed. The
-Link_Type parameter is used to indicate that the overflow was caused by ACL data.
- * @param Link_Type On wich type of channel overflow has occurred.
- * Values:
- - 0x01: ACL Buffer Overflow
- * @retval None
-*/
-WEAK_FUNCTION(void hci_data_buffer_overflow_event(uint8_t Link_Type));
-/**
* @brief 'The Encryption Key Refresh Complete event is used to indicate to the Host
that the encryption key was refreshed on the given Connection_Handle any
time encryption is paused and then resumed.
@@ -516,12 +506,13 @@ procedure timeout has occurred or the pairing has failed. This is to notify the
we have paired with a remote device so that it can take further actions or to notify that a
timeout has occurred so that the upper layer can decide to disconnect the link.
* @param Connection_Handle Connection handle on which the pairing procedure completed
- * @param Status Specific pairing status (0:Success,1:Timeout,2:Failed)
+ * @param Status Pairing status
* Values:
- 0x00: Success
- - 0x01: Timeout
- - 0x02: Failed
- * @param Reason Pairing reason error code
+ - 0x01: SMP timeout
+ - 0x02: Pairing failed
+ - 0x03: Encryption failed
+ * @param Reason Pairing reason error code (valid in case of pairing failed status)
* Values:
- 0x02: OOB_NOT_AVAILABLE
- 0x03: AUTH_REQ_CANNOT_BE_MET
@@ -1169,8 +1160,8 @@ WEAK_FUNCTION(void aci_hal_scan_req_report_event(uint8_t RSSI,
* @param FW_Error_Type FW Error type
* Values:
- 0x01: L2CAP recombination failure
- - 0x02: GATT UNEXPECTED RESPONSE ERROR
- - 0x03: NVM LEVEL WARNING
+ - 0x02: GATT unexpected peer message
+ - 0x03: NVM level warning
* @param Data_Length Length of Data in octets
* @param Data The error event info
* @retval None
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c
index ca3aee7bc..882faa39c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_gap_aci.c
* @author MCD Application Team
- * @date 23 May 2019
+ * @date 04 March 2020
* @brief Source file for ble api STM32WB (gap_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.h
index 3f0bfafe9..d77cbc276 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.h
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_gap_aci.h
* @author MCD Application Team
- * @date 06 November 2019
+ * @date 18 March 2020
* @brief Header file for STM32WB (gap_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -582,7 +582,7 @@ When this procedure is started, only the devices in limited discoverable mode ar
to the upper layers.
The procedure is terminated when either the upper layers issue a command to terminate
the procedure by issuing the command @ref aci_gap_terminate_gap_proc with the procedure
-code set to 0x01 or a timeout happens. When the procedure is terminated due to any of the
+code set to 0x01 or a timeout happens (the timeout value is fixed at 10.24 s.). When the procedure is terminated due to any of the
above reasons, @ref aci_gap_proc_complete_event event is returned with the procedure code
set to 0x01.
The device found when the procedure is ongoing is returned to the upper layers through the
@@ -622,7 +622,7 @@ tBleStatus aci_gap_start_limited_discovery_proc(uint16_t LE_Scan_Interval,
* @brief Start the general discovery procedure. The controller is commanded to start active
scanning. The procedure is terminated when either the upper layers issue a command
to terminate the procedure by issuing the command @ref aci_gap_terminate_gap_proc
-with the procedure code set to 0x02 or a timeout happens. When the procedure is
+with the procedure code set to 0x02 or a timeout happens (the timeout value is fixed at 10.24 s.). When the procedure is
terminated due to any of the above reasons, @ref aci_gap_proc_complete_event event
is returned with the procedure code set to 0x02. The device found when the procedure
is ongoing is returned to @ref hci_le_advertising_report_event.
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c
index 27d4275c4..9239f09be 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_gatt_aci.c
* @author MCD Application Team
- * @date 06 September 2019
+ * @date 04 March 2020
* @brief Source file for ble api STM32WB (gatt_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.h
index 98c7e1baa..4b44f30a1 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.h
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_gatt_aci.h
* @author MCD Application Team
- * @date 08 October 2019
+ * @date 04 March 2020
* @brief Header file for STM32WB (gatt_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c
index 4590f6f2b..0b881cd22 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_hal_aci.c
* @author MCD Application Team
- * @date 23 May 2019
+ * @date 04 March 2020
* @brief Source file for ble api STM32WB (hal_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.h
index 548bc7237..9bdd716cb 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.h
@@ -1,7 +1,7 @@
/******************************************************************************
* @file ble_hci_le.h
* @author MCD Application Team
- * @date 22 January 2020
+ * @date 02 March 2020
* @brief Header file for STM32WB (hci_le)
* Auto-generated file: do not edit!
******************************************************************************
@@ -76,54 +76,11 @@ occurs. The event mask allows the Host to control how much it is interrupted.
* @param Event_Mask Event mask. Default: 0x20001FFFFFFFFFFF
* Flags:
- 0x0000000000000000: No events specified
- - 0x0000000000000001: Inquiry Complete Event
- - 0x0000000000000002: Inquiry Result Event
- - 0x0000000000000004: Connection Complete Event
- - 0x0000000000000008: Connection Request Event
- 0x0000000000000010: Disconnection Complete Event
- - 0x0000000000000020: Authentication Complete Event
- - 0x0000000000000040: Remote Name Request Complete Event
- 0x0000000000000080: Encryption Change Event
- - 0x0000000000000100: Change Connection Link Key Complete Event
- - 0x0000000000000200: Master Link Key Complete Event
- - 0x0000000000000400: Read Remote Supported Features Complete Event
- 0x0000000000000800: Read Remote Version Information Complete Event
- - 0x0000000000001000: QoS Setup Complete Event
- 0x0000000000008000: Hardware Error Event
- - 0x0000000000010000: Flush Occurred Event
- - 0x0000000000020000: Role Change Event
- - 0x0000000000080000: Mode Change Event
- - 0x0000000000100000: Return Link Keys Event
- - 0x0000000000200000: PIN Code Request Event
- - 0x0000000000400000: Link Key Request Event
- - 0x0000000000800000: Link Key Notification Event
- - 0x0000000001000000: Loopback Command Event
- - 0x0000000002000000: Data Buffer Overflow Event
- - 0x0000000004000000: Max Slots Change Event
- - 0x0000000008000000: Read Clock Offset Complete Event
- - 0x0000000010000000: Connection Packet Type Changed Event
- - 0x0000000020000000: QoS Violation Event
- - 0x0000000040000000: Page Scan Mode Change Event
- - 0x0000000080000000: Page Scan Repetition Mode Change Event
- - 0x0000000100000000: Flow Specification Complete Event
- - 0x0000000200000000: Inquiry Result with RSSI Event
- - 0x0000000400000000: Read Remote Extended Features Complete Event
- - 0x0000080000000000: Synchronous Connection Complete Event
- - 0x0000100000000000: Synchronous Connection Changed Event
- - 0x0000200000000000: Sniff Subrating Event
- - 0x0000400000000000: Extended Inquiry Result Event
- 0x0000800000000000: Encryption Key Refresh Complete Event
- - 0x0001000000000000: IO Capability Request Event
- - 0x0002000000000000: IO Capability Request Reply Event
- - 0x0004000000000000: User Confirmation Request Event
- - 0x0008000000000000: User Passkey Request Event
- - 0x0010000000000000: Remote OOB Data Request Event
- - 0x0020000000000000: Simple Pairing Complete Event
- - 0x0080000000000000: Link Supervision Timeout Changed Event
- - 0x0100000000000000: Enhanced Flush Complete Event
- - 0x0400000000000000: User Passkey Notification Event
- - 0x0800000000000000: Keypress Notification Event
- - 0x1000000000000000: Remote Host Supported Features Notification Event
- 0x2000000000000000: LE Meta-Event
* @retval Value indicating success or error code.
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c
index 41cdce80f..31cf7984d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_l2cap_aci.c
* @author MCD Application Team
- * @date 23 May 2019
+ * @date 04 March 2020
* @brief Source file for ble api STM32WB (l2cap_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.h
index 7cf8ebd95..08756a32f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.h
@@ -1,13 +1,13 @@
/******************************************************************************
* @file ble_l2cap_aci.h
* @author MCD Application Team
- * @date 23 May 2019
+ * @date 04 March 2020
* @brief Header file for STM32WB (l2cap_aci)
* Auto-generated file: do not edit!
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h
index 46b8ecc60..ac0d48ac5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h
@@ -1,7 +1,7 @@
/******************************************************************************
* @file ble_types.h
* @author MCD Application Team
- * @date 22 January 2020
+ * @date 02 March 2020
* @brief Auto-generated file: do not edit!
******************************************************************************
* @attention
@@ -2298,11 +2298,6 @@ typedef PACKED(struct)
typedef PACKED(struct)
{
- uint8_t Link_Type;
-} hci_data_buffer_overflow_event_rp0;
-
-typedef PACKED(struct)
-{
uint8_t Status;
uint16_t Connection_Handle;
} hci_encryption_key_refresh_complete_event_rp0;
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h
index 675a1c689..fd8cc973a 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h
@@ -151,7 +151,7 @@
#define PERIPHERAL_PRIVACY_FLAG_UUID 0x2A02
#define RECONNECTION_ADDR_UUID 0x2A03
#define PERIPHERAL_PREFERRED_CONN_PARAMS_UUID 0x2A04
-
+#define CENTRAL_ADDRESS_RESOLUTION_UUID 0x2AA6
/* Characteristic value lengths
*/
@@ -360,9 +360,16 @@
#define SM_LINK_ENCRYPTED 0x04
-/* SMP pairing failed reason codes
+/* SMP pairing status (ACI_GAP_PAIRING_COMPLETE_EVENT)
+ */
+#define SMP_PAIRING_STATUS_SUCCESS 0x00
+#define SMP_PAIRING_STATUS_SMP_TIMEOUT 0x01
+#define SMP_PAIRING_STATUS_PAIRING_FAILED 0x02
+#define SMP_PAIRING_STATUS_ENCRYPT_FAILED 0x03
+
+
+/* SMP pairing failed reason code (ACI_GAP_PAIRING_COMPLETE_EVENT)
*/
-#define PASSKEY_ENTRY_FAILED 0x01
#define OOB_NOT_AVAILABLE 0x02
#define AUTH_REQ_CANNOT_BE_MET 0x03
#define CONFIRM_VALUE_FAILED 0x04
@@ -372,14 +379,8 @@
#define UNSPECIFIED_REASON 0x08
#define VERY_EARLY_NEXT_ATTEMPT 0x09
#define SM_INVALID_PARAMS 0x0A
-
-
-/* Pairing failed error codes
- * Error codes in EVT_BLUE_GAP_PAIRING_CMPLT event
- */
-#define SM_PAIRING_SUCCESS 0x00
-#define SM_PAIRING_TIMEOUT 0x01
-#define SM_PAIRING_FAILED 0x02
+#define SMP_SC_DHKEY_CHECK_FAILED 0x0B
+#define SMP_SC_NUMCOMPARISON_FAILED 0x0C
/* ------------------------------------------------------------------------- */
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h
index b47ec9f04..9034a15dc 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h
@@ -185,6 +185,17 @@ typedef uint8_t tBDAddr[6];
/* ------------------------------------------------------------------------- */
+/* Obsolete pairing complete definitions
+ */
+#define SM_PAIRING_SUCCESS 0x00
+#define SM_PAIRING_TIMEOUT 0x01
+#define SM_PAIRING_FAILED 0x02
+#define PASSKEY_ENTRY_FAILED 0x01
+
+
+/* ------------------------------------------------------------------------- */
+
+
/* Deprecative name for LE Read Remote Features command
*/
#define hci_le_read_remote_used_features hci_le_read_remote_features
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/doc/STM32WB_BLE_Wireless_Interface.html b/Middlewares/ST/STM32_WPAN/ble/core/doc/STM32WB_BLE_Wireless_Interface.html
index c963e584a..5d072803e 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/doc/STM32WB_BLE_Wireless_Interface.html
+++ b/Middlewares/ST/STM32_WPAN/ble/core/doc/STM32WB_BLE_Wireless_Interface.html
@@ -636,7 +636,7 @@ padding-right: 0px;
}
td.gsib_a {padding:0px;padding-top:4px;padding-left:3px;}
-</style></head><body><font face="arial"><h1>STM32WB BLE Wireless Interface</h1><p>This document describes the STM32WB BLE Application Commands Interface (ACI) and Host Commands Interface (HCI).</p><p><a href="https://www.st.com/en/microcontrollers/stm32wb-series.html">STM32WB Series website</a></p><h2>Revision history</h2><p>December 2018 - Rev 1.0 - First release for interface 1.0 </p><p>February 2019 - Rev 1.1 - Modified HCI_HARDWARE_ERROR_EVENT comment</p><p>March 2019 - Rev 1.2 - Removed unused event documentation </p><p>March 2019 - Rev 1.3 - Modification ACI_HAL_FW_ERROR_EVENT error code</p><p>March 2019 - Rev 1.4 - Changed default mask of HCI_SET_EVENT_MASK </p><p>May 2019 - Rev 1.5 - ACI_GATT_NOTIFICATION_EXT_EVENT added</p><p>June 2019 - Rev 1.6 - Changed comment on usage of Char Handles in multiple ACI_GATT commands; Added ACI_GATT_INDICATION_EXT_EVENT</p><p>June 2019 - Rev 1.7 - Changed descriptions of ACI_ATT_READ_BY_TYPE_REQ and ACI_GATT_READ_USING_CHAR_UUID</p><p>July 2019 - Rev 1.8 - Reworked error codes section; Added GAP_ prefix to the GAP procedure bitmap definitions</p><p>September 2019 - Rev 1.9 - Added ACI_GATT_READ_EXT_EVENT; Modified ACI_GAP_CONFIGURE_WHITELIST comment</p><p>October 2019 - Rev 1.10 - Changed descriptions of ACI_GATT_WRITE_WITHOUT_RESP and ACI_GATT_SIGNED_WRITE_WITHOUT_RESP; Removed obsolete configuration data elements</p><p>November 2019 - Rev 1.11 - Completed description of ACI_GAP_INIT; Added specific pairing status definitions</p><p>November 2019 - Rev 1.12 - Fixed status error codes</p><p>January 2020 - Rev 1.13 - Removed DIV unused configuration data; Fixed naming of HCI_LE_READ_REMOTE_FEATURES command and complete event</p><h2>Contents</h2><p><a href="#HCI/ACI commands_anchor">HCI/ACI commands</a></p><p><a href="#HCI/ACI events_anchor">HCI/ACI events</a></p><p><a href="#Status error codes_anchor">Status error codes</a></p><h1><a name="HCI/ACI commands_anchor">HCI/ACI commands</a></h1><p><a href="#HCI commands_anchor">HCI commands</a></p><p><a href="#HCI TESTING commands_anchor">HCI TESTING commands</a></p><p><a href="#ACI HAL commands_anchor">ACI HAL commands</a></p><p><a href="#ACI GAP commands_anchor">ACI GAP commands</a></p><p><a href="#ACI GATT/ATT commands_anchor">ACI GATT/ATT commands</a></p><p><a href="#ACI L2CAP commands_anchor">ACI L2CAP commands</a></p><h2><a name="HCI commands_anchor">HCI commands</a></h2><h3>HCI commands</h3><table width="800" border="1" class="reference">
+</style></head><body><font face="arial"><h1>STM32WB BLE Wireless Interface</h1><p>This document describes the STM32WB BLE Application Commands Interface (ACI) and Host Commands Interface (HCI).</p><p><a href="https://www.st.com/en/microcontrollers/stm32wb-series.html">STM32WB Series website</a></p><h2>Revision history</h2><p>December 2018 - Rev 1.0 - First release for interface 1.0 </p><p>February 2019 - Rev 1.1 - Modified HCI_HARDWARE_ERROR_EVENT comment</p><p>March 2019 - Rev 1.2 - Removed unused event documentation </p><p>March 2019 - Rev 1.3 - Modification ACI_HAL_FW_ERROR_EVENT error code</p><p>March 2019 - Rev 1.4 - Changed default mask of HCI_SET_EVENT_MASK </p><p>May 2019 - Rev 1.5 - ACI_GATT_NOTIFICATION_EXT_EVENT added</p><p>June 2019 - Rev 1.6 - Changed comment on usage of Char Handles in multiple ACI_GATT commands; Added ACI_GATT_INDICATION_EXT_EVENT</p><p>June 2019 - Rev 1.7 - Changed descriptions of ACI_ATT_READ_BY_TYPE_REQ and ACI_GATT_READ_USING_CHAR_UUID</p><p>July 2019 - Rev 1.8 - Reworked error codes section; Added GAP_ prefix to the GAP procedure bitmap definitions</p><p>September 2019 - Rev 1.9 - Added ACI_GATT_READ_EXT_EVENT; Modified ACI_GAP_CONFIGURE_WHITELIST comment</p><p>October 2019 - Rev 1.10 - Changed descriptions of ACI_GATT_WRITE_WITHOUT_RESP and ACI_GATT_SIGNED_WRITE_WITHOUT_RESP; Removed obsolete configuration data elements</p><p>November 2019 - Rev 1.11 - Completed description of ACI_GAP_INIT; Added specific pairing status definitions</p><p>November 2019 - Rev 1.12 - Fixed status error codes</p><p>January 2020 - Rev 1.13 - Removed DIV unused configuration data; Fixed naming of HCI_LE_READ_REMOTE_FEATURES command and complete event</p><p>March 2020 - Rev 1.14 - Removed unused HCI_Data_Buffer_Overflow event; Fixed naming of FW_Error_Type possible values; Fixed pairing status possible values</p><p>March 2020 - Rev 1.15 - Add GAP scan timeout value</p><h2>Contents</h2><p><a href="#HCI/ACI commands_anchor">HCI/ACI commands</a></p><p><a href="#HCI/ACI events_anchor">HCI/ACI events</a></p><p><a href="#Status error codes_anchor">Status error codes</a></p><h1><a name="HCI/ACI commands_anchor">HCI/ACI commands</a></h1><p><a href="#HCI commands_anchor">HCI commands</a></p><p><a href="#HCI TESTING commands_anchor">HCI TESTING commands</a></p><p><a href="#ACI HAL commands_anchor">ACI HAL commands</a></p><p><a href="#ACI GAP commands_anchor">ACI GAP commands</a></p><p><a href="#ACI GATT/ATT commands_anchor">ACI GATT/ATT commands</a></p><p><a href="#ACI L2CAP commands_anchor">ACI L2CAP commands</a></p><h2><a name="HCI commands_anchor">HCI commands</a></h2><h3>HCI commands</h3><table width="800" border="1" class="reference">
<tr><th>Command</th><th>OpCode</th></tr>
<tr><td><a href="#HCI_DISCONNECT_anchor">HCI_DISCONNECT</a></td><td><p>0x0406</p>
</td></tr>
@@ -805,7 +805,7 @@ occurs. The event mask allows the Host to control how much it is interrupted.
<tr><td><p>Event_Mask</p>
</td><td><p>8</p>
</td><td><p>Event mask. Default: 0x20001FFFFFFFFFFF</p>
-</td><td><p>Bitmask of:</p><br><li>0x0000000000000000: No events specified</li><li>0x0000000000000001: Inquiry Complete Event</li><li>0x0000000000000002: Inquiry Result Event</li><li>0x0000000000000004: Connection Complete Event</li><li>0x0000000000000008: Connection Request Event</li><li>0x0000000000000010: Disconnection Complete Event</li><li>0x0000000000000020: Authentication Complete Event</li><li>0x0000000000000040: Remote Name Request Complete Event</li><li>0x0000000000000080: Encryption Change Event</li><li>0x0000000000000100: Change Connection Link Key Complete Event</li><li>0x0000000000000200: Master Link Key Complete Event</li><li>0x0000000000000400: Read Remote Supported Features Complete Event</li><li>0x0000000000000800: Read Remote Version Information Complete Event</li><li>0x0000000000001000: QoS Setup Complete Event</li><li>0x0000000000008000: Hardware Error Event</li><li>0x0000000000010000: Flush Occurred Event</li><li>0x0000000000020000: Role Change Event</li><li>0x0000000000080000: Mode Change Event</li><li>0x0000000000100000: Return Link Keys Event</li><li>0x0000000000200000: PIN Code Request Event</li><li>0x0000000000400000: Link Key Request Event</li><li>0x0000000000800000: Link Key Notification Event</li><li>0x0000000001000000: Loopback Command Event</li><li>0x0000000002000000: Data Buffer Overflow Event</li><li>0x0000000004000000: Max Slots Change Event</li><li>0x0000000008000000: Read Clock Offset Complete Event</li><li>0x0000000010000000: Connection Packet Type Changed Event</li><li>0x0000000020000000: QoS Violation Event</li><li>0x0000000040000000: Page Scan Mode Change Event</li><li>0x0000000080000000: Page Scan Repetition Mode Change Event</li><li>0x0000000100000000: Flow Specification Complete Event</li><li>0x0000000200000000: Inquiry Result with RSSI Event</li><li>0x0000000400000000: Read Remote Extended Features Complete Event</li><li>0x0000080000000000: Synchronous Connection Complete Event</li><li>0x0000100000000000: Synchronous Connection Changed Event</li><li>0x0000200000000000: Sniff Subrating Event</li><li>0x0000400000000000: Extended Inquiry Result Event</li><li>0x0000800000000000: Encryption Key Refresh Complete Event</li><li>0x0001000000000000: IO Capability Request Event</li><li>0x0002000000000000: IO Capability Request Reply Event</li><li>0x0004000000000000: User Confirmation Request Event</li><li>0x0008000000000000: User Passkey Request Event</li><li>0x0010000000000000: Remote OOB Data Request Event</li><li>0x0020000000000000: Simple Pairing Complete Event</li><li>0x0080000000000000: Link Supervision Timeout Changed Event</li><li>0x0100000000000000: Enhanced Flush Complete Event</li><li>0x0400000000000000: User Passkey Notification Event</li><li>0x0800000000000000: Keypress Notification Event</li><li>0x1000000000000000: Remote Host Supported Features Notification Event</li><li>0x2000000000000000: LE Meta-Event</li></td></tr>
+</td><td><p>Bitmask of:</p><br><li>0x0000000000000000: No events specified</li><li>0x0000000000000010: Disconnection Complete Event</li><li>0x0000000000000080: Encryption Change Event</li><li>0x0000000000000800: Read Remote Version Information Complete Event</li><li>0x0000000000008000: Hardware Error Event</li><li>0x0000800000000000: Encryption Key Refresh Complete Event</li><li>0x2000000000000000: LE Meta-Event</li></td></tr>
</table><h3>Output parameters</h3><table width="800" border="1" class="reference">
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Status</p>
@@ -3506,7 +3506,7 @@ When this procedure is started, only the devices in limited discoverable mode ar
to the upper layers.
The procedure is terminated when either the upper layers issue a command to terminate
the procedure by issuing the command <a href="#ACI_GAP_TERMINATE_GAP_PROC_anchor">ACI_GAP_TERMINATE_GAP_PROC</a> with the procedure
-code set to 0x01 or a timeout happens. When the procedure is terminated due to any of the
+code set to 0x01 or a timeout happens (the timeout value is fixed at 10.24 s.). When the procedure is terminated due to any of the
above reasons, <a href="#ACI_GAP_PROC_COMPLETE_EVENT_anchor">ACI_GAP_PROC_COMPLETE_EVENT</a> event is returned with the procedure code
set to 0x01.
The device found when the procedure is ongoing is returned to the upper layers through the
@@ -3550,7 +3550,7 @@ Time = N * 0.625 msec.</p>
</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_STATUS_EVENT_anchor">HCI_COMMAND_STATUS_EVENT</a></li><li><a href="#HCI_LE_ADVERTISING_REPORT_EVENT_anchor">HCI_LE_ADVERTISING_REPORT_EVENT</a></li><li><a href="#ACI_GAP_PROC_COMPLETE_EVENT_anchor">ACI_GAP_PROC_COMPLETE_EVENT</a></li><h2><a name="ACI_GAP_START_GENERAL_DISCOVERY_PROC_anchor">ACI_GAP_START_GENERAL_DISCOVERY_PROC</a></h2><h3>Description</h3><p>Start the general discovery procedure. The controller is commanded to start active
scanning. The procedure is terminated when either the upper layers issue a command
to terminate the procedure by issuing the command <a href="#ACI_GAP_TERMINATE_GAP_PROC_anchor">ACI_GAP_TERMINATE_GAP_PROC</a>
-with the procedure code set to 0x02 or a timeout happens. When the procedure is
+with the procedure code set to 0x02 or a timeout happens (the timeout value is fixed at 10.24 s.). When the procedure is
terminated due to any of the above reasons, <a href="#ACI_GAP_PROC_COMPLETE_EVENT_anchor">ACI_GAP_PROC_COMPLETE_EVENT</a> event
is returned with the procedure code set to 0x02. The device found when the procedure
is ongoing is returned to <a href="#HCI_LE_ADVERTISING_REPORT_EVENT_anchor">HCI_LE_ADVERTISING_REPORT_EVENT</a>.</p><h3>Input parameters</h3><table width="800" border="1" class="reference">
@@ -5759,8 +5759,6 @@ Time = N * 0.625 msec.</p>
</td></tr>
<tr><td><a href="#HCI_NUMBER_OF_COMPLETED_PACKETS_EVENT_anchor">HCI_NUMBER_OF_COMPLETED_PACKETS_EVENT</a></td><td><p>0x13</p>
</td></tr>
-<tr><td><a href="#HCI_DATA_BUFFER_OVERFLOW_EVENT_anchor">HCI_DATA_BUFFER_OVERFLOW_EVENT</a></td><td><p>0x1A</p>
-</td></tr>
<tr><td><a href="#HCI_ENCRYPTION_KEY_REFRESH_COMPLETE_EVENT_anchor">HCI_ENCRYPTION_KEY_REFRESH_COMPLETE_EVENT</a></td><td><p>0x30</p>
</td></tr>
<tr><td><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></td><td><p>0x0E</p>
@@ -5892,14 +5890,6 @@ flushed.</p><h3>Event parameters</h3><table width="800" border="1" class="refere
or flushed) for the associated Connection_Handle since the previous time
the event was returned.</p>
</td><td></tr>
-</table><h2><a name="HCI_DATA_BUFFER_OVERFLOW_EVENT_anchor">HCI_DATA_BUFFER_OVERFLOW_EVENT</a></h2><h3>Description</h3><p>'This event is used to indicate that the Controller's data buffers have been overflowed.
-This can occur if the Host has sent more packets than allowed. The
-Link_Type parameter is used to indicate that the overflow was caused by ACL data.</p><h3>Event parameters</h3><table width="800" border="1" class="reference">
-<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
-<tr><td><p>Link_Type</p>
-</td><td><p>1</p>
-</td><td><p>On wich type of channel overflow has occurred.</p>
-</td><td><li>0x01: ACL Buffer Overflow</li></td></tr>
</table><h2><a name="HCI_ENCRYPTION_KEY_REFRESH_COMPLETE_EVENT_anchor">HCI_ENCRYPTION_KEY_REFRESH_COMPLETE_EVENT</a></h2><h3>Description</h3><p>'The Encryption Key Refresh Complete event is used to indicate to the Host
that the encryption key was refreshed on the given Connection_Handle any
time encryption is paused and then resumed.
@@ -6380,11 +6370,11 @@ timeout has occurred so that the upper layer can decide to disconnect the link.<
</td><td></tr>
<tr><td><p>Status</p>
</td><td><p>1</p>
-</td><td><p>Specific pairing status (0:Success,1:Timeout,2:Failed)</p>
-</td><td></td></tr>
+</td><td><p>Pairing status</p>
+</td><td><li>0x00: Success</li><li>0x01: SMP timeout</li><li>0x02: Pairing failed</li><li>0x03: Encryption failed</li></td></tr>
<tr><td><p>Reason</p>
</td><td><p>1</p>
-</td><td><p>Pairing reason error code</p>
+</td><td><p>Pairing reason error code (valid in case of pairing failed status)</p>
</td><td><li>0x02: OOB_NOT_AVAILABLE</li><li>0x03: AUTH_REQ_CANNOT_BE_MET</li><li>0x04: CONFIRM_VALUE_FAILED</li><li>0x05: PAIRING_NOT_SUPPORTED</li><li>0x06: INSUFF_ENCRYPTION_KEY_SIZE</li><li>0x07: CMD_NOT_SUPPORTED</li><li>0x08: UNSPECIFIED_REASON</li><li>0x09: VERY_EARLY_NEXT_ATTEMPT</li><li>0x0A: SM_INVALID_PARAMS</li><li>0x0B: SMP_SC_DHKEY_CHECK_FAILED</li><li>0x0C: SMP_SC_NUMCOMPARISON_FAILED</li></td></tr>
</table><h2><a name="ACI_GAP_PASS_KEY_REQ_EVENT_anchor">ACI_GAP_PASS_KEY_REQ_EVENT</a></h2><h3>Description</h3><p>This event is generated by the Security manager to the application when a passkey is
required for pairing. When this event is received, the application has to respond with the
@@ -7123,7 +7113,7 @@ Units: dBm</p>
<tr><td><p>FW_Error_Type</p>
</td><td><p>1</p>
</td><td><p>FW Error type</p>
-</td><td><li>0x01: L2CAP recombination failure</li><li>0x02: GATT UNEXPECTED RESPONSE ERROR</li><li>0x03: NVM LEVEL WARNING</li></td></tr>
+</td><td><li>0x01: L2CAP recombination failure</li><li>0x02: GATT unexpected peer message</li><li>0x03: NVM level warning</li></td></tr>
<tr><td><p>Data_Length</p>
</td><td><p>1</p>
</td><td><p>Length of Data in octets</p>
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h
index 5ef28f8bc..7dc35c6ca 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h
@@ -2,30 +2,21 @@
******************************************************************************
* @file aes_cbc.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in CBC Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_CBC_H__
#define __CRL_AES_CBC_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h
index 42c94dd79..727e24ad5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_ccm.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in CCM (Counter with CBC-MAC) Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_CCM_H__
#define __CRL_AES_CCM_H__
@@ -118,7 +111,7 @@ extern "C"
int32_t *P_pOutputSize);
/**
- * @}
+ * @}
*/
#ifdef __cplusplus
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h
index be30ff433..4571d7e1b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h
@@ -2,30 +2,21 @@
******************************************************************************
* @file aes_cfb.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in CFB Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
#ifndef __CRL_AES_CFB_H__
#define __CRL_AES_CFB_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h
index 87abf9777..954fc90cb 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_cmac.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in CMAC Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
*****************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_CMAC_H__
#define __CRL_AES_CMAC_H__
@@ -80,7 +73,7 @@ extern "C"
/**
- * @}
+ * @}
*/
#ifdef __cplusplus
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h
index ddafb3884..19fafc300 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_ctr.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in CTR Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
****************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_CTR_H__
#define __CRL_AES_CTR_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h
index 7b29c1ab8..5a64beab8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_common.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES common functions and definitions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __AES_COMMON_H__
#define __AES_COMMON_H__
@@ -87,8 +80,8 @@ extern "C"
#ifdef INCLUDE_ENCRYPTION
void AES_keyschedule_enc (const uint8_t *P_pKey, \
uint32_t *P_pExpKey, \
- int32_t P_keySize);
-
+ int32_t P_keySize);
+
void AES_general_SW_enc (const uint32_t* P_pInputBuffer,\
uint32_t* P_pOutputBuffer, \
const uint32_t* P_pExpKey, \
@@ -98,8 +91,8 @@ void AES_general_SW_enc (const uint32_t* P_pInputBuffer,\
#ifdef INCLUDE_DECRYPTION
void AES_keyschedule_dec (const uint8_t *P_pKey, \
uint32_t *P_pExpKey, \
- int32_t P_keySize);
-
+ int32_t P_keySize);
+
void AES_general_SW_dec (const uint32_t* P_pInputBuffer,\
uint32_t* P_pOutputBuffer, \
const uint32_t* P_pExpKey, \
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h
index a495dd4ba..7eef9a5ac 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES low level functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __AES_LOW_LEVEL_H__
#define __AES_LOW_LEVEL_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h
index 4e3955954..76af3c58d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_ecb.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in ECB Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_ECB_H__
#define __CRL_AES_ECB_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h
index fc9bab4c6..e828b0203 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_gcm.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in GCM Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_GCM_H__
#define __CRL_AES_GCM_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h
index 5fef0f971..3273be89a 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file aes_keywrap.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in KeyWrap Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_AES_KEYWRAP_H__
#define __CRL_AES_KEYWRAP_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h
index 0df0b7286..7ec98ca23 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file aes_ofb.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in OFB Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h
index 6615a1a4a..bb58d3458 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file aes_xts.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief AES in XTS Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h
index 0abb0e9d6..7aacda42f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file aes.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Container for the AES functionalities
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h
index 1e023bf12..e22d688d3 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h
@@ -2,27 +2,21 @@
******************************************************************************
* @file arc4.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief ARC4
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *****************************************************************************/
+ *****************************************************************************
+ */
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_ARC4_H__
#define __CRL_ARC4_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h
index 6d7b0f7cb..f0635051d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h
@@ -1,29 +1,22 @@
/**
-******************************************************************************
-* @file c5519.h
-* @author MCD Application Team
-* @version V3.0.0
-* @date 05-June-2015
-* @brief Container for ed25519 functionalities
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Image SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file c5519.h
+ * @author MCD Application Team
+ * @brief Container for ed25519 functionalities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __C25519_H__
#define __C25519_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h
index d10bea5d2..391a37426 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h
@@ -1,30 +1,21 @@
/**
-******************************************************************************
-* @file chacha.h
-* @author MCD Application Team
-* @version V3.0.0
-* @date 05-June-2015
-* @brief ChaCha20 header file
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Image SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
-
+ ******************************************************************************
+ * @file chacha.h
+ * @author MCD Application Team
+ * @brief ChaCha20 header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CHACHA_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h
index bf62cd48c..f69222677 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h
@@ -1,30 +1,21 @@
/**
-******************************************************************************
-* @file chacha20-poly1305.h
-* @author MCD Application Team
-* @version V3.0.0
-* @date 05-June-2015
-* @brief Container for chacha20-poly1305 functionalities
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Image SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
-
+ ******************************************************************************
+ * @file chacha20-poly1305.h
+ * @author MCD Application Team
+ * @brief Container for chacha20-poly1305 functionalities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CHACHA20_POLY1305_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h
index bb4bf3c30..039e71e0d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file err_codes.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides defines for error codes
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -46,11 +38,11 @@
/** @addtogroup ErrCodes Error Codes Definitions
* @{
*/
-
-/** @defgroup GenericError Generic Error Codes
+
+/** @defgroup GenericError Generic Error Codes
* @{
- */
-
+ */
+
#define AUTHENTICATION_SUCCESSFUL (int32_t) (1003) /*!< Authentication successful */
#define AUTHENTICATION_FAILED (int32_t) (1004) /*!< Authentication failed */
#define SIGNATURE_VALID AUTHENTICATION_SUCCESSFUL /*!< Signature is valid */
@@ -59,8 +51,8 @@
/**
* @}
*/
-
-/** @defgroup AESError AES Error Codes
+
+/** @defgroup AESError AES Error Codes
* @{
*/
#define AES_SUCCESS (int32_t) (0) /*!< AES of PRIVKEY Success */
@@ -71,7 +63,7 @@
/**
* @}
*/
-/** @defgroup CHACHAError ChaCha Error Codes
+/** @defgroup CHACHAError ChaCha Error Codes
* @{
*/
#define CHACHA_SUCCESS (int32_t) (0) /*!< ChaCha Success */
@@ -83,7 +75,7 @@
* @}
*/
-/** @defgroup POLY1305Error POLY1305 Error Codes
+/** @defgroup POLY1305Error POLY1305 Error Codes
* @{
*/
#define POLY1305_SUCCESS (int32_t) (0) /*!< POLY1305 Success */
@@ -94,7 +86,7 @@
* @}
*/
-
+
/** @defgroup ARC4Error ARC4 Error Codes
* @{
*/
@@ -105,7 +97,7 @@
/**
* @}
*/
-
+
/** @defgroup DESError DES Error Codes
* @{
*/
@@ -117,7 +109,7 @@
/**
* @}
*/
-
+
/** @defgroup TDESError TDES Error Codes
* @{
*/
@@ -129,7 +121,7 @@
/**
* @}
*/
-
+
/** @defgroup HASHError HASH Error Codes
* @{
*/
@@ -141,7 +133,7 @@
/**
* @}
*/
-
+
/** @defgroup RSAError RSA Error Codes
* @{
*/
@@ -156,7 +148,7 @@
/**
* @}
*/
-
+
/** @defgroup ECCError ECC Error Codes
* @{
*/
@@ -171,7 +163,7 @@
/**
* @}
*/
-
+
/** @defgroup RNGError Random Number Error Codes
* @{
*/
@@ -191,19 +183,19 @@
-/** @defgroup ED25519Error Ed25519 Error Codes
+/** @defgroup ED25519Error Ed25519 Error Codes
* @{
*/
#define ED25519_SUCCESS (int32_t) (0) /*!< Ed25519 Success */
#define ED25519_ERR_BAD_POINT (int32_t) (5505) /*!< Ed25519 Invalid Packet Point */
#define ED25519_ERR_BAD_PARAMETER (int32_t) (5504) /*!< Ed25519 One of the expected function parameters is invalid */
-
+
/**
* @}
*/
-/** @defgroup C25519Error Curve25519 Error Codes
+/** @defgroup C25519Error Curve25519 Error Codes
* @{
*/
#define C25519_SUCCESS (int32_t) (0) /*!< Curve25519 Success */
@@ -219,7 +211,7 @@
* @{
*/
#define MATH_SUCCESS (int32_t) (0) /*!< Math Success */
-#define MATH_ERR_BIGNUM_OVERFLOW (int32_t) (5301) /*!< Math Overflow, the returned BigNum would be greater than its maximum size */
+#define MATH_ERR_BIGNUM_OVERFLOW (int32_t) (5301) /*!< Math Overflow, the returned BigNum would be greater than its maximum size */
#define MATH_ERR_EVEN_MODULUS (int32_t) (5302) /*!< Math This function can be used only with odd moduli */
#define MATH_ERR_BAD_PARAMETER (int32_t) (5304) /*!< Math One of the expected function parameters is invalid */
#define MATH_ERR_INTERNAL (int32_t) (5311) /*!< Math Generic internal error */
@@ -235,11 +227,11 @@
#define CHACHA20POLY1305_ERR_BAD_OPERATION (int32_t) (3102) /*!< ChaCha20-Poly1305 Invalid operation */
#define CHACHA20POLY1305_ERR_BAD_CONTEXT (int32_t) (3103) /*!< ChaCha20-Poly1305 The context contains some invalid or uninitialized values */
#define CHACHA20POLY1305_ERR_BAD_PARAMETER (int32_t) (3104) /*!< ChaCha20-Poly1305 One of the expected function parameters is invalid */
-
+
/**
* @}
*/
-
+
#ifdef __cplusplus
}
#endif
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h
index c35c74cad..167b5aaa8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file macros.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
- * @brief Support Macros for functions of the Cryptolib
+ * @brief Support Macros for functions of the Cryptolib
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -34,8 +26,8 @@
#endif
/* Includes ------------------------------------------------------------------*/
-/* Exported types --------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
+/* Exported types --------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/** @addtogroup InternalAPI Internal functions
* @{
@@ -44,7 +36,7 @@
/** @addtogroup Macros Macros
* @{
*/
-
+
/**
* @brief This macro returns the number of 32-bit words required
* to store a variable whose byte size is passed in input
@@ -57,7 +49,7 @@
* @brief This macro returns the maximum value between two inputs,
* the evaluation is done with the ">" operator
* @param a First input
- * @param b Second input
+ * @param b Second input
* @retval Max(a,b)
*/
#define MAX(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (a) : (b))
@@ -66,7 +58,7 @@
* @brief This macro returns the minumum value between two inputs,
* the evaluation is done with the ">" operator
* @param a First input
- * @param b Second input
+ * @param b Second input
* @retval Min(a,b)
*/
#define MIN(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (b) : (a))
@@ -127,7 +119,7 @@
/**
* @brief This macro returns a byte within an word
* @param P_word The 32-bit from which the byte
- * @param P_n The index of the byte to be taken, 0 = MSB, 3 = LSB
+ * @param P_n The index of the byte to be taken, 0 = MSB, 3 = LSB
* @retval Selected P_n byte from P_word
*/
#define BYTE_X(P_word, P_n) (uint8_t) ((P_word >> (24 - (8 * (P_n)))) & 0xFFu)
@@ -136,10 +128,10 @@
/**
* @brief This macro outputs the 4 octects that form the input 32bit integer
* @param [in] P_x The input 32bit integer
- * @param [out] P_a The least significant byte of P_x
+ * @param [out] P_a The least significant byte of P_x
* @param [out] P_b The second least significant byte of P_x
* @param [out] P_c The second most significant byte of P_x
- * @param P_d The most significant byte of P_x
+ * @param P_d The most significant byte of P_x
* @retval none
*/
#define WORD32_TO_WORD8(P_x,P_a,P_b,P_c,P_d) P_a=(uint8_t)BYTE_3(P_x),P_b=(uint8_t)BYTE_2(P_x),P_c=(uint8_t)BYTE_1(P_x),P_d=(uint8_t)BYTE_0(P_x)
@@ -148,9 +140,9 @@
/**
* @brief This macro returns an integer from 4 octects
* @param P_b0 The most significant byte of the resulting integer
- * @param P_b1 The second most byte of the resulting integer
+ * @param P_b1 The second most byte of the resulting integer
* @param P_b2 The second least byte of the resulting integer
- * @param P_b3 The least byte of the resulting integer
+ * @param P_b3 The least byte of the resulting integer
* @retval The resulting 32bit integer formed by P_b0 || P_b1 || P_b2 || P_b3
*/
#define WORD8_TO_WORD32(P_b0, P_b1, P_b2, P_b3) (uint32_t) ((uint32_t)(P_b0) << 24 | (uint32_t)(P_b1) << 16 | (uint32_t)(P_b2) << 8 | (P_b3))
@@ -160,7 +152,7 @@
/**
* @brief This macro is used on little endian cpus to convert a
* 4 byte array into a 32 bit integer or viceversa.
- * @param VariableToConvert The 32 bits value to be converted
+ * @param VariableToConvert The 32 bits value to be converted
* @retval The converted 32 bits value
*/
#ifdef CL_ON_STM32
@@ -174,9 +166,9 @@
/**
* @brief This macro doesn't do anything. It exist for compatibility with
* little endian cpus.
- * @param VariableToConvert The 32 bit value to be converted
+ * @param VariableToConvert The 32 bit value to be converted
* @retval VariableToConvert as it was passed
- * @note This macro simply returns its argument as it is.
+ * @note This macro simply returns its argument as it is.
*/
#define LE_CONVERT_W32(VariableToConvert) (VariableToConvert)
#else /* CRL_ENDIANNESS NOT SET */
@@ -190,8 +182,8 @@
/**
* @brief This macro is used on big endian cpus to convert a
* a 32 bit integer into a little endian array of 4 bytes.
- * @param VariableToConvert The 32 bits value to be converted
- * @retval The converted 32 bits value
+ * @param VariableToConvert The 32 bits value to be converted
+ * @retval The converted 32 bits value
*/
#define BE_CONVERT_W32(VariableToConvert) ((ROL(VariableToConvert,24)&0xFF00FF00) | (ROL(VariableToConvert,8)&0x00FF00FF))
#endif
@@ -202,9 +194,9 @@
* @brief This macro is used to read a 4 bytes from a byte array and return
* it as a 32-bit word, taking care of system endianness
* @param P_pInputBuffer Pointer to the input byte buffer
- * @param P_index Index of P_pInputBuffer where the reading should start
+ * @param P_index Index of P_pInputBuffer where the reading should start
* @retval The 32 bits value
- * @note This macro is for systems where unaligned reading is allowed
+ * @note This macro is for systems where unaligned reading is allowed
*/
#define BUFFER_2_W32(P_pInputBuffer,P_index) (LE_CONVERT_W32(*((const uint32_t *) ((P_pInputBuffer)+(P_index)))))
/**
@@ -222,20 +214,20 @@
* taking care of system endianness
* @param [out] P_pOutputBuffer Pointer to the output byte buffer
* @param [in] P_index Index of P_pOutputBuffer where the writing should start
- * @param [in] P_word The 32-bit word that will be written
+ * @param [in] P_word The 32-bit word that will be written
* @retval none
- * @note This macro is for systems where unaligned writing is allowed
+ * @note This macro is for systems where unaligned writing is allowed
*/
-
+
#define W32_2_BUFFER(P_pOutputBuffer,P_index,P_word) *((uint32_t*)(P_pOutputBuffer+(P_index)))=LE_CONVERT_W32(P_word)
/**
* @brief This macro is used to write a 32bit integer into a byte buffer,
* with reversed endiannes
* @param [out] P_pOutputBuffer Pointer to the output byte buffer
* @param [in] P_index Index of P_pOutputBuffer where the writing should start
-* @param [in] P_word The 32-bit word that will be written
+* @param [in] P_word The 32-bit word that will be written
* @retval none
-* @note This macro is for systems where unaligned writing is allowed
+* @note This macro is for systems where unaligned writing is allowed
*/
#define LEW32_2_BUFFER(P_pOutputBuffer,P_index,P_word) *((uint32_t*)(P_pOutputBuffer+(P_index)))=(P_word)
#else
@@ -244,9 +236,9 @@
* @brief This macro is used to read a 4 bytes from a byte array and return
* it as a 32-bit word
* @param P_pInputBuffer Pointer to the input byte buffer
- * @param P_index Index of P_pInputBuffer where the reading should start
+ * @param P_index Index of P_pInputBuffer where the reading should start
* @retval The 32 bits value
- * @note This macro is for systems where unaligned reading is \b not allowed
+ * @note This macro is for systems where unaligned reading is \b not allowed
*/
#define BUFFER_2_W32(P_pInputBuffer,P_index) (WORD8_TO_WORD32(P_pInputBuffer[(P_index)],P_pInputBuffer[(P_index)+1],P_pInputBuffer[(P_index)+2],P_pInputBuffer[(P_index)+3]))
@@ -265,9 +257,9 @@
* taking care of system endianness
* @param [out] P_pOutputBuffer Pointer to the output byte buffer
* @param [in] P_index Index of P_pOutputBuffer where the writing should start
- * @param [in] P_word The 32-bit word that will be written
+ * @param [in] P_word The 32-bit word that will be written
* @retval none
- * @note This macro is for systems where unaligned writing is \b not allowed
+ * @note This macro is for systems where unaligned writing is \b not allowed
*/
#define W32_2_BUFFER(P_pOutputBuffer,P_index,P_word) WORD32_TO_WORD8((P_word),P_pOutputBuffer[(P_index)+3],P_pOutputBuffer[(P_index)+2],P_pOutputBuffer[(P_index)+1],P_pOutputBuffer[(P_index)])
@@ -281,7 +273,7 @@
* @note This macro is for systems where unaligned writing is \b not allowed
*/
#define LEW32_2_BUFFER(P_pOutputBuffer,P_index,P_word) WORD32_TO_WORD8((P_word),(P_pOutputBuffer)[(P_index)],(P_pOutputBuffer)[(P_index)+1],(P_pOutputBuffer)[(P_index)+2],(P_pOutputBuffer)[(P_index)+3])
-
+
#endif
@@ -292,7 +284,7 @@
/**
* @}
*/
-
+
#ifdef __cplusplus
}
#endif
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h
index 46323d1b1..3af71f54f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sk.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Symmetric Key Common Definitions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -39,15 +31,15 @@
/** @addtogroup SymKey
* @{
*/
-/* Exported types ----------------------------------------------------------- */
+/* Exported types ----------------------------------------------------------- */
-typedef enum {
- E_SK_DEFAULT = (uint32_t) (0x00000000), /*!< User Flag: No flag specified. This is the default value that should be set to this flag */
+typedef enum {
+ E_SK_DEFAULT = (uint32_t) (0x00000000), /*!< User Flag: No flag specified. This is the default value that should be set to this flag */
E_SK_DONT_PERFORM_KEY_SCHEDULE = (uint32_t) (0x00000001), /*!< User Flag: Used to force the init to not reperform key schedule.\n
The classic example is where the same key is used on a new message, in this case to redo key scheduling is
- a useless waste of computation, could be particularly useful on GCM, where key schedule is very complicated. */
+ a useless waste of computation, could be particularly useful on GCM, where key schedule is very complicated. */
E_SK_FINAL_APPEND = (uint32_t) (0x00000020), /*!< User Flag: Must be set in CMAC mode before the final Append call occurs. */
- E_SK_OPERATION_COMPLETED = (uint32_t) (0x00000002), /*!< Internal Flag (not to be set/read by user): used to check that the Finish function has been already called */
+ E_SK_OPERATION_COMPLETED = (uint32_t) (0x00000002), /*!< Internal Flag (not to be set/read by user): used to check that the Finish function has been already called */
E_SK_NO_MORE_APPEND_ALLOWED = (uint32_t) (0x00000004), /*!< Internal Flag (not to be set/read by user): it is set when the last append has been called. Used where the append is called with an InputSize not
multiple of the block size, which means that is the last input.*/
E_SK_NO_MORE_HEADER_APPEND_ALLOWED = (uint32_t) (0x00000010), /*!< Internal Flag (not to be set/read by user): only for authenticated encryption modes. \n
@@ -65,11 +57,11 @@ typedef enum {
/** @addtogroup InternalAPI Internal functions
* @{
*/
-
+
/** @defgroup SymKeylowlevel Symmetric Key Low Level Flags
* @{
*/
-
+
#define C_ENC (uint32_t) (0x00000000) /*!< Internal contant indicating "Encryption" */
#define C_DEC (uint32_t) (0x00000001) /*!< Internal contant indicating "Decryption" */
#define C_DIR_MASK (uint32_t) (0x00000001) /*!< Internal mask for Encryption/Decryption */
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h
index 8a90da6c7..b655259eb 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file types.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Define the various basic types needed by the Library
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -74,7 +66,7 @@ typedef signed char int8_t; /*!< stdint.h defintion of int8_t */
#endif /* !defined(_STDINT_H) && !defined(__stdint_h) && !defined(_STDINT) */
/** @brief Type definitation for a pre-allocated memory buffer that is required by some functions */
-typedef struct
+typedef struct
{
uint8_t *pmBuf; /*!< Pointer to the pre-allocated memory buffer, this must be set by the user*/
uint16_t mSize; /*!< Total size of the pre-allocated memory buffer */
@@ -89,7 +81,7 @@ membuf_stt;
/**
* @}
*/
-
+
#ifdef __cplusplus
}
#endif
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h
index 3887920c2..5d2e457f6 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h
@@ -1,28 +1,22 @@
/**
-******************************************************************************
-* @file chacha20_core.h
-* @author MCD Application Team
-* @version V3.0.0
-* @date 05-June-2015
-* @brief Implements the core chacha functionality
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************/
+ ******************************************************************************
+ * @file chacha20_core.h
+ * @author MCD Application Team
+ * @brief Implements the core chacha functionality
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
/*
* The implementation of chacha20 is just an adapatation (for consistency with
* the library) of code coming from: chacha-ref.c version 20080118 D. J. Bernstein
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h
index 4e5f6c951..5bb2a924a 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h
@@ -1,28 +1,21 @@
/**
-******************************************************************************
-* @file poly1305_core.h
-* @author MCD Application Team
-* @version V3.0.0
-* @date 05-June-2015
-* @brief Implements the core poly1305 functionality
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************/
+ ******************************************************************************
+ * @file poly1305_core.h
+ * @author MCD Application Team
+ * @brief Implements the core poly1305 functionality
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
#ifndef __POLY1305_CORE_H__
#define __POLY1305_CORE_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h
index a9925700e..575ae1504 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file arith.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Basic Arithmetic Functions for Big Numbers (Multi Precision Integers)
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h
index 8546de6f8..45cd53d29 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file bn.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Basic Functions for Big Numbers (Multi Precision Integers)
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h
index 0a818bb33..8ac262c3f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h
@@ -2,26 +2,18 @@
******************************************************************************
* @file conv.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Functions used to convert data representation from/to
* Big Numbers and byte (octect) arrays
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h
index 1aa06198d..897b58af7 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file modular.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides Base Modular Arithmetic Operations
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h
index 5f521ae2b..c36983f4f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file monty.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides Montgomery Operations
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h
index 16c93fba4..ecc76f923 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h
@@ -1,26 +1,19 @@
-/*
+/**
******************************************************************************
* @file rng_bn.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
+
* @brief Random Generation of BigNumers
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h
index dfc6b9e4f..0b8ba0576 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file math.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Container for the mathematical functionalities
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h
index 6e5fd5547..46ad2b114 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h
@@ -1,29 +1,21 @@
/**
-******************************************************************************
-* @file fe25519.h
-* @author MCD Application Team
-* @version V1.0
-* @date 09-December-2014
-* @brief fe25519 header file
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file fe25519.h
+ * @author MCD Application Team
+ * @brief fe25519 header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __FE25519_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h
index 52504d484..26cf34b4d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file des_cbc.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief DES in CBC Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_DES_CBC_H__
#define __CRL_DES_CBC_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h
index e8bc70d1a..a05d22b91 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file des_common.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief DES common functions and definitions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DES_COMMON_H__
#define __DES_COMMON_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h
index 5bdd41144..705750275 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file des_ecb.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief DES in ECB Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_DES_ECB_H__
#define __CRL_DES_ECB_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h
index d9617eee3..d94ac6dca 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h
@@ -2,27 +2,21 @@
******************************************************************************
* @file des.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Container for the DES functionalities
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
+ ******************************************************************************
+ */
+
/* Includes ------------------------------------------------------------------*/
#include "Common/des_common.h"
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h
index 54c570178..5930facd8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file elliptic.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides Elliptic Curve Cryptography (ECC) primitives.
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h
index e4f7bf348..6edb39140 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file ecc.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides Elliptic Curve Cryptography (ECC) primitives
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -210,7 +202,7 @@ extern "C"
uint8_t *P_pCoordinateValue,
int32_t *P_pCoordinateSize);
int32_t ECCgetPointFlag(const ECpoint_stt *P_pECPnt);
- void ECCsetPointFlag(ECpoint_stt *P_pECPnt,
+ void ECCsetPointFlag(ECpoint_stt *P_pECPnt,
ECPntFlags_et P_newFlag);
int32_t ECCsetPointGenerator(ECpoint_stt *P_pPoint, const EC_stt *P_pECctx);
int32_t ECCcopyPoint(const ECpoint_stt *P_pOriginalPoint, ECpoint_stt *P_pCopyPoint);
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h
index fefa937ab..7505f5ac5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h
@@ -1,31 +1,21 @@
/**
-******************************************************************************
-* @file ed25519.h
-* @author MCD Application Team
-* @version V1.0
-* @date 04-December-2014
-* @brief Container for ed25519 functionalities
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
-
-
+ ******************************************************************************
+ * @file ed25519.h
+ * @author MCD Application Team
+ * @brief Container for ed25519 functionalities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __ED25519_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h
index ced910161..1c7621ae8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h
@@ -1,29 +1,21 @@
/**
-******************************************************************************
-* @file ge25519.h
-* @author MCD Application Team
-* @version V1.0
-* @date 09-December-2014
-* @brief ge25519 header file
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file ge25519.h
+ * @author MCD Application Team
+ * @brief ge25519 header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GE25519_H__
@@ -39,7 +31,7 @@ extern "C" {
#include "../../Common_ed25519_c25519/internals/fe25519.h"
#include "sc25519.h"
-/** @addtogroup GE25519
+/** @addtogroup GE25519
* @{
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h
index 584a59fe3..6dfc06647 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h
@@ -1,29 +1,21 @@
/**
-******************************************************************************
-* @file sc25519.h
-* @author MCD Application Team
-* @version V1.0
-* @date 09-December-2014
-* @brief sc25519 header file
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file sc25519.h
+ * @author MCD Application Team
+ * @brief sc25519 header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SC25519_H__
@@ -33,7 +25,7 @@
extern "C" {
#endif
-/** @addtogroup sc25519
+/** @addtogroup sc25519
* @{
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h
index 622034b7c..bf0b69b32 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file hash_common.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides common HASH/HMAC definitions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h
index fde5cfc73..2dfc7ffb2 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha256_sha224_transform.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-256 Update function
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h
index 06c23f6d0..b5da6a0f7 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha512_sha384_transform.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-512 Update function
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h
index e2efa5f26..72d1711fd 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file hmac_md5.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HMAC-MD5 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h
index 740324c90..b8573b1f3 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h
@@ -2,30 +2,21 @@
******************************************************************************
* @file md5.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides MD5 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_MD5_H__
#define __CRL_MD5_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h
index c0cf5bcfb..93994f806 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file md5_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief MD5 core functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h
index 5ec83bb28..00dc5bad8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file hmac_sha1.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HMAC-SHA1 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h
index c8dfaabdb..70499c667 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h
@@ -2,31 +2,21 @@
******************************************************************************
* @file sha1.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides SHA1 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_SHA1_H__
#define __CRL_SHA1_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h
index 68e2d1619..f0652ed5e 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha1_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-1 core functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h
index 5cdcba2a6..c1bb96d71 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file hmac_sha224.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HMAC-SHA224 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h
index 00a9eb4d2..61bb2bce1 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha224.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides SHA224 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h
index 20b55f00d..914cf1d3e 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha224_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-224 core functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h
index 7668f347c..5648fdf01 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h
@@ -2,30 +2,21 @@
******************************************************************************
* @file hmac_sha256.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HMAC-SHA256 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_HMAC_SHA256_H__
#define __CRL_HMAC_SHA256_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h
index c80ffc659..e7a227860 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h
@@ -2,31 +2,21 @@
******************************************************************************
* @file sha256.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides SHA256 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_SHA256_H__
#define __CRL_SHA256_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h
index 2441d8bd6..5685ba36b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha256_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-256 core functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h
index 37d4e5b9f..7be147c4f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h
@@ -2,30 +2,21 @@
******************************************************************************
* @file hmac_sha384.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HMAC-SHA384 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
-
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_HMAC_SHA384_H__
#define __CRL_HMAC_SHA384_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h
index 8450aea02..889a0ca4f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h
@@ -2,27 +2,20 @@
******************************************************************************
* @file sha384.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides SHA384 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
+ ******************************************************************************
+ */
/*! \page Tutorial_SHA384 SHA384 Tutorial
*
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h
index a281beb37..f82871ae6 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha384_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-384 core functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h
index 1e71d4322..65c7a7cb5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file hkdf512.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HKDF-SHA512 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h
index 66a877fd0..b8fec1404 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h
@@ -2,27 +2,20 @@
******************************************************************************
* @file hmac_sha512.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides HMAC-SHA512 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
+ ******************************************************************************
+ */
/*! \page Tutorial_HMACSHA512 HMAC-SHA512 Tutorial
*
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h
index c7111ed30..7ec340240 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h
@@ -2,27 +2,20 @@
******************************************************************************
* @file sha512.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides SHA512 functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
+ ******************************************************************************
+ */
/*! \page Tutorial_SHA512 SHA512 Tutorial
*
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h
index c7aa2fb52..ffe7cc812 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file sha512_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief SHA-512 core functions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h
index 3cf2d2f50..1d01f8713 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file hash.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Container for the HASH functionalities
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.hom/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Includes ------------------------------------------------------------------*/
#include "Common/hash_common.h"
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h
index 99763d4d1..df40b6e02 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h
@@ -1,31 +1,21 @@
/**
-******************************************************************************
-* @file poly1305.h
-* @author MCD Application Team
-* @version V3.0.0
-* @date 05-June-2015
-* @brief Container for poly1305-AES functionalities
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
-*
-* Licensed under MCD-ST Image SW License Agreement V2, (the "License");
-* You may not use this file except in compliance with the License.
-* You may obtain a copy of the License at:
-*
-* http://www.st.com/software_license_agreement_liberty_v2
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-******************************************************************************
-*/
-
-
+ ******************************************************************************
+ * @file poly1305.h
+ * @author MCD Application Team
+ * @brief Container for poly1305-AES functionalities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __POLY1305_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h
index d4c662aee..e5fc3574f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file drbg.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Implements a pseudo random engine based on AES128-DRBG.
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h
index f1892908f..96a456967 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file rng.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides the random engine to the crypto library
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h
index c1f385650..d56284f04 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h
@@ -2,27 +2,20 @@
******************************************************************************
* @file rsa_low_level.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides Low Level RSA operations
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_RSA_LOW_LEVEL_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h
index 89e8957c9..32515b209 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file rsa.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides RSA operations with support for PKCS#1v1.5
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h
index 804b2f046..45c16947d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file rsa.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Provides RSA operations with support for PKCS#1v1.5
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h
index d0af08d5f..537900acf 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h
@@ -2,25 +2,17 @@
******************************************************************************
* @file tdes_cbc.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief TDES in CBC Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h
index e3c209c48..b5100d046 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file tdes_common.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief TDES common functions and definitions
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __TDES_COMMON_H__
#define __TDES_COMMON_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h
index cd5a22bbb..56add265b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file tdes_ecb.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief TDES in ECB Mode
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CRL_TDES_ECB_H__
#define __CRL_TDES_ECB_H__
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h
index 3474941ae..34ddcd572 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h
@@ -2,28 +2,21 @@
******************************************************************************
* @file tdes.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief Container for the TDES functionalities
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
+
/* Includes ------------------------------------------------------------------*/
#include "Common/tdes_common.h"
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h
index 3cab2f08f..165cd1dec 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h
@@ -2,26 +2,18 @@
******************************************************************************
* @file config.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief This file contains all the functions prototypes for the config firmware
* library.
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -33,50 +25,54 @@
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
+#include "stm32wbxx.h"
/* Exported types ------------------------------------------------------------*/
-/**
- * @brief Structure that contains STM32 Cryptographic Library settings
- */
+/**
+ * @brief Structure that contains STM32 Cryptographic Library settings
+ */
typedef struct
{
uint8_t X; /*!< Used to get the X parametre of the current STM32 crypto library verion */
uint8_t Y; /*!< Used to get the Y parametre of the current STM32 crypto library verion */
uint8_t Z; /*!< Used to get the Z parametre of the current STM32 crypto library verion */
- uint8_t Type; /*!< Used to get the Type of the verion.
- This parameter can be a value of @ref TypeConf */
+ uint8_t Type; /*!< Used to get the Type of the verion.
+ This parameter can be a value of @ref TypeConf */
uint8_t CortexConf ; /*!< Used to get the Cortex.
- This parameter can be a value of @ref CortexConf */
+ This parameter can be a value of @ref CortexConf */
uint8_t IdeConf ; /*!< Used to get the IDE used to compile the library.
- This parameter can be a value of @ref IdeConf */
+ This parameter can be a value of @ref IdeConf */
uint8_t IdeOptimization ; /*!< Used to get the compiler optimization.
- This parameter can be any combination of values of @ref IdeOptimization */
- uint8_t EndiannessConf ; /*!< Used to get the option value used to specify the memory representation of the platform.
- This parameter can be a value of @ref EndiannessConf */
- uint8_t MisalignedConf ; /*!< Used to get if the CRL_CPU_SUPPORT_MISALIGNED is defined or not.
- This parameter can be any combination of values of @ref MisalignedConf */
+ This parameter can be any combination of values of @ref IdeOptimization */
+ uint8_t FpuConf ; /*!< Used to get the FPU configuration used to compile the library.
+ This parameter can be a value of @ref FpuConf */
+ uint8_t EndiannessConf ; /*!< Used to get the option value used to specify the memory representation of the platform.
+ This parameter can be a value of @ref EndiannessConf */
+ uint8_t MisalignedConf ; /*!< Used to get if the CRL_CPU_SUPPORT_MISALIGNED is defined or not.
+ This parameter can be any combination of values of @ref MisalignedConf */
uint8_t EncDecConf; /*!< Used to get which functionalities of encryption and decryptio functionalities are included.
- This parameter can be any combination of values of @ref EncDecConf */
+ This parameter can be any combination of values of @ref EncDecConf */
uint16_t SymKeyConf ; /*!< Used to get the Symmetric algorithms included in the library
- This parameter can be any combination of values of @ref SymKeyConf */
- uint16_t SymKeyModesConf ; /*!< Used to get the Modes of Operations for Symmetric Key Algorithms included in the library
- This parameter can be any combination of values of @ref SymKeyModesConf */
- uint16_t AsymKeyConf ; /*!< Used to get the Asymmetric algorithms included in the library
- This parameter can be any combination of values of @ref AsymKeyConf */
- uint16_t HashConf ; /*!< Used to get the Hash and Hmac algorithms included in the library
- This parameter can be any combination of values of @ref HashConf */
- uint16_t MACConf; /*!< Used to get the MAC algorithms included in the library
- This parameter can be any combination of values of @ref MACConf */
- uint8_t DrbgConf ; /*!< Used to get if the deterministic random bit generator is inculded.
- This parameter can be any combination of values of @ref DRBGConf */
- uint8_t AesConf ; /*!< Used to get the AES algorithm version used.
- This parameter can be a value of @ref AESConf */
- uint8_t RsaConf ; /*!< Used to get the Window size selected.
- This parameter can be a value of @ref RSAConf*/
- uint8_t GcmConf ; /*!< Used to get the algorithm to be used for polynomial multiplication in AES-GCM.
- This parameter can be a value of @ref GCMConf */
-}STM32CryptoLibVer_TypeDef;
+ This parameter can be any combination of values of @ref SymKeyConf */
+ uint16_t SymKeyModesConf ; /*!< Used to get the Modes of Operations for Symmetric Key Algorithms included in the library
+ This parameter can be any combination of values of @ref SymKeyModesConf */
+ uint16_t AsymKeyConf ; /*!< Used to get the Asymmetric algorithms included in the library
+ This parameter can be any combination of values of @ref AsymKeyConf */
+ uint16_t HashConf ; /*!< Used to get the Hash and Hmac algorithms included in the library
+ This parameter can be any combination of values of @ref HashConf */
+ uint16_t MACConf; /*!< Used to get the MAC algorithms included in the library
+ This parameter can be any combination of values of @ref MACConf */
+ uint8_t DrbgConf ; /*!< Used to get if the deterministic random bit generator is inculded.
+ This parameter can be any combination of values of @ref DRBGConf */
+ uint8_t AesConf ; /*!< Used to get the AES algorithm version used.
+ This parameter can be a value of @ref AESConf */
+ uint8_t RsaConf ; /*!< Used to get the Window size selected.
+ This parameter can be a value of @ref RSAConf*/
+ uint8_t GcmConf ; /*!< Used to get the algorithm to be used for polynomial multiplication in AES-GCM.
+ This parameter can be a value of @ref GCMConf */
+}
+STM32CryptoLibVer_TypeDef;
/* Exported constants --------------------------------------------------------*/
/* Exported macros -----------------------------------------------------------*/
@@ -86,130 +82,147 @@ int32_t STM32_GetCryptoLibrarySettings(STM32CryptoLibVer_TypeDef * LibVersion);
/*************************************************************************************************
***-*-*-*-*--**- CONFIGURATION OPTIONS -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-***
*************************************************************************************************/
-
+#define USE_SW_AES
/** @defgroup CRYPTO_LIBRARY_VERSION
* This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings
- * This groupe has no impact on the algorithms implementation
+ * This groupe has no impact on the algorithms implementation
* @{
- */
+ */
#define VERSION_X 3 /*!< The X parametre of the current STM32 crypto library verion */
#define VERSION_Y 0 /*!< The Y parametre of the current STM32 crypto library verion */
#define VERSION_Z 0 /*!< The Z parametre of the current STM32 crypto library verion */
/**
* @} End of CRYPTO_LIBRARY_VERSION
- */
-
-/**
- * @defgroup TypeConf
+ */
+
+/**
+ * @defgroup TypeConf
* This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings
- * This groupe has no impact on the algorithms implementation
- * Only one option should be enabled
+ * This groupe has no impact on the algorithms implementation
+ * Only one option should be enabled
* @{
*/
#define SW ((uint8_t)0x01) /*!< This impelmentation is Full SW */
- /* #define HW ((uint8_t)0x02) */ /*!< This impelmentation support a HW accelerations*/
-
-/**
- * @} End of TypeConf
- */
-
-/**
+/* #define HW ((uint8_t)0x02) */ /*!< This impelmentation support a HW accelerations*/
+
+/**
+ * @} End of TypeConf
+ */
+
+/**
* @defgroup CortexConf Compiler setting
* This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings
- * This groupe has no impact on the algorithms implementation
- * Only one option should be enabled
+ * This groupe has no impact on the algorithms implementation
+ * Only one option should be enabled
* @{
- */
- /* #define CORTEX_M0 ((uint16_t)0x0001) */ /*!< Library is compiled for Cortex M0 */
- /* #define CORTEX_M0+ ((uint16_t)0x0002) */ /*!< Library is compiled for Cortex M0+ */
- /* #define CORTEX_M3 ((uint16_t)0x0003) */ /*!< Library is compiled for Cortex M3 */
-#define CORTEX_M4 ((uint16_t)0x0004) /*!< Library is compiled for Cortex M4 */
- /* #define CORTEX_M7 ((uint16_t)0x0005) */ /*!< Library is compiled for Cortex M7 */
+ */
+/* #define CORTEX_M0 ((uint16_t)0x0001) */ /*!< Library is compiled for Cortex M0 */
+/* #define CORTEX_M0plus ((uint16_t)0x0002) */ /*!< Library is compiled for Cortex M0+ */
+/* #define CORTEX_M3 ((uint16_t)0x0003) */ /*!< Library is compiled for Cortex M3 */
+#define CORTEX_M4 ((uint16_t)0x0004) /*!< Library is compiled for Cortex M4 */
+/* #define CORTEX_M7 ((uint16_t)0x0005) */ /*!< Library is compiled for Cortex M7 */
+/* #define CORTEX_M33 ((uint16_t)0x0006) */ /*!< Library is compiled for Cortex M33 */
/**
* @} End of CortexConf
- */
+ */
-/**
+/**
* @defgroup IdeConf Compiler setting
* This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings
- * This groupe has no impact on the algorithms implementation
- * Only one option should be enabled
+ * This groupe has no impact on the algorithms implementation
+ * Only one option should be enabled
* @{
*/
-#define IAR ((uint8_t)0x01) /*!< Library is compiled with Iar */
- /* #define KEIL ((uint8_t)0x02) */ /*!< Library is compiled with Keil */
- /* #define GCC ((uint8_t)0x03) */ /*!< Library is compiled with GCC */
-
-/**
- * @} End of IdeConf
- */
+#if defined (__ICCARM__)
+#define IAR ((uint8_t)0x01) /*!< Library is compiled with Iar */
+#elif defined(__CC_ARM)
+#define KEIL ((uint8_t)0x02) /*!< Library is compiled with Keil */
+#elif defined(__GNUC__)
+#define GCC ((uint8_t)0x03) /*!< Library is compiled with GCC */
+#else
+ #error "Unsupported Compiler"
+#endif
+/**
+ * @} End of IdeConf
+ */
-/**
+/**
* @defgroup IdeOptimization Compiler setting
* This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings
- * This groupe has no impact on the algorithms implementation
+ * This groupe has no impact on the algorithms implementation
* @{
*/
-#ifdef IAR
- /* #define IAR_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is None optimization */
- /* #define IAR_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is Low optimization */
- /* #define IAR_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is Meduim optimization */
- /* #define IAR_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is high balanced optimization */
- /* #define IAR_Optimization ((uint16_t)0x0005) */ /*!< The compiler optimization is high Size optimization */
-#define IAR_Optimization ((uint16_t)0x0006) /*!< The compiler optimization is high speed optimization */
- /* #define IAR_Optimization ((uint16_t)0x0007) */ /*!< The compiler optimization is high speed optimization with No Size constraints */
-#endif
-
-#ifdef KEIL
- /* #define KEIL_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is O0 */
- /* #define KEIL_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is O1 */
- /* #define KEIL_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is O2 */
- /* #define KEIL_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is O3 */
-
- /* #define OFT ((uint16_t)0x0010) */ /*!< Library is compiled with option Optimize For Time */
- /* #define SLSM ((uint16_t)0x0020) */ /*!< Library is compiled with option Split Load And Store Multiple */
- /* #define O1ELFSPF ((uint16_t)0x0040) */ /*!< Library is compiled with option One ELF Section per Function */
+#ifdef IAR
+/* #define IAR_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is None optimization */
+/* #define IAR_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is Low optimization */
+/* #define IAR_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is Meduim optimization */
+/* #define IAR_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is high balanced optimization */
+#define IAR_Optimization ((uint16_t)0x0005) /*!< The compiler optimization is high Size optimization */
+/* #define IAR_Optimization ((uint16_t)0x0006) */ /*!< The compiler optimization is high speed optimization */
+/* #define IAR_Optimization ((uint16_t)0x0007) */ /*!< The compiler optimization is high speed optimization with No Size constraints */
+#endif
+
+#ifdef KEIL
+/* #define KEIL_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is O0 */
+/* #define KEIL_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is O1 */
+/* #define KEIL_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is O2 */
+#define KEIL_Optimization ((uint16_t)0x0004) /*!< The compiler optimization is O3 */
+
+/* #define OFT ((uint16_t)0x0010) */ /*!< Library is compiled with option Optimize For Time */
+/* #define SLSM ((uint16_t)0x0020) */ /*!< Library is compiled with option Split Load And Store Multiple */
+#define O1ELFSPF ((uint16_t)0x0040) /*!< Library is compiled with option One ELF Section per Function */
#endif
-#ifdef GCC
- /* #define GCC_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is O0 */
- /* #define GCC_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is OG */
- /* #define GCC_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is O1 */
- /* #define GCC_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is O2 */
- /* #define GCC_Optimization ((uint16_t)0x0005) */ /*!< The compiler optimization is O3 */
- /* #define GCC_Optimization ((uint16_t)0x0006) */ /*!< The compiler optimization is OS */
- /* #define GCC_Optimization ((uint16_t)0x0007) */ /*!< The compiler optimization is Ofast */
-
- /* #define PDCR ((uint16_t)0x0010) */ /*!< Library is compiled with option Prepare Dead Code Removal */
- /* #define PDDR ((uint16_t)0x0020) */ /*!< Library is compiled with option Prepare Dead Data Removal */
- /* #define NSA ((uint16_t)0x0040) */ /*!< Library is compiled with option No Strict Aliasing */
+#ifdef GCC
+/* #define GCC_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is O0 */
+/* #define GCC_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is OG */
+/* #define GCC_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is O1 */
+/* #define GCC_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is O2 */
+/* #define GCC_Optimization ((uint16_t)0x0005) */ /*!< The compiler optimization is O3 */
+#define GCC_Optimization ((uint16_t)0x0006) /*!< The compiler optimization is OS */
+/* #define GCC_Optimization ((uint16_t)0x0007) */ /*!< The compiler optimization is Ofast */
+
+#define PDCR ((uint16_t)0x0010) /*!< Library is compiled with option Prepare Dead Code Removal */
+#define PDDR ((uint16_t)0x0020) /*!< Library is compiled with option Prepare Dead Data Removal */
+#define NSA ((uint16_t)0x0040) /*!< Library is compiled with option No Strict Aliasing */
#endif
/**
* @} End of IdeOptimization
- */
-
+ */
+
+/**
+ * @defgroup FpuConf Compiler setting
+ * This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings
+ * This groupe has no impact on the algorithms implementation
+ * @{
+ */
+/* #define FPU_Configuration ((uint16_t)0x0000) */ /*!< The FPU is disabled */
+#define FPU_Configuration ((uint16_t)0x0001) /*!< The FPU is enabled */
+/**
+ * @} End of FpuConf
+ */
/** @defgroup EndiannessConf Endianness
* Used to specify the memory representation of the platform.
* - CRL_ENDIANNESS=1 for LITTLE ENDIAN
* - CRL_ENDIANNESS=2 for BIG ENDIAN \n
- * This setting is \b VERY \b IMPORTANT
- * Only one option should be enabled
+ * This setting is \b VERY \b IMPORTANT
+ * Only one option should be enabled
* @{
*/
-
+
#define CRL_ENDIANNESS 1 /*!< LITTLE ENDIAN is selected */
- /* #define CRL_ENDIANNESS 2 */ /*!< BIG ENDIAN is selected */
-
+/* #define CRL_ENDIANNESS 2 */ /*!< BIG ENDIAN is selected */
+
/**
* @} End of EndiannessConf
- */
+ */
-/**
+/**
* @defgroup MisalignedConf Misaligned words read/write operations.
* Used to specify if the processor supports misaligned integers read/write operations. \n
* To be portable this flag is not defined but if the processor supports read/write operations of 4
@@ -217,47 +230,46 @@ int32_t STM32_GetCryptoLibrarySettings(STM32CryptoLibVer_TypeDef * LibVersion);
* of AES when used through high level functions (ex AES_CBC or crl_AES).
* @{
*/
-#define CRL_CPU_SUPPORT_MISALIGNED ((uint8_t)0x01) /*!< Improve the performance of AES when used through high level functions
- Enabled for Cortex M3, M4, M7 and Disabled for Cortex M0, M0+ */
-
+#define CRL_CPU_SUPPORT_MISALIGNED ((uint8_t)0x01) /*!< Improve the performance of AES when used through high level functions
+ Enabled for Cortex M3, M4, M7 and Disabled for Cortex M0, M0 + */
-/**
- * @} End of MisalignedConf
- */
+ /**
+ * @} End of MisalignedConf
+ */
-/**
- * @defgroup EncDecConf Encryption and/or Decryption functionalities
- * @{
- */
+ /**
+ * @defgroup EncDecConf Encryption and/or Decryption functionalities
+ * @{
+ */
#define INCLUDE_ENCRYPTION ((uint8_t)0x01) /*!< Includes the Encryption functionalities in the library.*/
#define INCLUDE_DECRYPTION ((uint8_t)0x02) /*!< Includes the Decryption functionalities in the library.*/
-/**
- * @} End of EncDecConf
- */
+ /**
+ * @} End of EncDecConf
+ */
-/**
- * @defgroup SymKeyConf Symmetric Key Algorithms
- * @{
- */
+ /**
+ * @defgroup SymKeyConf Symmetric Key Algorithms
+ * @{
+ */
#define INCLUDE_DES ((uint16_t)0x0001) /*!< DES functions are included in the library. */
#define INCLUDE_TDES ((uint16_t)0x0002) /*!< TripleDES (TDES) functions are included in the library. */
-#define INCLUDE_AES128 ((uint16_t)0x0004) /*!< AES functions with key size of 128 bit are included in the library. */
+#define INCLUDE_AES128 ((uint16_t)0x0004) /*!< AES functions with key size of 128 bit are included in the library. */
#define INCLUDE_AES192 ((uint16_t)0x0008) /*!< AES functions with key size of 192 bit are included in the library. */
#define INCLUDE_AES256 ((uint16_t)0x0010) /*!< AES functions with key size of 256 bit are included in the library. */
#define INCLUDE_ARC4 ((uint16_t)0x0020) /*!< ARC4 functions are included in the library. */
-#define INCLUDE_CHACHA ((uint16_t)0x0040) /*!< ChaCha functions are included in the library. */
+#define INCLUDE_CHACHA ((uint16_t)0x0040) /*!< ChaCha functions are included in the library. */
#define INCLUDE_CHACHA20POLY1305 ((uint16_t)0x0080) /*!< oly1305-AES functions are included in the library */
-/**
- * @} End of SymKeyConf
- */
+ /**
+ * @} End of SymKeyConf
+ */
-/**
- * @defgroup SymKeyModesConf Modes of Operations for Symmetric Key Algorithms
- * @{
- */
+ /**
+ * @defgroup SymKeyModesConf Modes of Operations for Symmetric Key Algorithms
+ * @{
+ */
#define INCLUDE_ECB ((uint16_t)0x0001) /*!< AES high level functions for ECB mode are included in the library */
#define INCLUDE_CBC ((uint16_t)0x0002) /*!< AES high level functions for CBC mode are included in the library */
@@ -270,27 +282,27 @@ int32_t STM32_GetCryptoLibrarySettings(STM32CryptoLibVer_TypeDef * LibVersion);
#define INCLUDE_OFB ((uint16_t)0x0100) /*!< AES-OFB is included in the library */
#define INCLUDE_CFB ((uint16_t)0x0200) /*!< AES-CFB is included in the library */
-/**
- * @} End of SymKeyModesConf
- */
+ /**
+ * @} End of SymKeyModesConf
+ */
-/**
- * @defgroup AsymKeyConf Asymmetric Key Algorithms
- * @{
- */
+ /**
+ * @defgroup AsymKeyConf Asymmetric Key Algorithms
+ * @{
+ */
#define INCLUDE_RSA (uint16_t)0x0001) /*!< RSA functions for signature verification are included in the library */
#define INCLUDE_ECC (uint16_t)0x0002) /*!< ECC functions are included in the library */
#define INCLUDE_ED25519 (uint16_t)0x0004) /*!< ED25519 functions are included in the library */
-#define INCLUDE_CURVE25519 (uint16_t)0x0008) /*!< Curve25519 functions are included in the library */
-/**
- * @} End of AsymKeyConf
- */
+#define INCLUDE_CURVE25519 (uint16_t)0x0008) /*!< Curve25519 functions are included in the library */
+ /**
+ * @} End of AsymKeyConf
+ */
-/**
- * @defgroup HashConf Hash and HMAC Algorithms
- * @{
- */
+ /**
+ * @defgroup HashConf Hash and HMAC Algorithms
+ * @{
+ */
#define INCLUDE_MD5 ((uint16_t)0x0001) /*!< MD5 functions are included in the library */
#define INCLUDE_SHA1 ((uint16_t)0x0002) /*!< SHA-1 functions are included in the library */
@@ -302,95 +314,95 @@ int32_t STM32_GetCryptoLibrarySettings(STM32CryptoLibVer_TypeDef * LibVersion);
#define INCLUDE_HKDF ((uint16_t)0x0080) /*!< Select if including the HKDF key derivation function, it requires HMAC */
- /**
- * @}
- */
+ /**
+ * @}
+ */
-/**
-* @defgroup MACConf Poly1305-AES Algorithm
-* @{
-*/
+ /**
+ * @defgroup MACConf Poly1305-AES Algorithm
+ * @{
+ */
#define INCLUDE_POLY1305 ((uint16_t)0x0001) /*!< This defines if Poly1305-AES functions are included in the library */
-/**
-* @}
-*/
-
+ /**
+ * @}
+ */
-/**
- * @defgroup DRBGConf Deterministic Random Bit Generator Based on AES-128
- * @{
- */
+
+ /**
+ * @defgroup DRBGConf Deterministic Random Bit Generator Based on AES-128
+ * @{
+ */
#define INCLUDE_DRBG_AES128 ((uint16_t)0x0001) /*!< Includes the deterministic random bit generator library */
#define CRL_RANDOM_REQUIRE_RESEED ((uint16_t)0x0002) /*!< Implements the request for reseed when using the DRBG too many times for security standards */
-/**
- * @} End of DRBGConf
- */
+ /**
+ * @} End of DRBGConf
+ */
-/**
- * @defgroup AESConf AES version
- * Used to select the AES algorithm version to use
- * - CRL_AES_ALGORITHM = 1 : version with 522 bytes of look-up tables, slower than version 2.
- * - CRL_AES_ALGORITHM = 2 : version with 2048 bytes of look-up tables, faster than version 1.
- * Only one option should be enabled
- * @{
-
- */
- /* #define CRL_AES_ALGORITHM 1 */ /*!< version with 522 bytes of look-up tables is selected */
- #define CRL_AES_ALGORITHM 2 /*!< version with 2048 bytes of look-up tables is selected */
-/**
- * @} End of AESConf
- */
+ /**
+ * @defgroup AESConf AES version
+ * Used to select the AES algorithm version to use
+ * - CRL_AES_ALGORITHM = 1 : version with 522 bytes of look-up tables, slower than version 2.
+ * - CRL_AES_ALGORITHM = 2 : version with 2048 bytes of look-up tables, faster than version 1.
+ * Only one option should be enabled
+ * @{
-/**
- * @defgroup RSAConf RSA Window Size
- * This parameter is used to speed up RSA operation with private key at expense of RAM memory.
- * It can't be set less than one.
- * Suggested values are 3 or 4. Entering a value of 7 or more will be probably worst than using 6.
- * Only one option should be enabled
- * @{
- */
+ */
+ /* #define CRL_AES_ALGORITHM 1 */ /*!< version with 522 bytes of look-up tables is selected */
+#define CRL_AES_ALGORITHM 2 /*!< version with 2048 bytes of look-up tables is selected */
+ /**
+ * @} End of AESConf
+ */
+
+ /**
+ * @defgroup RSAConf RSA Window Size
+ * This parameter is used to speed up RSA operation with private key at expense of RAM memory.
+ * It can't be set less than one.
+ * Suggested values are 3 or 4. Entering a value of 7 or more will be probably worst than using 6.
+ * Only one option should be enabled
+ * @{
+ */
/* #define RSA_WINDOW_SIZE 1 */ /*!< Window size selected is 1 */
/* #define RSA_WINDOW_SIZE 2 */ /*!< Window size selected is 2 */
/* #define RSA_WINDOW_SIZE 3 */ /*!< Window size selected is 3 */
#define RSA_WINDOW_SIZE 4 /*!< Window size selected is 4 */
-/**
- * @} End of RSAConf
- */
-
-/**
- * @defgroup GCMConf AES GCM GF(2^128) Precomputations Tables
- * Used to specify the algorithm to be used for polynomial multiplication in AES-GCM.\n
- * The algorithm's choice also defines the size of the precomputed table made to speed
- * up the multiplication. \n There are two types of table, one is based on the value of
- * the key and so needs to be generated at runting (through AES_GCM_keyschedule), the other
- * is constant and is defined (if included here) in privkey.h.
- * There are 3 possible choices:
- * - 0 = Without any tables. No space required. Slower version.
- * - 1 = Key-dependent table for *Poly(y) 0000<y<1111 and constant table for *x^4 \n
- * (256 key-dependent bytes - 32 constant bytes)
- * - 2 = 4 key-dependent tables for *Poly(y^(2^(32*i))) and 4 key-dependent tables for *Poly((y*x^4)^(2^(32*i)))
- * with 0000<y<1111 and 0<i<4 and constant tables for *x^8 and for *x^4\n
- * (2048 key-dependent bytes - 544 constant bytes)
- * Only one option should be enabled
- * @{
- */
+ /**
+ * @} End of RSAConf
+ */
+
+ /**
+ * @defgroup GCMConf AES GCM GF(2^128) Precomputations Tables
+ * Used to specify the algorithm to be used for polynomial multiplication in AES-GCM.\n
+ * The algorithm's choice also defines the size of the precomputed table made to speed
+ * up the multiplication. \n There are two types of table, one is based on the value of
+ * the key and so needs to be generated at runting (through AES_GCM_keyschedule), the other
+ * is constant and is defined (if included here) in privkey.h.
+ * There are 3 possible choices:
+ * - 0 = Without any tables. No space required. Slower version.
+ * - 1 = Key-dependent table for *Poly(y) 0000<y<1111 and constant table for *x^4 \n
+ * (256 key-dependent bytes - 32 constant bytes)
+ * - 2 = 4 key-dependent tables for *Poly(y^(2^(32*i))) and 4 key-dependent tables for *Poly((y*x^4)^(2^(32*i)))
+ * with 0000<y<1111 and 0<i<4 and constant tables for *x^8 and for *x^4\n
+ * (2048 key-dependent bytes - 544 constant bytes)
+ * Only one option should be enabled
+ * @{
+ */
/* #define CRL_GFMUL 0 */ /*!< Any tables is selected */
/* #define CRL_GFMUL 1 */ /*!< Key-dependent table is selected */
- #define CRL_GFMUL 2 /*!< 4 key-dependent tables is selected */
-/**
- * @} End of GCMConf
- */
+#define CRL_GFMUL 2 /*!< 4 key-dependent tables is selected */
+ /**
+ * @} End of GCMConf
+ */
#endif /*__CRL_CONFIG_H__*/
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h
index f43c5137f..9a9600b8b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h
@@ -2,26 +2,18 @@
******************************************************************************
* @file crypto.h
* @author MCD Application Team
- * @version V3.0.0
- * @date 05-June-2015
* @brief This file contains all the functions prototypes for the config firmware
* library.
******************************************************************************
* @attention
*
- * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ * <h2><center>&copy; Copyright (c) 2015 STMicroelectronics.
+ * All rights reserved.</center></h2>
*
- * Licensed under MCD-ST Image SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * This software component is licensed by ST under Image license SLA0044,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * http://www.st.com/SLA0044
*
******************************************************************************
*/
@@ -55,11 +47,11 @@
/** Hash functions are included */
#ifdef INCLUDE_HKDF
-#define INCLUDE_HMAC ((uint16_t)0x0040)
+#define INCLUDE_HMAC ((uint16_t)0x0040)
#define INCLUDE_SHA512 ((uint16_t)0x0020)
#endif
-#if defined(INCLUDE_SHA1) || defined(INCLUDE_SHA224) || defined(INCLUDE_SHA256) || defined(INCLUDE_MD5)|| defined(INCLUDE_SHA512)
+#if defined(INCLUDE_SHA1) || defined(INCLUDE_SHA224) || defined(INCLUDE_SHA256) || defined(INCLUDE_MD5)|| defined(INCLUDE_SHA512)
#define INCLUDE_HASH /*!< Hash functions are included */
#endif
@@ -105,12 +97,12 @@
#error "DRBG_AES128 requires INCLUDE_AES_128"
#endif
-#if defined(INCLUDE_POLY1305) && !defined(INCLUDE_AES128)
+#if defined(INCLUDE_POLY1305) && !defined(INCLUDE_AES128)
#error "POLY1305-AES requires INCLUDE_AES_128"
#endif
-#if defined(INCLUDE_ED25519) && !defined(INCLUDE_SHA512)
+#if defined(INCLUDE_ED25519) && !defined(INCLUDE_SHA512)
#error "ED25519 requires INCLUDE_SHA512"
#endif
@@ -180,23 +172,23 @@
#ifdef INCLUDE_ECC
#include "ECC/ecc.h"
#endif
-#ifdef INCLUDE_POLY1305
-#include "POLY1305/poly1305.h"
+#ifdef INCLUDE_POLY1305
+#include "POLY1305/poly1305.h"
#endif
-#ifdef INCLUDE_ED25519
+#ifdef INCLUDE_ED25519
#include "ED25519/ed25519.h"
#endif
-#ifdef INCLUDE_CURVE25519
+#ifdef INCLUDE_CURVE25519
#include "C25519/c25519.h"
#endif
-
+
#ifdef INCLUDE_CHACHA
#include "CHACHA/chacha.h"
#endif
-#ifdef INCLUDE_CHACHA20POLY1305
+#ifdef INCLUDE_CHACHA20POLY1305
#include "CHACHA20-POLY1305/chacha20-poly1305.h"
#endif
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC.a
new file mode 100644
index 000000000..34d45f45e
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_fpu.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_fpu.a
new file mode 100644
index 000000000..fc76e1993
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_fpu.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot.a
new file mode 100644
index 000000000..6b409d698
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot_fpu.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot_fpu.a
new file mode 100644
index 000000000..8840ada77
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot_fpu.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.a
new file mode 100644
index 000000000..295b6ffb9
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_fpu.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_fpu.a
new file mode 100644
index 000000000..a1cf36808
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_fpu.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc.a
new file mode 100644
index 000000000..a5775a677
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc_fpu.a b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc_fpu.a
new file mode 100644
index 000000000..2ecacdbb8
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc_fpu.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib
new file mode 100644
index 000000000..cfaf18163
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf_fpu.lib b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf_fpu.lib
new file mode 100644
index 000000000..be1b35d7d
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf_fpu.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf.lib b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf.lib
new file mode 100644
index 000000000..3bc08690d
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf_fpu.lib b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf_fpu.lib
new file mode 100644
index 000000000..1544f71f6
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf_fpu.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h
index 3cb9ed00b..80f74173a 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h
@@ -45,11 +45,11 @@
#include "types.h"
//#include "hal_types.h"
-#define BLE_MESH_APPLICATION_VERSION "1.12.003"
+#define BLE_MESH_APPLICATION_VERSION "1.12.007"
/**
* \mainpage ST BLE-Mesh Solutions Bluetooth LE Mesh Library
*
-* \version 1.12.003
+* \version 1.12.007
*
* \subsection contents_sec Contents
*
@@ -126,6 +126,10 @@
#define INPUT_OOB_ACTION_BIT_TWIST (1 << 1) /**< Twist */
#define INPUT_OOB_ACTION_BIT_ENTER_NUM (1 << 2) /**< Enter Number */
+#define ADDRESS_IS_UNICAST(a) (((MOBLEINT16)(a)>0)&&((MOBLEUINT16)(a)<0x8000))
+#define ADDRESS_IS_GROUP(a) (((MOBLEINT16)(a) & 0xC000) == 0xC000)
+#define ADDRESS_IS_ALL_NODES(a) ((MOBLEUINT16)(a) == 0xFFFF)
+
/** \brief List of status values for responses. */
typedef enum _MOBLE_COMMAND_STATUS
{
@@ -836,6 +840,11 @@ MOBLE_RESULT BLEMesh_SetLowPowerFeatureState(MOBLEUINT8 state);
*/
MOBLEUINT16 BLEMesh_GetFeatures(void);
+/** \brief Get status of transmission in process state.
+* \return Status of the packet transmission.
+*/
+MOBLEBOOL BLEMesh_TrsptIsBusyState(void);
+
/** \brief Set callback for handling heartbeat messages.
*
* \param[in] cb Callback
@@ -1082,17 +1091,22 @@ MOBLEUINT8 ApplicationGetVendorModelList(MOBLEUINT32* pModels_vendor_ID, \
* @brief ApplicationChkSigModelActive: This function checks if a specific
* Model Server is active in the Model Server list
* @param modelID: Model Server ID received for the checking function
+* @param elementIndex : index of element for which active model checking is needed
* retval Bool: True or False, if the Server ID matches with the list
*/
-MOBLEBOOL ApplicationChkSigModelActive(MOBLEUINT16 modelID);
+//MOBLEBOOL ApplicationChkSigModelActive(MOBLEUINT16 modelID);
+MOBLEBOOL ApplicationChkSigModelActive(MOBLEUINT16 modelID, MOBLEUINT8 elementIndex);
+
/**
* @brief ApplicationChkVendorModelActive: This function checks if a specific
* Model Server is active in the Vendor Model Server list
* @param modelID: Model Server ID received for the checking function
+* @param elementIndex : index of element for which active model checking is needed
* retval Bool: True or False, if the Server ID matches with the list
*/
-MOBLEBOOL ApplicationChkVendorModelActive(MOBLEUINT32 modelID);
+//MOBLEBOOL ApplicationChkVendorModelActive(MOBLEUINT32 modelID);
+MOBLEBOOL ApplicationChkVendorModelActive(MOBLEUINT32 modelID, MOBLEUINT8 elementIndex);
/**
* @brief ApplicationGetConfigServerDeviceKey: This function provides the
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h
index 5cb362a55..36769c5fd 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h
@@ -40,8 +40,8 @@
*/
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __EMBD_PROVISION_H
-#define __EMBD_PROVISION_H
+#ifndef __SERIAL_PRVN_H
+#define __SERIAL_PRVN_H
/* Includes ------------------------------------------------------------------*/
#include "types.h"
@@ -52,7 +52,7 @@
/* Exported Functions Prototypes ---------------------------------------------*/
void SerialPrvn_Process(char *rcvdStringBuff, uint16_t rcvdStringSize);
void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUINT16 nodeAddress);
-#endif /* __EMBD_PROVISION_H */
+#endif /* __SERIAL_PRVN_H */
/******************* (C) COPYRIGHT 2018 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC.a b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC.a
index 14f39578f..c7100474d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC.a
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC_DEBUG.a b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC_DEBUG.a
index 31ec1fc06..f7937151c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC_DEBUG.a
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC_DEBUG.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.a b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.a
index fe9417e3a..b55bd60c5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.a
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR_DEBUG.a b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR_DEBUG.a
index 248550e7c..49efbc235 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR_DEBUG.a
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR_DEBUG.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib
index 5fa5f6eb8..003c422e4 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil_DEBUG.lib b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil_DEBUG.lib
index 1bf35941e..912b72abe 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil_DEBUG.lib
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil_DEBUG.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h
index 3ef929b44..674591902 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h
@@ -55,10 +55,15 @@
* Light model nvm offset is 16 bytes ahead of generic model */
#define LIGHT_VALID_FLAG_OFFSET 0
#define LIGHT_LIGHTNESS_NVM_OFFSET 1
-#define LIGHT_CTL_NVM_OFFSET 3
-#define LIGHT_HSL_NVM_OFFSET 7
-#define LIGHT_HSL_DEFAULT_NVM_OFFSET 13
-
+#define LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET 3
+#define LIGHT_LIGHTNESS_LAST_NVM_OFFSET 5
+#define LIGHT_CTL_NVM_OFFSET 7
+#define LIGHT_CTL_DEFAULT_NVM_OFFSET 13
+#define LIGHT_HSL_NVM_OFFSET 19
+#define LIGHT_HSL_DEFAULT_NVM_OFFSET 25
+
+/* Light model nvm offset used for local array*/
+#define LIGHT_DEFAULT_OFFSET 6
/* Buffer index limit for the generic data */
#define GENERIC_DATA_LIMIT 15
@@ -76,11 +81,7 @@
#define INTENSITY_LEVEL_FULL 31990U
#define MAX_TID_VALUE 0XFF
-//#if STM32
-//typedef MOBLE_RESULT (*APPLI_SAVE_MODEL_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUINT16 size);
-//#elif BLUENRG2_DEVICE
typedef MOBLE_RESULT (*APPLI_SAVE_MODEL_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUINT8 size);
-//#endif
/** @addtogroup MODEL_GENERIC
* @{
*/
@@ -111,6 +112,9 @@ MOBLE_RESULT Chk_ParamValidity(MOBLEUINT8 param, MOBLEUINT8 max_param_val );
MOBLE_RESULT Chk_RangeValidity(MOBLEUINT16 min_param_value, const MOBLEUINT8* param,
MOBLEUINT16 max_param_value );
+MOBLE_RESULT Chk_HslRangeValidity(const MOBLEUINT8* param,MOBLEUINT16 min_param_value_1,
+ MOBLEUINT16 max_param_value_1,MOBLEUINT16 min_param_value_2,
+ MOBLEUINT16 max_param_value_2);
MOBLE_RESULT Chk_TwoParamValidity(MOBLEUINT16 min_param_range1, MOBLEUINT16 max_param_range1,
MOBLEUINT16 min_param_range2, MOBLEUINT16 max_param_range2,
const MOBLEUINT8* param);
@@ -123,6 +127,9 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
MOBLEINT16 min_param_range3, MOBLEUINT16 max_param_range3,
const MOBLEUINT8* param);
+MOBLE_RESULT Chk_ParamMinMaxIntValidity(MOBLEINT16 min_param_value, const MOBLEUINT8* param,
+ MOBLEINT16 max_param_value );
+
MOBLE_RESULT Chk_TidValidity(MOBLE_ADDRESS peer_Addrs,MOBLE_ADDRESS dst_Addrs,MOBLEUINT8 tidValue);
MOBLEUINT32 Get_StepResolutionValue(MOBLEUINT8 time_param);
@@ -145,4 +152,9 @@ MOBLEUINT8 BLE_waitPeriod(MOBLEUINT32 waitPeriod);
MOBLEUINT8 Time_Conversion(MOBLEUINT32 lc_Time);
void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size);
+MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load);
+void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load);
+void Light_HslPowerOnValue(MOBLEUINT8 const *pModelValue_Load);
+
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
#endif
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/config_client.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/config_client.h
index ffdb5f4fd..9f76a7f2f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/config_client.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/config_client.h
@@ -179,7 +179,7 @@
#define ADDRESS_IS_GROUP(a) (((MOBLEINT16)(a) & 0xC000) == 0xC000)
#define ADDRESS_UNASSIGNED 0x0000U
#define ADDRESS_IS_UNASSIGNED(a) ((MOBLEINT16)(a) == ADDRESS_UNASSIGNED)
-
+#define MODEL_IS_FOUNDATION_MODEL(a) ( ((MOBLEINT16)(a) & 0xFFF0) == 0)
/* Exported structure --------------------------------------------------------*/
@@ -191,14 +191,7 @@ typedef struct {
MOBLEUINT32 Initial_time; /* Initial time for the Message */
MOBLEUINT8 NbOfSIGModelsToConfigure;
- MOBLEUINT8 NbOfSIGModelsToAppBind;
- MOBLEUINT8 NbOfSIGModelsToPublish;
- MOBLEUINT8 NbOfSIGModelsToSubscribe;
-
MOBLEUINT8 NbOfVendorModelsToConfigure;
- MOBLEUINT8 NbOfVendorModelsToAppBind;
- MOBLEUINT8 NbOfVendorModelsToPublish;
- MOBLEUINT8 NbOfVendorModelsToSubscribe;
} NodeInfo_t;
typedef struct {
@@ -339,6 +332,8 @@ typedef enum
typedef enum
{
NodeIdle_State,
+ NodeNextSigModel_State,
+ NodeNextVendorModel_State,
NodeSendMessage_State,
InProgress_State,
CompositionRecd_State,
@@ -384,15 +379,13 @@ typedef enum
typedef struct
{
MOBLEUINT16 opcode;
-// MOBLEBOOL reliable;
MOBLEUINT8 min_payload_size;
MOBLEUINT8 max_payload_size;
const MOBLEUINT8 *pDefaultParam;
-// MOBLEUINT16 response_opcode;
-// MOBLEUINT16 min_response_size;
-// MOBLEUINT16 max_response_size;
} MODEL_CONFIG_CLIENT_OpcodeTableParam_t;
+extern Elements_Page0_t aNodeElements[MAX_ELEMENTS_PER_NODE];
+
/******************************************************************************/
/********** Following Section defines the Opcodes for the Messages ************/
/******************************************************************************/
@@ -411,7 +404,7 @@ MOBLE_RESULT ConfigClientModel_SendMessage(MOBLE_ADDRESS dst_peer ,
MOBLEUINT32 length);
-MOBLE_RESULT ConfigClient_CompositionDataGet(void);
+MOBLE_RESULT ConfigClient_CompositionDataGet(MOBLE_ADDRESS dst_peer);
MOBLE_RESULT ConfigClient_CompositionDataStatusResponse(MOBLEUINT8 const *pCompositionData,
MOBLEUINT32 length);
@@ -433,8 +426,11 @@ void ConfigClient_SaveMsgSendingTime (void);
void ConfigClient_ResetTrials (void);
void ConfigClient_ErrorState (void);
-MOBLE_RESULT ConfigClient_AppKeyAdd (MOBLEUINT16 netKeyIndex, MOBLEUINT16 appKeyIndex,
+MOBLE_RESULT ConfigClient_AppKeyAdd (MOBLE_ADDRESS dst_peer,
+ MOBLEUINT16 netKeyIndex,
+ MOBLEUINT16 appKeyIndex,
MOBLEUINT8* appkey);
+
MOBLE_RESULT _ConfigClient_AppKeyAdd (configClientAppKeyAdd_t* pClientAppKey);
MOBLE_RESULT ConfigClient_ModelAppBind (MOBLEUINT16 elementAddress,
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h
index d4240f8b7..9c081d213 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h
@@ -66,10 +66,10 @@
#define GENERIC_LEVEL_SET_ACK 0x8206
#define GENERIC_LEVEL_SET_UNACK 0x8207
#define GENERIC_LEVEL_STATUS 0x8208
-#define GENERIC_LEVEL_DELTA_SET 0x8209
-#define GENERIC_LEVEL_DELTA_SET_UNACK 0x820A
-#define GENERIC_LEVEL_DELTA_MOVE_SET 0x820B
-#define GENERIC_LEVEL_DELTA_MOVE_SET_UNACK 0x820C
+#define GENERIC_DELTA_SET 0x8209
+#define GENERIC_DELTA_SET_UNACK 0x820A
+#define GENERIC_MOVE_SET 0x820B
+#define GENERIC_MOVE_SET_UNACK 0x820C
/* Generic Default Transition Time Server Model Opcode */
#define GENERIC_DEFAULT_TRANSITION_TIME_GET 0x820D
@@ -199,7 +199,7 @@
#define GENERIC_POWER_ON_STATE 0X01
#define GENERIC_POWER_RESTORE_STATE 0X02
-#define LEVEL_MIN_VALID_RANGE 0x00
+#define LEVEL_MIN_VALID_RANGE 0x0000
#define LEVEL_MAX_VALID_RANGE 0x7FFF
#define TRANSITION_MIN_VALID_RANGE 0x00
@@ -235,6 +235,9 @@
#define GENERIC_ON_OFF_TRANSITION_START 0X01
#define GENERIC_LEVEL_TRANSITION_START 0X02
+#define BINDING_GENERIC_ON_OFF_SET 0X00
+#define BINDING_GENERIC_LEVEL_SET 0X01
+
#define PACKET_CACHE_SIZE 2
/* Exported variables ------------------------------------------------------- */
@@ -261,6 +264,7 @@ typedef struct
{
MOBLEUINT8 GenericTransitionFlag;
MOBLEUINT8 GenericOptionalParam;
+ MOBLEUINT8 Generic_Trnsn_Cmplt;
}Generic_ModelFlag_t;
/*****************************************************/
@@ -297,6 +301,7 @@ typedef struct
MOBLEUINT8 RemainingTime;
MOBLEUINT8 Last_Level_TID;
MOBLEINT16 Last_Present_Level16;
+ MOBLEINT32 Last_delta_level;
}Generic_LevelStatus_t;
typedef struct
@@ -348,12 +353,12 @@ typedef struct
*/
MOBLE_RESULT (*Level_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8);
- /* Pointer to the function Appli_Generic_LevelDelta_Set used for callback
+ /* Pointer to the function Appli_Generic_Delta_Set used for callback
from the middle layer to Application layer
*/
MOBLE_RESULT (*LevelDelta_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8);
- /* Pointer to the function Appli_Generic_LevelMove_Set used for callback
+ /* Pointer to the function Appli_Generic_Move_Set used for callback
from the middle layer to Application layer
*/
MOBLE_RESULT (*LevelDeltaMove_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8);
@@ -366,8 +371,6 @@ typedef struct
MOBLE_RESULT (*GenericPowerOnOff_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
- void (*GenericRestorePowerOnOff_cb)(MOBLEUINT8);
-
/* Pointer to the function Generic_DefaultTransitionTime_Set used for callback
from the middle layer to Application layer
*/
@@ -403,8 +406,8 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const*, MOBLEUINT32);
MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* , MOBLEUINT32*);
MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8*, MOBLEUINT32);
-MOBLE_RESULT Generic_LevelDelta_Set(const MOBLEUINT8*, MOBLEUINT32);
-MOBLE_RESULT Generic_LevelMove_Set(const MOBLEUINT8*, MOBLEUINT32);
+MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8*, MOBLEUINT32);
+MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8*, MOBLEUINT32);
MOBLE_RESULT Generic_Level_Status(MOBLEUINT8* , MOBLEUINT32*);
MOBLE_RESULT Generic_PowerOnOff_Set(const MOBLEUINT8*, MOBLEUINT32 length);
MOBLE_RESULT Generic_PowerOnOff_Status(MOBLEUINT8*, MOBLEUINT32*);
@@ -437,14 +440,14 @@ MOBLE_RESULT BLEMesh_AddGenericModels(void);
void Generic_GetStepValue(MOBLEUINT8 stepParam);
-void GenericOnOff_LightActualBinding(Generic_OnOffParam_t* onOff_param);
-void GenericLevel_LightActualBinding(Generic_LevelParam_t* gLevel_param);
-void GenericLevel_CtlTempBinding(Generic_LevelParam_t * bLevelParam);
-void GenericLevel_HslHueBinding(Generic_LevelParam_t * bLevelParam);
-void GenericLevel_HslSaturationBinding(Generic_LevelParam_t * bLevelParam);
+void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param);
+void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8 flag);
+void GenericLevel_CtlTempBinding(Generic_LevelStatus_t * bLevelParam);
+void GenericLevel_HslHueBinding(Generic_LevelStatus_t * bLevelParam);
+void GenericLevel_HslSaturationBinding(Generic_LevelStatus_t * bLevelParam);
+void GenericOnOff_Light_LC_Binding(Generic_OnOffStatus_t* onOff_param);
-MOBLE_RESULT Generic_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue);
-MOBLE_RESULT Generic_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue);
+MOBLE_RESULT Generic_TransitionBehaviour(MOBLEUINT8 *GetValue);
MOBLE_RESULT GenericOnOffStateUpdate_Process(void);
MOBLE_RESULT GenericLevelStateUpdate_Process(void);
@@ -452,8 +455,6 @@ MOBLE_RESULT GenericLevelStateUpdate_Process(void);
void Generic_OnOffDefaultTransitionValue(void);
void Generic_LevelDefaultTransitionValue(MOBLEUINT16 levelValue);
-void Generic_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size);
-
MOBLE_RESULT Generic_Client_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength);
MOBLE_RESULT Generic_Client_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength);
MOBLE_RESULT Generic_Client_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength);
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h
index ea6a5a330..833254ae7 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h
@@ -162,11 +162,20 @@
#define MAX_CTL_DELTA_VALUE 0X7FFF
#define MIN_CTL_DELTA_VALUE 0X8000
-/* Model Binding Macros Flag */
-#define BINDING_LIGHT_LIGHTNESS_ACTUAL_SET 0X01
-#define BINDING_LIGHT_LIGHTNESS_LINEAR_SET 0X00
-#define BINDING_LIGHT_CTL_LIGHTNESS_SET 0X00
+/*Macros for the HSL parameter */
+#define MIN_HUE_RANGE 0X0000
+#define MAX_HUE_RANGE 0XFFFF
+#define MIN_SATURATION_RANGE 0X0000
+#define MAX_SATURATION_RANGE 0XFFFF
+/* Model Binding Macros Flag */
+#define BINDING_LIGHT_LIGHTNESS_ACTUAL_SET 0X02
+#define BINDING_LIGHT_LIGHTNESS_LINEAR_SET 0X03
+#define BINDING_LIGHT_CTL_SET 0X04
+#define BINDING_LIGHT_CTL_TEMP_SET 0X05
+#define BINDING_LIGHT_HSL_SET 0X06
+#define BINDIG_LIGHT_HSL_HUE_SET 0X07
+#define BINDIG_LIGHT_HSL_SATURATION_SET 0X08
/* Macros used for light restore value */
#define LIGHT_LIGHTNESS_NVM_FLAG 0X03
#define LIGHT_CTL_NVM_FLAG 0X04
@@ -192,6 +201,8 @@
#define LIGHT_HSL_TRANSITION_START 0X05
#define LIGHT_HSL_HUE_TRANSITION_START 0X06
#define LIGHT_HSL_SATURATION_TRANSITION_START 0X07
+
+#define MAX_NUM_BINDED_STATE 5
/* Exported variables ------------------------------------------------------- */
/* Transition flag of models*/
#pragma pack(1)
@@ -199,7 +210,15 @@ typedef struct
{
MOBLEUINT8 LightTransitionFlag;
MOBLEUINT8 LightOptionalParam;
+ MOBLEUINT8 Light_Trnsn_Cmplt;
}Light_ModelFlag_t;
+
+typedef struct
+{
+ MOBLEUINT16 PublishStateOpcode[MAX_NUM_BINDED_STATE];
+ MOBLEUINT16 Model_ID[MAX_NUM_BINDED_STATE];
+ MOBLEUINT8 BindedStateCount;
+}Light_PublishOpcodeList_t;
/**************************************/
/* Transitiojn time variables*/
@@ -223,15 +242,12 @@ typedef struct
typedef struct
{
- MOBLEUINT16 PresentValue16;
+ MOBLEUINT16 LightnessPresentValue16;
+ MOBLEUINT16 LinearPresentValue16;
MOBLEUINT16 TargetValue16;
MOBLEUINT8 RemainingTime;
-} Light_LightnessStatus_t;
-
-typedef struct
-{
MOBLEUINT16 LightnessLastStatus;
-} Light_LightnessLastParam_t;
+} Light_LightnessStatus_t;
typedef struct
{
@@ -328,6 +344,7 @@ typedef struct
typedef struct
{
+ MOBLEUINT8 Status_Code;
MOBLEUINT16 HslHueMinRange16;
MOBLEUINT16 HslHueMaxRange16;
MOBLEUINT16 HslMinSaturation16;
@@ -435,6 +452,7 @@ typedef struct
MOBLE_RESULT (*GetLightLightness_cb)(MOBLEUINT8*);
MOBLE_RESULT (*GetLightLightnessLinear_cb)(MOBLEUINT8*);
MOBLE_RESULT (*GetLightLightnessDefault_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetLightLightnessLast_cb)(MOBLEUINT8*);
MOBLE_RESULT (*GetLightLightnessRange_cb)(MOBLEUINT8*);
MOBLE_RESULT (*GetLightCtl_cb)(MOBLEUINT8*);
MOBLE_RESULT (*GetLightCtlTemp_cb)(MOBLEUINT8*);
@@ -461,6 +479,7 @@ MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32
MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32 *pLength);
MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param, MOBLEUINT32 length);
MOBLE_RESULT Light_Lightness_Linear_Status(MOBLEUINT8* pLightnessLinear_status, MOBLEUINT32 *pLength);
+MOBLE_RESULT Light_Lightness_Last_Set(const MOBLEUINT8* plightnessLast_param, MOBLEUINT32 length);
MOBLE_RESULT Light_Lightness_Last_Status(MOBLEUINT8* pLightnessLast_status, MOBLEUINT32 *pLength);
MOBLE_RESULT Light_Lightness_Default_Set(const MOBLEUINT8* plightnessDefault_param, MOBLEUINT32 length);
MOBLE_RESULT Light_Lightness_Default_Status(MOBLEUINT8* pLightnessDefault_status, MOBLEUINT32 *pLength);
@@ -508,27 +527,32 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
void Lighting_Process(void);
MOBLE_RESULT BLEMesh_AddLightingModels(void);
-void Light_BindingCtlToLightness_Actual(MOBLEUINT8 bindingFlag);
+void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag);
void Light_BindingTemperatureToTemperatureRange(void);
-void LightActual_GenericOnOffBinding(Light_LightnessParam_t* lightActual);
-void LightActual_GenericLevelBinding(Light_LightnessParam_t* lightActual);
-void Light_CtlTemp_GenericLevelBinding(Light_CtlParam_t* bCtlTempParam);
-void Light_Linear_ActualImplicitBinding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length);
+void LightActual_GenericOnOffBinding(Light_LightnessStatus_t* lightActual);
+void LightActual_GenericLevelBinding(Light_LightnessStatus_t* lightActual);
+void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam);
+void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length);
MOBLEUINT16 Light_Actual_LinearBinding(void);
+void Light_Lightness_Linear_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length);
MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length);
void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual);
+void Light_CtlTemperature_Binding(void);
void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature);
-void Light_HslHue_GenericLevelBinding(Light_HslParam_t* bHslHueParam);
+void Light_HslHue_GenericLevelBinding(Light_HslStatus_t* bHslHueParam);
void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam);
-void Light_HslSaturation_GenericLevelBinding(Light_HslParam_t* bHslSatParam);
+void Light_HslSaturation_GenericLevelBinding(Light_HslStatus_t* bHslSatParam);
void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam);
-void Light_HslLightness_LightnessActualBinding(Light_HslParam_t* bHslLightParam);
-void Light_ActualLightness_HslLightnessBinding(Light_LightnessParam_t* bActualLightParam);
+void Light_HslLightness_LightnessActualBinding(void);
+void Light_Hsl_Hue_Binding(void);
+void Light_Hsl_Saturation_Binding(void);
+void Light_ActualLightness_HslLightnessBinding(Light_LightnessStatus_t* bActualLightParam);
+void Light_Linear_Ligth_LC_binding(MOBLEUINT16 lc_OutValue);
MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue);
MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUINT8 param_Count);
-
+void Model_BindingPublishStatus(void);
void Light_GetStepValue(MOBLEUINT8 stepParam);
MOBLE_RESULT LightLightnessStateUpdate_Process(void);
@@ -538,7 +562,6 @@ MOBLE_RESULT LightCtlTemperatureStateUpdate_Process(void);
MOBLE_RESULT LightHslStateUpdate_Process(void);
MOBLE_RESULT LightHslHueStateUpdate_Process(void);
MOBLE_RESULT LightHslSaturationStateUpdate_Process(void);
-void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam);
void Light_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size);
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_lc.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_lc.h
index 38f176cb6..b4d4ee1c6 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_lc.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_lc.h
@@ -72,9 +72,6 @@
#define LIGHT_MODEL_SERVER_LC_MODEL_ID 0x130F
#define LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID 0x1310
-#define LIGHT_LC_TRANSITION_STOP 0X00
-#define LIGHT_LC_ON_OFF_TRANSITION_START 0X01
-
/* Property id for the light LC model */
#define LIGHT_CONTROL_LUX_LEVEL_ON_ID 0X002B
#define LIGHT_CONTROL_LUX_LEVEL_PROLONG_ID 0X002C
@@ -101,35 +98,67 @@
#define LIGHT_CONTROL_LIGHTNESS_ON_VALUE 0xFFFF
#define LIGHT_CONTROL_LIGHTNESS_PROLONG_VALUE 0x3A98
#define LIGHT_CONTROL_LIGHTNESS_STANDBY_VALUE 0x01
-#define LIGHT_CONTROL_TIME_FADE_ON_VALUE 0xa /* 20 steps */
-#define LIGHT_CONTROL_TIME_RUN_ON_VALUE 0x1388 /* 5 second */
-#define LIGHT_CONTROL_TIME_FADE_VALUE 0Xa
-#define LIGHT_CONTROL_TIME_PROLONG_VALUE 0X0bb8 /* 3 second */
-#define LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_VALUE 0xa
-#define LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_VALUE 0Xa
+#define LIGHT_CONTROL_TIME_FADE_ON_VALUE 0x00//0xa /* 20 steps */
+#define LIGHT_CONTROL_TIME_RUN_ON_VALUE 0x00//0x1388 /* 5 second */
+#define LIGHT_CONTROL_TIME_FADE_VALUE 0x00//0Xa
+#define LIGHT_CONTROL_TIME_PROLONG_VALUE 0x00//0X0bb8 /* 3 second */
+#define LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_VALUE 0x00//0xa
+#define LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_VALUE 0x00//0Xa
#define LIGHT_CONTROL_KID 0X01
#define LIGHT_CONTROL_KIU 0X02
#define LIGHT_CONTROL_KPD 0X03
#define LIGHT_CONTROL_KPU 0X04
-#define LIGHT_CONTROL_REGULATOR_ACCURACY_VALUE 0X100
+#define LIGHT_CONTROL_REGULATOR_ACCURACY_VALUE 0X10
/* Property IDs by SIG ------------------------------------------------------- */
#define MOTION_SENSED_PROPERTY 0X0042
#define PEOPLE_COUNT_PROPERTY 0X004C
#define PRESENCE_DETECTED_PROPERTY 0X004D
-#define TRANSITION_STEP_VALUE 0X0A
+#define TRANSITION_RES_VALUE 100
#define LC_MODE_ENABLE 0X01
#define LC_MODE_DISABLE 0X00
+
+#define LIGHT_LC_TRANSITION_START 1
+#define LIGHT_LC_TRANSITION_STOP 0
+/* Property Vlaue in Byte */
+#define ONE_BYTE_VALUE 1
+#define TWO_BYTE_VALUE 2
+#define THREE_BYTE_VALUE 3
+#define FOUR_BYTE_VALUE 4
+
+#define VALUE_SET 1
+#define VALUE_RESET 0
+
+/* Transition Flag variables */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 Light_LC_Transition_Flag;
+ MOBLEUINT8 Light_LC_OptionalParam;
+ MOBLEUINT8 Transition_Cmplt;
+ MOBLEUINT8 LightLCUpdateFlag;
+}Light_LC_ModelFlag_t;
+
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 PresentParam_1;
+ MOBLEUINT16 TargetParam_1;
+ MOBLEUINT8 RemainingTime;
+}Light_LC_TemporaryStatus_t;
+
/* Light control mode messages*/
#pragma pack(1)
typedef struct
{
MOBLEUINT8 LC_mode;
MOBLEUINT8 LC_OM;
- MOBLEUINT8 Light_OnOff;
+ MOBLEUINT8 Present_Light_OnOff;
+ MOBLEUINT8 Target_Light_OnOff;
MOBLEUINT8 Tid;
MOBLEUINT8 Transition_Time;
+ MOBLEUINT8 Remaining_Time;
MOBLEUINT8 Delay;
}Light_LC_Param_t;
@@ -156,7 +185,7 @@ Light_LC_PropertyTablefloat_t;
typedef struct
{
MOBLEUINT16 Property_ID;
- MOBLEUINT16 Property_Value_8b;
+ MOBLEUINT8 Property_Value_8b;
}
Light_LC_PropertyTable8b_t;
@@ -293,21 +322,17 @@ MOBLE_RESULT Light_LC_PropertyStatus( MOBLEUINT8* lcData_param, MOBLEUINT32* ple
MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
MOBLEUINT16 prop_ID);
-MOBLEUINT32 Light_LC_GetPropertyID_value(MOBLEUINT16 property_ID);
+MOBLEUINT32 Light_LC_GetPropertyID_value(MOBLEUINT16 property_ID,MOBLEUINT16 *value_length);
MOBLEUINT32 Light_LC_GetStepValue(MOBLEUINT8 stepParam);
MOBLEUINT32 Get_TimeToWait(MOBLEUINT16 Proprety_ID);
MOBLEUINT16 Light_LC_LuxLevelOutputValue(MOBLEUINT16 property_ID);
MOBLEUINT16 Light_LC_MaxLightnessValue(MOBLEUINT16 Param1,MOBLEUINT16 Param2);
void Light_LC_Fsm(void);
-
+MOBLE_RESULT Light_LC_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue);
+MOBLE_RESULT Light_LC_LightnessStateUpdate_Process(Light_LC_TemporaryStatus_t *lc_Temp_Value);
void Light_control_Process(void);
-
-MOBLE_RESULT Light_LC_Client_Mode_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength);
-MOBLE_RESULT Light_LC_Client_OM_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength);
-MOBLE_RESULT Light_LC_Client_ON_OFF_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength);
-MOBLE_RESULT Light_LC_Client_Property_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength);
-
-
+void Light_LC_GenericOnOffBinding(Light_LC_Param_t* light_LC);
+void Light_LC_OnOff_Generic_OnOffBinding(void);
#endif /* __LIGHT_LC_H */
/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h
index 651d0df0c..81322f4e1 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h
@@ -133,10 +133,6 @@
#define BOUNCE_THRESHOLD 20U
#define LONG_PRESS_THRESHOLD 1000U
-#define ADDRESS_IS_UNICAST(a) (((MOBLEINT16)(a)>0)&&((MOBLEUINT16)(a)<0x8000))
-#define ADDRESS_IS_GROUP(a) (((MOBLEINT16)(a) & 0xC000) == 0xC000)
-#define ADDRESS_IS_ALL_NODES(a) ((MOBLEUINT16)(a) == 0xFFFF)
-
#define FIRST_ELEMENT 1
#define SECOND_ELEMENT 2
#define THIRD_ELEMENT 3
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/blob.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/blob.c
index 3d487aef2..3d1c41568 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/blob.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/blob.c
@@ -44,7 +44,7 @@
#include "common.h"
#include <string.h>
#include "compiler.h"
-#include "Math.h"
+#include "math.h"
#include "blob.h"
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c
index 7328a65eb..26f2ff5f9 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c
@@ -50,12 +50,11 @@
#include "appli_nvm.h"
#include "compiler.h"
-
-/** @addtogroup MODEL_GENERIC
+/** @addtogroup COMMON
* @{
*/
-/** @addtogroup Generic_Model_Callbacks
+/** @addtogroup Model_Common_Api
* @{
*/
@@ -76,6 +75,8 @@ MOBLE_ADDRESS Peer_Addrs;
MOBLE_ADDRESS Dst_Addrs;
MOBLEUINT8 Tid_Value = 0;
MOBLEUINT8 TidSend = 0;
+MOBLE_ADDRESS Dst_Peer;
+
/**
* @brief Chk_ParamValidity: This function is to check validity of Parameters
* @param param: Parameter
@@ -143,7 +144,7 @@ MOBLE_RESULT Chk_MultiParamValidity(MOBLEUINT16 min_param_range1, MOBLEUINT16 m
/**
-* @brief Chk_MultiParamValidity: This function is to check validity of range of Parameters
+* @brief Chk_MultiParamValidityAllUnsigned: This function is to check validity of range of Parameters
* of multi parameters.
* @param param: Parameter
* @param min_param_range1: Min Value of parameter 1
@@ -256,6 +257,51 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
return MOBLE_RESULT_SUCCESS;
}
+/**
+* @brief Chk_HslRangeValidity: This function is to check validity of range of Parameters
+* @param param: Parameter
+* @param max_param_value: Max Parameter Value
+* @param min_param_value: Min Parameter Value
+* @retval MOBLE_RESULT
+*/
+ MOBLE_RESULT Chk_HslRangeValidity(const MOBLEUINT8* param,MOBLEUINT16 min_param_value_1,
+ MOBLEUINT16 max_param_value_1,MOBLEUINT16 min_param_value_2,
+ MOBLEUINT16 max_param_value_2)
+{
+ MOBLEUINT16 minRange_1;
+ MOBLEUINT16 maxRange_1;
+ MOBLEUINT16 minRange_2;
+ MOBLEUINT16 maxRange_2;
+
+ minRange_1 = param[1] << 8;
+ minRange_1 |= param[0];
+ maxRange_1 = param[3] << 8;
+ maxRange_1 |= param[2];
+ minRange_2 = param[5] << 8;
+ minRange_2 |= param[4];
+ maxRange_2 = param[7] << 8;
+ maxRange_2 |= param[6];
+
+ if(minRange_1 < min_param_value_1)
+ {
+ return MOBLE_RESULT_INVALIDARG;
+ }
+ if((maxRange_1 > max_param_value_1) || (maxRange_1 < minRange_1))
+ {
+ return MOBLE_RESULT_INVALIDARG;
+ }
+ if(minRange_2 < min_param_value_2)
+ {
+ return MOBLE_RESULT_INVALIDARG;
+ }
+ if((maxRange_2 > max_param_value_2) || (maxRange_2 < minRange_2))
+ {
+ return MOBLE_RESULT_INVALIDARG;
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
/**
* @brief Chk_OptionalParamValidity: This function is to check validity of optional Parameters
@@ -278,12 +324,36 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
}
}
+/**
+* @brief Chk_ParamMinMaxIntValidity: This function is to check validity of optional Parameters
+* @param param: Parameter
+* @param max_param_value: signed Max Parameter Value
+* @param min_param_value: signed Min Parameter Value
+* @retval MOBLE_RESULT
+*/
+ MOBLE_RESULT Chk_ParamMinMaxIntValidity(MOBLEINT16 min_param_value, const MOBLEUINT8* param,
+ MOBLEINT16 max_param_value )
+{
+ MOBLEINT16 param_State1;
+
+ param_State1 = param[1] << 8;
+ param_State1 |= param[0];
+
+ if((param_State1 < min_param_value) || (param_State1 > max_param_value))
+ {
+ return MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ return MOBLE_RESULT_SUCCESS;
+ }
+}
/**
* @brief Chk_ParamMinMaxValidity: This function is to check validity of optional Parameters
* @param param: Parameter
-* @param max_param_value: Max Parameter Value
-* @param min_param_value: Min Parameter Value
+* @param max_param_value: unsigned Max Parameter Value
+* @param min_param_value: unsigned Min Parameter Value
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Chk_ParamMinMaxValidity(MOBLEUINT16 min_param_value, const MOBLEUINT8* param,
@@ -502,6 +572,25 @@ void TraceHeader(const char* func_name, int mode)
printf("%ld %s - <<<ERROR>>>", Clock_Time(), func_name);
}
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size)
+{
+ int row_index;
+ int column_index;
+ int rows_to_dump;
+
+ rows_to_dump = (size+15)/16;
+ unsigned char *p = (unsigned char *)memory_addr;
+
+ for (row_index = 0; row_index < rows_to_dump; row_index++)
+ {
+ for (column_index =0; column_index < 16; column_index++)
+ {
+ printf("0x%02x ", p[column_index]);
+ }
+ printf("\n\r"); /* Put a line change */
+ }
+}
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
/**
* @brief Prepare and save buffer of Generic and Light models state in NVM
@@ -531,15 +620,19 @@ MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8 flag)
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
(Appli_Light_GetStatus_cb.GetLightLightness_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_NVM_OFFSET]);
+ (Appli_Light_GetStatus_cb.GetLightLightnessDefault_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET]);
+ (Appli_Light_GetStatus_cb.GetLightLightnessLast_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET]);
+
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
- (Appli_Light_GetStatus_cb.GetLightCtl_cb)(Model_GetBuff+GENERIC_DATA_LIMIT+LIGHT_CTL_NVM_OFFSET);
+ (Appli_Light_GetStatus_cb.GetLightCtl_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_CTL_NVM_OFFSET]);
+ (Appli_Light_GetStatus_cb.GetLightCtlDefault_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_CTL_DEFAULT_NVM_OFFSET]);
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
- (Appli_Light_GetStatus_cb.GetLightHsl_cb)(Model_GetBuff+GENERIC_DATA_LIMIT+LIGHT_HSL_NVM_OFFSET);
- (Appli_Light_GetStatus_cb.GetLightHslDefault_cb)(Model_GetBuff+GENERIC_DATA_LIMIT+LIGHT_HSL_DEFAULT_NVM_OFFSET);
+ (Appli_Light_GetStatus_cb.GetLightHsl_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_HSL_NVM_OFFSET]);
+ (Appli_Light_GetStatus_cb.GetLightHslDefault_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_HSL_DEFAULT_NVM_OFFSET]);
#endif
if (SaveModelState_cb != NULL)
@@ -567,7 +660,13 @@ MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8 flag)
*/
void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
{
-
+ MOBLEUINT8 pData[2];
+ MOBLE_ADDRESS publishAddress;
+ MOBLEUINT8 elementNumber;
+ MOBLEUINT16 model_ID = 0;
+ MOBLEUINT16 opcode = 0;
+ MOBLEUINT32 length = 0;
+ MOBLE_ADDRESS my_Address;
if (size > 0)
{
switch(pModelState_Load[0])
@@ -575,38 +674,9 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
case GENERIC_ON_OFF_NVM_FLAG:
{
-//#ifdef STM32
-/* checking the Power on off retrieved value according to the given
- in standered and taking decision for Generic on off.
- */
- ////////krt
- // MOBLEUINT8 pData[2];
-
-// if(pModelState_Load[4] == GENERIC_POWER_OFF_STATE)
-// {
-// pData[0] = APPLI_LED_OFF;
-// Generic_OnOff_Set(pData,1);
-// }
-// else if(pModelState_Load[4] == GENERIC_POWER_ON_STATE)
-// {
-// pData[0] = APPLI_LED_ON;
-// Generic_OnOff_Set(pData,1);
-// }
-// else if(pModelState_Load[4] == GENERIC_POWER_RESTORE_STATE)
-// {
- Generic_OnOff_Set(pModelState_Load+GENERIC_ON_OFF_NVM_OFFSET, 1);
- // }
-// else
-// {
-// TRACE_M(TF_GENERIC, "Power On Off value invalid %d \r\n", pModelState_Load[0]);
-// }
-// Generic_PowerOnOff_Set(pModelState_Load+GENERIC_POWER_ON_OFF_NVM_OFFSET, 1);
-// break;
-//#elif BLUENRG2_DEVICE
/* checking the Power on off retrieved value according to the given
in standered and taking decision for Generic on off.
*/
- MOBLEUINT8 pData[2];
if(pModelState_Load[4] == GENERIC_POWER_OFF_STATE)
{
@@ -626,9 +696,9 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
{
TRACE_M(TF_GENERIC, "Power On Off value invalid %d \r\n", pModelState_Load[0]);
}
-
+ opcode = GENERIC_ON_OFF_SET_UNACK;
+ model_ID = GENERIC_MODEL_SERVER_ONOFF_MODEL_ID;
break;
-//#endif
}
#endif
@@ -643,7 +713,14 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
case LIGHT_LIGHTNESS_NVM_FLAG:
{
- Light_Lightness_Set((pModelState_Load+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_NVM_OFFSET), 2);
+ MOBLEUINT16 light_LightnessValue;
+ light_LightnessValue = Light_lightnessPowerOnValue(pModelState_Load);
+ *pData = light_LightnessValue;
+ *(pData+1) = light_LightnessValue >> 8;
+ Light_Lightness_Set(pData, 2);
+
+ opcode = LIGHT_LIGHTNESS_SET_UNACK;
+ model_ID = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
break;
}
#endif
@@ -651,7 +728,10 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
case LIGHT_CTL_NVM_FLAG:
{
- Light_Ctl_Set((pModelState_Load+GENERIC_DATA_LIMIT+LIGHT_CTL_NVM_OFFSET), 4);
+
+ Light_CtlPowerOnValue(pModelState_Load);
+ opcode = LIGHT_CTL_TEMPERATURE_SET_UNACK;
+ model_ID = LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
break;
}
#endif
@@ -659,10 +739,10 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
case LIGHT_HSL_NVM_FLAG:
{
-
if((pModelState_Load[4] == GENERIC_POWER_OFF_STATE) || (pModelState_Load[4] == GENERIC_POWER_ON_STATE))
{
Light_Hsl_Set((pModelState_Load+GENERIC_DATA_LIMIT+LIGHT_HSL_DEFAULT_NVM_OFFSET), 6);
+ Light_HslDefault_Set((pModelState_Load+GENERIC_DATA_LIMIT+LIGHT_HSL_DEFAULT_NVM_OFFSET), 6);
}
else if(pModelState_Load[4] == GENERIC_POWER_RESTORE_STATE)
{
@@ -673,6 +753,8 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
TRACE_M(TF_GENERIC, "Power On Off value invalid %d \r\n", pModelState_Load[0]);
}
+ opcode = LIGHT_HSL_SET_UNACK;
+ model_ID = LIGHT_MODEL_SERVER_HSL_MODEL_ID;
break;
}
#endif
@@ -686,12 +768,145 @@ void Model_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size)
TRACE_M(TF_LIGHT, "No Saved Data Found \r\n");
break;
}
+ } pData[0] = pModelState_Load[4];
+ Generic_PowerOnOff_Set(pData,1);
+
+ my_Address = BLEMesh_GetAddress();
+ elementNumber = BLE_GetElementNumber();
+ publishAddress = BLEMesh_GetPublishAddress(elementNumber,model_ID);
+
+ if(publishAddress != 0x0000 )
+ {
+ Model_SendResponse(publishAddress,my_Address,opcode,pData,length);
+
+ TRACE_I(TF_MISC,"Publishing the Power on state to address %.2X \r\n",publishAddress);
}
- (GenericAppli_cb.GenericRestorePowerOnOff_cb)(pModelState_Load[4]);
+
+ }
+
+ }
+
+/**
+* @brief Function used to restore the light lighness with respect to Power on off
+* value .
+* @param pModelValue_Load:array of saved data
+* @retval MOBLEUINT16
+*/
+MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
+{
+ MOBLEUINT16 light_DefaultValue;
+ MOBLEUINT16 light_LastValue;
+ MOBLEUINT8 powerOn_Value;
+ MOBLEUINT16 light_Actual = 0;
+ MOBLEUINT16 last_Known_Value;
+
+ light_DefaultValue = pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET+1]<<8;
+ light_DefaultValue |= pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET];
+
+ light_LastValue = pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET+1]<<8;
+ light_LastValue |= pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET];
+
+ last_Known_Value = pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_NVM_OFFSET+1]<<8;
+ last_Known_Value |= pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_NVM_OFFSET];
+
+ powerOn_Value = *(pModelValue_Load+GENERIC_POWER_ON_OFF_NVM_OFFSET);
+
+ Light_Lightness_Last_Set((pModelValue_Load+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET),2);
+ Light_Lightness_Default_Set((pModelValue_Load+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET),2);
+
+ if(powerOn_Value == GENERIC_POWER_OFF_STATE)
+ {
+ light_Actual = 0x00;
+ }
+ else if((powerOn_Value == GENERIC_POWER_ON_STATE) && (light_DefaultValue != 0x00))
+ {
+ light_Actual = light_DefaultValue;
+ }
+ else if((powerOn_Value == GENERIC_POWER_ON_STATE) && (light_DefaultValue == 0x00))
+ {
+ light_Actual = light_LastValue;
+ }
+ else if(powerOn_Value == GENERIC_POWER_RESTORE_STATE)
+ {
+ light_Actual = last_Known_Value;
+ }
+ else
+ {
}
+ printf("LIGHT LIGHTNESS VALUE ON POWER UP %.2x \r\n",light_Actual);
+ return light_Actual;
}
+
+/**
+* @brief Function used to restore the light CTL with respect to Power on off
+* value .
+* @param pModelValue_Load:array of saved data
+* @retval MOBLEUINT16
+*/
+void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
+{
+ MOBLEUINT8 powerOn_Value;
+ MOBLEUINT8 pData[12];
+
+ memcpy((void*)pData, (void*)(pModelValue_Load+GENERIC_DATA_LIMIT+LIGHT_CTL_NVM_OFFSET), 12);
+ powerOn_Value = *(pModelValue_Load+GENERIC_POWER_ON_OFF_NVM_OFFSET);
+
+ if((powerOn_Value == GENERIC_POWER_OFF_STATE) || (powerOn_Value == GENERIC_POWER_ON_STATE))
+ {
+ /* pData has first 6 byte for ctl set including 2 byte for lightness, 2 bytes for
+ temperature , 2 bytes for delta uv.
+ next 6 byte for Ctl default set
+ */
+ Light_CtlDefault_Set((pData+LIGHT_DEFAULT_OFFSET), 6);
+ Light_CtlTemperature_Set((pData+8), 4);
+ }
+ else if(powerOn_Value == GENERIC_POWER_RESTORE_STATE)
+ {
+ Light_CtlTemperature_Set((pData+2), 4);
+ }
+ else
+ {
+
+ }
+}
+
+/**
+* @brief Function used to restore the light HSL with respect to Power on off
+* value .
+* @param pModelValue_Load:array of saved data
+* @retval MOBLEUINT16
+*/
+void Light_HslPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
+{
+ MOBLEUINT8 powerOn_Value;
+ MOBLEUINT8 pData[12];
+
+ memcpy((void*)pData, (void*)(pModelValue_Load+GENERIC_DATA_LIMIT+LIGHT_HSL_NVM_OFFSET), 12);
+ powerOn_Value = *(pModelValue_Load+GENERIC_POWER_ON_OFF_NVM_OFFSET);
+
+ if((powerOn_Value == GENERIC_POWER_OFF_STATE) || (powerOn_Value == GENERIC_POWER_ON_STATE))
+ {
+ /* pData has first 6 byte for ctl set including 2 byte for lightness, 2 bytes for
+ Hue , 2 bytes for Saturation.
+ next 6 byte for Ctl default set
+ */
+ Light_HslDefault_Set((pData+LIGHT_DEFAULT_OFFSET), 6);
+ Light_HslHue_Set((pData+8), 2);
+ Light_HslSaturation_Set((pData+10), 2);
+ }
+ else if(powerOn_Value == GENERIC_POWER_RESTORE_STATE)
+ {
+ Light_HslHue_Set((pData+2), 2);
+ Light_HslSaturation_Set((pData+4), 2);
+ }
+ else
+ {
+
+ }
+}
+
/**
* @brief Function used to select the element number
* @param void
@@ -827,53 +1042,10 @@ MOBLE_RESULT Chk_TidValidity(MOBLE_ADDRESS peer_Addrs,MOBLE_ADDRESS dst_Addrs,MO
return status;
}
-/**
-* @brief Function used to convert the time vale in standered Transition time.
-* @param MOBLEUINT16
-* @retval MOBLEUINT8
-*/
-MOBLEUINT8 Time_Conversion(MOBLEUINT32 lc_Time)
-{
- MOBLEUINT32 timeValue;
- MOBLEUINT8 timeResolution = 0;
- timeValue = lc_Time/TRANSITION_STEP_VALUE;
- MOBLEUINT8 totalTime;
-
- if((timeValue > (MOBLEUINT32)STEP_RESOLUTION_2) && (timeValue <= (MOBLEUINT32)STEP_RESOLUTION_3))
- {
- timeResolution = STEP_HEX_VALUE_3;
- }
- else if((timeValue >STEP_RESOLUTION_1) && (timeValue <= STEP_RESOLUTION_2 ))
- {
- timeResolution = STEP_HEX_VALUE_2;
- }
- else if((timeValue >STEP_RESOLUTION_0) && (timeValue <= STEP_RESOLUTION_1))
- {
- timeResolution = STEP_HEX_VALUE_1;
- }
- else if(timeValue <= STEP_RESOLUTION_0 )
- {
- timeResolution = STEP_HEX_VALUE_0;
- }
- else
- {
- /* No Comment */
- }
-
- totalTime = timeResolution << 6;
- totalTime |= TRANSITION_STEP_VALUE;
-
- return totalTime;
-}
-
-
WEAK_FUNCTION(MOBLE_RESULT ApplicationGetConfigServerDeviceKey(MOBLE_ADDRESS src,
const MOBLEUINT8**ppkeyTbUse))
{
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- return result;
+ return MOBLE_RESULT_SUCCESS;
}
-
/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c
index e70cb868f..b42fd4296 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c
@@ -40,6 +40,7 @@
*/
/* Includes ------------------------------------------------------------------*/
#include "hal_common.h"
+#include "mesh_cfg.h"
#include "config_client.h"
#include "common.h"
#include "models_if.h"
@@ -185,9 +186,9 @@ void PackNetkeyAppkeyInto3Bytes (MOBLEUINT16 netKeyIndex,
void NetkeyAppkeyUnpack (MOBLEUINT16 *pnetKeyIndex,
MOBLEUINT16 *pappKeyIndex,
MOBLEUINT8* keysArray3B);
-MOBLE_RESULT ConfigClient_AppKeyAdd (MOBLEUINT16 netKeyIndex,
- MOBLEUINT16 appKeyIndex,
- MOBLEUINT8* appkey);
+//MOBLE_RESULT ConfigClient_AppKeyAdd (MOBLEUINT16 netKeyIndex,
+// MOBLEUINT16 appKeyIndex,
+// MOBLEUINT8* appkey);
MOBLE_RESULT ConfigClient_AppKeyStatus(MOBLEUINT8 const *pSrcAppKeyStatus,
MOBLEUINT32 length);
MOBLE_RESULT ConfigClient_AppKeyUpdate (MOBLEUINT8* appkey);
@@ -215,7 +216,7 @@ MOBLE_RESULT ConfigClient_NodeResetStatus(MOBLEUINT8 const *pStatus,
* @param None: No parameter for this function
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT ConfigClient_CompositionDataGet(void)
+MOBLE_RESULT ConfigClient_CompositionDataGet(MOBLE_ADDRESS dst_peer)
{
/* 4.3.2.4 Config Composition Data Get
@@ -228,7 +229,6 @@ MOBLE_RESULT ConfigClient_CompositionDataGet(void)
MOBLEUINT16 msg_opcode;
MOBLEUINT8* pConfigData;
MOBLEUINT32 dataLength;
- MOBLE_ADDRESS dst_peer;
configClientGetCompositionMsg_t ccGetCompositionMsg;
@@ -236,16 +236,10 @@ MOBLE_RESULT ConfigClient_CompositionDataGet(void)
ccGetCompositionMsg.Opcode = OPCODE_CONFIG_COMPOSITION_DATA_GET;
ccGetCompositionMsg.page = COMPOSITION_PAGE0;
-
- if(result)
- {
- TRACE_M(TF_CONFIG_CLIENT,"Get Composition Data Error \r\n");
- }
-
msg_opcode = OPCODE_CONFIG_COMPOSITION_DATA_GET;
pConfigData = (MOBLEUINT8*) &(ccGetCompositionMsg.page);
dataLength = sizeof(ccGetCompositionMsg.page);
- dst_peer = NodeInfo.nodePrimaryAddress;
+
ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
@@ -598,7 +592,8 @@ void NetkeyAppkeyUnpack (MOBLEUINT16 *pnetKeyIndex,
* @param configClientAppKeyAdd_t: Structure of the AppKey add message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT ConfigClient_AppKeyAdd (MOBLEUINT16 netKeyIndex,
+MOBLE_RESULT ConfigClient_AppKeyAdd ( MOBLE_ADDRESS dst_peer,
+ MOBLEUINT16 netKeyIndex,
MOBLEUINT16 appKeyIndex,
MOBLEUINT8* appkey)
{
@@ -618,7 +613,6 @@ AppKey 16B : AppKey value
MOBLEUINT16 msg_opcode;
MOBLEUINT8* pConfigData;
MOBLEUINT32 dataLength;
- MOBLE_ADDRESS dst_peer;
configClientAppKeyAdd.netKeyIndex = netKeyIndex;
configClientAppKeyAdd.appKeyIndex = appKeyIndex;
@@ -627,7 +621,6 @@ AppKey 16B : AppKey value
msg_opcode = OPCODE_CONFIG_APPKEY_ADD;
pConfigData = (MOBLEUINT8*) &(configClientAppKeyAdd);
dataLength = sizeof(configClientAppKeyAdd_t);
- dst_peer = NodeInfo.nodePrimaryAddress;
TRACE_M(TF_CONFIG_CLIENT,"Config Client App Key Add \r\n");
ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
@@ -678,6 +671,7 @@ NetKeyIndexAndAppKeyIndex : 3B : Index of the NetKey and index of the AppKey
return result;
}
+
/**
* @brief ConfigClient_AppKeyUpdate: This function is called for both Acknowledged and
unacknowledged message
@@ -794,7 +788,6 @@ maximize the size of a payload.
MOBLEUINT16 msg_opcode;
MOBLEUINT8* pConfigData;
MOBLEUINT32 dataLength;
- MOBLE_ADDRESS dst_peer;
MOBLE_ADDRESS self_addr;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
configClientModelPublication_t configClientModelPublication;
@@ -834,7 +827,6 @@ maximize the size of a payload.
msg_opcode = OPCODE_CONFIG_CONFIG_MODEL_PUBLICATION_SET;
pConfigData = (MOBLEUINT8*) &(configClientModelPublication);
- dst_peer = NodeInfo.nodePrimaryAddress;
TRACE_M(TF_CONFIG_CLIENT,"Config Client Publication Add \r\n");
TRACE_M(TF_CONFIG_CLIENT,"elementAddr = [%04x]\r\n", elementAddress);
@@ -850,16 +842,17 @@ maximize the size of a payload.
TRACE_I(TF_CONFIG_CLIENT,"\r\n");
self_addr = BLEMesh_GetAddress();
- if (elementAddress == self_addr)
+
+ if ((elementAddress >= self_addr) && (elementAddress < (self_addr+APPLICATION_NUMBER_OF_ELEMENTS)) )
{
/* Provisioner needs to be configured */
- ConfigModel_SelfPublishConfig(self_addr,
+ ConfigModel_SelfPublishConfig(elementAddress,
msg_opcode,pConfigData,dataLength);
}
else
{
/* Node address to be configured */
- ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
+ ConfigClientModel_SendMessage(elementAddress,msg_opcode,pConfigData,dataLength);
}
return result;
@@ -981,7 +974,6 @@ Config Model Subscription Status message.
*/
MOBLEUINT32 dataLength = 0;
- MOBLE_ADDRESS dst_peer;
MOBLE_ADDRESS self_addr;
MOBLEUINT16 msg_opcode;
MOBLEUINT8* pConfigData;
@@ -1026,7 +1018,6 @@ Config Model Subscription Status message.
msg_opcode = OPCODE_CONFIG_MODEL_SUBSCRIPTION_ADD;
pConfigData = (MOBLEUINT8*) &(modelSubscription);
- dst_peer = NodeInfo.nodePrimaryAddress;
TRACE_I(TF_CONFIG_CLIENT,"Subscription Set buffer ");
@@ -1040,15 +1031,16 @@ Config Model Subscription Status message.
TRACE_M(TF_CONFIG_CLIENT,"modelIdentifier = [%08lx]\r\n", modelIdentifier);
self_addr = BLEMesh_GetAddress();
- if (elementAddress == self_addr)
+
+ if ((elementAddress >= self_addr) && (elementAddress < (self_addr+APPLICATION_NUMBER_OF_ELEMENTS)) )
{
/* Provisioner needs to be configured */
- ConfigModel_SelfSubscriptionConfig(self_addr,
+ ConfigModel_SelfSubscriptionConfig(elementAddress,
msg_opcode,pConfigData,dataLength);
}
else
{
- ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
+ ConfigClientModel_SendMessage(elementAddress,msg_opcode,pConfigData,dataLength);
}
return result;
@@ -1246,7 +1238,6 @@ The response to a Config Model App Bind message is a Config Model App Status mes
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT16 msg_opcode;
MOBLEUINT8* pConfigData;
- MOBLE_ADDRESS dst_peer;
configClientModelAppBind_t modelAppBind;
MOBLE_ADDRESS self_addr;
@@ -1264,8 +1255,6 @@ The response to a Config Model App Bind message is a Config Model App Status mes
msg_opcode = OPCODE_CONFIG_MODEL_APP_BIND;
pConfigData = (MOBLEUINT8*) &(modelAppBind);
- dst_peer = NodeInfo.nodePrimaryAddress;
-
TRACE_M(TF_CONFIG_CLIENT,"Config Client App Key Bind message \r\n");
TRACE_M(TF_CONFIG_CLIENT,"Model = 0x%8lx \r\n", modelIdentifier );
@@ -1275,7 +1264,7 @@ The response to a Config Model App Bind message is a Config Model App Status mes
}
self_addr = BLEMesh_GetAddress();
- if (elementAddress == self_addr)
+ if ((elementAddress >= self_addr) && (elementAddress < (self_addr+APPLICATION_NUMBER_OF_ELEMENTS)) )
{
/* Provisioner needs to be configured */
ConfigClient_SelfModelAppBindConfig(self_addr,
@@ -1284,7 +1273,7 @@ The response to a Config Model App Bind message is a Config Model App Status mes
else
{
/* Node address to be configured */
- ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
+ ConfigClientModel_SendMessage(elementAddress,msg_opcode,pConfigData,dataLength);
}
return result;
@@ -1404,10 +1393,7 @@ There are no Parameters for this message.
self_addr = BLEMesh_GetAddress();
if (elementAddress == self_addr)
{
- /* Provisioner needs to be configured */
-// TBD
-// ConfigClient_SelfModelAppBindConfig(self_addr,
-// msg_opcode,pConfigData,dataLength);
+
}
else
{
@@ -1443,8 +1429,8 @@ MOBLE_RESULT ConfigClient_NodeResetStatus(MOBLEUINT8 const *pStatus,
void CopyU8LittleEndienArray_fromU16word (MOBLEUINT8* pArray, MOBLEUINT16 inputWord)
{
- *(pArray+1) = (MOBLEUINT8)(inputWord & 0x00ff); /* Copy the LSB first */
- *pArray = (MOBLEUINT8)((inputWord & 0xff00) >> 0x08); /* Copy the MSB later */
+ *(pArray) = (MOBLEUINT8)(inputWord & 0x00ff); /* Copy the LSB first */
+ *(pArray+1) = (MOBLEUINT8)((inputWord & 0xff00) >> 0x08); /* Copy the MSB later */
}
MOBLEUINT16 CopyU8LittleEndienArrayToU16word (MOBLEUINT8* pArray)
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c
index 2075b7a25..ede7b2922 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c
@@ -43,9 +43,11 @@
#include "mesh_cfg.h"
#include "generic.h"
#include "light.h"
+#include "light_lc.h"
#include "common.h"
#include <string.h>
#include "compiler.h"
+#include <stdint.h>
/** @addtogroup MODEL_GENERIC
@@ -65,7 +67,7 @@ static Generic_TemporaryStatus_t Generic_TemporaryStatus;
static Generic_TimeParam_t Generic_TimeParam;
-static Generic_LevelStatus_t Generic_LevelStatus;
+static Generic_LevelStatus_t Generic_LevelStatus = {0x8000,0x00,0x00,0x00,0x00,0x00};
static Generic_OnOffStatus_t Generic_OnOffStatus;
@@ -75,14 +77,13 @@ static Generic_ModelFlag_t Generic_ModelFlag;
extern MOBLEUINT16 CommandStatus;
MOBLEUINT8 GenericUpdateFlag = 0;
-MOBLEUINT8 Generic_Trnsn_Cmplt = 0;
-MOBLEUINT16 Generic_Rx_Opcode;
+MOBLEUINT16 Model_Rx_Opcode;
MOBLEUINT8 OptionalValid = 0;
MOBLEUINT8 PowerOnOff_Flag = 0;
MOBLEUINT8 TidValue = 0;
MOBLEUINT16 Model_ID = 0;
-MOBLE_ADDRESS Dst_Peer;
extern MOBLEUINT8 TidSend;
+extern MOBLE_ADDRESS Dst_Peer;
const MODEL_OpcodeTableParam_t Generic_Opcodes_Table[] = {
/* Generic OnOff Server */
@@ -92,18 +93,18 @@ const MODEL_OpcodeTableParam_t Generic_Opcodes_Table[] = {
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
{GENERIC_MODEL_SERVER_ONOFF_MODEL_ID ,GENERIC_ON_OFF_GET, MOBLE_TRUE, 0, 0, GENERIC_ON_OFF_STATUS , 1, 3},
{GENERIC_MODEL_SERVER_ONOFF_MODEL_ID ,GENERIC_ON_OFF_SET_ACK, MOBLE_TRUE, 2, 4, GENERIC_ON_OFF_STATUS , 1, 3},
- {GENERIC_MODEL_SERVER_ONOFF_MODEL_ID ,GENERIC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, GENERIC_ON_OFF_STATUS , 1, 3}, // null replaced from GENERIC_ON_OFF_STATUS
+ {GENERIC_MODEL_SERVER_ONOFF_MODEL_ID ,GENERIC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, GENERIC_ON_OFF_STATUS , 1, 3},
{GENERIC_MODEL_SERVER_ONOFF_MODEL_ID ,GENERIC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0 , 1, 3},
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/* Generic Level Server */
{GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_GET, MOBLE_TRUE, 0, 0, GENERIC_LEVEL_STATUS , 2 , 5},
{GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_SET_ACK, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS , 2 , 5},
- {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS , 2 , 5}, //null is replaced with GENERIC_LEVEL_STATUS
- {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_DELTA_SET, MOBLE_TRUE, 5, 7, GENERIC_LEVEL_STATUS , 2 , 5},
- {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_DELTA_SET_UNACK, MOBLE_FALSE, 5, 7, 0, 0 , 0},
- {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_DELTA_MOVE_SET, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS , 2 , 5},
- {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_DELTA_MOVE_SET_UNACK, MOBLE_FALSE, 3, 5, 0, 0 , 0},
+ {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS , 2 , 5},
+ {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_DELTA_SET, MOBLE_TRUE, 5, 7, GENERIC_LEVEL_STATUS , 2 , 5},
+ {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_DELTA_SET_UNACK, MOBLE_FALSE, 5, 7, GENERIC_LEVEL_STATUS, 2 , 5},
+ {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_MOVE_SET, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS , 2 , 5},
+ {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_MOVE_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2 , 5},
{GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0 , 2 , 5},
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
@@ -116,7 +117,7 @@ const MODEL_OpcodeTableParam_t Generic_Opcodes_Table[] = {
/* Generic Default Transition Time Server Model */
{GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID ,GENERIC_DEFAULT_TRANSITION_TIME_GET, MOBLE_TRUE, 0, 0, GENERIC_DEFAULT_TRANSITION_TIME_STATUS , 1, 1},
{GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID ,GENERIC_DEFAULT_TRANSITION_TIME_SET, MOBLE_TRUE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS , 1, 1},
- {GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID ,GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, MOBLE_FALSE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS ,0 ,0}, // //null is replaced with GENERIC_DEFAULT_TRANSITION_TIME_STATUS
+ {GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID ,GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, MOBLE_FALSE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS ,1 ,1},
{GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID ,GENERIC_DEFAULT_TRANSITION_TIME_STATUS, MOBLE_FALSE, 1, 1, 0 ,1, 1},
#endif
@@ -151,12 +152,16 @@ WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength));
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength));
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid));
/* Private functions ---------------------------------------------------------*/
/**
* @brief Generic_OnOff_Set: This function is called for both Acknowledged and
- unacknowledged message
+* unacknowledged message
* @param pOnOff_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
@@ -177,8 +182,13 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
Generic_OnOffParam.TargetOnOffState = pOnOff_param[0];
Generic_OnOffParam.Generic_TID = pOnOff_param[1];
CommandStatus = pOnOff_param[0];
+ /*
+ Checking for optional parameters
+ length > 2 , 4 values received(OnOff status, TID, Trasmisition time(optional),
+ Delay(optional)),length < 2 OnOff status and TID
+ */
- if(length > 2)
+ if((length > 2) && (pOnOff_param[2] !=0))
{
/* Transition_Time & Delay_Time Present */
Generic_OnOffParam.Transition_Time = pOnOff_param[2];
@@ -189,18 +199,7 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
*/
Generic_OnOffStatus.Target_OnOff = Generic_OnOffParam.TargetOnOffState;
Generic_OnOffStatus.RemainingTime = Generic_OnOffParam.Transition_Time;
- /* copy status parameters in Temporary parameters for transition
- process
- */
- if(Generic_OnOffParam.TargetOnOffState == 1)
- {
- Generic_TemporaryStatus.TargetValue16 = PWM_TIME_PERIOD;
- Generic_OnOffStatus.Present_OnOff_Value = 1;
- }
- else
- {
- Generic_TemporaryStatus.TargetValue16 = 1;
- }
+
Generic_TemporaryStatus.RemainingTime = Generic_OnOffStatus.RemainingTime;
/* Function to calculate time parameters, step resolution
step size for transition state machine
@@ -210,6 +209,9 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
Generic_ModelFlag.GenericOptionalParam = 1;
/*Flag to enable the on Off transition state machine */
Generic_ModelFlag.GenericTransitionFlag = GENERIC_ON_OFF_TRANSITION_START;
+ /* flag is used for the application to get the information about the transiotn
+ time parameter is included or not in the received message.
+ */
OptionalValid = IN_TRANSITION;
}
else
@@ -218,15 +220,6 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
the transition time will be used from default value
*/
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- if(Generic_OnOffParam.TargetOnOffState == 1)
- {
- Generic_TemporaryStatus.TargetValue16 = PWM_TIME_PERIOD;
- Generic_OnOffStatus.Present_OnOff_Value = 1;
- }
- else
- {
- Generic_TemporaryStatus.TargetValue16 = 1;
- }
Generic_OnOffDefaultTransitionValue();
OptionalValid = DEFAULT_TRANSITION;
#else
@@ -234,14 +227,22 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
value in application.
*/
OptionalValid = NO_TRANSITION;
-#endif
+#endif
}
Generic_OnOffStatus.Present_OnOff_State = Generic_OnOffParam.TargetOnOffState;
/* Application Callback */
(GenericAppli_cb.OnOff_Set_cb)(&Generic_OnOffStatus, OptionalValid);
#ifdef ENABLE_MODEL_BINDING
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
/* Binding of data b/w Generic on off and Light lightness Actual model */
- GenericOnOff_LightActualBinding(&Generic_OnOffParam);
+ GenericOnOff_LightActualBinding(&Generic_OnOffStatus);
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ GenericOnOff_Light_LC_Binding(&Generic_OnOffStatus);
+#endif
+
#endif
return MOBLE_RESULT_SUCCESS;
@@ -262,17 +263,19 @@ MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* pOnOff_status, MOBLEUINT32 *plengt
Target OnOff The target value of the Generic OnOff state (optional).
Remaining Time is transition time.
*/
- MOBLEUINT8 Generic_GetBuff[1] ;
TRACE_M(TF_GENERIC,"Generic_OnOff_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8201! \n\r");
-
- /* Function call back to get the values from application*/
- (Appli_GenericState_cb.GetOnOffStatus_cb)(Generic_GetBuff);
- Generic_OnOffStatus.Present_OnOff_State = Generic_GetBuff[0];
-
+ /*
+ Default value of GenericOptionalParam=0,
+ GenericOptionalParam set equal to 1 in Generic_OnOff_Set for Generic_OnOff_Status
+ */
if((Generic_ModelFlag.GenericOptionalParam == 1) || (Generic_TimeParam.StepValue != 0))
{
+/*
+ When optional parameter received present value,targert value, remaing time be sent in status message
+ length of received data is equal to 4B
+ */
*pOnOff_status = Generic_OnOffStatus.Present_OnOff_State;
*(pOnOff_status+1) = Generic_OnOffStatus.Target_OnOff;
*(pOnOff_status+2) = Generic_OnOffStatus.RemainingTime;
@@ -282,6 +285,7 @@ MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* pOnOff_status, MOBLEUINT32 *plengt
else
{ /* When no optional parameter received, target value will
be sent in status message.
+ length of received data is equal to 2B
*/
*pOnOff_status = Generic_OnOffStatus.Present_OnOff_State;
*plength = 1;
@@ -317,8 +321,11 @@ MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
Generic_LevelParam.Generic_TID = plevel_param[2];
setValue = Generic_LevelParam.TargetLevel;
- /* Check for Optional Parameters. */
- if(length > 3)
+ /* Check for Optional Parameters.
+ length > 3 plevel_param has level,TID,Transition Time, Delay
+ length < 3 plevel_param has level,TID
+ */
+ if((length > 3) && (plevel_param[3] !=0))
{
Generic_LevelParam.Transition_Time = plevel_param[3];
Generic_LevelParam.Delay_Time = plevel_param[4];
@@ -358,38 +365,35 @@ MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
/* Application Callback */
(GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus, 0);
#ifdef ENABLE_MODEL_BINDING
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
/* Binding of Generic level with light lightnes actual */
- GenericLevel_LightActualBinding(&Generic_LevelParam);
- /* Binding of Generic Level data with ctl temperature data */
- GenericLevel_CtlTempBinding(&Generic_LevelParam);
- /* Generic Level binding with Hsl Hue Value */
- GenericLevel_HslHueBinding(&Generic_LevelParam);
- /* Generic Level Binding with Hsl Saturation */
- GenericLevel_HslSaturationBinding(&Generic_LevelParam);
+ GenericLevel_LightBinding(&Generic_LevelStatus,BINDING_GENERIC_LEVEL_SET);
#endif
+#endif /* ENABLE_MODEL_BINDING */
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Generic_LevelDelta_Set: This function is called for both Acknowledged
+* @brief Generic_Delta_Set: This function is called for both Acknowledged
* and unacknowledged message
* @param plevel_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_LevelDelta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
+MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
{
/*
- 3.2.2.4 Generic Level Delta Set
+ 3.2.2.4 Generic Delta Set
Delta Level: 4B The Delta change of the Generic Level state
TID: 1B Transaction Identifier
Transition Time: 1B Format as defined in Section 3.1.3. (Optional)
Delay: 1B Message execution delay in 5 milliseconds steps (C.1)
*/
- TRACE_M(TF_GENERIC,"Generic_LevelDelta_Set callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_Delta_Set callback received \r\n");
Generic_DeltaLevelParam_t Generic_DeltaLevelParam ;
MOBLEUINT32 delta;
@@ -401,10 +405,16 @@ MOBLE_RESULT Generic_LevelDelta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32
delta |= (plevel_param[0]);
Generic_DeltaLevelParam.TargetDeltaLevel32 = delta;
- Generic_DeltaLevelParam.Generic_TID = plevel_param[4];
+ TRACE_M(TF_GENERIC,"Generic delta value %.2lx \r\n"
+ ,Generic_DeltaLevelParam.TargetDeltaLevel32);
- /* Check for Optional Parameters */
- if(length > 5)
+ Generic_DeltaLevelParam.Generic_TID = plevel_param[4];
+ /*
+ Check for Optional Parameters
+ length > 5 Delata level,TID, Trasition Time(optional),Delay(optional)
+ length < 5 Delta level,TID
+ */
+ if((length > 5) && (plevel_param[5] !=0))
{
Generic_DeltaLevelParam.Transition_Time = plevel_param[5];
Generic_DeltaLevelParam.Delay_Time = plevel_param[6];
@@ -435,34 +445,55 @@ MOBLE_RESULT Generic_LevelDelta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32
{
if(Generic_LevelStatus.Last_Level_TID == Generic_DeltaLevelParam.Generic_TID)
{
- Generic_LevelStatus.Present_Level16 = Generic_LevelStatus.Last_Present_Level16
- + Generic_DeltaLevelParam.TargetDeltaLevel32;
+ if(Generic_DeltaLevelParam.TargetDeltaLevel32 > Generic_LevelStatus.Last_delta_level)
+ {
+ Generic_LevelStatus.Present_Level16 += (Generic_DeltaLevelParam.TargetDeltaLevel32
+ - Generic_LevelStatus.Last_delta_level);
+ }
+ else
+ {
+ Generic_LevelStatus.Present_Level16 -= (Generic_LevelStatus.Last_delta_level
+ -Generic_DeltaLevelParam.TargetDeltaLevel32) ;
+ }
}
else
{
+ if(Generic_DeltaLevelParam.TargetDeltaLevel32 > Generic_LevelStatus.Last_delta_level)
+ {
Generic_LevelStatus.Present_Level16 += Generic_DeltaLevelParam.TargetDeltaLevel32;
}
+ else
+ {
+ Generic_LevelStatus.Present_Level16 -= Generic_DeltaLevelParam.TargetDeltaLevel32;
+ }
}
+ }
+
+ TRACE_M(TF_GENERIC,"Generic Level value %.2x \r\n" ,Generic_LevelStatus.Present_Level16);
+
+ Generic_LevelStatus.Last_delta_level = Generic_DeltaLevelParam.TargetDeltaLevel32;
Generic_LevelStatus.Last_Level_TID = Generic_DeltaLevelParam.Generic_TID;
- /* EME: need to update the value for next operation */
- Generic_LevelStatus.Last_Present_Level16 = Generic_LevelStatus.Present_Level16;
-
/* Application Callback */
(GenericAppli_cb.LevelDelta_Set_cb)(&Generic_LevelStatus, 0);
-
+#ifdef ENABLE_MODEL_BINDING
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ /* Binding of Generic level with light lightnes actual */
+ GenericLevel_LightBinding(&Generic_LevelStatus,BINDING_GENERIC_LEVEL_SET);
+#endif
+#endif
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Generic_LevelMove_Set: This function is called for both
+* @brief Generic_Move_Set: This function is called for both
* Acknowledged and unacknowledged message
* @param plevel_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_LevelMove_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
+MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
{
/*
3.2.2.6 Generic Level Move Set
@@ -471,7 +502,7 @@ MOBLE_RESULT Generic_LevelMove_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 l
Transition Time: 1B Format as defined in Section 3.1.3. (Optional)
Delay: 1B Message execution delay in 5 milliseconds steps (C.1)
*/
- TRACE_M(TF_GENERIC,"Generic_LevelMove_Set callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_Move_Set callback received \r\n");
Generic_LevelMoveParam_t Generic_LevelMoveParam;
@@ -479,8 +510,12 @@ MOBLE_RESULT Generic_LevelMove_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 l
Generic_LevelMoveParam.TargetMoveLevel16 |= (plevel_param[0]);
Generic_LevelMoveParam.Generic_TID = plevel_param[2];
- /* Check for Optional Parameters */
- if(length > 3)
+ /* Check for Optional Parameters
+
+ length > 3 plevel_param has level,TID,Trasition Time,Delay
+ length < 3 plevel_param has level,TID
+*/
+ if((length > 3) && (plevel_param[3] !=0))
{
Generic_LevelMoveParam.Transition_Time = plevel_param[3];
Generic_LevelMoveParam.Delay_Time = plevel_param[4];
@@ -535,20 +570,13 @@ MOBLE_RESULT Generic_Level_Status(MOBLEUINT8* plevel_status, MOBLEUINT32 *plengt
Remaining Time: 1B Format as defined in Section 3.1.3 (C.1).
*/
- MOBLEUINT8 Generic_GetBuff[2] ;
TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8205! \n\r");
- /* Function call back to get the values from application*/
- (Appli_GenericState_cb.GetLevelStatus_cb)(Generic_GetBuff);
- Generic_LevelStatus.Present_Level16 = Generic_GetBuff[1] << 8;
- Generic_LevelStatus.Present_Level16 |= Generic_GetBuff[0];
-
/* checking the transition is in process.
checking for remaining time is not equal to zero.
*/
-
if((Generic_ModelFlag.GenericOptionalParam ==1) || (Generic_TimeParam.StepValue != 0))
{
*(plevel_status) = Generic_LevelStatus.Present_Level16;
@@ -634,7 +662,7 @@ MOBLE_RESULT Generic_DefaultTransitionTime_Set(const MOBLEUINT8 *defaultTransiti
defaultTime_param:1B parameter is received to set the Default transition time model.
*/
TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Set callback received \r\n");
-
+
Generic_DefaultTransitionParam.DefaultTransitionTime = defaultTransition_param[0];
/* Application Callback */
(GenericAppli_cb.GenericDefaultTransition_cb)(&Generic_DefaultTransitionParam, length);
@@ -773,15 +801,18 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-// tClockTime delay_t = Clock_Time();
MOBLE_ADDRESS publishAddress;
MOBLEUINT8 elementNumber;
MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
- Generic_Rx_Opcode = opcode;
+ MOBLE_ADDRESS my_Address;
+ Model_Rx_Opcode = opcode;
+
+ my_Address = BLEMesh_GetAddress();
Dst_Peer = dst_peer;
+ Model_Rx_Opcode = opcode;
+
TRACE_M(TF_GENERIC,"dst_peer = %.2X , peer_add = %.2X, opcode= %.2X ,response= %.2X \r\n ",
dst_peer, peer_addr, opcode , response);
- Generic_Rx_Opcode = opcode;
switch(opcode)
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
@@ -831,13 +862,13 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case GENERIC_LEVEL_SET_UNACK:
{
- result = Chk_ParamMinMaxValidity(LEVEL_MIN_VALID_RANGE ,pRxData , LEVEL_MAX_VALID_RANGE );
+ result = Chk_ParamMinMaxIntValidity(INT16_MIN ,pRxData , INT16_MAX );
if(result == MOBLE_RESULT_SUCCESS)
{
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
{
Generic_Level_Set(pRxData,dataLength);
- Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
modelStateChangeFlag = MOBLE_TRUE;
}
}
@@ -845,8 +876,8 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
break;
}
- case GENERIC_LEVEL_DELTA_SET:
- case GENERIC_LEVEL_DELTA_SET_UNACK:
+ case GENERIC_DELTA_SET:
+ case GENERIC_DELTA_SET_UNACK:
{
/*
Delta Level 4 The Delta change of the Generic Level state
@@ -854,23 +885,22 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
Transition Time 1 Format as defined in Section 3.1.3. (Optional)
Delay 1 Message execution delay in 5 milliseconds steps (C.1)
*/
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[4])))
- {
- Generic_LevelDelta_Set(pRxData,dataLength);
- }
+ Generic_Delta_Set(pRxData,dataLength);
+ Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
break;
}
- case GENERIC_LEVEL_DELTA_MOVE_SET:
- case GENERIC_LEVEL_DELTA_MOVE_SET_UNACK:
+ case GENERIC_MOVE_SET:
+ case GENERIC_MOVE_SET_UNACK:
{
- result = Chk_ParamMinMaxValidity(LEVEL_MIN_VALID_RANGE ,pRxData , LEVEL_MAX_VALID_RANGE );
+ result = Chk_ParamMinMaxIntValidity(INT16_MIN ,pRxData , INT16_MAX );
if(result == MOBLE_RESULT_SUCCESS)
{
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
{
- Generic_LevelMove_Set(pRxData, dataLength);
+ Generic_Move_Set(pRxData, dataLength);
}
}
break;
@@ -891,6 +921,8 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
Generic_PowerOnOff_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
break;
}
@@ -910,6 +942,8 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
Generic_DefaultTransitionTime_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
break;
}
@@ -926,9 +960,9 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
} /* Switch ends */
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
+ if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
{
- Model_SendResponse(peer_addr, dst_peer,opcode, pRxData,dataLength);
+ Model_SendResponse(peer_addr,my_Address,opcode,pRxData,dataLength);
}
/*
@@ -940,23 +974,25 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
elementNumber = BLE_GetElementNumber();
publishAddress = BLEMesh_GetPublishAddress(elementNumber,Model_ID);
- if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE))
+ if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE)
+ && (ADDRESS_IS_UNICAST(dst_peer)))
{
- Model_SendResponse(publishAddress,dst_peer,opcode,pRxData,dataLength);
+ Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
modelStateChangeFlag = MOBLE_FALSE;
+ TRACE_I(TF_GENERIC,"Publishing state when change to the address %.2X \r\n",publishAddress);
}
return MOBLE_RESULT_SUCCESS;
}
-/* @Brief Generic_TransitionBehaviourSingle_Param: Generic On Off Transition behaviour
+/* @Brief Generic_TransitionBehaviour: Generic On Off Transition behaviour
* used for the Generic On Off model when transition time is received in
* message.
* @param GetValue Pointer of the array
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
+MOBLE_RESULT Generic_TransitionBehaviour(MOBLEUINT8 *GetValue)
{
static MOBLEUINT8 Clockflag = 0;
@@ -974,6 +1010,7 @@ MOBLE_RESULT Generic_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
Generic_TemporaryStatus.PresentValue16 = GetValue[1] << 8;
Generic_TemporaryStatus.PresentValue16 |= GetValue[0];
+
/*if condition to wait untill the time is equal to the given resolution time */
if(((Clock_Time()- Check_time) >= Generic_TimeParam.Res_Value))
{
@@ -1020,7 +1057,7 @@ MOBLE_RESULT Generic_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
if(Generic_TimeParam.StepValue <= 0)
{
Generic_ModelFlag.GenericTransitionFlag = GENERIC_TRANSITION_STOP;
- Generic_Trnsn_Cmplt = MOBLE_TRUE;
+ Generic_ModelFlag.Generic_Trnsn_Cmplt = MOBLE_TRUE;
}
TRACE_M(TF_GENERIC,"Inside virtual application at %ld, Current state 0x%.2x, Target state 0x%.2x, Remaining Time 0x%.2x \n\r",
Clock_Time(), Generic_TemporaryStatus.PresentValue16,Generic_TemporaryStatus.TargetValue16,Generic_TemporaryStatus.RemainingTime);
@@ -1030,78 +1067,6 @@ return MOBLE_RESULT_SUCCESS;
}
-/* Generic_TransitionBehaviourMulti_Param: This funtion is used for the
-* for multi parameter in model when transition time is received in message.
-* @param GetValue Pointer of the array
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Generic_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue)
-{
-
- static MOBLEUINT8 Clockflag = 0;
- static MOBLEUINT32 Check_time;
- MOBLEUINT16 targetRange;
- MOBLEUINT16 targetSlot;
-
- /* Taking the time stamp for particular time */
- if(Clockflag == 0)
- {
- Check_time = Clock_Time();
- Clockflag = 1;
- }
- /* Values from application are copied into Temporary vaiables for processing */
- Generic_TemporaryStatus.PresentValue16 = GetValue[1] << 8;
- Generic_TemporaryStatus.PresentValue16 |= GetValue[0];
- /*if condition to wait untill the time is equal to the given resolution time */
- if(((Clock_Time()- Check_time) >= Generic_TimeParam.Res_Value) )
- {
- if(Generic_TimeParam.StepValue == 0)
- {
- Generic_TimeParam.StepValue = 1;
- }
- if(Generic_TemporaryStatus.TargetValue16 > Generic_TemporaryStatus.PresentValue16)
- {
- /* target range = total range to be covered */
- targetRange = Generic_TemporaryStatus.TargetValue16 - Generic_TemporaryStatus.PresentValue16;
- /*target slot = time to cover in single step */
- targetSlot = targetRange/Generic_TimeParam.StepValue;
- /* target slot added to present value to achieve target value */
- Generic_TemporaryStatus.PresentValue16 += targetSlot;
- }
- else
- {
- /* condition execute when transition is negative */
- /* target range = total range to be covered */
- targetRange = Generic_TemporaryStatus.PresentValue16 - Generic_TemporaryStatus.TargetValue16;
- /*target slot = time to cover in single step */
- targetSlot = targetRange/Generic_TimeParam.StepValue;
- /*target slot = time to cover in single step */
- Generic_TemporaryStatus.PresentValue16 -= targetSlot;
- }
- Generic_TimeParam.StepValue--;
- /* updating the remaining time after each step covered*/
- Generic_TemporaryStatus.RemainingTime = Generic_TimeParam.StepValue | (Generic_TimeParam.ResBitValue << 6) ;
-
- Check_time = 0;
- Clockflag = 0;
- GenericUpdateFlag = VALUE_UPDATE_SET;
- /* when transition is completed, disable the transition by disabling
- transition flag
- */
- if(Generic_TimeParam.StepValue <= 0)
- {
- Generic_ModelFlag.GenericTransitionFlag = GENERIC_TRANSITION_STOP;
- Generic_Trnsn_Cmplt = MOBLE_TRUE;
- }
- TRACE_M(TF_GENERIC,"Inside virtual level application at %ld, Current state 0x%.2x , target state 0x%.2x , Remaining Time 0x%.2x \n\r",
- Clock_Time(),Generic_TemporaryStatus.PresentValue16,Generic_TemporaryStatus.TargetValue16,
- Generic_TemporaryStatus.RemainingTime);
- }
-
-return MOBLE_RESULT_SUCCESS;
-}
-
-
/**
* @brief Generic_GetStepValue: This function calculates values for transition time
* @param stepParam: Transition time set value of particular model message.
@@ -1142,9 +1107,11 @@ void Generic_GetStepValue(MOBLEUINT8 stepParam)
void Generic_Process(void)
{
MOBLE_ADDRESS publishAddress;
+ MOBLE_ADDRESS my_Address;
MOBLEUINT8 elementNumber;
MOBLEUINT8 const pRxData[8] = {0};
MOBLEUINT32 dataLength = 0;
+
#if defined ENABLE_GENERIC_MODEL_SERVER_ONOFF || defined ENABLE_GENERIC_MODEL_SERVER_LEVEL
MOBLEUINT8 Generic_GetBuff[8];
#endif
@@ -1152,12 +1119,20 @@ void Generic_Process(void)
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
if(Generic_ModelFlag.GenericTransitionFlag == GENERIC_ON_OFF_TRANSITION_START)
{
+ /* Fetching the state value from the applcation layer to middle layer */
(Appli_GenericState_cb.GetOnOffValue_cb)(Generic_GetBuff);
- Generic_TransitionBehaviourSingle_Param(Generic_GetBuff);
+ Generic_TemporaryStatus.TargetValue16 = Generic_GetBuff[3] << 8;
+ Generic_TemporaryStatus.TargetValue16 |= Generic_GetBuff[2];
+ /* Transition function called to change the state in transition */
+ Generic_TransitionBehaviour(Generic_GetBuff);
if(GenericUpdateFlag == VALUE_UPDATE_SET)
{
+ /* updating the state value after the each transition step complete */
GenericOnOffStateUpdate_Process();
+ /* Application callback */
(GenericAppli_cb.OnOff_Set_cb)(&Generic_OnOffStatus, OptionalValid);
+ /*binding of the generic on off with light model */
+ GenericOnOff_LightActualBinding(&Generic_OnOffStatus);
GenericUpdateFlag = VALUE_UPDATE_RESET;
}
}
@@ -1166,27 +1141,34 @@ void Generic_Process(void)
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
if(Generic_ModelFlag.GenericTransitionFlag == GENERIC_LEVEL_TRANSITION_START)
{
+ /* Fetching the state value from the applcation layer to middle layer */
(Appli_GenericState_cb.GetLevelStatus_cb)(Generic_GetBuff);
- Generic_TransitionBehaviourMulti_Param(Generic_GetBuff);
+ /* Transition function called to change the state in transition */
+ Generic_TransitionBehaviour(Generic_GetBuff);
if(GenericUpdateFlag == VALUE_UPDATE_SET)
{
+ /* updating the state value after the each transition step complete */
GenericLevelStateUpdate_Process();
+ /* Application callback */
(GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus, 0);
+ /*binding of the generic Level with light model */
+ GenericLevel_LightBinding(&Generic_LevelStatus,BINDING_GENERIC_LEVEL_SET);
GenericUpdateFlag = VALUE_UPDATE_RESET;
}
}
#endif
- if(Generic_Trnsn_Cmplt == MOBLE_TRUE)
+ if(Generic_ModelFlag.Generic_Trnsn_Cmplt == MOBLE_TRUE)
{
+ my_Address = BLEMesh_GetAddress();
elementNumber = BLE_GetElementNumber();
publishAddress = BLEMesh_GetPublishAddress(elementNumber,Model_ID);
if(publishAddress != 0x00)
{
- Model_SendResponse(publishAddress,Dst_Peer,Generic_Rx_Opcode,pRxData,dataLength);
+ Model_SendResponse(publishAddress,my_Address,Model_Rx_Opcode,pRxData,dataLength);
}
- Generic_Trnsn_Cmplt = MOBLE_FALSE;
+ Generic_ModelFlag.Generic_Trnsn_Cmplt = MOBLE_FALSE;
}
}
@@ -1261,158 +1243,133 @@ MOBLE_RESULT GenericLevelStateUpdate_Process(void)
return MOBLE_RESULT_SUCCESS;
}
-
/**
-* @brief GenericOnOff_LightActualBinding: Data binding b/w Generic On Off and
-* light lightness Actual. this function will set the actual light lightness
-* value at the time of generic on off set.
-* @param onOff_param: Pointer to the data which needs to be checked.
+* @brief LightActual_GenericOnOffBinding: Reverse Data binding b/w Generic On Off and
+* light lightness Actual. this function will set the On Off status of
+* Light when the light lightness Actual is set.
+* @param lightActual: used to select the binding and reverse binding
* return void.
*/
-void GenericOnOff_LightActualBinding(Generic_OnOffParam_t* onOff_param)
+void LightActual_GenericOnOffBinding(Light_LightnessStatus_t* lightActual)
{
/*
- 6.1.2.2.3 - Binding of actual light lightness with Generic on off.
- As generic on off state changes, the actual lightness value will
- change.
+ 6.1.2.2.3 - Binding of actual light lightness with generic on off,
+ As actual lightness will set which changes the on off state in
+ generic model
*/
- MOBLEUINT8 Generic_GetBuff[4];
-
- Light_LightnessStatus_t bLight_ActualParam ;
- Light_LightnessDefaultParam_t bLight_DefaultParam;
- Light_LightnessLastParam_t bLight_LastParam;
-
- /* Get the last saved value of light lightness actual from application */
- (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Generic_GetBuff);
-
- bLight_LastParam.LightnessLastStatus = Generic_GetBuff[3] << 8;
- bLight_LastParam.LightnessLastStatus |= Generic_GetBuff[2];
-
- /* Get the default value of light lightness actual */
- (Appli_Light_GetStatus_cb.GetLightLightnessDefault_cb)(Generic_GetBuff);
-
- bLight_DefaultParam.LightnessDefaultStatus = Generic_GetBuff[1] << 8;
- bLight_DefaultParam.LightnessDefaultStatus |= Generic_GetBuff[0];
-
- /* condition is depends on the generic on off state */
- if(onOff_param->TargetOnOffState == 0x00)
- {
- bLight_ActualParam.PresentValue16 = 0x00;
- }
- else if((onOff_param->TargetOnOffState == 0x01) &&
- (bLight_DefaultParam.LightnessDefaultStatus == 0x00))
- {
- bLight_ActualParam.PresentValue16 = bLight_LastParam.LightnessLastStatus;
- }
- else if((onOff_param->TargetOnOffState == 0x01) &&
- (bLight_DefaultParam.LightnessDefaultStatus != 0x000))
+ if(lightActual->LightnessPresentValue16 == 0x00)
{
- bLight_ActualParam.PresentValue16 = bLight_DefaultParam.LightnessDefaultStatus;
+ Generic_OnOffStatus.Present_OnOff_State = 0x00;
}
else
{
- /* no condition to Execute */
+ Generic_OnOffStatus.Present_OnOff_State = 0x01;
}
- /* Application callback for setting the light lightness actual value in application
- level
- */
- (LightAppli_cb.Lightness_Set_cb)(&bLight_ActualParam, 0);
- /* implicit binding of lightness linear with generic on off set.
- generic on off set -> actual lightness -> linear lightness set.
- */
- Light_Linear_ActualImplicitBinding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , 0);
+
+ TRACE_M(TF_LIGHT, "LightActual_GenericOnOffBinding Function - Present OnOff value 0x%.2x \r\n"
+ , Generic_OnOffStatus.Present_OnOff_State);
+
}
-
-/*
-* @Brief GenericLevel_LightActualBinding: Data binding b/w Generic Level and
+/**
+* @brief LightActual_GenericLevelBinding: Data binding b/w Generic Level and
* light lightness Actual. this function will set the actual light lightness
* value at the time of generic Level set.
-* @param gLevel_param: Pointer to the data which needs to be checked.
+* @param lightActual: Pointer to the data which needs to be checked.
* return void.
*/
-void GenericLevel_LightActualBinding(Generic_LevelParam_t* gLevel_param)
-{
+void LightActual_GenericLevelBinding(Light_LightnessStatus_t* lightActual)
+{
/*
- 6.1.2.2.2 - Binding of actual light lightness with generic level
- As generic Level changes, the actual lightness value will
- change.
- */
- Light_LightnessStatus_t bLight_ActualParam ;
-
- bLight_ActualParam.PresentValue16 = gLevel_param->TargetLevel + 32768;
- (LightAppli_cb.Lightness_Set_cb)(&bLight_ActualParam, 0);
- /* application callback for the actual lightness to get the value.
- Actual lightness is directly bounded with generic on off and generic level
- which implicitly changed the value of linear lightness with generic on
- off state and generic level changes.
- */
- Light_Actual_LinearBinding();
+ 6.1.2.2.2 - Binding of actual light lightness with generic level
+ As Actual lightness changes, the generic level value will
+ change.
+ */
+ Generic_LevelStatus.Present_Level16 = lightActual->LightnessPresentValue16 - 32768;
+ TRACE_M(TF_LIGHT, "LightActual_GenericLevelBinding Function - Present Level value 0x%.2x \r\n"
+ , Generic_LevelStatus.Present_Level16);
+
}
/**
-* @brief GenericLevel_CtlTempBinding: Data binding b/w Generic level and Ctl
-* Temperature set.
-* @param bLevelParam: pointer to the structure, which should be set.
+* @brief Light_CtlTemp_GenericLevelBinding: Data binding b/w Generic Level and
+* light Ctl temperature . this function will set the generic Level
+* value at the time of Ctl temperature value set.
+* @param bCtlTempParam: Pointer to the data which needs to be checked.
* return void.
*/
-void GenericLevel_CtlTempBinding(Generic_LevelParam_t * bLevelParam)
+void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam)
{
- /* 6.1.3.1.1 Binding with the Generic Level state.
- Light CTL Temperature = T_MIN + (Generic Level + 32768) * (T_MAX - T_MIN) / 65535
- T_MIN = minimum range of ctl temperature
- T_MAX = maximum range of ctl temperature
- */
- Light_CtlStatus_t bCtlTempstatus;
- MOBLEUINT32 productValue;
-
- productValue = (bLevelParam->TargetLevel + 32768) * (MAX_CTL_TEMP_RANGE - MIN_CTL_TEMP_RANGE) ;
- bCtlTempstatus.PresentCtlTemperature16 = MIN_CTL_TEMP_RANGE + ((productValue) /65535);
- /* Application callback */
- (LightAppli_cb.Light_CtlTemperature_Set_cb)(&bCtlTempstatus, 0);
+ /* 6.1.3.1.1 Binding with the Generic Level state.
+ Generic Level = (Light CTL Temperature - T _MIN) * 65535 / (T_MAX - T_MIN) - 32768
+ T_MIN = minimum range of ctl temperature
+ T_MAX = maximum range of ctl temperature
+ */
+ MOBLEUINT32 productValue;
+
+ productValue = (bCtlTempParam->PresentCtlTemperature16 - MIN_CTL_TEMP_RANGE) * 65535;
+ Generic_LevelStatus.Present_Level16 = (productValue / (MAX_CTL_TEMP_RANGE - MIN_CTL_TEMP_RANGE)) - 32768;
+
+ GenericLevel_LightBinding(&Generic_LevelStatus , BINDING_LIGHT_CTL_TEMP_SET);
}
-
-/*
-* @brief GenericLevel_HslHueBinding: Data binding b/w Generic level and Hsl
-* Hue set.
-* @param bLevelParam: pointer to the structure, which should be set.
+/**
+* @brief Light_HslHue_GenericLevelBinding: Data binding b/w Generic Level and
+* light Hsl . this function will set the Generic Level
+* value at the time of Hsl Hue value set.
+* @param bHslHueParam: Pointer to the data which needs to be checked.
* return void.
*/
-void GenericLevel_HslHueBinding(Generic_LevelParam_t * bLevelParam)
+void Light_HslHue_GenericLevelBinding(Light_HslStatus_t* bHslHueParam)
{
/* 6.1.4.1.1 Binding with the Generic Level state
- Light HSL Hue = Generic Level + 32768
+ Generic Level = Light HSL Hue – 32768
*/
- Light_HslStatus_t bHslHuestatus;
+ Generic_LevelStatus.Present_Level16 = bHslHueParam->PresentHslHueLightness16- 32768;
- bHslHuestatus.PresentHslHueLightness16 = bLevelParam->TargetLevel + 32768;
- /* Application callback */
- (LightAppli_cb.Light_HslHue_Set_cb)(&bHslHuestatus, 0);
+ GenericLevel_LightBinding(&Generic_LevelStatus , BINDIG_LIGHT_HSL_HUE_SET);
}
-
/**
-* @brief GenericLevel_HslSaturationBinding: Data binding b/w Generic level and Hsl
-* Hue set.
-* @param bLevelParam: pointer to the structure, which should be set.
+* @brief Light_HslSaturation_GenericLevelBinding: Data binding b/w Generic Level and
+* light Hsl . this function will set the Generic Level
+* value at the time of Hsl Saturation value set.
+* @param bHslSatParam: Pointer to the data which needs to be checked.
* return void.
*/
-void GenericLevel_HslSaturationBinding(Generic_LevelParam_t * bLevelParam)
-{
- /* 6.1.4.1.1 Binding with the Generic Level state
- Light HSL Hue = Generic Level + 32768
- */
- Light_HslStatus_t bHslSatstatus;
+void Light_HslSaturation_GenericLevelBinding(Light_HslStatus_t* bHslSatParam)
+{
+ /* 6.1.4.4.1 Binding with the Generic Level state
+ Generic Level = Light HSL Saturation – 32768
+ */
+ Generic_LevelStatus.Present_Level16 = bHslSatParam->PresentHslSaturation16 - 32768;
+
+ GenericLevel_LightBinding(&Generic_LevelStatus , BINDIG_LIGHT_HSL_SATURATION_SET);
- bHslSatstatus.PresentHslSaturation16 = bLevelParam->TargetLevel + 32768;
- /* Application callback */
- (LightAppli_cb.Light_HslSaturation_Set_cb)(&bHslSatstatus, 0);
}
/**
+* @brief Light_LC_GenericOnOffBinding: Reverse Data binding b/w Generic On Off and
+* light LC on off. this function will set the Generic On Off status of
+* Light when the light LC on off is set.
+* @param lightActual: used to select the binding and reverse binding
+* return void.
+*/
+void Light_LC_GenericOnOffBinding(Light_LC_Param_t* light_LC)
+{
+ if(light_LC->Present_Light_OnOff == 0x00)
+ {
+ Generic_OnOffStatus.Present_OnOff_State = 0x00;
+ }
+ else
+ {
+ Generic_OnOffStatus.Present_OnOff_State = 0x01;
+ }
+}
+
+/**
* @brief function to assign the Pwm value to the target value of the generic on off
* saved states.
* @param void:
@@ -1442,7 +1399,7 @@ void Generic_LevelDefaultTransitionValue(MOBLEUINT16 levelValue)
/**
* @brief Generic_Client_OnOff_Status: Function called when status of the model
-received on the client.
+* received on the client.
* @param pOnOff_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
* return MOBLE_RESULT_SUCCESS.
@@ -1456,7 +1413,7 @@ MOBLE_RESULT Generic_Client_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEU
/**
* @brief Generic_Client_Level_Status: Function called when status of the model
-received on the client.
+* received on the client.
* @param plevel_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
* return MOBLE_RESULT_SUCCESS.
@@ -1471,7 +1428,7 @@ MOBLE_RESULT Generic_Client_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEU
/**
* @brief Generic_Client_PowerOnOff_Status: Function called when status of the model
-received on the client.
+* received on the client.
* @param powerOnOff_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
* return MOBLE_RESULT_SUCCESS.
@@ -1486,7 +1443,7 @@ MOBLE_RESULT Generic_Client_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_statu
/**
* @brief Generic_Client_DefaultTransitionTime_Status: Function called when status of the model
-received on the client.
+* received on the client.
* @param pTransition_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
* return MOBLE_RESULT_SUCCESS.
@@ -1512,11 +1469,11 @@ WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* pleve
MOBLEUINT8 OptionalValid))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
MOBLEUINT8 OptionalValid))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
MOBLEUINT8 OptionalValid))
{ return MOBLE_RESULT_SUCCESS;}
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c
index 7a6193bd9..87f2c3f42 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c
@@ -68,10 +68,10 @@ const MODEL_OpcodeTableParam_t Generic_Client_Opcodes_Table[] = {
MOBLEUINT16 max_payload_size;
Here in this array, Handler is not defined; */
#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
- {GENERIC_MODEL_SERVER_ONOFF_MODEL_ID ,GENERIC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0 , 1, 3},
+ {GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID ,GENERIC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0 , 1, 3},
#endif
#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
- {GENERIC_MODEL_SERVER_LEVEL_MODEL_ID ,GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0 , 2 , 5},
+ {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID ,GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0 , 2 , 5},
#endif
{0}
};
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c
index e90bddaf7..08d05c913 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c
@@ -44,7 +44,8 @@
#include "light.h"
#include "generic.h"
#include "common.h"
-#include "Math.h"
+#include "light_lc.h"
+#include "math.h"
#include "compiler.h"
#include <string.h>
/** @addtogroup MODEL_Light
@@ -66,32 +67,36 @@ static Light_TemporaryStatus_t Light_TemporaryStatus;
static Light_LightnessParam_t Light_LightnessParam;
static Light_LightnessStatus_t Light_LightnessStatus;
static Light_LightnessDefaultParam_t Light_LightnessDefaultParam;
-static Light_LightnessRangeParam_t Light_LightnessRangeParam ;
+static Light_LightnessRangeParam_t Light_LightnessRangeParam = {0x00,MIN_VALID_RANGE,MAX_VALID_RANGE};
static Light_CtlParam_t Light_CtlParam;
-static Light_CtlStatus_t Light_CtlStatus;
+static Light_CtlStatus_t Light_CtlStatus = {0x00,MIN_CTL_TEMP_RANGE,0x8000,0x00,0x00,0x00,0x00};
static Light_CtlDefaultParam_t Light_CtlDefaultParam;
-
-static Light_CtlTemperatureRangeParam_t CtlTemperatureRangeParam;
-
+static Light_CtlTemperatureRangeParam_t CtlTemperatureRangeParam = {0x00,MIN_CTL_TEMP_RANGE,MAX_CTL_TEMP_RANGE};
static Light_HslParam_t Light_HslParam;
static Light_HslStatus_t Light_HslStatus;
-static Light_HslRangeParam_t Light_HslRangeParam;
+static Light_HslRangeParam_t Light_HslRangeParam = {0x00,MIN_HUE_RANGE,MAX_HUE_RANGE,
+ MIN_SATURATION_RANGE,MAX_SATURATION_RANGE};
+
+Light_PublishOpcodeList_t Light_PublishOpcodeList;
extern Generic_DefaultTransitionParam_t Generic_DefaultTransitionParam;
-MOBLEUINT8 Light_Trnsn_Cmplt;
MOBLEUINT8 LightUpdateFlag = 0;
-
+extern MOBLEUINT16 Model_Rx_Opcode;
+extern MOBLEUINT16 Model_ID;
+extern MOBLE_ADDRESS Dst_Peer;
const MODEL_OpcodeTableParam_t Light_Opcodes_Table[] = {
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_SET_UNACK, MOBLE_FALSE, 3, 5, 0, 2, 5},
+ {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LINEAR_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LINEAR_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LINEAR_SET_UNACK, MOBLE_FALSE, 3, 5, 0, 2, 5},
+ {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LINEAR_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LINEAR_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LAST_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LAST_STATUS, 2, 2},
+ {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_LAST_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_DEFAULT_STATUS,2, 2},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_DEFAULT_STATUS, MOBLE_FALSE, 2, 2, 0,2, 2},
{LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID ,LIGHT_LIGHTNESS_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
@@ -108,7 +113,7 @@ const MODEL_OpcodeTableParam_t Light_Opcodes_Table[] = {
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
{LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_STATUS, 4, 9},
{LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_SET, MOBLE_TRUE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_SET_UNACK, MOBLE_FALSE, 7, 9, 0, 4, 9},
+ {LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
{LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
{LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_TEMPERATURE_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
{LIGHT_MODEL_SERVER_CTL_MODEL_ID ,LIGHT_CTL_TEMPERATURE_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
@@ -118,7 +123,7 @@ const MODEL_OpcodeTableParam_t Light_Opcodes_Table[] = {
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
{LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID ,LIGHT_CTL_DEFAULT_SET, MOBLE_TRUE, 6, 6, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID ,LIGHT_CTL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, 0, 6, 6},
+ {LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID ,LIGHT_CTL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
{LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID ,LIGHT_CTL_TEMPERATURE_RANGE_SET, MOBLE_TRUE, 4, 4, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
{LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID ,LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, MOBLE_FALSE, 4, 4, 0, 5, 5},
#endif
@@ -126,14 +131,14 @@ const MODEL_OpcodeTableParam_t Light_Opcodes_Table[] = {
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
{LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID ,LIGHT_CTL_TEMPERATURE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
{LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID ,LIGHT_CTL_TEMPERATURE_SET, MOBLE_TRUE, 5, 7, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
- {LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID ,LIGHT_CTL_TEMPERATURE_SET_UNACK, MOBLE_FALSE, 5, 7, 0, 4, 9},
+ {LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID ,LIGHT_CTL_TEMPERATURE_SET_UNACK, MOBLE_FALSE, 5, 7, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
{LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID ,LIGHT_CTL_TEMPERATURE_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
{LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_STATUS, 6, 7},
{LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_SET, MOBLE_TRUE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_SET_UNACK, MOBLE_FALSE, 7, 9, 0, 6, 7},
+ {LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
{LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
{LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_TARGET_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_TARGET_STATUS, 6, 7},
{LIGHT_MODEL_SERVER_HSL_MODEL_ID ,LIGHT_HSL_TARGET_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
@@ -147,20 +152,20 @@ const MODEL_OpcodeTableParam_t Light_Opcodes_Table[] = {
{LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID ,LIGHT_HSL_RANGE_SET, MOBLE_TRUE, 8, 8, LIGHT_HSL_RANGE_STATUS, 9, 9},
{LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID ,LIGHT_HSL_RANGE_SET_UNACK, MOBLE_FALSE, 8, 8, 0, 9, 9},
{LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID ,LIGHT_HSL_DEFAULT_SET, MOBLE_TRUE, 6, 6, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID ,LIGHT_HSL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, 0, 6, 6},
+ {LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID ,LIGHT_HSL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
{LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID ,LIGHT_HSL_HUE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_HUE_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID ,LIGHT_HSL_HUE_SET, MOBLE_TRUE, 3, 5, LIGHT_HSL_HUE_STATUS, 2, 5},
- {LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID ,LIGHT_HSL_HUE_SET_UNACK, MOBLE_FALSE, 3, 5, 0, 2, 5},
+ {LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID ,LIGHT_HSL_HUE_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_HSL_HUE_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID ,LIGHT_HSL_HUE_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
{LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID ,LIGHT_HSL_SATURATION_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_SATURATION_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID ,LIGHT_HSL_SATURATION_SET, MOBLE_TRUE, 3, 5, LIGHT_HSL_SATURATION_STATUS, 2, 5},
- {LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID ,LIGHT_HSL_SATURATION_SET_UNACK, MOBLE_FALSE, 3, 5, 0, 2, 5},
+ {LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID ,LIGHT_HSL_SATURATION_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_HSL_SATURATION_STATUS, 2, 5},
{LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID ,LIGHT_HSL_SATURATION_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
#endif
{0}
@@ -198,6 +203,7 @@ WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLigh
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState));
@@ -248,11 +254,12 @@ MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32
Light_LightnessParam.TargetLightnessStatus = (plightness_param[0] | plightness_param[1] << 8);
Light_LightnessParam.TID = plightness_param[2];
-
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/* Binding of actual lightness value with lightness range */
- //Light_Actual_RangeBinding(&Light_LightnessParam);
+ Light_Actual_RangeBinding(&Light_LightnessParam);
+#endif
/* Check for Optional Parameters */
- if (length > 3)
+ if ((length > 3) && (plightness_param[3] !=0))
{
/* Transition_Time & Delay_Time Present */
Light_LightnessParam.TransitionTime = plightness_param[3];
@@ -285,28 +292,20 @@ MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32
/* When no optional parameter received, target value will
be set as present value in application.
*/
- Light_LightnessStatus.PresentValue16 = Light_LightnessParam.TargetLightnessStatus;
+ Light_LightnessStatus.LightnessPresentValue16 = Light_LightnessParam.TargetLightnessStatus;
#endif
}
+ if(Light_LightnessStatus.LightnessPresentValue16 > 0x00)
+ {
+ Light_LightnessStatus.LightnessLastStatus = Light_LightnessStatus.LightnessPresentValue16;
+ }
/* Application Callback */
(LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus, 0);
#ifdef ENABLE_MODEL_BINDING
- /* Binding of actual light lightness with linear light lightness */
- Light_Linear_ActualImplicitBinding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , length);
-
- /* Binding of Light Ctl with Actual Light Lightness */
- Light_BindingCtlToLightness_Actual(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET);
-
- /* Binding of data b/w light lightness actual and Generic on off */
- LightActual_GenericOnOffBinding(&Light_LightnessParam);
-
- /* Binding of data b/w light lightness actual and Generic Level */
- LightActual_GenericLevelBinding(&Light_LightnessParam);
-
- /* Binding of data b/W Actual Lightness and Hsl Lightness.*/
- Light_ActualLightness_HslLightnessBinding(&Light_LightnessParam);
+ /* Binding of actual light lightness with other models */
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , length);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -327,27 +326,18 @@ MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32*
Remaining Time 1B Time to complete the transition to the target Light Lightness
*/
- MOBLEUINT8 Light_GetBuff[2];
TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#824B! \n\r");
- /* reading the value from the application by passing Appli_LightParam
- array parameter
- */
- (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff);
-
- Light_LightnessStatus.PresentValue16 = Light_GetBuff[1] << 8;
- Light_LightnessStatus.PresentValue16 |= Light_GetBuff[0];
-
/* This condition will be processed when message received will have
transition time and delay parameter.
or the transition will be in process
*/
if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
{
- *(pLightness_status) = Light_LightnessStatus.PresentValue16;
- *(pLightness_status+1) = Light_LightnessStatus.PresentValue16 >> 8;
+ *(pLightness_status) = Light_LightnessStatus.LightnessPresentValue16;
+ *(pLightness_status+1) = Light_LightnessStatus.LightnessPresentValue16 >> 8;
*(pLightness_status+2) = Light_LightnessStatus.TargetValue16;
*(pLightness_status+3) = Light_LightnessStatus.TargetValue16 >>8;
*(pLightness_status+4) = Light_LightnessStatus.RemainingTime;
@@ -359,15 +349,14 @@ MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32*
/* When no optional parameter received then, target value will
be sent in status message.
*/
- *(pLightness_status) = Light_LightnessStatus.PresentValue16 ;
- *(pLightness_status+1) = Light_LightnessStatus.PresentValue16 >> 8;
+ *(pLightness_status) = Light_LightnessStatus.LightnessPresentValue16 ;
+ *(pLightness_status+1) = Light_LightnessStatus.LightnessPresentValue16 >> 8;
*pLength = 2;
}
return MOBLE_RESULT_SUCCESS;
}
-
/**
* @brief Light_Lightness_Linear_Set: This function is called for both Acknowledged and
* unacknowledged message. The Acknowledgement is taken care by the Library
@@ -393,7 +382,7 @@ MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param
Light_LightnessParam.TID = plightnessLinear_param[2];
/* Check for Optional Parameters */
- if (length > 3)
+ if ((length > 3) && (plightnessLinear_param[3] !=0))
{
/* Transition_Time & Delay_Time Present */
Light_LightnessParam.TransitionTime = plightnessLinear_param[3];
@@ -414,13 +403,13 @@ MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param
Light_GetStepValue(plightnessLinear_param[3]);
/*transition process enable flag. */
- Light_ModelFlag.LightTransitionFlag = LIGHT_LIGHTNESS_TRANSITION_START;
+ Light_ModelFlag.LightTransitionFlag = LIGHT_LINEAR_TRANSITION_START;
/*option parameter flag, enable to sent all required parameter in status.*/
Light_ModelFlag.LightOptionalParam = 1;
}
else
{
- Light_LightnessStatus.PresentValue16 = Light_LightnessParam .TargetLightnessLinearStatus;
+ Light_LightnessStatus.LinearPresentValue16 = Light_LightnessParam .TargetLightnessLinearStatus;
}
/* Application Callback */
@@ -428,7 +417,7 @@ MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param
#ifdef ENABLE_MODEL_BINDING
/* Binding of data of light lightness with light linear */
- Light_Linear_ActualImplicitBinding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , length);
+ Light_Lightness_Linear_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET ,length);
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
@@ -452,26 +441,18 @@ MOBLE_RESULT Light_Lightness_Linear_Status(MOBLEUINT8* pLightnessLinear_status,
Target Lightness 2B The target value of the Light Lightness Linear state (Optional).
Remaining Time 1B Time to complete the transition to the target Light Lightness Li
*/
- MOBLEUINT8 Light_GetBuff[2];
TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#824F! \n\r");
- /* reading the value from the application by passing Appli_LightParam
- array parameter
- */
- (Appli_Light_GetStatus_cb.GetLightLightnessLinear_cb)(Light_GetBuff);
- Light_LightnessStatus.PresentValue16 = Light_GetBuff[1] << 8;
- Light_LightnessStatus.PresentValue16 |= Light_GetBuff[0];
-
/* This condition will be processed when message received will have
transition time and delay parameter.
or the transition will be in process
*/
if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
{
- *(pLightnessLinear_status) = Light_LightnessStatus.PresentValue16;
- *(pLightnessLinear_status+1) = Light_LightnessStatus.PresentValue16 >> 8;
+ *(pLightnessLinear_status) = Light_LightnessStatus.LinearPresentValue16;
+ *(pLightnessLinear_status+1) = Light_LightnessStatus.LinearPresentValue16 >> 8;
*(pLightnessLinear_status+2) = Light_LightnessStatus.TargetValue16;
*(pLightnessLinear_status+3) = Light_LightnessStatus.TargetValue16 >>8;
*(pLightnessLinear_status+4) = Light_LightnessStatus.RemainingTime;
@@ -484,8 +465,8 @@ MOBLE_RESULT Light_Lightness_Linear_Status(MOBLEUINT8* pLightnessLinear_status,
/* When no optional parameter received then, target value will
be sent in status message.
*/
- *(pLightnessLinear_status) = Light_LightnessStatus.PresentValue16;
- *(pLightnessLinear_status+1) = Light_LightnessStatus.PresentValue16 >> 8;
+ *(pLightnessLinear_status) = Light_LightnessStatus.LinearPresentValue16;
+ *(pLightnessLinear_status+1) = Light_LightnessStatus.LinearPresentValue16 >> 8;
*pLength = 2;
}
@@ -493,6 +474,20 @@ MOBLE_RESULT Light_Lightness_Linear_Status(MOBLEUINT8* pLightnessLinear_status,
return MOBLE_RESULT_SUCCESS;
}
+/**
+* @brief Light_Lightness_Last_Set: This function is called for both Acknowledged and
+* unacknowledged message. The Acknowledgement is taken care by the Library
+* @param plightnessLast_param : Pointer to the parameters received for message
+* @param length : Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Light_Lightness_Last_Set(const MOBLEUINT8* plightnessLast_param, MOBLEUINT32 length)
+{
+ Light_LightnessStatus.LightnessLastStatus = plightnessLast_param[1] << 8;
+ Light_LightnessStatus.LightnessLastStatus |= plightnessLast_param[0];
+
+ return MOBLE_RESULT_SUCCESS;
+}
/**
* @brief Light Lightness Last Status
@@ -506,16 +501,12 @@ MOBLE_RESULT Light_Lightness_Last_Status(MOBLEUINT8* pLightnessLast_status, MOBL
Following is the status message:
Lightness 2B The value of the Light Lightness Last.
*/
- MOBLEUINT8 Light_GetBuff[4];
TRACE_M(TF_LIGHT,"Light_Lightness_Last_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8253! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff);
-
- *pLightnessLast_status = Light_GetBuff[2] ;
- *(pLightnessLast_status+1) = Light_GetBuff [3];
+ *pLightnessLast_status = Light_LightnessStatus.LightnessLastStatus ;
+ *(pLightnessLast_status+1) = Light_LightnessStatus.LightnessLastStatus >> 8;
*pLength = 2;
return MOBLE_RESULT_SUCCESS;
@@ -560,15 +551,13 @@ MOBLE_RESULT Light_Lightness_Default_Status(MOBLEUINT8* pLightnessDefault_status
Following is the status message:
Lightness 2B The value of the Light Lightness Default state.
*/
- MOBLEUINT8 Light_GetBuff[2];
TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8255! \n\r");
/* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightLightnessDefault_cb)(Light_GetBuff);
- *pLightnessDefault_status = Light_GetBuff[0] ;
- *(pLightnessDefault_status+1) = Light_GetBuff[1];
+ *pLightnessDefault_status = Light_LightnessDefaultParam.LightnessDefaultStatus ;
+ *(pLightnessDefault_status+1) = Light_LightnessDefaultParam.LightnessDefaultStatus >>8;
*pLength = 2;
return MOBLE_RESULT_SUCCESS;
@@ -621,19 +610,15 @@ MOBLE_RESULT Light_Lightness_Range_Status(MOBLEUINT8* pLightnessRange_status, MO
Min Range 2B The Minimum range value of the Light Lightness state.
Max Range 2B The Maximum range value of the Light Lightness state
*/
- MOBLEUINT8 Light_GetBuff[5];
TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8257! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightLightnessRange_cb)(Light_GetBuff);
-
- *(pLightnessRange_status) = Light_GetBuff[0];
- *(pLightnessRange_status+1) = Light_GetBuff[1];
- *(pLightnessRange_status+2) = Light_GetBuff[2];
- *(pLightnessRange_status+3) = Light_GetBuff[3];
- *(pLightnessRange_status+4) = Light_GetBuff[4];
+ *(pLightnessRange_status) = Light_LightnessRangeParam.StatusCode;
+ *(pLightnessRange_status+1) = Light_LightnessRangeParam.MinRangeStatus;
+ *(pLightnessRange_status+2) = Light_LightnessRangeParam.MinRangeStatus >> 8;
+ *(pLightnessRange_status+3) = Light_LightnessRangeParam.MaxRangeStatus;
+ *(pLightnessRange_status+4) = Light_LightnessRangeParam.MaxRangeStatus >> 8;
*pLength = 5;
return MOBLE_RESULT_SUCCESS;
@@ -679,7 +664,8 @@ MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length
Light_CtlParam.Last_Lightness = Light_CtlParam.CTL_Lightness;
Light_CtlParam.Last_Temperature = Light_CtlParam.CTL_Temperature;
Light_CtlStatus.PresentCtlDelta16 = Light_CtlParam.CTL_DeltaUv;
- if(length > 7)
+
+ if((length > 7) && (pLightCtl_param[7] !=0))
{
Light_CtlParam.CTL_TransitionTime = pLightCtl_param[7];
Light_CtlParam.CTL_Delay = pLightCtl_param[8];
@@ -690,7 +676,6 @@ MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length
Light_TemporaryStatus.TargetParam_1 = Light_CtlStatus.TargetCtlLightness16;
Light_TemporaryStatus.TargetParam_2 = Light_CtlStatus.TargetCtlTemperature16;
-
Light_GetStepValue(pLightCtl_param[7]);
Light_ModelFlag.LightOptionalParam = 1;
Light_ModelFlag.LightTransitionFlag = LIGHT_CTL_TRANSITION_START;
@@ -712,7 +697,7 @@ MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length
#ifdef ENABLE_MODEL_BINDING
/* binding of light ctl with actual lightness */
- Light_BindingCtlToLightness_Actual(BINDING_LIGHT_CTL_LIGHTNESS_SET);
+ Light_Ctl_LightActual_Binding(BINDING_LIGHT_CTL_SET);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -734,18 +719,10 @@ MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status, MOBLEUINT32 *pLength
Target Ctl Temeperature 2B The Target ctl Temperature value of the model state.
Remaining Time 1B The Remaining Time value of the model state
*/
- MOBLEUINT8 Light_GetBuff[4];
TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#825D! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightCtl_cb)(Light_GetBuff);
- Light_CtlStatus.PresentCtlLightness16 = Light_GetBuff[1] << 8;
- Light_CtlStatus.PresentCtlLightness16 |= Light_GetBuff[0];
- Light_CtlStatus.PresentCtlTemperature16 = Light_GetBuff[3] << 8;
- Light_CtlStatus.PresentCtlTemperature16 |= Light_GetBuff[2];
-
if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
{
*(pLightCtl_status) = Light_CtlStatus.PresentCtlLightness16;
@@ -800,9 +777,10 @@ MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param, MOB
Light_CtlParam.CTL_DeltaUv |= pLightCtlTemp_param[2];
Light_CtlParam.CTL_TID = pLightCtlTemp_param[4] << 8;
+ Light_CtlTemperature_TempRangeBinding(&Light_CtlParam);
/* Binding with ctl temperature range value */
- if(length > 7)
+ if((length > 5) && (pLightCtlTemp_param[5] !=0))
{
Light_CtlParam.CTL_TransitionTime = pLightCtlTemp_param[5];
Light_CtlParam.CTL_Delay = pLightCtlTemp_param[6];
@@ -813,6 +791,7 @@ MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param, MOB
Light_TemporaryStatus.TargetParam_1 = Light_CtlStatus.TargetCtlTemperature16;
Light_TemporaryStatus.TargetParam_2 = Light_CtlStatus.TargetCtlDeltaUv16;
+ Light_GetStepValue(pLightCtlTemp_param[5]);
Light_ModelFlag.LightOptionalParam = 1;
Light_ModelFlag.LightTransitionFlag = LIGHT_TEMPERATURE_TRANSITION_START;
}
@@ -833,7 +812,7 @@ MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param, MOB
(LightAppli_cb.Light_CtlTemperature_Set_cb)(&Light_CtlStatus, OptionalValid);
#ifdef ENABLE_MODEL_BINDING
/* Binding of data Ctl Temperature with Generic Level */
- Light_CtlTemp_GenericLevelBinding(&Light_CtlParam);
+ Light_CtlTemperature_Binding();
#endif
return MOBLE_RESULT_SUCCESS;
@@ -856,18 +835,10 @@ MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status, MOBLE
Target Ctl Delta Uv 2B The Target ctl Delta Uv value of the model state.
Remaining Time 1B The Remaining Time value of the model state
*/
- MOBLEUINT8 Light_GetBuff[4];
TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8261! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightCtlTemp_cb)(Light_GetBuff);
- Light_CtlStatus.PresentCtlTemperature16 = Light_GetBuff[1] << 8;
- Light_CtlStatus.PresentCtlTemperature16 |= Light_GetBuff[0];
- Light_CtlStatus.PresentCtlDelta16 = Light_GetBuff[3] << 8;
- Light_CtlStatus.PresentCtlDelta16 |= Light_GetBuff[2];
-
if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
{
*(pLightCtlTemp_status) = Light_CtlStatus.PresentCtlTemperature16;
@@ -959,21 +930,16 @@ MOBLE_RESULT Light_CtlTemperature_Range_Status(MOBLEUINT8* pCtlTempRange_status,
Min Range 2B The minimum value for Ctl temperature state.
Max Range 2B The maximum value for Ctl temperature state.
*/
- MOBLEUINT8 Light_GetBuff[5];
TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8262! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightCtlTempRange_cb)(Light_GetBuff);
-
- CtlTemperatureRangeParam.StatusCode = Light_GetBuff[0];
- CtlTemperatureRangeParam.MinRangeStatus = Light_GetBuff[2] << 8;
- CtlTemperatureRangeParam.MinRangeStatus |= Light_GetBuff[1];
- CtlTemperatureRangeParam.MaxRangeStatus = Light_GetBuff[4] << 8;
- CtlTemperatureRangeParam.MaxRangeStatus |= Light_GetBuff[3];
+ *pCtlTempRange_status = CtlTemperatureRangeParam.StatusCode;
+ *(pCtlTempRange_status+1) = CtlTemperatureRangeParam.MinRangeStatus ;
+ *(pCtlTempRange_status+2) = CtlTemperatureRangeParam.MinRangeStatus >> 8;
+ *(pCtlTempRange_status+3) = CtlTemperatureRangeParam.MaxRangeStatus ;
+ *(pCtlTempRange_status+4) = CtlTemperatureRangeParam.MaxRangeStatus >> 8;
- memcpy(pCtlTempRange_status ,Light_GetBuff, 5);
*pLength = 5;
return MOBLE_RESULT_SUCCESS;
@@ -1007,9 +973,6 @@ MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param, MOBLEUINT
Light_CtlDefaultParam.CtlDefaultDeltaUv = pCtlDefault_param[5] << 8;
Light_CtlDefaultParam.CtlDefaultDeltaUv |= pCtlDefault_param[4];
- TRACE_M(TF_LIGHT,"Inside the Ctl Default set Default Lightness 0x%.2x , Default temperature 0x%.2x , Default delta 0x%.2x \r\n " ,
- Light_CtlDefaultParam.CtlDefaultLightness16,Light_CtlDefaultParam.CtlDefaultTemperature16, Light_CtlDefaultParam.CtlDefaultDeltaUv );
-
/* Application Callback */
(LightAppli_cb.Light_CtlDefault_Set_cb)(&Light_CtlDefaultParam , OptionalValid);
return MOBLE_RESULT_SUCCESS;
@@ -1029,22 +992,17 @@ MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status, MOBLEUINT32
Ctl Temperature 2B The Default value of the Ctl Temperature..
Ctl Delta Uv 2B The Default value of the Ctl Delta Uv..
*/
- MOBLEUINT8 Light_GetBuff[6];
TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8267! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightCtlDefault_cb)(Light_GetBuff);
-
- Light_CtlDefaultParam.CtlDefaultLightness16 = Light_GetBuff[1] << 8;
- Light_CtlDefaultParam.CtlDefaultLightness16 |= Light_GetBuff[0];
- Light_CtlDefaultParam.CtlDefaultTemperature16 = Light_GetBuff[3] << 8;
- Light_CtlDefaultParam.CtlDefaultTemperature16 |= Light_GetBuff[2];
- Light_CtlDefaultParam.CtlDefaultDeltaUv = Light_GetBuff[5] << 8;
- Light_CtlDefaultParam.CtlDefaultDeltaUv |= Light_GetBuff[4];
+ *pCtlDefault_status = Light_CtlDefaultParam.CtlDefaultLightness16 ;
+ *(pCtlDefault_status +1) = Light_CtlDefaultParam.CtlDefaultLightness16 >> 8;
+ *(pCtlDefault_status +2) = Light_CtlDefaultParam.CtlDefaultTemperature16;
+ *(pCtlDefault_status +3) = Light_CtlDefaultParam.CtlDefaultTemperature16 >> 8;
+ *(pCtlDefault_status +4) = Light_CtlDefaultParam.CtlDefaultDeltaUv;
+ *(pCtlDefault_status +5) = Light_CtlDefaultParam.CtlDefaultDeltaUv >> 8;
- memcpy(pCtlDefault_status , Light_GetBuff, 6);
*pLength = 6;
return MOBLE_RESULT_SUCCESS;
@@ -1083,7 +1041,7 @@ MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param, MOBLEUINT32 length)
Light_HslParam.Hsl_TID = pHsl_param[6];
- if(length > 7U)
+ if((length > 7U) && (pHsl_param[7] !=0))
{
Light_HslParam.Hsl_TransitionTime = pHsl_param[7];
Light_HslParam.Hsl_Delay = pHsl_param[8];
@@ -1113,7 +1071,7 @@ MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param, MOBLEUINT32 length)
#ifdef ENABLE_MODEL_BINDING
/* Light Hsl Lightness binding with lightness Actual */
- Light_HslLightness_LightnessActualBinding(&Light_HslParam);
+ Light_HslLightness_LightnessActualBinding();
#endif
return MOBLE_RESULT_SUCCESS;
@@ -1134,36 +1092,38 @@ MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status, MOBLEUINT32 *pLength)
HSL Saturation 2B The present value of the Light HSL Saturation state.
Remaining Time 1B The remaining time value for transition of state.
*/
- MOBLEUINT8 Light_GetBuff[8];
TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#826D! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightHsl_cb)(Light_GetBuff);
-
- Light_HslStatus.PresentHslLightness16 = Light_GetBuff[1] << 8;
- Light_HslStatus.PresentHslLightness16 |= Light_GetBuff[0];
- Light_HslStatus.PresentHslHueLightness16 = Light_GetBuff[3] << 8;
- Light_HslStatus.PresentHslHueLightness16 |= Light_GetBuff[2];
- Light_HslStatus.PresentHslSaturation16 = Light_GetBuff[5] << 8;
- Light_HslStatus.PresentHslSaturation16 |= Light_GetBuff[4];
-
+ if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
+ {
*(pHsl_status) = Light_HslStatus.PresentHslLightness16 ;
*(pHsl_status+1) = Light_HslStatus.PresentHslLightness16 >> 8;
*(pHsl_status+2) = Light_HslStatus.PresentHslHueLightness16;
*(pHsl_status+3) = Light_HslStatus.PresentHslHueLightness16 >> 8;
*(pHsl_status+4) = Light_HslStatus.PresentHslSaturation16;
*(pHsl_status+5) = Light_HslStatus.PresentHslSaturation16 >> 8;
-
- if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
- {
- *(pHsl_status+6) = Light_HslStatus.RemainingTime;
- *pLength = 7;
+ *(pHsl_status+6) = Light_HslStatus.TargetHslLightness16;
+ *(pHsl_status+7) = Light_HslStatus.TargetHslLightness16 >> 8;
+ *(pHsl_status+8) = Light_HslStatus.PresentHslHueLightness16;
+ *(pHsl_status+9) = Light_HslStatus.PresentHslHueLightness16 >> 8;
+ *(pHsl_status+10) = Light_HslStatus.TargetHslSaturation16;
+ *(pHsl_status+11) = Light_HslStatus.TargetHslSaturation16 >> 8;
+ *(pHsl_status+12) = Light_HslStatus.RemainingTime;
+
+ *pLength = 13;
Light_ModelFlag.LightOptionalParam = 0;
}
else
{
+ *(pHsl_status) = Light_HslStatus.PresentHslLightness16 ;
+ *(pHsl_status+1) = Light_HslStatus.PresentHslLightness16 >> 8;
+ *(pHsl_status+2) = Light_HslStatus.PresentHslHueLightness16;
+ *(pHsl_status+3) = Light_HslStatus.PresentHslHueLightness16 >> 8;
+ *(pHsl_status+4) = Light_HslStatus.PresentHslSaturation16;
+ *(pHsl_status+5) = Light_HslStatus.PresentHslSaturation16 >> 8;
+
*pLength = 6;
}
@@ -1196,8 +1156,8 @@ MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param, MOBLEUINT32 lengt
Light_HslParam.HslHueLightness16 |= (MOBLEUINT16)pHslHue_param[0];
Light_HslParam.Hsl_TID = pHslHue_param[2];
-
- if(length > 3U)
+ Light_HslHue_RangeBinding(&Light_HslParam);
+ if((length > 3U) && (pHslHue_param[3] !=0))
{
Light_HslParam.Hsl_TransitionTime = pHslHue_param[3];
Light_HslParam.Hsl_Delay = pHslHue_param[4];
@@ -1225,8 +1185,8 @@ MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param, MOBLEUINT32 lengt
(LightAppli_cb.Light_HslHue_Set_cb)(&Light_HslStatus , OptionalValid);
#ifdef ENABLE_MODEL_BINDING
- /* Hsl Hue binding with Generic Level */
- Light_HslHue_GenericLevelBinding(&Light_HslParam);
+ /* Light Hsl Hue binding with Generic level */
+ Light_Hsl_Hue_Binding();
#endif
return MOBLE_RESULT_SUCCESS;
@@ -1246,17 +1206,10 @@ MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status, MOBLEUINT32 *pLengt
Target HSL Hue 2B The target value of the Light HSL Hue state.
Remaining Time 1B The remaining time value for transition of state.
*/
- MOBLEUINT8 Light_GetBuff[6];
TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#826E! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightHslHue_cb)(Light_GetBuff);
-
- Light_HslStatus.PresentHslHueLightness16 = Light_GetBuff[1] << 8;
- Light_HslStatus.PresentHslHueLightness16 |= Light_GetBuff[0];
-
*(pHslHue_status) = Light_HslStatus.PresentHslHueLightness16;
*(pHslHue_status+1) = Light_HslStatus.PresentHslHueLightness16 >> 8;
@@ -1301,8 +1254,8 @@ MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param, MOB
Light_HslParam.HslSaturation16 |= (MOBLEUINT16)pHslSaturation_param[0];
Light_HslParam.Hsl_TID = pHslSaturation_param[2];
-
- if(length > 3U)
+ Light_HslSaturation_RangeBinding(&Light_HslParam);
+ if((length > 3U) && (pHslSaturation_param[3] != 0))
{
Light_HslParam.Hsl_TransitionTime = pHslSaturation_param[3];
Light_HslParam.Hsl_Delay = pHslSaturation_param[4];
@@ -1331,8 +1284,8 @@ MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param, MOB
(LightAppli_cb.Light_HslSaturation_Set_cb)(&Light_HslStatus , OptionalValid);
#ifdef ENABLE_MODEL_BINDING
- /* Light Hsl Saturation binding with Generic Level */
- Light_HslSaturation_GenericLevelBinding(&Light_HslParam);
+ /* Light Hsl Saturation binding with Generic level model*/
+ Light_Hsl_Saturation_Binding();
#endif
return MOBLE_RESULT_SUCCESS;
@@ -1352,17 +1305,10 @@ MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status, MOBLE
Target HSL Saturation 2B The target value of the Light HSL Hue state.
Remaining Time 1B The remaining time value for transition of state.
*/
- MOBLEUINT8 Light_GetBuff[6];
TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8272! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightHslSaturation_cb)(Light_GetBuff);
-
- Light_HslStatus.PresentHslSaturation16 = Light_GetBuff[1] << 8;
- Light_HslStatus.PresentHslSaturation16 |= Light_GetBuff[0];
-
*(pHslSaturation_status) = Light_HslStatus.PresentHslSaturation16;
*(pHslSaturation_status+1) = Light_HslStatus.PresentHslSaturation16 >> 8;
@@ -1430,22 +1376,17 @@ MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status, MOBLEUINT32
HSL Hue 2B The target value of the Light HSL Hue state.
HSL Saturation 2B The target value of the Light HSL Saturation state.
*/
- MOBLEUINT8 Light_GetBuff[6];
TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#827B! \n\r");
- /* Function call back to get the values from application*/
- (Appli_Light_GetStatus_cb.GetLightHslDefault_cb)(Light_GetBuff);
-
- Light_HslStatus.PresentHslLightness16 = Light_GetBuff[1] << 8;
- Light_HslStatus.PresentHslLightness16 |= Light_GetBuff[0];
- Light_HslStatus.PresentHslHueLightness16 = Light_GetBuff[3] << 8;
- Light_HslStatus.PresentHslHueLightness16 |= Light_GetBuff[2];
- Light_HslStatus.PresentHslSaturation16 = Light_GetBuff[5] << 8;
- Light_HslStatus.PresentHslSaturation16 |= Light_GetBuff[4];
+ *pHslDefault_status = Light_HslStatus.PresentHslLightness16;
+ *(pHslDefault_status+1) = Light_HslStatus.PresentHslLightness16 >> 8;
+ *(pHslDefault_status+2) = Light_HslStatus.PresentHslHueLightness16;
+ *(pHslDefault_status+3) = Light_HslStatus.PresentHslHueLightness16 >> 8;
+ *(pHslDefault_status+4) = Light_HslStatus.PresentHslSaturation16;
+ *(pHslDefault_status+5) = Light_HslStatus.PresentHslSaturation16 >> 8;
- memcpy(pHslDefault_status , Light_GetBuff, 6);
*pLength = 6;
return MOBLE_RESULT_SUCCESS;
@@ -1508,6 +1449,17 @@ MOBLE_RESULT Light_HslRange_Status(MOBLEUINT8* pHslRange_status, MOBLEUINT32 *pL
TRACE_M(TF_SERIAL_CTRL,"#827D! \n\r");
/* Function call back to get the values from application*/
+ *pHslRange_status = Light_HslRangeParam.Status_Code;
+ *(pHslRange_status+1) = Light_HslRangeParam.HslHueMinRange16;
+ *(pHslRange_status+2) = Light_HslRangeParam.HslHueMinRange16 >> 8;
+ *(pHslRange_status+3) = Light_HslRangeParam.HslHueMaxRange16;
+ *(pHslRange_status+4) = Light_HslRangeParam.HslHueMaxRange16 >> 8;
+ *(pHslRange_status+5) = Light_HslRangeParam.HslMinSaturation16;
+ *(pHslRange_status+6) = Light_HslRangeParam.HslMinSaturation16 >> 8;
+ *(pHslRange_status+7) = Light_HslRangeParam.HslMaxSaturation16;
+ *(pHslRange_status+8) = Light_HslRangeParam.HslMaxSaturation16 >> 8;
+
+ *pLength = 9;
return MOBLE_RESULT_SUCCESS;
}
@@ -1723,6 +1675,14 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLE_ADDRESS publishAddress;
+ MOBLEUINT8 elementNumber;
+ MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
+ MOBLE_ADDRESS my_Address;
+
+ Model_Rx_Opcode = opcode;
+ my_Address = BLEMesh_GetAddress();
+ Dst_Peer = dst_peer;
TRACE_M(TF_LIGHT,"dst_peer = %.2X , peer_add = %.2X, opcode= %.2X,response= %.2X \r\n ",dst_peer, peer_addr, opcode,response);
@@ -1741,6 +1701,8 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
{
Light_Lightness_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
}
break;
@@ -1755,6 +1717,8 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
{
Light_Lightness_Linear_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
}
break;
@@ -1824,6 +1788,8 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[6])))
{
Light_Ctl_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_CTL_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
}
break;
@@ -1857,6 +1823,8 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[4])))
{
Light_CtlTemperature_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
}
break;
@@ -1884,7 +1852,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case LIGHT_CTL_DEFAULT_SET:
case LIGHT_CTL_DEFAULT_SET_UNACK:
{
- result = Chk_MultiParamValidityAllUnsigned(MIN_VALID_RANGE ,MAX_VALID_RANGE ,
+ result = Chk_MultiParamValidity(MIN_VALID_RANGE ,MAX_VALID_RANGE ,
MIN_CTL_TEMP_RANGE ,MAX_CTL_TEMP_RANGE ,
MIN_CTL_DELTA_VALUE ,MAX_CTL_DELTA_VALUE ,pRxData);
@@ -1910,6 +1878,8 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[6])))
{
Light_Hsl_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_HSL_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
}
break;
@@ -1948,6 +1918,9 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
{
Light_HslHue_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
+
}
}
break;
@@ -1970,7 +1943,12 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case LIGHT_HSL_RANGE_SET:
case LIGHT_HSL_RANGE_SET_UNACK:
{
+ result = Chk_HslRangeValidity(pRxData ,MIN_HUE_RANGE,MAX_HUE_RANGE,
+ MIN_SATURATION_RANGE,MAX_SATURATION_RANGE);
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
Light_HslRange_Set(pRxData , dataLength);
+ }
break;
}
#endif
@@ -1983,6 +1961,8 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
{
Light_HslSaturation_Set(pRxData, dataLength);
+ Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID;
+ modelStateChangeFlag = MOBLE_TRUE;
}
break;
}
@@ -1998,9 +1978,9 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
} /* Switch ends */
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
+ if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
{
- Model_SendResponse(peer_addr, dst_peer,opcode,pRxData, dataLength);
+ Model_SendResponse(peer_addr, my_Address,opcode,pRxData, dataLength);
}
/*
@@ -2009,6 +1989,19 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
for publication is full filled as per specification then the status will be
published.
*/
+ elementNumber = BLE_GetElementNumber();
+ publishAddress = BLEMesh_GetPublishAddress(elementNumber,Model_ID);
+
+ if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE)
+ && (ADDRESS_IS_UNICAST(dst_peer)))
+ {
+ Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
+
+ modelStateChangeFlag = MOBLE_FALSE;
+
+ TRACE_I(TF_LIGHT,"Publishing state to the address %.2X \r\n",publishAddress);
+ }
+
return MOBLE_RESULT_SUCCESS;
}
@@ -2359,10 +2352,11 @@ MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
if(Light_TimeParam.StepValue == 0)
{
Light_ModelFlag.LightTransitionFlag = LIGHT_TRANSITION_STOP;
- Light_Trnsn_Cmplt = 1;
+ Light_ModelFlag.Light_Trnsn_Cmplt = 1;
+
}
- TRACE_M(TF_LIGHT,"Inside light lightness transmition time at %ld, Current state 0x%.2x ,target state 0x%.2x , Remaining Time 0x%.2x\n\r",
+ TRACE_M(TF_LIGHT,"Inside light lightness transition time at %ld, Current state 0x%.2x ,target state 0x%.2x , Remaining Time 0x%.2x\n\r",
Clock_Time(),Light_TemporaryStatus.PresentParam_1,Light_TemporaryStatus.TargetParam_1,\
Light_TemporaryStatus.RemainingTime);
@@ -2477,9 +2471,9 @@ MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUI
if(Light_TimeParam.StepValue <= 0)
{
Light_ModelFlag.LightTransitionFlag = LIGHT_TRANSITION_STOP;
- Light_Trnsn_Cmplt = 1;
+ Light_ModelFlag.Light_Trnsn_Cmplt = 1;
}
- TRACE_M(TF_LIGHT,"Inside light transmition %ld,PV1 0x%.2x ,TV1 0x%.2x ,PV2 0x%.2x , TV2 0x%.2x,PV3 0x%.2x ,TV3 0x%.2x, RT 0x%.2x \n\r",
+ TRACE_M(TF_LIGHT,"Inside light transition %ld,PV1 0x%.2x ,TV1 0x%.2x ,PV2 0x%.2x , TV2 0x%.2x,PV3 0x%.2x ,TV3 0x%.2x, RT 0x%.2x \n\r",
Clock_Time(),Light_TemporaryStatus.PresentParam_1,Light_TemporaryStatus.TargetParam_1,
Light_TemporaryStatus.PresentParam_2,Light_TemporaryStatus.TargetParam_2,
Light_TemporaryStatus.PresentParam_3, Light_TemporaryStatus.TargetParam_3,
@@ -2490,6 +2484,43 @@ MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUI
return MOBLE_RESULT_SUCCESS;
}
+/**
+* @brief Function to publish the status of the node to the publish address.
+* The Publishing of all the model states will depend on the model message received
+ and supporting binding with other models.
+* @param void
+* @param void
+*/
+void Model_BindingPublishStatus(void)
+{
+ MOBLE_ADDRESS publishAddress;
+ MOBLEUINT8 elementNumber;
+ MOBLEUINT16 opcode;
+ MOBLEUINT8 const pRxData[12] = {0};
+ MOBLEUINT32 dataLength = 0;
+ MOBLEUINT8 count = 0;
+ MOBLE_ADDRESS my_Address;
+
+ if(Light_PublishOpcodeList.BindedStateCount > 0)
+ {
+ for(count = 0;count<Light_PublishOpcodeList.BindedStateCount;count++)
+ {
+ my_Address = BLEMesh_GetAddress();
+ elementNumber = BLE_GetElementNumber();
+ publishAddress = BLEMesh_GetPublishAddress(elementNumber, Light_PublishOpcodeList.Model_ID[count]);
+ opcode = (MOBLEUINT16)Light_PublishOpcodeList.PublishStateOpcode[count];
+
+ if((publishAddress != 0x0000 ) && (ADDRESS_IS_UNICAST(Dst_Peer)))
+ {
+ Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
+ TRACE_I(TF_LIGHT,"Binded publishing address %.2x opcode %.2x model id %.2x \r\n",
+ publishAddress,Light_PublishOpcodeList.PublishStateOpcode[count],Light_PublishOpcodeList.Model_ID[count]);
+ }
+ }
+ Light_PublishOpcodeList.BindedStateCount = 0;
+ }
+
+}
/**
* @brief Light_GetStepValue:Function calculates parameters for transition time
@@ -2530,7 +2561,11 @@ void Light_GetStepValue(MOBLEUINT8 stepParam)
*/
void Lighting_Process(void)
{
-
+ MOBLE_ADDRESS publishAddress;
+ MOBLE_ADDRESS my_Address;
+ MOBLEUINT8 elementNumber;
+ MOBLEUINT8 const pRxData[12] = {0};
+ MOBLEUINT32 dataLength = 0;
#if defined ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS || defined ENABLE_LIGHT_MODEL_SERVER_CTL \
|| defined ENABLE_LIGHT_MODEL_SERVER_HSL
@@ -2540,24 +2575,35 @@ void Lighting_Process(void)
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
if(Light_ModelFlag.LightTransitionFlag == LIGHT_LIGHTNESS_TRANSITION_START)
{
+ /* Fetching the state value from the applcation layer to middle layer */
(Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff);
+ /* Transition function called to change the state in transition */
Light_TransitionBehaviourSingle_Param(Light_GetBuff);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
+ /* updating the state value after the each transition step complete */
LightLightnessStateUpdate_Process();
+ /*Application Callback */
(LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus,0);
+ /* Binding of actual light lightness with other models */
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , 0);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
if(Light_ModelFlag.LightTransitionFlag == LIGHT_LINEAR_TRANSITION_START)
{
-
+ /* Fetching the state value from the applcation layer to middle layer */
(Appli_Light_GetStatus_cb.GetLightLightnessLinear_cb)(Light_GetBuff);
+ /* Transition function called to change the state in transition */
Light_TransitionBehaviourSingle_Param(Light_GetBuff);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
+ /* updating the state value after the each transition step complete */
LightLinearStateUpdate_Process();
+ /*Application Callback */
(LightAppli_cb.Lightness_Linear_Set_cb)(&Light_LightnessStatus,0);
+ /* Binding of data of light lightness with light linear */
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , 0);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
@@ -2571,6 +2617,8 @@ void Lighting_Process(void)
{
LightCtlStateUpdate_Process();
(LightAppli_cb.Light_Ctl_Set_cb)(&Light_CtlStatus , 0);
+ /* binding of light ctl with actual lightness */
+ Light_Ctl_LightActual_Binding(BINDING_LIGHT_CTL_SET);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
@@ -2583,6 +2631,8 @@ void Lighting_Process(void)
{
LightCtlTemperatureStateUpdate_Process();
(LightAppli_cb.Light_CtlTemperature_Set_cb)(&Light_CtlStatus , 0);
+ /* Binding of data Ctl Temperature with Generic Level */
+ Light_CtlTemperature_Binding();
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
@@ -2597,6 +2647,8 @@ void Lighting_Process(void)
{
LightHslStateUpdate_Process();
(LightAppli_cb.Light_Hsl_Set_cb)(&Light_HslStatus , 0);
+ /* Light Hsl Lightness binding with lightness Actual */
+ Light_HslLightness_LightnessActualBinding();
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
@@ -2609,6 +2661,8 @@ void Lighting_Process(void)
{
LightHslHueStateUpdate_Process();
(LightAppli_cb.Light_HslHue_Set_cb)(&Light_HslStatus , 0);
+ /* Light Hsl Hue binding with Generic level */
+ Light_Hsl_Hue_Binding();
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
@@ -2621,10 +2675,27 @@ void Lighting_Process(void)
{
LightHslSaturationStateUpdate_Process();
(LightAppli_cb.Light_HslSaturation_Set_cb)(&Light_HslStatus , 0);
+ /* Light Hsl Saturation binding with Generic level model*/
+ Light_Hsl_Saturation_Binding();
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
#endif
+
+ if(Light_ModelFlag.Light_Trnsn_Cmplt == MOBLE_TRUE)
+ {
+ elementNumber = BLE_GetElementNumber();
+ my_Address = BLEMesh_GetAddress();
+ publishAddress = BLEMesh_GetPublishAddress(elementNumber,Model_ID);
+ if(publishAddress != 0x00)
+ {
+ Model_SendResponse(publishAddress,my_Address,Model_Rx_Opcode,pRxData,dataLength);
+ }
+ Light_ModelFlag.Light_Trnsn_Cmplt = MOBLE_FALSE;
+ }
+#ifdef ENABLE_MODEL_BINDING
+ Model_BindingPublishStatus();
+#endif
}
@@ -2636,13 +2707,28 @@ void Lighting_Process(void)
*/
MOBLE_RESULT LightLightnessStateUpdate_Process(void)
{
- Light_LightnessStatus.PresentValue16 = Light_TemporaryStatus.PresentParam_1;
- Light_LightnessStatus.TargetValue16 = Light_TemporaryStatus.TargetParam_1;;
+ Light_LightnessStatus.LightnessPresentValue16 = Light_TemporaryStatus.PresentParam_1;
+ Light_LightnessStatus.TargetValue16 = Light_TemporaryStatus.TargetParam_1;
Light_LightnessStatus.RemainingTime = Light_TemporaryStatus.RemainingTime ;
return MOBLE_RESULT_SUCCESS;
}
+/**
+* @brief Light_LC_LightnessStateUpdate_Process:Function to update the parametes of light
+* lightness model in application file from Temporary parameter in model file.
+* @param void
+* return MOBLE_RESULT.
+*/
+MOBLE_RESULT Light_LC_LightnessStateUpdate_Process(Light_LC_TemporaryStatus_t *lc_Temp_Value)
+{
+ Light_LightnessStatus.LightnessPresentValue16 = lc_Temp_Value->PresentParam_1;
+ Light_LightnessStatus.TargetValue16 = lc_Temp_Value->TargetParam_1;
+ Light_LightnessStatus.RemainingTime = lc_Temp_Value->RemainingTime;
+
+ (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus,0);
+ return MOBLE_RESULT_SUCCESS;
+}
/**
* @brief LightLinearStateUpdate_Process:function to update the parametes of light
* lightness linear model in application file from Temporary parameter in model file.
@@ -2651,8 +2737,8 @@ MOBLE_RESULT LightLightnessStateUpdate_Process(void)
*/
MOBLE_RESULT LightLinearStateUpdate_Process(void)
{
- Light_LightnessStatus.PresentValue16 = Light_TemporaryStatus.PresentParam_1;
- Light_LightnessStatus.TargetValue16 = Light_TemporaryStatus.TargetParam_1;;
+ Light_LightnessStatus.LinearPresentValue16 = Light_TemporaryStatus.PresentParam_1;
+ Light_LightnessStatus.TargetValue16 = Light_TemporaryStatus.TargetParam_1;
Light_LightnessStatus.RemainingTime = Light_TemporaryStatus.RemainingTime ;
return MOBLE_RESULT_SUCCESS;
}
@@ -2734,143 +2820,249 @@ MOBLE_RESULT LightHslSaturationStateUpdate_Process(void)
/**
-* @brief Light_BindingCtlToLightness_Actual:Function for binding the data of actual
+* @brief Light_Ctl_LightActual_Binding:Function for binding the data of actual
* lightness and light Ctl set.
* @param bindingFlag: value pass to function from light lightness
* return void
*/
-void Light_BindingCtlToLightness_Actual(MOBLEUINT8 bindingFlag)
+void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag)
{
- if(bindingFlag == BINDING_LIGHT_CTL_LIGHTNESS_SET)
+ if(bindingFlag == BINDING_LIGHT_CTL_SET)
{
- Light_LightnessStatus.PresentValue16 = Light_CtlParam.CTL_Lightness;
- (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus, 0);
+ Light_LightnessStatus.LightnessPresentValue16 = Light_CtlParam.CTL_Lightness;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+
+ TRACE_M(TF_LIGHT, "Light_Ctl_LightActual_Binding Function - Present Light lightness value 0x%.2x \r\n"
+ , Light_LightnessStatus.LightnessPresentValue16);
}
if(bindingFlag == BINDING_LIGHT_LIGHTNESS_ACTUAL_SET)
{
Light_CtlStatus.PresentCtlLightness16 = Light_LightnessParam.TargetLightnessStatus;
- (LightAppli_cb.Light_Ctl_Set_cb)(&Light_CtlStatus, 0);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_CTL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_CTL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+
+ TRACE_M(TF_LIGHT, "Light Lightness set Function - Present CTL lightness value 0x%.2x \r\n"
+ , Light_CtlStatus.PresentCtlLightness16);
}
+
+ Light_Lightness_Binding(bindingFlag , 0);
+
+
}
-
/**
-* @brief LightActual_GenericOnOffBinding: Reverse Data binding b/w Generic On Off and
-* light lightness Actual. this function will set the On Off status of
-* Light when the light lightness Actual is set.
-* @param lightActual: used to select the binding and reverse binding
-* return void.
+* @brief Light_Lightness_Binding:Function for binding the data of actual
+lightness and Linear Lightness is implicit binding with generic on off state.
+* @param bindingFlag: flag value passed in function
+* @param length:length of data
+* return void
*/
-void LightActual_GenericOnOffBinding(Light_LightnessParam_t* lightActual)
+void Light_Lightness_Linear_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
{
+ if(bindingFlag == BINDING_LIGHT_LIGHTNESS_LINEAR_SET)
+ {
+ Light_Linear_ActualBinding(length);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+ }
+ Light_Lightness_Binding(bindingFlag , 0);
+}
+
+/**
+* @brief Light_Lightness_Binding:Function for binding the data of actual
+lightness and Linear Lightness is implicit binding with generic on off state.
+* @param bindingFlag: flag value passed in function
+* @param length:length of data
+* return void
+*/
+void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
+{
/*
- 6.1.2.2.3 - Binding of actual light lightness with generic on off,
- As actual lightness will set which changes the on off state in
- generic model
+ 6.1.2.1.1 - actual lightness = 655354 * squareroot(linear lightness/ 655354).
*/
- Generic_OnOffStatus_t bGeneric_OnOffParam;
+
+ if(bindingFlag != BINDING_LIGHT_LIGHTNESS_LINEAR_SET)
+ {
+ Light_Actual_LinearBinding();
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+ }
+ /* Implicit binding of linear lightness with generic on off.
+ linear lightnes set -> actual lightness set -> generic on off set.
+ As linear lightness changes, it changes the value of actual lightness
+ which in turn changes the state of generic on off state.
+ */
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ /* Binding of data b/w light lightness actual and Generic on off */
+ if(bindingFlag != BINDING_GENERIC_ON_OFF_SET)
+ {
+ LightActual_GenericOnOffBinding(&Light_LightnessStatus);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_ON_OFF_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_MODEL_SERVER_ONOFF_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+ }
+#endif
- if(lightActual ->TargetLightnessStatus == 0x00)
+ /* Implicit binding of linear lightness with generic level.
+ linear lightnes set -> actual lightness set -> generic Level set.
+ As linear lightness changes, it changes the value of actual lightness
+ which in turn changes the state of generic level state.
+ */
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+ /* Binding of data b/w light lightness actual and Generic Level */
+ if(bindingFlag != BINDING_GENERIC_LEVEL_SET)
{
- bGeneric_OnOffParam.Present_OnOff_State = 0x00;
+ LightActual_GenericLevelBinding(&Light_LightnessStatus);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
- else
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+ /* Binding of Light Ctl with Actual Light Lightness */
+ if(bindingFlag != BINDING_LIGHT_CTL_SET)
{
- bGeneric_OnOffParam.Present_OnOff_State = 0x01;
+ Light_Ctl_LightActual_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_CTL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_CTL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
+#endif
- TRACE_M(TF_LIGHT, "LightActual_GenericOnOffBinding Function - Present OnOff value 0x%.2x \r\n"
- , bGeneric_OnOffParam.Present_OnOff_State);
- (GenericAppli_cb.OnOff_Set_cb)(&bGeneric_OnOffParam, 0);
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+ /* Binding of data b/W Actual Lightness and Hsl Lightness.*/
+ if(bindingFlag != BINDING_LIGHT_HSL_SET)
+ {
+ Light_ActualLightness_HslLightnessBinding(&Light_LightnessStatus);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_HSL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_HSL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+ }
+#endif
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Binding - Actual Lightness value 0x%.2x , Linear Lightness value 0x%.2x \r\n " ,
+ Light_LightnessStatus.LightnessPresentValue16,
+ Light_LightnessStatus.LinearPresentValue16 );
}
-
/**
-* @brief LightActual_GenericLevelBinding: Data binding b/w Generic Level and
+* @brief GenericOnOff_LightActualBinding: Data binding b/w Generic On Off and
* light lightness Actual. this function will set the actual light lightness
-* value at the time of generic Level set.
-* @param lightActual: Pointer to the data which needs to be checked.
+* value at the time of generic on off set.
+* @param onOff_param: Pointer to the data which needs to be checked.
* return void.
*/
-void LightActual_GenericLevelBinding(Light_LightnessParam_t* lightActual)
+void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param)
{
/*
- 6.1.2.2.2 - Binding of actual light lightness with generic level
- As Actual lightness changes, the generic level value will
+ 6.1.2.2.3 - Binding of actual light lightness with Generic on off.
+ As generic on off state changes, the actual lightness value will
change.
*/
- MOBLE_ADDRESS publishAddress;
- MOBLEUINT8 elementNumber;
- MOBLEUINT16 opcode;
- Generic_LevelStatus_t bGeneric_LevelParam ;
+ /* condition is depends on the generic on off state */
+ if(onOff_param->Present_OnOff_State == 0x00)
+ {
+ Light_LightnessStatus.LightnessPresentValue16 = 0x00;
+ }
+ else if((onOff_param->Present_OnOff_State == 0x01) &&
+ (Light_LightnessDefaultParam.LightnessDefaultStatus == 0x00))
+ {
+ Light_LightnessStatus.LightnessPresentValue16 = Light_LightnessStatus.LightnessLastStatus;
+ }
+ else if((onOff_param->Present_OnOff_State == 0x01) &&
+ (Light_LightnessDefaultParam.LightnessDefaultStatus != 0x000))
+ {
+ Light_LightnessStatus.LightnessPresentValue16 = Light_LightnessDefaultParam.LightnessDefaultStatus;
+ }
+ else
+ {
+ /* no condition to Execute */
+ }
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
- elementNumber = BLE_GetElementNumber();
- publishAddress = BLEMesh_GetPublishAddress(elementNumber, GENERIC_MODEL_SERVER_LEVEL_MODEL_ID);
+ /*As Generic on off changes, it will chnage the value of the light linear due to change in the light lightness
+ value due to binding of the states.
+ */
- bGeneric_LevelParam.Present_Level16 = lightActual->TargetLightnessStatus - 32768;
- (GenericAppli_cb.Level_Set_cb)(&bGeneric_LevelParam, 0);
- opcode = GENERIC_LEVEL_SET_ACK;
- Model_SendResponse(publishAddress, 0,opcode, NULL,0);
+ Light_Lightness_Binding(BINDING_GENERIC_ON_OFF_SET,0);
+
}
-
-/**
-* @brief Light_Linear_ActualImplicitBinding:Function for binding the data of actual
-lightness and Linear Lightness is implicit binding with generic on off state.
-* @param bindingFlag: flag value passed in function
-* @param length:length of data
-* return void
+/*
+* @Brief GenericLevel_LightBinding: Data binding b/w Generic Level and
+* light lightness Actual. this function will set the actual light lightness
+* value at the time of generic Level set.
+* @param gLevel_param: Pointer to the data which needs to be checked.
+* return void.
*/
-void Light_Linear_ActualImplicitBinding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
+void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8 flag)
{
/*
- 6.1.2.1.1 - actual lightness = 655354 * squareroot(linear lightness/ 655354).
+ 6.1.2.2.2 - Binding of actual light lightness with generic level
+ As generic Level changes, the actual lightness value will
+ change.
*/
- MOBLE_ADDRESS publishAddress;
- MOBLEUINT8 elementNumber;
- MOBLEUINT16 opcode;
- Light_LightnessParam_t bLightnessActual;
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ Light_PublishOpcodeList.BindedStateCount = 0;
+ Light_LightnessStatus.LightnessPresentValue16 = gLevel_param->Present_Level16 + 32768;
- elementNumber = BLE_GetElementNumber();
- publishAddress = BLEMesh_GetPublishAddress(elementNumber, LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+ /*As Generic Level changes, it will change the value of the light linear due to change in the light lightness
+ value due to binding of the states.
+ */
+ Light_Actual_LinearBinding();
- if(bindingFlag == BINDING_LIGHT_LIGHTNESS_LINEAR_SET)
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+ if(flag != BINDING_LIGHT_CTL_TEMP_SET)
{
-
- bLightnessActual.TargetLightnessStatus = Light_Linear_ActualBinding(length);
- /* Implicit binding of linear lightness with generic on off.
- linear lightnes set -> actual lightness set -> generic on off set.
- As linear lightness changes, it changes the value of actual lightness
- which in turn changes the state of generic on off state.
- */
- LightActual_GenericOnOffBinding(&bLightnessActual);
- /* Implicit binding of linear lightness with generic level.
- linear lightnes set -> actual lightness set -> generic Level set.
- As linear lightness changes, it changes the value of actual lightness
- which in turn changes the state of generic level state.
- */
- LightActual_GenericLevelBinding(&bLightnessActual);
-
- opcode = LIGHT_LIGHTNESS_SET;
+ GenericLevel_CtlTempBinding(gLevel_param);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_CTL_TEMPERATURE_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
- if(bindingFlag == BINDING_LIGHT_LIGHTNESS_ACTUAL_SET)
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+ if(flag != BINDIG_LIGHT_HSL_HUE_SET)
{
- Light_Actual_LinearBinding();
- opcode = LIGHT_LIGHTNESS_LINEAR_SET;
+ GenericLevel_HslHueBinding(gLevel_param);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_HSL_HUE_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
+#endif
- Model_SendResponse(publishAddress, 0,opcode, NULL,0);
-
- TRACE_M(TF_LIGHT,"Light_Linear_ActualImplicitBinding - Actual Lightness value 0x%.2x , Linear Lightness value 0x%.2x \r\n " ,
- Light_LightnessStatus.PresentValue16,
- Light_LightnessStatus.PresentValue16 );
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+ if(flag != BINDIG_LIGHT_HSL_SATURATION_SET)
+ {
+ GenericLevel_HslSaturationBinding(gLevel_param);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_HSL_SATURATION_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+ }
+#endif
}
-
/**
* @brief Light_Actual_LinearBinding:Light_Actual_LinearBinding:Function used for
* binding the data of actual lightness and lineaer lightness.this function
@@ -2882,18 +3074,11 @@ MOBLEUINT16 Light_Actual_LinearBinding(void)
{
float productValue;
- MOBLEUINT8 Light_GetBuff[2];
-
- (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff);
- Light_LightnessStatus.PresentValue16 = Light_GetBuff[1] << 8;
- Light_LightnessStatus.PresentValue16 |= Light_GetBuff[0];
-
- productValue = pow((((float)Light_LightnessStatus.PresentValue16)/65535) , 2);
- Light_LightnessStatus.PresentValue16 = (MOBLEUINT16)(65535 * productValue);
+ productValue = pow((((float)Light_LightnessStatus.LightnessPresentValue16)/65535) , 2);
+ Light_LightnessStatus.LinearPresentValue16 = (MOBLEUINT16)(65535 * productValue);
- (LightAppli_cb.Lightness_Linear_Set_cb)(&Light_LightnessStatus, 0);
- return Light_LightnessStatus.PresentValue16;
+ return Light_LightnessStatus.LinearPresentValue16;
}
@@ -2902,6 +3087,7 @@ MOBLEUINT16 Light_Actual_LinearBinding(void)
* lightness and linear lightness. this function changes the value of Actual
* lightness as Linear lightness value is set.
* @param length: length of the data
+* @param binding_Flag: flag for the binding
* return MOBLEUINT16
*/
MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length)
@@ -2912,17 +3098,16 @@ MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length)
float productValue;
if(length <= 3)
{
- productValue = sqrt((((float)Light_LightnessStatus.PresentValue16) / 65535));
- Light_LightnessStatus.PresentValue16 = (MOBLEUINT16)(65535 * productValue);
- (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus, 0);
- return Light_LightnessStatus.PresentValue16;
+ productValue = sqrt((((float)Light_LightnessStatus.LinearPresentValue16) / 65535));
+ Light_LightnessStatus.LightnessPresentValue16 = (MOBLEUINT16)(65535 * productValue);
+ return Light_LightnessStatus.LightnessPresentValue16;
+
}
else
{
productValue = sqrt((((float)Light_LightnessStatus.TargetValue16) / 65535));
Light_LightnessStatus.TargetValue16 = (MOBLEUINT16)(65535 * productValue);
Light_TemporaryStatus.TargetParam_1 = Light_LightnessStatus.TargetValue16;
- (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus, 0);
return Light_LightnessStatus.TargetValue16;
}
}
@@ -2943,13 +3128,6 @@ void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual)
actual lightness = range maximum if actual lighteness is greater than range max
value.
*/
- MOBLEUINT8 Light_GetBuff[5];
- (Appli_Light_GetStatus_cb.GetLightLightnessRange_cb)(Light_GetBuff);
- Light_LightnessRangeParam.MinRangeStatus = Light_GetBuff[2] << 8;
- Light_LightnessRangeParam.MinRangeStatus |= Light_GetBuff[1];
- Light_LightnessRangeParam.MaxRangeStatus = Light_GetBuff[4] << 8;
- Light_LightnessRangeParam.MaxRangeStatus |= Light_GetBuff[3];
-
if((lightActual->TargetLightnessStatus < Light_LightnessRangeParam.MinRangeStatus)
&& (lightActual->TargetLightnessStatus != 0))
{
@@ -2966,6 +3144,23 @@ void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual)
}
}
+/**
+* @brief Light_CtlTemperature_Binding: Function used for binding the data of
+* Ctl temperature with other models.
+* @param void
+* return void
+*/
+void Light_CtlTemperature_Binding(void)
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+ Light_CtlTemp_GenericLevelBinding(&Light_CtlStatus);
+
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+#endif
+
+}
/**
* @brief Light_CtlTemperature_TempRangeBinding: Function used for binding the data of
@@ -2982,12 +3177,6 @@ void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature)
actual lightness = range maximum if actual lighteness is greater than range max
value.
*/
- MOBLEUINT8 Light_GetBuff[5];
- (Appli_Light_GetStatus_cb.GetLightCtlTempRange_cb)(Light_GetBuff);
- CtlTemperatureRangeParam.MinRangeStatus = Light_GetBuff[2] << 8;
- CtlTemperatureRangeParam.MinRangeStatus |= Light_GetBuff[1];
- CtlTemperatureRangeParam.MaxRangeStatus = Light_GetBuff[4] << 8;
- CtlTemperatureRangeParam.MaxRangeStatus |= Light_GetBuff[3];
if(ctlTemperature->CTL_Temperature < CtlTemperatureRangeParam.MinRangeStatus)
{
@@ -3003,49 +3192,109 @@ void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature)
}
}
-
/**
-* @brief Light_CtlTemp_GenericLevelBinding: Data binding b/w Generic Level and
-* light Ctl temperature . this function will set the generic Level
-* value at the time of Ctl temperature value set.
-* @param bCtlTempParam: Pointer to the data which needs to be checked.
+* @brief GenericLevel_CtlTempBinding: Data binding b/w Generic level and Ctl
+* Temperature set.
+* @param bLevelParam: pointer to the structure, which should be set.
* return void.
*/
-void Light_CtlTemp_GenericLevelBinding(Light_CtlParam_t* bCtlTempParam)
+void GenericLevel_CtlTempBinding(Generic_LevelStatus_t * bLevelParam)
{
/* 6.1.3.1.1 Binding with the Generic Level state.
- Generic Level = (Light CTL Temperature - T _MIN) * 65535 / (T_MAX - T_MIN) - 32768
+ Light CTL Temperature = T_MIN + (Generic Level + 32768) * (T_MAX - T_MIN) / 65535
T_MIN = minimum range of ctl temperature
T_MAX = maximum range of ctl temperature
*/
- Generic_LevelStatus_t bLevelStatus;
MOBLEUINT32 productValue;
- productValue = (bCtlTempParam->CTL_Temperature - MIN_CTL_TEMP_RANGE) * 65535;
- bLevelStatus.Present_Level16 = (productValue / (MAX_CTL_TEMP_RANGE - MIN_CTL_TEMP_RANGE)) - 32768;
- /* application callback */
- (GenericAppli_cb.Level_Set_cb)(&bLevelStatus, 0);
+ productValue = (bLevelParam->Present_Level16 + 32768) * (MAX_CTL_TEMP_RANGE - MIN_CTL_TEMP_RANGE) ;
+ Light_CtlStatus.PresentCtlTemperature16 = MIN_CTL_TEMP_RANGE + ((productValue) /65535);
+
}
+/**
+* @brief Light_HslLightness_LightnessActualBinding: Data binding b/w Hsl lightness and
+* Lightness Atual . this function will set the Lightness Actual
+* value at the time of Hsl Lightness value set.
+* @param void
+* return void.
+*/
+void Light_HslLightness_LightnessActualBinding(void)
+{
+ /* 6.1.4.7.1 Binding with the Light Lightness Actual state
+ Light Lightness Actual = Light HSL Lightness
+ */
+ Light_LightnessStatus.LightnessPresentValue16= Light_HslStatus.PresentHslLightness16;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+
+ Light_Lightness_Binding(BINDING_LIGHT_HSL_SET , 0);
+}
+
+/**
+* @brief Light_HSL_HUE_Binding: Function used for binding the data of
+* hsl hue parameter with other models.
+* @param void.
+* return void
+*/
+void Light_Hsl_Hue_Binding(void)
+{
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+ /* Hsl Hue binding with Generic Level */
+ Light_HslHue_GenericLevelBinding(&Light_HslStatus);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+#endif
+}
/**
-* @brief Light_HslHue_GenericLevelBinding: Data binding b/w Generic Level and
-* light Hsl . this function will set the Generic Level
-* value at the time of Hsl Hue value set.
-* @param bHslHueParam: Pointer to the data which needs to be checked.
+* @brief Light_HSL_Saturation_Binding: Function used for binding the data of
+* hsl saturation parameter with other models.
+* @param void.
+* return void
+*/
+void Light_Hsl_Saturation_Binding(void)
+{
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+ /* Hsl Hue binding with Generic Level */
+ Light_HslSaturation_GenericLevelBinding(&Light_HslStatus);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+#endif
+}
+
+/**
+* @brief GenericLevel_HslSaturationBinding: Data binding b/w Generic level and Hsl
+* Hue set.
+* @param bLevelParam: pointer to the structure, which should be set.
* return void.
*/
-void Light_HslHue_GenericLevelBinding(Light_HslParam_t* bHslHueParam)
+void GenericLevel_HslSaturationBinding(Generic_LevelStatus_t * bLevelParam)
{
/* 6.1.4.1.1 Binding with the Generic Level state
- Generic Level = Light HSL Hue – 32768
+ Light HSL Hue = Generic Level + 32768
*/
- Generic_LevelStatus_t bLevelStatus;
- bLevelStatus.Present_Level16 = bHslHueParam->HslHueLightness16 - 32768;
- /* application callback */
- (GenericAppli_cb.Level_Set_cb)(&bLevelStatus, 0);
+
+ Light_HslStatus.PresentHslSaturation16 = bLevelParam->Present_Level16 + 32768;
+}
+/*
+* @brief GenericLevel_HslHueBinding: Data binding b/w Generic level and Hsl
+* Hue set.
+* @param bLevelParam: pointer to the structure, which should be set.
+* return void.
+*/
+void GenericLevel_HslHueBinding(Generic_LevelStatus_t * bLevelParam)
+{
+ /* 6.1.4.1.1 Binding with the Generic Level state
+ Light HSL Hue = Generic Level + 32768
+ */
+ Light_HslStatus.PresentHslHueLightness16 = bLevelParam->Present_Level16 + 32768;
}
-
/**
* @brief Light_HslHue_RangeBinding: Function used for binding the data of
@@ -3061,12 +3310,6 @@ void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam)
Light HSL Hue = Light HSL Hue Range Min->for (Light HSL Hue < Light HSL Hue Range Min)
Light HSL Hue = Light HSL Hue Range Max->for (Light HSL Hue > Light HSL Hue Range Min)
*/
- MOBLEUINT8 Light_GetBuff[5];
- (Appli_Light_GetStatus_cb.GetLightHslHueRange_cb)(Light_GetBuff);
- Light_HslRangeParam.HslHueMinRange16 = Light_GetBuff[2] << 8;
- Light_HslRangeParam.HslHueMinRange16 |= Light_GetBuff[1];
- Light_HslRangeParam.HslHueMaxRange16 = Light_GetBuff[4] << 8;
- Light_HslRangeParam.HslHueMaxRange16 |= Light_GetBuff[3];
if(bHslHueParam->HslHueLightness16 < Light_HslRangeParam.HslHueMinRange16)
{
@@ -3082,26 +3325,6 @@ void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam)
}
}
-
-/**
-* @brief Light_HslSaturation_GenericLevelBinding: Data binding b/w Generic Level and
-* light Hsl . this function will set the Generic Level
-* value at the time of Hsl Saturation value set.
-* @param bHslSatParam: Pointer to the data which needs to be checked.
-* return void.
-*/
-void Light_HslSaturation_GenericLevelBinding(Light_HslParam_t* bHslSatParam)
-{
- /* 6.1.4.4.1 Binding with the Generic Level state
- Generic Level = Light HSL Saturation – 32768
- */
- Generic_LevelStatus_t bLevelStatus;
- bLevelStatus.Present_Level16 = bHslSatParam->HslSaturation16 - 32768;
- /* application callback */
- (GenericAppli_cb.Level_Set_cb)(&bLevelStatus, 0);
-}
-
-
/**
* @brief Light_HslSaturation_RangeBinding: Function used for binding the data of
* Hsl saturation value and Hsl saturation range. this function changes the value of
@@ -3116,12 +3339,6 @@ void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam)
Light HSL Saturation = Light HSL Saturation Range Min Min->for (Light HSL Saturation < Light HSL Saturation Min)
Light HSL Saturation = Light HSL Saturation Range Max->for (Light HSL Saturation > Light HSL Saturation Max)
*/
- MOBLEUINT8 Light_GetBuff[5];
- (Appli_Light_GetStatus_cb.GetLightHslSatRange_cb)(Light_GetBuff);
- Light_HslRangeParam.HslMinSaturation16 = Light_GetBuff[2] << 8;
- Light_HslRangeParam.HslMinSaturation16 |= Light_GetBuff[1];
- Light_HslRangeParam.HslMaxSaturation16 = Light_GetBuff[4] << 8;
- Light_HslRangeParam.HslMaxSaturation16 |= Light_GetBuff[3];
if(bHslSatParam->HslSaturation16 < Light_HslRangeParam.HslMinSaturation16)
{
@@ -3137,27 +3354,18 @@ void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam)
}
}
-
/**
-* @brief Light_HslLightness_LightnessActualBinding: Data binding b/w Hsl lightness and
-* Lightness Atual . this function will set the Lightness Actual
-* value at the time of Hsl Lightness value set.
-* @param bHslLightParam: Pointer to the data which needs to be checked.
-* return void.
+* @brief Light_Linear_Ligth_LC_binding: Function used for binding the data of
+* Light_LC_lightness output data with the Light lightness linear data.
+* @param lc_OutValue: value of Light LC lightness..
+* return void
*/
-void Light_HslLightness_LightnessActualBinding(Light_HslParam_t* bHslLightParam)
+void Light_Linear_Ligth_LC_binding(MOBLEUINT16 lc_OutValue)
{
- /* 6.1.4.7.1 Binding with the Light Lightness Actual state
- Light Lightness Actual = Light HSL Lightness
- */
- Light_LightnessStatus_t bActualLightStatus;
- bActualLightStatus.PresentValue16= bHslLightParam->HslHueLightness16;
- /* application callback */
- (LightAppli_cb.Lightness_Set_cb)(&bActualLightStatus, 0);
-
+ Light_LightnessStatus.LinearPresentValue16 = lc_OutValue;
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , 3);
}
-
/**
* @brief Light_ActualLightness_HslLightnessBinding: Data binding b/w Actual Lightness and
* Hsl lightness . this function will set the Hsl Lightness value
@@ -3165,15 +3373,15 @@ void Light_HslLightness_LightnessActualBinding(Light_HslParam_t* bHslLightParam)
* @param bActualLightParam: Pointer to the data which needs to be checked.
* return void.
*/
-void Light_ActualLightness_HslLightnessBinding(Light_LightnessParam_t* bActualLightParam)
+void Light_ActualLightness_HslLightnessBinding(Light_LightnessStatus_t* bActualLightParam)
{
/* 6.1.4.7.1 Binding with the Light Lightness Actual state
Light HSL Lightness = Light Lightness Actual
*/
- Light_HslStatus_t bHslLightStatus;
- bHslLightStatus.PresentHslLightness16= bActualLightParam->TargetLightnessStatus;
- /* application callback */
- (LightAppli_cb.Light_Hsl_Set_cb)(&bHslLightStatus , 0);
+ Light_HslStatus.PresentHslLightness16= bActualLightParam->LightnessPresentValue16;
+
+ TRACE_M(TF_LIGHT, "Light_ActualLightness_HslLightnessBinding Function - Present HSL lightness value 0x%.2x \r\n"
+ , Light_HslStatus.PresentHslLightness16);
}
/**
@@ -3322,6 +3530,8 @@ WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLig
{ return MOBLE_RESULT_SUCCESS; }
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState))
{ return MOBLE_RESULT_SUCCESS; }
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState))
+{ return MOBLE_RESULT_SUCCESS; }
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState))
{ return MOBLE_RESULT_SUCCESS; }
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState))
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c
index daaf7048d..3be9e4eb9 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c
@@ -57,6 +57,10 @@
* @{
*/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+MOBLEUINT16 Get_LengthInByteProprtyValue(MOBLEUINT16 property_ID);
+#endif
+
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -71,31 +75,38 @@ Light_LC_TimeParam_t Light_LC_TimeParam;
Light_LC_Param_t Light_LC_Param;
+Light_LC_ModelFlag_t Light_LC_ModelFlag;
+
+Light_LC_TemporaryStatus_t Light_LC_TemporaryStatus;
+
+extern Light_PublishOpcodeList_t Light_PublishOpcodeList;
+
MOBLEUINT8 Light_LC_UpdateFlag = 0;
MOBLEUINT32 Timer_value;
extern MOBLEUINT8 TidSend;
+extern MOBLE_ADDRESS Dst_Peer;
#endif
MODEL_OpcodeTableParam_t Light_LC_Opcodes_Table[] = {
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_MODE_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_MODE_STATUS , 1, 1},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_MODE_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
- {LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_MODE_SET_UNACK, MOBLE_FALSE, 1, 1, 0 , 1, 1},
+ {LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_MODE_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_MODE_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_OM_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_OM_STATUS , 1, 1},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_OM_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
- {LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_OM_SET_UNACK, MOBLE_FALSE, 1, 1, 0 , 1, 1},
+ {LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_OM_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_OM_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_ON_OFF_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_ON_OFF_STATUS , 1, 3},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_ON_OFF_SET, MOBLE_TRUE, 2, 4, LIGHT_LC_ON_OFF_STATUS , 1, 3},
- {LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, 0 , 1, 3},
+ {LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, LIGHT_LC_ON_OFF_STATUS , 1, 3},
{LIGHT_MODEL_SERVER_LC_MODEL_ID ,LIGHT_LC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0 , 1, 3},
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
{LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID ,LIGHT_LC_PROPERTY_GET, MOBLE_TRUE, 2, 2, LIGHT_LC_PROPERTY_STATUS , 2, 10},
{LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID ,LIGHT_LC_PROPERTY_SET, MOBLE_TRUE, 2, 10, LIGHT_LC_PROPERTY_STATUS , 2, 10},
- {LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID ,LIGHT_LC_PROPERTY_SET_UNACK, MOBLE_FALSE, 2, 10, 0 , 2, 10},
+ {LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID ,LIGHT_LC_PROPERTY_SET_UNACK, MOBLE_FALSE, 2, 10, LIGHT_LC_PROPERTY_STATUS , 2, 10},
{LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID ,LIGHT_LC_PROPERTY_STATUS, MOBLE_FALSE, 2, 10, 0 , 2, 10},
#endif
{0}
@@ -141,7 +152,7 @@ Light_Property_Table_t Light_Property_Table = {
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
/**
* @brief Light_LC_ModeSet: This function is called for both Acknowledged and
-unacknowledged message
+* unacknowledged message
* @param lcMode_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
@@ -178,7 +189,7 @@ MOBLE_RESULT Light_LC_ModeStatus(MOBLEUINT8* lcMode_status, MOBLEUINT32 *plength
/**
* @brief Light_LC_OMSet: This function is called for both Acknowledged and
-unacknowledged message
+* unacknowledged message
* @param lcOM_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
@@ -226,7 +237,7 @@ MOBLE_RESULT Light_LC_OMStatus(MOBLEUINT8* lcOM_status, MOBLEUINT32 *plength)
/**
* @brief Light_LC_OnOffSet: This function is called for both Acknowledged and
-unacknowledged message
+* unacknowledged message
* @param lcOnOff_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
@@ -235,13 +246,13 @@ MOBLE_RESULT Light_LC_OnOffSet(MOBLEUINT8 const *lcOnOff_param, MOBLEUINT32 leng
{
TRACE_I(TF_LIGHT_LC,"Light_LC_OnOffSet callback received \r\n");
- Light_LC_Param.Light_OnOff = lcOnOff_param[0];
+ Light_LC_Param.Target_Light_OnOff = lcOnOff_param[0];
Light_LC_Param.Tid = lcOnOff_param[1];
MOBLEUINT16 property_ID;
MOBLEUINT32 prop_Value;
/* Event set to descide the state to be process for LC state machine */
- if(Light_LC_Param.Light_OnOff == 1)
+ if(Light_LC_Param.Target_Light_OnOff == 1)
{
Lc_Event = LC_LIGHT_ON;
}
@@ -250,12 +261,14 @@ MOBLE_RESULT Light_LC_OnOffSet(MOBLEUINT8 const *lcOnOff_param, MOBLEUINT32 leng
Lc_Event = LC_LIGHT_OFF;
}
- if(length > 2)
+ if((length > 2) && (lcOnOff_param[2] != 0))
{
Light_LC_Param.Transition_Time = lcOnOff_param[2];
Light_LC_Param.Delay = lcOnOff_param[3];
-
+ Light_LC_ModelFlag.Light_LC_OptionalParam = VALUE_SET;
prop_Value = Light_LC_Param.Transition_Time;
+ Light_LC_Param.Remaining_Time = Light_LC_Param.Transition_Time;
+ Light_LC_GetStepValue(lcOnOff_param[2]);
if( LightLC_States.Lc_States == LC_STANDBY)
{
@@ -278,9 +291,18 @@ MOBLE_RESULT Light_LC_OnOffSet(MOBLEUINT8 const *lcOnOff_param, MOBLEUINT32 leng
}
}
+ else
+ {
+ Light_LC_Param.Present_Light_OnOff = Light_LC_Param.Target_Light_OnOff;
+ }
/* Application Callback */
(LightLCAppli_cb.LightLC_OnOff_Set_cb)(&Light_LC_Param , 0);
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ Light_LC_OnOff_Generic_OnOffBinding();
+#endif
+
return MOBLE_RESULT_SUCCESS;
}
@@ -292,20 +314,30 @@ MOBLE_RESULT Light_LC_OnOffSet(MOBLEUINT8 const *lcOnOff_param, MOBLEUINT32 leng
*/
MOBLE_RESULT Light_LC_OnOffStatus(MOBLEUINT8* lcOnOff_status, MOBLEUINT32 *plength)
{
- MOBLEUINT8 LightLC_GetBuff[3];
TRACE_I(TF_LIGHT_LC,"Light_LC_OnOffStatus callback received \r\n");
- Appli_LightLC_GetStatus_cb.GetLightLC_OnOffState_cb(LightLC_GetBuff);
-
- *lcOnOff_status = LightLC_GetBuff[0] ;
+ if((Light_LC_ModelFlag.Light_LC_OptionalParam == VALUE_SET) || (Light_LC_TimeParam.StepValue != 0))
+ {
+ *lcOnOff_status = Light_LC_Param.Present_Light_OnOff;
+ *(lcOnOff_status+1) = Light_LC_Param.Target_Light_OnOff;
+ *(lcOnOff_status+2) = Light_LC_Param.Remaining_Time;
+ *plength = 3;
+ Light_LC_ModelFlag.Light_LC_OptionalParam = VALUE_RESET;
+ }
+ else
+ { /* When no optional parameter received, target value will
+ be sent in status message.
+ */
+ *lcOnOff_status = Light_LC_Param.Present_Light_OnOff;
*plength = 1;
+ }
return MOBLE_RESULT_SUCCESS;
}
/**
* @brief Light_LC_PropertySet: This function is called for both Acknowledged and
-unacknowledged message
+* unacknowledged message
* @param lcProp_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
@@ -328,21 +360,21 @@ MOBLE_RESULT Light_LC_PropertySet(MOBLEUINT8 const *lcProp_param, MOBLEUINT32 le
Light_LC_Value.Property_Value = lcProp_param[2];
break;
case 4:
- Light_LC_Value.Property_Value = lcProp_param[2] << 8;
- Light_LC_Value.Property_Value |= lcProp_param[3];
+ Light_LC_Value.Property_Value = lcProp_param[3] << 8;
+ Light_LC_Value.Property_Value |= lcProp_param[2];
break;
case 5:
- Light_LC_Value.Property_Value = lcProp_param[2] << 16;
+ Light_LC_Value.Property_Value = lcProp_param[4] << 16;
Light_LC_Value.Property_Value |= lcProp_param[3] << 8;
- Light_LC_Value.Property_Value |= lcProp_param[4];
+ Light_LC_Value.Property_Value |= lcProp_param[2];
break;
case 6:
- Light_LC_Value.Property_Value = lcProp_param[2] << 24;
- Light_LC_Value.Property_Value |= lcProp_param[3] << 16;
- Light_LC_Value.Property_Value |= lcProp_param[4] << 8;
- Light_LC_Value.Property_Value |= lcProp_param[5];
+ Light_LC_Value.Property_Value = lcProp_param[5] << 24;
+ Light_LC_Value.Property_Value |= lcProp_param[4] << 16;
+ Light_LC_Value.Property_Value |= lcProp_param[3] << 8;
+ Light_LC_Value.Property_Value |= lcProp_param[2];
break;
@@ -368,6 +400,7 @@ MOBLE_RESULT Light_LC_PropertyStatus( MOBLEUINT8* lcData_param, MOBLEUINT32* ple
{
MOBLEUINT16 prop_ID = 0x00;
MOBLEUINT32 Property_Value;
+ MOBLEUINT16 prop_value_length;
TRACE_M(TF_LIGHT_LC,"Light_LC_PropertyStatus callback received \r\n");
@@ -377,36 +410,36 @@ MOBLE_RESULT Light_LC_PropertyStatus( MOBLEUINT8* lcData_param, MOBLEUINT32* ple
prop_ID |= pData[0];
}
- Property_Value = Light_LC_GetPropertyID_value(prop_ID);
+ Property_Value = Light_LC_GetPropertyID_value(prop_ID,&prop_value_length);
*lcData_param = prop_ID;
*(lcData_param+1) = prop_ID >> 8;
- switch (length)
+ switch (prop_value_length)
{
- case 3:
+ case ONE_BYTE_VALUE:
*(lcData_param+2) = Property_Value;
- *plength = length;
+ *plength = 3;
break;
- case 4:
- *(lcData_param+2) = Property_Value >> 8;
- *(lcData_param+3) = Property_Value ;
- *plength = length;
+ case TWO_BYTE_VALUE:
+ *(lcData_param+2) = Property_Value ;
+ *(lcData_param+3) = Property_Value >> 8;
+ *plength = 4;
break;
- case 5:
- *(lcData_param+2) = (Property_Value >> 16);
+ case THREE_BYTE_VALUE:
+ *(lcData_param+2) = Property_Value ;
*(lcData_param+3) = Property_Value >> 8;
- *(lcData_param+4) = Property_Value ;
- *plength = length;
+ *(lcData_param+4) = Property_Value >> 16;
+ *plength = 5;
break;
- case 6:
- *(lcData_param+2) = (Property_Value >> 24);
- *(lcData_param+3) = (Property_Value >> 16);
- *(lcData_param+4) = Property_Value >> 8;
- *(lcData_param+5) = Property_Value ;
- *plength = length;
+ case FOUR_BYTE_VALUE:
+ *(lcData_param+2) = Property_Value;
+ *(lcData_param+3) = Property_Value >> 8;
+ *(lcData_param+4) = Property_Value >> 16;
+ *(lcData_param+5) = Property_Value >> 24 ;
+ *plength = 6;
break;
@@ -431,7 +464,7 @@ MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
MOBLEUINT8 length = sizeof(Light_Property_Table.LC_PropertyTable8b)/sizeof(Light_Property_Table.LC_PropertyTable8b[0]);
MOBLEUINT8 valid_flag = 0;
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(prop_ID == Light_Property_Table.LC_PropertyTable8b[i].Property_ID)
{
@@ -444,7 +477,7 @@ MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
length = sizeof(Light_Property_Table.LC_PropertyTable16b)/sizeof(Light_Property_Table.LC_PropertyTable16b[0]);
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(prop_ID == Light_Property_Table.LC_PropertyTable16b[i].Property_ID)
{
@@ -457,7 +490,7 @@ MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
length = sizeof(Light_Property_Table.LC_PropertyTable24b)/sizeof(Light_Property_Table.LC_PropertyTable24b[0]);
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(prop_ID == Light_Property_Table.LC_PropertyTable24b[i].Property_ID)
{
@@ -470,7 +503,7 @@ MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
length = sizeof(Light_Property_Table.LC_PropertyTableFloat)/sizeof(Light_Property_Table.LC_PropertyTableFloat[0]);
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(prop_ID == Light_Property_Table.LC_PropertyTableFloat[i].Property_ID)
{
@@ -494,41 +527,47 @@ MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
* @param property_ID: Property id of the parameter.
* @retval MOBLEUINT32
*/
-MOBLEUINT32 Light_LC_GetPropertyID_value(MOBLEUINT16 property_ID)
+MOBLEUINT32 Light_LC_GetPropertyID_value(MOBLEUINT16 property_ID,MOBLEUINT16 *value_length)
{
- MOBLEUINT8 length = sizeof(Light_Property_Table.LC_PropertyTable8b)/sizeof(Light_Property_Table.LC_PropertyTable8b[0]);
+ MOBLEUINT8 length;
- for(int i=0;i <= length;i++)
+ length = sizeof(Light_Property_Table.LC_PropertyTable8b)/sizeof(Light_Property_Table.LC_PropertyTable8b[0]);
+
+ for(int i=0;i < length;i++)
{
if(property_ID == Light_Property_Table.LC_PropertyTable8b[i].Property_ID)
{
+ *value_length = ONE_BYTE_VALUE;
return Light_Property_Table.LC_PropertyTable8b[i].Property_Value_8b;
}
}
length = sizeof(Light_Property_Table.LC_PropertyTable16b)/sizeof(Light_Property_Table.LC_PropertyTable16b[0]);
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(property_ID == Light_Property_Table.LC_PropertyTable16b[i].Property_ID)
{
+ *value_length = TWO_BYTE_VALUE;
return Light_Property_Table.LC_PropertyTable16b[i].Property_Value_16;
}
}
length = sizeof(Light_Property_Table.LC_PropertyTable24b)/sizeof(Light_Property_Table.LC_PropertyTable24b[0]);
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(property_ID == Light_Property_Table.LC_PropertyTable24b[i].Property_ID)
{
+ *value_length = THREE_BYTE_VALUE;
return Light_Property_Table.LC_PropertyTable24b[i].Property_Value_24b;
}
}
length = sizeof(Light_Property_Table.LC_PropertyTableFloat)/sizeof(Light_Property_Table.LC_PropertyTableFloat[0]);
- for(int i=0;i <= length;i++)
+ for(int i=0;i < length;i++)
{
if(property_ID == Light_Property_Table.LC_PropertyTableFloat[i].Property_ID)
{
+ *value_length = FOUR_BYTE_VALUE;
return (MOBLEUINT32)Light_Property_Table.LC_PropertyTableFloat[i].Property_Value_float;
}
}
@@ -538,6 +577,21 @@ MOBLEUINT32 Light_LC_GetPropertyID_value(MOBLEUINT16 property_ID)
}
+
+/**
+* @brief Get_LengthInByteProprtyValue:Function return the length of the byte length
+* of the Property value.
+* @param MOBLEUINT16.
+* retval MOBLEUINT16.
+*/
+MOBLEUINT16 Get_LengthInByteProprtyValue(MOBLEUINT16 property_ID)
+{
+ MOBLEUINT16 prop_value_length = 0;
+
+ Light_LC_GetPropertyID_value(property_ID,&prop_value_length);
+ return prop_value_length;
+
+}
#endif
/**
@@ -556,10 +610,10 @@ MOBLE_RESULT Light_LC_ModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_
return MOBLE_RESULT_SUCCESS;
}
-
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
/**
* @brief Light_LC_ModelServer_GetStatusRequestCb : This function is call-back
-from the library to send response to the message from peer
+* from the library to send response to the message from peer
* @param peer_addr: Address of the peer
* @param dst_peer: destination send by peer for this node. It can be a
* unicast or group address
@@ -621,7 +675,7 @@ MOBLE_RESULT Light_LC_ModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
/**
* @brief Light_LC_ModelServer_ProcessMessageCb: This is a callback function from
-the library whenever a Generic Model message is received
+* the library whenever a Generic Model message is received
* @param peer_addr: Address of the peer
* @param dst_peer: destination send by peer for this node. It can be a
* unicast or group address
@@ -644,8 +698,19 @@ MOBLE_RESULT Light_LC_ModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 property_ID;
+ MOBLEUINT16 prop_length;
+ MOBLE_ADDRESS publishAddress;
+ MOBLEUINT8 elementNumber;
+ MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
+ MOBLEUINT16 model_ID;
+ MOBLE_ADDRESS my_Address;
+
+ Dst_Peer = dst_peer;
+ my_Address = BLEMesh_GetAddress();
TRACE_M(TF_LIGHT_LC,"dst_peer = %.2X , peer_add = %.2X, opcode= %.2X,response= %.2X \r\n ",dst_peer, peer_addr, opcode,response);
+
switch(opcode)
{
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
@@ -654,38 +719,29 @@ MOBLE_RESULT Light_LC_ModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case LIGHT_LC_MODE_SET_UNACK:
{
Light_LC_ModeSet(pRxData,dataLength);
- break;
- }
- case LIGHT_LC_MODE_STATUS:
- {
- Light_LC_Client_Mode_Status(pRxData, dataLength);
+ modelStateChangeFlag = MOBLE_TRUE;
+ model_ID =(MOBLEUINT16)LIGHT_MODEL_SERVER_LC_MODEL_ID;
break;
}
case LIGHT_LC_OM_SET:
case LIGHT_LC_OM_SET_UNACK:
{
Light_LC_OMSet(pRxData,dataLength);
- break;
- }
- case LIGHT_LC_OM_STATUS:
- {
- Light_LC_Client_OM_Status(pRxData, dataLength);
+ modelStateChangeFlag = MOBLE_TRUE;
+ model_ID =(MOBLEUINT16)LIGHT_MODEL_SERVER_LC_MODEL_ID;
break;
}
case LIGHT_LC_ON_OFF_SET:
case LIGHT_LC_ON_OFF_SET_UNACK:
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[6])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[1])))
{
Light_LC_OnOffSet(pRxData,dataLength);
+ modelStateChangeFlag = MOBLE_TRUE;
+ model_ID =(MOBLEUINT16)LIGHT_MODEL_SERVER_LC_MODEL_ID;
}
break;
}
- case LIGHT_LC_ON_OFF_STATUS:
- {
- Light_LC_Client_ON_OFF_Status(pRxData, dataLength);
- break;
- }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
@@ -693,12 +749,28 @@ MOBLE_RESULT Light_LC_ModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case LIGHT_LC_PROPERTY_SET:
case LIGHT_LC_PROPERTY_SET_UNACK:
{
+ property_ID = (pRxData[0] | pRxData[1] << 8);
+ prop_length = dataLength -2;
+ if((property_ID != 0x00) && (prop_length == Get_LengthInByteProprtyValue(property_ID)))
+ {
Light_LC_PropertySet(pRxData,dataLength);
+ modelStateChangeFlag = MOBLE_TRUE;
+ model_ID =(MOBLEUINT16)LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID;
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
break;
}
- case LIGHT_LC_PROPERTY_STATUS:
+ case LIGHT_LC_PROPERTY_GET:
+ {
+ property_ID = (pRxData[0] | pRxData[1] << 8);
+ if(property_ID == 0x00)
{
- Light_LC_Client_Property_Status(pRxData, dataLength);
+ result = MOBLE_RESULT_FAIL;
+ }
break;
}
#endif
@@ -708,15 +780,31 @@ MOBLE_RESULT Light_LC_ModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
} /* Switch ends */
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
+ if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
{
- Model_SendResponse(peer_addr,dst_peer,opcode,pRxData,dataLength);
+ Model_SendResponse(peer_addr,my_Address,opcode,pRxData,dataLength);
+ }
+ /*
+ Publish the status to publish address if the publication is set by client
+ publication is independent of the response of the message.if thek condition
+ for publication is full filled as per specification then the status will be
+ published.
+ */
+ elementNumber = BLE_GetElementNumber();
+ publishAddress = BLEMesh_GetPublishAddress(elementNumber,model_ID);
+
+ if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE)
+ && (ADDRESS_IS_UNICAST(dst_peer)))
+ {
+ Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
+
+ modelStateChangeFlag = MOBLE_FALSE;
+ TRACE_I(TF_LIGHT_LC,"Publishing state to the address %.2X \r\n",publishAddress);
}
return MOBLE_RESULT_SUCCESS;
}
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
/**
* @brief Light_LC_Fsm: This function is state machine for the light lc
controller,which works on the light on off event and sensor occupany event. it
@@ -729,17 +817,11 @@ void Light_LC_Fsm(void)
{
MOBLEUINT32 resetTime = Clock_Time();
MOBLEUINT32 delta = resetTime - Timer_value;
- MOBLEUINT8 data_Buff[6];
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLE_ADDRESS srcAdd;
MOBLEUINT16 state_Value = 0;
MOBLEUINT16 LightnessValue;
MOBLEUINT16 luxLightnessvalue = 0;
- MOBLEUINT16 opcode;
- MOBLEUINT8 transitionTime;
- MOBLEUINT32 length = 5;
+ MOBLEUINT16 prop_value_length;
- static MOBLEUINT8 Publish_flag = 0;
static MOBLEUINT32 wait_time;
switch(LightLC_States.Lc_States)
@@ -754,9 +836,8 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
/* getting the Lightness on value from the table.*/
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -764,10 +845,10 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
TRACE_I(TF_LIGHT_LC,"STANDBY STATE --> FADE ON STATE , LIGHT ON EVENT \r\n\n");
}
else if(Lc_Event == LC_OCCUPANCY_ON)
@@ -778,9 +859,8 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
/* getting the Lightness on value from the table.*/
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -788,11 +868,9 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
-
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
TRACE_I(TF_LIGHT_LC,"STANDBY STATE --> FADE ON STATE , OCCUPANCY ON EVENT \r\n\n");
}
else
@@ -803,15 +881,14 @@ void Light_LC_Fsm(void)
}
case LC_FADE_ON:
{
+ Light_LC_Param.Present_Light_OnOff = Light_LC_Param.Target_Light_OnOff;
if(Lc_Event == LC_LIGHT_OFF)
{
/* set the light 0x00 with transition time already by the light LC on off set */
LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
-
/* getting the Lightness on value from the table.*/
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID);
@@ -819,11 +896,11 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
/* Getting the wait time for the timer on the state */
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Publish_flag = 1;
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
TRACE_I(TF_LIGHT_LC,"FADE ON STATE --> RUN STATE, LIGHT OFF EVENT \r\n\n");
}
else
@@ -835,10 +912,10 @@ void Light_LC_Fsm(void)
if(delta > wait_time)
{
LightLC_States.Lc_States = LC_RUN;
- wait_time = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_RUN_ON_ID);
+ wait_time = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_RUN_ON_ID,&prop_value_length);
Timer_value = resetTime;
Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC,"FADE ON STATE --> RUN STATE , wait time = %ld \r\n\n",wait_time);
+ TRACE_I(TF_LIGHT_LC,"FADE ON STATE --> RUN STATE , wait time = %d \r\n",wait_time);
}
}
break;
@@ -850,9 +927,8 @@ void Light_LC_Fsm(void)
LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
/* getting the Lightness on value from the table*/
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID);
@@ -860,11 +936,11 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"RUN STATE --> STANDBY MANUAL STATE , LIGHT OFF EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"RUN STATE --> STANDBY MANUAL STATE , LIGHT OFF EVENT \r\n");
}
else if(Lc_Event == LC_OCCUPANCY_ON)
{
@@ -899,8 +975,7 @@ void Light_LC_Fsm(void)
{
LightLC_States.Lc_States = LC_FADE;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_PROLONG_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_PROLONG_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_PROLONG_ID);
@@ -908,13 +983,13 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ID);
- Publish_flag = 1;
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
Timer_value = resetTime;
Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC,"RUN STATE --> FADE STATE , wait time = %ld \r\n\n",wait_time);
+ TRACE_I(TF_LIGHT_LC,"RUN STATE --> FADE STATE , wait time = %d \r\n",wait_time);
}
}
else
@@ -930,8 +1005,7 @@ void Light_LC_Fsm(void)
/* set the light 0x00 with transition time already by the light LC on off set */
LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID);
@@ -939,11 +1013,11 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"FADE STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"FADE STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n");
}
else if(Lc_Event == LC_OCCUPANCY_ON)
{
@@ -952,9 +1026,8 @@ void Light_LC_Fsm(void)
then the next state is fade on state.
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -962,13 +1035,13 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Lc_Event = LC_TIMER_OFF;
Timer_value = resetTime;
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"FADE STATE --> FADE ON STATE , OCCUPANCY ON EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"FADE STATE --> FADE ON STATE , OCCUPANCY ON EVENT \r\n");
}
else if(Lc_Event == LC_LIGHT_ON)
{
@@ -978,8 +1051,7 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -987,13 +1059,13 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC,"FADE STATE --> FADE ON STATE , LIGHT ON EVENT \r\n\n");
+ TRACE_I(TF_LIGHT_LC,"FADE STATE --> FADE ON STATE , LIGHT ON EVENT \r\n");
}
else if(Lc_Event == LC_TIMER_OFF)
{
@@ -1004,10 +1076,10 @@ void Light_LC_Fsm(void)
if(delta > wait_time)
{
LightLC_States.Lc_States = LC_PROLONG;
- wait_time = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_PROLONG_ID);
+ wait_time = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_PROLONG_ID,&prop_value_length);
Timer_value = resetTime;
Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC,"FADE STATE --> PROLONG STATE , wait time = %ld \r\n\n",wait_time);
+ TRACE_I(TF_LIGHT_LC,"FADE STATE --> PROLONG STATE , wait time = %d \r\n",wait_time);
}
}
else
@@ -1023,8 +1095,7 @@ void Light_LC_Fsm(void)
/* set the light 0x00 with transition time already by the light LC on off set */
LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID);
@@ -1032,11 +1103,11 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"PROLONG STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"PROLONG STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n");
}
else if(Lc_Event == LC_OCCUPANCY_ON)
{
@@ -1046,8 +1117,7 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -1055,12 +1125,12 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> FADE ON STATE , OCCUPANCY ON EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> FADE ON STATE , OCCUPANCY ON EVENT \r\n");
}
else if(Lc_Event == LC_LIGHT_ON)
{
@@ -1070,8 +1140,7 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -1079,12 +1148,12 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"PROLONG STATE --> FADE ON STATE , LIGHT ON EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"PROLONG STATE --> FADE ON STATE , LIGHT ON EVENT \r\n");
}
else if(Lc_Event == LC_TIMER_OFF)
{
@@ -1097,8 +1166,7 @@ void Light_LC_Fsm(void)
{
LightLC_States.Lc_States = LC_FADE_STANDBY_AUTO;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID);
@@ -1106,12 +1174,12 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_ID);
- Publish_flag = 1;
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC,"PROLONG STATE --> STANDBY AUTO STATE , wait time = %ld \r\n\n",wait_time);
+ TRACE_I(TF_LIGHT_LC,"PROLONG STATE --> STANDBY AUTO STATE , wait time = %d \r\n",wait_time);
}
}
else
@@ -1127,8 +1195,7 @@ void Light_LC_Fsm(void)
/* set the light 0x00 with transition time already by the light LC on off set */
LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_STANDBY_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID);
@@ -1136,11 +1203,11 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"STANDBY AUTO STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"STANDBY AUTO STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n");
}
else if(Lc_Event == LC_OCCUPANCY_ON)
{
@@ -1150,8 +1217,7 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -1159,12 +1225,12 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> FADE ON STATE , OCCUPANCY ON EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> FADE ON STATE , OCCUPANCY ON EVENT \r\n");
}
else if(Lc_Event == LC_LIGHT_ON)
{
@@ -1174,8 +1240,7 @@ void Light_LC_Fsm(void)
*/
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -1183,12 +1248,12 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> FADE ON STATE , LIGHT ON EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> FADE ON STATE , LIGHT ON EVENT \r\n");
}
else if(Lc_Event == LC_TIMER_OFF)
{
@@ -1201,7 +1266,7 @@ void Light_LC_Fsm(void)
LightLC_States.Lc_States = LC_STANDBY;
Lc_Event = LC_NO_EVENT;
Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> STANDBY STATE , wait time = %ld \r\n\n",wait_time);
+ TRACE_I(TF_LIGHT_LC,"STANDBY AUTO --> STANDBY STATE , wait time = %d \r\n",wait_time);
}
}
else
@@ -1219,8 +1284,8 @@ void Light_LC_Fsm(void)
if(Lc_Event == LC_LIGHT_ON)
{
LightLC_States.Lc_States = LC_FADE_ON;
- opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
- LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID);
+
+ LightnessValue = Light_LC_GetPropertyID_value(LIGHT_CONTROL_LIGHTNESS_ON_ID,&prop_value_length);
/* getting the Lightness value after complete calculation from the ambient
Lux Level and Lux Level output from state machine.*/
luxLightnessvalue = Light_LC_LuxLevelOutputValue(LIGHT_CONTROL_LUX_LEVEL_ON_ID);
@@ -1228,12 +1293,12 @@ void Light_LC_Fsm(void)
table and Lux Level Output.
*/
state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
+ Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- transitionTime = Light_LC_GetPropertyID_value(LIGHT_CONTROL_TIME_FADE_ON_ID);
wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
Timer_value = resetTime;
- Publish_flag = 1;
- TRACE_I(TF_LIGHT_LC,"STANDBY MANUAL STATE --> FADE ON STATE , LIGHT ON EVENT \r\n\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
+ TRACE_I(TF_LIGHT_LC,"STANDBY MANUAL STATE --> FADE ON STATE , LIGHT ON EVENT \r\n");
}
else
{
@@ -1246,7 +1311,7 @@ void Light_LC_Fsm(void)
LightLC_States.Lc_States = LC_STANDBY;
Lc_Event = LC_NO_EVENT;
Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC,"STANDBY MANUAL STATE --> STANDBY STATE , wait time = %ld \r\n\n",wait_time);
+ TRACE_I(TF_LIGHT_LC,"STANDBY MANUAL STATE --> STANDBY STATE , wait time = %d \r\n",wait_time);
}
}
break;
@@ -1256,37 +1321,85 @@ void Light_LC_Fsm(void)
break;
}
}
- if(Publish_flag == 1)
+}
+
+/**
+* @brief Light_LC_TransitionBehaviourSingle_Param funtion is used for the Light LC Lightness model
+* when transition time is received in message.This function is used for
+* single paramter transition.
+* @param GetValue: Pointer of the array
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Light_LC_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
{
- if(Light_LC_Param.Transition_Time == 0x00)
+
+ static MOBLEUINT8 Clockflag = 0;
+ static MOBLEUINT32 Check_time;
+ MOBLEUINT16 targetRange;
+ MOBLEUINT16 targetSlot;
+
+ if(Clockflag == 0)
+ {
+ Check_time = Clock_Time();
+ Clockflag = 1;
+ }
+ /* Values from application are copied into temporary vaiables for processing */
+ Light_LC_TemporaryStatus.PresentParam_1 = GetValue[1] << 8;
+ Light_LC_TemporaryStatus.PresentParam_1 |= GetValue[0];
+ /*if condition to wait untill the time is equal to the given resolution time */
+ if(((Clock_Time()- Check_time) >= Light_LC_TimeParam.Res_Value))
+ {
+ if(Light_LC_TimeParam.StepValue == 0)
{
+ Light_LC_TimeParam.StepValue = 1;
+ }
+ if(Light_LC_TemporaryStatus.TargetParam_1 > Light_LC_TemporaryStatus.PresentParam_1)
+ {
+ /* calulating the target range to be acheived which is traget value
+ which is traget value minus present value if target value is greater
+ than present value.
+ */
+ targetRange = Light_LC_TemporaryStatus.TargetParam_1 - Light_LC_TemporaryStatus.PresentParam_1;
+ /*target slot = time to cover in single step */
+ targetSlot = targetRange/Light_LC_TimeParam.StepValue;
+ /* target slot added to present value to achieve target value */
+ Light_LC_TemporaryStatus.PresentParam_1 += targetSlot;
}
-
- data_Buff[0] = state_Value;
- data_Buff[1] = state_Value >> 8;
- data_Buff[2] = TidSend;
- data_Buff[3] = transitionTime;
- TidSend++;
- if(TidSend >= MAX_TID_VALUE)
+ else
{
- TidSend = 0;
+ /* if present value is greater than target value, this condition executes */
+ targetRange = Light_LC_TemporaryStatus.PresentParam_1 - Light_LC_TemporaryStatus.TargetParam_1;;
+ targetSlot = targetRange/Light_LC_TimeParam.StepValue;
+ Light_LC_TemporaryStatus.PresentParam_1 -= targetSlot;
}
- srcAdd = BLEMesh_GetAddress();
- result = BLEMesh_SetRemotePublication(LIGHT_MODEL_SERVER_LC_MODEL_ID, srcAdd ,
- opcode ,
- data_Buff, length,
- MOBLE_FALSE, MOBLE_FALSE);
+ Light_LC_TimeParam.StepValue--;
+ /* updating the remaining time after each step covered*/
+ Light_LC_Param.Remaining_Time = Light_LC_TimeParam.StepValue | (Light_LC_TimeParam.ResBitValue << 6) ;
+ Light_LC_ModelFlag.LightLCUpdateFlag = VALUE_UPDATE_SET;
+ Check_time = 0;
+ Clockflag = 0;
- if(result)
+ /* when transition is completed, disable the transition by disabling
+ transition flag
+ */
+ if(Light_LC_TimeParam.StepValue == 0)
{
- TRACE_I(TF_LIGHT_LC,"Publication Error \r\n");
+ Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_STOP;
+ Light_LC_ModelFlag.Transition_Cmplt = 1;
+ Light_LC_Param.Present_Light_OnOff = Light_LC_Param.Target_Light_OnOff;
}
- Publish_flag = 0;
+
+ TRACE_M(TF_LIGHT,"Inside light lightness transmition time at %d, Current state 0x%.2x ,target state 0x%.2x , Remaining Time 0x%.2x\n\r",
+ Clock_Time(),Light_LC_TemporaryStatus.PresentParam_1,Light_LC_TemporaryStatus.TargetParam_1,\
+ Light_LC_Param.Remaining_Time);
+
+
}
+
+ return MOBLE_RESULT_SUCCESS;
}
-
/**
* @brief Light_LC_GetStepValue: This function calculates values for transition time
* @param stepParam: Transition time set value of particular model message.
@@ -1323,20 +1436,62 @@ MOBLEUINT32 Light_LC_GetStepValue(MOBLEUINT8 stepParam)
*/
MOBLEUINT32 Get_TimeToWait(MOBLEUINT16 Proprety_ID)
{
- MOBLEUINT32 getValue32;
- MOBLEUINT8 getValue8;
MOBLEUINT32 total_time;
- getValue32 = Light_LC_GetPropertyID_value(Proprety_ID);
+ MOBLEUINT16 length;
+ if(Light_LC_Param.Transition_Time > 0x00)
+ {
+ total_time = (MOBLEUINT32)Light_LC_GetStepValue((MOBLEUINT8)Light_LC_Param.Transition_Time);
+ }
+ else
+ {
+ total_time = Light_LC_GetPropertyID_value(Proprety_ID,&length);
+ Light_LC_TimeParam.Res_Value = TRANSITION_RES_VALUE;
+ Light_LC_TimeParam.StepValue = total_time/Light_LC_TimeParam.Res_Value;
- getValue8 = (MOBLEUINT8)(getValue32 & 0x000000FF);
- total_time = Light_LC_GetStepValue((MOBLEUINT8)getValue8);
+ }
- TRACE_I(TF_LIGHT_LC,"TOTAL WAIT TIME %ld \r\n",total_time);
+ TRACE_I(TF_LIGHT_LC,"TOTAL WAIT TIME %lu \r\n",total_time);
return total_time;
}
/**
+* @brief GenericOnOff_Light_LC_Binding: Data binding b/w Generic On Off and
+* light LC on off. this function will set the light LC on off
+* value at the time of generic on off set.
+* @param onOff_param: Pointer to the data which needs to be checked.
+* return void.
+*/
+void Light_LC_OnOff_Generic_OnOffBinding(void)
+{
+ Light_LC_GenericOnOffBinding(&Light_LC_Param);
+
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_ON_OFF_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_MODEL_SERVER_ONOFF_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+}
+/**
+* @brief GenericOnOff_Light_LC_Binding: Data binding b/w Generic On Off and
+* light LC on off. this function will set the light LC on off
+* value at the time of generic on off set.
+* @param onOff_param: Pointer to the data which needs to be checked.
+* return void.
+*/
+void GenericOnOff_Light_LC_Binding(Generic_OnOffStatus_t* onOff_param)
+{
+ if(onOff_param->Present_OnOff_State == 0x00)
+ {
+ Light_LC_Param.Present_Light_OnOff = 0x00;
+ }
+ else
+ {
+ Light_LC_Param.Present_Light_OnOff = 0x01;
+ }
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LC_ON_OFF_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_MODEL_SERVER_LC_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
+}
+/**
* @brief Light_control_Process: Function to execute the transition state machine for
* particular Light LC model and state machine Light LC application
* @param void
@@ -1344,15 +1499,44 @@ MOBLEUINT32 Get_TimeToWait(MOBLEUINT16 Proprety_ID)
*/
void Light_control_Process(void)
{
-
+ MOBLEUINT8 Light_GetBuff[8];
+ MOBLEUINT8 const pRxData[12] = {0};
+ MOBLEUINT32 dataLength = 0;
+ MOBLE_ADDRESS publishAddress;
+ MOBLEUINT8 elementNumber;
+ MOBLE_ADDRESS my_Address;
if(Light_LC_Param.LC_mode == LC_MODE_ENABLE)
{
Light_LC_Fsm();
+
+ if(Light_LC_ModelFlag.Light_LC_Transition_Flag == LIGHT_LC_TRANSITION_START)
+ {
+ (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff);
+ Light_LC_TransitionBehaviourSingle_Param(Light_GetBuff);
+ if(Light_LC_ModelFlag.LightLCUpdateFlag == VALUE_UPDATE_SET)
+ {
+ Light_LC_LightnessStateUpdate_Process(&Light_LC_TemporaryStatus);
+ Light_LC_ModelFlag.LightLCUpdateFlag = VALUE_UPDATE_RESET;
+ }
+ }
+
+ if(Light_LC_ModelFlag.Transition_Cmplt == MOBLE_TRUE)
+ {
+ elementNumber = BLE_GetElementNumber();
+ my_Address = BLEMesh_GetAddress();
+ publishAddress = BLEMesh_GetPublishAddress(elementNumber,LIGHT_MODEL_SERVER_LC_MODEL_ID);
+ if(publishAddress != 0x0000)
+ {
+ Model_SendResponse(publishAddress,my_Address,LIGHT_LC_ON_OFF_SET_UNACK,pRxData,dataLength);
+ }
+ TRACE_I(TF_LIGHT_LC,"PUBLISHING OF LIGHT LC AT END OF TRANSITION \r\n");
+ Light_LC_ModelFlag.Transition_Cmplt = MOBLE_FALSE;
+ }
}
else
{
/* Light LC on off set to off */
- Light_LC_Param.Light_OnOff = 0x0;
+ Light_LC_Param.Present_Light_OnOff = 0x0;
LightLC_States.Lc_States = LC_STANDBY;
}
}
@@ -1368,8 +1552,9 @@ MOBLEUINT16 Light_LC_LuxLevelOutputValue(MOBLEUINT16 property_ID)
MOBLEUINT16 availableLuxValue;
MOBLEUINT16 ambientLuxValue;
MOBLEUINT16 lightnessOutput;
+ MOBLEUINT16 length;
- availableLuxValue = Light_LC_GetPropertyID_value(property_ID);
+ availableLuxValue = Light_LC_GetPropertyID_value(property_ID,&length);
ambientLuxValue = Appli_LightLC_GetStatus_cb.GetLightLC_AmbientLuxLevel_cb();
lightnessOutput = Appli_LightLC_GetStatus_cb.GetLightLC_PIregulatorOut_cb(availableLuxValue,ambientLuxValue);
@@ -1402,79 +1587,6 @@ MOBLEUINT16 Light_LC_MaxLightnessValue(MOBLEUINT16 Param1,MOBLEUINT16 Param2)
}
#endif
-
-/*
-* @brief Light_LC_Client_Mode_Status: Function called when status of the model
- received on the client.
-* @param pLightLc_status: pointer to the parameters received for message
-* @param pLength: Length of the parameters received for message
-* return MOBLE_RESULT_SUCCESS.
-*/
-MOBLE_RESULT Light_LC_Client_Mode_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength)
-{
- MOBLEUINT32 i;
-
- TRACE_M(TF_LIGHT,"Light_LC_Client_Mode_Status callback received \r\n");
- for(i = 0; i < pLength; i++)
- TRACE_M(TF_SERIAL_CTRL,"Light_LC_Client_Mode_Status: %d\r\n",
- pLightLc_status[i]);
- return MOBLE_RESULT_SUCCESS;
-}
-
-/*
-* @brief Light_LC_Client_OM_Status: Function called when status of the model
- received on the client.
-* @param pLightLc_status: pointer to the parameters received for message
-* @param pLength: Length of the parameters received for message
-* return MOBLE_RESULT_SUCCESS.
-*/
-MOBLE_RESULT Light_LC_Client_OM_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength)
-{
- MOBLEUINT32 i;
-
- TRACE_M(TF_LIGHT,"Light_LC_Client_OM_Status callback received \r\n");
- for(i = 0; i < pLength; i++)
- TRACE_M(TF_SERIAL_CTRL,"Light_LC_Client_OM_Status: %d\r\n",
- pLightLc_status[i]);
- return MOBLE_RESULT_SUCCESS;
-}
-
-/*
-* @brief Light_LC_Client_ON_OFF_Status: Function called when status of the model
- received on the client.
-* @param pLightLc_status: pointer to the parameters received for message
-* @param pLength: Length of the parameters received for message
-* return MOBLE_RESULT_SUCCESS.
-*/
-MOBLE_RESULT Light_LC_Client_ON_OFF_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength)
-{
- MOBLEUINT32 i;
-
- TRACE_M(TF_LIGHT,"Light_LC_Client_ON_OFF_Status callback received \r\n");
- for(i = 0; i < pLength; i++)
- TRACE_M(TF_SERIAL_CTRL,"Light_LC_Client_ON_OFF_Status: %d\r\n",
- pLightLc_status[i]);
- return MOBLE_RESULT_SUCCESS;
-}
-
-/*
-* @brief Light_LC_Client_Property_Status: Function called when status of the model
- received on the client.
-* @param pLightLc_status: pointer to the parameters received for message
-* @param pLength: Length of the parameters received for message
-* return MOBLE_RESULT_SUCCESS.
-*/
-MOBLE_RESULT Light_LC_Client_Property_Status(MOBLEUINT8 const *pLightLc_status, MOBLEUINT32 pLength)
-{
- MOBLEUINT32 i;
-
- TRACE_M(TF_LIGHT,"Light_LC_Client_Property_Status callback received \r\n");
- for(i = 0; i < pLength; i++)
- TRACE_M(TF_SERIAL_CTRL,"Light_LC_Client_Property_Status: %d\r\n",
- pLightLc_status[i]);
- return MOBLE_RESULT_SUCCESS;
-}
-
/**
* @}
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/meshdfu_node.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/meshdfu_node.c
index b1d01e64a..f02a84b9d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/meshdfu_node.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/meshdfu_node.c
@@ -44,7 +44,7 @@
#include "common.h"
#include <string.h>
#include "compiler.h"
-#include "Math.h"
+#include "math.h"
#include "meshdfu_node.h"
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c
index dc387b794..06871f20b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c
@@ -46,7 +46,7 @@
#include "light_lc.h"
#include <string.h>
#include "compiler.h"
-#include "Math.h"
+#include "math.h"
/** @addtogroup MODEL_SENSOR
* @{
@@ -74,7 +74,7 @@ const MODEL_OpcodeTableParam_t Sensor_Opcodes_Table[] = {
#ifdef ENABLE_SENSOR_MODEL_SERVER
{SENSOR_SERVER_MODEL_ID ,SENSOR_DESCRIPTOR_GET, MOBLE_TRUE, 0, 2, SENSOR_DESCRIPTOR_STATUS , 2, 75},
- {SENSOR_SERVER_MODEL_ID ,SENSOR_DESCRIPTOR_STATUS, MOBLE_FALSE, 2, 75, SENSOR_DESCRIPTOR_STATUS , 2, 75},
+ {SENSOR_SERVER_MODEL_ID ,SENSOR_DESCRIPTOR_STATUS, MOBLE_FALSE, 2, 75, 0 , 2, 75},
{SENSOR_SERVER_MODEL_ID ,SENSOR_GET, MOBLE_TRUE, 0, 2, SENSOR_STATUS , 0,65 }, /* STATUS MESSAGE AS MARSHALLED DATA */
{SENSOR_SERVER_MODEL_ID ,SENSOR_STATUS, MOBLE_FALSE, 0, 65, 0 , 0,65 },
{SENSOR_SERVER_MODEL_ID ,SENSOR_COLUMN_GET, MOBLE_TRUE, 3, 3, SENSOR_COLUMN_STATUS , 4, 8}, /* GET VARIABLE TAKEN AS 1 (2+VARIABLE) */
@@ -296,8 +296,10 @@ MOBLE_RESULT Sensor_Setting_Set(const MOBLEUINT8* pSetting_param, MOBLEUINT32 le
* @param length: length of the data in packet.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Sensor_Setting_Status_PID(MOBLEUINT8* pSetting_param, MOBLEUINT32 *plength
- ,const MOBLEUINT8 *pData,MOBLEUINT32 length)
+MOBLE_RESULT Sensor_Setting_Status_PID(MOBLEUINT8* pSetting_param,
+ MOBLEUINT32 *plength,
+ const MOBLEUINT8 *pData,
+ MOBLEUINT32 length)
{
MOBLEUINT8 Sensor_GetBuff[4];
MOBLEUINT16 propery_ID;
@@ -394,6 +396,8 @@ MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT32 dataLength,
MOBLEBOOL response)
{
+ TRACE_M(TF_SENSOR,"dst_peer = %.2X , peer_add = %.2X, opcode = %.2X, response= %.2X \r\n ",
+ dst_peer, peer_addr, opcode, response);
switch(opcode)
{
#ifdef ENABLE_SENSOR_MODEL_SERVER
@@ -483,9 +487,9 @@ MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case SENSOR_GET:
{
if((dataLength > 0) && (property_ID == 0x00))
- {
- return MOBLE_RESULT_FALSE;
- }
+ {
+ return MOBLE_RESULT_FALSE;
+ }
break;
}
@@ -512,22 +516,39 @@ MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
case SENSOR_DESCRIPTOR_STATUS:
{
+ MOBLEUINT8 index;
+
+ TRACE_M(TF_SENSOR,"Sensor Descritpor Status:\r\n");
+ for(index = 0; index < dataLength; index++)
+ {
+ TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ }
break;
}
case SENSOR_STATUS:
{
- if((dataLength > 0) && (property_ID == 0x00))
+ MOBLEUINT8 index;
+
+ if((dataLength > 0) && (property_ID == 0x00))
+ {
+ return MOBLE_RESULT_FALSE;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR,"Sensor Status:\r\n");
+ for(index = 0; index < dataLength; index++)
{
- return MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
}
+ }
- if(property_ID == PRESENCE_DETECTED_PROPERTY)
- {
+ if(property_ID == PRESENCE_DETECTED_PROPERTY)
+ {
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
Light_LC_ModeSet(&pRxData[2],1);
Light_LC_OMSet(&pRxData[2],1);
#endif
- }
+ }
break;
}
case SENSOR_COLUMN_STATUS:
@@ -536,18 +557,46 @@ MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
case SENSOR_SERIES_STATUS:
{
+ MOBLEUINT8 index;
+
+ TRACE_M(TF_SENSOR,"Sensor Series Status:\r\n");
+ for(index = 0; index < dataLength; index++)
+ {
+ TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ }
break;
}
case SENSOR_CADENCE_STATUS:
{
- break;
+ MOBLEUINT8 index;
+
+ TRACE_M(TF_SENSOR,"Sensor Cadence Status:\r\n");
+ for(index = 0; index < dataLength; index++)
+ {
+ TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
}
+ break;
+ }
case SENSOR_SETTING_STATUS_PID:
{
+ MOBLEUINT8 index;
+
+ TRACE_M(TF_SENSOR,"Sensor Settings Status:\r\n");
+ for(index = 0; index < dataLength; index++)
+ {
+ TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ }
break;
}
case SENSOR_SETTING_STATUS_SETTING_ID:
{
+ MOBLEUINT8 index;
+
+ TRACE_M(TF_SENSOR,"Sensor Setting Status:\r\n");
+ for(index = 0; index < dataLength; index++)
+ {
+ TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ }
break;
}
#endif
@@ -559,7 +608,7 @@ MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
} /* Switch ends */
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
+ if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
{
Model_SendResponse(peer_addr, dst_peer,opcode,pRxData,dataLength);
}
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c
index 4b021ee4d..184d332d3 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c
@@ -44,7 +44,7 @@
#include "common.h"
#include <string.h>
#include "compiler.h"
-#include "Math.h"
+#include "math.h"
#include "time_scene.h"
/** @addtogroup MODEL_TIME_SCENE
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c
index ae6f98e01..f65190397 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c
@@ -121,7 +121,7 @@ MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
uint16_t idx = 0;
TRACE_I(TF_VENDOR,"Vendor_WriteLocalDataCb: peer_addr=[%02x], dst_peer=[%02x],\
command=[%02x], Response=[%02x] \n\r", peer_addr, dst_peer, command, response);
- TRACE_I(TF_VENDOR,"DATA_RECEIVED length = %d\n\r",length);
+ TRACE_I(TF_VENDOR,"DATA_RECEIVED length = %ld\n\r",length);
for (idx=0; idx<length; idx++)
{
TRACE_I(TF_VENDOR,"data[%d]= %d",idx,data[idx]);
@@ -298,7 +298,7 @@ MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
/* Traces for the Data */
TRACE_M(TF_VENDOR,"Vendor_ReadLocalDataCb: peer_addr=[%02x], dst_peer_addr=[%02x],\
command=[%02x], Response=[%02x] \n\r", peer_addr, dst_peer, command, response );
- TRACE_I(TF_VENDOR,"DATA_RECEIVED length = %d\n\r",length);
+ TRACE_I(TF_VENDOR,"DATA_RECEIVED length = %ld\n\r",length);
for (MOBLEUINT8 idx=0; idx<length; idx++)
{
TRACE_I(TF_VENDOR,"data[%d]= %d",idx,data[idx]);
@@ -472,7 +472,7 @@ MOBLE_RESULT Vendor_OnResponseDataCb(MOBLE_ADDRESS peer_addr,
/* Traces for the Data */
TRACE_I(TF_VENDOR,"Vendor_OnResponseDataCb: peer_addr=[%02x], dst_peer_addr=[%02x],\
command=[%02x], Response=[%02x] \n\r", peer_addr, dst_peer, command, response );
- TRACE_I(TF_VENDOR,"DATA_RECEIVED length = %d\n\r", dataLength);
+ TRACE_I(TF_VENDOR,"DATA_RECEIVED length = %ld\n\r", dataLength);
TRACE_M(TF_VENDOR_COMMAND,"#%02hx-%02hx! \n\r",command,pRxData[0]);
switch(command)
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c
index 12ee451fd..3f9763a58 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c
@@ -82,6 +82,7 @@ MOBLEUINT32 Totaltest = 0;
/* Private function prototypes -----------------------------------------------*/
static MOBLE_RESULT SerialResponse_doubleHexToHex(MOBLEUINT8* hexArray,MOBLEUINT8* outputArray, MOBLEUINT8 length);
static MOBLEUINT16 SerialResponse_GetFunctionIndex(char *text);
+MOBLE_RESULT Read_CommandCount(MOBLE_ADDRESS src ,MOBLE_ADDRESS dst);
MOBLEUINT32 timeStampSend = 0;
MOBLE_ADDRESS srcAddress;
MOBLE_ADDRESS destAddress;
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c
index 45b0aa5c2..74f76e1c2 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c
@@ -1,43 +1,21 @@
/**
-******************************************************************************
-* @file mesh_cfg.c
-* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
-* @brief User configurable settings for BLE-Mesh
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-*
-* 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 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 STMicroelectronics nor the names of its contributors
-* may be used to endorse or promote products derived from this software
-* without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
-*
-* Initial BLE-Mesh is built over Motorola's Mesh over Bluetooth Low Energy
-* (MoBLE) technology. The present solution is developed and maintained for both
-* Mesh library and Applications solely by STMicroelectronics.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file mesh_cfg.c
+ * @author BLE Mesh Team
+ * @brief User configurable settings for BLE-Mesh
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Includes ------------------------------------------------------------------*/
#include "mesh_cfg.h"
@@ -78,6 +56,38 @@
#endif
#endif
+#if (LOW_POWER_FEATURE == 0)
+MOBLE_RESULT BnrgmFrndLpnProcess(void* param);
+MOBLE_RESULT BnrgmFrndLpnProcessFrndOffer(void* param);
+MOBLE_RESULT BnrgmFrndLpnProcessFrndUpdate(void* param);
+MOBLE_RESULT BnrgmFrndLpnProcessFrndRfu(void* param);
+MOBLE_RESULT BnrgmFrndLpnProcessFrndSubscrListConf(void* param);
+MOBLE_RESULT BnrgmFrndLpnSwitchKeys(void* param);
+MOBLE_RESULT BnrgmFrndLpnTranspSegRecvd(void* param);
+MOBLE_RESULT BnrgmFrndLpnUpdateKeys(void* param);
+MOBLE_RESULT BnrgmFrndMgmtLpnInit(void* param);
+#endif /* #if (LOW_POWER_FEATURE == 0) */
+
+#if (FRIEND_FEATURE == 0)
+void BnrgmFrndFnProcess(void* param);
+MOBLE_RESULT BnrgmFrndFnProcessFrndClear(void* param);
+MOBLE_RESULT BnrgmFrndFnProcessFrndClearConf(void* param);
+MOBLE_RESULT BnrgmFrndFnProcessFrndPoll(void* param);
+MOBLE_RESULT BnrgmFrndFnProcessFrndRequest(void* param);
+MOBLE_RESULT BnrgmFrndFnProcessFrndSubscrListAdd(void* param);
+MOBLE_RESULT BnrgmFrndFnProcessFrndSubscrListRem(void* param);
+MOBLE_RESULT BnrgmFrndFnSendFrndClear(void* param);
+MOBLE_RESULT BnrgmFrndFnSwitchKeys(void* param);
+MOBLE_RESULT BnrgmFrndFnUpdateKeys(void* param);
+MOBLE_RESULT BnrgmFrndMgmtFnInit(void* param);
+MOBLE_RESULT BnrgmFrndMgmtGetFriendshipStatus(void* param);
+MOBLEUINT32 BnrgmFrndMgmtGetLpnPollTimeout(void* param);
+MOBLE_RESULT BnrgmFrndMgmtGetSubscrStatus(void* param);
+MOBLE_RESULT BnrgmFrndMgmtQueLpnPkt(void* param);
+void BnrgmFrndMgmtSendSecurityUpdate(void* param);
+#endif /* #if (FRIEND_FEATURE == 0) */
+
+
/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
@@ -92,6 +102,7 @@ MOBLEUINT8 dyn_buffer_m[DYNAMIC_MEMORY_SIZE + \
#define MODELDATA_SIZE (MAX_APPLICATION_PACKET_SIZE+16)
#define MODELS_BUFFER_SIZE (MODELDATA_SIZE)
+
#ifdef STATIC_MEMORY_ALLOCATION_IN_APPLI
ALIGN(4)
MOBLEUINT8 aModelsBuff[MODELS_BUFFER_SIZE];
@@ -145,285 +156,527 @@ __attribute__((aligned(4)))const DynBufferParam_t DynBufferParam =
const tr_params_t TrParams = TRANSMIT_RECEIVE_PARAMS;
-//#if defined(BLUENRG1_DEVICE) || defined(BLUENRG2_DEVICE) /* BLUENRG1 or BLUENRG2 */
const lpn_params_t LpnParams = LOW_POWER_NODE_PARAMS;
-//#else
-//const lpn_params_t LpnParams;
-//#endif
const fn_params_t FnParams = FRIEND_NODE_PARAMS;
const prvn_params_t PrvnParams = UNPROV_NODE_INFO_PARAMS;
const neighbor_table_init_params_t NeighborTableParams = NEIGHBOR_TABLE_PARAMS;
/*ALIGN(4)*/
-__attribute__((aligned(4))) const MOBLEUINT16 Appli_SIG_Models[]=
+__attribute__((aligned(4))) MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+
+MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief ApplicationInitVendorModel: This function initialize the list of the
+* Vendor Models.
+* retval Count of the SIG Model Servers enabled in the Application
+*/
+MOBLE_RESULT ApplicationInitVendorModelList(void)
{
- /*****************************************************************************/
-/** Following Section places Generic MODEL Enabled Client IDs ************/
-/*****************************************************************************/
+ for(uint8_t index = 0; index < APPLICATION_NUMBER_OF_ELEMENTS; index++)
+ {
+ if(index == 0)
+ {
+ Appli_Vendor_Models[index][0] = VENDORMODEL_STMICRO_ID1;
+ Appli_Vendor_Models[index][1] = NO_MODEL_AVLBL;
+ }
+ else
+ {
+ Appli_Vendor_Models[index][0] = NO_MODEL_AVLBL;
+ }
+ }
+ return (MOBLE_RESULT_SUCCESS);
+}
+/**
+* @brief ApplicationInitSigModelList: This function initialize the list of the
+* SIG Models.
+* retval Count of the SIG Model Servers enabled in the Application
+*/
+MOBLE_RESULT ApplicationInitSigModelList(void)
+{
+ uint8_t modelCount = 0;
+
+ for(uint8_t index = 0; index < APPLICATION_NUMBER_OF_ELEMENTS; index++)
+ {
+ uint8_t modelIndex = 0;
+
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
#ifdef ENABLE_CONFIG_MODEL_CLIENT
- SIG_MODEL_ID_CONFIG_CLIENT,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_CONFIG_MODEL_CLIENT & (1 << index)) == 1) ||
+ ((ENABLE_CONFIG_MODEL_CLIENT & (1 << index)) == 2) ||
+ ((ENABLE_CONFIG_MODEL_CLIENT & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = SIG_MODEL_ID_CONFIG_CLIENT;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
- /*****************************************************************************/
- /** Following Section places GENERIC MODEL Enabled SERVER IDs ************/
- /*****************************************************************************/
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_ONOFF & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_ONOFF & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_ONOFF & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_ONOFF_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_LEVEL & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_LEVEL & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_LEVEL & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
- GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
- GENERIC_MODEL_SERVER_POWER_LEVEL_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_LEVEL_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
- GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_BATTERY
- GENERIC_MODEL_SERVER_BATTERY_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_BATTERY & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_BATTERY & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_BATTERY & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_BATTERY_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_LOCATION
- GENERIC_MODEL_SERVER_LOCATION_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_LOCATION & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_LOCATION & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_LOCATION & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_LOCATION_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
- GENERIC_MODEL_SERVER_LOCATION_SETUP_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_LOCATION_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
- GENERIC_MODEL_SERVER_ADMIN_PROPERTY_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_ADMIN_PROPERTY_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
- GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
- GENERIC_MODEL_SERVER_USER_PROPERTY_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_USER_PROPERTY_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY
- GENERIC_MODEL_SERVER_CLIENT_PROPERTY_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_CLIENT_PROPERTY_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
- /*****************************************************************************/
- /** Following Section places LIGHTING MODEL Enabled SERVER IDs ************/
- /*****************************************************************************/
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
- LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
-#endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
- LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
- LIGHT_MODEL_SERVER_CTL_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
- LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
- LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
- LIGHT_MODEL_SERVER_HSL_MODEL_ID,
- #endif
+ /**************************************************************************/
+ /** Following Section places LIGHTING MODEL Enabled SERVER IDs *********/
+ /**************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_CTL & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_CTL & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_CTL & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_CTL_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_HSL & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_HSL_HUE & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL_HUE & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL_HUE & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
- #ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
- LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID,
- #endif
+ /**************************************************************************/
+ /** Following Section places Light XYL MODEL Enabled SERVER IDs *********/
+ /**************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_XYL
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_XYL & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_XYL & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_XYL & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_XYL_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_XYL_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
- #ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
- LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
- LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID,
- #endif
-/*****************************************************************************/
-/** Following Section places Light XYL MODEL Enabled SERVER IDs ************/
-/*****************************************************************************/
- #ifdef ENABLE_LIGHT_MODEL_SERVER_XYL
- LIGHT_MODEL_SERVER_XYL_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
- LIGHT_MODEL_SERVER_XYL_SETUP_MODEL_ID,
- #endif
-
-/*****************************************************************************/
-/** Following Section places Light LC MODEL Enabled SERVER IDs ************/
-/*****************************************************************************/
- #ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- LIGHT_MODEL_SERVER_LC_MODEL_ID,
- #endif
-
- #ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
- LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID,
- #endif
-
- /*****************************************************************************/
- /** Following Section places SENSOR MODEL Enabled SERVER IDs ************/
- /*****************************************************************************/
- #ifdef ENABLE_SENSOR_MODEL_SERVER
- SENSOR_SERVER_MODEL_ID,
- #endif
-
- #ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
- SENSOR_SETUP_SERVER_MODEL_ID,
- #endif
+ /**************************************************************************/
+ /** Following Section places Light LC MODEL Enabled SERVER IDs *********/
+ /**************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LC_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_SERVER_LC_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LC_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_SERVER_LC_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
-/*****************************************************************************/
-/** Following Section places Time and Scene MODEL Enabled SERVER IDs ************/
-/*****************************************************************************/
+ /**************************************************************************/
+ /** Following Section places SENSOR MODEL Enabled SERVER IDs *********/
+ /**************************************************************************/
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_SENSOR_MODEL_SERVER & (1 << index)) == 1) ||
+ ((ENABLE_SENSOR_MODEL_SERVER & (1 << index)) == 2) ||
+ ((ENABLE_SENSOR_MODEL_SERVER & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = SENSOR_SERVER_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_SENSOR_MODEL_SERVER_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_SENSOR_MODEL_SERVER_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_SENSOR_MODEL_SERVER_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = SENSOR_SETUP_SERVER_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
+#endif
-#ifdef ENABLE_TIME_MODEL_SERVER
-TIME_MODEL_SERVER_MODEL_ID,
+ /**************************************************************************/
+ /** Following Section places Time and Scene MODEL Enabled SERVER IDs ***/
+ /**************************************************************************/
+
+#ifdef ENABLE_TIME_MODEL_SERVER
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_TIME_MODEL_SERVER & (1 << index)) == 1) ||
+ ((ENABLE_TIME_MODEL_SERVER & (1 << index)) == 2) ||
+ ((ENABLE_TIME_MODEL_SERVER & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = TIME_MODEL_SERVER_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-#ifdef ENABLE_TIME_MODEL_SERVER_SETUP
-TIME_MODEL_SERVER_SETUP_MODEL_ID,
+#ifdef ENABLE_TIME_MODEL_SERVER_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_TIME_MODEL_SERVER_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_TIME_MODEL_SERVER_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_TIME_MODEL_SERVER_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = TIME_MODEL_SERVER_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-#ifdef ENABLE_SCENE_MODEL_SERVER
-SCENE_MODEL_SERVER_MODEL_ID,
+#ifdef ENABLE_SCENE_MODEL_SERVER
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_SCENE_MODEL_SERVER & (1 << index)) == 1) ||
+ ((ENABLE_SCENE_MODEL_SERVER & (1 << index)) == 2) ||
+ ((ENABLE_SCENE_MODEL_SERVER & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = SCENE_MODEL_SERVER_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-#ifdef ENABLE_SCENE_MODEL_SERVER_SETUP
-SCENE_MODEL_SERVER_SETUP_MODEL_ID,
+#ifdef ENABLE_SCENE_MODEL_SERVER_SETUP
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_SCENE_MODEL_SERVER_SETUP & (1 << index)) == 1) ||
+ ((ENABLE_SCENE_MODEL_SERVER_SETUP & (1 << index)) == 2) ||
+ ((ENABLE_SCENE_MODEL_SERVER_SETUP & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = SCENE_MODEL_SERVER_SETUP_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-/*****************************************************************************/
-/** Following Section places Generic MODEL Enabled Client IDs ************/
-/*****************************************************************************/
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
- GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID,
+ /**************************************************************************/
+ /** Following Section places Generic MODEL Enabled Client IDs **********/
+ /**************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_CLIENT_ONOFF & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_CLIENT_ONOFF & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_CLIENT_ONOFF & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
- GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID,
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_GENERIC_MODEL_CLIENT_LEVEL & (1 << index)) == 1) ||
+ ((ENABLE_GENERIC_MODEL_CLIENT_LEVEL & (1 << index)) == 2) ||
+ ((ENABLE_GENERIC_MODEL_CLIENT_LEVEL & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
- LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
-#endif
-
-
- /*****************************************************************************/
- /** End of the SIG Server Model IDs ************/
- /*****************************************************************************/
-
- 0 /* Default entry, do NOT remove */
-};
-
-const MOBLEUINT32 Appli_Vendor_Models[]=
-{
- VENDORMODEL_STMICRO_ID1,
-
- /*****************************************************************************/
- /** End of the Vendor Server Model IDs ************/
- /*****************************************************************************/
-
- 0 /* Default entry, do NOT remove */
-};
-
-
-//ALIGN(4)
-__attribute__((aligned(4))) const MOBLEUINT16 Appli_CLIENT_Support_SIG_Models[]=
-{
- /* Array to define the Models on which subscription and Publication may work
- for the Provisioner itself */
- GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
-// GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
-// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
-// SENSOR_SERVER_MODEL_ID,
-// LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
-// LIGHT_MODEL_SERVER_LC_MODEL_ID,
- 0
-};
-
-
-#define APPLI_SIG_MODELS_COUNT ( (sizeof(Appli_SIG_Models) / sizeof(Appli_SIG_Models[0]) ) -1 )
-/* Subtracted 1 because of last default entry of 0, since users can comment all models */
-
-#define APPLI_VENDOR_MODELS_COUNT ( ( sizeof(Appli_Vendor_Models) / sizeof(Appli_Vendor_Models[0]) ) -1 )
-/* Subtracted 1 because of last default entry of 0, since users can comment all models */
-
-#define APPLI_NODE_SIG_MODELS_COUNT ( (sizeof(Appli_CLIENT_Support_SIG_Models) / sizeof(Appli_CLIENT_Support_SIG_Models[0]) ) -1 )
-/* Subtracted 1 because of last default entry of 0, since users can comment all models */
-
-#define APPLI_NODE_VENDOR_MODELS_COUNT ( ( sizeof(Appli_Vendor_Models) / sizeof(Appli_Vendor_Models[0]) ) -1 )
-/* Subtracted 1 because of last default entry of 0, since users can comment all models */
-
-/* Private function prototypes -----------------------------------------------*/
-#if (LOW_POWER_FEATURE == 0)
-MOBLE_RESULT BnrgmFrndLpnProcess(void* param);
-MOBLE_RESULT BnrgmFrndLpnProcessFrndOffer(void* param);
-MOBLE_RESULT BnrgmFrndLpnProcessFrndUpdate(void* param);
-MOBLE_RESULT BnrgmFrndLpnProcessFrndRfu(void* param);
-MOBLE_RESULT BnrgmFrndLpnProcessFrndSubscrListConf(void* param);
-MOBLE_RESULT BnrgmFrndLpnSwitchKeys(void* param);
-MOBLE_RESULT BnrgmFrndLpnTranspSegRecvd(void* param);
-MOBLE_RESULT BnrgmFrndLpnUpdateKeys(void* param);
-MOBLE_RESULT BnrgmFrndMgmtLpnInit(void* param);
-#endif /* #if (LOW_POWER_FEATURE == 0) */
-
-#if (NEIGHBOR_TABLE_SUPPORTED == 0)
-MOBLE_RESULT BLEMesh_NeighborTableInit(void* param);
-void BLEMesh_UpdateNeighbors(void* param);
-#endif /* #if (NEIGHBOR_TABLE_SUPPORTED == 0) */
-
-#if (PB_ADV_SUPPORTED == 0)
-MOBLE_RESULT MoblePBADVInit(void* param);
-MOBLE_RESULT MoblePBADVProcessData(void* param);
-MOBLE_RESULT MoblePBADVStartProvisioning(void* param);
-MOBLE_RESULT MoblePBADVStopProvisioning(void* param);
+ if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ return(MOBLE_RESULT_FAIL);
+ if(((ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS & (1 << index)) == 1) ||
+ ((ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS & (1 << index)) == 2) ||
+ ((ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS & (1 << index)) == 4))
+ {
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ modelCount++;
+ }
#endif
-
-MOBLEUINT8 ApplicationSetNodeSigModelList(void);
-
-#if (FRIEND_FEATURE == 0)
-void BnrgmFrndFnProcess(void* param);
-MOBLE_RESULT BnrgmFrndFnProcessFrndClear(void* param);
-MOBLE_RESULT BnrgmFrndFnProcessFrndClearConf(void* param);
-MOBLE_RESULT BnrgmFrndFnProcessFrndPoll(void* param);
-MOBLE_RESULT BnrgmFrndFnProcessFrndRequest(void* param);
-MOBLE_RESULT BnrgmFrndFnProcessFrndSubscrListAdd(void* param);
-MOBLE_RESULT BnrgmFrndFnProcessFrndSubscrListRem(void* param);
-MOBLE_RESULT BnrgmFrndFnSendFrndClear(void* param);
-MOBLE_RESULT BnrgmFrndFnSwitchKeys(void* param);
-MOBLE_RESULT BnrgmFrndFnUpdateKeys(void* param);
-MOBLE_RESULT BnrgmFrndMgmtFnInit(void* param);
-MOBLE_RESULT BnrgmFrndMgmtGetFriendshipStatus(void* param);
-MOBLEUINT32 BnrgmFrndMgmtGetLpnPollTimeout(void* param);
-MOBLE_RESULT BnrgmFrndMgmtGetSubscrStatus(void* param);
-MOBLE_RESULT BnrgmFrndMgmtQueLpnPkt(void* param);
-void BnrgmFrndMgmtSendSecurityUpdate(void* param);
-#endif /* #if (FRIEND_FEATURE == 0) */
-
-void* GetModelsResponseBuffer(void);
-
-/* Private functions ---------------------------------------------------------*/
+ }
+ return (MOBLE_RESULT_SUCCESS);
+}
/**
* @brief ApplicationGetSigModelList: This function provides the list of the
@@ -434,14 +687,39 @@ void* GetModelsResponseBuffer(void);
*/
MOBLEUINT8 ApplicationGetSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUINT8 elementIndex)
{
+ uint8_t count=0;
/* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
- if (APPLI_SIG_MODELS_COUNT != 0)
+ for(uint8_t index=0; index <= elementIndex; index++)
{
- memcpy(pModels_sig_ID, Appli_SIG_Models, APPLI_SIG_MODELS_COUNT*2);
+ if(index == elementIndex)
+ {
+ for(uint8_t modelCount=0; modelCount < APPLICATION_SIG_MODELS_MAX_COUNT; modelCount++)
+ {
+ if(Appli_SIG_Models[index][modelCount] == NO_MODEL_AVLBL)
+ {
+ memcpy(pModels_sig_ID, Appli_SIG_Models+index, count*2);
+ break;
+ }
+
+ else
+ {
+ count++;
+ }
+ }
+
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
}
- return APPLI_SIG_MODELS_COUNT;
+
+ return count;
}
+
/**
* @brief ApplicationGetCLIENTSigModelList: This function provides the list of the
* SIG Models to the calling function
@@ -451,15 +729,40 @@ MOBLEUINT8 ApplicationGetSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUINT8 el
*/
MOBLEUINT8 ApplicationGetCLIENTSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUINT8 elementIndex)
{
+
+ uint8_t count=0;
/* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
- if (APPLI_NODE_SIG_MODELS_COUNT != 0)
+ for(uint8_t index=0; index <= elementIndex; index++)
+ {
+ if(index == elementIndex)
{
- memcpy(pModels_sig_ID, Appli_CLIENT_Support_SIG_Models, APPLI_NODE_SIG_MODELS_COUNT*2);
+ for(uint8_t modelCount=0; modelCount < APPLICATION_SIG_MODELS_MAX_COUNT; modelCount++)
+ {
+ if(Appli_SIG_Models[index][modelCount] == NO_MODEL_AVLBL)
+ {
+ memcpy(pModels_sig_ID, Appli_SIG_Models+index, count*2);
+ break;
+ }
+
+ else
+ {
+ count++;
+ }
+ }
+
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
}
- return APPLI_SIG_MODELS_COUNT;
+
+ return count;
}
-#ifdef ENABLE_PROVISIONER_FEATURE
+
/**
* @brief ApplicationGetCLIENTSigModelList: This function provides the list of the
* SIG Models to the calling function
@@ -469,15 +772,12 @@ MOBLEUINT8 ApplicationGetCLIENTSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUI
*/
MOBLEUINT8 ApplicationSetNodeSigModelList(void)
{
- /* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
- if (APPLI_SIG_MODELS_COUNT != 0)
- {
- BLEMeshSetSelfModelList(NumberOfElements);
- }
- return APPLI_SIG_MODELS_COUNT;
+ BLEMeshSetSelfModelList(NumberOfElements);
+
+ return 1; //APPLI_SIG_MODELS_COUNT; TBD
}
-#endif
+
/**
* @brief ApplicationGetVendorModelList: This function provides the list of the
* Vendor Models to the calling function
@@ -487,12 +787,37 @@ MOBLEUINT8 ApplicationSetNodeSigModelList(void)
*/
MOBLEUINT8 ApplicationGetVendorModelList(MOBLEUINT32* pModels_vendor_ID, MOBLEUINT8 elementIndex)
{
- /* Since the Vendor Models are 4 bytes, copy 4*size for memcpy */
- if (APPLI_VENDOR_MODELS_COUNT != 0)
+
+ uint8_t count=0;
+ /* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
+ for(uint8_t index=0; index <= elementIndex; index++)
{
- memcpy(pModels_vendor_ID, Appli_Vendor_Models, APPLI_VENDOR_MODELS_COUNT*4);
+ if(index == elementIndex)
+ {
+ for(uint8_t modelCount=0; modelCount < APPLICATION_VENDOR_MODELS_MAX_COUNT; modelCount++)
+ {
+ if(Appli_Vendor_Models[index][modelCount] == NO_MODEL_AVLBL)
+ {
+ memcpy(pModels_vendor_ID, Appli_Vendor_Models+index, count*4);
+ break;
+ }
+
+ else
+ {
+ count++;
+ }
+ }
+
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
}
- return APPLI_VENDOR_MODELS_COUNT;
+
+ return count;
}
@@ -500,20 +825,38 @@ MOBLEUINT8 ApplicationGetVendorModelList(MOBLEUINT32* pModels_vendor_ID, MOBLEUI
* @brief ApplicationChkSigModelActive: This function checks if a specific
* Model Server is active in the Model Server list
* @param modelID: Model Server ID received for the checking function
+* @param elementIndex : index of element for which active model checking is needed
* retval Bool: True or False, if the Server ID matches with the list
*/
-MOBLEBOOL ApplicationChkSigModelActive(MOBLEUINT16 modelID)
+MOBLEBOOL ApplicationChkSigModelActive(MOBLEUINT16 modelID, MOBLEUINT8 elementIndex)
{
- MOBLEINT8 index = 0;
+
MOBLEBOOL result = MOBLE_FALSE;
- for(index = 0; index < APPLI_SIG_MODELS_COUNT; index++)
+ for(uint8_t index = 0; index <= elementIndex; index++)
{
- if ( modelID == Appli_SIG_Models[index] )
- {
- result = MOBLE_TRUE;
- break;
- }
+ if(index == elementIndex)
+ {
+ for(uint8_t count = 0; count < APPLICATION_SIG_MODELS_MAX_COUNT; count++)
+ {
+ if (modelID == Appli_SIG_Models[index][count])
+ {
+ result = MOBLE_TRUE;
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
+ }
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
}
return result;
@@ -524,24 +867,41 @@ MOBLEBOOL ApplicationChkSigModelActive(MOBLEUINT16 modelID)
* @brief ApplicationChkVendorModelActive: This function checks if a specific
* Model Server is active in the Vendor Model Server list
* @param modelID: Model Server ID received for the checking function
+* @param elementIndex : index of element for which active model checking is needed
* retval Bool: True or False, if the Server ID matches with the list
*/
-MOBLEBOOL ApplicationChkVendorModelActive(MOBLEUINT32 modelID)
+MOBLEBOOL ApplicationChkVendorModelActive(MOBLEUINT32 modelID, MOBLEUINT8 elementIndex)
{
- MOBLEUINT8 index;
MOBLEBOOL result = MOBLE_FALSE;
- for(index = 0; index < APPLI_VENDOR_MODELS_COUNT; index++)
+ for(uint8_t index = 0; index <= elementIndex; index++)
{
- if ( modelID == Appli_Vendor_Models[index] )
- {
- result = MOBLE_TRUE;
- break;
- }
-
+ if(index == elementIndex)
+ {
+ for(uint8_t count = 0; count < APPLICATION_VENDOR_MODELS_MAX_COUNT; count++)
+ {
+ if (modelID == Appli_Vendor_Models[index][count])
+ {
+ result = MOBLE_TRUE;
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
+ }
+ break;
+ }
+
+ else
+ {
+ /*do nothing*/
+ }
}
return result;
+
}
@@ -559,72 +919,72 @@ void* GetMemoryDataBuffer(MOBLEUINT8 buffer_type, MOBLEUINT32 u32length)
switch (buffer_type)
{
- case MESH_MODEL_BUFFER:
- case HEALTH_MODEL_NEW_BUFFER:
- case HEALTH_MODEL_PUBLISH_BUFFER:
- ptr = &aModelsBuff[0];
- allocated_len = sizeof(aModelsBuff);
- break;
-
- case MESH_MODEL_RESPONSE_BUFFER:
- case VENDOR_MODEL_WRITE_BUFFER:
- case VENDOR_MODEL_WRITE_PUBLISHBUFFER:
- case VENDOR_MODEL_RESPONSE_BUFFER:
- case GENERIC_MODEL_REPLY_BUFFER:
- case GENERIC_MODEL_SENDREMOTE_BUFFER:
- case GENERIC_MODEL_SENDDATA_BUFFER:
- case CONFIG_MODEL_PUBLISH_BUFFER:
- ptr = &aModelsBuff_Response[0];
- allocated_len = sizeof(aModelsBuff_Response);
- break;
-
- case MESH_LOWER_TPT_BUFFER:
- ptr = &aLowerTptBuff[0];
- allocated_len = sizeof(aLowerTptBuff);
- break;
-
- case MESH_LOWER_TPT_FN_BUFFER:
- ptr = &aLowerTptFnBuff[0];
- allocated_len = sizeof(aLowerTptFnBuff);
- break;
-
- case MESH_LOWER_TPT_APP_BUFFER:
- ptr = &aLowerTptAppBuff[0];
- allocated_len = sizeof(aLowerTptAppBuff);
- break;
-
- case PROVISIONER_BUFFER:
- case PROVISION_NODE_BUFFER:
- ptr = &aProvisionParamBuff[0];
- allocated_len = sizeof(aProvisionParamBuff);
- break;
-
- case ACCESS_APPLI_BUFFER:
- ptr = &aAppli_SAR_Buffer[0];
- allocated_len = sizeof(aAppli_SAR_Buffer);
-
- case MESH_LOWER_TPT_INSEG:
- ptr = &aTrans_SegIn_Buffer[0];
- allocated_len = sizeof(aTrans_SegIn_Buffer);
- break;
-
- case MESH_LOWER_TPT_INSEQ0:
- ptr = &aTrans_Seq0_Buffer[0];
- allocated_len = sizeof(aTrans_Seq0_Buffer);
- break;
+ case MESH_MODEL_BUFFER:
+ case HEALTH_MODEL_NEW_BUFFER:
+ case HEALTH_MODEL_PUBLISH_BUFFER:
+ ptr = &aModelsBuff[0];
+ allocated_len = sizeof(aModelsBuff);
+ break;
- case MESH_LOWER_TPT_OUTMSG:
- ptr = &aTrans_Out_Buffer[0];
- allocated_len = sizeof(aTrans_Out_Buffer);
+ case MESH_MODEL_RESPONSE_BUFFER:
+ case VENDOR_MODEL_WRITE_BUFFER:
+ case VENDOR_MODEL_WRITE_PUBLISHBUFFER:
+ case VENDOR_MODEL_RESPONSE_BUFFER:
+ case GENERIC_MODEL_REPLY_BUFFER:
+ case GENERIC_MODEL_SENDREMOTE_BUFFER:
+ case GENERIC_MODEL_SENDDATA_BUFFER:
+ case CONFIG_MODEL_PUBLISH_BUFFER:
+ ptr = &aModelsBuff_Response[0];
+ allocated_len = sizeof(aModelsBuff_Response);
+ break;
- default:
- break;
+ case MESH_LOWER_TPT_BUFFER:
+ ptr = &aLowerTptBuff[0];
+ allocated_len = sizeof(aLowerTptBuff);
+ break;
+
+ case MESH_LOWER_TPT_FN_BUFFER:
+ ptr = &aLowerTptFnBuff[0];
+ allocated_len = sizeof(aLowerTptFnBuff);
+ break;
+
+ case MESH_LOWER_TPT_APP_BUFFER:
+ ptr = &aLowerTptAppBuff[0];
+ allocated_len = sizeof(aLowerTptAppBuff);
+ break;
+
+ case PROVISIONER_BUFFER:
+ case PROVISION_NODE_BUFFER:
+ ptr = &aProvisionParamBuff[0];
+ allocated_len = sizeof(aProvisionParamBuff);
+ break;
+
+ case ACCESS_APPLI_BUFFER:
+ ptr = &aAppli_SAR_Buffer[0];
+ allocated_len = sizeof(aAppli_SAR_Buffer);
+
+ case MESH_LOWER_TPT_INSEG:
+ ptr = &aTrans_SegIn_Buffer[0];
+ allocated_len = sizeof(aTrans_SegIn_Buffer);
+ break;
+
+ case MESH_LOWER_TPT_INSEQ0:
+ ptr = &aTrans_Seq0_Buffer[0];
+ allocated_len = sizeof(aTrans_Seq0_Buffer);
+ break;
+
+ case MESH_LOWER_TPT_OUTMSG:
+ ptr = &aTrans_Out_Buffer[0];
+ allocated_len = sizeof(aTrans_Out_Buffer);
+
+ default:
+ break;
}
TRACE_M(TF_MEMORY, "BuffType= %d, RequiredLength=%d, Allocated= %d \r\n", buffer_type, u32length, allocated_len);
if (u32length > allocated_len)
{
- TRACE_M(TF_MEMORY, "***<<<ERROR>>> Short buffer Allocated \r\n");
+ TRACE_M(TF_MEMORY, "***<<<ERROR>>> Short buffer Allocated \r\n");
}
return ptr;
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c
index 55c14035c..67da843b5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c
@@ -144,7 +144,7 @@ void SerialCtrlVendorWrite_Process(char *rcvdStringBuff, uint16_t rcvdStringSize
if(command == 0x000E)
{
- data_buff[0] = 0x01; // data write sub command;
+ data_buff[0] = 0x01; /* data write sub command; */
length = sizeof(data_buff)-idx;
for(MOBLEUINT8 i=idx;i <sizeof(data_buff);i++)
@@ -221,8 +221,7 @@ void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
Start finding for opcode in Light LC Table*/
if (minParamLength == 0xff)
{
- minParamLength = SerialCtrl_GetMinParamLength(command,LightLC_OpcodeTable,LightLC_OpcodeTableLength);
-
+ minParamLength = SerialCtrl_GetMinParamLength(command,LightLC_OpcodeTable,LightLC_OpcodeTableLength);
}
/* Opcode not found in Light LC opcode table
Start finding for opcode in Sensor Table*/
@@ -231,23 +230,25 @@ void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
minParamLength = SerialCtrl_GetMinParamLength(command,Sensor_OpcodeTable,Sensor_OpcodeTableLength);
}
- /* Opcode not found in Sensor opcode table
- Start finding for opcode in Vendor Table*/
- else
+ if (minParamLength != 0xff)
{
- minParamLength = SerialCtrl_GetData(rcvdStringBuff, rcvdStringSize, SERIAL_MODEL_DATA_OFFSET, data);
-
- result = BLEMesh_SetRemoteData(peer,elementIndex,command,
- data, minParamLength,
- response, MOBLE_FALSE);
- if(result == MOBLE_RESULT_SUCCESS)
- {
- TRACE_I(TF_SERIAL_CTRL,"Command Executed Successfully\r\n");
- }
- else
- {
- TRACE_I(TF_SERIAL_CTRL,"Invalid Opcode Parameter\r\n");
- }
+ minParamLength = SerialCtrl_GetData(rcvdStringBuff, rcvdStringSize, SERIAL_MODEL_DATA_OFFSET, data);
+
+ result = BLEMesh_SetRemoteData(peer,elementIndex,command,
+ data, minParamLength,
+ response, MOBLE_FALSE);
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_I(TF_SERIAL_CTRL,"Command Executed Successfully\r\n");
+ }
+ else
+ {
+ TRACE_I(TF_SERIAL_CTRL,"Invalid Opcode Parameter\r\n");
+ }
+ }
+ else
+ {
+ TRACE_I(TF_SERIAL_CTRL,"Unknown Opcode\r\n");
}
}
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c
index 43f637c6e..af5dba85c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c
@@ -441,6 +441,7 @@ void BLEMesh_PrintDataCb(MOBLEUINT8* data, MOBLEUINT16 size)
{
TRACE_I(TF_SERIAL_CTRL,"%02X", data[count]);
}
+
TRACE_I(TF_SERIAL_CTRL,"\n\r");
}
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c
index e98188ed7..e8d1e245f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c
@@ -100,17 +100,15 @@ __weak MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray
*/
void SerialPrvn_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
- MOBLE_RESULT result;
- MOBLEUINT8 prvsnrDevKey[16];
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
/* Command to make a devices as Root node which creates Mesh network credentials */
if (!strncmp(rcvdStringBuff+COMMAND_OFFSET, "ROOT",4))
{
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
/* Initializes Mesh network parameters */
- result = BLEMesh_CreateNetwork(prvsnrDevKey);
-#ifdef ENABLE_PROVISIONER_FEATURE
- Start_SelfConfiguration();
+ Appli_StartProvisionerMode(1);
#endif
-
}
/* Command to scan the unprovisioned devices */
else if (!strncmp(rcvdStringBuff+COMMAND_OFFSET, "SCAN",4))
@@ -186,21 +184,30 @@ void SerialPrvn_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
*/
static MOBLE_RESULT SerialPrvn_ProvisionDevice(char *text)
{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
MOBLEINT16 index = 0;
MOBLEINT16 na = 0;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
sscanf(text, "PRVN-%hd %hd", &index, &na);
if(na>1)
- {
- nodeAddressOffset = na - 1;
+ { /* Address 1 is reserved for the Provisioner */
+
result = BLEMesh_ProvisionRemote(NeighborTable[index].uuid);
+
+ /* Make copy of the UUID */
+ memcpy (NodeUnderProvisionParam.NewProvNodeUUID,
+ NeighborTable[index].uuid,
+ UUID_SIZE);
}
else
{
result = MOBLE_RESULT_INVALIDARG;
}
+#endif
return result;
}
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c
index 10542ca1f..715bd4d88 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c
@@ -105,7 +105,9 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
MOBLEUINT16 commandIndex = SerialUt_GetFunctionIndex(rcvdStringBuff+5);
MOBLEUINT8 testFunctionParm[6]= {'\0'} ;
MOBLEUINT8 asciiFunctionParameter[7] = {'\0'} ;
- MOBLE_RESULT result;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEBOOL unprovisioned = MOBLE_FALSE;
+
switch (commandIndex)
{
case CMD_INDEX_SEND_01:
@@ -129,8 +131,6 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
break;
/* Resets the Board */
case CMD_INDEX_SET_01:
- /* Unprovisions the Node */
- case CMD_INDEX_SET_02:
/* test signal in IV Update */
case CMD_INDEX_SET_04:
/* Breakes the exsisting friendship */
@@ -169,6 +169,14 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
result = BLEMesh_UpperTesterDataProcess( commandIndex, testFunctionParm);
break;
+ /* Unprovisions the Node */
+ case CMD_INDEX_SET_02:
+ {
+ unprovisioned = BLEMesh_IsUnprovisioned();
+ result = BLEMesh_UpperTesterDataProcess(commandIndex, testFunctionParm);
+ }
+ break;
+
/* Print Security Credentials */
case CMD_INDEX_PRINT_01:
result = BLEMesh_UpperTesterDataProcess( commandIndex, testFunctionParm);
@@ -177,23 +185,34 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
default:
printf("Invalid Command\r\n");
}
- if (result == MOBLE_RESULT_SUCCESS)
- {
- BLEMesh_PrintStringCb("Test command executed successfully\r\n");
- }
- else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Test command executed successfully\r\n");
+ if(commandIndex == CMD_INDEX_SET_02)
+ {
+ if(!unprovisioned)
{
- BLEMesh_PrintStringCb("Test command Failed. Out of memory\r\n");
-}
- else if(result == MOBLE_RESULT_INVALIDARG)
-{
- BLEMesh_PrintStringCb("Test command Failed. Invalid Argument\r\n");
+ Appli_Unprovision();
}
else
{
- BLEMesh_PrintStringCb("Test command Failed.\r\n");
+ BLEMesh_PrintStringCb("Device is already unprovisioned !\r\n");
}
+ }
}
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Test command Failed. Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Test command Failed. Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Test command Failed.\r\n");
+ }
+}
/**
* @brief SerialUt_GetFunctionIndex: This function returns the calculated index
@@ -266,4 +285,5 @@ __weak MOBLE_RESULT BLEMesh_UpperTesterDataProcess(MOBLEUINT8 testFunctionIndex,
printf("\r\n");
return MOBLE_RESULT_SUCCESS;
-} \ No newline at end of file
+}
+
diff --git a/Middlewares/ST/STM32_WPAN/ble/svc/Inc/uuid.h b/Middlewares/ST/STM32_WPAN/ble/svc/Inc/uuid.h
index 920b5dda2..201b6bbc9 100644
--- a/Middlewares/ST/STM32_WPAN/ble/svc/Inc/uuid.h
+++ b/Middlewares/ST/STM32_WPAN/ble/svc/Inc/uuid.h
@@ -313,4 +313,15 @@
#define CRS_TX_CHAR_UUID (0xFE61)
#define CRS_RX_CHAR_UUID (0xFE62)
+/* UUIDs for Apple Notification Center Service */
+#define ANCS_SERVICE_UUID (0xF431)
+#define ANCS_NOTIFICATION_SOURCE_CHAR_UUID (0x120D)
+#define ANCS_CONTROL_POINT_CHAR_UUID (0xD8F3)
+#define ANCS_DATA_SOURCE_CHAR_UUID (0xC6E9)
+
+/* UUIDs for Apple Media Service start from iOS 8*/
+#define AMS_SERVICE_UUID (0x502B)
+#define AMS_REMOTE_COMMAND_CHAR_UUID (0x81D8)
+#define AMS_ENTITY_UPDATE_CHAR_UUID (0xABCE)
+#define AMS_ENTITY_ATTRIBUTE_CHAR_UUID (0xF38C)
#endif /* _UUID_H_ */
diff --git a/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c b/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c
index 62ecc4187..c9b83d86c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c
+++ b/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c
@@ -6,39 +6,13 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright c 2017 STMicroelectronics International N.V.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted, provided that the following conditions are met:
- *
- * 1. Redistribution of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form 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 STMicroelectronics nor the names of other
- * contributors to this software may be used to endorse or promote products
- * derived from this software without specific written permission.
- * 4. This software, including modifications and/or derivative works of this
- * software, must execute solely and exclusively on microcontroller or
- * microprocessor devices manufactured by or for STMicroelectronics.
- * 5. Redistribution and use of this software other than as permitted under
- * this license is void and will automatically terminate your rights under
- * this license.
- *
- * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
- * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
- * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
*
******************************************************************************
*/
@@ -51,6 +25,7 @@
#include "mesh_cfg.h"
#include "appli_config_client.h"
#include "appli_nvm.h"
+#include "shci.h"
/* Private typedef -----------------------------------------------------------*/
@@ -91,6 +66,7 @@ extern MOBLEUINT8 bdaddr[];
/* Private variables ---------------------------------------------------------*/
/* This structure contains Mesh library Initialisation info data */
/* Private function prototypes -----------------------------------------------*/
+void Appli_ConfigurationInfoDump(void);
/* Functions Definition ------------------------------------------------------*/
/* Private functions ----------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/
@@ -104,9 +80,11 @@ void MESH_Init(void)
{
MOBLEUINT8 uuid[16];
MOBLEUINT8 PrvnDevKeyFlag = 0;
-#if PROVISIONER_FEATURE
+//#if PROVISIONER_FEATURE
// MOBLEUINT8 prvsnrDevKey[16];
-#endif
+//#endif
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
/* Check for valid Board Address */
if (!Appli_CheckBdMacAddr())
@@ -133,27 +111,32 @@ void MESH_Init(void)
}
}
+ /* Initialization of the SIG Models list */
+ if(MOBLE_FAILED(ApplicationInitSigModelList()))
+ {
+ TRACE_I(TF_INIT,"The number of Models enabled exceed the limit of %d !\r\n",
+ APPLICATION_SIG_MODELS_MAX_COUNT);
+ /* LED continuously blinks if library fails to initialize */
+ while (1)
+ {
+ Appli_LedBlink();
+ }
+ }
+
+ /* Initializes the Application */
+ /* This function also checks for Power OnOff Cycles
+ Define the following Macro "ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE"
+ to check the Power-OnOff Cycles
+ 5 Continous cycles of OnOff with Ontime <2 sec will cause unprovisioning
+ */
+ Appli_Init(&PrvnDevKeyFlag);
+
/* Check if Node is a Provisioner */
-//#if PROVISIONER_FEATURE
-// MOBLEUINT8 prvsnrDevKey[16];
-// /* Initializes Mesh network parameters */
-// BluenrgMesh_CreateNetwork(prvsnrDevKey);
-//
-// /* Following functions help to Configure the Provisioner to default settings*/
-// ApplicationSetNodeSigModelList();
-// AppliConfigClient_SelfPublicationSetDefault();
-// AppliConfigClient_SelfSubscriptionSetDefault();
-// Appli_ConfigClient_SelfDefaultAppKeyBind();
-//
-// TRACE_I(TF_PROVISION,"Provisioner node \r\n");
-// TRACE_I(TF_PROVISION,"Provisioner Dev Key:");
-// for(MOBLEUINT8 i=0;i<16;i++)
-// {
-// TRACE_I(TF_INIT,"[%02x] ",prvsnrDevKey[i]);
-// }
-// TRACE_I(TF_INIT,"\r\n");
-
-//#else
+#if PROVISIONER_FEATURE
+
+ Appli_StartProvisionerMode(1);
+
+#else
/* Checks if the node is already provisioned or not */
if (BLEMesh_IsUnprovisioned() == MOBLE_TRUE)
{
@@ -171,39 +154,56 @@ void MESH_Init(void)
TRACE_I(TF_PROVISION,"Provisioned node \r\n");
TRACE_I(TF_INIT,"Provisioned Node Address: [%04x] \n\r", BLEMesh_GetAddress());
}
-//#endif
+#endif
/* Initializes the Application */
/* This function also checks for Power OnOff Cycles
Define the following Macro "ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE"
to check the Power-OnOff Cycles
5 Continous cycles of OnOff with Ontime <2 sec will cause unprovisioning
*/
- Appli_Init(&PrvnDevKeyFlag);
-#if PROVISIONER_FEATURE
-// AppliNvm_saveProvisionerDevKey(&prvsnrDevKey[0],
-// sizeof(prvsnrDevKey),
-// &PrvnDevKeyFlag);
-#endif
-
+// Appli_Init(&PrvnDevKeyFlag);
+//#if PROVISIONER_FEATURE
+// AppliPrvnNvm_SaveProvisionerDevKey(&prvsnrDevKey[0],
+// PROVISIONER_ROOT_ADDR_DEFAULT,
+// &PrvnDevKeyFlag,
+// APPLICATION_NUMBER_OF_ELEMENTS);
+//#endif
/* Check to manually unprovision the board */
Appli_CheckForUnprovision();
+
/* Set attention timer callback */
BLEMesh_SetAttentionTimerCallback(Appli_BleAttentionTimerCb);
- /* Set uuid for the board*/
+#if TF_MISC
+ Appli_ConfigurationInfoDump();
+#endif
+
+/* Set uuid for the board*/
Appli_BleSetUUIDCb(uuid);
/* Prints the MAC Address of the board */
TRACE_I(TF_INIT,"BLE-Mesh Lighting Demo v%s\n\r", BLE_MESH_APPLICATION_VERSION);
TRACE_I(TF_INIT,"BLE-Mesh Library v%s\n\r", BLEMesh_GetLibraryVersion());
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ // Error
+ }
+ else
+ {
+ TRACE_I(TF_INIT,"BLE Stack v%d.%d.%d Branch=%d Type=%d\n\r", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub, p_wireless_info->VersionBranch, p_wireless_info->VersionReleaseType);
+ TRACE_I(TF_INIT,"FUS v%d.%d.%d\n\r", p_wireless_info->FusVersionMajor, p_wireless_info->FusVersionMinor, p_wireless_info->FusVersionSub);
+ }
+
TRACE_I(TF_INIT,"BD_MAC Address = [%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x] \n\r",
bdaddr[5],bdaddr[4],bdaddr[3],bdaddr[2],bdaddr[1],bdaddr[0]);
TRACE_I(TF_INIT,"UUID Address = ");
+
for(MOBLEUINT8 i=0;i<16;i++)
{
TRACE_I(TF_INIT,"[%02x] ",uuid[i]);
}
TRACE_I(TF_INIT,"\r\n");
+
/* Models intialization */
BLEMesh_ModelsInit();
@@ -217,4 +217,166 @@ void MESH_Init(void)
#endif
}
+
+/**
+* @brief This function is the Information dump function
+* @param None
+* @retval None
+*/
+void Appli_ConfigurationInfoDump(void)
+{
+ TRACE_I(TF_MISC,"\r\n********************\r\n");
+
+#ifdef ENABLE_PB_ADV
+ TRACE_I(TF_MISC,"PB-ADV Enabled \r\n");
+#endif
+
+#ifdef ENABLE_PB_GATT
+ TRACE_I(TF_MISC,"PB-GATT Enabled \r\n");
+#endif
+
+#ifdef ENABLE_RELAY_FEATURE
+ TRACE_I(TF_MISC,"Feature: Relay Enabled \r\n");
+#endif
+
+#ifdef ENABLE_PROXY_FEATURE
+ TRACE_I(TF_MISC,"Feature: Proxy Enabled \r\n");
+#endif
+
+#ifdef ENABLE_FRIEND_FEATURE
+ TRACE_I(TF_MISC,"Feature: Friend Enabled \r\n");
+#endif
+
+#ifdef ENABLE_PUB_KEY_TYPE_OOB
+ TRACE_I(TF_MISC,"Public Key OOB Enabled \r\n");
+#endif
+
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+ TRACE_I(TF_MISC,"Static OOB Enabled \r\n");
+#endif
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ TRACE_I(TF_MISC,"Output OOB Enabled \r\n");
+#endif
+
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+ TRACE_I(TF_MISC,"Input OOB Enabled \r\n");
+#endif
+
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+ TRACE_I(TF_MISC,"To Unprovision: Do Power On-Off/Reset %d time \r\n", POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING);
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ TRACE_I(TF_MISC,"Models data will be saved in Flash \r\n");
+#endif
+
+/* Only one Macro will be enable at one time */
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+ TRACE_I(TF_MISC,"Models data for all messages wll be saved \r\n");
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ TRACE_I(TF_MISC,"Models data will be saved on Power failure \r\n");
+#endif
+
+#if SAVE_EMBD_PROVISION_DATA
+ TRACE_I(TF_MISC,"Embedded Provisioner data saving enabled \r\n");
+#endif
+
+#ifdef APPLICATION_NUMBER_OF_ELEMENTS
+ TRACE_I(TF_MISC,"Number of Elements enabled: %d \r\n", APPLICATION_NUMBER_OF_ELEMENTS);
+#endif
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+ TRACE_I(TF_MISC,"Neighbour Table is enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ TRACE_I(TF_MISC,"Generic On Off Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+ TRACE_I(TF_MISC,"Generic Level Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+ TRACE_I(TF_MISC,"Generic Default Transition Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+ TRACE_I(TF_MISC,"Generic Power On Off Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+ TRACE_I(TF_MISC,"Generic Power Level Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_BATTERY
+ TRACE_I(TF_MISC,"Generic Battery Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LOCATION
+ TRACE_I(TF_MISC,"Generic Location Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
+ TRACE_I(TF_MISC,"Generic Admin Property Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
+ TRACE_I(TF_MISC,"Generic Manufacturer Property Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
+ TRACE_I(TF_MISC,"Generic User Property Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ TRACE_I(TF_MISC,"Light Lightness Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+ TRACE_I(TF_MISC,"Light CTL Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+ TRACE_I(TF_MISC,"Light CTL Temperature Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+ TRACE_I(TF_MISC,"Light HSL Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+ TRACE_I(TF_MISC,"Light HSL Hue Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+ TRACE_I(TF_MISC,"Light HSL Saturation Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_XYL
+ TRACE_I(TF_MISC,"Light XYL Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ TRACE_I(TF_MISC,"Light LC Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+ TRACE_I(TF_MISC,"Sensor Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_TIME_MODEL_SERVER
+ TRACE_I(TF_MISC,"Time Server Model enabled \r\n");
+#endif
+
+#ifdef ENABLE_SCENE_MODEL_SERVER
+ TRACE_I(TF_MISC,"Scene Model enabled \r\n")
+#endif
+ TRACE_I(TF_MISC,"********************\r\n\r\n");
+
+}
+
/************************ (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/hw.h b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/hw.h
index 591215a38..879fa6de5 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/hw.h
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/hw.h
@@ -58,6 +58,7 @@ extern "C" {
void HW_IPCC_THREAD_CliSendAck( void );
void HW_IPCC_THREAD_CliEvtNot( void );
+
void HW_IPCC_LLDTESTS_Init( void );
void HW_IPCC_LLDTESTS_SendCliCmd( void );
void HW_IPCC_LLDTESTS_ReceiveCliRsp( void );
@@ -65,9 +66,21 @@ extern "C" {
void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void );
void HW_IPCC_LLDTESTS_SendM0CmdAck( void );
+
+ void HW_IPCC_LLD_BLE_Init( void );
+ void HW_IPCC_LLD_BLE_SendCliCmd( void );
+ void HW_IPCC_LLD_BLE_ReceiveCliRsp( void );
+ void HW_IPCC_LLD_BLE_SendCliRspAck( void );
+ void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void );
+ void HW_IPCC_LLD_BLE_SendM0CmdAck( void );
+ void HW_IPCC_LLD_BLE_SendCmd( void );
+ void HW_IPCC_LLD_BLE_ReceiveRsp( void );
+ void HW_IPCC_LLD_BLE_SendRspAck( void );
+
+
void HW_IPCC_TRACES_Init( void );
void HW_IPCC_TRACES_EvtNot( void );
-
+
void HW_IPCC_MAC_802_15_4_Init( void );
void HW_IPCC_MAC_802_15_4_SendCmd( void );
void HW_IPCC_MAC_802_15_4_SendAck( void );
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/lhci/lhci.c b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/lhci/lhci.c
index 40f1f388f..7e6372c52 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/lhci/lhci.c
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/lhci/lhci.c
@@ -126,6 +126,12 @@ void LHCI_C1_Read_Register( TL_CmdPacket_t *pcmd )
void LHCI_C1_Read_Device_Information( TL_CmdPacket_t *pcmd )
{
+ uint32_t ipccdba;
+ MB_RefTable_t * p_ref_table;
+
+ ipccdba = READ_BIT(FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA);
+ p_ref_table = (MB_RefTable_t*)((ipccdba<<2) + SRAM2A_BASE);
+
((TL_EvtPacket_t*) pcmd)->evtserial.type = TL_LOCRSP_PKT_TYPE;
((TL_EvtPacket_t*) pcmd)->evtserial.evt.evtcode = TL_BLEEVT_CC_OPCODE;
((TL_EvtPacket_t*) pcmd)->evtserial.evt.plen = TL_EVT_HDR_SIZE + sizeof(LHCI_C1_Device_Information_ccrp_t);
@@ -198,7 +204,7 @@ void LHCI_C1_Read_Device_Information( TL_CmdPacket_t *pcmd )
*/
memcpy(
&(((LHCI_C1_Device_Information_ccrp_t *) (((TL_CcEvt_t *) (((TL_EvtPacket_t*) pcmd)->evtserial.evt.payload))->payload))->SafeBootInf),
- &((MB_RefTable_t*) 0x20030000)->p_device_info_table->SafeBootInfoTable,
+ &(p_ref_table->p_device_info_table->SafeBootInfoTable),
sizeof(MB_SafeBootInfoTable_t));
/**
@@ -206,7 +212,7 @@ void LHCI_C1_Read_Device_Information( TL_CmdPacket_t *pcmd )
*/
memcpy(
&(((LHCI_C1_Device_Information_ccrp_t *) (((TL_CcEvt_t *) (((TL_EvtPacket_t*) pcmd)->evtserial.evt.payload))->payload))->FusInf),
- &((MB_RefTable_t*) 0x20030000)->p_device_info_table->FusInfoTable,
+ &(p_ref_table->p_device_info_table->FusInfoTable),
sizeof(MB_FusInfoTable_t));
/**
@@ -214,7 +220,7 @@ void LHCI_C1_Read_Device_Information( TL_CmdPacket_t *pcmd )
*/
memcpy(
&(((LHCI_C1_Device_Information_ccrp_t *) (((TL_CcEvt_t *) (((TL_EvtPacket_t*) pcmd)->evtserial.evt.payload))->payload))->WirelessFwInf),
- &((MB_RefTable_t*) 0x20030000)->p_device_info_table->WirelessFwInfoTable,
+ &(p_ref_table->p_device_info_table->WirelessFwInfoTable),
sizeof(MB_WirelessFwInfoTable_t));
/**
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c
index 2ea82a67f..78bab2f5c 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c
@@ -298,6 +298,24 @@ SHCI_CmdStatus_t SHCI_C2_LLDTESTS_Init( uint8_t param_size, uint8_t * p_param )
return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
}
+SHCI_CmdStatus_t SHCI_C2_LLD_BLE_Init( uint8_t param_size, uint8_t * p_param )
+{
+ /**
+ * Buffer is large enough to hold command complete without payload
+ */
+ uint8_t local_buffer[TL_BLEEVT_CS_BUFFER_SIZE];
+ TL_EvtPacket_t * p_rsp;
+
+ p_rsp = (TL_EvtPacket_t *)local_buffer;
+
+ shci_send( SHCI_OPCODE_C2_LLD_TESTS_INIT,
+ param_size,
+ p_param,
+ p_rsp );
+
+ return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+}
+
SHCI_CmdStatus_t SHCI_C2_ZIGBEE_Init( void )
{
/**
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.h b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.h
index d804057f8..68246847a 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.h
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.h
@@ -138,7 +138,8 @@ extern "C" {
SHCI_OCF_C2_ZIGBEE_INIT,
SHCI_OCF_C2_LLD_TESTS_INIT,
SHCI_OCF_C2_EXTPA_CONFIG,
- SHCI_OCF_C2_SET_FLASH_ACTIVITY_CONTROL
+ SHCI_OCF_C2_SET_FLASH_ACTIVITY_CONTROL,
+ SHCI_OCF_C2_LLD_BLE_INIT
} SHCI_OCF_t;
#define SHCI_OPCODE_C2_FUS_GET_STATE (( SHCI_OGF << 10) + SHCI_OCF_C2_FUS_GET_STATE)
@@ -367,6 +368,8 @@ extern "C" {
#define SHCI_OPCODE_C2_LLD_TESTS_INIT (( SHCI_OGF << 10) + SHCI_OCF_C2_LLD_TESTS_INIT)
+#define SHCI_OPCODE_C2_LLD_BLE_INIT (( SHCI_OGF << 10) + SHCI_OCF_C2_LLD_BLE_INIT)
+
#define SHCI_OPCODE_C2_EXTPA_CONFIG (( SHCI_OGF << 10) + SHCI_OCF_C2_EXTPA_CONFIG)
/** Command parameters */
enum
@@ -457,13 +460,16 @@ typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
#define INFO_STACK_TYPE_BLE_LIGHT 0x03
#define INFO_STACK_TYPE_THREAD_FTD 0x10
#define INFO_STACK_TYPE_THREAD_MTD 0x11
-#define INFO_STACK_TYPE_ZIGBEE 0x30
+#define INFO_STACK_TYPE_ZIGBEE_FFD 0x30
+#define INFO_STACK_TYPE_ZIGBEE_RFD 0x31
#define INFO_STACK_TYPE_MAC 0x40
#define INFO_STACK_TYPE_BLE_THREAD_FTD_STATIC 0x50
#define INFO_STACK_TYPE_802154_LLD_TESTS 0x60
#define INFO_STACK_TYPE_802154_PHY_VALID 0x61
#define INFO_STACK_TYPE_BLE_PHY_VALID 0x62
#define INFO_STACK_TYPE_BLE_LLD_TESTS 0x63
+#define INFO_STACK_TYPE_BLE_RLV 0x64
+#define INFO_STACK_TYPE_802154_RLV 0x65
#define INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC 0x70
typedef struct {
@@ -615,6 +621,16 @@ typedef struct {
SHCI_CmdStatus_t SHCI_C2_LLDTESTS_Init( uint8_t param_size, uint8_t * p_param );
/**
+ * SHCI_C2_LLD_BLE_Init
+ * @brief Starts the LLD tests CLI
+ *
+ * @param param_size : Nb of bytes
+ * @param p_param : pointeur with data to give from M4 to M0
+ * @retval Status
+ */
+ SHCI_CmdStatus_t SHCI_C2_LLD_BLE_Init( uint8_t param_size, uint8_t * p_param );
+
+ /**
* SHCI_C2_ZIGBEE_Init
* @brief Starts the Zigbee Stack
*
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c
index 1836732e9..78a093abd 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c
@@ -26,6 +26,30 @@
#include "tl.h"
#include "hci_tl.h"
+/**
+ * These traces are not yet supported in an usual way in the delivery package
+ * They can enabled by adding the definition of TL_HCI_CMD_DBG_EN and/or TL_HCI_EVT_DBG_EN in the preprocessor option in the IDE
+ */
+#if ( (TL_HCI_CMD_DBG_EN != 0) || (TL_HCI_EVT_DBG_EN != 0) )
+#include "dbg_trace.h"
+#endif
+
+#if (TL_HCI_CMD_DBG_EN != 0)
+#define TL_HCI_CMD_DBG_MSG PRINT_MESG_DBG
+#define TL_HCI_CMD_DBG_BUF PRINT_LOG_BUFF_DBG
+#else
+#define TL_HCI_CMD_DBG_MSG(...)
+#define TL_HCI_CMD_DBG_BUF(...)
+#endif
+
+#if (TL_HCI_EVT_DBG_EN != 0)
+#define TL_HCI_EVT_DBG_MSG PRINT_MESG_DBG
+#define TL_HCI_EVT_DBG_BUF PRINT_LOG_BUFF_DBG
+#else
+#define TL_HCI_EVT_DBG_MSG(...)
+#define TL_HCI_EVT_DBG_BUF(...)
+#endif
+
/* Private typedef -----------------------------------------------------------*/
typedef enum
@@ -58,7 +82,6 @@ PLACE_IN_SECTION("BLE_DRIVER_CONTEXT") HCI_TL_UserEventFlowStatus_t UserEventFlo
static tHciContext hciContext;
static tListNode HciCmdEventQueue;
static void (* StatusNotCallBackFunction) (HCI_TL_CmdStatus_t status);
-
static volatile HCI_TL_CmdRespStatus_t CmdRspStatusFlag;
/* Private function prototypes -----------------------------------------------*/
@@ -66,6 +89,9 @@ static void NotifyCmdStatus(HCI_TL_CmdStatus_t hcicmdstatus);
static void SendCmd(uint16_t opcode, uint8_t plen, void *param);
static void TlEvtReceived(TL_EvtPacket_t *hcievt);
static void TlInit( TL_CmdPacket_t * p_cmdbuffer );
+static void OutputCmdTrace(TL_CmdPacket_t *pCmdBuffer);
+static void OutputRspTrace(TL_EvtPacket_t *hcievt);
+static void OutputEvtTrace(TL_EvtPacket_t *phcievtbuffer);
/* Interface ------- ---------------------------------------------------------*/
void hci_init(void(* UserEvtRx)(void* pData), void* pConf)
@@ -104,6 +130,8 @@ void hci_user_evt_proc(void)
{
LST_remove_head ( &HciAsynchEventQueue, (tListNode **)&phcievtbuffer );
+ OutputEvtTrace(phcievtbuffer);
+
if (hciContext.UserEvtRx != NULL)
{
UserEvtRxParam.pckt = phcievtbuffer;
@@ -177,6 +205,8 @@ int hci_send_req(struct hci_request *p_cmd, uint8_t async)
{
LST_remove_head (&HciCmdEventQueue, (tListNode **)&pevtpacket);
+ OutputRspTrace(pevtpacket);
+
if(pevtpacket->evtserial.evt.evtcode == TL_BLEEVT_CS_OPCODE)
{
pcommand_status_event = (TL_CsEvt_t*)pevtpacket->evtserial.evt.payload;
@@ -248,6 +278,8 @@ static void SendCmd(uint16_t opcode, uint8_t plen, void *param)
pCmdBuffer->cmdserial.cmd.plen = plen;
memcpy( pCmdBuffer->cmdserial.cmd.payload, param, plen );
+ OutputCmdTrace(pCmdBuffer);
+
hciContext.io.Send(0,0);
return;
@@ -289,6 +321,79 @@ static void TlEvtReceived(TL_EvtPacket_t *hcievt)
return;
}
+static void OutputCmdTrace(TL_CmdPacket_t *pCmdBuffer)
+{
+ TL_HCI_CMD_DBG_MSG("ble cmd: 0x%04X", pCmdBuffer->cmdserial.cmd.cmdcode);
+ if(pCmdBuffer->cmdserial.cmd.plen != 0)
+ {
+ TL_HCI_CMD_DBG_MSG(" payload:");
+ TL_HCI_CMD_DBG_BUF(pCmdBuffer->cmdserial.cmd.payload, pCmdBuffer->cmdserial.cmd.plen, "");
+ }
+ TL_HCI_CMD_DBG_MSG("\r\n");
+
+ return;
+}
+
+static void OutputRspTrace(TL_EvtPacket_t *hcievt)
+{
+ switch(hcievt->evtserial.evt.evtcode)
+ {
+ case TL_BLEEVT_CS_OPCODE:
+ TL_HCI_CMD_DBG_MSG("ble rsp: 0x%02X", hcievt->evtserial.evt.evtcode);
+ TL_HCI_CMD_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(hcievt->evtserial.evt.payload))->cmdcode);
+ TL_HCI_CMD_DBG_MSG(" numhci: 0x%02X", ((TL_CsEvt_t*)(hcievt->evtserial.evt.payload))->numcmd);
+ TL_HCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CsEvt_t*)(hcievt->evtserial.evt.payload))->status);
+ break;
+
+ case TL_BLEEVT_CC_OPCODE:
+ TL_HCI_CMD_DBG_MSG("ble rsp: 0x%02X", hcievt->evtserial.evt.evtcode);
+ TL_HCI_CMD_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(hcievt->evtserial.evt.payload))->cmdcode);
+ TL_HCI_CMD_DBG_MSG(" numhci: 0x%02X", ((TL_CcEvt_t*)(hcievt->evtserial.evt.payload))->numcmd);
+ TL_HCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CcEvt_t*)(hcievt->evtserial.evt.payload))->payload[0]);
+ if((hcievt->evtserial.evt.plen-4) != 0)
+ {
+ TL_HCI_CMD_DBG_MSG(" payload:");
+ TL_HCI_CMD_DBG_BUF(&((TL_CcEvt_t*)(hcievt->evtserial.evt.payload))->payload[1], hcievt->evtserial.evt.plen-4, "");
+ }
+ break;
+
+ default:
+ TL_HCI_CMD_DBG_MSG("unknown ble rsp received: %02X", hcievt->evtserial.evt.evtcode);
+ break;
+ }
+
+ TL_HCI_CMD_DBG_MSG("\r\n");
+
+ return;
+}
+
+static void OutputEvtTrace(TL_EvtPacket_t *phcievtbuffer)
+{
+ if(phcievtbuffer->evtserial.evt.evtcode != TL_BLEEVT_VS_OPCODE)
+ {
+ TL_HCI_EVT_DBG_MSG("ble evt: 0x%02X", phcievtbuffer->evtserial.evt.evtcode);
+ if((phcievtbuffer->evtserial.evt.plen) != 0)
+ {
+ TL_HCI_EVT_DBG_MSG(" payload:");
+ TL_HCI_EVT_DBG_BUF(phcievtbuffer->evtserial.evt.payload, phcievtbuffer->evtserial.evt.plen, "");
+ }
+ }
+ else
+ {
+ TL_HCI_EVT_DBG_MSG("ble evt: 0x%02X", phcievtbuffer->evtserial.evt.evtcode);
+ TL_HCI_EVT_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(phcievtbuffer->evtserial.evt.payload))->subevtcode);
+ if((phcievtbuffer->evtserial.evt.plen-2) != 0)
+ {
+ TL_HCI_EVT_DBG_MSG(" payload:");
+ TL_HCI_EVT_DBG_BUF(((TL_AsynchEvt_t*)(phcievtbuffer->evtserial.evt.payload))->payload, phcievtbuffer->evtserial.evt.plen-2, "");
+ }
+ }
+
+ TL_HCI_EVT_DBG_MSG("\r\n");
+
+ return;
+}
+
/* Weak implementation ----------------------------------------------------------------*/
__WEAK void hci_cmd_resp_wait(uint32_t timeout)
{
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/mbox_def.h b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/mbox_def.h
index 939d51797..1741a8c3d 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/mbox_def.h
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/mbox_def.h
@@ -102,6 +102,12 @@ extern "C" {
typedef struct
{
+ uint8_t *cmdrsp_buffer;
+ uint8_t *m0cmd_buffer;
+ } MB_LldBleTable_t;
+
+ typedef struct
+ {
uint8_t *notifM0toM4_buffer;
uint8_t *appliCmdM4toM0_buffer;
uint8_t *requestM0toM4_buffer;
@@ -151,6 +157,7 @@ extern "C" {
MB_Mac_802_15_4_t *p_mac_802_15_4_table;
MB_ZigbeeTable_t *p_zigbee_table;
MB_LldTestsTable_t *p_lld_tests_table;
+ MB_LldBleTable_t *p_lld_ble_table;
} MB_RefTable_t;
#ifdef __cplusplus
@@ -194,6 +201,13 @@ extern "C" {
* | |
* |<---HW_IPCC_BLE_EVENT_CHANNEL--------------------|
* | |
+ * | (LLD BLE) |
+ * |----HW_IPCC_LLD_BLE_CMD_CHANNEL----------------->|
+ * | |
+ * |<---HW_IPCC_LLD_BLE_RSP_CHANNEL------------------|
+ * | |
+ * |<---HW_IPCC_LLD_BLE_M0_CMD_CHANNEL---------------|
+ * | |
* | (MAC) |
* |----HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL-------->|
* | |
@@ -221,6 +235,8 @@ extern "C" {
#define HW_IPCC_MM_RELEASE_BUFFER_CHANNEL LL_IPCC_CHANNEL_4
#define HW_IPCC_THREAD_CLI_CMD_CHANNEL LL_IPCC_CHANNEL_5
#define HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL LL_IPCC_CHANNEL_5
+#define HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL LL_IPCC_CHANNEL_5
+#define HW_IPCC_LLD_BLE_CMD_CHANNEL LL_IPCC_CHANNEL_5
#define HW_IPCC_HCI_ACL_DATA_CHANNEL LL_IPCC_CHANNEL_6
/** CPU2 */
@@ -230,9 +246,12 @@ extern "C" {
#define HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL LL_IPCC_CHANNEL_3
#define HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL LL_IPCC_CHANNEL_3
#define HW_IPCC_LLDTESTS_M0_CMD_CHANNEL LL_IPCC_CHANNEL_3
+#define HW_IPCC_LLD_BLE_M0_CMD_CHANNEL LL_IPCC_CHANNEL_3
#define HW_IPCC_TRACES_CHANNEL LL_IPCC_CHANNEL_4
#define HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL LL_IPCC_CHANNEL_5
#define HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL LL_IPCC_CHANNEL_5
+#define HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL LL_IPCC_CHANNEL_5
+#define HW_IPCC_LLD_BLE_RSP_CHANNEL LL_IPCC_CHANNEL_5
#define HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL LL_IPCC_CHANNEL_5
#endif /*__MBOX_H */
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c
index 7e8b55724..736f2793f 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c
@@ -24,6 +24,30 @@
#include "stm_list.h"
#include "shci_tl.h"
+/**
+ * These traces are not yet supported in an usual way in the delivery package
+ * They can enabled by adding the definition of TL_SHCI_CMD_DBG_EN and/or TL_SHCI_EVT_DBG_EN in the preprocessor option in the IDE
+ */
+#if ( (TL_SHCI_CMD_DBG_EN != 0) || (TL_SHCI_EVT_DBG_EN != 0) )
+#include "app_conf.h"
+#include "dbg_trace.h"
+#endif
+
+#if (TL_SHCI_CMD_DBG_EN != 0)
+#define TL_SHCI_CMD_DBG_MSG PRINT_MESG_DBG
+#define TL_SHCI_CMD_DBG_BUF PRINT_LOG_BUFF_DBG
+#else
+#define TL_SHCI_CMD_DBG_MSG(...)
+#define TL_SHCI_CMD_DBG_BUF(...)
+#endif
+
+#if (TL_SHCI_EVT_DBG_EN != 0)
+#define TL_SHCI_EVT_DBG_MSG PRINT_MESG_DBG
+#define TL_SHCI_EVT_DBG_BUF PRINT_LOG_BUFF_DBG
+#else
+#define TL_SHCI_EVT_DBG_MSG(...)
+#define TL_SHCI_EVT_DBG_BUF(...)
+#endif
/* Private typedef -----------------------------------------------------------*/
typedef enum
@@ -62,6 +86,9 @@ static void Cmd_SetStatus(SHCI_TL_CmdStatus_t shcicmdstatus);
static void TlCmdEvtReceived(TL_EvtPacket_t *shcievt);
static void TlUserEvtReceived(TL_EvtPacket_t *shcievt);
static void TlInit( TL_CmdPacket_t * p_cmdbuffer );
+static void OutputCmdTrace(TL_CmdPacket_t *pCmdBuffer);
+static void OutputRspTrace(TL_EvtPacket_t *p_rsp);
+static void OutputEvtTrace(TL_EvtPacket_t *phcievtbuffer);
/* Interface ------- ---------------------------------------------------------*/
void shci_init(void(* UserEvtRx)(void* pData), void* pConf)
@@ -99,6 +126,8 @@ void shci_user_evt_proc(void)
{
LST_remove_head ( &SHciAsynchEventQueue, (tListNode **)&phcievtbuffer );
+ OutputEvtTrace(phcievtbuffer);
+
if (shciContext.UserEvtRx != NULL)
{
UserEvtRxParam.pckt = phcievtbuffer;
@@ -155,6 +184,8 @@ void shci_send( uint16_t cmd_code, uint8_t len_cmd_payload, uint8_t * p_cmd_payl
memcpy(pCmdBuffer->cmdserial.cmd.payload, p_cmd_payload, len_cmd_payload );
+ OutputCmdTrace(pCmdBuffer);
+
shciContext.io.Send(0,0);
shci_cmd_resp_wait(SHCI_TL_DEFAULT_TIMEOUT);
@@ -165,6 +196,8 @@ void shci_send( uint16_t cmd_code, uint8_t len_cmd_payload, uint8_t * p_cmd_payl
*/
memcpy( &(p_rsp->evtserial), pCmdBuffer, ((TL_EvtSerial_t*)pCmdBuffer)->evt.plen + TL_EVT_HDR_SIZE );
+ OutputRspTrace(p_rsp);
+
Cmd_SetStatus(SHCI_TL_CmdAvailable);
return;
@@ -234,6 +267,67 @@ static void TlUserEvtReceived(TL_EvtPacket_t *shcievt)
return;
}
+static void OutputCmdTrace(TL_CmdPacket_t *pCmdBuffer)
+{
+ TL_SHCI_CMD_DBG_MSG("sys cmd: 0x%04X", pCmdBuffer->cmdserial.cmd.cmdcode);
+
+ if(pCmdBuffer->cmdserial.cmd.plen != 0)
+ {
+ TL_SHCI_CMD_DBG_MSG(" payload:");
+ TL_SHCI_CMD_DBG_BUF(pCmdBuffer->cmdserial.cmd.payload, pCmdBuffer->cmdserial.cmd.plen, "");
+ }
+ TL_SHCI_CMD_DBG_MSG("\r\n");
+
+ return;
+}
+
+static void OutputRspTrace(TL_EvtPacket_t *p_rsp)
+{
+ switch(p_rsp->evtserial.evt.evtcode)
+ {
+ case TL_BLEEVT_CC_OPCODE:
+ TL_SHCI_CMD_DBG_MSG("sys rsp: 0x%02X", p_rsp->evtserial.evt.evtcode);
+ TL_SHCI_CMD_DBG_MSG(" cmd opcode: 0x%02X", ((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->cmdcode);
+ TL_SHCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+ if((p_rsp->evtserial.evt.plen-4) != 0)
+ {
+ TL_SHCI_CMD_DBG_MSG(" payload:");
+ TL_SHCI_CMD_DBG_BUF(&((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[1], p_rsp->evtserial.evt.plen-4, "");
+ }
+ break;
+
+ default:
+ TL_SHCI_CMD_DBG_MSG("unknown sys rsp received: %02X", p_rsp->evtserial.evt.evtcode);
+ break;
+ }
+
+ TL_SHCI_CMD_DBG_MSG("\r\n");
+
+ return;
+}
+
+static void OutputEvtTrace(TL_EvtPacket_t *phcievtbuffer)
+{
+ if(phcievtbuffer->evtserial.evt.evtcode != TL_BLEEVT_VS_OPCODE)
+ {
+ TL_SHCI_EVT_DBG_MSG("unknown sys evt received: %02X", phcievtbuffer->evtserial.evt.evtcode);
+ }
+ else
+ {
+ TL_SHCI_EVT_DBG_MSG("sys evt: 0x%02X", phcievtbuffer->evtserial.evt.evtcode);
+ TL_SHCI_EVT_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(phcievtbuffer->evtserial.evt.payload))->subevtcode);
+ if((phcievtbuffer->evtserial.evt.plen-2) != 0)
+ {
+ TL_SHCI_EVT_DBG_MSG(" payload:");
+ TL_SHCI_EVT_DBG_BUF(((TL_AsynchEvt_t*)(phcievtbuffer->evtserial.evt.payload))->payload, phcievtbuffer->evtserial.evt.plen-2, "");
+ }
+ }
+
+ TL_SHCI_EVT_DBG_MSG("\r\n");
+
+ return;
+}
+
/* Weak implementation ----------------------------------------------------------------*/
__WEAK void shci_cmd_resp_wait(uint32_t timeout)
{
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl.h b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl.h
index b11658914..e5fac4137 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl.h
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl.h
@@ -57,6 +57,7 @@ extern "C" {
#define TL_BLEEVT_CC_OPCODE (0x0E)
#define TL_BLEEVT_CS_OPCODE (0x0F)
+#define TL_BLEEVT_VS_OPCODE (0xFF)
#define TL_BLEEVT_CS_PACKET_SIZE (TL_EVT_HDR_SIZE + sizeof(TL_CsEvt_t))
#define TL_BLEEVT_CS_BUFFER_SIZE (sizeof(TL_PacketHeader_t) + TL_BLEEVT_CS_PACKET_SIZE)
@@ -194,6 +195,12 @@ typedef struct
typedef struct
{
+ uint8_t *p_LldBleCmdRspBuffer;
+ uint8_t *p_LldBleM0CmdBuffer;
+} TL_LLD_BLE_Config_t;
+
+typedef struct
+{
uint8_t *p_Mac_802_15_4_CmdRspBuffer;
uint8_t *p_Mac_802_15_4_NotAckBuffer;
} TL_MAC_802_15_4_Config_t;
@@ -275,6 +282,18 @@ void TL_LLDTESTS_ReceiveM0Cmd( TL_CmdPacket_t * Notbuffer );
void TL_LLDTESTS_SendM0CmdAck( void );
/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+void TL_LLD_BLE_Init( TL_LLD_BLE_Config_t *p_Config );
+void TL_LLD_BLE_SendCliCmd( void );
+void TL_LLD_BLE_ReceiveCliRsp( TL_CmdPacket_t * Notbuffer );
+void TL_LLD_BLE_SendCliRspAck( void );
+void TL_LLD_BLE_ReceiveM0Cmd( TL_CmdPacket_t * Notbuffer );
+void TL_LLD_BLE_SendM0CmdAck( void );
+void TL_LLD_BLE_SendCmd( void );
+void TL_LLD_BLE_ReceiveRsp( TL_CmdPacket_t * Notbuffer );
+void TL_LLD_BLE_SendRspAck( void );
+/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
void TL_MM_Init( TL_MM_Config_t *p_Config );
diff --git a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c
index 8a97b0038..5d7f2af7b 100644
--- a/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c
@@ -4,17 +4,17 @@
* @author MCD Application Team
* @brief Transport layer for the mailbox interface
******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under BSD 3-Clause license,
- * the "License"; You may not use this file except in compliance with the
- * License. You may obtain a copy of the License at:
- * opensource.org/licenses/BSD-3-Clause
- *
- ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
*/
@@ -26,6 +26,21 @@
#include "tl.h"
#include "mbox_def.h"
+/**
+ * These traces are not yet supported in an usual way in the delivery package
+ * They can enabled by adding the definition of TL_MM_DBG_EN in the preprocessor option in the IDE
+ */
+#if(TL_MM_DBG_EN != 0)
+#include "app_conf.h"
+#include "dbg_trace.h"
+#endif
+
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG__MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG__MSG(...)
+#endif
+
/* Private typedef -----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
@@ -37,6 +52,7 @@ PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_DeviceInfoTable_t TL_DeviceInfoTa
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_BleTable_t TL_BleTable;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_ThreadTable_t TL_ThreadTable;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_LldTestsTable_t TL_LldTestsTable;
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_LldBleTable_t TL_LldBleTable;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_SysTable_t TL_SysTable;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_MemManagerTable_t TL_MemManagerTable;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_TracesTable_t TL_TracesTable;
@@ -61,6 +77,7 @@ static void (* SYS_EVT_IoBusCallBackFunction) (TL_EvtPacket_t *phcievt);
/* Global variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void SendFreeBuf( void );
+static void OutputMemReleaseTrace(TL_EvtPacket_t * phcievt);
/* Public Functions Definition ------------------------------------------------------*/
@@ -81,6 +98,7 @@ void TL_Init( void )
TL_RefTable.p_ble_table = &TL_BleTable;
TL_RefTable.p_thread_table = &TL_ThreadTable;
TL_RefTable.p_lld_tests_table = &TL_LldTestsTable;
+ TL_RefTable.p_lld_ble_table = &TL_LldBleTable;
TL_RefTable.p_sys_table = &TL_SysTable;
TL_RefTable.p_mem_manager_table = &TL_MemManagerTable;
TL_RefTable.p_traces_table = &TL_TracesTable;
@@ -91,7 +109,6 @@ void TL_Init( void )
return;
}
-
/******************************************************************************
* BLE
******************************************************************************/
@@ -350,6 +367,77 @@ __WEAK void TL_LLDTESTS_ReceiveCliRsp( TL_CmdPacket_t * Notbuffer ){};
__WEAK void TL_LLDTESTS_ReceiveM0Cmd( TL_CmdPacket_t * Notbuffer ){};
#endif /* LLD_TESTS_WB */
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void TL_LLD_BLE_Init( TL_LLD_BLE_Config_t *p_Config )
+{
+ MB_LldBleTable_t * p_lld_ble_table;
+
+ p_lld_ble_table = TL_RefTable.p_lld_ble_table;
+ p_lld_ble_table->cmdrsp_buffer = p_Config->p_LldBleCmdRspBuffer;
+ p_lld_ble_table->m0cmd_buffer = p_Config->p_LldBleM0CmdBuffer;
+ HW_IPCC_LLD_BLE_Init();
+ return;
+}
+
+void TL_LLD_BLE_SendCliCmd( void )
+{
+ ((TL_CmdPacket_t *)(TL_RefTable.p_lld_ble_table->cmdrsp_buffer))->cmdserial.type = TL_CLICMD_PKT_TYPE;
+ HW_IPCC_LLD_BLE_SendCliCmd();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_ReceiveCliRsp( void )
+{
+ TL_LLD_BLE_ReceiveCliRsp( (TL_CmdPacket_t*)(TL_RefTable.p_lld_ble_table->cmdrsp_buffer) );
+ return;
+}
+
+void TL_LLD_BLE_SendCliRspAck( void )
+{
+ HW_IPCC_LLD_BLE_SendCliRspAck();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void )
+{
+ TL_LLD_BLE_ReceiveM0Cmd( (TL_CmdPacket_t*)(TL_RefTable.p_lld_ble_table->m0cmd_buffer) );
+ return;
+}
+
+
+void TL_LLD_BLE_SendM0CmdAck( void )
+{
+ HW_IPCC_LLD_BLE_SendM0CmdAck();
+ return;
+}
+
+__WEAK void TL_LLD_BLE_ReceiveCliRsp( TL_CmdPacket_t * Notbuffer ){};
+__WEAK void TL_LLD_BLE_ReceiveM0Cmd( TL_CmdPacket_t * Notbuffer ){};
+
+/* Transparent Mode */
+void TL_LLD_BLE_SendCmd( void )
+{
+ ((TL_CmdPacket_t *)(TL_RefTable.p_lld_ble_table->cmdrsp_buffer))->cmdserial.type = TL_CLICMD_PKT_TYPE;
+ HW_IPCC_LLD_BLE_SendCmd();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_ReceiveRsp( void )
+{
+ TL_LLD_BLE_ReceiveRsp( (TL_CmdPacket_t*)(TL_RefTable.p_lld_ble_table->cmdrsp_buffer) );
+ return;
+}
+
+void TL_LLD_BLE_SendRspAck( void )
+{
+ HW_IPCC_LLD_BLE_SendRspAck();
+ return;
+}
+#endif /* LLD_BLE_WB */
+
#ifdef MAC_802_15_4_WB
/******************************************************************************
* MAC 802.15.4
@@ -410,16 +498,16 @@ __WEAK void TL_MAC_802_15_4_NotReceived( TL_EvtPacket_t * Notbuffer ){};
******************************************************************************/
void TL_ZIGBEE_Init( TL_ZIGBEE_Config_t *p_Config )
{
- MB_ZigbeeTable_t * p_zigbee_table;
+ MB_ZigbeeTable_t * p_zigbee_table;
- p_zigbee_table = TL_RefTable.p_zigbee_table;
- p_zigbee_table->appliCmdM4toM0_buffer = p_Config->p_ZigbeeOtCmdRspBuffer;
- p_zigbee_table->notifM0toM4_buffer = p_Config->p_ZigbeeNotAckBuffer;
- p_zigbee_table->requestM0toM4_buffer = p_Config->p_ZigbeeNotifRequestBuffer;
+ p_zigbee_table = TL_RefTable.p_zigbee_table;
+ p_zigbee_table->appliCmdM4toM0_buffer = p_Config->p_ZigbeeOtCmdRspBuffer;
+ p_zigbee_table->notifM0toM4_buffer = p_Config->p_ZigbeeNotAckBuffer;
+ p_zigbee_table->requestM0toM4_buffer = p_Config->p_ZigbeeNotifRequestBuffer;
- HW_IPCC_ZIGBEE_Init();
+ HW_IPCC_ZIGBEE_Init();
- return;
+ return;
}
/* Zigbee M4 to M0 Request */
@@ -510,6 +598,8 @@ void TL_MM_EvtDone(TL_EvtPacket_t * phcievt)
{
LST_insert_tail(&LocalFreeBufQueue, (tListNode *)phcievt);
+ OutputMemReleaseTrace(phcievt);
+
HW_IPCC_MM_SendFreeBuf( SendFreeBuf );
return;
@@ -528,6 +618,38 @@ static void SendFreeBuf( void )
return;
}
+static void OutputMemReleaseTrace(TL_EvtPacket_t * phcievt)
+{
+ switch(phcievt->evtserial.evt.evtcode)
+ {
+ case TL_BLEEVT_CS_OPCODE:
+ TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
+ TL_MM_DBG__MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(phcievt->evtserial.evt.payload))->cmdcode);
+ TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
+ break;
+
+ case TL_BLEEVT_CC_OPCODE:
+ TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
+ TL_MM_DBG__MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(phcievt->evtserial.evt.payload))->cmdcode);
+ TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
+ break;
+
+ case TL_BLEEVT_VS_OPCODE:
+ TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
+ TL_MM_DBG__MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(phcievt->evtserial.evt.payload))->subevtcode);
+ TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
+ break;
+
+ default:
+ TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
+ TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
+ break;
+ }
+
+ TL_MM_DBG__MSG("\r\n");
+
+ return;
+}
/******************************************************************************
* TRACES
@@ -558,7 +680,7 @@ void HW_IPCC_TRACES_EvtNot(void)
__WEAK void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
{
- (void)(hcievt);
+ (void)(hcievt);
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc/802_15_4_mac_config.h b/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc/802_15_4_mac_config.h
index 16f06d3ba..b3346279f 100644
--- a/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc/802_15_4_mac_config.h
+++ b/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc/802_15_4_mac_config.h
@@ -31,7 +31,7 @@
/** @brief Defines the max num of target device in beacon indication in case
of pending data*/
-#define g_MAX_PENDING_ADDRESS_c 5
+#define g_MAX_PENDING_ADDRESS_c 7
/** @brief Defines the max num of ED scan results supported */
#define g_MAX_ED_SCAN_RESULTS_SUPPORTED_c 16
diff --git a/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/src/mac_802_15_4_core_wb.c b/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/src/mac_802_15_4_core_wb.c
index 47300c38e..bfcb790e9 100644
--- a/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/src/mac_802_15_4_core_wb.c
+++ b/Middlewares/ST/STM32_WPAN/mac_802_15_4/core/src/mac_802_15_4_core_wb.c
@@ -27,6 +27,9 @@
#include "802_15_4_mac_sap.h"
#include "802_15_4_mac_core.h"
+#include "dbg_trace.h"
+#include "stm_logging.h"
+
#include "tl.h"
#include "tl_mac_802_15_4.h"
diff --git a/Middlewares/ST/STM32_WPAN/stm32_wpan_common.h b/Middlewares/ST/STM32_WPAN/stm32_wpan_common.h
index 32f314465..cad9026d4 100644
--- a/Middlewares/ST/STM32_WPAN/stm32_wpan_common.h
+++ b/Middlewares/ST/STM32_WPAN/stm32_wpan_common.h
@@ -85,10 +85,10 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
#undef MAX
-#define MAX( x, y ) (((x)>(y))?(x):(y))
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#undef MIN
-#define MIN( x, y ) (((x)<(y))?(x):(y))
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#undef MODINC
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c
index e5940dda7..ee1e8ceb8 100644
--- a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c
+++ b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c
@@ -31,6 +31,7 @@
#include "thread.h"
#include "coap.h"
+extern otCoapRequestHandler defaultCoapRequestHandlerCb;
#if OPENTHREAD_ENABLE_APPLICATION_COAP
@@ -478,6 +479,8 @@ void otCoapSetDefaultHandler(otInstance *aInstance, otCoapRequestHandler aHandle
/* prepare buffer */
Thread_OT_Cmd_Request_t* p_ot_req = THREAD_Get_OTCmdPayloadBuffer();
+ defaultCoapRequestHandlerCb = aHandler;
+
p_ot_req->ID = MSG_M4TOM0_OT_COAP_SET_DEFAULT_HANDLER;
p_ot_req->Size=2;
diff --git a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c
index ec64232c0..c285101df 100644
--- a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c
+++ b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c
@@ -79,6 +79,7 @@ typedef void (*CoapResponseHandlerCallback)(otCoapHeader *aHeader, otMessage *aM
const otMessageInfo *aMessageInfo, otError aResult);
CoapRequestHandlerCallback coapRequestHandlerCb = NULL;
+otCoapRequestHandler defaultCoapRequestHandlerCb = NULL;
CoapResponseHandlerCallback coapResponseHandlerCb = NULL;
#if OPENTHREAD_ENABLE_JAM_DETECTION
@@ -126,6 +127,15 @@ HAL_StatusTypeDef OpenThread_CallBack_Processing(void)
(otMessageInfo *) p_notification->Data[3]);
}
break;
+ case MSG_M0TOM4_DEFAULT_COAP_REQUEST_HANDLER:
+ if (defaultCoapRequestHandlerCb != NULL)
+ {
+ defaultCoapRequestHandlerCb((void *) p_notification->Data[0],
+ (otCoapHeader *) p_notification->Data[1],
+ (otMessage *) p_notification->Data[2],
+ (otMessageInfo *) p_notification->Data[3]);
+ }
+ break;
case MSG_M0TOM4_COAP_RESPONSE_HANDLER:
coapResponseHandlerCb = (CoapResponseHandlerCallback) p_notification->Data[0];
if (coapResponseHandlerCb != NULL)
diff --git a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/stm32wbxx_core_interface_def.h b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/stm32wbxx_core_interface_def.h
index 1f876eefe..82eef6856 100644
--- a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/stm32wbxx_core_interface_def.h
+++ b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/stm32wbxx_core_interface_def.h
@@ -438,7 +438,8 @@ typedef enum
MSG_M0TOM4_TMF_PROXY_STREAM_HANDLER,
MSG_M0TOM4_UDP_RECEIVE,
MSG_M0TOM4_JAM_DETECTION_CALLBACK,
- MSG_M0TOM4_TRACE_SEND
+ MSG_M0TOM4_TRACE_SEND,
+ MSG_M0TOM4_DEFAULT_COAP_REQUEST_HANDLER
} MsgId_M0toM4_Enum_t;
/* List of modes available for UART configuration */
diff --git a/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c b/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c
index 58266c6ba..3f4d1daec 100644
--- a/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c
+++ b/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c
@@ -304,6 +304,35 @@ size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize)
#if defined ( __CC_ARM ) /* Keil */
+/**
+ Called from assert() and prints a message on stderr and calls abort().
+
+ \param[in] expr assert expression that was not TRUE
+ \param[in] file source file of the assertion
+ \param[in] line source line of the assertion
+*/
+__attribute__((weak,noreturn))
+void __aeabi_assert (const char *expr, const char *file, int line) {
+ char str[12], *p;
+
+ fputs("*** assertion failed: ", stderr);
+ fputs(expr, stderr);
+ fputs(", file ", stderr);
+ fputs(file, stderr);
+ fputs(", line ", stderr);
+
+ p = str + sizeof(str);
+ *--p = '\0';
+ *--p = '\n';
+ while (line > 0) {
+ *--p = '0' + (line % 10);
+ line /= 10;
+ }
+ fputs(p, stderr);
+
+ abort();
+}
+
/* For KEIL re-implement our own version of fputc */
int fputc(int ch, FILE *f)
{
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/SLA0044.txt b/Middlewares/ST/STM32_WPAN/zigbee/SLA0044.txt
new file mode 100644
index 000000000..6d9df6788
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/SLA0044.txt
@@ -0,0 +1,65 @@
+ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT
+
+BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE
+OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS
+INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES
+(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON
+BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES
+TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT.
+
+Under STMicroelectronics’ intellectual property rights, the redistribution,
+reproduction and use in source and binary forms of the software or any part
+thereof, with or without modification, are permitted provided that the following
+conditions are met:
+1. Redistribution of source code (modified or not) must retain any copyright
+ notice, this list of conditions and the disclaimer set forth below as items
+ 10 and 11.
+2. Redistributions in binary form, except as embedded into microcontroller or
+ microprocessor device manufactured by or for STMicroelectronics or a software
+ update for such device, must reproduce any copyright notice provided with the
+ binary code, this list of conditions, and the disclaimer set forth below as
+ items 10 and 11, in documentation and/or other materials provided with the
+ distribution.
+3. Neither the name of STMicroelectronics nor the names of other contributors to
+ this software may be used to endorse or promote products derived from this
+ software or part thereof without specific written permission.
+4. This software or any part thereof, including modifications and/or derivative
+ works of this software, must be used and execute solely and exclusively on or
+ in combination with a microcontroller or microprocessor device manufactured
+ by or for STMicroelectronics.
+5. No use, reproduction or redistribution of this software partially or totally
+ may be done in any manner that would subject this software to any Open Source
+ Terms. “Open Source Terms” shall mean any open source license which requires
+ as part of distribution of software that the source code of such software is
+ distributed therewith or otherwise made available, or open source license
+ that substantially complies with the Open Source definition specified at
+ www.opensource.org and any other comparable open source license such as for
+ example GNU General Public License (GPL), Eclipse Public License (EPL), Apache
+ Software License, BSD license or MIT license.
+6. STMicroelectronics has no obligation to provide any maintenance, support or
+ updates for the software.
+7. The software is and will remain the exclusive property of STMicroelectronics
+ and its licensors. The recipient will not take any action that jeopardizes
+ STMicroelectronics and its licensors' proprietary rights or acquire any
+ rights in the software, except the limited rights specified hereunder.
+8. The recipient shall comply with all applicable laws and regulations affecting
+ the use of the software or any part thereof including any applicable export
+ control law or regulation.
+9. Redistribution and use of this software or any part thereof other than as
+ permitted under this license is void and will automatically terminate your
+ rights under this license.
+10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE
+ DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL
+ STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER
+ EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL
+ PROPERTY RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY. \ No newline at end of file
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/STM32WB_ZigbeeGettingStarted.pdf b/Middlewares/ST/STM32_WPAN/zigbee/STM32WB_ZigbeeGettingStarted.pdf
new file mode 100644
index 000000000..ffececeb8
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/STM32WB_ZigbeeGettingStarted.pdf
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/core/inc/stm32wbxx_core_interface_def.h b/Middlewares/ST/STM32_WPAN/zigbee/core/inc/stm32wbxx_core_interface_def.h
index dae2a14c3..6c2077b14 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/core/inc/stm32wbxx_core_interface_def.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/core/inc/stm32wbxx_core_interface_def.h
@@ -43,23 +43,21 @@ typedef struct {
/* List of messages between M4 and M0 */
typedef enum {
- MSG_M4TOM0_UNKNOWN = 0x0000,
- MSG_M0TOM4_UNKNOWN = 0x0000,
-
- /* WPAN Interface */
- MSG_M4TOM0_WPAN_SET_UINT32, /* wpan_set_uint32 */
- MSG_M4TOM0_WPAN_GET_UINT32, /* wpan_get_uint32 */
+ MSG_M4TOM0_UNKNOWN = 0,
+ MSG_M0TOM4_UNKNOWN,
+ /* Query M0 to get secured memory information */
+ MSG_M4TOM0_GET_SECURED_MEM_INFO,
+ /* WPAN Interface (Virtual Testing Only) */
+ MSG_M4TOM0_WPAN_INIT,
+ MSG_M4TOM0_WPAN_DESTROY,
MSG_M4TOM0_WPAN_GET_UINT64, /* wpan_get_uint64 */
-
/* M0 Request (Separate IPCC Channel) */
MSG_M0TOM4_ZB_LOGGING, /* Zigbee stack logging (configured by ZbSetLogging) */
MSG_M0TOM4_ZB_MALLOC, /* ZbMalloc */
MSG_M0TOM4_ZB_FREE, /* ZbFree */
-
/* Stack Init / Destroy */
MSG_M4TOM0_ZB_INIT, /* ZbInit */
MSG_M4TOM0_ZB_DESTROY, /* ZbDestroy */
-
/* Stack Misc */
MSG_M4TOM0_EXTADDR_GET, /* ZbExtendedAddress */
MSG_M4TOM0_EXTADDR_CHANGE, /* ZbChangeExtAddr */
@@ -67,7 +65,7 @@ typedef enum {
MSG_M4TOM0_FILTER_DEL, /* ZbMsgFilterRemove - Delete filter in stack */
MSG_M0TOM4_FILTER_MSG_CB, /* Callback for filter messages from stack */
MSG_M4TOM0_LOG_CONFIG, /* ZbSetLogging */
-
+#ifndef CONFIG_ZB_M4_ZBTIMER_OVERRIDE
/* ZbTimer API */
MSG_M4TOM0_TIMER_ALLOC, /* ZbTimerAlloc */
MSG_M4TOM0_TIMER_FREE, /* ZbTimerFree */
@@ -75,132 +73,112 @@ typedef enum {
MSG_M4TOM0_TIMER_RESET, /* ZbTimerReset */
MSG_M4TOM0_TIMER_RUNNING, /* ZbTimerRunning */
MSG_M4TOM0_TIMER_REMAINING, /* ZbTimerRemaining */
- MSG_M0TOM4_TIMER_CB = MSG_M4TOM0_TIMER_REMAINING, /* callback from ZbTimerAlloc() */
- /* Reserved to 0x001f for Future Use */
-
+ MSG_M0TOM4_TIMER_CB, /* callback from ZbTimerAlloc() */
+#endif
/* Stack Config and Startup */
- MSG_M4TOM0_STARTUP_GET_CFG = 0x0020, /* ZbStartupConfigGetProDefaults */
+ MSG_M4TOM0_STARTUP_GET_CFG, /* ZbStartupConfigGetProDefaults */
MSG_M4TOM0_STARTUP_REQ, /* ZbStartup - Form or Join zigbee network */
- MSG_M0TOM4_STARTUP_CB = MSG_M4TOM0_STARTUP_REQ, /* Callback for ZbStartup */
+ MSG_M0TOM4_STARTUP_CB, /* Callback for ZbStartup */
MSG_M4TOM0_STARTUP_REJOIN, /* ZbStartupRejoin */
- MSG_M0TOM4_STARTUP_REJOIN_CB = MSG_M4TOM0_STARTUP_REJOIN, /* Callback for ZbStartupRejoin */
-
+ MSG_M0TOM4_STARTUP_REJOIN_CB, /* Callback for ZbStartupRejoin */
MSG_M4TOM0_STARTUP_PERSIST, /* ZbStartupPersist */
MSG_M4TOM0_STARTUP_FINDBIND, /* ZbStartupFindBindStart */
- MSG_M0TOM4_STARTUP_FINDBIND_CB = MSG_M4TOM0_STARTUP_FINDBIND,
+ MSG_M0TOM4_STARTUP_FINDBIND_CB,
MSG_M4TOM0_STARTUP_TOUCHLINK_TARGET_STOP, /* ZbStartupTouchlinkTargetStop */
MSG_M4TOM0_STARTUP_TCSO_START, /* ZbStartupTcsoStart */
- MSG_M0TOM4_STARTUP_TCSO_CB = MSG_M4TOM0_STARTUP_TCSO_START,
+ MSG_M0TOM4_STARTUP_TCSO_CB,
MSG_M4TOM0_STARTUP_TCSO_ABORT, /* ZbStartupTcsoAbort */
MSG_M4TOM0_STARTUP_TC_REJOIN, /* ZbTrustCenterRejoin */
- MSG_M0TOM4_STARTUP_TC_REJOIN_CB = MSG_M4TOM0_STARTUP_TC_REJOIN,
+ MSG_M0TOM4_STARTUP_TC_REJOIN_CB,
MSG_M4TOM0_PERSIST_ENABLE, /* ZbPersistNotifyRegister */
MSG_M0TOM4_PERSIST_CB, /* Persistent data update notification callback */
MSG_M4TOM0_PERSIST_GET, /* ZbPersistGet */
-
+ /* ZbLeave / ZbReset */
MSG_M4TOM0_ZB_LEAVE_REQ, /* ZbLeaveReq */
- MSG_M0TOM4_ZB_LEAVE_CB = MSG_M4TOM0_ZB_LEAVE_REQ, /* Callback for ZbLeaveReq */
+ MSG_M0TOM4_ZB_LEAVE_CB, /* Callback for ZbLeaveReq */
MSG_M4TOM0_ZB_RESET_REQ, /* ZbReset */
-
/* AES Hashing Functions */
MSG_M4TOM0_ZB_HASH_ADD, /* ZbHashAdd */
- MSG_M4TOM0_ZB_HASH_BYTE, /* ZbHashByte */
MSG_M4TOM0_ZB_HASH_DIGEST, /* ZbHashDigest */
-
/* ECDSA Signature Validation */
MSG_M4TOM0_ZB_SEC_ECDSA_VALIDATE, /* ZbSecEcdsaValidate */
- /* Reserved to 0x003f for Future Use */
-
- /* BDB */
- MSG_M4TOM0_BDB_GET_REQ = 0x0040, /* ZbBdbGetReq */
- MSG_M4TOM0_BDB_SET_REQ, /* ZbBdbSetReq */
- MSG_M4TOM0_BDB_SET_EP_STATUS, /* ZbBdbSetEndpointStatus */
- MSG_M4TOM0_BDB_GET_EP_STATUS, /* ZbBdbGetEndpointStatus */
- /* Reserved to 0x004f for Future Use */
+ /* Reserved to 0x00ff for Future Use */
/* ZDO Commands */
- MSG_M4TOM0_ZDO_NWK_ADDR = 0x0050, /* ZbZdoNwkAddrReq */
- MSG_M0TOM4_ZDO_NWK_ADDR_CB = MSG_M4TOM0_ZDO_NWK_ADDR,
- MSG_M4TOM0_ZDO_IEEE_ADDR = 0x0051, /* ZbZdoIeeeAddrReq */
- MSG_M0TOM4_ZDO_IEEE_ADDR_CB = MSG_M4TOM0_ZDO_IEEE_ADDR,
- MSG_M4TOM0_ZDO_NODE_DESC = 0x0052, /* ZbZdoNodeDescReq */
- MSG_M0TOM4_ZDO_NODE_DESC_CB = MSG_M4TOM0_ZDO_NODE_DESC,
- MSG_M4TOM0_ZDO_POWER_DESC = 0x0053, /* ZbZdoPowerDescReq */
- MSG_M0TOM4_ZDO_POWER_DESC_CB = MSG_M4TOM0_ZDO_POWER_DESC,
- MSG_M4TOM0_ZDO_SIMPLE_DESC = 0x0054, /* ZbZdoSimpleDescReq */
- MSG_M0TOM4_ZDO_SIMPLE_DESC_CB = MSG_M4TOM0_ZDO_SIMPLE_DESC,
- MSG_M4TOM0_ZDO_ACTIVE_EP = 0x0055, /* ZbZdoActiveEpReq */
- MSG_M0TOM4_ZDO_ACTIVE_EP_CB = MSG_M4TOM0_ZDO_ACTIVE_EP,
- MSG_M4TOM0_ZDO_MATCH_DESC = 0x0056, /* ZbZdoMatchDescReq */
- MSG_M0TOM4_ZDO_MATCH_DESC_CB = MSG_M4TOM0_ZDO_MATCH_DESC,
- MSG_M4TOM0_ZDO_MATCH_DESC_MULTI = 0x0057, /* ZbZdoMatchDescMulti (reusing a reserved ZDO cluster ID) */
- MSG_M0TOM4_ZDO_MATCH_DESC_MULTI_CB = MSG_M4TOM0_ZDO_MATCH_DESC_MULTI,
- /* Reserved */
- MSG_M4TOM0_ZDO_DEVICE_ANNCE = 0x0063, /* ZbZdoDeviceAnnce */
- MSG_M4TOM0_ZDO_DEVICE_ANNCE_ALIAS = 0x0064, /* ZbZdoDeviceAnnceAlias (reusing a reserved ZDO cluster ID) */
- /* Reserved */
- MSG_M4TOM0_ZDO_BIND = 0x0071, /* ZbZdoBindReq */
- MSG_M0TOM4_ZDO_BIND_CB = MSG_M4TOM0_ZDO_BIND,
- MSG_M4TOM0_ZDO_UNBIND = 0x0072, /* ZbZdoUnbindReq */
- MSG_M0TOM4_ZDO_UNBIND_CB = MSG_M4TOM0_ZDO_UNBIND,
- /* Reserved */
- MSG_M4TOM0_ZDO_MGMT_LQI = 0x0081, /* ZbZdoLqiReq */
- MSG_M0TOM4_ZDO_MGMT_LQI_CB = MSG_M4TOM0_ZDO_MGMT_LQI,
- /* Reserved */
- MSG_M4TOM0_ZDO_MGMT_BIND = 0x0083, /* ZbZdoMgmtBindReq */
- MSG_M0TOM4_ZDO_MGMT_BIND_CB = MSG_M4TOM0_ZDO_MGMT_BIND,
- MSG_M4TOM0_ZDO_MGMT_LEAVE = 0x0084, /* ZbZdoLeaveReq */
- MSG_M0TOM4_ZDO_MGMT_LEAVE_CB = MSG_M4TOM0_ZDO_MGMT_LEAVE,
- /* Reserved */
- MSG_M4TOM0_ZDO_MGMT_PERMIT_JOIN = 0x0086, /* ZbZdoPermitJoinReq */
- MSG_M0TOM4_ZDO_MGMT_PERMIT_JOIN_CB = MSG_M4TOM0_ZDO_MGMT_PERMIT_JOIN,
- /* Reserved */
- MSG_M4TOM0_ZDO_MGMT_NWK_UPDATE = 0x0088, /* ZbZdoNwkUpdateReq */
- MSG_M0TOM4_ZDO_MGMT_NWK_UPDATE_CB = MSG_M4TOM0_ZDO_MGMT_NWK_UPDATE,
-#if 0 /* Not required for 2.4 GHz DUT */
- MSG_M4TOM0_ZDO_MGMT_NWK_ENH_UPDATE_REQ = 0x0089, /* ZbZdoNwkEnhUpdateReq */
- MSG_M4TOM0_ZDO_MGMT_NWK_IEEE_JOIN_REQ = 0x008a, /* ZbZdoNwkIeeeJoinListReq */
- MSG_M4TOM0_ZDO_MGMT_NWK_ENH_UPDATE_NOTIFY = 0x008b, /* ZbZdoUnsolicitedEnhUpdateNotify */
- /* Reserved (0x008c to 0x00df) Future Use */
- MSG_M4TOM0_ZDO_MGMT_NWK_IEEE_JOIN_BCAST = 0x00e0, /* ZbZdoNwkIeeeJoinListBcastAll */
-#endif
- /* Reserved (0x00e1 to 0x00ff) Future Use */
-
- /* ZDO Utility */
- MSG_M4TOM0_ZDO_DEVICE_ANNCE_FILTER_REG = 0x0100, /* ZbZdoDeviceAnnceFilterRegister */
+ MSG_M4TOM0_ZDO_NWK_ADDR = 0x0100, /* ZbZdoNwkAddrReq */
+ MSG_M0TOM4_ZDO_NWK_ADDR_CB,
+ MSG_M4TOM0_ZDO_IEEE_ADDR, /* ZbZdoIeeeAddrReq */
+ MSG_M0TOM4_ZDO_IEEE_ADDR_CB,
+ MSG_M4TOM0_ZDO_NODE_DESC, /* ZbZdoNodeDescReq */
+ MSG_M0TOM4_ZDO_NODE_DESC_CB,
+ MSG_M4TOM0_ZDO_POWER_DESC, /* ZbZdoPowerDescReq */
+ MSG_M0TOM4_ZDO_POWER_DESC_CB,
+ MSG_M4TOM0_ZDO_SIMPLE_DESC, /* ZbZdoSimpleDescReq */
+ MSG_M0TOM4_ZDO_SIMPLE_DESC_CB,
+ MSG_M4TOM0_ZDO_ACTIVE_EP, /* ZbZdoActiveEpReq */
+ MSG_M0TOM4_ZDO_ACTIVE_EP_CB,
+ MSG_M4TOM0_ZDO_MATCH_DESC, /* ZbZdoMatchDescReq */
+ MSG_M0TOM4_ZDO_MATCH_DESC_CB,
+ MSG_M4TOM0_ZDO_MATCH_DESC_MULTI, /* ZbZdoMatchDescMulti (reusing a reserved ZDO cluster ID) */
+ MSG_M0TOM4_ZDO_MATCH_DESC_MULTI_CB,
+ MSG_M4TOM0_ZDO_DEVICE_ANNCE, /* ZbZdoDeviceAnnce */
+ MSG_M4TOM0_ZDO_DEVICE_ANNCE_ALIAS, /* ZbZdoDeviceAnnceAlias (reusing a reserved ZDO cluster ID) */
+ MSG_M4TOM0_ZDO_DEVICE_ANNCE_FILTER_REG, /* ZbZdoDeviceAnnceFilterRegister */
MSG_M4TOM0_ZDO_DEVICE_ANNCE_FILTER_DEL, /* ZbZdoDeviceAnnceFilterRemove */
MSG_M0TOM4_ZDO_DEVICE_ANNCE_FILTER_CB,
- /* Reserved to 0x01ff for Future Use */
+ MSG_M4TOM0_ZDO_BIND, /* ZbZdoBindReq */
+ MSG_M0TOM4_ZDO_BIND_CB,
+ MSG_M4TOM0_ZDO_UNBIND, /* ZbZdoUnbindReq */
+ MSG_M0TOM4_ZDO_UNBIND_CB,
+ MSG_M4TOM0_ZDO_MGMT_LQI, /* ZbZdoLqiReq */
+ MSG_M0TOM4_ZDO_MGMT_LQI_CB,
+ MSG_M4TOM0_ZDO_MGMT_RTG, /* ZbZdoRtgReq */
+ MSG_M0TOM4_ZDO_MGMT_RTG_CB,
+ MSG_M4TOM0_ZDO_MGMT_BIND, /* ZbZdoMgmtBindReq */
+ MSG_M0TOM4_ZDO_MGMT_BIND_CB,
+ MSG_M4TOM0_ZDO_MGMT_LEAVE, /* ZbZdoLeaveReq */
+ MSG_M0TOM4_ZDO_MGMT_LEAVE_CB,
+ MSG_M4TOM0_ZDO_MGMT_PERMIT_JOIN, /* ZbZdoPermitJoinReq */
+ MSG_M0TOM4_ZDO_MGMT_PERMIT_JOIN_CB,
+ MSG_M4TOM0_ZDO_MGMT_NWK_UPDATE, /* ZbZdoNwkUpdateReq */
+ MSG_M0TOM4_ZDO_MGMT_NWK_UPDATE_CB,
+#if 0 /* Not required for 2.4 GHz DUT */
+ MSG_M4TOM0_ZDO_MGMT_NWK_ENH_UPDATE_REQ, /* ZbZdoNwkEnhUpdateReq */
+ MSG_M4TOM0_ZDO_MGMT_NWK_IEEE_JOIN_REQ, /* ZbZdoNwkIeeeJoinListReq */
+ MSG_M4TOM0_ZDO_MGMT_NWK_ENH_UPDATE_NOTIFY, /* ZbZdoUnsolicitedEnhUpdateNotify */
+ MSG_M4TOM0_ZDO_MGMT_NWK_IEEE_JOIN_BCAST, /* ZbZdoNwkIeeeJoinListBcastAll */
+#endif
+ /* Reserved to 0x01ff Future Use */
+ /* BDB */
+ MSG_M4TOM0_BDB_GET_REQ = 0x0200, /* ZbBdbGetReq */
+ MSG_M4TOM0_BDB_SET_REQ, /* ZbBdbSetReq */
+ MSG_M4TOM0_BDB_SET_EP_STATUS, /* ZbBdbSetEndpointStatus */
+ MSG_M4TOM0_BDB_GET_EP_STATUS, /* ZbBdbGetEndpointStatus */
/* APSDE */
- MSG_M4TOM0_APSDE_DATA_REQ = 0x0200, /* ZbApsdeDataReqCallback */
- MSG_M0TOM4_APSDE_DATA_REQ_CB = MSG_M4TOM0_APSDE_DATA_REQ,
-
- /* APS (Misc) */
+ MSG_M4TOM0_APSDE_DATA_REQ, /* ZbApsdeDataReqCallback */
+ MSG_M0TOM4_APSDE_DATA_REQ_CB,
+ /* APS Endpoint */
MSG_M4TOM0_APS_FILTER_ENDPOINT_ADD, /* ZbApsFilterEndpointAdd */
MSG_M0TOM4_APS_FILTER_ENDPOINT_CB,
MSG_M4TOM0_APS_FILTER_ENDPOINT_NOMATCH_ADD, /* ZbApsmeEndpointConfigNoMatchCallback */
- /* Can re-use MSG_M0TOM4_APS_FILTER_ENDPOINT_CB, since parameters are the same. */
+ /* NoMatch filter callbacks go through MSG_M0TOM4_APS_FILTER_ENDPOINT_CB, since parameters are the same. */
MSG_M4TOM0_APS_FILTER_CLUSTER_ADD, /* ZbApsFilterClusterAdd */
MSG_M0TOM4_APS_FILTER_CLUSTER_CB,
MSG_M4TOM0_APS_EP_CLUSTER_ID_ADD, /* ZbApsmeEndpointClusterListAppend */
MSG_M4TOM0_APS_EP_EXISTS, /* ZbApsEndpointExists */
MSG_M4TOM0_APS_EP_GET_PROFILE, /* ZbApsEndpointProfile */
-
/* APSME */
MSG_M4TOM0_APS_ENDPOINT_ADD, /* ZbApsmeAddEndpoint */
MSG_M4TOM0_APS_ENDPOINT_DEL, /* ZbApsmeRemoveEndpoint */
MSG_M4TOM0_APS_GET_REQ, /* ZbApsmeGetReq */
MSG_M4TOM0_APS_SET_REQ, /* ZbApsmeSetReq */
-
MSG_M4TOM0_APSME_ADD_GROUP, /* ZbApsmeAddGroupReq */
MSG_M4TOM0_APSME_REMOVE_GROUP, /* ZbApsmeRemoveGroupReq */
MSG_M4TOM0_APSME_REMOVE_ALL_GROUPS, /* ZbApsmeRemoveAllGroupsReq */
-
MSG_M4TOM0_APSME_BIND, /* ZbApsmeBindReq */
MSG_M4TOM0_APSME_UNBIND, /* ZbApsmeUnbindReq */
MSG_M4TOM0_APS_UNBIND_ALL, /* ZbApsUnbindAllReq */
-
MSG_M4TOM0_APSME_TRANSPORT_KEY, /* ZbApsmeTransportKeyReq */
MSG_M4TOM0_APSME_REMOVE_DEVICE, /* ZbApsmeRemoveDeviceReq */
MSG_M4TOM0_APSME_REQUEST_KEY, /* ZbApsmeRequestKeyReq */
@@ -208,7 +186,6 @@ typedef enum {
MSG_M4TOM0_APSME_ADD_KEY, /* ZbApsmeAddKeyReq */
MSG_M4TOM0_APSME_GET_KEY, /* ZbApsmeGetKeyReq */
MSG_M4TOM0_APSME_REMOVE_KEY, /* ZbApsmeRemoveKeyReq */
-
/* Reserved to 0x02ff for Future Use */
/* NLME */
@@ -218,87 +195,67 @@ typedef enum {
MSG_M4TOM0_NLME_SET_INTERFACE, /* ZbNlmeSetInterface */
MSG_M4TOM0_NLME_GET_INTERFACE, /* ZbNlmeGetInterface */
MSG_M4TOM0_NLME_NET_DISC, /* ZbNlmeNetDiscReq */
- MSG_M0TOM4_NLME_NET_DISC_CB = MSG_M4TOM0_NLME_NET_DISC,
+ MSG_M0TOM4_NLME_NET_DISC_CB,
MSG_M4TOM0_NLME_LEAVE, /* ZbNlmeLeaveReq */
- MSG_M0TOM4_NLME_LEAVE_CB = MSG_M4TOM0_NLME_LEAVE,
+ MSG_M0TOM4_NLME_LEAVE_CB,
MSG_M4TOM0_NLME_PERMIT_JOIN, /* ZbNlmePermitJoinReq */
MSG_M4TOM0_NLME_RESET, /* ZbNlmeResetReq */
MSG_M4TOM0_NLME_SYNC, /* ZbNlmeSyncReq */
- MSG_M0TOM4_NLME_SYNC_CB = MSG_M4TOM0_NLME_SYNC,
+ MSG_M0TOM4_NLME_SYNC_CB,
MSG_M4TOM0_NLME_ROUTE_DISC, /* ZbNlmeRouteDiscReq */
- MSG_M0TOM4_NLME_ROUTE_DISC_CB = MSG_M4TOM0_NLME_ROUTE_DISC,
+ MSG_M0TOM4_NLME_ROUTE_DISC_CB,
/* NWK Misc and Helper API */
- MSG_M4TOM0_NWK_GET_PARENT_EXT, /* ZbNwkGetParentExtAddr */
- MSG_M4TOM0_NWK_GET_PARENT_NWK, /* ZbNwkGetParentShortAddr */
MSG_M4TOM0_NWK_GET_SEC_MATERIAL, /* ZbNwkGetSecMaterial */
MSG_M4TOM0_NWK_NNT_CLEAR_ALL, /* ZbNwkNeighborClearAll */
MSG_M4TOM0_NWK_SET_FRAME_COUNTER, /* ZbNwkSetFrameCounter */
MSG_M4TOM0_NWK_ADDR_LOOKUP_EXT, /* ZbNwkAddrLookupExt */
MSG_M4TOM0_NWK_ADDR_LOOKUP_NWK, /* ZbNwkAddrLookupNwk */
- MSG_M4TOM0_NWK_ADDR_IS_CHILD_EXT, /* ZbNwkAddrIsChildExt */
- MSG_M4TOM0_NWK_ADDR_IS_CHILD_NWK, /* ZbNwkAddrIsChildNwk */
MSG_M4TOM0_NWK_FAST_POLL_REQUEST, /* ZbNwkFastPollRequest */
MSG_M4TOM0_NWK_FAST_POLL_RELEASE, /* ZbNwkFastPollRelease */
MSG_M4TOM0_NWK_FAST_POLL_RESOURCE, /* ZbNwkFastPollResourceCount */
+ MSG_M4TOM0_NWK_EDKA_SEND, /* ZbNwkSendEdkaReq */
MSG_M4TOM0_NWK_IFC_SET_TX_POWER, /* ZbNwkIfSetTxPower */
MSG_M4TOM0_NWK_IFC_GET_TX_POWER, /* ZbNwkIfGetTxPower */
- MSG_M4TOM0_NWK_IFC_SET_DSN, /* ZbNwkIfSetDsn */
MSG_M4TOM0_NWK_SET_NEXT_CHILD_ADDR, /* ZbNwkAddrSetNextChildAddr */
+ MSG_M4TOM0_NWK_SET_COMM_INFO, /* ZbNwkCommissioningConfig */
/* Reserved to 0x03ff for Future Use */
/* ZCL Endpoint */
MSG_M4TOM0_ZCL_ENDPOINT_ADD = 0x0400, /* ZbZclAddEndpoint */
MSG_M4TOM0_ZCL_ENDPOINT_DEL, /* ZbZclRemoveEndpoint */
-
/* ZCL Cluster ID register for discovery */
MSG_M4TOM0_ZCL_CLUSTER_EP_REGISTER, /* ZbZclClusterEndpointRegister */
MSG_M4TOM0_ZCL_CLUSTER_EP_REMOVE, /* ZbZclClusterEndpointRemove */
-
/* ZCL Cluster binding and data indications */
MSG_M4TOM0_ZCL_CLUSTER_BIND, /* ZbZclClusterBind */
- MSG_M0TOM4_ZCL_CLUSTER_DATA_IND = MSG_M4TOM0_ZCL_CLUSTER_BIND,
+ MSG_M0TOM4_ZCL_CLUSTER_DATA_IND,
MSG_M4TOM0_ZCL_CLUSTER_UNBIND, /* ZbZclClusterUnbind */
-
- MSG_M4TOM0_ZCL_CLUSTER_LOOPBACK_BIND, /* ZbZclClusterLoopbackBind */
- /* Data Indications are sent using MSG_M0TOM4_ZCL_CLUSTER_DATA_IND */
- MSG_M4TOM0_ZCL_CLUSTER_LOOPBACK_UNBIND, /* ZbZclClusterLoopbackUnbind */
-
/* ZCL Cluster Alarms */
+ MSG_M4TOM0_ZCL_CLUSTER_REVERSE_BIND, /* ZbZclClusterReverseBind */
+ MSG_M4TOM0_ZCL_CLUSTER_REVERSE_UNBIND, /* ZbZclClusterReverseUnbind */
MSG_M4TOM0_ZCL_CLUSTER_ALARM_ADD_FILTER, /* ZbZclClusterRegisterAlarmResetHandler */
- MSG_M0TOM4_ZCL_CLUSTER_ALARM_CB = MSG_M4TOM0_ZCL_CLUSTER_ALARM_ADD_FILTER,
+ MSG_M0TOM4_ZCL_CLUSTER_ALARM_CB,
MSG_M4TOM0_ZCL_CLUSTER_ALARM_REMOVE_FILTER, /* ZbZclClusterRemoveAlarmResetHandler */
MSG_M4TOM0_ZCL_CLUSTER_ALARM_SEND, /* ZbZclClusterSendAlarm */
-
- /* ZCL Cluster Command and Response */
- MSG_M4TOM0_ZCL_CLUSTER_CMD_REQ, /* ZbZclClusterCommandReq */
- MSG_M0TOM4_ZCL_CLUSTER_CMD_REQ_CB = MSG_M4TOM0_ZCL_CLUSTER_CMD_REQ,
+ /* ZCL Cluster Response Senders */
MSG_M4TOM0_ZCL_CLUSTER_CMD_RSP, /* ZbZclClusterCommandRsp */
MSG_M4TOM0_ZCL_CLUSTER_CMD_RSP_WITH_CB, /* ZbZclClusterCommandRspWithCb */
- MSG_M0TOM4_ZCL_CLUSTER_CMD_RSP_CONF_CB = MSG_M4TOM0_ZCL_CLUSTER_CMD_RSP_WITH_CB,
+ MSG_M0TOM4_ZCL_CLUSTER_CMD_RSP_CONF_CB, /* APSDE.confirm callback for ZbZclClusterCommandRspWithCb */
MSG_M4TOM0_ZCL_CLUSTER_CMD_RSP_WITH_STATUS, /* ZbZclSendClusterStatusResponse */
-
/* ZCL Profile-Wide Commands */
MSG_M4TOM0_ZCL_GET_SEQNUM, /* ZbZclGetNextSeqnum */
MSG_M4TOM0_ZCL_COMMAND_REQ, /* ZbZclCommandReq */
- MSG_M0TOM4_ZCL_COMMAND_REQ_CB = MSG_M4TOM0_ZCL_COMMAND_REQ,
- MSG_M4TOM0_ZCL_COMMAND_NO_RSP, /* ZbZclCommandNoResp */
- MSG_M0TOM4_ZCL_COMMAND_NO_RSP_CB = MSG_M4TOM0_ZCL_COMMAND_NO_RSP,
+ MSG_M0TOM4_ZCL_COMMAND_REQ_CB,
MSG_M4TOM0_ZCL_SEND_DEFAULT_RSP, /* ZbZclSendDefaultResponse */
MSG_M4TOM0_ZCL_READ_REQ, /* ZbZclReadReq */
- MSG_M0TOM4_ZCL_READ_CB = MSG_M4TOM0_ZCL_READ_REQ,
+ MSG_M0TOM4_ZCL_READ_CB,
MSG_M4TOM0_ZCL_WRITE_REQ, /* ZbZclWriteReq */
- MSG_M0TOM4_ZCL_WRITE_CB = MSG_M4TOM0_ZCL_WRITE_REQ,
+ MSG_M0TOM4_ZCL_WRITE_CB,
MSG_M4TOM0_ZCL_DISCOVER_ATTR_REQ, /* ZbZclDiscoverAttrReq */
- MSG_M0TOM4_ZCL_DISCOVER_ATTR_CB = MSG_M4TOM0_ZCL_DISCOVER_ATTR_REQ,
-
- /* Reserved to 0x043f for Future Use */
-
- /* ZCL Cluster Specific APIs */
-
+ MSG_M0TOM4_ZCL_DISCOVER_ATTR_CB,
/* ZCL Key Exchange (i.e. CBKE) */
- MSG_M4TOM0_ZCL_KE_WITH_DEVICE = 0x0440, /* ZbZclKeWithDevice */
- MSG_M0TOM4_ZCL_KE_WITH_DEVICE_CB = MSG_M4TOM0_ZCL_KE_WITH_DEVICE,
-
+ MSG_M4TOM0_ZCL_KE_WITH_DEVICE, /* ZbZclKeWithDevice */
+ MSG_M0TOM4_ZCL_KE_WITH_DEVICE_CB,
/* ZCL Device Log */
#if 0 /* needed? */
MSG_M4TOM0_ZCL_DEVICE_LOG_ADD, /* ZbZclDeviceLogAdd */
@@ -307,14 +264,14 @@ typedef enum {
MSG_M4TOM0_ZCL_DEVICE_LOG_REMOVE, /* ZbZclDeviceLogRemove */
#endif
MSG_M4TOM0_ZCL_DEVICE_LOG_CHECK, /* ZbZclDeviceLogCheckAllow */
-
/* ZCL Basic Server */
MSG_M4TOM0_ZCL_BASIC_SERVER_ALARM_POST, /* ZbZclBasicPostAlarm */
MSG_M4TOM0_ZCL_BASIC_SERVER_CONFIG_RESET, /* ZbZclBasicServerResetCmdConfig */
MSG_M4TOM0_ZCL_BASIC_SERVER_LOCAL_WRITE, /* ZbZclBasicWriteDirect */
-
+ MSG_M4TOM0_ZCL_BASIC_SERVER_CONFIG_DEFAULTS, /* ZbZclBasicServerConfigDefaults */
/* ZCL Diagnostics Server */
MSG_M4TOM0_ZCL_DIAG_SERVER_ALLOC, /* ZbZclDiagnosticsServerAlloc */
+ /* Reserved to 0x04ff for Future Use */
/* Reserved to 0x0fff for Future Use */
@@ -325,9 +282,10 @@ typedef enum {
MSG_M4TOM0_TEST_CASE_ENABLE, /* ZbTestCaseEnable */
MSG_M4TOM0_APS_FRAG_DROP_ADD, /* ZbApsFragDropTxAdd */
MSG_M4TOM0_APS_FRAG_DROP_CLEAR, /* ZbApsFragDropTxClear */
+ /* Reserved to 0x10ff for Future Use */
/* Raw MCP Messages */
- MSG_M4TOM0_WPAN_MCP_MSG,
+ MSG_M4TOM0_WPAN_MCP_MSG = 0x1100,
MSG_M0TOM4_WPAN_MCP_MSG
} MsgId_Zigbee_Enum_t;
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/core/inc/zigbee_interface.h b/Middlewares/ST/STM32_WPAN/zigbee/core/inc/zigbee_interface.h
index f2c499887..90c1ea1f4 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/core/inc/zigbee_interface.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/core/inc/zigbee_interface.h
@@ -29,6 +29,26 @@ extern "C" {
#include "stm32wbxx_core_interface_def.h"
#include "zigbee.h"
+/*---------------------------------------------------------------
+ * Well-Known Zigbee Security Keys
+ *---------------------------------------------------------------
+ */
+/* Null (all zeroes)
+ * 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 */
+extern const uint8_t sec_key_null[ZB_SEC_KEYSIZE];
+
+/* "ZigBeeAlliance09"
+ * 5a:69:67:42:65:65:41:6c:6c:69:61:6e:63:65:30:39 */
+extern const uint8_t sec_key_ha[ZB_SEC_KEYSIZE];
+
+/* Uncertified Device's Distributed Link Key
+ * d0:d1:d2:d3:d4:d5:d6:d7:d8:d9:da:db:dc:dd:dedf */
+extern const uint8_t sec_key_distrib_uncert[ZB_SEC_KEYSIZE];
+
+/* TOUCHLINK_KEY_INDEX_CERTIFICATION key
+ * c0:c1:c2:c3:c4:c5:c6:c7 0xc8:c9:ca:cb:cc:cd:ce:cf */
+extern const uint8_t sec_key_touchlink_cert[ZB_SEC_KEYSIZE];
+
/* Exported defines ----------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c b/Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c
index 67cffe801..6353eb45f 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c
+++ b/Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c
@@ -20,6 +20,7 @@
/* Includes ------------------------------------------------------------------*/
#include <stdlib.h>
+#include <limits.h> /* ULONG_MAX */
#include <assert.h>
#include "zigbee_errors.h"
@@ -34,7 +35,6 @@
#include "dbg_trace.h"
#include "stm_logging.h"
-#include "stm32wbxx_core_interface_def.h"
/* Lock isn't required on this platform */
#define ZbEnterCritical(_zb_)
@@ -44,8 +44,6 @@
#define ZB_HEAP_MAX_ALLOC 2000U
#endif
-/* ZbTimerAlloc() needs ZbHeapAlloc */
-/* EXEGIN - remove this dependancy? */
void * zb_heap_alloc(struct ZigBeeT *zb, size_t sz, const char *funcname, unsigned int linenum);
void zb_heap_free(struct ZigBeeT *zb, void *ptr, const char *funcname, unsigned int linenum);
#if defined(CONFIG_ZB_MEMORY_DEBUG) || defined(CONFIG_ZB_MEMPOOL_HISTORY)
@@ -56,6 +54,82 @@ void zb_heap_free(struct ZigBeeT *zb, void *ptr, const char *funcname, unsigned
# define ZbHeapFree(_zb_, _ptr_) zb_heap_free(_zb_, _ptr_, "", 0)
#endif
+/* API Wrapper Helpers -------------------------------------------------------*/
+#define IPC_REQ_FUNC(name, cmd_id, req_type) \
+ void \
+ name(struct ZigBeeT *zb, req_type *r) \
+ { \
+ Zigbee_Cmd_Request_t *ipcc_req; \
+ \
+ Pre_ZigbeeCmdProcessing(); \
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer(); \
+ ipcc_req->ID = cmd_id; \
+ ipcc_req->Size = 1; \
+ ipcc_req->Data[0] = (uint32_t)r; \
+ ZIGBEE_CmdTransfer(); \
+ }
+
+#define IPC_REQ_CONF_FUNC(name, cmd_id, req_type, conf_type) \
+ void \
+ name(struct ZigBeeT *zb, req_type *r, conf_type *c) \
+ { \
+ Zigbee_Cmd_Request_t *ipcc_req; \
+ \
+ Pre_ZigbeeCmdProcessing(); \
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer(); \
+ ipcc_req->ID = cmd_id; \
+ ipcc_req->Size = 2; \
+ ipcc_req->Data[0] = (uint32_t)r; \
+ ipcc_req->Data[1] = (uint32_t)c; \
+ ZIGBEE_CmdTransfer(); \
+ }
+
+#define IPC_REQ_CALLBACK_FUNC(name, cmd_id, req_type, conf_type) \
+ enum ZbStatusCodeT \
+ name(struct ZigBeeT *zb, req_type *r, void (*callback)(struct conf_type *conf, void *cbarg), void *cbarg) \
+ { \
+ Zigbee_Cmd_Request_t *ipcc_req; \
+ struct zb_ipc_m4_cb_info_t *info; \
+ \
+ info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg); \
+ if (info == NULL) { \
+ return ZB_STATUS_ALLOC_FAIL; \
+ } \
+ \
+ Pre_ZigbeeCmdProcessing(); \
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer(); \
+ ipcc_req->ID = cmd_id; \
+ ipcc_req->Size = 2; \
+ ipcc_req->Data[0] = (uint32_t)r; \
+ ipcc_req->Data[1] = (uint32_t)info; \
+ ZIGBEE_CmdTransfer(); \
+ return (enum ZbStatusCodeT)zb_ipc_m4_get_retval(); \
+ }
+
+#define IPC_CLUSTER_REQ_CALLBACK_FUNC(name, cmd_id, req_type, rsp_type) \
+ enum ZclStatusCodeT \
+ name(struct ZbZclClusterT *clusterPtr, req_type *r, \
+ void (*callback)(const struct rsp_type *rsp, void *cbarg), void *cbarg) \
+ { \
+ Zigbee_Cmd_Request_t *ipcc_req; \
+ struct zb_ipc_m4_cb_info_t *info; \
+ \
+ info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg); \
+ if (info == NULL) { \
+ return ZCL_STATUS_INSUFFICIENT_SPACE; \
+ } \
+ \
+ Pre_ZigbeeCmdProcessing(); \
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer(); \
+ ipcc_req->ID = cmd_id; \
+ ipcc_req->Size = 3; \
+ ipcc_req->Data[0] = (uint32_t)clusterPtr; \
+ ipcc_req->Data[1] = (uint32_t)r; \
+ ipcc_req->Data[2] = (uint32_t)info; \
+ ZIGBEE_CmdTransfer(); \
+ return (enum ZclStatusCodeT)zb_ipc_m4_get_retval(); \
+ }
+
/* ZbUptimeT is an "unsigned long" */
#define ZB_UPTIME_MAX (ULONG_MAX)
@@ -89,8 +163,8 @@ const uint8_t sec_key_touchlink_cert[ZB_SEC_KEYSIZE] = {
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf
};
-struct aps_filter_cb {
- int (*callback)(ZbApsdeDataIndT *data_ind, void *cb_arg);
+struct aps_filter_cb_t {
+ int (*callback)(struct ZbApsdeDataIndT *data_ind, void *cb_arg);
void *cb_arg;
};
@@ -104,7 +178,7 @@ static const struct ZbApsAddrT sendToBinding = {
};
const struct ZbApsAddrT *ZbApsAddrBinding = &sendToBinding;
-struct zb_ipc_m4_cb_info {
+struct zb_ipc_m4_cb_info_t {
void *callback;
void *arg;
bool zcl_recv_multi_rsp;
@@ -116,22 +190,23 @@ static void *zb_persist_arg = NULL;
/* Callback for ZbZdoMatchDescMulti. It is static and never freed. It can be overwritten
* by another call to ZbZdoMatchDescMulti. */
-static void (*zdo_match_multi_cb)(ZbZdoMatchDescRspT *ind, void *cb_arg) = NULL;
+static void (*zdo_match_multi_cb)(struct ZbZdoMatchDescRspT *ind, void *cb_arg) = NULL;
+static void *zdo_match_multi_arg;
/* Some globals */
-struct zb_ipc_globals {
+struct zb_ipc_globals_t {
struct ZigBeeT *zb;
/* Stack logging callback */
uint32_t log_mask;
bool log_enable;
};
-static struct zb_ipc_globals zb_ipc_globals;
+static struct zb_ipc_globals_t zb_ipc_globals;
struct cli_app;
extern void cli_port_print_msg(struct cli_app *cli_p, const char *msg);
-int zcl_cluster_data_ind(ZbApsdeDataIndT *dataIndPtr, void *arg);
-int zcl_cluster_alarm_data_ind(ZbApsdeDataIndT *data_ind, void *arg);
+int zcl_cluster_data_ind(struct ZbApsdeDataIndT *dataIndPtr, void *arg);
+int zcl_cluster_alarm_data_ind(struct ZbApsdeDataIndT *data_ind, void *arg);
/* ST: Don't use built-in memcpy. "Unfortunately when full size optimization is enabled on
* M4 side, IAR maps memcpy to aeaby_memcpy4 instead of aeabi_memcpy which allows
@@ -146,7 +221,12 @@ zb_ipc_m4_memcpy2(void *dst, void *src, unsigned int len)
}
}
-/* EXEGIN - need to get rid of calling this from the application */
+struct ZigBeeT *
+GetZigbeePtr(void)
+{
+ return zb_ipc_globals.zb;
+}
+
ZbUptimeT
ZbUptime(void)
{
@@ -167,14 +247,14 @@ zb_ipc_m4_stack_logging_config(bool enable)
ZbSetLogging(zb_ipc_globals.zb, mask, NULL);
}
-static struct zb_ipc_m4_cb_info *
+static struct zb_ipc_m4_cb_info_t *
zb_ipc_m4_cb_info_alloc(void *callback, void *arg)
{
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
- info = malloc(sizeof(struct zb_ipc_m4_cb_info));
+ info = malloc(sizeof(struct zb_ipc_m4_cb_info_t));
if (info != NULL) {
- memset(info, 0, sizeof(struct zb_ipc_m4_cb_info));
+ memset(info, 0, sizeof(struct zb_ipc_m4_cb_info_t));
info->callback = callback;
info->arg = arg;
}
@@ -182,7 +262,7 @@ zb_ipc_m4_cb_info_alloc(void *callback, void *arg)
}
static void
-zb_ipc_m4_cb_info_free(struct zb_ipc_m4_cb_info *info)
+zb_ipc_m4_cb_info_free(struct zb_ipc_m4_cb_info_t *info)
{
free(info);
}
@@ -199,69 +279,6 @@ zb_ipc_m4_get_retval(void)
return retval;
}
-bool
-wpan_set_uint32(struct WpanPublicT *publicPtr, enum mcp_attr_id attrId, uint32_t value, uint16_t index)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- (void)publicPtr;
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_WPAN_SET_UINT32;
- ipcc_req->Size = 3;
- ipcc_req->Data[0] = (uint32_t)attrId;
- ipcc_req->Data[1] = (uint32_t)value;
- ipcc_req->Data[2] = (uint32_t)index;
- ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval() != 0U ? true : false;
-}
-
-bool
-wpan_set_uint16(struct WpanPublicT *publicPtr, enum mcp_attr_id attrId, uint16_t value, uint16_t index)
-{
- return wpan_set_uint32(publicPtr, attrId, (uint32_t)value, index);
-}
-
-bool
-wpan_set_uint8(struct WpanPublicT *publicPtr, enum mcp_attr_id attrId, uint8_t value, uint16_t index)
-{
- return wpan_set_uint32(publicPtr, attrId, (uint32_t)value, index);
-}
-
-bool
-wpan_get_uint32(struct WpanPublicT *publicPtr, enum mcp_attr_id attrId, uint32_t *value, uint16_t index)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- (void)publicPtr;
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_WPAN_GET_UINT32;
- ipcc_req->Size = 3;
- ipcc_req->Data[0] = (uint32_t)attrId;
- ipcc_req->Data[1] = (uint32_t)value;
- ipcc_req->Data[2] = (uint32_t)index;
- ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval() != 0U ? true : false;
-}
-
-bool
-wpan_get_uint64(struct WpanPublicT *publicPtr, enum mcp_attr_id attrId, uint64_t *value, uint16_t index)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- (void)publicPtr;
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_WPAN_GET_UINT64;
- ipcc_req->Size = 3;
- ipcc_req->Data[0] = (uint32_t)attrId;
- ipcc_req->Data[1] = (uint32_t)value;
- ipcc_req->Data[2] = (uint32_t)index;
- ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval() != 0U ? true : false;
-}
-
unsigned int
ZbHeapMaxAlloc(void)
{
@@ -269,7 +286,7 @@ ZbHeapMaxAlloc(void)
}
struct ZigBeeT *
-ZbInit(uint64_t extAddr, ZbInitTblSizesT *tblSizes, ZbInitSetLoggingT *setLogging)
+ZbInit(uint64_t extAddr, struct ZbInitTblSizesT *tblSizes, struct ZbInitSetLoggingT *setLogging)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -423,17 +440,11 @@ ZbStartupConfigGetProSeDefaults(struct ZbStartupT *configPtr)
}
enum ZbStatusCodeT
-ZbStartupCbkeConfig(struct ZigBeeT *zb, struct ZbStartupCbkeT *cbke_config)
-{
- /* TODO - may be required for SE certification */
- return ZB_APS_STATUS_NOT_SUPPORTED;
-}
-
-enum ZbStatusCodeT
-ZbStartup(struct ZigBeeT *zb, struct ZbStartupT *configPtr, void (*callback)(enum ZbStatusCodeT status, void *cb_arg), void *arg)
+ZbStartup(struct ZigBeeT *zb, struct ZbStartupT *configPtr,
+ void (*callback)(enum ZbStatusCodeT status, void *cb_arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
if (info == NULL) {
@@ -454,7 +465,7 @@ enum ZbStatusCodeT
ZbStartupRejoin(struct ZigBeeT *zb, void (*callback)(ZbNlmeJoinConfT *conf, void *arg), void *cbarg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg);
if (info == NULL) {
@@ -490,7 +501,7 @@ enum ZbStatusCodeT
ZbStartupFindBindStart(struct ZigBeeT *zb, void (*callback)(enum ZbStatusCodeT status, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
enum ZbStatusCodeT status;
info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
@@ -528,7 +539,7 @@ bool
ZbStartupTcsoStart(struct ZigBeeT *zb, void (*callback)(enum ZbTcsoStatusT status, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
bool retval;
info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
@@ -549,7 +560,7 @@ ZbStartupTcsoStart(struct ZigBeeT *zb, void (*callback)(enum ZbTcsoStatusT statu
/* Followed up in MSG_M0TOM4_STARTUP_TCSO_CB */
}
-void
+bool
ZbStartupTcsoAbort(struct ZigBeeT *zb)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -559,13 +570,14 @@ ZbStartupTcsoAbort(struct ZigBeeT *zb)
ipcc_req->ID = MSG_M4TOM0_STARTUP_TCSO_ABORT;
ipcc_req->Size = 0;
ZIGBEE_CmdTransfer();
+ return zb_ipc_m4_get_retval() != 0U ? true : false;
}
enum ZbStatusCodeT
ZbTrustCenterRejoin(struct ZigBeeT *zb, void (*callback)(enum ZbStatusCodeT status, void *arg), void *cbarg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg);
if (info == NULL) {
@@ -624,7 +636,7 @@ enum ZbStatusCodeT
ZbLeaveReq(struct ZigBeeT *zb, void (*callback)(struct ZbNlmeLeaveConfT *conf, void *arg), void *cbarg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg);
if (info == NULL) {
@@ -659,7 +671,7 @@ ZbReset(struct ZigBeeT *zb)
enum ZbStatusCodeT
ZbSecEcdsaValidate(struct ZigBeeT *zb, enum ZbSecEcdsaSigType sig_type,
const uint8_t *ca_pub_key_array, unsigned int ca_pub_key_len,
- const uint8_t *certificate, const uint8_t *signature,
+ const uint8_t *certificate, const uint8_t *signature,
const uint8_t *image_digest, const uint8_t *cert_digest)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -768,11 +780,12 @@ ZbBdbSetEndpointStatus(struct ZigBeeT *zb, enum ZbBdbCommissioningStatusT status
******************************************************************************
*/
enum ZbStatusCodeT
-ZbApsdeDataReqCallback(struct ZigBeeT *zb, ZbApsdeDataReqT *req, void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg)
+ZbApsdeDataReqCallback(struct ZigBeeT *zb, ZbApsdeDataReqT *req,
+ void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
uint32_t retval;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
if (info == NULL) {
@@ -795,7 +808,7 @@ ZbApsdeDataReqCallback(struct ZigBeeT *zb, ZbApsdeDataReqT *req, void (*callback
}
void
-ZbApsmeAddEndpoint(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *r, ZbApsmeAddEndpointConfT *c)
+ZbApsmeAddEndpoint(struct ZigBeeT *zb, struct ZbApsmeAddEndpointReqT *r, struct ZbApsmeAddEndpointConfT *c)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -808,30 +821,19 @@ ZbApsmeAddEndpoint(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *r, ZbApsmeAddEndp
ZIGBEE_CmdTransfer();
}
-void
-ZbApsmeRemoveEndpoint(struct ZigBeeT *zb, ZbApsmeRemoveEndpointReqT *r, ZbApsmeRemoveEndpointConfT *c)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APS_ENDPOINT_DEL;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)r;
- ipcc_req->Data[1] = (uint32_t)c;
- ZIGBEE_CmdTransfer();
-}
+IPC_REQ_CONF_FUNC(ZbApsmeRemoveEndpoint, MSG_M4TOM0_APS_ENDPOINT_DEL, ZbApsmeRemoveEndpointReqT, ZbApsmeRemoveEndpointConfT)
struct ZbApsFilterT *
ZbApsFilterEndpointAdd(struct ZigBeeT *zb, uint8_t endpoint, uint16_t profileId,
- int (*callback)(ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg)
+ int (*callback)(struct ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct aps_filter_cb *aps_filter_cb;
+ struct aps_filter_cb_t *aps_filter_cb;
struct ZbApsFilterT *filter;
- /* EXEGIN - track these allocations so they can be freed later? */
- aps_filter_cb = malloc(sizeof(struct aps_filter_cb));
+ /* Note, if we want to remove this filter at any time, we'll have to track
+ * these allocations so they can be freed later. */
+ aps_filter_cb = malloc(sizeof(struct aps_filter_cb_t));
if (aps_filter_cb == NULL) {
return NULL;
}
@@ -856,14 +858,15 @@ ZbApsFilterEndpointAdd(struct ZigBeeT *zb, uint8_t endpoint, uint16_t profileId,
bool
ZbApsmeEndpointConfigNoMatchCallback(struct ZigBeeT *zb, uint8_t endpoint,
- int (*callback)(ZbApsdeDataIndT *ind, void *arg), void *arg)
+ int (*callback)(struct ZbApsdeDataIndT *ind, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct aps_filter_cb *aps_filter_cb;
+ struct aps_filter_cb_t *aps_filter_cb;
bool retval;
- /* EXEGIN - track these allocations so they can be freed later? */
- aps_filter_cb = malloc(sizeof(struct aps_filter_cb));
+ /* Note, if we want to remove this filter at any time, we'll have to track
+ * these allocations so they can be freed later. */
+ aps_filter_cb = malloc(sizeof(struct aps_filter_cb_t));
if (aps_filter_cb == NULL) {
return false;
}
@@ -887,14 +890,15 @@ ZbApsmeEndpointConfigNoMatchCallback(struct ZigBeeT *zb, uint8_t endpoint,
struct ZbApsFilterT *
ZbApsFilterClusterAdd(struct ZigBeeT *zb, uint8_t endpoint, uint16_t clusterId, uint16_t profileId,
- int (*callback)(ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg)
+ int (*callback)(struct ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct aps_filter_cb *aps_filter_cb;
+ struct aps_filter_cb_t *aps_filter_cb;
struct ZbApsFilterT *filter;
- /* EXEGIN - track these allocations so they can be freed later. */
- aps_filter_cb = malloc(sizeof(struct aps_filter_cb));
+ /* Note, if we want to remove this filter at any time, we'll have to track
+ * these allocations so they can be freed later. */
+ aps_filter_cb = malloc(sizeof(struct aps_filter_cb_t));
if (aps_filter_cb == NULL) {
return NULL;
}
@@ -1039,47 +1043,9 @@ ZbApsSetIndex(struct ZigBeeT *zb, enum ZbApsmeIbAttrIdT attrId, const void *attr
return apsmeSetConf.status;
}
-void
-ZbApsmeAddGroupReq(struct ZigBeeT *zb, ZbApsmeAddGroupReqT *r, ZbApsmeAddGroupConfT *c)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_ADD_GROUP;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)r;
- ipcc_req->Data[1] = (uint32_t)c;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeRemoveGroupReq(struct ZigBeeT *zb, ZbApsmeRemoveGroupReqT *r, ZbApsmeRemoveGroupConfT *c)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_REMOVE_GROUP;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)r;
- ipcc_req->Data[1] = (uint32_t)c;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeRemoveAllGroupsReq(struct ZigBeeT *zb, ZbApsmeRemoveAllGroupsReqT *r, ZbApsmeRemoveAllGroupsConfT *c)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_REMOVE_ALL_GROUPS;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)r;
- ipcc_req->Data[1] = (uint32_t)c;
- ZIGBEE_CmdTransfer();
-}
+IPC_REQ_CONF_FUNC(ZbApsmeAddGroupReq, MSG_M4TOM0_APSME_ADD_GROUP, ZbApsmeAddGroupReqT, ZbApsmeAddGroupConfT)
+IPC_REQ_CONF_FUNC(ZbApsmeRemoveGroupReq, MSG_M4TOM0_APSME_REMOVE_GROUP, ZbApsmeRemoveGroupReqT, ZbApsmeRemoveGroupConfT)
+IPC_REQ_CONF_FUNC(ZbApsmeRemoveAllGroupsReq, MSG_M4TOM0_APSME_REMOVE_ALL_GROUPS, ZbApsmeRemoveAllGroupsReqT, ZbApsmeRemoveAllGroupsConfT)
bool
ZbApsGroupIsMember(struct ZigBeeT *zb, uint16_t groupAddr, uint8_t endpoint)
@@ -1169,33 +1135,8 @@ ZbApsGroupsGetMembership(struct ZigBeeT *zb, uint8_t endpoint, uint16_t *group_l
return len;
}
-void
-ZbApsmeBindReq(struct ZigBeeT *zb, ZbApsmeBindReqT *bindReqPtr, ZbApsmeBindConfT *bindConfPtr)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_BIND;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)bindReqPtr;
- ipcc_req->Data[1] = (uint32_t)bindConfPtr;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeUnbindReq(struct ZigBeeT *zb, ZbApsmeUnbindReqT *unbindReqPtr, ZbApsmeUnbindConfT *unbindConfPtr)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_UNBIND;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)unbindReqPtr;
- ipcc_req->Data[1] = (uint32_t)unbindConfPtr;
- ZIGBEE_CmdTransfer();
-}
+IPC_REQ_CONF_FUNC(ZbApsmeBindReq, MSG_M4TOM0_APSME_BIND, ZbApsmeBindReqT, ZbApsmeBindConfT)
+IPC_REQ_CONF_FUNC(ZbApsmeUnbindReq, MSG_M4TOM0_APSME_UNBIND, ZbApsmeUnbindReqT, ZbApsmeUnbindConfT)
void
ZbApsUnbindAllReq(struct ZigBeeT *zb)
@@ -1209,34 +1150,11 @@ ZbApsUnbindAllReq(struct ZigBeeT *zb)
ZIGBEE_CmdTransfer();
}
-void
-ZbApsmeTransportKeyReq(struct ZigBeeT *zb, ZbApsmeTransportKeyReqT *req)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_TRANSPORT_KEY;
- ipcc_req->Size = 1;
- ipcc_req->Data[0] = (uint32_t)req;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeRemoveDeviceReq(struct ZigBeeT *zb, ZbApsmeRemoveDeviceReqT *req)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_REMOVE_DEVICE;
- ipcc_req->Size = 1;
- ipcc_req->Data[0] = (uint32_t)req;
- ZIGBEE_CmdTransfer();
-}
+IPC_REQ_FUNC(ZbApsmeTransportKeyReq, MSG_M4TOM0_APSME_TRANSPORT_KEY, ZbApsmeTransportKeyReqT);
+IPC_REQ_FUNC(ZbApsmeRemoveDeviceReq, MSG_M4TOM0_APSME_REMOVE_DEVICE, ZbApsmeRemoveDeviceReqT);
enum ZbStatusCodeT
-ZbApsmeRequestKeyReq(struct ZigBeeT *zb, ZbApsmeRequestKeyReqT *req)
+ZbApsmeRequestKeyReq(struct ZigBeeT *zb, struct ZbApsmeRequestKeyReqT *req)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -1249,73 +1167,23 @@ ZbApsmeRequestKeyReq(struct ZigBeeT *zb, ZbApsmeRequestKeyReqT *req)
return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
}
-void
-ZbApsmeSwitchKeyReq(struct ZigBeeT *zb, ZbApsmeSwitchKeyReqT *req)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_SWITCH_KEY;
- ipcc_req->Size = 1;
- ipcc_req->Data[0] = (uint32_t)req;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeAddKeyReq(struct ZigBeeT *zb, ZbApsmeAddKeyReqT *req, ZbApsmeAddKeyConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_ADD_KEY;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeGetKeyReq(struct ZigBeeT *zb, ZbApsmeGetKeyReqT *req, ZbApsmeGetKeyConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_GET_KEY;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbApsmeRemoveKeyReq(struct ZigBeeT *zb, ZbApsmeRemoveKeyReqT *req, ZbApsmeRemoveKeyConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_APSME_REMOVE_KEY;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
+IPC_REQ_FUNC(ZbApsmeSwitchKeyReq, MSG_M4TOM0_APSME_SWITCH_KEY, ZbApsmeSwitchKeyReqT);
+IPC_REQ_CONF_FUNC(ZbApsmeAddKeyReq, MSG_M4TOM0_APSME_ADD_KEY, ZbApsmeAddKeyReqT, ZbApsmeAddKeyConfT);
+IPC_REQ_CONF_FUNC(ZbApsmeGetKeyReq, MSG_M4TOM0_APSME_GET_KEY, ZbApsmeGetKeyReqT, ZbApsmeGetKeyConfT);
+IPC_REQ_CONF_FUNC(ZbApsmeRemoveKeyReq, MSG_M4TOM0_APSME_REMOVE_KEY, ZbApsmeRemoveKeyReqT, ZbApsmeRemoveKeyConfT);
/******************************************************************************
* Zigbee Message Filters
******************************************************************************
*/
-struct zb_msg_filter_cb_info {
+struct zb_msg_filter_cb_info_t {
struct ZbMsgFilterT *filter;
enum zb_msg_filter_rc (*callback)(struct ZigBeeT *zb, uint32_t id, void *msg, void *cbarg);
void *arg;
};
#define ZB_IPC_MSG_FILTER_CB_LIST_MAX 4
-static struct zb_msg_filter_cb_info zb_msg_filter_cb_list[ZB_IPC_MSG_FILTER_CB_LIST_MAX];
+static struct zb_msg_filter_cb_info_t zb_msg_filter_cb_list[ZB_IPC_MSG_FILTER_CB_LIST_MAX];
struct ZbMsgFilterT *
ZbMsgFilterRegister(struct ZigBeeT *zb, uint32_t mask, uint8_t prio,
@@ -1323,7 +1191,7 @@ ZbMsgFilterRegister(struct ZigBeeT *zb, uint32_t mask, uint8_t prio,
{
Zigbee_Cmd_Request_t *ipcc_req;
struct ZbMsgFilterT *filter;
- struct zb_msg_filter_cb_info *cb_info;
+ struct zb_msg_filter_cb_info_t *cb_info;
unsigned int i;
for (i = 0; i < ZB_IPC_MSG_FILTER_CB_LIST_MAX; i++) {
@@ -1358,7 +1226,7 @@ void
ZbMsgFilterRemove(struct ZigBeeT *zb, struct ZbMsgFilterT *filter)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_msg_filter_cb_info *cb_info;
+ struct zb_msg_filter_cb_info_t *cb_info;
unsigned int i;
if (filter == NULL) {
@@ -1383,6 +1251,7 @@ ZbMsgFilterRemove(struct ZigBeeT *zb, struct ZbMsgFilterT *filter)
cb_info->filter = NULL;
}
+#ifndef CONFIG_ZB_M4_ZBTIMER_OVERRIDE
/******************************************************************************
* Zigbee Timer API
******************************************************************************
@@ -1538,6 +1407,7 @@ ZbTimeoutRemaining(ZbUptimeT now, ZbUptimeT expire_time)
return (unsigned int)u_delta;
}
+#endif /* CONFIG_ZB_M4_ZBTIMER_OVERRIDE */
/******************************************************************************
* NWK
@@ -1604,37 +1474,6 @@ ZbNwkSet(struct ZigBeeT *zb, enum ZbNwkNibAttrIdT attrId, void *attrPtr, unsigne
}
uint64_t
-ZbNwkGetParentExtAddr(struct ZigBeeT *zb)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- uint64_t ext_addr;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NWK_GET_PARENT_EXT;
- ipcc_req->Size = 0;
- ZIGBEE_CmdTransfer();
- /* Parse return value */
- ipcc_req = ZIGBEE_Get_OTCmdRspPayloadBuffer();
- assert(ipcc_req->Size == 2);
- zb_ipc_m4_memcpy2(&ext_addr, &ipcc_req->Data[0], 8);
- return ext_addr;
-}
-
-uint16_t
-ZbNwkGetParentShortAddr(struct ZigBeeT *zb)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NWK_GET_PARENT_NWK;
- ipcc_req->Size = 0;
- ZIGBEE_CmdTransfer();
- return (uint16_t)zb_ipc_m4_get_retval();
-}
-
-uint64_t
ZbNwkAddrLookupExt(struct ZigBeeT *zb, uint16_t nwkAddr)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -1669,37 +1508,6 @@ ZbNwkAddrLookupNwk(struct ZigBeeT *zb, uint64_t extAddr)
}
bool
-ZbNwkAddrIsChildExt(struct ZigBeeT *zb, uint64_t extAddr, uint16_t *nwkAddrPtr)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NWK_ADDR_IS_CHILD_EXT;
- /* Extended address is split across two args */
- ipcc_req->Size = 3;
- zb_ipc_m4_memcpy2(ipcc_req->Data, &extAddr, 8);
- ipcc_req->Data[2] = (uint32_t)nwkAddrPtr;
- ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval() != 0U ? true : false;
-}
-
-bool
-ZbNwkAddrIsChildNwk(struct ZigBeeT *zb, uint16_t nwkAddr, uint64_t *extAddrPtr)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NWK_ADDR_IS_CHILD_NWK;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)nwkAddr;
- ipcc_req->Data[1] = (uint32_t)extAddrPtr;
- ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval() != 0U ? true : false;
-}
-
-bool
ZbNwkGetSecMaterial(struct ZigBeeT *zb, uint8_t keySeqno, ZbNwkSecMaterialT *material)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -1714,121 +1522,20 @@ ZbNwkGetSecMaterial(struct ZigBeeT *zb, uint8_t keySeqno, ZbNwkSecMaterialT *mat
return zb_ipc_m4_get_retval() != 0U ? true : false;
}
-enum ZbStatusCodeT
-ZbNlmeNetDiscReq(struct ZigBeeT *zb, ZbNlmeNetDiscReqT *req,
- void (*callback)(ZbNlmeNetDiscConfT *conf, void *cbarg), void *cbarg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_NET_DISC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_NLME_NET_DISC_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbNlmeLeaveReq(struct ZigBeeT *zb, struct ZbNlmeLeaveReqT *req,
- void (*callback)(struct ZbNlmeLeaveConfT *leaveConfPtr, void *arg), void *cbarg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_LEAVE;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_NLME_LEAVE_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbNlmeNetDiscReq, MSG_M4TOM0_NLME_NET_DISC, ZbNlmeNetDiscReqT, ZbNlmeNetDiscConfT);
+/* Followed up in MSG_M0TOM4_NLME_NET_DISC_CB handler */
-void
-ZbNlmePermitJoinReq(struct ZigBeeT *zb, ZbNlmePermitJoinReqT *req, ZbNlmePermitJoinConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
+IPC_REQ_CALLBACK_FUNC(ZbNlmeLeaveReq, MSG_M4TOM0_NLME_LEAVE, ZbNlmeLeaveReqT, ZbNlmeLeaveConfT);
+/* Followed up in MSG_M0TOM4_NLME_LEAVE_CB handler */
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_PERMIT_JOIN;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbNlmeResetReq(struct ZigBeeT *zb, ZbNlmeResetReqT *req, ZbNlmeResetConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_RESET;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
-
-enum ZbStatusCodeT
-ZbNlmeSyncReq(struct ZigBeeT *zb, ZbNlmeSyncReqT *req,
- void (*callback)(ZbNlmeSyncConfT *syncConfPtr, void *arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_SYNC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_NLME_SYNC_CB handler */
-}
+IPC_REQ_CONF_FUNC(ZbNlmePermitJoinReq, MSG_M4TOM0_NLME_PERMIT_JOIN, ZbNlmePermitJoinReqT, ZbNlmePermitJoinConfT);
+IPC_REQ_CONF_FUNC(ZbNlmeResetReq, MSG_M4TOM0_NLME_RESET, ZbNlmeResetReqT, ZbNlmeResetConfT);
-enum ZbStatusCodeT
-ZbNlmeRouteDiscReq(struct ZigBeeT *zb, ZbNlmeRouteDiscReqT *req,
- void (*callback)(ZbNlmeRouteDiscConfT *discConf, void *cbarg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbNlmeSyncReq, MSG_M4TOM0_NLME_SYNC, ZbNlmeSyncReqT, ZbNlmeSyncConfT);
+/* Followed up in MSG_M0TOM4_NLME_SYNC_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_ROUTE_DISC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_NLME_ROUTE_DISC_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbNlmeRouteDiscReq, MSG_M4TOM0_NLME_ROUTE_DISC, ZbNlmeRouteDiscReqT, ZbNlmeRouteDiscConfT);
+/* Followed up in MSG_M0TOM4_NLME_ROUTE_DISC_CB handler */
enum WpanJoinPolicyT
ZbNlmeJoiningPolicyGet(struct ZigBeeT *zb)
@@ -1851,47 +1558,9 @@ ZbNwkNeighborClearAll(struct ZigBeeT *zb, bool keep_parent, bool keep_children)
ZIGBEE_CmdTransfer();
}
-void
-ZbNlmeDirectJoinReq(struct ZigBeeT *zb, ZbNlmeDirectJoinReqT *req, ZbNlmeDirectJoinConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_DIRECT_JOIN;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbNlmeSetInterface(struct ZigBeeT *zb, ZbNlmeSetInterfaceReqT *req, ZbNlmeSetInterfaceConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_SET_INTERFACE;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbNlmeGetInterface(struct ZigBeeT *zb, ZbNlmeGetInterfaceReqT *req, ZbNlmeGetInterfaceConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NLME_GET_INTERFACE;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)conf;
- ZIGBEE_CmdTransfer();
-}
+IPC_REQ_CONF_FUNC(ZbNlmeDirectJoinReq, MSG_M4TOM0_NLME_DIRECT_JOIN, ZbNlmeDirectJoinReqT, ZbNlmeDirectJoinConfT);
+IPC_REQ_CONF_FUNC(ZbNlmeSetInterface, MSG_M4TOM0_NLME_SET_INTERFACE, ZbNlmeSetInterfaceReqT, ZbNlmeSetInterfaceConfT);
+IPC_REQ_CONF_FUNC(ZbNlmeGetInterface, MSG_M4TOM0_NLME_GET_INTERFACE, ZbNlmeGetInterfaceReqT, ZbNlmeGetInterfaceConfT);
bool
ZbNwkIfSetTxPower(struct ZigBeeT *zb, const char *name, int8_t tx_power)
@@ -1924,21 +1593,6 @@ ZbNwkIfGetTxPower(struct ZigBeeT *zb, const char *name, int8_t *tx_power)
}
bool
-ZbNwkIfSetDsn(struct ZigBeeT *zb, const char *name, uint8_t macDsn)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_NWK_IFC_SET_DSN;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)name;
- ipcc_req->Data[1] = (uint32_t)macDsn;
- ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval() != 0U ? true : false;
-}
-
-bool
ZbNwkSetFrameCounter(struct ZigBeeT *zb, uint8_t keySeqno, uint64_t srcAddr, uint32_t newFrameCount)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -1993,6 +1647,19 @@ ZbNwkFastPollResourceCount(struct ZigBeeT *zb)
return zb_ipc_m4_get_retval();
}
+bool
+ZbNwkSendEdkaReq(struct ZigBeeT *zb)
+{
+ Zigbee_Cmd_Request_t *ipcc_req;
+
+ Pre_ZigbeeCmdProcessing();
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
+ ipcc_req->ID = MSG_M4TOM0_NWK_EDKA_SEND;
+ ipcc_req->Size = 0;
+ ZIGBEE_CmdTransfer();
+ return zb_ipc_m4_get_retval() != 0U ? true : false;
+}
+
/* Only required by zbcli. And only helps with automated verification of test cases.
* Do not use for certification. */
void
@@ -2008,28 +1675,32 @@ ZbNwkAddrSetNextChildAddr(struct ZigBeeT *zb, uint16_t nextChildAddr)
ZIGBEE_CmdTransfer();
}
-/* Required for zigbee certification only. May not be required for a DUT though. */
bool
-nwk_status_send(struct ZigBeeT *zb, uint16_t dstAddr, enum ZbNwkAddrModeT dstAddrMode,
- uint16_t statusAddr, enum ZbNwkNetworkStatusCodeT statusCode)
+ZbNwkCommissioningConfig(struct ZigBeeT *zb, struct ZbNwkCommissioningInfo *commission_info)
{
- /* TODO? */
- return false;
+ Zigbee_Cmd_Request_t *ipcc_req;
+
+ Pre_ZigbeeCmdProcessing();
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
+ ipcc_req->ID = MSG_M4TOM0_NWK_SET_COMM_INFO;
+ ipcc_req->Size = 1;
+ ipcc_req->Data[0] = (uint32_t)commission_info;
+ ZIGBEE_CmdTransfer();
+ return zb_ipc_m4_get_retval();
}
/* Required for zigbee certification only. May not be required for a DUT though. */
bool
-nwk_rreq_by_route_is_active(struct ZigBeeT *zb, ZbNwkRouteEntryT *route)
+nwk_status_send(struct ZigBeeT *zb, uint16_t dstAddr, enum ZbNwkAddrModeT dstAddrMode,
+ uint16_t statusAddr, enum ZbNwkNetworkStatusCodeT statusCode)
{
- /* TODO? */
return false;
}
+/* Required for zigbee certification only. May not be required for a DUT though. */
bool
-ZbNwkSendEdkaReq(struct ZigBeeT *zb)
+nwk_rreq_by_route_is_active(struct ZigBeeT *zb, ZbNwkRouteEntryT *route)
{
- /* TODO - may be required for a true sleepy device, where application wants
- * full control of when device polls for data. */
return false;
}
@@ -2037,21 +1708,22 @@ ZbNwkSendEdkaReq(struct ZigBeeT *zb)
* ZDO Utility
******************************************************************************
*/
-struct zdo_device_annce_cb_info {
- struct ZbZdoDeviceAnnceFilterT *handle;
- void (*callback)(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *annce, uint8_t seqno);
+struct zdo_device_annce_cb_info_t {
+ struct ZbZdoDeviceAnnceFilterT *filter;
+ void (*callback)(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceT *annce, uint8_t seqno, void *arg);
+ void *arg;
};
#define ZB_IPC_ZDO_DEVICE_ANNCE_CB_LIST_MAX 4
-static struct zdo_device_annce_cb_info zdo_device_annce_cb_list[ZB_IPC_ZDO_DEVICE_ANNCE_CB_LIST_MAX];
+static struct zdo_device_annce_cb_info_t zdo_device_annce_cb_list[ZB_IPC_ZDO_DEVICE_ANNCE_CB_LIST_MAX];
struct ZbZdoDeviceAnnceFilterT *
ZbZdoDeviceAnnceFilterRegister(struct ZigBeeT *zb,
- void (*callback)(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *annce, uint8_t seqno))
+ void (*callback)(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceT *annce, uint8_t seqno, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct ZbZdoDeviceAnnceFilterT *handle;
- struct zdo_device_annce_cb_info *cb_info;
+ struct ZbZdoDeviceAnnceFilterT *filter;
+ struct zdo_device_annce_cb_info_t *cb_info;
unsigned int i;
if (callback == NULL) {
@@ -2059,7 +1731,7 @@ ZbZdoDeviceAnnceFilterRegister(struct ZigBeeT *zb,
}
for (i = 0; i < ZB_IPC_ZDO_DEVICE_ANNCE_CB_LIST_MAX; i++) {
cb_info = &zdo_device_annce_cb_list[i];
- if (cb_info->handle == NULL) {
+ if (cb_info->filter == NULL) {
break;
}
}
@@ -2070,30 +1742,32 @@ ZbZdoDeviceAnnceFilterRegister(struct ZigBeeT *zb,
Pre_ZigbeeCmdProcessing();
ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
ipcc_req->ID = MSG_M4TOM0_ZDO_DEVICE_ANNCE_FILTER_REG;
- ipcc_req->Size = 0;
+ ipcc_req->Size = 1;
+ ipcc_req->Data[0] = (uint32_t)cb_info;
ZIGBEE_CmdTransfer();
- handle = (struct ZbZdoDeviceAnnceFilterT *)zb_ipc_m4_get_retval();
- if (handle != NULL) {
- cb_info->handle = handle;
+ filter = (struct ZbZdoDeviceAnnceFilterT *)zb_ipc_m4_get_retval();
+ if (filter != NULL) {
+ cb_info->filter = filter;
cb_info->callback = callback;
+ cb_info->arg = arg;
}
- return handle;
+ return filter;
/* Followed up in MSG_M0TOM4_ZDO_DEVICE_ANNCE_FILTER_CB handler */
}
void
-ZbZdoDeviceAnnceFilterRemove(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceFilterT *handle)
+ZbZdoDeviceAnnceFilterRemove(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceFilterT *filter)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zdo_device_annce_cb_info *cb_info;
+ struct zdo_device_annce_cb_info_t *cb_info;
unsigned int i;
- if (handle == NULL) {
+ if (filter == NULL) {
return;
}
for (i = 0; i < ZB_IPC_ZDO_DEVICE_ANNCE_CB_LIST_MAX; i++) {
cb_info = &zdo_device_annce_cb_list[i];
- if (cb_info->handle == handle) {
+ if (cb_info->filter == filter) {
break;
}
}
@@ -2105,172 +1779,39 @@ ZbZdoDeviceAnnceFilterRemove(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceFilterT
ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
ipcc_req->ID = MSG_M4TOM0_ZDO_DEVICE_ANNCE_FILTER_DEL;
ipcc_req->Size = 1;
- ipcc_req->Data[0] = (uint32_t)handle;
+ ipcc_req->Data[0] = (uint32_t)filter;
ZIGBEE_CmdTransfer();
- cb_info->handle = NULL;
+ cb_info->filter = NULL;
}
/******************************************************************************
* ZDO
******************************************************************************
*/
-enum ZbStatusCodeT
-ZbZdoNwkAddrReq(struct ZigBeeT *zb, ZbZdoNwkAddrReqT *req,
- void (*callback)(ZbZdoNwkAddrRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_NWK_ADDR;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_NWK_ADDR_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbZdoIeeeAddrReq(struct ZigBeeT *zb, ZbZdoIeeeAddrReqT *req,
- void (*callback)(ZbZdoIeeeAddrRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_IEEE_ADDR;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_IEEE_ADDR_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbZdoNodeDescReq(struct ZigBeeT *zb, ZbZdoNodeDescReqT *req,
- void (*callback)(ZbZdoNodeDescRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_NODE_DESC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_NODE_DESC_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoNwkAddrReq, MSG_M4TOM0_ZDO_NWK_ADDR, ZbZdoNwkAddrReqT, ZbZdoNwkAddrRspT);
+/* Followed up in MSG_M0TOM4_ZDO_NWK_ADDR_CB handler */
-enum ZbStatusCodeT
-ZbZdoPowerDescReq(struct ZigBeeT *zb, ZbZdoPowerDescReqT *req,
- void (*callback)(ZbZdoPowerDescRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoIeeeAddrReq, MSG_M4TOM0_ZDO_IEEE_ADDR, ZbZdoIeeeAddrReqT, ZbZdoIeeeAddrRspT);
+/* Followed up in MSG_M0TOM4_ZDO_IEEE_ADDR_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_POWER_DESC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_POWER_DESC_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoNodeDescReq, MSG_M4TOM0_ZDO_NODE_DESC, ZbZdoNodeDescReqT, ZbZdoNodeDescRspT);
+/* Followed up in MSG_M0TOM4_ZDO_NODE_DESC_CB handler */
-enum ZbStatusCodeT
-ZbZdoSimpleDescReq(struct ZigBeeT *zb, ZbZdoSimpleDescReqT *req,
- void (*callback)(ZbZdoSimpleDescRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoPowerDescReq, MSG_M4TOM0_ZDO_POWER_DESC, ZbZdoPowerDescReqT, ZbZdoPowerDescRspT);
+/* Followed up in MSG_M0TOM4_ZDO_POWER_DESC_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_SIMPLE_DESC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_SIMPLE_DESC_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbZdoActiveEpReq(struct ZigBeeT *zb, ZbZdoActiveEpReqT *req,
- void (*callback)(ZbZdoActiveEpRspT *rsp, void *arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_ACTIVE_EP;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_ACTIVE_EP_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoSimpleDescReq, MSG_M4TOM0_ZDO_SIMPLE_DESC, ZbZdoSimpleDescReqT, ZbZdoSimpleDescRspT);
+/* Followed up in MSG_M0TOM4_ZDO_SIMPLE_DESC_CB handler */
-enum ZbStatusCodeT
-ZbZdoMatchDescReq(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req,
- void (*callback)(ZbZdoMatchDescRspT *ind, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoActiveEpReq, MSG_M4TOM0_ZDO_ACTIVE_EP, ZbZdoActiveEpReqT, ZbZdoActiveEpRspT);
+/* Followed up in MSG_M0TOM4_ZDO_ACTIVE_EP_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_MATCH_DESC;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_MATCH_DESC_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoMatchDescReq, MSG_M4TOM0_ZDO_MATCH_DESC, ZbZdoMatchDescReqT, ZbZdoMatchDescRspT);
+/* Followed up in MSG_M0TOM4_ZDO_MATCH_DESC_CB handler */
enum ZbStatusCodeT
-ZbZdoMatchDescMulti(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req,
- void (*callback)(ZbZdoMatchDescRspT *ind, void *cb_arg), void *arg)
+ZbZdoMatchDescMulti(struct ZigBeeT *zb, struct ZbZdoMatchDescReqT *req,
+ void (*callback)(struct ZbZdoMatchDescRspT *ind, void *cb_arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
enum ZbStatusCodeT status;
@@ -2284,6 +1825,7 @@ ZbZdoMatchDescMulti(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req,
return ZB_ZDP_STATUS_TABLE_FULL;
}
zdo_match_multi_cb = callback;
+ zdo_match_multi_arg = arg;
Pre_ZigbeeCmdProcessing();
ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
@@ -2299,184 +1841,32 @@ ZbZdoMatchDescMulti(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req,
/* Followed up in MSG_M0TOM4_ZDO_MATCH_DESC_MULTI_CB handler */
}
-void
-ZbZdoDeviceAnnce(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *deviceAnncePtr)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_DEVICE_ANNCE;
- ipcc_req->Size = 1;
- ipcc_req->Data[0] = (uint32_t)deviceAnncePtr;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbZdoDeviceAnnceAlias(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *deviceAnncePtr)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_DEVICE_ANNCE_ALIAS;
- ipcc_req->Size = 1;
- ipcc_req->Data[0] = (uint32_t)deviceAnncePtr;
- ZIGBEE_CmdTransfer();
-}
-
-enum ZbStatusCodeT
-ZbZdoBindReq(struct ZigBeeT *zb, ZbZdoBindReqT *req,
- void (*callback)(ZbZdoBindRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_BIND;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_BIND_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbZdoUnbindReq(struct ZigBeeT *zb, ZbZdoBindReqT *req,
- void (*callback)(ZbZdoBindRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_FUNC(ZbZdoDeviceAnnce, MSG_M4TOM0_ZDO_DEVICE_ANNCE, ZbZdoDeviceAnnceT);
+IPC_REQ_FUNC(ZbZdoDeviceAnnceAlias, MSG_M4TOM0_ZDO_DEVICE_ANNCE_ALIAS, ZbZdoDeviceAnnceT);
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_UNBIND;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_UNBIND_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoBindReq, MSG_M4TOM0_ZDO_BIND, ZbZdoBindReqT, ZbZdoBindRspT);
+/* Followed up in MSG_M0TOM4_ZDO_BIND_CB handler */
-enum ZbStatusCodeT
-ZbZdoLqiReq(struct ZigBeeT *zb, ZbZdoLqiReqT *req, void (*callback)(ZbZdoLqiRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoUnbindReq, MSG_M4TOM0_ZDO_UNBIND, ZbZdoBindReqT, ZbZdoBindRspT);
+/* Followed up in MSG_M0TOM4_ZDO_UNBIND_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_MGMT_LQI;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_MGMT_LQI_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbZdoMgmtBindReq(struct ZigBeeT *zb, ZbZdoMgmtBindReqT *req,
- void (*callback)(ZbZdoMgmtBindRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_MGMT_BIND;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_MGMT_BIND_CB handler */
-}
-
-enum ZbStatusCodeT
-ZbZdoLeaveReq(struct ZigBeeT *zb, ZbZdoLeaveReqT *req,
- void (*callback)(ZbZdoLeaveRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoLqiReq, MSG_M4TOM0_ZDO_MGMT_LQI, ZbZdoLqiReqT, ZbZdoLqiRspT);
+/* Followed up in MSG_M0TOM4_ZDO_MGMT_LQI_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_MGMT_LEAVE;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_MGMT_LEAVE_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoRtgReq, MSG_M4TOM0_ZDO_MGMT_RTG, ZbZdoRtgReqT, ZbZdoRtgRspT);
+/* Followed up in MSG_M0TOM4_ZDO_MGMT_RTG_CB handler */
-enum ZbStatusCodeT
-ZbZdoPermitJoinReq(struct ZigBeeT *zb, ZbZdoPermitJoinReqT *req,
- void (*callback)(ZbZdoPermitJoinRspT *rsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoMgmtBindReq, MSG_M4TOM0_ZDO_MGMT_BIND, ZbZdoMgmtBindReqT, ZbZdoMgmtBindRspT);
+/* Followed up in MSG_M0TOM4_ZDO_MGMT_BIND_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_MGMT_PERMIT_JOIN;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_MGMT_PERMIT_JOIN_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoLeaveReq, MSG_M4TOM0_ZDO_MGMT_LEAVE, ZbZdoLeaveReqT, ZbZdoLeaveRspT);
+/* Followed up in MSG_M0TOM4_ZDO_MGMT_LEAVE_CB handler */
-enum ZbStatusCodeT
-ZbZdoNwkUpdateReq(struct ZigBeeT *zb, ZbZdoNwkUpdateReqT *req,
- void (*callback)(ZbZdoNwkUpdateNotifyT *ind, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CALLBACK_FUNC(ZbZdoPermitJoinReq, MSG_M4TOM0_ZDO_MGMT_PERMIT_JOIN, ZbZdoPermitJoinReqT, ZbZdoPermitJoinRspT);
+/* Followed up in MSG_M0TOM4_ZDO_MGMT_PERMIT_JOIN_CB handler */
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZDO_MGMT_NWK_UPDATE;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZbStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZDO_MGMT_NWK_UPDATE_CB handler */
-}
+IPC_REQ_CALLBACK_FUNC(ZbZdoNwkUpdateReq, MSG_M4TOM0_ZDO_MGMT_NWK_UPDATE, ZbZdoNwkUpdateReqT, ZbZdoNwkUpdateNotifyT);
+/* Followed up in MSG_M0TOM4_ZDO_MGMT_NWK_UPDATE_CB handler */
/******************************************************************************
* ZCL
@@ -2484,7 +1874,7 @@ ZbZdoNwkUpdateReq(struct ZigBeeT *zb, ZbZdoNwkUpdateReqT *req,
*/
bool
-ZbZclDeviceLogCheckAllow(struct ZigBeeT *zb, ZbApsdeDataIndT *dataIndPtr, struct ZbZclHeaderT *zclHdrPtr)
+ZbZclDeviceLogCheckAllow(struct ZigBeeT *zb, struct ZbApsdeDataIndT *dataIndPtr, struct ZbZclHeaderT *zclHdrPtr)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -2543,6 +1933,19 @@ ZbZclBasicWriteDirect(struct ZigBeeT *zb, uint8_t endpoint, uint16_t attributeId
return (enum ZclStatusCodeT)zb_ipc_m4_get_retval();
}
+void
+ZbZclBasicServerConfigDefaults(struct ZigBeeT *zb, const struct ZbZclBasicServerDefaults *defaults)
+{
+ Zigbee_Cmd_Request_t *ipcc_req;
+
+ Pre_ZigbeeCmdProcessing();
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
+ ipcc_req->ID = MSG_M4TOM0_ZCL_BASIC_SERVER_CONFIG_DEFAULTS;
+ ipcc_req->Size = 1;
+ ipcc_req->Data[0] = (uint32_t)defaults;
+ ZIGBEE_CmdTransfer();
+}
+
bool
ZbZclDiagnosticsServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, uint16_t profileId, enum ZbStatusCodeT minSecurity)
{
@@ -2560,7 +1963,7 @@ ZbZclDiagnosticsServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, uint16_t profi
}
void
-ZbZclAddEndpoint(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *addReqPtr, ZbApsmeAddEndpointConfT *addConfPtr)
+ZbZclAddEndpoint(struct ZigBeeT *zb, struct ZbApsmeAddEndpointReqT *req, struct ZbApsmeAddEndpointConfT *conf)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -2568,56 +1971,24 @@ ZbZclAddEndpoint(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *addReqPtr, ZbApsmeA
ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
ipcc_req->ID = MSG_M4TOM0_ZCL_ENDPOINT_ADD;
ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)addReqPtr;
- ipcc_req->Data[1] = (uint32_t)addConfPtr;
- ZIGBEE_CmdTransfer();
-}
-
-void
-ZbZclRemoveEndpoint(struct ZigBeeT *zb, ZbApsmeRemoveEndpointReqT *req, ZbApsmeRemoveEndpointConfT *conf)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_ENDPOINT_DEL;
- ipcc_req->Size = 2;
ipcc_req->Data[0] = (uint32_t)req;
ipcc_req->Data[1] = (uint32_t)conf;
ZIGBEE_CmdTransfer();
}
-enum ZclStatusCodeT
-ZbZclReadReq(struct ZbZclClusterT *clusterPtr, ZbZclReadReqT *req,
- void (*callback)(const ZbZclReadRspT *readRsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+IPC_REQ_CONF_FUNC(ZbZclRemoveEndpoint, MSG_M4TOM0_ZCL_ENDPOINT_DEL, ZbApsmeRemoveEndpointReqT, ZbApsmeRemoveEndpointConfT);
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZCL_STATUS_INSUFFICIENT_SPACE;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_READ_REQ;
- ipcc_req->Size = 3;
- ipcc_req->Data[0] = (uint32_t)clusterPtr;
- ipcc_req->Data[1] = (uint32_t)req;
- ipcc_req->Data[2] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZclStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZCL_READ_CB handler */
-}
+IPC_CLUSTER_REQ_CALLBACK_FUNC(ZbZclReadReq, MSG_M4TOM0_ZCL_READ_REQ, ZbZclReadReqT, ZbZclReadRspT);
+/* Followed up in MSG_M0TOM4_ZCL_READ_CB handler */
enum ZclStatusCodeT
ZbZclWriteReq(struct ZbZclClusterT *clusterPtr, ZbZclWriteReqT *req,
- void (*callback)(const ZbZclWriteRspT *writeResp, void *cb_arg), void *arg)
+ void (*callback)(const struct ZbZclWriteRspT *rsp, void *cbarg), void *cbarg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
+ struct zb_ipc_m4_cb_info_t *info;
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
+ info = zb_ipc_m4_cb_info_alloc((void *)callback, cbarg);
if (info == NULL) {
return ZCL_STATUS_INSUFFICIENT_SPACE;
}
@@ -2633,28 +2004,9 @@ ZbZclWriteReq(struct ZbZclClusterT *clusterPtr, ZbZclWriteReqT *req,
/* Followed up in MSG_M0TOM4_ZCL_WRITE_CB handler */
}
-enum ZclStatusCodeT
-ZbZclDiscoverAttrReq(struct ZbZclClusterT *clusterPtr, ZbZclDiscoverAttrReqT *req,
- void (*callback)(const ZbZclDiscoverAttrRspT *discRsp, void *cb_arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZCL_STATUS_INSUFFICIENT_SPACE;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_DISCOVER_ATTR_REQ;
- ipcc_req->Size = 3;
- ipcc_req->Data[0] = (uint32_t)clusterPtr;
- ipcc_req->Data[1] = (uint32_t)req;
- ipcc_req->Data[2] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZclStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZCL_DISCOVER_ATTR_CB handler */
-}
+IPC_CLUSTER_REQ_CALLBACK_FUNC(ZbZclDiscoverAttrReq, MSG_M4TOM0_ZCL_DISCOVER_ATTR_REQ,
+ ZbZclDiscoverAttrReqT, ZbZclDiscoverAttrRspT);
+/* Followed up in MSG_M0TOM4_ZCL_DISCOVER_ATTR_CB handler */
uint8_t
ZbZclGetNextSeqnum(void)
@@ -2670,11 +2022,11 @@ ZbZclGetNextSeqnum(void)
}
enum ZclStatusCodeT
-ZbZclCommandReq(struct ZigBeeT *zb, ZbZclCommandReqT *zclReq,
+ZbZclCommandReq(struct ZigBeeT *zb, struct ZbZclCommandReqT *zclReq,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info = NULL;
+ struct zb_ipc_m4_cb_info_t *info = NULL;
if (callback != NULL) {
info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
@@ -2696,28 +2048,6 @@ ZbZclCommandReq(struct ZigBeeT *zb, ZbZclCommandReqT *zclReq,
/* Followed up in MSG_M0TOM4_ZCL_COMMAND_REQ_CB handler if callback != NULL */
}
-enum ZclStatusCodeT
-ZbZclCommandNoResp(struct ZigBeeT *zb, ZbZclCommandReqT *req,
- void (*callback)(ZbApsdeDataConfT *confPtr, void *arg), void *arg)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info;
-
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_COMMAND_NO_RSP;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)req;
- ipcc_req->Data[1] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZclStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZCL_COMMAND_NO_RSP_CB handler */
-}
-
void
ZbZclSendDefaultResponse(struct ZbZclClusterT *clusterPtr, ZbApsdeDataIndT *dataIndPtr,
struct ZbZclHeaderT *zclHdrPtr, enum ZclStatusCodeT status)
@@ -2739,28 +2069,25 @@ enum ZclStatusCodeT
ZbZclClusterCommandReq(struct ZbZclClusterT *clusterPtr, struct ZbZclClusterCommandReqT *req,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg)
{
- Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info = NULL;
+ struct ZbZclCommandReqT zcl_req;
- if (callback != NULL) {
- info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
- if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
- }
- if (ZbApsAddrIsBcast(&req->dst)) {
- info->zcl_recv_multi_rsp = true; /* callback only freed on ZCL_STATUS_TIMEOUT */
- }
- }
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_CLUSTER_CMD_REQ;
- ipcc_req->Size = 3;
- ipcc_req->Data[0] = (uint32_t)clusterPtr;
- ipcc_req->Data[1] = (uint32_t)req;
- ipcc_req->Data[2] = (uint32_t)info;
- ZIGBEE_CmdTransfer();
- return (enum ZclStatusCodeT)zb_ipc_m4_get_retval();
- /* Followed up in MSG_M0TOM4_ZCL_CLUSTER_CMD_REQ_CB handler if callback != NULL */
+ /* Configure the request */
+ ZbZclClusterInitCommandReq(clusterPtr, &zcl_req);
+ zcl_req.dst = req->dst;
+ /* ZCL Header */
+ zcl_req.hdr.cmdId = req->cmdId;
+ zcl_req.hdr.frameCtrl.frameType = ZCL_FRAMETYPE_CLUSTER;
+ zcl_req.hdr.frameCtrl.manufacturer = (clusterPtr->mfrCode != 0U) ? 1U : 0U;
+ zcl_req.hdr.frameCtrl.direction = (clusterPtr->direction == ZCL_DIRECTION_TO_SERVER) ? ZCL_DIRECTION_TO_CLIENT : ZCL_DIRECTION_TO_SERVER;
+ zcl_req.hdr.frameCtrl.noDefaultResp = req->noDefaultResp;
+ zcl_req.hdr.manufacturerCode = clusterPtr->mfrCode;
+ zcl_req.hdr.seqNum = ZbZclGetNextSeqnum();
+
+ /* Payload */
+ zcl_req.payload = req->payload;
+ zcl_req.length = req->length;
+
+ return ZbZclCommandReq(clusterPtr->zb, &zcl_req, callback, arg);
}
enum ZclStatusCodeT
@@ -2787,7 +2114,7 @@ ZbZclClusterCommandRspWithCb(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrI
ZbApsBufT *payloads, uint8_t numPayloads, void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info = NULL;
+ struct zb_ipc_m4_cb_info_t *info = NULL;
enum ZclStatusCodeT status;
if (callback == NULL) {
@@ -2817,7 +2144,7 @@ ZbZclClusterCommandRspWithCb(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrI
}
enum ZclStatusCodeT
-ZbZclSendClusterStatusResponse(struct ZbZclClusterT *clusterPtr, ZbApsdeDataIndT *dataIndPtr,
+ZbZclSendClusterStatusResponse(struct ZbZclClusterT *clusterPtr, struct ZbApsdeDataIndT *dataIndPtr,
struct ZbZclHeaderT *zclHdrPtr, uint8_t cmdId, uint8_t *zclPayload, uint8_t zclPaylen)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -2900,13 +2227,13 @@ ZbZclClusterUnbind(struct ZbZclClusterT *clusterPtr)
}
enum ZclStatusCodeT
-ZbZclClusterLoopbackBind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter)
+ZbZclClusterReverseBind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter)
{
Zigbee_Cmd_Request_t *ipcc_req;
Pre_ZigbeeCmdProcessing();
ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_CLUSTER_LOOPBACK_BIND;
+ ipcc_req->ID = MSG_M4TOM0_ZCL_CLUSTER_REVERSE_BIND;
ipcc_req->Size = 2;
ipcc_req->Data[0] = (uint32_t)clusterPtr;
ipcc_req->Data[1] = (uint32_t)filter;
@@ -2916,13 +2243,13 @@ ZbZclClusterLoopbackBind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *
}
void
-ZbZclClusterLoopbackUnbind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter)
+ZbZclClusterReverseUnbind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter)
{
Zigbee_Cmd_Request_t *ipcc_req;
Pre_ZigbeeCmdProcessing();
ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZCL_CLUSTER_LOOPBACK_UNBIND;
+ ipcc_req->ID = MSG_M4TOM0_ZCL_CLUSTER_REVERSE_UNBIND;
ipcc_req->Size = 2;
ipcc_req->Data[0] = (uint32_t)clusterPtr;
ipcc_req->Data[1] = (uint32_t)filter;
@@ -2984,7 +2311,7 @@ ZbZclKeWithDevice(struct ZigBeeT *zb, uint64_t partnerAddr, bool aps_req_key,
void (*callback)(uint64_t partnerAddr, uint16_t keSuite, enum ZbZclKeyStatusT key_status, void *arg), void *arg)
{
Zigbee_Cmd_Request_t *ipcc_req;
- struct zb_ipc_m4_cb_info *info = NULL;
+ struct zb_ipc_m4_cb_info_t *info = NULL;
enum ZclStatusCodeT status;
if (callback != NULL) {
@@ -3096,14 +2423,21 @@ ZbApsFragDropTxClear(struct ZigBeeT *zb)
* AES & Hashing
******************************************************************************
*/
-void
-ZbAesMmoHash(uint8_t const *data, const unsigned int length, uint8_t *hash)
+bool
+ZbAesMmoHash(struct ZigBeeT *zb, uint8_t const *data, const unsigned int length, uint8_t *digest)
{
- struct ZbHash newHash;
+ struct ZbHash *hash;
- ZbHashInit(&newHash);
- ZbHashAdd(&newHash, data, length);
- ZbHashDigest(&newHash, hash);
+ hash = ZbHeapAlloc(zb, sizeof(struct ZbHash));
+ if (hash == NULL) {
+ return false;
+ }
+ memset(hash, 0, sizeof(struct ZbHash));
+ ZbHashInit(hash);
+ ZbHashAdd(hash, data, length);
+ ZbHashDigest(hash, digest);
+ ZbHeapFree(zb, hash);
+ return true;
}
void
@@ -3111,6 +2445,7 @@ ZbHashInit(struct ZbHash *h)
{
(void)memset(h->m, 0, sizeof(h->m));
(void)memset(h->hash, 0, sizeof(h->hash));
+ /* Don't touch h->key */
h->length = 0;
}
@@ -3130,20 +2465,6 @@ ZbHashAdd(struct ZbHash *h, const void *data, uint32_t len)
}
void
-ZbHashByte(struct ZbHash *h, uint8_t byte)
-{
- Zigbee_Cmd_Request_t *ipcc_req;
-
- Pre_ZigbeeCmdProcessing();
- ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
- ipcc_req->ID = MSG_M4TOM0_ZB_HASH_BYTE;
- ipcc_req->Size = 2;
- ipcc_req->Data[0] = (uint32_t)h;
- ipcc_req->Data[1] = (uint32_t)byte;
- ZIGBEE_CmdTransfer();
-}
-
-void
ZbHashDigest(struct ZbHash *h, void *digest)
{
Zigbee_Cmd_Request_t *ipcc_req;
@@ -3174,6 +2495,23 @@ zb_heap_free(struct ZigBeeT *zb, void *ptr, const char *filename, unsigned int l
free(ptr);
}
+bool
+zb_ipc_get_secured_mem_info(uint32_t *unsec_sram2a_sz, uint32_t *unsec_sram2b_sz)
+{
+ Zigbee_Cmd_Request_t *ipcc_req;
+ uint32_t retval;
+
+ Pre_ZigbeeCmdProcessing();
+ ipcc_req = ZIGBEE_Get_OTCmdPayloadBuffer();
+ ipcc_req->ID = MSG_M4TOM0_GET_SECURED_MEM_INFO;
+ ipcc_req->Size = 2;
+ ipcc_req->Data[0] = (uint32_t)unsec_sram2a_sz;
+ ipcc_req->Data[1] = (uint32_t)unsec_sram2b_sz;
+ ZIGBEE_CmdTransfer();
+ retval = zb_ipc_m4_get_retval();
+ return retval != 0 ? true : false;
+}
+
/******************************************************************************
* CRC (required for ZCL reporting (hash)
******************************************************************************
@@ -3260,8 +2598,9 @@ HAL_StatusTypeDef
Zigbee_CallBackProcessing(void)
{
HAL_StatusTypeDef status = HAL_OK;
- struct zb_ipc_m4_cb_info *info = NULL;
+ struct zb_ipc_m4_cb_info_t *info = NULL;
Zigbee_Cmd_Request_t *p_notification;
+ uint32_t retval = 0;
/* Get pointer on received event buffer from M0 */
p_notification = ZIGBEE_Get_NotificationPayloadBuffer();
@@ -3269,18 +2608,18 @@ Zigbee_CallBackProcessing(void)
switch (p_notification->ID) {
case MSG_M0TOM4_FILTER_MSG_CB:
{
- struct zb_msg_filter_cb_info *cb_info;
- int retval;
+ struct zb_msg_filter_cb_info_t *cb_info;
+ enum zb_msg_filter_rc filter_rc;
assert(p_notification->Size == 3);
- cb_info = (struct zb_msg_filter_cb_info *)p_notification->Data[2];
- retval = cb_info->callback(zb_ipc_globals.zb, (uint32_t)p_notification->Data[0],
+ cb_info = (struct zb_msg_filter_cb_info_t *)p_notification->Data[2];
+ filter_rc = cb_info->callback(zb_ipc_globals.zb, (uint32_t)p_notification->Data[0],
(void *)p_notification->Data[1], cb_info->arg);
- /* Return the retval in the notification ACK */
- p_notification->Data[0] = retval;
+ retval = (uint32_t)filter_rc;
break;
}
+#ifndef CONFIG_ZB_M4_ZBTIMER_OVERRIDE
case MSG_M0TOM4_TIMER_CB:
{
struct ZbTimerT *timer;
@@ -3292,10 +2631,11 @@ Zigbee_CallBackProcessing(void)
}
break;
}
+#endif
case MSG_M0TOM4_STARTUP_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(enum ZbStatusCodeT status, void *arg);
@@ -3306,18 +2646,18 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_STARTUP_REJOIN_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbNlmeJoinConfT *conf, void *arg);
+ void (*callback)(struct ZbNlmeJoinConfT *conf, void *arg);
- callback = (void (*)(ZbNlmeJoinConfT *conf, void *arg))info->callback;
- callback((ZbNlmeJoinConfT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbNlmeJoinConfT *conf, void *arg))info->callback;
+ callback((struct ZbNlmeJoinConfT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_STARTUP_FINDBIND_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(enum ZbStatusCodeT status, void *arg);
@@ -3328,7 +2668,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_STARTUP_TCSO_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(enum ZbTcsoStatusT status, void *arg);
@@ -3339,7 +2679,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_STARTUP_TC_REJOIN_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(enum ZbStatusCodeT status, void *arg);
@@ -3356,35 +2696,35 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZB_LEAVE_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(enum ZbStatusCodeT status, void *arg);
+ void (*callback)(struct ZbNlmeLeaveConfT *conf, void *arg);
- callback = (void (*)(enum ZbStatusCodeT status, void *arg))info->callback;
- callback((enum ZbStatusCodeT)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbNlmeLeaveConfT *conf, void *arg))info->callback;
+ callback((struct ZbNlmeLeaveConfT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_APSDE_DATA_REQ_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbApsdeDataConfT *conf, void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg);
- callback = (void (*)(ZbApsdeDataConfT *conf, void *arg))info->callback;
- callback((ZbApsdeDataConfT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbApsdeDataConfT *conf, void *arg))info->callback;
+ callback((struct ZbApsdeDataConfT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_APS_FILTER_ENDPOINT_CB:
{
ZbApsdeDataIndT *data_ind;
- struct aps_filter_cb *aps_filter_cb;
+ struct aps_filter_cb_t *aps_filter_cb;
int err = ZB_APS_FILTER_CONTINUE;
assert(p_notification->Size == 2);
- data_ind = (ZbApsdeDataIndT *)p_notification->Data[0];
- aps_filter_cb = (struct aps_filter_cb *)p_notification->Data[1];
+ data_ind = (struct ZbApsdeDataIndT *)p_notification->Data[0];
+ aps_filter_cb = (struct aps_filter_cb_t *)p_notification->Data[1];
if (aps_filter_cb->callback != NULL) {
err = aps_filter_cb->callback(data_ind, aps_filter_cb->cb_arg);
}
@@ -3395,13 +2735,13 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_APS_FILTER_CLUSTER_CB:
{
- ZbApsdeDataIndT *data_ind;
- struct aps_filter_cb *aps_filter_cb;
+ struct ZbApsdeDataIndT *data_ind;
+ struct aps_filter_cb_t *aps_filter_cb;
int err = ZB_APS_FILTER_CONTINUE;
assert(p_notification->Size == 2);
- data_ind = (ZbApsdeDataIndT *)p_notification->Data[0];
- aps_filter_cb = (struct aps_filter_cb *)p_notification->Data[1];
+ data_ind = (struct ZbApsdeDataIndT *)p_notification->Data[0];
+ aps_filter_cb = (struct aps_filter_cb_t *)p_notification->Data[1];
if (aps_filter_cb->callback != NULL) {
err = aps_filter_cb->callback(data_ind, aps_filter_cb->cb_arg);
}
@@ -3412,18 +2752,18 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_NLME_NET_DISC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbNlmeNetDiscConfT *conf, void *arg);
+ void (*callback)(struct ZbNlmeNetDiscConfT *conf, void *arg);
- callback = (void (*)(ZbNlmeNetDiscConfT *conf, void *arg))info->callback;
- callback((ZbNlmeNetDiscConfT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbNlmeNetDiscConfT *conf, void *arg))info->callback;
+ callback((struct ZbNlmeNetDiscConfT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_NLME_LEAVE_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(struct ZbNlmeLeaveConfT *conf, void *arg);
@@ -3434,45 +2774,56 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_NLME_SYNC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbNlmeSyncConfT *conf, void *arg);
+ void (*callback)(struct ZbNlmeSyncConfT *conf, void *arg);
- callback = (void (*)(ZbNlmeSyncConfT *discConf, void *arg))info->callback;
- callback((ZbNlmeSyncConfT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbNlmeSyncConfT *discConf, void *arg))info->callback;
+ callback((struct ZbNlmeSyncConfT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_NLME_ROUTE_DISC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbNlmeRouteDiscConfT *discConf, void *cbarg);
+ void (*callback)(struct ZbNlmeRouteDiscConfT *discConf, void *cbarg);
- callback = (void (*)(ZbNlmeRouteDiscConfT *discConf, void *cbarg))info->callback;
- callback((ZbNlmeRouteDiscConfT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbNlmeRouteDiscConfT *discConf, void *cbarg))info->callback;
+ callback((struct ZbNlmeRouteDiscConfT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_DEVICE_ANNCE_FILTER_CB:
{
- struct zdo_device_annce_cb_info *cb_info;
+ struct zdo_device_annce_cb_info_t *cb_info;
+ struct ZbZdoDeviceAnnceT *annce;
+ uint8_t seqno;
unsigned int i;
- assert(p_notification->Size == 2);
+ assert(p_notification->Size == 3);
+ cb_info = (void *)p_notification->Data[2];
for (i = 0; i < ZB_IPC_ZDO_DEVICE_ANNCE_CB_LIST_MAX; i++) {
- cb_info = &zdo_device_annce_cb_list[i];
- if (cb_info->handle != NULL) {
- cb_info->callback(zb_ipc_globals.zb, (ZbZdoDeviceAnnceT *)p_notification->Data[0], (uint8_t)p_notification->Data[1]);
+ /* Find the matching filter callback */
+ if (cb_info != &zdo_device_annce_cb_list[i]) {
+ continue;
+ }
+ if (cb_info->filter == NULL) {
+ /* Shouldn't get here */
break;
}
+ /* Call the Device Annce callback */
+ annce = (struct ZbZdoDeviceAnnceT *)p_notification->Data[0];
+ seqno = (uint8_t)p_notification->Data[1];
+ cb_info->callback(zb_ipc_globals.zb, annce, seqno, cb_info->arg);
+ break;
}
break;
}
case MSG_M0TOM4_ZDO_NWK_ADDR_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoNwkAddrRspT *rsp, void *cbarg);
@@ -3483,7 +2834,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_IEEE_ADDR_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoIeeeAddrRspT *rsp, void *cbarg);
@@ -3494,7 +2845,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_NODE_DESC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoNodeDescRspT *rsp, void *cbarg);
@@ -3505,7 +2856,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_POWER_DESC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoPowerDescRspT *rsp, void *cbarg);
@@ -3516,7 +2867,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_SIMPLE_DESC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoSimpleDescRspT *rsp, void *cbarg);
@@ -3527,7 +2878,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_ACTIVE_EP_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoActiveEpRspT *rsp, void *cbarg);
@@ -3538,7 +2889,7 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_MATCH_DESC_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(ZbZdoMatchDescRspT *rsp, void *cbarg);
@@ -3548,14 +2899,14 @@ Zigbee_CallBackProcessing(void)
break;
case MSG_M0TOM4_ZDO_MATCH_DESC_MULTI_CB:
+ /* Note, we're not using zb_ipc_m4_cb_info for this API, so we don't need
+ * the callback argument. */
+ assert(p_notification->Size == 1);
if (zdo_match_multi_cb != NULL) {
- ZbZdoMatchDescRspT *rsp;
+ struct ZbZdoMatchDescRspT *rsp;
- /* Note, we're not using zb_ipc_m4_cb_info for this API, so we don't need
- * the callback argument. */
- assert(p_notification->Size == 1);
- rsp = (ZbZdoMatchDescRspT *)p_notification->Data[0];
- zdo_match_multi_cb(rsp, NULL);
+ rsp = (struct ZbZdoMatchDescRspT *)p_notification->Data[0];
+ zdo_match_multi_cb(rsp, zdo_match_multi_arg);
if (rsp->status == ZB_ZDP_STATUS_TIMEOUT) {
/* Release the callback */
zdo_match_multi_cb = NULL;
@@ -3565,89 +2916,100 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZDO_BIND_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoBindRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoBindRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoBindRspT *rsp, void *cbarg))info->callback;
- callback((ZbZdoBindRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoBindRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoBindRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_UNBIND_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoBindRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoBindRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoBindRspT *rsp, void *cbarg))info->callback;
- callback((ZbZdoBindRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoBindRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoBindRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_MGMT_LQI_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoLqiRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoLqiRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoLqiRspT *rsp, void *cbarg))info->callback;
- callback((ZbZdoLqiRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoLqiRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoLqiRspT *)p_notification->Data[0], info->arg);
+ }
+ break;
+
+ case MSG_M0TOM4_ZDO_MGMT_RTG_CB:
+ assert(p_notification->Size == 2);
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
+ if ((info != NULL) && (info->callback != NULL)) {
+ void (*callback)(struct ZbZdoRtgRspT *rsp, void *cbarg);
+
+ callback = (void (*)(struct ZbZdoRtgRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoRtgRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_MGMT_BIND_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoMgmtBindRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoMgmtBindRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoMgmtBindRspT *rsp, void *cbarg))info->callback;
- callback((ZbZdoMgmtBindRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoMgmtBindRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoMgmtBindRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_MGMT_LEAVE_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoLeaveRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoLeaveRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoLeaveRspT *rsp, void *cbarg))info->callback;
- callback((ZbZdoLeaveRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoLeaveRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoLeaveRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_MGMT_PERMIT_JOIN_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoPermitJoinRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoPermitJoinRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoPermitJoinRspT *rsp, void *cbarg))info->callback;
- callback((ZbZdoPermitJoinRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoPermitJoinRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoPermitJoinRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZDO_MGMT_NWK_UPDATE_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZdoNwkUpdateNotifyT *rsp, void *cbarg);
+ void (*callback)(struct ZbZdoNwkUpdateNotifyT *rsp, void *cbarg);
- callback = (void (*)(ZbZdoNwkUpdateNotifyT *rsp, void *cbarg))info->callback;
- callback((ZbZdoNwkUpdateNotifyT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZdoNwkUpdateNotifyT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZdoNwkUpdateNotifyT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZCL_CLUSTER_DATA_IND:
{
- ZbApsdeDataIndT *dataIndPtr;
+ struct ZbApsdeDataIndT *dataIndPtr;
void *cb_arg;
int err;
assert(p_notification->Size == 2);
- dataIndPtr = (ZbApsdeDataIndT *)p_notification->Data[0];
+ dataIndPtr = (struct ZbApsdeDataIndT *)p_notification->Data[0];
cb_arg = (void *)p_notification->Data[1];
err = zcl_cluster_data_ind(dataIndPtr, cb_arg);
/* Return err in second argument */
@@ -3657,12 +3019,12 @@ Zigbee_CallBackProcessing(void)
case MSG_M0TOM4_ZCL_CLUSTER_ALARM_CB:
{
- ZbApsdeDataIndT *dataIndPtr;
+ struct ZbApsdeDataIndT *dataIndPtr;
void *cb_arg;
int err;
assert(p_notification->Size == 2);
- dataIndPtr = (ZbApsdeDataIndT *)p_notification->Data[0];
+ dataIndPtr = (struct ZbApsdeDataIndT *)p_notification->Data[0];
cb_arg = (void *)p_notification->Data[1];
err = zcl_cluster_alarm_data_ind(dataIndPtr, cb_arg);
/* Return err in second argument */
@@ -3670,35 +3032,14 @@ Zigbee_CallBackProcessing(void)
break;
}
- case MSG_M0TOM4_ZCL_CLUSTER_CMD_REQ_CB:
- assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
- /* Note: shouldn't get here if callback was NULL in request, so info should
- * always be non-NULL. */
- if (info != NULL) {
- struct ZbZclCommandRspT *zcl_rsp = (struct ZbZclCommandRspT *)p_notification->Data[0];
-
- if (info->callback != NULL) {
- void (*callback)(struct ZbZclCommandRspT *rsp, void *cbarg);
-
- callback = (void (*)(struct ZbZclCommandRspT *rsp, void *cbarg))info->callback;
- callback(zcl_rsp, info->arg);
- }
- if (info->zcl_recv_multi_rsp && (zcl_rsp->status != ZCL_STATUS_TIMEOUT)) {
- /* Don't free the callback yet */
- info = NULL;
- }
- }
- break;
-
case MSG_M0TOM4_ZCL_CLUSTER_CMD_RSP_CONF_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbApsdeDataConfT *conf, void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg);
- callback = (void (*)(ZbApsdeDataConfT *conf, void *arg))info->callback;
- callback((ZbApsdeDataConfT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbApsdeDataConfT *conf, void *arg))info->callback;
+ callback((struct ZbApsdeDataConfT *)p_notification->Data[0], info->arg);
}
break;
@@ -3707,7 +3048,7 @@ Zigbee_CallBackProcessing(void)
int err = ZB_APS_FILTER_CONTINUE;
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
/* Note: shouldn't get here if callback was NULL in request, so info should
* always be non-NULL. */
if (info != NULL) {
@@ -3729,53 +3070,42 @@ Zigbee_CallBackProcessing(void)
break;
}
- case MSG_M0TOM4_ZCL_COMMAND_NO_RSP_CB:
- assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
- if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbApsdeDataConfT *conf, void *arg);
-
- callback = (void (*)(ZbApsdeDataConfT *conf, void *arg))info->callback;
- callback((ZbApsdeDataConfT *)p_notification->Data[0], info->arg);
- }
- break;
-
case MSG_M0TOM4_ZCL_READ_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZclReadRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZclReadRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZclReadRspT *rsp, void *cbarg))info->callback;
- callback((ZbZclReadRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZclReadRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZclReadRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZCL_WRITE_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZclWriteRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZclWriteRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZclWriteRspT *rsp, void *cbarg))info->callback;
- callback((ZbZclWriteRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZclWriteRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZclWriteRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZCL_DISCOVER_ATTR_CB:
assert(p_notification->Size == 2);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[1];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[1];
if ((info != NULL) && (info->callback != NULL)) {
- void (*callback)(ZbZclDiscoverAttrRspT *rsp, void *cbarg);
+ void (*callback)(struct ZbZclDiscoverAttrRspT *rsp, void *cbarg);
- callback = (void (*)(ZbZclDiscoverAttrRspT *rsp, void *cbarg))info->callback;
- callback((ZbZclDiscoverAttrRspT *)p_notification->Data[0], info->arg);
+ callback = (void (*)(struct ZbZclDiscoverAttrRspT *rsp, void *cbarg))info->callback;
+ callback((struct ZbZclDiscoverAttrRspT *)p_notification->Data[0], info->arg);
}
break;
case MSG_M0TOM4_ZCL_KE_WITH_DEVICE_CB:
assert(p_notification->Size == 5);
- info = (struct zb_ipc_m4_cb_info *)p_notification->Data[4];
+ info = (struct zb_ipc_m4_cb_info_t *)p_notification->Data[4];
if ((info != NULL) && (info->callback != NULL)) {
void (*callback)(uint64_t partnerAddr, uint16_t keSuite, enum ZbZclKeyStatusT key_status, void *arg);
uint64_t partnerAddr;
@@ -3795,6 +3125,9 @@ Zigbee_CallBackProcessing(void)
zb_ipc_m4_cb_info_free(info);
}
+ /* Return the retval, if any. */
+ p_notification->Data[0] = retval;
+
TL_ZIGBEE_SendM4AckToM0Notify();
return status;
}
@@ -3841,11 +3174,11 @@ Zigbee_M0RequestProcessing(void)
return status;
}
-
/* Function which needs to be overloaded for test purpose
* In particular when using the ZbCli interface
*/
-__weak void cli_port_print_msg(struct cli_app *cli_p, const char *msg)
+__weak void
+cli_port_print_msg(struct cli_app *cli_p, const char *msg)
{
UNUSED(cli_p);
UNUSED(msg);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewd b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewd
new file mode 100644
index 000000000..917876a78
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewd
@@ -0,0 +1,1440 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>thread_ftd</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M0+.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>ARMSIM_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M0.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>NULINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewp b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewp
new file mode 100644
index 000000000..8ded43cc3
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewp
@@ -0,0 +1,1385 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>standard</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>standard\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>standard\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>standard\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>To be used with the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.60.2.11347</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB_M4 ST STM32WB_M4</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB_M4 ST STM32WB_M4</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ <state>CONFIG_ZCL_OPTIONAL_ATTR_SET</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../../../../zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../../Drivers/CMSIS/Core/Include</state>
+ <state>$PROJ_DIR$/../../../../zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../zigbee/core/inc</state>
+ <state>$PROJ_DIR$/../../../../zigbee/stack</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>standard_M0.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild>CMD /C "copy standard\Exe\stm32wb_zigbee_wb_lib.a ..\..\"</postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>standard.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_standard.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>$PROJ_DIR$\standard\Exe\stm32wb_zigbee_wb_lib.a</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ </group>
+ <group>
+ <name>stack</name>
+ <group>
+ <name>zcl</name>
+ <group>
+ <name>commission</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\commission\zcl_commission_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\commission\zcl_commission_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>general</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_alarm_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_alarm_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ballast_config_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ballast_config_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_basic_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_color_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_color_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_dehum_ctrl_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_dehum_ctrl_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_device_temp_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_device_temp_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_diagnostics_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_doorlock_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_doorlock_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_elec_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_elec_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_fan_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_fan_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_groups_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_groups_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_identify_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_identify_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_level_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_level_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_level_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_level_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_meter_id_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_meter_id_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_nearest_gw_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_nearest_gw_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_occupancy_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_occupancy_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_swconfig_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_swconfig_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ota_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ota_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_poll_control_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_poll_control_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_config_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_config_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_profile_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_profile_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_press_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_press_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_pump_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_pump_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_rssi_loc_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_rssi_loc_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_scenes_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_scenes_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_temp_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_temp_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_ui_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_ui_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_time_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_time_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_voice_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_voice_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_water_content_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_water_content_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_window_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_window_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>se</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\local_zcl_tunnel.h</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_drlc_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_drlc_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_messaging_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_messaging_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_price_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_price_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_simplemeter_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_simplemeter_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_tunnel_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_tunnel_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>security</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_ace_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_ace_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_wd_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_wd_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_zone_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_zone_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>st_custom</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_ls_client.c</name>
+ <excluded>
+ <configuration>standard</configuration>
+ </excluded>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_ls_server.c</name>
+ <excluded>
+ <configuration>standard</configuration>
+ </excluded>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_matrix_client.c</name>
+ <excluded>
+ <configuration>standard</configuration>
+ </excluded>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_matrix_server.c</name>
+ <excluded>
+ <configuration>standard</configuration>
+ </excluded>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_float.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_integer.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_report.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_string.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_cluster.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_cluster_init.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_command_ind.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_header.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\pletoh.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+</project>
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewt b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewt
new file mode 100644
index 000000000..060511934
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.ewt
@@ -0,0 +1,1527 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>standard</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-STAT</name>
+ <archiveVersion>261</archiveVersion>
+ <data>
+ <version>261</version>
+ <cstatargs>
+ <useExtraArgs>0</useExtraArgs>
+ <extraArgs></extraArgs>
+ <analyzeTimeoutEnabled>1</analyzeTimeoutEnabled>
+ <analyzeTimeout>600</analyzeTimeout>
+ <enableParallel>0</enableParallel>
+ <parallelThreads>2</parallelThreads>
+ <enableFalsePositives>0</enableFalsePositives>
+ <messagesLimitEnabled>1</messagesLimitEnabled>
+ <messagesLimit>100</messagesLimit>
+ </cstatargs>
+ <cstat_settings>
+ <cstat_version>1.5.0</cstat_version>
+ <checks_tree>
+ <package name="STDCHECKS" enabled="true">
+ <group enabled="true" name="ARR">
+ <check name="ARR-inv-index-pos" enabled="true" />
+ <check name="ARR-inv-index-ptr-pos" enabled="true" />
+ <check name="ARR-inv-index-ptr" enabled="true" />
+ <check name="ARR-inv-index" enabled="true" />
+ <check name="ARR-neg-index" enabled="true" />
+ <check name="ARR-uninit-index" enabled="true" />
+ </group>
+ <group enabled="true" name="ATH">
+ <check name="ATH-cmp-float" enabled="true" />
+ <check name="ATH-cmp-unsign-neg" enabled="true" />
+ <check name="ATH-cmp-unsign-pos" enabled="true" />
+ <check name="ATH-div-0-assign" enabled="true" />
+ <check name="ATH-div-0-cmp-aft" enabled="false" />
+ <check name="ATH-div-0-cmp-bef" enabled="true" />
+ <check name="ATH-div-0-interval" enabled="true" />
+ <check name="ATH-div-0-pos" enabled="true" />
+ <check name="ATH-div-0-unchk-global" enabled="true" />
+ <check name="ATH-div-0-unchk-local" enabled="true" />
+ <check name="ATH-div-0-unchk-param" enabled="true" />
+ <check name="ATH-div-0" enabled="true" />
+ <check name="ATH-inc-bool" enabled="true" />
+ <check name="ATH-malloc-overrun" enabled="true" />
+ <check name="ATH-neg-check-nonneg" enabled="true" />
+ <check name="ATH-neg-check-pos" enabled="true" />
+ <check name="ATH-new-overrun" enabled="true" />
+ <check name="ATH-overflow-cast" enabled="false" />
+ <check name="ATH-overflow" enabled="true" />
+ <check name="ATH-shift-bounds" enabled="true" />
+ <check name="ATH-shift-neg" enabled="true" />
+ <check name="ATH-sizeof-by-sizeof" enabled="true" />
+ </group>
+ <group enabled="true" name="CAST">
+ <check name="CAST-old-style" enabled="false" />
+ </group>
+ <group enabled="true" name="CATCH">
+ <check name="CATCH-object-slicing" enabled="true" />
+ <check name="CATCH-xtor-bad-member" enabled="false" />
+ </group>
+ <group enabled="true" name="COMMA">
+ <check name="COMMA-overload" enabled="false" />
+ </group>
+ <group enabled="true" name="COMMENT">
+ <check name="COMMENT-nested" enabled="true" />
+ </group>
+ <group enabled="true" name="CONST">
+ <check name="CONST-member-ret" enabled="true" />
+ </group>
+ <group enabled="true" name="COP">
+ <check name="COP-alloc-ctor" enabled="false" />
+ <check name="COP-assign-op-ret" enabled="true" />
+ <check name="COP-assign-op-self" enabled="true" />
+ <check name="COP-assign-op" enabled="true" />
+ <check name="COP-copy-ctor" enabled="true" />
+ <check name="COP-dealloc-dtor" enabled="false" />
+ <check name="COP-dtor-throw" enabled="true" />
+ <check name="COP-dtor" enabled="true" />
+ <check name="COP-init-order" enabled="true" />
+ <check name="COP-init-uninit" enabled="true" />
+ <check name="COP-member-uninit" enabled="true" />
+ </group>
+ <group enabled="true" name="CPU">
+ <check name="CPU-ctor-call-virt" enabled="true" />
+ <check name="CPU-ctor-implicit" enabled="false" />
+ <check name="CPU-delete-throw" enabled="true" />
+ <check name="CPU-delete-void" enabled="true" />
+ <check name="CPU-dtor-call-virt" enabled="true" />
+ <check name="CPU-malloc-class" enabled="true" />
+ <check name="CPU-nonvirt-dtor" enabled="true" />
+ <check name="CPU-return-ref-to-class-data" enabled="true" />
+ </group>
+ <group enabled="true" name="DECL">
+ <check name="DECL-implicit-int" enabled="false" />
+ </group>
+ <group enabled="true" name="DEFINE">
+ <check name="DEFINE-hash-multiple" enabled="true" />
+ </group>
+ <group enabled="true" name="ENUM">
+ <check name="ENUM-bounds" enabled="false" />
+ </group>
+ <group enabled="true" name="EXP">
+ <check name="EXP-cond-assign" enabled="true" />
+ <check name="EXP-dangling-else" enabled="true" />
+ <check name="EXP-loop-exit" enabled="true" />
+ <check name="EXP-main-ret-int" enabled="false" />
+ <check name="EXP-null-stmt" enabled="false" />
+ <check name="EXP-stray-semicolon" enabled="false" />
+ </group>
+ <group enabled="true" name="EXPR">
+ <check name="EXPR-const-overflow" enabled="true" />
+ </group>
+ <group enabled="true" name="FPT">
+ <check name="FPT-cmp-null" enabled="true" />
+ <check name="FPT-literal" enabled="false" />
+ <check name="FPT-misuse" enabled="true" />
+ </group>
+ <group enabled="true" name="FUNC">
+ <check name="FUNC-implicit-decl" enabled="false" />
+ <check name="FUNC-unprototyped-all" enabled="false" />
+ <check name="FUNC-unprototyped-used" enabled="true" />
+ </group>
+ <group enabled="true" name="INCLUDE">
+ <check name="INCLUDE-c-file" enabled="false" />
+ </group>
+ <group enabled="true" name="INT">
+ <check name="INT-use-signed-as-unsigned-pos" enabled="false" />
+ <check name="INT-use-signed-as-unsigned" enabled="true" />
+ </group>
+ <group enabled="true" name="ITR">
+ <check name="ITR-end-cmp-aft" enabled="true" />
+ <check name="ITR-end-cmp-bef" enabled="true" />
+ <check name="ITR-invalidated" enabled="true" />
+ <check name="ITR-mismatch-alg" enabled="false" />
+ <check name="ITR-store" enabled="false" />
+ <check name="ITR-uninit" enabled="true" />
+ </group>
+ <group enabled="true" name="LIB">
+ <check name="LIB-bsearch-overrun-pos" enabled="false" />
+ <check name="LIB-bsearch-overrun" enabled="false" />
+ <check name="LIB-fn-unsafe" enabled="false" />
+ <check name="LIB-fread-overrun-pos" enabled="false" />
+ <check name="LIB-fread-overrun" enabled="true" />
+ <check name="LIB-memchr-overrun-pos" enabled="false" />
+ <check name="LIB-memchr-overrun" enabled="true" />
+ <check name="LIB-memcpy-overrun-pos" enabled="false" />
+ <check name="LIB-memcpy-overrun" enabled="true" />
+ <check name="LIB-memset-overrun-pos" enabled="false" />
+ <check name="LIB-memset-overrun" enabled="true" />
+ <check name="LIB-putenv" enabled="false" />
+ <check name="LIB-qsort-overrun-pos" enabled="false" />
+ <check name="LIB-qsort-overrun" enabled="false" />
+ <check name="LIB-return-const" enabled="true" />
+ <check name="LIB-return-error" enabled="true" />
+ <check name="LIB-return-leak" enabled="true" />
+ <check name="LIB-return-neg" enabled="true" />
+ <check name="LIB-return-null" enabled="true" />
+ <check name="LIB-sprintf-overrun" enabled="false" />
+ <check name="LIB-std-sort-overrun-pos" enabled="false" />
+ <check name="LIB-std-sort-overrun" enabled="true" />
+ <check name="LIB-strcat-overrun-pos" enabled="false" />
+ <check name="LIB-strcat-overrun" enabled="true" />
+ <check name="LIB-strcpy-overrun-pos" enabled="false" />
+ <check name="LIB-strcpy-overrun" enabled="true" />
+ <check name="LIB-strncat-overrun-pos" enabled="false" />
+ <check name="LIB-strncat-overrun" enabled="true" />
+ <check name="LIB-strncmp-overrun-pos" enabled="false" />
+ <check name="LIB-strncmp-overrun" enabled="true" />
+ <check name="LIB-strncpy-overrun-pos" enabled="false" />
+ <check name="LIB-strncpy-overrun" enabled="true" />
+ </group>
+ <group enabled="true" name="LOGIC">
+ <check name="LOGIC-overload" enabled="false" />
+ </group>
+ <group enabled="true" name="MEM">
+ <check name="MEM-delete-array-op" enabled="true" />
+ <check name="MEM-delete-op" enabled="true" />
+ <check name="MEM-double-free-alias" enabled="true" />
+ <check name="MEM-double-free-some" enabled="true" />
+ <check name="MEM-double-free" enabled="true" />
+ <check name="MEM-free-field" enabled="true" />
+ <check name="MEM-free-fptr" enabled="true" />
+ <check name="MEM-free-no-alloc-struct" enabled="false" />
+ <check name="MEM-free-no-alloc" enabled="false" />
+ <check name="MEM-free-no-use" enabled="true" />
+ <check name="MEM-free-op" enabled="true" />
+ <check name="MEM-free-struct-field" enabled="true" />
+ <check name="MEM-free-variable-alias" enabled="true" />
+ <check name="MEM-free-variable" enabled="true" />
+ <check name="MEM-leak-alias" enabled="true" />
+ <check name="MEM-leak" enabled="false" />
+ <check name="MEM-malloc-arith" enabled="false" />
+ <check name="MEM-malloc-diff-type" enabled="true" />
+ <check name="MEM-malloc-sizeof-ptr" enabled="true" />
+ <check name="MEM-malloc-sizeof" enabled="true" />
+ <check name="MEM-malloc-strlen" enabled="false" />
+ <check name="MEM-realloc-diff-type" enabled="true" />
+ <check name="MEM-return-free" enabled="true" />
+ <check name="MEM-return-no-assign" enabled="true" />
+ <check name="MEM-stack-global-field" enabled="true" />
+ <check name="MEM-stack-global" enabled="true" />
+ <check name="MEM-stack-param-ref" enabled="true" />
+ <check name="MEM-stack-param" enabled="true" />
+ <check name="MEM-stack-pos" enabled="true" />
+ <check name="MEM-stack-ref" enabled="true" />
+ <check name="MEM-stack" enabled="true" />
+ <check name="MEM-use-free-all" enabled="true" />
+ <check name="MEM-use-free-some" enabled="true" />
+ </group>
+ <group enabled="true" name="PTR">
+ <check name="PTR-arith-field" enabled="true" />
+ <check name="PTR-arith-stack" enabled="true" />
+ <check name="PTR-arith-var" enabled="true" />
+ <check name="PTR-cmp-str-lit" enabled="true" />
+ <check name="PTR-null-assign-fun-pos" enabled="false" />
+ <check name="PTR-null-assign-pos" enabled="false" />
+ <check name="PTR-null-assign" enabled="true" />
+ <check name="PTR-null-cmp-aft" enabled="true" />
+ <check name="PTR-null-cmp-bef-fun" enabled="true" />
+ <check name="PTR-null-cmp-bef" enabled="true" />
+ <check name="PTR-null-fun-pos" enabled="true" />
+ <check name="PTR-null-literal-pos" enabled="false" />
+ <check name="PTR-overload" enabled="false" />
+ <check name="PTR-singleton-arith-pos" enabled="false" />
+ <check name="PTR-singleton-arith" enabled="true" />
+ <check name="PTR-unchk-param-some" enabled="true" />
+ <check name="PTR-unchk-param" enabled="false" />
+ <check name="PTR-uninit-pos" enabled="false" />
+ <check name="PTR-uninit" enabled="true" />
+ </group>
+ <group enabled="true" name="RED">
+ <check name="RED-alloc-zero-bytes" enabled="false" />
+ <check name="RED-case-reach" enabled="false" />
+ <check name="RED-cmp-always" enabled="false" />
+ <check name="RED-cmp-never" enabled="false" />
+ <check name="RED-cond-always" enabled="false" />
+ <check name="RED-cond-const-assign" enabled="true" />
+ <check name="RED-cond-const-expr" enabled="false" />
+ <check name="RED-cond-const" enabled="false" />
+ <check name="RED-cond-never" enabled="false" />
+ <check name="RED-dead" enabled="true" />
+ <check name="RED-expr" enabled="false" />
+ <check name="RED-func-no-effect" enabled="false" />
+ <check name="RED-local-hides-global" enabled="true" />
+ <check name="RED-local-hides-local" enabled="false" />
+ <check name="RED-local-hides-member" enabled="false" />
+ <check name="RED-local-hides-param" enabled="true" />
+ <check name="RED-no-effect" enabled="false" />
+ <check name="RED-self-assign" enabled="true" />
+ <check name="RED-unused-assign" enabled="true" />
+ <check name="RED-unused-param" enabled="false" />
+ <check name="RED-unused-return-val" enabled="false" />
+ <check name="RED-unused-val" enabled="false" />
+ <check name="RED-unused-var-all" enabled="true" />
+ </group>
+ <group enabled="true" name="RESOURCE">
+ <check name="RESOURCE-deref-file" enabled="false" />
+ <check name="RESOURCE-double-close" enabled="true" />
+ <check name="RESOURCE-file-no-close-all" enabled="true" />
+ <check name="RESOURCE-file-pos-neg" enabled="false" />
+ <check name="RESOURCE-file-use-after-close" enabled="true" />
+ <check name="RESOURCE-implicit-deref-file" enabled="false" />
+ <check name="RESOURCE-write-ronly-file" enabled="true" />
+ </group>
+ <group enabled="true" name="SIZEOF">
+ <check name="SIZEOF-side-effect" enabled="true" />
+ </group>
+ <group enabled="true" name="SPC">
+ <check name="SPC-order" enabled="true" />
+ <check name="SPC-uninit-arr-all" enabled="false" />
+ <check name="SPC-uninit-struct-field-heap" enabled="true" />
+ <check name="SPC-uninit-struct-field" enabled="false" />
+ <check name="SPC-uninit-struct" enabled="true" />
+ <check name="SPC-uninit-var-all" enabled="true" />
+ <check name="SPC-uninit-var-some" enabled="true" />
+ <check name="SPC-volatile-reads" enabled="false" />
+ <check name="SPC-volatile-writes" enabled="false" />
+ </group>
+ <group enabled="true" name="STRUCT">
+ <check name="STRUCT-signed-bit" enabled="false" />
+ </group>
+ <group enabled="true" name="SWITCH">
+ <check name="SWITCH-fall-through" enabled="true" />
+ </group>
+ <group enabled="true" name="THROW">
+ <check name="THROW-empty" enabled="false" />
+ <check name="THROW-main" enabled="false" />
+ <check name="THROW-null" enabled="true" />
+ <check name="THROW-ptr" enabled="true" />
+ <check name="THROW-static" enabled="true" />
+ <check name="THROW-unhandled" enabled="true" />
+ </group>
+ <group enabled="true" name="UNION">
+ <check name="UNION-overlap-assign" enabled="true" />
+ <check name="UNION-type-punning" enabled="true" />
+ </group>
+ </package>
+ <package name="CERT" enabled="false">
+ <group enabled="true" name="CERT-EXP">
+ <check name="CERT-EXP19-C" enabled="true" />
+ </group>
+ <group enabled="true" name="CERT-FIO">
+ <check name="CERT-FIO37-C" enabled="true" />
+ <check name="CERT-FIO38-C" enabled="true" />
+ </group>
+ <group enabled="true" name="CERT-SIG">
+ <check name="CERT-SIG31-C" enabled="true" />
+ </group>
+ </package>
+ <package name="SECURITY" enabled="false">
+ <group enabled="true" name="SEC-BUFFER">
+ <check name="SEC-BUFFER-memory-leak-alias" enabled="true" />
+ <check name="SEC-BUFFER-memory-leak" enabled="false" />
+ <check name="SEC-BUFFER-memset-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-memset-overrun" enabled="true" />
+ <check name="SEC-BUFFER-qsort-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-qsort-overrun" enabled="true" />
+ <check name="SEC-BUFFER-sprintf-overrun" enabled="true" />
+ <check name="SEC-BUFFER-std-sort-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-std-sort-overrun" enabled="true" />
+ <check name="SEC-BUFFER-strcat-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-strcat-overrun" enabled="true" />
+ <check name="SEC-BUFFER-strcpy-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-strcpy-overrun" enabled="true" />
+ <check name="SEC-BUFFER-strncat-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-strncat-overrun" enabled="true" />
+ <check name="SEC-BUFFER-strncmp-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-strncmp-overrun" enabled="true" />
+ <check name="SEC-BUFFER-strncpy-overrun-pos" enabled="false" />
+ <check name="SEC-BUFFER-strncpy-overrun" enabled="true" />
+ <check name="SEC-BUFFER-tainted-alloc-size" enabled="true" />
+ <check name="SEC-BUFFER-tainted-copy-length" enabled="true" />
+ <check name="SEC-BUFFER-tainted-copy" enabled="true" />
+ <check name="SEC-BUFFER-tainted-index" enabled="true" />
+ <check name="SEC-BUFFER-tainted-offset" enabled="true" />
+ <check name="SEC-BUFFER-use-after-free-all" enabled="true" />
+ <check name="SEC-BUFFER-use-after-free-some" enabled="true" />
+ </group>
+ <group enabled="true" name="SEC-DIV-0">
+ <check name="SEC-DIV-0-compare-after" enabled="true" />
+ <check name="SEC-DIV-0-compare-before" enabled="true" />
+ <check name="SEC-DIV-0-tainted" enabled="true" />
+ </group>
+ <group enabled="true" name="SEC-FILEOP">
+ <check name="SEC-FILEOP-open-no-close" enabled="true" />
+ <check name="SEC-FILEOP-path-traversal" enabled="false" />
+ <check name="SEC-FILEOP-use-after-close" enabled="true" />
+ </group>
+ <group enabled="true" name="SEC-INJECTION">
+ <check name="SEC-INJECTION-sql" enabled="false" />
+ <check name="SEC-INJECTION-xpath" enabled="false" />
+ </group>
+ <group enabled="true" name="SEC-LOOP">
+ <check name="SEC-LOOP-tainted-bound" enabled="true" />
+ </group>
+ <group enabled="true" name="SEC-NULL">
+ <check name="SEC-NULL-assignment-fun-pos" enabled="false" />
+ <check name="SEC-NULL-assignment" enabled="true" />
+ <check name="SEC-NULL-cmp-aft" enabled="true" />
+ <check name="SEC-NULL-cmp-bef-fun" enabled="true" />
+ <check name="SEC-NULL-cmp-bef" enabled="true" />
+ <check name="SEC-NULL-literal-pos" enabled="false" />
+ </group>
+ <group enabled="true" name="SEC-STRING">
+ <check name="SEC-STRING-format-string" enabled="true" />
+ <check name="SEC-STRING-hard-coded-credentials" enabled="false" />
+ </group>
+ </package>
+ <package name="MISRAC2004" enabled="false">
+ <group enabled="true" name="MISRAC2004-1">
+ <check name="MISRAC2004-1.1" enabled="true" />
+ <check name="MISRAC2004-1.2_a" enabled="true" />
+ <check name="MISRAC2004-1.2_b" enabled="true" />
+ <check name="MISRAC2004-1.2_c" enabled="true" />
+ <check name="MISRAC2004-1.2_d" enabled="true" />
+ <check name="MISRAC2004-1.2_e" enabled="true" />
+ <check name="MISRAC2004-1.2_f" enabled="true" />
+ <check name="MISRAC2004-1.2_g" enabled="true" />
+ <check name="MISRAC2004-1.2_h" enabled="true" />
+ <check name="MISRAC2004-1.2_i" enabled="true" />
+ <check name="MISRAC2004-1.2_j" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-2">
+ <check name="MISRAC2004-2.1" enabled="true" />
+ <check name="MISRAC2004-2.2" enabled="true" />
+ <check name="MISRAC2004-2.3" enabled="true" />
+ <check name="MISRAC2004-2.4" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2004-5">
+ <check name="MISRAC2004-5.2" enabled="true" />
+ <check name="MISRAC2004-5.3" enabled="true" />
+ <check name="MISRAC2004-5.4" enabled="true" />
+ <check name="MISRAC2004-5.5" enabled="false" />
+ <check name="MISRAC2004-5.6" enabled="false" />
+ <check name="MISRAC2004-5.7" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2004-6">
+ <check name="MISRAC2004-6.1" enabled="true" />
+ <check name="MISRAC2004-6.2" enabled="true" />
+ <check name="MISRAC2004-6.3" enabled="false" />
+ <check name="MISRAC2004-6.4" enabled="true" />
+ <check name="MISRAC2004-6.5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-7">
+ <check name="MISRAC2004-7.1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-8">
+ <check name="MISRAC2004-8.1" enabled="true" />
+ <check name="MISRAC2004-8.2" enabled="true" />
+ <check name="MISRAC2004-8.3" enabled="true" />
+ <check name="MISRAC2004-8.5_a" enabled="true" />
+ <check name="MISRAC2004-8.5_b" enabled="true" />
+ <check name="MISRAC2004-8.6" enabled="true" />
+ <check name="MISRAC2004-8.7" enabled="true" />
+ <check name="MISRAC2004-8.8_a" enabled="true" />
+ <check name="MISRAC2004-8.8_b" enabled="true" />
+ <check name="MISRAC2004-8.12" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-8 10">
+ <check name="MISRAC2004-8.10" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-9">
+ <check name="MISRAC2004-9.1_a" enabled="true" />
+ <check name="MISRAC2004-9.1_b" enabled="true" />
+ <check name="MISRAC2004-9.1_c" enabled="true" />
+ <check name="MISRAC2004-9.2" enabled="true" />
+ <check name="MISRAC2004-9.3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-10">
+ <check name="MISRAC2004-10.1_a" enabled="true" />
+ <check name="MISRAC2004-10.1_b" enabled="true" />
+ <check name="MISRAC2004-10.1_c" enabled="true" />
+ <check name="MISRAC2004-10.1_d" enabled="true" />
+ <check name="MISRAC2004-10.2_a" enabled="true" />
+ <check name="MISRAC2004-10.2_b" enabled="true" />
+ <check name="MISRAC2004-10.2_c" enabled="true" />
+ <check name="MISRAC2004-10.2_d" enabled="true" />
+ <check name="MISRAC2004-10.3" enabled="true" />
+ <check name="MISRAC2004-10.4" enabled="true" />
+ <check name="MISRAC2004-10.5" enabled="true" />
+ <check name="MISRAC2004-10.6" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-11">
+ <check name="MISRAC2004-11.1" enabled="true" />
+ <check name="MISRAC2004-11.3" enabled="false" />
+ <check name="MISRAC2004-11.4" enabled="false" />
+ <check name="MISRAC2004-11.5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-12">
+ <check name="MISRAC2004-12.1" enabled="false" />
+ <check name="MISRAC2004-12.2_a" enabled="true" />
+ <check name="MISRAC2004-12.2_b" enabled="true" />
+ <check name="MISRAC2004-12.2_c" enabled="true" />
+ <check name="MISRAC2004-12.3" enabled="true" />
+ <check name="MISRAC2004-12.4" enabled="true" />
+ <check name="MISRAC2004-12.5" enabled="true" />
+ <check name="MISRAC2004-12.6_a" enabled="false" />
+ <check name="MISRAC2004-12.6_b" enabled="false" />
+ <check name="MISRAC2004-12.7" enabled="true" />
+ <check name="MISRAC2004-12.8" enabled="true" />
+ <check name="MISRAC2004-12.9" enabled="true" />
+ <check name="MISRAC2004-12.10" enabled="true" />
+ <check name="MISRAC2004-12.11" enabled="false" />
+ <check name="MISRAC2004-12.12_a" enabled="true" />
+ <check name="MISRAC2004-12.12_b" enabled="true" />
+ <check name="MISRAC2004-12.13" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2004-13">
+ <check name="MISRAC2004-13.1" enabled="true" />
+ <check name="MISRAC2004-13.2_a" enabled="false" />
+ <check name="MISRAC2004-13.2_b" enabled="false" />
+ <check name="MISRAC2004-13.2_c" enabled="false" />
+ <check name="MISRAC2004-13.2_d" enabled="false" />
+ <check name="MISRAC2004-13.2_e" enabled="false" />
+ <check name="MISRAC2004-13.3" enabled="true" />
+ <check name="MISRAC2004-13.4" enabled="true" />
+ <check name="MISRAC2004-13.5" enabled="true" />
+ <check name="MISRAC2004-13.6" enabled="true" />
+ <check name="MISRAC2004-13.7_a" enabled="true" />
+ <check name="MISRAC2004-13.7_b" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-14">
+ <check name="MISRAC2004-14.1" enabled="true" />
+ <check name="MISRAC2004-14.2" enabled="true" />
+ <check name="MISRAC2004-14.3" enabled="true" />
+ <check name="MISRAC2004-14.4" enabled="true" />
+ <check name="MISRAC2004-14.5" enabled="true" />
+ <check name="MISRAC2004-14.6" enabled="true" />
+ <check name="MISRAC2004-14.7" enabled="true" />
+ <check name="MISRAC2004-14.8_a" enabled="true" />
+ <check name="MISRAC2004-14.8_b" enabled="true" />
+ <check name="MISRAC2004-14.8_c" enabled="true" />
+ <check name="MISRAC2004-14.8_d" enabled="true" />
+ <check name="MISRAC2004-14.9" enabled="true" />
+ <check name="MISRAC2004-14.10" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-15">
+ <check name="MISRAC2004-15.0" enabled="true" />
+ <check name="MISRAC2004-15.1" enabled="true" />
+ <check name="MISRAC2004-15.2" enabled="true" />
+ <check name="MISRAC2004-15.3" enabled="true" />
+ <check name="MISRAC2004-15.4" enabled="true" />
+ <check name="MISRAC2004-15.5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-16">
+ <check name="MISRAC2004-16.1" enabled="true" />
+ <check name="MISRAC2004-16.2_a" enabled="true" />
+ <check name="MISRAC2004-16.2_b" enabled="true" />
+ <check name="MISRAC2004-16.3" enabled="true" />
+ <check name="MISRAC2004-16.4" enabled="true" />
+ <check name="MISRAC2004-16.5" enabled="true" />
+ <check name="MISRAC2004-16.7" enabled="true" />
+ <check name="MISRAC2004-16.8" enabled="true" />
+ <check name="MISRAC2004-16.9" enabled="true" />
+ <check name="MISRAC2004-16.10" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-17">
+ <check name="MISRAC2004-17.1_a" enabled="true" />
+ <check name="MISRAC2004-17.1_b" enabled="true" />
+ <check name="MISRAC2004-17.1_c" enabled="true" />
+ <check name="MISRAC2004-17.2" enabled="true" />
+ <check name="MISRAC2004-17.3" enabled="true" />
+ <check name="MISRAC2004-17.4_a" enabled="true" />
+ <check name="MISRAC2004-17.4_b" enabled="true" />
+ <check name="MISRAC2004-17.5" enabled="true" />
+ <check name="MISRAC2004-17.6_a" enabled="true" />
+ <check name="MISRAC2004-17.6_b" enabled="true" />
+ <check name="MISRAC2004-17.6_c" enabled="true" />
+ <check name="MISRAC2004-17.6_d" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-18">
+ <check name="MISRAC2004-18.1" enabled="true" />
+ <check name="MISRAC2004-18.2" enabled="true" />
+ <check name="MISRAC2004-18.4" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-19">
+ <check name="MISRAC2004-19.1" enabled="false" />
+ <check name="MISRAC2004-19.2" enabled="false" />
+ <check name="MISRAC2004-19.4" enabled="true" />
+ <check name="MISRAC2004-19.5" enabled="true" />
+ <check name="MISRAC2004-19.6" enabled="true" />
+ <check name="MISRAC2004-19.7" enabled="false" />
+ <check name="MISRAC2004-19.10" enabled="true" />
+ <check name="MISRAC2004-19.12" enabled="true" />
+ <check name="MISRAC2004-19.13" enabled="false" />
+ <check name="MISRAC2004-19.15" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2004-20">
+ <check name="MISRAC2004-20.1" enabled="true" />
+ <check name="MISRAC2004-20.2" enabled="true" />
+ <check name="MISRAC2004-20.3_a" enabled="true" />
+ <check name="MISRAC2004-20.3_b" enabled="true" />
+ <check name="MISRAC2004-20.3_c" enabled="true" />
+ <check name="MISRAC2004-20.3_d" enabled="true" />
+ <check name="MISRAC2004-20.3_e" enabled="true" />
+ <check name="MISRAC2004-20.3_f" enabled="true" />
+ <check name="MISRAC2004-20.3_g" enabled="true" />
+ <check name="MISRAC2004-20.3_h" enabled="true" />
+ <check name="MISRAC2004-20.3_i" enabled="true" />
+ <check name="MISRAC2004-20.4" enabled="true" />
+ <check name="MISRAC2004-20.5" enabled="true" />
+ <check name="MISRAC2004-20.6" enabled="true" />
+ <check name="MISRAC2004-20.7" enabled="true" />
+ <check name="MISRAC2004-20.8" enabled="true" />
+ <check name="MISRAC2004-20.9" enabled="true" />
+ <check name="MISRAC2004-20.10" enabled="true" />
+ <check name="MISRAC2004-20.11" enabled="true" />
+ <check name="MISRAC2004-20.12" enabled="true" />
+ </group>
+ </package>
+ <package name="MISRAC2012" enabled="false">
+ <group enabled="true" name="MISRAC2012-Dir-4">
+ <check name="MISRAC2012-Dir-4.3" enabled="true" />
+ <check name="MISRAC2012-Dir-4.4" enabled="false" />
+ <check name="MISRAC2012-Dir-4.5" enabled="false" />
+ <check name="MISRAC2012-Dir-4.6_a" enabled="false" />
+ <check name="MISRAC2012-Dir-4.6_b" enabled="false" />
+ <check name="MISRAC2012-Dir-4.7_a" enabled="false" />
+ <check name="MISRAC2012-Dir-4.7_b" enabled="false" />
+ <check name="MISRAC2012-Dir-4.7_c" enabled="false" />
+ <check name="MISRAC2012-Dir-4.8" enabled="false" />
+ <check name="MISRAC2012-Dir-4.9" enabled="false" />
+ <check name="MISRAC2012-Dir-4.10" enabled="true" />
+ <check name="MISRAC2012-Dir-4.11_a" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_b" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_c" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_d" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_e" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_f" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_g" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_h" enabled="false" />
+ <check name="MISRAC2012-Dir-4.11_i" enabled="false" />
+ <check name="MISRAC2012-Dir-4.12" enabled="false" />
+ <check name="MISRAC2012-Dir-4.13_b" enabled="true" />
+ <check name="MISRAC2012-Dir-4.13_c" enabled="true" />
+ <check name="MISRAC2012-Dir-4.13_d" enabled="true" />
+ <check name="MISRAC2012-Dir-4.13_e" enabled="true" />
+ <check name="MISRAC2012-Dir-4.13_f" enabled="true" />
+ <check name="MISRAC2012-Dir-4.13_g" enabled="true" />
+ <check name="MISRAC2012-Dir-4.13_h" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-1">
+ <check name="MISRAC2012-Rule-1.3_a" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_b" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_c" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_d" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_e" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_f" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_g" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_h" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_i" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_j" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_k" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_m" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_n" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_o" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_p" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_q" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_r" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_s" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_t" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_u" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_v" enabled="true" />
+ <check name="MISRAC2012-Rule-1.3_w" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-2">
+ <check name="MISRAC2012-Rule-2.1_a" enabled="true" />
+ <check name="MISRAC2012-Rule-2.1_b" enabled="true" />
+ <check name="MISRAC2012-Rule-2.2_a" enabled="true" />
+ <check name="MISRAC2012-Rule-2.2_b" enabled="true" />
+ <check name="MISRAC2012-Rule-2.2_c" enabled="true" />
+ <check name="MISRAC2012-Rule-2.3" enabled="false" />
+ <check name="MISRAC2012-Rule-2.4" enabled="false" />
+ <check name="MISRAC2012-Rule-2.5" enabled="false" />
+ <check name="MISRAC2012-Rule-2.6" enabled="false" />
+ <check name="MISRAC2012-Rule-2.7" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-3">
+ <check name="MISRAC2012-Rule-3.1" enabled="true" />
+ <check name="MISRAC2012-Rule-3.2" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-5">
+ <check name="MISRAC2012-Rule-5.1" enabled="true" />
+ <check name="MISRAC2012-Rule-5.2_c89" enabled="true" />
+ <check name="MISRAC2012-Rule-5.2_c99" enabled="true" />
+ <check name="MISRAC2012-Rule-5.3_c89" enabled="true" />
+ <check name="MISRAC2012-Rule-5.3_c99" enabled="true" />
+ <check name="MISRAC2012-Rule-5.4_c89" enabled="true" />
+ <check name="MISRAC2012-Rule-5.4_c99" enabled="true" />
+ <check name="MISRAC2012-Rule-5.5_c89" enabled="true" />
+ <check name="MISRAC2012-Rule-5.5_c99" enabled="true" />
+ <check name="MISRAC2012-Rule-5.6" enabled="true" />
+ <check name="MISRAC2012-Rule-5.7" enabled="true" />
+ <check name="MISRAC2012-Rule-5.8" enabled="true" />
+ <check name="MISRAC2012-Rule-5.9" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-6">
+ <check name="MISRAC2012-Rule-6.1" enabled="true" />
+ <check name="MISRAC2012-Rule-6.2" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-7">
+ <check name="MISRAC2012-Rule-7.1" enabled="true" />
+ <check name="MISRAC2012-Rule-7.2" enabled="true" />
+ <check name="MISRAC2012-Rule-7.3" enabled="true" />
+ <check name="MISRAC2012-Rule-7.4_a" enabled="true" />
+ <check name="MISRAC2012-Rule-7.4_b" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-8">
+ <check name="MISRAC2012-Rule-8.1" enabled="true" />
+ <check name="MISRAC2012-Rule-8.2_a" enabled="true" />
+ <check name="MISRAC2012-Rule-8.2_b" enabled="true" />
+ <check name="MISRAC2012-Rule-8.3_b" enabled="true" />
+ <check name="MISRAC2012-Rule-8.4" enabled="true" />
+ <check name="MISRAC2012-Rule-8.5_a" enabled="true" />
+ <check name="MISRAC2012-Rule-8.5_b" enabled="true" />
+ <check name="MISRAC2012-Rule-8.7" enabled="false" />
+ <check name="MISRAC2012-Rule-8.9_a" enabled="false" />
+ <check name="MISRAC2012-Rule-8.9_b" enabled="false" />
+ <check name="MISRAC2012-Rule-8.10" enabled="true" />
+ <check name="MISRAC2012-Rule-8.11" enabled="false" />
+ <check name="MISRAC2012-Rule-8.12" enabled="true" />
+ <check name="MISRAC2012-Rule-8.13" enabled="false" />
+ <check name="MISRAC2012-Rule-8.14" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-9">
+ <check name="MISRAC2012-Rule-9.1_a" enabled="true" />
+ <check name="MISRAC2012-Rule-9.1_b" enabled="true" />
+ <check name="MISRAC2012-Rule-9.1_c" enabled="true" />
+ <check name="MISRAC2012-Rule-9.1_d" enabled="true" />
+ <check name="MISRAC2012-Rule-9.1_e" enabled="true" />
+ <check name="MISRAC2012-Rule-9.1_f" enabled="true" />
+ <check name="MISRAC2012-Rule-9.2" enabled="true" />
+ <check name="MISRAC2012-Rule-9.3" enabled="true" />
+ <check name="MISRAC2012-Rule-9.4" enabled="true" />
+ <check name="MISRAC2012-Rule-9.5_a" enabled="true" />
+ <check name="MISRAC2012-Rule-9.5_b" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-10">
+ <check name="MISRAC2012-Rule-10.1_R2" enabled="true" />
+ <check name="MISRAC2012-Rule-10.1_R3" enabled="true" />
+ <check name="MISRAC2012-Rule-10.1_R4" enabled="true" />
+ <check name="MISRAC2012-Rule-10.1_R5" enabled="true" />
+ <check name="MISRAC2012-Rule-10.1_R6" enabled="true" />
+ <check name="MISRAC2012-Rule-10.1_R7" enabled="true" />
+ <check name="MISRAC2012-Rule-10.1_R8" enabled="true" />
+ <check name="MISRAC2012-Rule-10.2" enabled="true" />
+ <check name="MISRAC2012-Rule-10.3" enabled="true" />
+ <check name="MISRAC2012-Rule-10.4_a" enabled="true" />
+ <check name="MISRAC2012-Rule-10.4_b" enabled="true" />
+ <check name="MISRAC2012-Rule-10.5" enabled="false" />
+ <check name="MISRAC2012-Rule-10.6" enabled="true" />
+ <check name="MISRAC2012-Rule-10.7" enabled="true" />
+ <check name="MISRAC2012-Rule-10.8" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-11">
+ <check name="MISRAC2012-Rule-11.1" enabled="true" />
+ <check name="MISRAC2012-Rule-11.2" enabled="true" />
+ <check name="MISRAC2012-Rule-11.3" enabled="true" />
+ <check name="MISRAC2012-Rule-11.4" enabled="false" />
+ <check name="MISRAC2012-Rule-11.5" enabled="false" />
+ <check name="MISRAC2012-Rule-11.6" enabled="true" />
+ <check name="MISRAC2012-Rule-11.7" enabled="true" />
+ <check name="MISRAC2012-Rule-11.8" enabled="true" />
+ <check name="MISRAC2012-Rule-11.9" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-12">
+ <check name="MISRAC2012-Rule-12.1" enabled="false" />
+ <check name="MISRAC2012-Rule-12.2" enabled="true" />
+ <check name="MISRAC2012-Rule-12.3" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-13">
+ <check name="MISRAC2012-Rule-13.1" enabled="true" />
+ <check name="MISRAC2012-Rule-13.2_a" enabled="true" />
+ <check name="MISRAC2012-Rule-13.2_b" enabled="true" />
+ <check name="MISRAC2012-Rule-13.2_c" enabled="true" />
+ <check name="MISRAC2012-Rule-13.3" enabled="false" />
+ <check name="MISRAC2012-Rule-13.4_a" enabled="false" />
+ <check name="MISRAC2012-Rule-13.4_b" enabled="false" />
+ <check name="MISRAC2012-Rule-13.5" enabled="true" />
+ <check name="MISRAC2012-Rule-13.6" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-14">
+ <check name="MISRAC2012-Rule-14.1_a" enabled="true" />
+ <check name="MISRAC2012-Rule-14.1_b" enabled="true" />
+ <check name="MISRAC2012-Rule-14.2" enabled="true" />
+ <check name="MISRAC2012-Rule-14.3_a" enabled="true" />
+ <check name="MISRAC2012-Rule-14.3_b" enabled="true" />
+ <check name="MISRAC2012-Rule-14.4_a" enabled="true" />
+ <check name="MISRAC2012-Rule-14.4_b" enabled="true" />
+ <check name="MISRAC2012-Rule-14.4_c" enabled="true" />
+ <check name="MISRAC2012-Rule-14.4_d" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-15">
+ <check name="MISRAC2012-Rule-15.1" enabled="false" />
+ <check name="MISRAC2012-Rule-15.2" enabled="true" />
+ <check name="MISRAC2012-Rule-15.3" enabled="true" />
+ <check name="MISRAC2012-Rule-15.4" enabled="false" />
+ <check name="MISRAC2012-Rule-15.5" enabled="false" />
+ <check name="MISRAC2012-Rule-15.6_a" enabled="true" />
+ <check name="MISRAC2012-Rule-15.6_b" enabled="true" />
+ <check name="MISRAC2012-Rule-15.6_c" enabled="true" />
+ <check name="MISRAC2012-Rule-15.6_d" enabled="true" />
+ <check name="MISRAC2012-Rule-15.6_e" enabled="true" />
+ <check name="MISRAC2012-Rule-15.7" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-16">
+ <check name="MISRAC2012-Rule-16.1" enabled="true" />
+ <check name="MISRAC2012-Rule-16.2" enabled="true" />
+ <check name="MISRAC2012-Rule-16.3" enabled="true" />
+ <check name="MISRAC2012-Rule-16.4" enabled="true" />
+ <check name="MISRAC2012-Rule-16.5" enabled="true" />
+ <check name="MISRAC2012-Rule-16.6" enabled="true" />
+ <check name="MISRAC2012-Rule-16.7" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-17">
+ <check name="MISRAC2012-Rule-17.1" enabled="true" />
+ <check name="MISRAC2012-Rule-17.2_a" enabled="true" />
+ <check name="MISRAC2012-Rule-17.2_b" enabled="true" />
+ <check name="MISRAC2012-Rule-17.3" enabled="true" />
+ <check name="MISRAC2012-Rule-17.4" enabled="true" />
+ <check name="MISRAC2012-Rule-17.5" enabled="false" />
+ <check name="MISRAC2012-Rule-17.6" enabled="true" />
+ <check name="MISRAC2012-Rule-17.7" enabled="true" />
+ <check name="MISRAC2012-Rule-17.8" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-18">
+ <check name="MISRAC2012-Rule-18.1_a" enabled="true" />
+ <check name="MISRAC2012-Rule-18.1_b" enabled="true" />
+ <check name="MISRAC2012-Rule-18.1_c" enabled="true" />
+ <check name="MISRAC2012-Rule-18.1_d" enabled="true" />
+ <check name="MISRAC2012-Rule-18.2" enabled="true" />
+ <check name="MISRAC2012-Rule-18.3" enabled="true" />
+ <check name="MISRAC2012-Rule-18.4" enabled="true" />
+ <check name="MISRAC2012-Rule-18.5" enabled="false" />
+ <check name="MISRAC2012-Rule-18.6_a" enabled="true" />
+ <check name="MISRAC2012-Rule-18.6_b" enabled="true" />
+ <check name="MISRAC2012-Rule-18.6_c" enabled="true" />
+ <check name="MISRAC2012-Rule-18.6_d" enabled="true" />
+ <check name="MISRAC2012-Rule-18.7" enabled="true" />
+ <check name="MISRAC2012-Rule-18.8" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-19">
+ <check name="MISRAC2012-Rule-19.1" enabled="true" />
+ <check name="MISRAC2012-Rule-19.2" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-20">
+ <check name="MISRAC2012-Rule-20.1" enabled="false" />
+ <check name="MISRAC2012-Rule-20.2" enabled="true" />
+ <check name="MISRAC2012-Rule-20.4_c89" enabled="true" />
+ <check name="MISRAC2012-Rule-20.4_c99" enabled="true" />
+ <check name="MISRAC2012-Rule-20.5" enabled="false" />
+ <check name="MISRAC2012-Rule-20.7" enabled="true" />
+ <check name="MISRAC2012-Rule-20.10" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-21">
+ <check name="MISRAC2012-Rule-21.1" enabled="true" />
+ <check name="MISRAC2012-Rule-21.2" enabled="true" />
+ <check name="MISRAC2012-Rule-21.3" enabled="true" />
+ <check name="MISRAC2012-Rule-21.4" enabled="true" />
+ <check name="MISRAC2012-Rule-21.5" enabled="true" />
+ <check name="MISRAC2012-Rule-21.6" enabled="true" />
+ <check name="MISRAC2012-Rule-21.7" enabled="true" />
+ <check name="MISRAC2012-Rule-21.8" enabled="true" />
+ <check name="MISRAC2012-Rule-21.9" enabled="true" />
+ <check name="MISRAC2012-Rule-21.10" enabled="true" />
+ <check name="MISRAC2012-Rule-21.11" enabled="true" />
+ <check name="MISRAC2012-Rule-21.12_a" enabled="false" />
+ <check name="MISRAC2012-Rule-21.12_b" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC2012-Rule-22">
+ <check name="MISRAC2012-Rule-22.1_a" enabled="true" />
+ <check name="MISRAC2012-Rule-22.1_b" enabled="true" />
+ <check name="MISRAC2012-Rule-22.2_a" enabled="true" />
+ <check name="MISRAC2012-Rule-22.2_b" enabled="true" />
+ <check name="MISRAC2012-Rule-22.2_c" enabled="true" />
+ <check name="MISRAC2012-Rule-22.3" enabled="true" />
+ <check name="MISRAC2012-Rule-22.4" enabled="true" />
+ <check name="MISRAC2012-Rule-22.5_a" enabled="true" />
+ <check name="MISRAC2012-Rule-22.5_b" enabled="true" />
+ <check name="MISRAC2012-Rule-22.6" enabled="true" />
+ </group>
+ </package>
+ <package name="MISRAC++2008" enabled="false">
+ <group enabled="true" name="MISRAC++2008-0-1">
+ <check name="MISRAC++2008-0-1-1" enabled="true" />
+ <check name="MISRAC++2008-0-1-2_a" enabled="true" />
+ <check name="MISRAC++2008-0-1-2_b" enabled="true" />
+ <check name="MISRAC++2008-0-1-2_c" enabled="true" />
+ <check name="MISRAC++2008-0-1-3" enabled="true" />
+ <check name="MISRAC++2008-0-1-4_a" enabled="true" />
+ <check name="MISRAC++2008-0-1-4_b" enabled="true" />
+ <check name="MISRAC++2008-0-1-6" enabled="true" />
+ <check name="MISRAC++2008-0-1-7" enabled="true" />
+ <check name="MISRAC++2008-0-1-8" enabled="false" />
+ <check name="MISRAC++2008-0-1-9" enabled="true" />
+ <check name="MISRAC++2008-0-1-11" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-0-2">
+ <check name="MISRAC++2008-0-2-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-0-3">
+ <check name="MISRAC++2008-0-3-2" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-2-7">
+ <check name="MISRAC++2008-2-7-1" enabled="true" />
+ <check name="MISRAC++2008-2-7-2" enabled="true" />
+ <check name="MISRAC++2008-2-7-3" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-2-10">
+ <check name="MISRAC++2008-2-10-1" enabled="true" />
+ <check name="MISRAC++2008-2-10-2" enabled="true" />
+ <check name="MISRAC++2008-2-10-3" enabled="true" />
+ <check name="MISRAC++2008-2-10-4" enabled="true" />
+ <check name="MISRAC++2008-2-10-5" enabled="false" />
+ <check name="MISRAC++2008-2-10-6" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-2-13">
+ <check name="MISRAC++2008-2-13-2" enabled="true" />
+ <check name="MISRAC++2008-2-13-3" enabled="true" />
+ <check name="MISRAC++2008-2-13-4_a" enabled="true" />
+ <check name="MISRAC++2008-2-13-4_b" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-3-1">
+ <check name="MISRAC++2008-3-1-1" enabled="true" />
+ <check name="MISRAC++2008-3-1-3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-3-9">
+ <check name="MISRAC++2008-3-9-2" enabled="false" />
+ <check name="MISRAC++2008-3-9-3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-4-5">
+ <check name="MISRAC++2008-4-5-1" enabled="true" />
+ <check name="MISRAC++2008-4-5-2" enabled="true" />
+ <check name="MISRAC++2008-4-5-3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-0">
+ <check name="MISRAC++2008-5-0-1_a" enabled="true" />
+ <check name="MISRAC++2008-5-0-1_b" enabled="true" />
+ <check name="MISRAC++2008-5-0-1_c" enabled="true" />
+ <check name="MISRAC++2008-5-0-2" enabled="false" />
+ <check name="MISRAC++2008-5-0-3" enabled="true" />
+ <check name="MISRAC++2008-5-0-4" enabled="true" />
+ <check name="MISRAC++2008-5-0-5" enabled="true" />
+ <check name="MISRAC++2008-5-0-6" enabled="true" />
+ <check name="MISRAC++2008-5-0-7" enabled="true" />
+ <check name="MISRAC++2008-5-0-8" enabled="true" />
+ <check name="MISRAC++2008-5-0-9" enabled="true" />
+ <check name="MISRAC++2008-5-0-10" enabled="true" />
+ <check name="MISRAC++2008-5-0-13_a" enabled="true" />
+ <check name="MISRAC++2008-5-0-13_b" enabled="true" />
+ <check name="MISRAC++2008-5-0-13_c" enabled="true" />
+ <check name="MISRAC++2008-5-0-13_d" enabled="true" />
+ <check name="MISRAC++2008-5-0-14" enabled="true" />
+ <check name="MISRAC++2008-5-0-15_a" enabled="true" />
+ <check name="MISRAC++2008-5-0-15_b" enabled="true" />
+ <check name="MISRAC++2008-5-0-16_a" enabled="true" />
+ <check name="MISRAC++2008-5-0-16_b" enabled="true" />
+ <check name="MISRAC++2008-5-0-16_c" enabled="true" />
+ <check name="MISRAC++2008-5-0-16_d" enabled="true" />
+ <check name="MISRAC++2008-5-0-16_e" enabled="true" />
+ <check name="MISRAC++2008-5-0-16_f" enabled="true" />
+ <check name="MISRAC++2008-5-0-19" enabled="true" />
+ <check name="MISRAC++2008-5-0-21" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-2">
+ <check name="MISRAC++2008-5-2-4" enabled="true" />
+ <check name="MISRAC++2008-5-2-5" enabled="true" />
+ <check name="MISRAC++2008-5-2-6" enabled="true" />
+ <check name="MISRAC++2008-5-2-7" enabled="true" />
+ <check name="MISRAC++2008-5-2-9" enabled="false" />
+ <check name="MISRAC++2008-5-2-10" enabled="false" />
+ <check name="MISRAC++2008-5-2-11_a" enabled="true" />
+ <check name="MISRAC++2008-5-2-11_b" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-3">
+ <check name="MISRAC++2008-5-3-1" enabled="true" />
+ <check name="MISRAC++2008-5-3-2_a" enabled="true" />
+ <check name="MISRAC++2008-5-3-2_b" enabled="true" />
+ <check name="MISRAC++2008-5-3-3" enabled="true" />
+ <check name="MISRAC++2008-5-3-4" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-8">
+ <check name="MISRAC++2008-5-8-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-14">
+ <check name="MISRAC++2008-5-14-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-18">
+ <check name="MISRAC++2008-5-18-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-5-19">
+ <check name="MISRAC++2008-5-19-1" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-6-2">
+ <check name="MISRAC++2008-6-2-1" enabled="true" />
+ <check name="MISRAC++2008-6-2-2" enabled="true" />
+ <check name="MISRAC++2008-6-2-3" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-6-3">
+ <check name="MISRAC++2008-6-3-1_a" enabled="true" />
+ <check name="MISRAC++2008-6-3-1_b" enabled="true" />
+ <check name="MISRAC++2008-6-3-1_c" enabled="true" />
+ <check name="MISRAC++2008-6-3-1_d" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-6-4">
+ <check name="MISRAC++2008-6-4-1" enabled="true" />
+ <check name="MISRAC++2008-6-4-2" enabled="true" />
+ <check name="MISRAC++2008-6-4-3" enabled="true" />
+ <check name="MISRAC++2008-6-4-4" enabled="true" />
+ <check name="MISRAC++2008-6-4-5" enabled="true" />
+ <check name="MISRAC++2008-6-4-6" enabled="true" />
+ <check name="MISRAC++2008-6-4-7" enabled="true" />
+ <check name="MISRAC++2008-6-4-8" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-6-5">
+ <check name="MISRAC++2008-6-5-1_a" enabled="true" />
+ <check name="MISRAC++2008-6-5-2" enabled="true" />
+ <check name="MISRAC++2008-6-5-3" enabled="true" />
+ <check name="MISRAC++2008-6-5-4" enabled="true" />
+ <check name="MISRAC++2008-6-5-6" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-6-6">
+ <check name="MISRAC++2008-6-6-1" enabled="true" />
+ <check name="MISRAC++2008-6-6-2" enabled="true" />
+ <check name="MISRAC++2008-6-6-4" enabled="true" />
+ <check name="MISRAC++2008-6-6-5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-7-1">
+ <check name="MISRAC++2008-7-1-1" enabled="true" />
+ <check name="MISRAC++2008-7-1-2" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-7-2">
+ <check name="MISRAC++2008-7-2-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-7-4">
+ <check name="MISRAC++2008-7-4-3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-7-5">
+ <check name="MISRAC++2008-7-5-1_a" enabled="true" />
+ <check name="MISRAC++2008-7-5-1_b" enabled="true" />
+ <check name="MISRAC++2008-7-5-2_a" enabled="true" />
+ <check name="MISRAC++2008-7-5-2_b" enabled="true" />
+ <check name="MISRAC++2008-7-5-2_c" enabled="true" />
+ <check name="MISRAC++2008-7-5-2_d" enabled="true" />
+ <check name="MISRAC++2008-7-5-4_a" enabled="false" />
+ <check name="MISRAC++2008-7-5-4_b" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-8-0">
+ <check name="MISRAC++2008-8-0-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-8-4">
+ <check name="MISRAC++2008-8-4-1" enabled="true" />
+ <check name="MISRAC++2008-8-4-3" enabled="true" />
+ <check name="MISRAC++2008-8-4-4" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-8-5">
+ <check name="MISRAC++2008-8-5-1_a" enabled="true" />
+ <check name="MISRAC++2008-8-5-1_b" enabled="true" />
+ <check name="MISRAC++2008-8-5-1_c" enabled="true" />
+ <check name="MISRAC++2008-8-5-2" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-9-3">
+ <check name="MISRAC++2008-9-3-1" enabled="true" />
+ <check name="MISRAC++2008-9-3-2" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-9-5">
+ <check name="MISRAC++2008-9-5-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-9-6">
+ <check name="MISRAC++2008-9-6-2" enabled="true" />
+ <check name="MISRAC++2008-9-6-3" enabled="true" />
+ <check name="MISRAC++2008-9-6-4" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-12-1">
+ <check name="MISRAC++2008-12-1-1_a" enabled="true" />
+ <check name="MISRAC++2008-12-1-1_b" enabled="true" />
+ <check name="MISRAC++2008-12-1-3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-15-0">
+ <check name="MISRAC++2008-15-0-2" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-15-1">
+ <check name="MISRAC++2008-15-1-2" enabled="true" />
+ <check name="MISRAC++2008-15-1-3" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-15-3">
+ <check name="MISRAC++2008-15-3-1" enabled="true" />
+ <check name="MISRAC++2008-15-3-2" enabled="false" />
+ <check name="MISRAC++2008-15-3-3" enabled="true" />
+ <check name="MISRAC++2008-15-3-4" enabled="true" />
+ <check name="MISRAC++2008-15-3-5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-15-5">
+ <check name="MISRAC++2008-15-5-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-16-0">
+ <check name="MISRAC++2008-16-0-3" enabled="true" />
+ <check name="MISRAC++2008-16-0-4" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-16-2">
+ <check name="MISRAC++2008-16-2-2" enabled="true" />
+ <check name="MISRAC++2008-16-2-3" enabled="true" />
+ <check name="MISRAC++2008-16-2-4" enabled="true" />
+ <check name="MISRAC++2008-16-2-5" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-16-3">
+ <check name="MISRAC++2008-16-3-1" enabled="true" />
+ <check name="MISRAC++2008-16-3-2" enabled="false" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-17-0">
+ <check name="MISRAC++2008-17-0-1" enabled="true" />
+ <check name="MISRAC++2008-17-0-3" enabled="true" />
+ <check name="MISRAC++2008-17-0-5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-18-0">
+ <check name="MISRAC++2008-18-0-1" enabled="true" />
+ <check name="MISRAC++2008-18-0-2" enabled="true" />
+ <check name="MISRAC++2008-18-0-3" enabled="true" />
+ <check name="MISRAC++2008-18-0-4" enabled="true" />
+ <check name="MISRAC++2008-18-0-5" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-18-2">
+ <check name="MISRAC++2008-18-2-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-18-4">
+ <check name="MISRAC++2008-18-4-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-18-7">
+ <check name="MISRAC++2008-18-7-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-19-3">
+ <check name="MISRAC++2008-19-3-1" enabled="true" />
+ </group>
+ <group enabled="true" name="MISRAC++2008-27-0">
+ <check name="MISRAC++2008-27-0-1" enabled="true" />
+ </group>
+ </package>
+ </checks_tree>
+ </cstat_settings>
+ </data>
+ </settings>
+ <settings>
+ <name>RuntimeChecking</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>GenRtcDebugHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcEnableBoundsChecking</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcCheckPtrsNonInstrMem</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenRtcTrackPointerBounds</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenRtcCheckAccesses</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenRtcGenerateEntries</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcNrTrackedPointers</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>GenRtcIntOverflow</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcIncUnsigned</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcIntConversion</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcInclExplicit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcIntShiftOverflow</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcInclUnsignedShiftOverflow</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcUnhandledCase</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcDivByZero</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenRtcCheckPtrsNonInstrFunc</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ </configuration>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ </group>
+ <group>
+ <name>stack</name>
+ <group>
+ <name>zcl</name>
+ <group>
+ <name>commission</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\commission\zcl_commission_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\commission\zcl_commission_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>general</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_alarm_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_alarm_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ballast_config_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ballast_config_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_basic_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_color_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_color_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_dehum_ctrl_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_dehum_ctrl_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_device_temp_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_device_temp_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_diagnostics_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_doorlock_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_doorlock_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_elec_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_elec_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_fan_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_fan_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_groups_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_groups_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_identify_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_identify_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_level_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_level_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_illum_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_level_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_level_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_meter_id_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_meter_id_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_nearest_gw_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_nearest_gw_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_occupancy_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_occupancy_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_swconfig_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_onoff_swconfig_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ota_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_ota_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_poll_control_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_poll_control_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_config_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_config_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_profile_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_power_profile_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_press_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_press_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_pump_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_pump_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_rssi_loc_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_rssi_loc_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_scenes_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_scenes_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_temp_meas_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_temp_meas_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_ui_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_therm_ui_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_time_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_time_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_voice_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_voice_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_water_content_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_water_content_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_window_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\general\zcl_window_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>se</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\local_zcl_tunnel.h</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_drlc_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_drlc_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_messaging_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_messaging_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_price_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_price_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_simplemeter_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_simplemeter_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_tunnel_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\se\zcl_tunnel_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>security</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_ace_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_ace_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_wd_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_wd_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_zone_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\security\zcl_ias_zone_server.c</name>
+ </file>
+ </group>
+ <group>
+ <name>st_custom</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_ls_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_ls_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_matrix_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\st_custom\zcl_custom_matrix_server.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_float.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_integer.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_report.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_attr_string.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_cluster.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_cluster_init.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_command_ind.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\zcl\zcl_header.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\stack\pletoh.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+</project>
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.eww b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.eww
new file mode 100644
index 000000000..aaf08b62b
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/EWARM/stm32wbxx_zigbee_mw_host/stm32wb_zigbee_mw.eww
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<workspace>
+ <project>
+ <path>$WS_DIR$\stm32wb_zigbee_mw.ewp</path>
+ </project>
+ <batchBuild/>
+</workspace>
+
+
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvoptx b/Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvoptx
new file mode 100644
index 000000000..bbbaed6bf
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvoptx
@@ -0,0 +1,1440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>standard</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>12000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>18</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>0</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>0</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>0</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>BIN\UL2CM3.DLL</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL040000 -FP0($$Device:STM32WB55CCUx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint/>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>0</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>zcl</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_attr.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_attr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_attr_float.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_attr_float.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_attr_integer.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_attr_integer.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_attr_list.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_attr_list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_attr_report.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_attr_report.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_attr_string.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_attr_string.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_cluster.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_cluster.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_cluster_init.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_cluster_init.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_command_ind.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_command_ind.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\zcl_header.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_header.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>st_custom</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\st_custom\zcl_custom_ls_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_custom_ls_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\st_custom\zcl_custom_ls_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_custom_ls_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\st_custom\zcl_custom_matrix_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_custom_matrix_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\st_custom\zcl_custom_matrix_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_custom_matrix_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>commission</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\commission\zcl_commission_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_commission_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\commission\zcl_commission_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_commission_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>general</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_alarm_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_alarm_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_alarm_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_alarm_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_ballast_config_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ballast_config_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_ballast_config_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ballast_config_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_basic_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_basic_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_color_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_color_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_color_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_color_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_dehum_ctrl_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_dehum_ctrl_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_dehum_ctrl_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_dehum_ctrl_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_device_temp_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_device_temp_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_device_temp_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_device_temp_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_diagnostics_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_diagnostics_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_doorlock_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_doorlock_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_doorlock_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_doorlock_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_elec_meas_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_elec_meas_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_elec_meas_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_elec_meas_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_fan_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_fan_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_fan_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_fan_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_groups_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_groups_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_groups_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_groups_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_identify_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_identify_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>38</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_identify_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_identify_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>39</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_illum_level_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_illum_level_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>40</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_illum_level_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_illum_level_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>41</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_illum_meas_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_illum_meas_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>42</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_illum_meas_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_illum_meas_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>43</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_level_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_level_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>44</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_level_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_level_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>45</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_meter_id_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_meter_id_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>46</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_meter_id_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_meter_id_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>47</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_nearest_gw_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_nearest_gw_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>48</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_nearest_gw_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_nearest_gw_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>49</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_occupancy_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_occupancy_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>50</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_occupancy_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_occupancy_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>51</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_onoff_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_onoff_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>52</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_onoff_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_onoff_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>53</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_onoff_swconfig_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_onoff_swconfig_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>54</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_onoff_swconfig_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_onoff_swconfig_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>55</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_ota_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ota_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>56</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_ota_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ota_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>57</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_poll_control_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_poll_control_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>58</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_poll_control_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_poll_control_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>59</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_power_config_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_power_config_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>60</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_power_config_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_power_config_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>61</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_power_profile_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_power_profile_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>62</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_power_profile_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_power_profile_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>63</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_press_meas_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_press_meas_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>64</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_press_meas_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_press_meas_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>65</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_pump_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_pump_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>66</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_pump_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_pump_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_rssi_loc_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_rssi_loc_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>68</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_rssi_loc_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_rssi_loc_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>69</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_scenes_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_scenes_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>70</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_scenes_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_scenes_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>71</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_temp_meas_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_temp_meas_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>72</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_temp_meas_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_temp_meas_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>73</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_therm_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_therm_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>74</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_therm_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_therm_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>75</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_therm_ui_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_therm_ui_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>76</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_therm_ui_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_therm_ui_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>77</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_time_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_time_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>78</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_time_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_time_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>79</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_voice_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_voice_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>80</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_voice_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_voice_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>81</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_water_content_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_water_content_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>82</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_water_content_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_water_content_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>83</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_window_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_window_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>84</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\general\zcl_window_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_window_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>se</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>85</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_drlc_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_drlc_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>86</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_drlc_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_drlc_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>87</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_messaging_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_messaging_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>88</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_messaging_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_messaging_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>89</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_price_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_price_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>90</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_price_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_price_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>91</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_simplemeter_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_simplemeter_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>92</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_simplemeter_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_simplemeter_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>93</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_tunnel_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_tunnel_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>94</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\se\zcl_tunnel_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_tunnel_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>security</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>95</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\security\zcl_ias_ace_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ias_ace_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>96</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\security\zcl_ias_ace_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ias_ace_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>97</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\security\zcl_ias_wd_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ias_wd_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>98</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\security\zcl_ias_wd_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ias_wd_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>99</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\security\zcl_ias_zone_client.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ias_zone_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>100</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\zcl\security\zcl_ias_zone_server.c</PathWithFileName>
+ <FilenameWithoutPath>zcl_ias_zone_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>pletoh</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>101</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\stack\pletoh.c</PathWithFileName>
+ <FilenameWithoutPath>pletoh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+</ProjectOpt>
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvprojx b/Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvprojx
new file mode 100644
index 000000000..172dd9c61
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/MDK-ARM/stm32wb_zigbee_mw.uvprojx
@@ -0,0 +1,932 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>standard</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55CCUx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
+ <PackURL>http://www.keil.com/pack</PackURL>
+ <Cpu>IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL040000 -FP0($$Device:STM32WB55CCUx$CMSIS\Flash\STM32WB_M4.FLM))</FlashDriverDll>
+ <DeviceId>0</DeviceId>
+ <RegisterFile>$$Device:STM32WB55CCUx$Drivers\CMSIS\Device\ST\STM32WBxx\Include\stm32wbxx.h</RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32WB55CCUx$CMSIS\SVD\STM32WBxx_CM4.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>.\Debug\</OutputDirectory>
+ <OutputName>stm32wb_zigbee_wb_lib_keil</OutputName>
+ <CreateExecutable>0</CreateExecutable>
+ <CreateLib>1</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>0</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>CMD /C "copy Debug\stm32wb_zigbee_wb_lib_keil.lib .."</UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments> -REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments> -MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4096</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>BIN\UL2CM3.DLL</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>1</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0x20000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x40000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x40000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0x20000</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>1</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls>--C99 --diag_suppress=188 --diag_suppress=68 --diag_suppress=222 --diag_suppress=1293 </MiscControls>
+ <Define>USE_HAL_DRIVER, STM32WB55xx, USE_STM32WBXX_NUCLEO, ZIGBEE_WB, CONFIG_ZCL_OPTIONAL_ATTR_SET</Define>
+ <Undefine></Undefine>
+ <IncludePath>..\..\stack\include\mac;..\..\stack\include;..\..\core\inc;..\..\stack;..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include;..\..\..\..\..\..\Drivers\CMSIS\Core\Include;..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <uClangAs>0</uClangAs>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x00000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile></ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>zcl</GroupName>
+ <Files>
+ <File>
+ <FileName>zcl_attr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_attr.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_attr_float.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_attr_float.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_attr_integer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_attr_integer.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_attr_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_attr_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_attr_report.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_attr_report.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_attr_string.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_attr_string.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_cluster.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_cluster.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_cluster_init.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_cluster_init.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_command_ind.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_command_ind.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_header.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\zcl_header.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>st_custom</GroupName>
+ <Files>
+ <File>
+ <FileName>zcl_custom_ls_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\st_custom\zcl_custom_ls_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_custom_ls_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\st_custom\zcl_custom_ls_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_custom_matrix_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\st_custom\zcl_custom_matrix_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_custom_matrix_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\st_custom\zcl_custom_matrix_server.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>commission</GroupName>
+ <Files>
+ <File>
+ <FileName>zcl_commission_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\commission\zcl_commission_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_commission_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\commission\zcl_commission_server.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>general</GroupName>
+ <Files>
+ <File>
+ <FileName>zcl_alarm_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_alarm_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_alarm_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_alarm_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ballast_config_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_ballast_config_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ballast_config_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_ballast_config_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_basic_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_basic_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_color_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_color_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_color_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_color_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_dehum_ctrl_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_dehum_ctrl_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_dehum_ctrl_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_dehum_ctrl_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_device_temp_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_device_temp_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_device_temp_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_device_temp_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_diagnostics_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_diagnostics_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_doorlock_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_doorlock_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_doorlock_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_doorlock_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_elec_meas_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_elec_meas_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_elec_meas_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_elec_meas_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_fan_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_fan_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_fan_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_fan_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_groups_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_groups_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_groups_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_groups_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_identify_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_identify_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_identify_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_identify_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_illum_level_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_illum_level_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_illum_level_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_illum_level_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_illum_meas_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_illum_meas_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_illum_meas_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_illum_meas_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_level_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_level_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_level_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_level_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_meter_id_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_meter_id_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_meter_id_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_meter_id_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_nearest_gw_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_nearest_gw_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_nearest_gw_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_nearest_gw_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_occupancy_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_occupancy_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_occupancy_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_occupancy_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_onoff_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_onoff_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_onoff_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_onoff_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_onoff_swconfig_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_onoff_swconfig_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_onoff_swconfig_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_onoff_swconfig_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ota_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_ota_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ota_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_ota_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_poll_control_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_poll_control_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_poll_control_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_poll_control_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_power_config_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_power_config_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_power_config_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_power_config_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_power_profile_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_power_profile_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_power_profile_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_power_profile_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_press_meas_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_press_meas_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_press_meas_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_press_meas_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_pump_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_pump_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_pump_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_pump_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_rssi_loc_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_rssi_loc_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_rssi_loc_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_rssi_loc_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_scenes_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_scenes_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_scenes_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_scenes_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_temp_meas_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_temp_meas_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_temp_meas_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_temp_meas_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_therm_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_therm_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_therm_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_therm_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_therm_ui_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_therm_ui_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_therm_ui_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_therm_ui_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_time_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_time_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_time_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_time_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_voice_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_voice_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_voice_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_voice_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_water_content_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_water_content_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_water_content_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_water_content_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_window_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_window_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_window_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\general\zcl_window_server.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>se</GroupName>
+ <Files>
+ <File>
+ <FileName>zcl_drlc_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_drlc_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_drlc_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_drlc_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_messaging_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_messaging_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_messaging_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_messaging_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_price_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_price_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_price_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_price_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_simplemeter_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_simplemeter_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_simplemeter_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_simplemeter_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_tunnel_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_tunnel_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_tunnel_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\se\zcl_tunnel_server.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>security</GroupName>
+ <Files>
+ <File>
+ <FileName>zcl_ias_ace_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\security\zcl_ias_ace_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ias_ace_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\security\zcl_ias_ace_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ias_wd_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\security\zcl_ias_wd_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ias_wd_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\security\zcl_ias_wd_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ias_zone_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\security\zcl_ias_zone_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>zcl_ias_zone_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\zcl\security\zcl_ias_zone_server.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>pletoh</GroupName>
+ <Files>
+ <File>
+ <FileName>pletoh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\stack\pletoh.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components/>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib.a b/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib.a
index a0b936fd8..a1204d132 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib.a
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib.a
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib_keil.lib b/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib_keil.lib
new file mode 100644
index 000000000..7eb71ddfd
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib_keil.lib
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/platform/ee.c b/Middlewares/ST/STM32_WPAN/zigbee/platform/ee.c
new file mode 100644
index 000000000..0b74a0fea
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/platform/ee.c
@@ -0,0 +1,700 @@
+/*****************************************************************************
+ * @file ee.c
+ * @author MCD Application Team
+ * @brief This file contains the implementation of the EEPROM emulator
+ * for Dory platform.
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+#include "ee_cfg.h"
+#include "ee.h"
+
+/*****************************************************************************/
+
+/* Page header size in bytes (4 words used to save page state) */
+#define EE_HEADER_SIZE (4 * HW_FLASH_WIDTH)
+
+/* Maximum number of elements by page */
+#define EE_NB_MAX_ELT \
+ ((HW_FLASH_PAGE_SIZE - EE_HEADER_SIZE) / HW_FLASH_WIDTH)
+
+/* Flash words special values */
+#define EE_ERASED 0xFFFFFFFFFFFFFFFFULL
+#define EE_PROGRAMMED 0x5555555555555555ULL
+
+/* No page define */
+#define EE_PAGE_NOT_FOUND 0xFFFFFFFFUL
+
+/* Element tag in flash */
+#define EE_TAG 0x8000UL
+
+/* Page state definition */
+enum
+{
+ EE_STATE_ERASED = 0, /* page is erased */
+ EE_STATE_RECEIVE = 1, /* used during transfer for new page */
+ EE_STATE_ACTIVE = 2, /* page contains valid data and is not full */
+ EE_STATE_VALID = 3, /* page contains valid data and is full */
+ EE_STATE_ERASING = 4, /* used during transfer for old pages */
+};
+
+/* Macro to get flash address from page index */
+#define EE_FLASH_ADDR( pv, p ) \
+ ((pv)->address + ((p) * HW_FLASH_PAGE_SIZE))
+
+/* Macro to get flash page from page index */
+#define EE_FLASH_PAGE( pv, p ) \
+ ((((pv)->address - HW_FLASH_ADDRESS) / HW_FLASH_PAGE_SIZE) + (p))
+
+/* Macro to get first page index of following pool, among circular pool list */
+#define EE_NEXT_POOL( pv ) \
+ (((pv)->current_write_page < (pv)->nb_pages) ? (pv)->nb_pages : 0)
+
+/* Check Configuration */
+#ifndef CFG_EE_BANK0_SIZE
+#define CFG_EE_BANK0_SIZE (2 * HW_FLASH_PAGE_SIZE)
+#endif
+#ifndef CFG_EE_BANK1_SIZE
+#define CFG_EE_BANK1_SIZE 0
+#endif
+#if (CFG_EE_BANK0_SIZE & ((2 * HW_FLASH_PAGE_SIZE) - 1))
+#error EE: wrong value of CFG_EE_BANK0_SIZE
+#endif
+#if (CFG_EE_BANK1_SIZE & ((2 * HW_FLASH_PAGE_SIZE) - 1))
+#error EE: wrong value of CFG_EE_BANK1_SIZE
+#endif
+#if ((CFG_EE_BANK0_MAX_NB > \
+ EE_NB_MAX_ELT * CFG_EE_BANK0_SIZE / (2 * HW_FLASH_PAGE_SIZE)) || \
+ (CFG_EE_BANK0_MAX_NB > 0x4000U))
+#error EE: CFG_EE_BANK0_MAX_NB too big
+#endif
+#if ((CFG_EE_BANK1_SIZE > 0) && \
+ ((CFG_EE_BANK1_MAX_NB > \
+ EE_NB_MAX_ELT * CFG_EE_BANK1_SIZE / (2 * HW_FLASH_PAGE_SIZE)) || \
+ (CFG_EE_BANK1_MAX_NB > 0x4000U)))
+#error EE: CFG_EE_BANK1_MAX_NB too big
+#endif
+#if (HW_FLASH_WIDTH != 8)
+#error EE: this module only works for a 64-bit flash
+#endif
+
+/* Macro to get a 64-bit pointer from an address represented as an integer */
+#ifndef EE_PTR
+#define EE_PTR( x ) ((uint64_t*)(uintptr_t)(x))
+#endif /* !EE_PTR */
+
+/* Macro used for debug (empty by default) */
+#ifndef EE_DBG
+#define EE_DBG( x )
+#endif /* !EE_DBG */
+
+/* Definition of global variables structure */
+typedef struct
+{
+ /* Absolute base address of the bank in Flash memory */
+ uint32_t address;
+
+ /* Total number of pages in a pool (constant) */
+ uint8_t nb_pages;
+
+ /* Current write page (can be ACTIVE or RECEIVE state) */
+ uint8_t current_write_page;
+
+ /* Total number of elements written in valid and active pages */
+ uint16_t nb_written_elements;
+
+ /* Write position inside the current write page */
+ uint16_t next_write_offset;
+
+} EE_var_t;
+
+/*****************************************************************************/
+
+/* Local functions */
+
+static void EE_Reset( EE_var_t* pv, uint32_t address, uint8_t nb_pages );
+
+static int EE_Recovery( EE_var_t* pv );
+
+static int EE_Transfer( EE_var_t* pv, uint16_t addr, uint32_t page );
+
+static int EE_WriteEl( EE_var_t* pv, uint16_t addr, uint32_t data );
+
+static int EE_ReadEl( const EE_var_t* pv,
+ uint16_t addr, uint32_t* data, uint32_t page );
+
+static int EE_SetState( const EE_var_t* pv, uint32_t page, uint32_t state );
+
+static uint32_t EE_GetState( const EE_var_t* pv, uint32_t page );
+
+static uint16_t EE_Crc( uint64_t v );
+
+/*****************************************************************************/
+
+/* Global variables */
+
+EE_var_t EE_var[CFG_EE_BANK1_SIZE ? 2 : 1];
+
+/*****************************************************************************/
+
+int EE_Init( int format, uint32_t base_address )
+{
+ int status;
+ uint16_t total_nb_pages;
+
+ /* Reset global variables of both banks */
+
+ EE_Reset( &EE_var[0],
+ base_address,
+ CFG_EE_BANK0_SIZE / (2 * HW_FLASH_PAGE_SIZE) );
+
+ if ( CFG_EE_BANK1_SIZE )
+ {
+ EE_Reset( &EE_var[1],
+ base_address + CFG_EE_BANK0_SIZE,
+ CFG_EE_BANK1_SIZE / (2 * HW_FLASH_PAGE_SIZE) );
+ }
+
+ /* If format mode is set, start from scratch */
+
+ if ( format )
+ {
+ /* Force erase of all pages */
+ total_nb_pages =
+ 2 * (EE_var[0].nb_pages + (CFG_EE_BANK1_SIZE ? EE_var[1].nb_pages : 0));
+
+ if ( HW_FLASH_Erase( EE_FLASH_PAGE( EE_var, 0 ), total_nb_pages, 0 ) != 0 )
+ {
+ return EE_ERASE_ERROR;
+ }
+
+ /* Set first page of each pool in ACTIVE State */
+ status = EE_SetState( &EE_var[0], 0, EE_STATE_ACTIVE );
+
+ if ( CFG_EE_BANK1_SIZE && (status == EE_OK) )
+ {
+ status = EE_SetState( &EE_var[1], 0, EE_STATE_ACTIVE );
+ }
+
+ return status;
+ }
+
+ /* else, try to recover the EEPROM emulation state from flash */
+
+ status = EE_Recovery( &EE_var[0] );
+
+ if ( CFG_EE_BANK1_SIZE && (status == EE_OK) )
+ {
+ status = EE_Recovery( &EE_var[1] );
+ }
+
+ return status;
+}
+
+/*****************************************************************************/
+
+int EE_Read( int bank, uint16_t addr, uint32_t* data )
+{
+ EE_var_t *pv = &EE_var[CFG_EE_BANK1_SIZE && bank];;
+
+ /* Read element starting from active page */
+ return EE_ReadEl( pv, addr, data, pv->current_write_page );
+}
+
+/*****************************************************************************/
+
+int EE_Write( int bank, uint16_t addr, uint32_t data )
+{
+ EE_var_t *pv = &EE_var[CFG_EE_BANK1_SIZE && bank];;
+ uint32_t page;
+
+ /* Check if current pool is full */
+ if ( pv->nb_written_elements < EE_NB_MAX_ELT * pv->nb_pages )
+ {
+ /* If not full, write the virtual address and value in the EEPROM */
+ return EE_WriteEl( pv, addr, data );
+ }
+
+ EE_DBG( EE_2 );
+
+ /* If full, we need to write in other pool and perform pool transfer */
+ page = EE_NEXT_POOL( pv );
+
+ /* Check next page state: it must be ERASED */
+ if ( EE_GetState( pv, page ) != EE_STATE_ERASED )
+ {
+ return EE_STATE_ERROR;
+ }
+
+ /* Mark the ERASED page at RECEIVE state */
+ if ( EE_SetState( pv, page, EE_STATE_RECEIVE ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ EE_DBG( EE_3 );
+
+ /* Reset global variables */
+ pv->current_write_page = page;
+ pv->nb_written_elements = 0;
+ pv->next_write_offset = EE_HEADER_SIZE;
+
+ /* Write the variable passed as parameter in the new active page */
+ if ( EE_WriteEl( pv, addr, data ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ EE_DBG( EE_4 );
+
+ /* Set the previous ACTIVE pool to ERASING and copy the latest written
+ values to the new pool */
+ if ( EE_Transfer( pv, addr, page ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ EE_DBG( EE_5 );
+
+#if CFG_EE_AUTO_CLEAN == 0
+
+ /* A clean is required */
+ return EE_CLEAN_NEEDED;
+
+#else /* CFG_EE_AUTO_CLEAN */
+
+ return EE_Clean( bank, 0 );
+
+#endif /* CFG_EE_AUTO_CLEAN */
+}
+
+/*****************************************************************************/
+
+int EE_Clean( int bank, int interrupt )
+{
+ EE_var_t *pv = &EE_var[CFG_EE_BANK1_SIZE && bank];
+ uint32_t page;
+
+ /* Get first page of unused pool */
+ page = EE_NEXT_POOL( pv );
+
+ /* At least, the first page of the pool should be in ERASING state */
+ if ( EE_GetState( pv, page ) != EE_STATE_ERASING )
+ {
+ return EE_STATE_ERROR;
+ }
+
+ EE_DBG( EE_1 );
+
+ /* Erase all the pages of the pool */
+ if ( HW_FLASH_Erase( EE_FLASH_PAGE( pv, page ), pv->nb_pages, interrupt )
+ != 0 )
+ {
+ return EE_ERASE_ERROR;
+ }
+
+ return EE_OK;
+}
+
+/*****************************************************************************/
+
+void EE_Dump( int bank, uint16_t addr, uint32_t* data, uint16_t size )
+{
+ EE_var_t *pv = &EE_var[CFG_EE_BANK1_SIZE && bank];;
+ uint32_t flash_addr, end_flash_addr, word, idx;
+ uint64_t el;
+
+ /* Parse all elements from active pool of flash */
+ flash_addr = pv->address;
+ end_flash_addr = pv->nb_pages * HW_FLASH_PAGE_SIZE;
+ if ( pv->current_write_page >= pv->nb_pages )
+ flash_addr += end_flash_addr;
+ end_flash_addr += flash_addr;
+
+ for ( ; flash_addr < end_flash_addr; flash_addr += HW_FLASH_WIDTH )
+ {
+ /* Read one element from flash */
+ el = *EE_PTR( flash_addr );
+ word = (uint32_t)el;
+
+ /* Consider only valid word */
+ if ( (word >> 30) == (EE_TAG >> 14) )
+ {
+ /* Check variable index (addr, idx, size <= 0x4000) */
+ idx = ((uint32_t)((word << 2) >> 18)) - addr;
+ if ( idx < size )
+ {
+ /* Write in the data buffer the variable data */
+ data[idx] = (uint32_t)(el >> 32);
+ }
+ }
+ }
+}
+
+/*****************************************************************************/
+
+static void EE_Reset( EE_var_t* pv, uint32_t address, uint8_t nb_pages )
+{
+ /* Reset global variables of the bank */
+ pv->address = address;
+ pv->nb_pages = nb_pages;
+ pv->current_write_page = 0;
+ pv->nb_written_elements = 0;
+ pv->next_write_offset = EE_HEADER_SIZE;
+}
+
+/*****************************************************************************/
+
+static int EE_Recovery( EE_var_t* pv )
+{
+ uint32_t page, first_page, state, prev_state, flash_addr, i;
+
+ /* Search all pages for a reliable RECEIVE page then ACTIVE page */
+ for ( state = EE_STATE_RECEIVE; state <= EE_STATE_ACTIVE; state++ )
+ {
+ for ( page = 0; page < 2UL * pv->nb_pages; page++ )
+ {
+ if ( state != EE_GetState( pv, page ) )
+ continue;
+
+ if ( (page == 0) || (page == pv->nb_pages) )
+ {
+ /* Check if state is reliable by checking state of next page */
+ if ( EE_GetState( pv, page + 1 ) != EE_STATE_ERASED )
+ continue;
+ }
+ else
+ {
+ prev_state = EE_GetState( pv, page - 1 );
+
+ if ( prev_state != state )
+ {
+ /* Check if state is reliable by checking state of previous page */
+ if ( prev_state != EE_STATE_VALID )
+ continue;
+ }
+ else
+ {
+ /* If page and previous page are the same, mark previous as VALID */
+ if ( EE_SetState( pv, page - 1, EE_STATE_VALID ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+ }
+ }
+
+ /* Update write page */
+ pv->current_write_page = page;
+
+ /* Count elements already in ACTIVE or RECEIVE page */
+ flash_addr = EE_FLASH_ADDR( pv, page ) + EE_HEADER_SIZE;
+ for ( i = 0; i < EE_NB_MAX_ELT; i++ )
+ {
+ /* Check if current element is valid */
+ if ( *EE_PTR( flash_addr ) == EE_ERASED )
+ break;
+
+ /* Update global variables accordingly */
+ pv->nb_written_elements++;
+ pv->next_write_offset += HW_FLASH_WIDTH;
+
+ /* Next element address */
+ flash_addr += HW_FLASH_WIDTH;
+ }
+
+ /* Count elements already transferred in previous pool pages */
+ while ( !((page == 0) || (page == pv->nb_pages)) )
+ {
+ /* Update number of elements written in pool */
+ pv->nb_written_elements += EE_NB_MAX_ELT;
+
+ page--;
+ }
+
+ /* If we have found a RECEIVE page, it means that pool transfer
+ has been interrupted by reset */
+ if ( state == EE_STATE_RECEIVE )
+ {
+ /* Resume pool transfer */
+ if ( EE_Transfer( pv, EE_TAG, page ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+ }
+
+ /* RECEIVE/ACTIVE page found, check if some erasing is needed */
+
+ /* Get first page of unused pool */
+ first_page = EE_NEXT_POOL( pv );
+
+ /* Erase all the pages not already erased in the pool */
+ for ( page = first_page; page < first_page + pv->nb_pages; page++ )
+ {
+ if ( EE_GetState( pv, page ) != EE_STATE_ERASED )
+ {
+ if ( HW_FLASH_Erase( EE_FLASH_PAGE( pv, page ), 1, 0 ) != 0 )
+ {
+ return EE_ERASE_ERROR;
+ }
+ }
+ }
+
+ return EE_OK;
+ }
+ }
+
+ /* No true RECEIVE or ACTIVE page has been found */
+ return EE_STATE_ERROR;
+}
+
+/*****************************************************************************/
+
+static int EE_Transfer( EE_var_t* pv, uint16_t addr, uint32_t page )
+{
+ uint32_t state, var, data, last_page;
+
+ /* Input "page" is the first page of the new pool;
+ We compute "last_page" as the last page of the old pool to be set
+ in ERASING state (all pages in old pool are assumed to be either VALID
+ or ACTIVE, except in case of recovery, where some pages may be already
+ in ERASING state.
+ However, in case of recovery, we do not not need to set ERASING,
+ as intialization phase erases the unactive pool. */
+ last_page =
+ (page < pv->nb_pages) ? (2 * pv->nb_pages - 1) : (pv->nb_pages - 1);
+
+ if ( addr != EE_TAG )
+ {
+ /* Loop on all old pool pages in descending order */
+ page = last_page;
+ while ( 1 )
+ {
+ state = EE_GetState( pv, page );
+
+ if ( (state == EE_STATE_ACTIVE) || (state == EE_STATE_VALID) )
+ {
+ /* Set page state to ERASING */
+ if ( EE_SetState( pv, page, EE_STATE_ERASING ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+ }
+
+ EE_DBG( EE_6 );
+
+ /* Check if start of pool is reached */
+ if ( (page == 0) || (page == pv->nb_pages) )
+ break;
+
+ page--;
+ }
+ }
+
+ /* Now, we can copy variables from one pool to the other */
+
+ for ( var = 0; var < EE_NB_MAX_ELT * pv->nb_pages; var++ )
+ {
+ /* Check each variable except the one passed as parameter
+ (and except the ones already transferred in case of recovery) */
+ if ( (var != addr) &&
+ ((addr != EE_TAG) ||
+ (EE_ReadEl( pv, var, &data, pv->current_write_page ) != EE_OK)) )
+ {
+ /* Read the last variable update */
+ if ( EE_ReadEl( pv, var, &data, last_page ) == EE_OK )
+ {
+ EE_DBG( EE_7 );
+
+ /* In case variable corresponding to the virtual address was found,
+ copy the variable to the new active page */
+ if ( EE_WriteEl( pv, var, data ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+ }
+ }
+ }
+
+ /* Transfer is now done, mark the receive state page as active */
+ return EE_SetState( pv, pv->current_write_page, EE_STATE_ACTIVE );
+}
+
+/*****************************************************************************/
+
+static int EE_WriteEl( EE_var_t* pv, uint16_t addr, uint32_t data )
+{
+ uint32_t page, flash_addr;
+ uint64_t el;
+
+ /* It is assumed here that the current pool is not full
+ and that free pages in this pool are in ERASED state */
+
+ /* Check if active page is full */
+ if ( pv->next_write_offset >= HW_FLASH_PAGE_SIZE )
+ {
+ /* Get current active page */
+ page = pv->current_write_page;
+
+ /* Set new page as was previous one (active or receive) */
+ if ( EE_SetState( pv, page + 1, EE_GetState( pv, page ) ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ EE_DBG( EE_8 );
+
+ /* Set current page in valid state */
+ if ( EE_SetState( pv, page, EE_STATE_VALID ) != EE_OK )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ /* Update global variables to use next page */
+ pv->current_write_page = page + 1;
+ pv->next_write_offset = EE_HEADER_SIZE;
+ }
+
+ /* Build element to be written in flash */
+ if ( addr == EE_TAG )
+ {
+ el = 0ULL;
+ }
+ else
+ {
+ /* Build element from virtual addr and data, plus CRC */
+ el = ((((uint64_t)data) << 32) | ((EE_TAG | (addr & 0x3FFFUL)) << 16));
+ el |= EE_Crc( el );
+ }
+
+ /* Compute write address */
+ flash_addr =
+ EE_FLASH_ADDR( pv, pv->current_write_page ) + pv->next_write_offset;
+
+ /* Write element in flash */
+ if ( HW_FLASH_Write( flash_addr, el ) != 0 )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ /* Increment global variables relative to write operation done */
+ pv->next_write_offset += HW_FLASH_WIDTH;
+ pv->nb_written_elements++;
+
+ return EE_OK;
+}
+
+/*****************************************************************************/
+
+static int EE_ReadEl( const EE_var_t* pv,
+ uint16_t addr, uint32_t* data, uint32_t page )
+{
+ uint32_t flash_addr, offset;
+ uint64_t el;
+
+ /* Search variable in the pool (in decreasing page order from "page") */
+ while ( 1 )
+ {
+ /* Check each page address starting from end */
+ flash_addr = EE_FLASH_ADDR( pv, page );
+ for ( offset = HW_FLASH_PAGE_SIZE - HW_FLASH_WIDTH;
+ offset >= EE_HEADER_SIZE; offset -= HW_FLASH_WIDTH )
+ {
+ /* Read one element from flash */
+ el = *EE_PTR( flash_addr + offset );
+
+ /* Compare the read address with the input address and check CRC:
+ in case of failed CRC, data is corrupted and has to be skipped */
+ if ( (el != EE_ERASED) && (el != 0ULL) &&
+ (((el & 0x3FFFFFFFUL) >> 16) == addr) &&
+ (EE_Crc( el ) == (uint16_t)el) )
+ {
+ /* Get variable data */
+ *data = (uint32_t)(el >> 32);
+
+ /* Variable is found */
+ return EE_OK;
+ }
+ }
+
+ /* Check if start of pool is reached */
+ if ( (page == 0) || (page == pv->nb_pages) )
+ {
+ /* Variable is not found */
+ return EE_NOT_FOUND;
+ }
+
+ page--;
+ }
+}
+
+/*****************************************************************************/
+
+static int EE_SetState( const EE_var_t* pv, uint32_t page, uint32_t state )
+{
+ uint32_t flash_addr;
+
+ flash_addr = EE_FLASH_ADDR( pv, page ) + ((state - 1) * HW_FLASH_WIDTH);
+
+ EE_DBG( EE_0 );
+
+ /* Set new page state inside page header */
+ if ( HW_FLASH_Write( flash_addr, EE_PROGRAMMED ) != 0 )
+ {
+ return EE_WRITE_ERROR;
+ }
+
+ return EE_OK;
+}
+
+/*****************************************************************************/
+
+static uint32_t EE_GetState( const EE_var_t* pv, uint32_t page )
+{
+ uint32_t state, flash_addr;
+
+ flash_addr = EE_FLASH_ADDR( pv, page ) + EE_HEADER_SIZE;
+
+ for ( state = EE_STATE_ERASING; state > EE_STATE_ERASED; state-- )
+ {
+ flash_addr -= HW_FLASH_WIDTH;
+
+ /* If page header word is not ERASED, return word index as page state */
+ if ( *EE_PTR( flash_addr ) != EE_ERASED )
+ break;
+ }
+
+ return state;
+}
+
+/*****************************************************************************/
+
+static uint16_t EE_Crc( uint64_t v )
+{
+ uint32_t x, crc = 0;
+
+#define EE_CRC_STEP( n ) x = ((crc >> 8) ^ (uint8_t)(v >> n)) & 0xFFUL; \
+ x ^= x >> 4; \
+ crc = (crc << 8) ^ (x << 12) ^ (x << 5) ^ x
+
+ EE_CRC_STEP( 16 );
+ EE_CRC_STEP( 24 );
+ EE_CRC_STEP( 32 );
+ EE_CRC_STEP( 40 );
+ EE_CRC_STEP( 48 );
+ EE_CRC_STEP( 56 );
+
+ return (uint16_t)crc;
+}
+
+/*****************************************************************************/
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/platform/ee.h b/Middlewares/ST/STM32_WPAN/zigbee/platform/ee.h
new file mode 100644
index 000000000..2be1fc4dd
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/platform/ee.h
@@ -0,0 +1,213 @@
+/*****************************************************************************
+ * @file ee.h
+ * @author MCD Application Team
+ * @brief This file contains the interface of the EEPROM emulator
+ * for Dory platform.
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+#ifndef EE_H__
+#define EE_H__
+
+
+/*
+ * Description
+ * -----------
+ * the EE module implements an EEPROM emulator in one C file ("ee.c").
+ * Its interface is defined below in this file ("ee.h").
+ * Up to two independent banks can be configured.
+ * Data granularity for store and read is one 32-bit word.
+ *
+ * Configuration and dependencies
+ * ------------------------------
+ * the EE module includes a generic configuration header file "ee_cfg.h":
+ * this file has to be defined by the user and must provide the following:
+ *
+ * - Hardware flash driver definitions:
+ *
+ * * HW_FLASH_PAGE_SIZE (in bytes)
+ *
+ * * HW_FLASH_WIDTH (in bytes)
+ *
+ * * int HW_FLASH_Write( uint32_t address,
+ * uint64_t data );
+ *
+ * * int HW_FLASH_Erase( uint32_t page,
+ * uint16_t n,
+ * int interrupt );
+ *
+ * - Optional configuration definitions:
+ *
+ * * CFG_EE_BANK0_SIZE
+ * Size of the first bank in bytes (must be greater than 0).
+ * It must be a multiple of twice the page size.
+ * If not defined, it is set to twice the page size.
+ *
+ * * CFG_EE_BANK0_MAX_NB
+ * Maximum number of (32-bit) data that can be stored in the first bank.
+ * This definition is only used during preprocessing for check.
+ *
+ * * CFG_EE_BANK1_SIZE
+ * Size of the second bank in bytes (can be 0 if the bank is not used).
+ * It must be a multiple of twice the page size.
+ * If not defined, it is set to 0.
+ *
+ * * CFG_EE_BANK1_MAX_NB
+ * Maximum number of (32-bit) data that can be stored in the second bank.
+ * This definition is only used during preprocessing for check.
+ *
+ * * CFG_EE_AUTO_CLEAN
+ * When set to 1, this setting forces EE_Clean to be called at end of
+ * EE_Write when needed.
+ *
+ *
+ * Notes
+ * -----
+ * - a corrupted word in FLASH detected by the user software shall be set to 0.
+ * The EEPROM emulation software will then handle it properly.
+ */
+
+
+#include <stdint.h>
+
+
+
+/* Definition of the functions return value */
+enum
+{
+ EE_OK = 0,
+ EE_NOT_FOUND, /* read data is not found in flash */
+ EE_CLEAN_NEEDED, /* data is written but a "clean" is needed */
+ EE_ERASE_ERROR, /* an error occurs during flash erase */
+ EE_WRITE_ERROR, /* an error occurs during flash write */
+ EE_STATE_ERROR /* state of flash is incoherent (needs clean or format) */
+};
+
+
+/*
+ * EE_Init
+ *
+ * Initialization of EEPROM emulation module. It must be called once at reset.
+ *
+ * format: 0 -> recover EE state from flash and restore the pages
+ * to a known good state in case of power loss.
+ * 1 -> erase all the pages: starts from scratch.
+ * This format mode can be activated the very first time EEPROM
+ * emulation is used, to prepare flash pages for EEPROM emulation
+ * with empty EEPROM
+ *
+ * base_address: absolute start address of flash area used for EEPROM
+ * emulation. It must be a multiple of flash page size.
+ *
+ * return: EE_OK in case of success
+ * EE..._ERROR in case of error
+ */
+
+extern int EE_Init( int format,
+ uint32_t base_address );
+
+/*
+ * EE_Read
+ *
+ * Returns the last stored variable data, if found, which corresponds to
+ * the passed virtual address
+ *
+ * bank: index of the bank (0 or 1)
+ *
+ * addr: variable virtual address
+ *
+ * data: pointer to a 32-bit word (allocated by the caller) containing the
+ * variable value in case of success.
+ *
+ * return: EE_OK in case of success
+ * EE_NOT_FOUND in case this virtual address has never been written to
+ * EE..._ERROR in case of error
+ */
+
+extern int EE_Read( int bank, uint16_t addr, uint32_t* data );
+
+/*
+ * EE_Write
+ *
+ * Writes/updates variable data in EEPROM emulator.
+ * Triggers internal pages transfer if flash pool is full.
+ *
+ * bank: index of the bank (0 or 1)
+ *
+ * addr: variable virtual address
+ *
+ * data: 32-bit data word to be written
+ *
+ * return: EE_OK in case of success
+ * EE_CLEAN_NEEDED if success but user must trigger flash cleanup
+ * by calling EE_Clean()
+ * EE..._ERROR in case of error
+ */
+
+extern int EE_Write( int bank, uint16_t addr, uint32_t data );
+
+/*
+ * EE_Clean
+ *
+ * Erase obsolete pool of pages in polling or interrupt mode.
+ * This function should be called when EE_Write() has returned EE_CLEAN_NEEDED
+ * (and only in that case)
+ * If interrupt mode is used, the user must declare a function with the
+ * following prototype (see hw.h):
+ * void HWCB_FLASH_EndOfCleanup( void );
+ * this function is called under FLASH IRQ handler at end of cleanup.
+ *
+ * bank: index of the bank (0 or 1)
+ *
+ * interrupt: 0 -> polling mode
+ * 1 -> interrupt mode
+ *
+ * return: EE_OK in case of success
+ * EE..._ERROR in case of error
+ */
+
+extern int EE_Clean( int bank, int interrupt );
+
+/*
+ * EE_Dump
+ *
+ * Dumps part of the EEPROM emulation content.
+ * For the purpose of dumping the full content of the EEPROM, this function is
+ * faster than calling several times the EE_Read() function.
+ * Note 1: for speed purpose, CRC is not checked. If you need CRC to be
+ * checked, you must use EE_Read() instead.
+ * Note 2: Some part of the output buffer can be not written if the
+ * corresponding variables have not been stored in the EEPROM.
+ *
+ * bank: index of the bank (0 or 1)
+ *
+ * addr: virtual address of the first variable to dump
+ *
+ * data: pointer to a 32-bit buffer (allocated by the caller) where the
+ * variables from the EEPROM emulation are written.
+ * Variable from virtual address addr is stored in data[0],
+ * variable from virtual address (addr+1) is stored in data[1],
+ * ...
+ * variable from virtual address (addr+size-1) is stored in
+ * data[size-1].
+ *
+ * size: number of consecutive variables to dump
+ *
+ * return: none
+ */
+
+extern void EE_Dump( int bank, uint16_t addr, uint32_t* data, uint16_t size );
+
+
+#endif /* EE_H__ */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/platform/ee_cfg.h b/Middlewares/ST/STM32_WPAN/zigbee/platform/ee_cfg.h
new file mode 100644
index 000000000..891b81f2c
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/platform/ee_cfg.h
@@ -0,0 +1,29 @@
+/*****************************************************************************
+ * @file ee_cfg.h
+ * @author MCD Application Team
+ * @brief This file contains the configuration of the EEPROM emulator
+ * for Dory platform.
+ * This file must be customized: see "ee.h" for details.
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+#ifndef EE_CFG_H__
+#define EE_CFG_H__
+
+
+#include "utilities_common.h"
+#include "hw_flash.h"
+
+
+#endif /* EE_CFG_H__ */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.c b/Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.c
new file mode 100644
index 000000000..d8d0a713b
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.c
@@ -0,0 +1,152 @@
+/*****************************************************************************
+ * @file hw_flash.c
+ * @author MCD Application Team
+ * @brief This file contains the FLASH driver needed by EE module
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+//#include "common.h"
+#include "stm32_seq.h"
+//#include "dbg_gpio.h"
+#include "hw_flash.h"
+#include "stm32wbxx_hal.h"
+
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);
+static void HW_FLASH_PageErase(uint32_t Page);
+//static void HW_FLASH_WaitEndOfOperation(void);
+
+/*****************************************************************************/
+
+int HW_FLASH_Write(uint32_t address, uint64_t data)
+{
+ /* Enable EOP interrupt */
+ // __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ // __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_Program_DoubleWord(address, data);
+
+ // HW_FLASH_WaitEndOfOperation();
+
+ /* Disable EOP interrupt */
+// __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the PG bit once data has been written */
+ CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
+
+ return (HW_OK);
+}
+
+/*****************************************************************************/
+
+int HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt)
+{
+ UNUSED(interrupt);
+
+ uint32_t loop;
+
+ /* Enable EOP interrupt */
+ __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ for( loop = 0; loop < n ; loop++)
+ {
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_PageErase(page+loop);
+
+// HW_FLASH_WaitEndOfOperation();
+ }
+
+ /* Disable EOP interrupt */
+ __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the page erase bit */
+ CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
+
+ return (HW_OK);
+}
+
+#if 0
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void)
+{
+ return READ_BIT(FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSFSA(void)
+{
+ return (READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SBRSA) >> FLASH_SRRVR_SBRSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSNBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SNBRSA) >> FLASH_SRRVR_SNBRSA_Pos);
+}
+#endif
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * This is a copy of FLASH_Program_DoubleWord() from the HAL
+ */
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_WRITE);
+
+ /* Set PG bit */
+ SET_BIT(FLASH->CR, FLASH_CR_PG);
+
+ /* Program first word */
+ *(uint32_t *)Address = (uint32_t)Data;
+
+ /* Barrier to ensure programming is performed in 2 steps, in right order
+ (independently of compiler optimization behavior) */
+ __ISB();
+
+ /* Program second word */
+ *(uint32_t *)(Address + 4U) = (uint32_t)(Data >> 32U);
+
+// DBG_GPIO_Gr2Reset(DBG_GPIO_GR2_FLASH_WRITE);
+}
+
+/**
+ * This is a copy of LASH_PageErase() from the HAL
+ */
+static void HW_FLASH_PageErase(uint32_t Page)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+
+ /* Proceed to erase the page */
+ MODIFY_REG(FLASH->CR, FLASH_CR_PNB, ((Page << FLASH_CR_PNB_Pos) | FLASH_CR_PER | FLASH_CR_STRT));
+
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.h b/Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.h
new file mode 100644
index 000000000..5ae95c6e1
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/platform/hw_flash.h
@@ -0,0 +1,103 @@
+/*****************************************************************************
+ * @file hw_flash.h
+ * @author MCD Application Team
+ * @brief This file contains the FLASH driver
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_FLASH_H
+#define __HW_FLASH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Flash address */
+#define HW_FLASH_ADDRESS FLASH_BASE
+
+/* Flash page size in bytes */
+#define HW_FLASH_PAGE_SIZE FLASH_PAGE_SIZE
+
+/* Flash width in bytes */
+#define HW_FLASH_WIDTH 8
+
+/* Return values definition */
+enum
+{
+ HW_OK = 0,
+ HW_BUSY = 1
+};
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Write 64 bits double word in FLASH
+ *
+ * @param FLASH destination address
+ * @param 64 bits double word data
+ * @retval result
+ */
+int HW_FLASH_Write(uint32_t address, uint64_t data);
+
+/**
+ * @brief Erase FLASH page
+ *
+ * @param address of FLASH page
+ * @param number of page
+ * @param interrupt not used
+ * @retval result
+ */
+int HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt);
+
+#if 0
+/**
+ * @brief Get Option Byte IPCC buffer address
+ *
+ * @param None
+ * @retval Option Byte IPCC buffer address
+ */
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void);
+
+/**
+ * @brief Get Option Byte SFSA
+ *
+ * @param None
+ * @retval Option Byte SFSA
+ */
+uint32_t HW_FLASH_OB_GetSFSA(void);
+
+/**
+ * @brief Get Option Byte SBSRA
+ *
+ * @param None
+ * @retval Option Byte SBSRA
+ */
+uint32_t HW_FLASH_OB_GetSBRSA(void);
+
+/**
+ * @brief Get Option Byte SNBRSA
+ *
+ * @param None
+ * @retval Option Byte SNBRSA
+ */
+uint32_t HW_FLASH_OB_GetSNBRSA(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__HW_FLASH_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/readme.txt b/Middlewares/ST/STM32_WPAN/zigbee/readme.txt
new file mode 100644
index 000000000..40a9e2f28
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/readme.txt
@@ -0,0 +1,6 @@
+LICENSE information
+===================
+This software component is licensed to you by ST under Ultimate Liberty license
+SLA0044, the "License"; You may not use this file except in compliance with the
+License. The terms of the License are contained in the SLA0044.txt file in the
+same directory than this readme.txt file.
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras/zigbee.extras.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras/zigbee.extras.h
index 6637f4be4..cc787db79 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras/zigbee.extras.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras/zigbee.extras.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_EXTRAS_H
#define ZIGBEE_EXTRAS_H
@@ -15,13 +15,13 @@ bool ZbNwkTestSendUnknownCommand(struct ZigBeeT *zb, uint16_t nwkDstAddr,
uint8_t nwkProtoVer);
/* APS functions required for zigbee testing */
-void ZbApsmeRemoveDeviceReq_NoApsSec(struct ZigBeeT *zb, ZbApsmeRemoveDeviceReqT *req);
+void ZbApsmeRemoveDeviceReq_NoApsSec(struct ZigBeeT *zb, struct ZbApsmeRemoveDeviceReqT *req);
/* ZDO functions required for zigbee testing */
-void ZbZdoNwkAddrReq_NoSec(struct ZigBeeT *zb, ZbZdoNwkAddrReqT *req);
-void ZbZdoNwkAddrReq_InterPan(struct ZigBeeT *zb, ZbZdoNwkAddrReqT *req, uint16_t panid);
-void ZbZdoNodeDescReq_NoSec(struct ZigBeeT *zb, ZbZdoNodeDescReqT *req);
-void ZbZdoNodeDescReq_nwk_ext_bit(struct ZigBeeT *zb, ZbZdoNodeDescReqT *req, uint64_t dstExtAddr);
+void ZbZdoNwkAddrReq_NoSec(struct ZigBeeT *zb, struct ZbZdoNwkAddrReqT *req);
+void ZbZdoNwkAddrReq_InterPan(struct ZigBeeT *zb, struct ZbZdoNwkAddrReqT *req, uint16_t panid);
+void ZbZdoNodeDescReq_NoSec(struct ZigBeeT *zb, struct ZbZdoNodeDescReqT *req);
+void ZbZdoNodeDescReq_nwk_ext_bit(struct ZigBeeT *zb, struct ZbZdoNodeDescReqT *req, uint64_t dstExtAddr);
void ZbZdoDiscoveryCacheReq(struct ZigBeeT *zb, uint16_t dstAddr);
void ZbZdoUnsolicitedEnhUpdateNotify(struct ZigBeeT *zb, uint16_t dstAddr);
@@ -29,4 +29,35 @@ void ZbZdoUnsolicitedEnhUpdateNotify(struct ZigBeeT *zb, uint16_t dstAddr);
const char * ZbZdoNodeTypeToStr(const uint8_t type);
void ZbZdoNodeBandsStr(const uint8_t band, char *buf, const unsigned int max_len);
+/*-----------------------------------------------------------------------------
+ * Blocking Functions (CONFIG_ZB_BLOCKING_CALLS)
+ *-----------------------------------------------------------------------------
+ */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+enum ZbStatusCodeT ZbStartupRejoinWait(struct ZigBeeT *zb);
+
+void ZbNldeDataReqWait(struct ZigBeeT *zb, struct ZbNldeDataReqT *req, struct ZbNldeDataConfT *conf);
+void ZbNldeFrameReqWait(struct ZigBeeT *zb, struct ZbNldeFrameReqT *req, ZbNldeFrameConfT *conf);
+void ZbNlmeNetDiscWait(struct ZigBeeT *zb, struct ZbNlmeNetDiscReqT *req, struct ZbNlmeNetDiscConfT *conf);
+void ZbNlmeNetFormWait(struct ZigBeeT *zb, struct ZbNlmeNetFormReqT *req, struct ZbNlmeNetFormConfT *conf);
+void ZbNlmeJoinWait(struct ZigBeeT *zb, struct ZbNlmeJoinReqT *req, struct ZbNlmeJoinConfT *conf);
+void ZbNlmeLeaveWait(struct ZigBeeT *zb, struct ZbNlmeLeaveReqT *leaveReqPtr, struct ZbNlmeLeaveConfT *leaveConfPtr);
+void ZbNlmeRouteDiscWait(struct ZigBeeT *zb, struct ZbNlmeRouteDiscReqT *req, struct ZbNlmeRouteDiscConfT *conf);
+
+void ZbZdoNwkAddrWait(struct ZigBeeT *zb, struct ZbZdoNwkAddrReqT *req, struct ZbZdoNwkAddrRspT *rsp);
+void ZbZdoIeeeAddrWait(struct ZigBeeT *zb, struct ZbZdoIeeeAddrReqT *req, struct ZbZdoIeeeAddrRspT *rsp);
+void ZbZdoNodeDescWait(struct ZigBeeT *zb, struct ZbZdoNodeDescReqT *req, struct ZbZdoNodeDescRspT *rsp);
+void ZbZdoPowerDescWait(struct ZigBeeT *zb, struct ZbZdoPowerDescReqT *req, struct ZbZdoPowerDescRspT *rsp);
+void ZbZdoSimpleDescWait(struct ZigBeeT *zb, struct ZbZdoSimpleDescReqT *req, struct ZbZdoSimpleDescRspT *rsp);
+void ZbZdoActiveEpWait(struct ZigBeeT *zb, struct ZbZdoActiveEpReqT *req, struct ZbZdoActiveEpRspT *rsp);
+void ZbZdoMatchDescWait(struct ZigBeeT *zb, struct ZbZdoMatchDescReqT *req, struct ZbZdoMatchDescRspT *rsp);
+void ZbZdoBindWait(struct ZigBeeT *zb, struct ZbZdoBindReqT *req, struct ZbZdoBindRspT *rsp);
+void ZbZdoUnbindWait(struct ZigBeeT *zb, struct ZbZdoBindReqT *req, struct ZbZdoBindRspT *rsp);
+void ZbZdoLqiWait(struct ZigBeeT *zb, struct ZbZdoLqiReqT *req, struct ZbZdoLqiRspT *rsp);
+void ZbZdoRtgWait(struct ZigBeeT *zb, struct ZbZdoRtgReqT *req, struct ZbZdoRtgRspT *rsp);
+void ZbZdoMgmtBindWait(struct ZigBeeT *zb, struct ZbZdoMgmtBindReqT *req, struct ZbZdoMgmtBindRspT *rsp);
+void ZbZdoPermitJoinWait(struct ZigBeeT *zb, struct ZbZdoPermitJoinReqT *req, struct ZbZdoPermitJoinRspT *rsp);
+void ZbZdoNwkUpdateWait(struct ZigBeeT *zb, struct ZbZdoNwkUpdateReqT *req, struct ZbZdoNwkUpdateNotifyT *rsp);
+void ZbZdoLeaveWait(struct ZigBeeT *zb, struct ZbZdoLeaveReqT *req, struct ZbZdoLeaveRspT *rsp);
+
#endif
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/ieee802154_enums.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/ieee802154_enums.h
new file mode 100644
index 000000000..9c2d895c4
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/ieee802154_enums.h
@@ -0,0 +1,85 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef IEEE802154_ENUMS_H
+#define IEEE802154_ENUMS_H
+
+#include "mcp_enums.h" /* MAC Status and Enumerations */
+
+/*----------------------------------------------------------------------------
+ * Packet Sizes
+ *----------------------------------------------------------------------------
+ */
+#define WPAN_CONST_MAX_PHY_PACKET_SIZE 127U
+
+/* Minimum v0 and v1 Beacon overhead, assuming:
+ * - extended addressing (typically short, but be on the safe side)
+ * - no security
+ * - GTS count = 0
+ * - no pending addresses */
+#define WPAN_CONST_MIN_BEACON_OVERHEAD (17U + 2U /* FCS */) /* 19 */
+
+/* Maximum v0 and v1 Beacon overhead, assuming:
+ * - extended addressing
+ * - no security
+ * - GTS count = 0
+ * - 7 extended pending addresses (56 bytes) */
+#define WPAN_CONST_MAX_BEACON_OVERHEAD (17U + 56U + 2U) /* 75*/
+
+/* For the maximum beacon payload length, assume minimum overhead */
+#define WPAN_CONST_MAX_BEACON_PAYLOAD_LENGTH (WPAN_CONST_MAX_PHY_PACKET_SIZE - WPAN_CONST_MIN_BEACON_OVERHEAD) /* 108 */
+
+/* For ZigBee PRO, ZB_NWK_CONST_MAC_FRAME_OVERHEAD is 11. */
+#define WPAN_CONST_MPDU_OVERHEAD 11U /* minimum overhead is 9 */
+
+#define WPAN_CONST_MAX_MAC_PAYLOAD_SIZE (WPAN_CONST_MAX_PHY_PACKET_SIZE - WPAN_CONST_MPDU_OVERHEAD)
+#define WPAN_IE_MAX_SIZE WPAN_CONST_MAX_MAC_PAYLOAD_SIZE
+
+/*----------------------------------------------------------------------------
+ * Channels and Channel Masks
+ *----------------------------------------------------------------------------
+ */
+/* Maximum number of channels for a given 32-bit channel mask. */
+#define WPAN_CHANNELS_PER_MASK 32U
+/* Maximum channel value. logicalChannel is a 16-bit value. Keep it within
+ * that type's range. 0xffff is otherwise arbitrary. */
+#define WPAN_CHANNELS_MAX 0xffffU
+
+/* Maximum channels per page and channel mask, assuming 32-bit channel mask
+ * and top 5-bits are reserved for page.
+ *
+ * Note that page bits are not an 802.15.4 concept, so the page is never
+ * encoded in the channel mask for the MAC API. There is always a separate
+ * channel page parameter (channelPage) from the channel or channel mask. */
+#define WPAN_PAGE_CHANNELS_MAX 27U
+#define WPAN_PAGE_CHANNELMASK_ALL 0x07FFFFFFU /* Channels 0 to 26 */
+
+/* Specific channel masks */
+#define WPAN_CHANNELMASK_868MHZ 0x00000001U /* Channel 0 */
+#define WPAN_CHANNELMASK_915MHZ 0x000007FEU /* Channels 1-10 */
+#define WPAN_CHANNELMASK_2400MHZ 0x07FFF800U /* Channels 11-26 */
+
+/* GB-868 channel masks (863 to 876 MHz) */
+#define WPAN_CHANNELMASK_PAGE28 0x07FFFFFFU /* Channels 0 to 26 */
+#define WPAN_CHANNELMASK_PAGE29 0x000000FFU /* Channels 27 to 34 (0 to 7) */
+#define WPAN_CHANNELMASK_PAGE30 0x00003FFFU /* Channels 35 to 48 (0 to 13) */
+/* GB-868 channel masks (915 to 921 MHz) */
+#define WPAN_CHANNELMASK_PAGE31 0x00001FFFU /* Channels 0 to 12 */
+
+/* Virtual channel page (BDL/SCoP). Arbitrarily chosen. */
+#define WPAN_CHANNELPAGE_VIRTUAL_MIN 16U
+#define WPAN_CHANNELPAGE_VIRTUAL_MAX 17U
+#define WPAN_CHANNELMASK_VIRTUAL WPAN_PAGE_CHANNELMASK_ALL /* Channels 0 to 26 */
+
+#define WPAN_CHANNELPAGE_SUN 9U
+
+/*----------------------------------------------------------------------------
+ * CRC
+ *----------------------------------------------------------------------------
+ */
+#define WPAN_CRC_POLYNOMIAL 0x1021U
+#define WPAN_CRC_INITIAL 0x0000U
+#define WPAN_CRC_XOROUT 0x0000U
+
+uint16_t WpanCrc(uint16_t crc, const void *dataPtr, unsigned int dataLen);
+
+#endif
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/llist.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/llist.h
index 8c986267b..b0a21c7c9 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/llist.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/llist.h
@@ -1,12 +1,9 @@
-/* Copyright [2009 - 2018] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
/* Description: Double Linked List Helpers */
#ifndef LLIST_H
#define LLIST_H
-/* Static initializers */
-#define LINK_LIST_STATIC(_p_) {(_p_), (_p_)}
-
/* Initialize a list to an empty state, or an item to an unlinked state. */
#define LINK_LIST_INIT(_p_) \
do { \
@@ -66,14 +63,8 @@
#define LINK_LIST_INSERT_HEAD(_list_, _add_) LINK_LIST_INSERT_AFTER(_list_, _add_)
#define LINK_LIST_INSERT_TAIL(_list_, _add_) LINK_LIST_INSERT_BEFORE(_list_, _add_)
-/* FIXME 1 - replace these with their INSERT relatives, but careful with parameters */
-#define LINK_LIST_ADD_BEFORE(_p_, _at_) LINK_LIST_INSERT_BEFORE(_at_, _p_)
-#define LINK_LIST_ADD_AFTER(_p_, _at_) LINK_LIST_INSERT_AFTER(_at_, _p_)
-#define LINK_LIST_ADD_HEAD(_p_, _list_) LINK_LIST_INSERT_AFTER(_list_, _p_)
-#define LINK_LIST_ADD_TAIL(_p_, _list_) LINK_LIST_INSERT_BEFORE(_list_, _p_)
-
/* Adds an item to a list while keeping the list sorted. */
-#define LINK_LIST_ADD_SORT(_add_, _list_, _cmp_) \
+#define LINK_LIST_INSERT_SORT(_list_, _add_, _cmp_) \
do { \
struct LinkListT *_i_ = (_list_)->next; \
while (true) { \
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/mcp_enums.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/mcp_enums.h
index 2410c0d5f..e6687fd8c 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/mcp_enums.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac/mcp_enums.h
@@ -1,326 +1,368 @@
-/* Copyright [2015 - 2018] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2015 - 2020] Exegin Technologies Limited. All rights reserved. */
-#ifndef MCP_ENUMS_H
-# define MCP_ENUMS_H
+#ifndef MCP_ENUMS_H_
+# define MCP_ENUMS_H_
/*lint -save -e726 [!MISRA - extra comma ignored (end of enum)] */
/* IEEE 802.15.4 Status Values */
enum mcp_status {
- mcp_STATUS_SUCCESS = 0x00,
- mcp_STATUS_BEACON_LOSS = 0xe0,
- mcp_STATUS_CHANNEL_ACCESS_FAILURE = 0xe1,
- mcp_STATUS_COUNTER_ERROR = 0xdb,
- mcp_STATUS_DENIED = 0xe2,
- mcp_STATUS_DISABLE_TRX_FAILURE = 0xe3,
- mcp_STATUS_FRAME_TOO_LONG = 0xe5,
- mcp_STATUS_IMPROPER_KEY_TYPE = 0xdc,
- mcp_STATUS_IMPROPER_SECURITY_LEVEL = 0xdd,
- mcp_STATUS_INVALID_ADDRESS = 0xf5,
- mcp_STATUS_INVALID_GTS = 0xe6,
- mcp_STATUS_INVALID_HANDLE = 0xe7,
- mcp_STATUS_INVALID_INDEX = 0xf9,
- mcp_STATUS_INVALID_PARAMETER = 0xe8,
- mcp_STATUS_LIMIT_REACHED = 0xfa,
- mcp_STATUS_NO_ACK = 0xe9,
- mcp_STATUS_NO_BEACON = 0xea,
- mcp_STATUS_NO_DATA = 0xeb,
- mcp_STATUS_NO_SHORT_ADDRESS = 0xec,
- mcp_STATUS_ON_TIME_TOO_LONG = 0xf6,
- mcp_STATUS_OUT_OF_CAP = 0xed,
- mcp_STATUS_PAN_ID_CONFLICT = 0xee,
- mcp_STATUS_PAST_TIME = 0xf7,
- mcp_STATUS_READ_ONLY = 0xfb,
- mcp_STATUS_REALIGNMENT = 0xef,
- mcp_STATUS_SCAN_IN_PROGRESS = 0xfc,
- mcp_STATUS_SECURITY_ERROR = 0xe4,
- mcp_STATUS_SUPERFRAME_OVERLAP = 0xfd,
- mcp_STATUS_TRACKING_OFF = 0xf8,
- mcp_STATUS_TRANSACTION_EXPIRED = 0xf0,
- mcp_STATUS_TRANSACTION_OVERFLOW = 0xf1,
- mcp_STATUS_TX_ACTIVE = 0xf2,
- mcp_STATUS_UNAVAILABLE_KEY = 0xf3,
- mcp_STATUS_UNSUPPORTED_ATTRIBUTE = 0xf4,
- mcp_STATUS_UNSUPPORTED_LEGACY = 0xde,
- mcp_STATUS_UNSUPPORTED_SECURITY = 0xdf,
- mcp_STATUS_DRIVER_ERROR = 0xfe,
- mcp_STATUS_DEVICE_ERROR = 0xff,
+ mcp_STATUS_SUCCESS = 0x00,
+ mcp_STATUS_BEACON_LOSS = 0xe0,
+ mcp_STATUS_CHANNEL_ACCESS_FAILURE = 0xe1,
+ mcp_STATUS_COUNTER_ERROR = 0xdb,
+ mcp_STATUS_DENIED = 0xe2,
+ mcp_STATUS_DISABLE_TRX_FAILURE = 0xe3,
+ mcp_STATUS_FRAME_TOO_LONG = 0xe5,
+ mcp_STATUS_IMPROPER_KEY_TYPE = 0xdc,
+ mcp_STATUS_IMPROPER_SECURITY_LEVEL = 0xdd,
+ mcp_STATUS_INVALID_ADDRESS = 0xf5,
+ mcp_STATUS_INVALID_GTS = 0xe6,
+ mcp_STATUS_INVALID_HANDLE = 0xe7,
+ mcp_STATUS_INVALID_INDEX = 0xf9,
+ mcp_STATUS_INVALID_PARAMETER = 0xe8,
+ mcp_STATUS_LIMIT_REACHED = 0xfa,
+ mcp_STATUS_NO_ACK = 0xe9,
+ mcp_STATUS_NO_BEACON = 0xea,
+ mcp_STATUS_NO_DATA = 0xeb,
+ mcp_STATUS_NO_SHORT_ADDRESS = 0xec,
+ mcp_STATUS_ON_TIME_TOO_LONG = 0xf6,
+ mcp_STATUS_OUT_OF_CAP = 0xed,
+ mcp_STATUS_PAN_ID_CONFLICT = 0xee,
+ mcp_STATUS_PAST_TIME = 0xf7,
+ mcp_STATUS_READ_ONLY = 0xfb,
+ mcp_STATUS_REALIGNMENT = 0xef,
+ mcp_STATUS_SCAN_IN_PROGRESS = 0xfc,
+ mcp_STATUS_SECURITY_ERROR = 0xe4,
+ mcp_STATUS_SUPERFRAME_OVERLAP = 0xfd,
+ mcp_STATUS_TRACKING_OFF = 0xf8,
+ mcp_STATUS_TRANSACTION_EXPIRED = 0xf0,
+ mcp_STATUS_TRANSACTION_OVERFLOW = 0xf1,
+ mcp_STATUS_TX_ACTIVE = 0xf2,
+ mcp_STATUS_UNAVAILABLE_KEY = 0xf3,
+ mcp_STATUS_UNSUPPORTED_ATTRIBUTE = 0xf4,
+ mcp_STATUS_UNSUPPORTED_LEGACY = 0xde,
+ mcp_STATUS_UNSUPPORTED_SECURITY = 0xdf,
+ mcp_STATUS_DRIVER_ERROR = 0xfe,
+ mcp_STATUS_DEVICE_ERROR = 0xff,
};
enum {
- mcp_EVENT_NONE = 0x00,
- mcp_EVENT_ASN_NOTIFY_TIME = 0x01,
- mcp_EVENT_LINK_EXPIRED = 0x02,
- mcp_EVENT_UNDEFINED = 0xff,
+ mcp_EVENT_NONE = 0x00,
+ mcp_EVENT_ASN_NOTIFY_TIME = 0x01,
+ mcp_EVENT_LINK_EXPIRED = 0x02,
+ mcp_EVENT_KEY_STALE = 0x03,
+ mcp_EVENT_ACTIVE_KEY_CHANGED = 0x04,
+ mcp_EVENT_UNDEFINED = 0xff,
};
enum mcp_attr_id {
/* PHY PIB Attributes. */
- mcp_phyCurrentChannel = 0x00,
- mcp_phyChannelsSupported = 0x01,
- mcp_phyTransmitPower = 0x02,
- mcp_phyCcaMode = 0x03,
- mcp_phyCurrentPage = 0x04,
- mcp_phyMaxFrameDuration = 0x05,
- mcp_phyShrDuration = 0x06,
- mcp_phySymbolsPerOctet = 0x07,
- mcp_aMaxPhyPacketSize = 0x08,
- mcp_phyCcaThreshold = 0x09,
- mcp_phyCcaThresholdAbs = 0x0a,
- mcp_phyRadioSensitivity = 0x0b,
+ mcp_phyCurrentChannel = 0x00,
+ mcp_phyChannelsSupported = 0x01,
+ mcp_phyTransmitPower = 0x02,
+ mcp_phyCcaMode = 0x03,
+ mcp_phyCurrentPage = 0x04,
+ mcp_phyMaxFrameDuration = 0x05,
+ mcp_phyShrDuration = 0x06,
+ mcp_phySymbolsPerOctet = 0x07,
+ mcp_aMaxPhyPacketSize = 0x08,
+ mcp_phyCcaThreshold = 0x09,
+ mcp_phyCcaThresholdAbs = 0x0a,
+ mcp_phyRadioSensitivity = 0x0b,
/* MAC PIB Attributes. */
- mcp_macAckWaitDuration = 0x40,
- mcp_macAssociatedPanCoord = 0x56,
- mcp_macAssociationPermit = 0x41,
- mcp_macAutoRequest = 0x42,
- mcp_macBattLifeExt = 0x43,
- mcp_macBattLifeExtPeriods = 0x44,
- mcp_macBeaconPayload = 0x45,
- mcp_macBeaconPayloadLength = 0x46,
- mcp_macBeaconOrder = 0x47,
- mcp_macBeaconTxTime = 0x48,
- mcp_macBsn = 0x49,
- mcp_macCoordExtendedAddress = 0x4a,
- mcp_macCoordShortAddress = 0x4b,
- mcp_macDsn = 0x4c,
- mcp_macGtsPermit = 0x4d,
- mcp_macMaxBE = 0x57,
- mcp_macMaxCsmaBackoffs = 0x4e,
- mcp_macMaxFrameTotalWaitTime = 0x58,
- mcp_macMaxFrameRetries = 0x59,
- mcp_macMinBE = 0x4f,
-
- mcp_macPanId = 0x50,
- mcp_macPromiscuousMode = 0x51,
- mcp_macResponseWaitTime = 0x5a,
- mcp_macRxOnWhenIdle = 0x52,
- mcp_macSecurityEnabled = 0x5d,
- mcp_macShortAddress = 0x53,
- mcp_macExtendedAddress = 0x63, /* Read/Write - used to get/set the EUI-64 address of the device. */
- mcp_macSuperframeOrder = 0x54,
- mcp_macSyncSymbolOffset = 0x5b,
- mcp_macTimestampSupported = 0x5c,
- mcp_macTransactionPersistenceTime = 0x55,
-
- _mcp_Spare_1 = 0x5e,
- _mcp_Spare_2 = 0x5f,
+ mcp_macAckWaitDuration = 0x40,
+ mcp_macAssociatedPanCoord = 0x56,
+ mcp_macAssociationPermit = 0x41,
+ mcp_macAutoRequest = 0x42,
+ mcp_macBattLifeExt = 0x43,
+ mcp_macBattLifeExtPeriods = 0x44,
+ mcp_macBeaconPayload = 0x45,
+ mcp_macBeaconPayloadLength = 0x46,
+ mcp_macBeaconOrder = 0x47,
+ mcp_macBeaconTxTime = 0x48,
+ mcp_macBsn = 0x49,
+ mcp_macCoordExtendedAddress = 0x4a,
+ mcp_macCoordShortAddress = 0x4b,
+ mcp_macDsn = 0x4c,
+ mcp_macGtsPermit = 0x4d,
+ mcp_macMaxBE = 0x57,
+ mcp_macMaxCsmaBackoffs = 0x4e,
+ mcp_macMaxFrameTotalWaitTime = 0x58,
+ mcp_macMaxFrameRetries = 0x59,
+ mcp_macMinBE = 0x4f,
+
+ mcp_macPanId = 0x50,
+ mcp_macPromiscuousMode = 0x51,
+ mcp_macResponseWaitTime = 0x5a,
+ mcp_macRxOnWhenIdle = 0x52,
+ mcp_macSecurityEnabled = 0x5d,
+ mcp_macShortAddress = 0x53,
+ mcp_macExtendedAddress = 0x63, /* Read/Write - used to get/set the EUI-64 address of the device. */
+ mcp_macSuperframeOrder = 0x54,
+ mcp_macSyncSymbolOffset = 0x5b,
+ mcp_macTimestampSupported = 0x5c,
+ mcp_macTransactionPersistenceTime = 0x55,
+
+ _mcp_Spare_1 = 0x5e,
+ _mcp_Spare_2 = 0x5f,
/* Exegin Add-ons. */
- mcp_phySymbolRate = 0x60, /* Read only - rate in symbols/seconds of current phy. */
- mcp_phyClearChannel = 0x61, /* Read only - reading will trigger a CCA measurement (ZigBee testing). */
- mcp_phyEnergyDetect = 0x62, /* Read only - reading will trigger a phy ED measurement (ZigBee testing). */
- mcp_macPromiscuousAutoFcs = 0x64, /* Optional - specifies if the FCS is checked when in promiscuous mode. */
- mcp_phyTestModulated = 0x65, /* Optional - Transmits a modulated carrier (FCC testing). */
- mcp_phyTestUnmodulated = 0x66, /* Optional - Transmits an unmodulated carrier (FCC testing). */
- mcp_phyTestClockOut = 0x67, /* Optional - Enables clock output to GPIO (Oscillator tuning). */
- mcp_macStatistics = 0x68, /* Read only - returns the mcp_statistics structure (if supported). */
- mcp_macKeySwitchIndex = 0x69, /* Read/Write - used by ZigBee-IP to trigger a key switch (i.e. receive a packet with a matching key ID). */
- mcp_phySendRaw = 0x6a, /* Write only - transmits a raw PSDU on attribute write. */
- mcp_macHardwareInd = 0x6b, /* Read/Write - boolean to toggle a hardware indication. */
- mcp_phyStatistics = 0x6c, /* Read only - returns an mcp_counters structure (if supported). */
- mcp_macLicenseCert = 0x6d, /* Read only - The license certificate. */
- mcp_phyHardwareRand = 0x6e, /* Read only - Retrieve a randomly generated byte from hardware (eg: RSSI noise). */
- mcp_phyPagesSupported = 0x6f, /* Read only - a 32bit mask of channel-pages supported. */
- mcp_macASNNotifyTime = 0x70, /* Read/Write - ASN Time for MLME-EVENT.indication */
+ mcp_phySymbolRate = 0x60, /* Read only - rate in symbols/seconds of current phy. */
+ mcp_phyClearChannel = 0x61, /* Read only - reading will trigger a CCA measurement (ZigBee testing). */
+ mcp_phyEnergyDetect = 0x62, /* Read only - reading will trigger a phy ED measurement (ZigBee testing). */
+ mcp_macPromiscuousAutoFcs = 0x64, /* Optional - specifies if the FCS is checked when in promiscuous mode. */
+ mcp_phyTestModulated = 0x65, /* Optional - Transmits a modulated carrier (FCC testing). */
+ mcp_phyTestUnmodulated = 0x66, /* Optional - Transmits an unmodulated carrier (FCC testing). */
+ mcp_phyTestClockOut = 0x67, /* Optional - Enables clock output to GPIO (Oscillator tuning). */
+ mcp_macStatistics = 0x68, /* Read only - returns the mcp_statistics structure (if supported). */
+ mcp_macKeySwitchIndex = 0x69, /* Read/Write - used by ZigBee-IP to trigger a key switch (i.e. receive a packet with a matching key ID). */
+ mcp_phySendRaw = 0x6a, /* Write only - transmits a raw PSDU on attribute write. */
+ mcp_macHardwareInd = 0x6b, /* Read/Write - boolean to toggle a hardware indication. */
+ mcp_phyStatistics = 0x6c, /* Read only - returns an mcp_counters structure (if supported). */
+ mcp_macLicenseCert = 0x6d, /* Read only - The license certificate. */
+ mcp_phyHardwareRand = 0x6e, /* Read only - Retrieve a randomly generated byte from hardware (eg: RSSI noise). */
+ mcp_phyPagesSupported = 0x6f, /* Read only - a 32bit mask of channel-pages supported. */
+ mcp_macASNNotifyTime = 0x70, /* Read/Write - ASN Time for MLME-EVENT.indication */
/* Security PIB Attributes */
- mcp_macKeyTable = 0x71,
- mcp_macKeyTableEntries = 0x72,
- mcp_macDeviceTable = 0x73,
- mcp_macDeviceTableEntries = 0x74,
- mcp_macSecurityLevelTable = 0x75,
- mcp_macSecurityLevelTableEntries = 0x76,
- mcp_macFrameCounter = 0x77,
- mcp_macAutoRequestSecurityLevel = 0x78,
- mcp_macAutoRequestKeyIdMode = 0x79,
- mcp_macAutoRequestKeySource = 0x7a,
- mcp_macAutoRequestKeyIndex = 0x7b,
- mcp_macDefaultKeySource = 0x7c,
-
- mcp_macPanCoordExtendedAddress = 0x7d, /* ??? This seems to duplicate macCoordExtendedAddress */
- mcp_macPanCoordShortAddress = 0x7e, /* ??? This seems to duplicate macCoordShortAddress */
+ mcp_macKeyTable = 0x71,
+ mcp_macKeyTableEntries = 0x72,
+ mcp_macDeviceTable = 0x73,
+ mcp_macDeviceTableEntries = 0x74,
+ mcp_macSecurityLevelTable = 0x75,
+ mcp_macSecurityLevelTableEntries = 0x76,
+ mcp_macFrameCounter = 0x77,
+ mcp_macAutoRequestSecurityLevel = 0x78,
+ mcp_macAutoRequestKeyIdMode = 0x79,
+ mcp_macAutoRequestKeySource = 0x7a,
+ mcp_macAutoRequestKeyIndex = 0x7b,
+ mcp_macDefaultKeySource = 0x7c,
+
+ mcp_macPanCoordExtendedAddress = 0x7d, /* ??? This seems to duplicate macCoordExtendedAddress */
+ mcp_macPanCoordShortAddress = 0x7e, /* ??? This seems to duplicate macCoordShortAddress */
/* TX duty-cycle attributes */
- mcp_macTxTotalDuration = 0x7f, /* Total number of transmitted symbols */
- mcp_macTxControlActiveDuration = 0x80, /* Active phase of TX duty cycle in milliseconds */
- mcp_macTxControlPauseDuration = 0x81, /* Paused phase of TX duty cycle in milliseconds */
+ mcp_macTxTotalDuration = 0x7f, /* Total number of transmitted symbols */
+ mcp_macTxControlActiveDuration = 0x80, /* Active phase of TX duty cycle in milliseconds */
+ mcp_macTxControlPauseDuration = 0x81, /* Paused phase of TX duty cycle in milliseconds */
- mcp_macPacketDiagInfoEnable = 0x82, /* Controls if Diagnostic TLVs are added to packet indication messages */
+ mcp_macPacketDiagInfoEnable = 0x82, /* Controls if Diagnostic TLVs are added to packet indication messages */
- mcp_enhancedBeaconIEs = 0x0101, /* HIEs, MIEs, and PIEs to include in enhanced beacon */
+ mcp_enhancedBeaconIEs = 0x0101, /* HIEs, MIEs, and PIEs to include in enhanced beacon */
- mcp_macImplicitBroadcast = 0x0102,
- mcp_macGlobalTime = 0x0103, /* For Global Time IE, in seconds */
- mcp_macBeaconsScheduled = 0x0104, /* Count of beacons scheduled, not necessarily sent; zeroed on read. */
+ mcp_macImplicitBroadcast = 0x0102,
+ mcp_macGlobalTime = 0x0103, /* For Global Time IE, in seconds */
+ mcp_macBeaconsScheduled = 0x0104, /* Count of beacons scheduled, not necessarily sent; zeroed on read. */
- mcp_macEnhancedBeaconSecurityLevel = 0x0105, /* Security setting for transmitting enhanced beacons */
- mcp_macEnhancedBeaconKeyIdMode = 0x0106,
- mcp_macEnhancedBeaconKeySource = 0x0107,
- mcp_macEnhancedBeaconKeyIndex = 0x0108,
+ mcp_macEnhancedBeaconSecurityLevel = 0x0105, /* Security setting for transmitting enhanced beacons */
+ mcp_macEnhancedBeaconKeyIdMode = 0x0106,
+ mcp_macEnhancedBeaconKeySource = 0x0107,
+ mcp_macEnhancedBeaconKeyIndex = 0x0108,
+
+ /* Custom Default Channel feature. */
+ mcp_macRxOnIdleChannel = 0x0109,
+ mcp_macRxOnIdleChannelEnable = 0x010a,
/* SUN PHY PIB Attributes. */
- mcp_phyFSKFEC = 0x0200,
- mcp_phyFSKFECInterleavingRSC = 0x0201,
- mcp_phyFSKFECScheme = 0x0202,
- mcp_phySunChannelsSupported = 0x0203,
- mcp_phyMaxSunChannelSupported = 0x0204,
- mcp_phyNumSunPageEntriesSupported = 0x0205,
- mcp_phySunPageEntriesSupported = 0x0206,
- mcp_phyCurrentSunPageEntry = 0x0207, /* struct mcp_sunpage entry */
- mcp_phySunNumGenericPHYDescriptors = 0x0208,
- mcp_phySunGenericPHYDescriptors = 0x0209,
- mcp_phyNumModeSwitchParameterEntries = 0x020a,
- mcp_phyModeSwitchParameterEntries = 0x020b,
- mcp_phyFSKPreambleLength = 0x020c,
- mcp_phyMRFSKSFD = 0x020d,
- mcp_phyFSKScramblePSDU = 0x020e, /* Data whitening enable/disable */
- mcp_phyOFDMInterleaving = 0x020f,
- mcp_phyOFDMScrambleSeed = 0x0210, /* Absent in 802.15.4g spec, but still needed. */
- mcp_phyPHRDuration = 0x0211,
+ mcp_phyFSKFEC = 0x0200,
+ mcp_phyFSKFECInterleavingRSC = 0x0201,
+ mcp_phyFSKFECScheme = 0x0202,
+ mcp_phySunChannelsSupported = 0x0203,
+ mcp_phyMaxSunChannelSupported = 0x0204,
+ mcp_phyNumSunPageEntriesSupported = 0x0205,
+ mcp_phySunPageEntriesSupported = 0x0206,
+ mcp_phyCurrentSunPageEntry = 0x0207, /* struct mcp_sunpage entry */
+ mcp_phySunNumGenericPHYDescriptors = 0x0208,
+ mcp_phySunGenericPHYDescriptors = 0x0209,
+ mcp_phyNumModeSwitchParameterEntries = 0x020a,
+ mcp_phyModeSwitchParameterEntries = 0x020b,
+ mcp_phyFSKPreambleLength = 0x020c,
+ mcp_phyMRFSKSFD = 0x020d,
+ mcp_phyFSKScramblePSDU = 0x020e, /* Data whitening enable/disable */
+ mcp_phyOFDMInterleaving = 0x020f,
+ mcp_phyOFDMScrambleSeed = 0x0210, /* Absent in 802.15.4g spec, but still needed. */
+ mcp_phyPHRDuration = 0x0211,
+ mcp_phyChannelPlan = 0x0212,
+
+ /* WiSUN PHY PIB Attributes */
+ mcp_phyWisunRegion = 0x0220,
+ mcp_phyWisunOperatingMode = 0x0221,
/* Exegin PHY Add-ons. */
- mcp_phyFSKDW = 0x0280, /* Deprecated */
- mcp_phyFreqBandSupported = 0x0281, /* uint16_t "enum mcp_freq_band" */
- mcp_phyTxPowerReg = 0x0282, /* uint32_t - For TX power profiling, write to the radio's register directly. */
+ mcp_phyFSKDW = 0x0280, /* Deprecated */
+ mcp_phyFreqBandSupported = 0x0281, /* uint16_t "enum mcp_freq_band" */
+ mcp_phyTxPowerReg = 0x0282, /* uint32_t - For TX power profiling, write to the radio's register directly. */
/* SUN MAC PIB Attributes. */
- mcp_macEnhancedBeaconOrder = 0x0300,
- mcp_macMPMIE = 0x0301,
- mcp_macNBPANEnhancedBeaconOrder = 0x0302,
- mcp_macOffsetTimeSlot = 0x0303,
- mcp_macFCSType = 0x0304,
+ mcp_macEnhancedBeaconOrder = 0x0300,
+ mcp_macMPMIE = 0x0301,
+ mcp_macNBPANEnhancedBeaconOrder = 0x0302,
+ mcp_macOffsetTimeSlot = 0x0303,
+ mcp_macFCSType = 0x0304,
/* TSCH MAC PIB Attributes */
- mcp_macTschEnabled = 0x0400,
- mcp_macDisconnectTime = 0x0401,
- mcp_macJoinMetric = 0x0402,
- mcp_macASN = 0x0403,
- mcp_macSlotframeTable = 0x0404,
- mcp_macSlotframeEntries = 0x0405,
- mcp_macLinkTable = 0x0406,
- mcp_macLinkEntries = 0x0407,
+ mcp_macTschEnabled = 0x0400,
+ mcp_macDisconnectTime = 0x0401,
+ mcp_macJoinMetric = 0x0402,
+ mcp_macASN = 0x0403,
+ mcp_macSlotframeTable = 0x0404,
+ mcp_macSlotframeEntries = 0x0405,
+ mcp_macLinkTable = 0x0406,
+ mcp_macLinkEntries = 0x0407,
/* WiSUN MAC PIB Attributes */
- mcp_macWisunEnabled = 0x0440,
- mcp_macWisunPanVersion = 0x0441,
- mcp_macWisunPanSize = 0x0442,
- mcp_macWisunRoutingCost = 0x0443,
+ mcp_macWisunEnabled = 0x0440,
+ mcp_macWisunPanVersion = 0x0441,
+ mcp_macWisunPanSize = 0x0442,
+ mcp_macWisunRoutingCost = 0x0443,
+ mcp_macWisunUseParentBSIE = 0x0444,
+ mcp_macWisunParentAddress = 0x0445,
+ mcp_macWisunGTKHash = 0x0446,
+ mcp_macWisunParentBlacklist = 0x0447,
+ mcp_macWisunPasImin = 0x0448, /* PAN Advertise Solicit trickle timer minimum interval, in seconds */
+ mcp_macWisunPasImax = 0x0449, /* PAN Advertise Solicit trickle timer maximum interval size, in #doublings */
+ mcp_macWisunPasK = 0x044a, /* PAN Advertise Solicit trickle timer redundancy constant */
+ mcp_macWisunPaImin = 0x044b, /* PAN Advertise trickle timer minimum interval, in seconds */
+ mcp_macWisunPaImax = 0x044c, /* PAN Advertise trickle timer maximum interval size, in # doublings */
+ mcp_macWisunPaK = 0x044d, /* PAN Advertise trickle timer redundancy constant */
+ mcp_macWisunPcsImin = 0x044e, /* PAN Configuration Solicit trickle timer minimum interval, in seconds */
+ mcp_macWisunPcsImax = 0x044f, /* PAN Configuration Solicit trickle timer maximum interval size, in # doublings */
+ mcp_macWisunPcsK = 0x0450, /* PAN Configuration Solicit trickle timer redundancy constant */
+ mcp_macWisunPcImin = 0x0451, /* PAN Configuration trickle timer minimum interval, in seconds */
+ mcp_macWisunPcImax = 0x0452, /* PAN Configuration trickle timer maximum interval size, in # doublings */
+ mcp_macWisunPcK = 0x0453, /* PAN Configuration trickle timer redundancy constant */
+ mcp_macWisunPcsAttempts = 0x0454, /* PAN Configuration Solicit Attempts */
+ mcp_macWisunExcludedChannelBitmask = 0x0455, /* Excluded Channels as array of 8 64-bit masks */
/* Hopping Sequence PIB Attributes */
- mcp_macHoppingSequenceID = 0x0480,
- mcp_macHoppingChannelPage = 0x0481, /* Called macChannelPage in IEEE 802.15.4-2015, confusing name. */
- mcp_macHoppingChannelList = 0x0482,
- mcp_macHoppingChannelCount = 0x0483,
- mcp_macHoppingSequenceLength = 0x0484,
- mcp_macHoppingSequenceList = 0x0485,
- mcp_macHopDwellTime = 0x0486,
- mcp_macTimeslotTemplateId = 0x0487,
- mcp_macTsCcaOffset = 0x0488,
- mcp_macTsCca = 0x0489,
- mcp_macTsTxOffset = 0x048A,
- mcp_macTsRxOffset = 0x048B,
- mcp_macTsRxAckDelay = 0x048C,
- mcp_macTsTxAckDelay = 0x048D,
- mcp_macTsRxWait = 0x048E,
- mcp_macTsRxTx = 0x048F,
- mcp_macTsMaxAck = 0x0490,
- mcp_macTsMaxTx = 0x0491,
- mcp_macTsTimeslotLength = 0x0492,
- mcp_macTsAckWait = 0x0493,
- mcp_macExtendedBitmap = 0x0494,
- mcp_macNumberOfChannels = 0x0495,
+ mcp_macHoppingSequenceID = 0x0480,
+ mcp_macHoppingChannelPage = 0x0481, /* Called macChannelPage in IEEE 802.15.4-2015, confusing name. */
+ mcp_macHoppingChannelList = 0x0482,
+ mcp_macHoppingChannelCount = 0x0483,
+ mcp_macHoppingSequenceLength = 0x0484,
+ mcp_macHoppingSequenceList = 0x0485,
+ mcp_macHopDwellTime = 0x0486,
+ mcp_macTimeslotTemplateId = 0x0487,
+ mcp_macTsCcaOffset = 0x0488,
+ mcp_macTsCca = 0x0489,
+ mcp_macTsTxOffset = 0x048A,
+ mcp_macTsRxOffset = 0x048B,
+ mcp_macTsRxAckDelay = 0x048C,
+ mcp_macTsTxAckDelay = 0x048D,
+ mcp_macTsRxWait = 0x048E,
+ mcp_macTsRxTx = 0x048F,
+ mcp_macTsMaxAck = 0x0490,
+ mcp_macTsMaxTx = 0x0491,
+ mcp_macTsTimeslotLength = 0x0492,
+ mcp_macTsAckWait = 0x0493,
+ mcp_macExtendedBitmap = 0x0494,
+ mcp_macNumberOfChannels = 0x0495,
+ mcp_macBcastHopDwellTime = 0x0496,
+ mcp_macBcastHopInterval = 0x0497,
+ mcp_macBcastHopId = 0x0498,
/* Zigbee R22 add-ons for GB-868 */
- mcp_macDCCurrentMeas = 0x0500, /* Current Duty Cycle over the last hour (hundredths of %) */
- mcp_macDCCurrentBytes = 0x0501, /* Current Duty Cycle over the last hour (bytes) */
- mcp_macJoinList = 0x0502, /* IEEE Joining List (used if mibJoiningPolicy == IEEELIST_JOIN) */
- mcp_macJoinPolicy = 0x0503, /* IEEE Joining Policy (mibJoiningPolicy) */
- mcp_macLBTTxRetries = 0x0504,
- mcp_macTxPowerMgmtSupported = 0x0505,
- mcp_macDutyCycleSupported = 0x0506,
+ mcp_macDCCurrentMeas = 0x0500, /* Current Duty Cycle over the last hour (hundredths of %) */
+ mcp_macDCCurrentBytes = 0x0501, /* Current Duty Cycle over the last hour (bytes) */
+ mcp_macJoinList = 0x0502, /* IEEE Joining List (used if mibJoiningPolicy == IEEELIST_JOIN) */
+ mcp_reserved_0503 = 0x0503, /* was mcp_macJoinPolicy */
+ mcp_macLBTTxRetries = 0x0504,
+ mcp_macTxPowerMgmtSupported = 0x0505,
+ mcp_macDutyCycleSupported = 0x0506,
/* ZCL 7 Diagnostics Cluster Info */
- mcp_macDiagClusterInfo = 0x0507,
+ mcp_macDiagClusterInfo = 0x0507,
/* Note, large gap of IDs until 0x40a0. */
/* Enhanced Beacon Request command PIB Attributes. */
- mcp_macEbrPermitJoining = 0x40A0,
- mcp_macEbrFilters = 0x40A1,
- mcp_macEbrLinkQuality = 0x40A2,
- mcp_macEbrPercentFilter = 0x40A3,
- mcp_macEbrAttributeList = 0x40A4,
- mcp_macBeaconAutoRespond = 0x40A5
+ mcp_macEbrPermitJoining = 0x40A0,
+ mcp_macEbrFilters = 0x40A1,
+ mcp_macEbrLinkQuality = 0x40A2,
+ mcp_macEbrPercentFilter = 0x40A3,
+ mcp_macEbrAttributeList = 0x40A4,
+ mcp_macBeaconAutoRespond = 0x40A5
};
/* Frequency Bands */
enum mcp_freq_band {
- mcp_169MHz_band = 0, /* Europe */
- mcp_450MHz_band = 1, /* US FCC Part 22/90 */
- mcp_470MHz_band = 2, /* China */
- mcp_780MHz_band = 3, /* China */
- mcp_863MHz_band = 4, /* Europe */
- mcp_896MHz_band = 5, /* US FCC Part 90 */
- mcp_901MHz_band = 6, /* US FCC Part 24 */
- mcp_915MHz_band = 7, /* US */
- mcp_917MHz_band = 8, /* Korea */
- mcp_920MHz_band = 9, /* Japan */
- mcp_928MHz_band = 10, /* US, non-contiguous */
- mcp_950MHz_band = 11, /* Was in IEEE 802.15.4g; removed in 802.15.4-2015. Overlaps the 928MHz band. */
- mcp_1427MHz_band = 12, /* US and Canada, non-contiguous */
- mcp_2450MHz_band = 13, /* US and Canada */
+ mcp_169MHz_band = 0, /* Europe */
+ mcp_450MHz_band = 1, /* US FCC Part 22/90 */
+ mcp_470MHz_band = 2, /* China */
+ mcp_780MHz_band = 3, /* China */
+ mcp_863MHz_band = 4, /* Europe */
+ mcp_896MHz_band = 5, /* US FCC Part 90 */
+ mcp_901MHz_band = 6, /* US FCC Part 24 */
+ mcp_915MHz_band = 7, /* US */
+ mcp_917MHz_band = 8, /* Korea */
+ mcp_920MHz_band = 9, /* Japan */
+ mcp_928MHz_band = 10, /* US, non-contiguous */
+ mcp_950MHz_band = 11, /* Was in IEEE 802.15.4g; removed in 802.15.4-2015. Overlaps the 928MHz band. */
+ mcp_1427MHz_band = 12, /* US and Canada, non-contiguous */
+ mcp_2450MHz_band = 13, /* US and Canada */
/* Band added by IEEE 802.15.4u-2016 */
- mcp_866MHz_band = 14, /* India 865-867 */
+ mcp_866MHz_band = 14, /* India 865-867 */
/* Bands added by IEEE 802.15.4v-2017 */
- mcp_870MHz_band = 15, /* Europe 870-876*/
+ mcp_870MHz_band = 15, /* Europe 870-876*/
/* 16 to 23 are 915MHz sub-bands using 902-928MHz channel numbering */
- mcp_915MHz_a_band = 16, /* North America and Mexico 902-928 (alternate) */
- mcp_915MHz_b_band = 17, /* Brazil. Non-contiguous 902-907.5 & 915-928 MHz */
- mcp_915MHz_c_band = 18, /* Australia and New Zealand 915-928 */
- mcp_915MHz_d_band = 19, /* Europe 915-921*/
- mcp_915MHz_e_band = 20, /* Philippines 915-918 */
- mcp_919MHz_band = 21, /* Malaysia 919-923 */
- mcp_920MHz_a_band = 22, /* China 920.5-924.5 */
- mcp_920MHz_b_band = 23, /* HK, Singapore, Thailand, and Vietnam 920-925 */
+ mcp_915MHz_a_band = 16, /* North America and Mexico 902-928 (alternate) */
+ mcp_915MHz_b_band = 17, /* Brazil. Non-contiguous 902-907.5 & 915-928 MHz */
+ mcp_915MHz_c_band = 18, /* Australia and New Zealand 915-928 */
+ mcp_915MHz_d_band = 19, /* Europe 915-921*/
+ mcp_915MHz_e_band = 20, /* Philippines 915-918 */
+ mcp_919MHz_band = 21, /* Malaysia 919-923 */
+ mcp_920MHz_a_band = 22, /* China 920.5-924.5 */
+ mcp_920MHz_b_band = 23, /* HK, Singapore, Thailand, and Vietnam 920-925 */
/* 863MHz sub-band using 863-870MHz channel numbering */
- mcp_867MHz_band = 24, /* 866-869 */
+ mcp_867MHz_band = 24, /* 866-869 */
/* Bands listed in IEEE 802-15.4-2015+revisions Table 10-1 Frequency band designations,
* but not assigned a bit in Table 7-19 Frequency band identifier values */
- mcp_433MHz_band = 32,
- mcp_868MHz_band = 32 + 1,
- mcp_2380MHz_band = 32 + 2,
+ mcp_433MHz_band = 32,
+ mcp_868MHz_band = 32+1,
+ mcp_2380MHz_band = 32+2,
};
/* Defined Channel Pages */
enum {
- mcp_PAGE_DEFAULT = 0, /* Default Channel Page (i.e. legacy 802.15.4 mode) */
- mcp_PAGE_ASK = 1, /* 868/915MHz ASK. */
- mcp_PAGE_OQPSK = 2, /* 868/915MHz O-QPSK. */
- mcp_PAGE_SUN = 9, /* SUN PHYs */
+ mcp_PAGE_DEFAULT = 0, /* Default Channel Page (i.e. legacy 802.15.4 mode) */
+ mcp_PAGE_ASK = 1, /* 868/915MHz ASK. */
+ mcp_PAGE_OQPSK = 2, /* 868/915MHz O-QPSK. */
+ mcp_PAGE_CSS = 3, /* CSS */
+ mcp_PAGE_HRP_UWB = 4, /* HRP UWB */
+ mcp_PAGE_780_MHZ = 5, /* 780 MHz Band (not SUN, RCC or LECIM) previously MPSK */
+ mcp_PAGE_GFSK = 6, /* 920.8-928 MHz */
+ mcp_PAGE_MSK = 7, /* 433MHz/2450MHz MSK */
+ mcp_PAGE_LRP_UWB = 8, /* LRP UWB */
+ mcp_PAGE_SUN = 9, /* SUN PHYs */
+ mcp_PAGE_SUN_FSK = 10, /* SUN FSK Generic PHY */
+ mcp_PAGE_2380_MHZ = 11, /* 2380 MHz band */
+ mcp_PAGE_LECIM = 12, /* LECIM PHY */
+ mcp_PAGE_RCC = 13, /* RCC PHY */
};
/* SUN PHY Types */
enum {
- mcp_FFSK_A = 0, /* Filtered FSK-A */
- mcp_FFSK_B = 1, /* Filtered FSK-B */
- mcp_OQPSK_A = 2, /* O-QPSK-A */
- mcp_OQPSK_B = 3, /* O-QPSK-B */
- mcp_OQPSK_C = 4, /* O-QPSK-C */
- mcp_OFDM_OPT1 = 5, /* OFDM Option 1 */
- mcp_OFDM_OPT2 = 6, /* OFDM Option 2 */
- mcp_OFDM_OPT3 = 7, /* OFDM Option 3 */
- mcp_OFDM_OPT4 = 8, /* OFDM Option 4 */
+ mcp_FFSK_A = 0, /* Filtered FSK-A */
+ mcp_FFSK_B = 1, /* Filtered FSK-B */
+ mcp_OQPSK_A = 2, /* O-QPSK-A */
+ mcp_OQPSK_B = 3, /* O-QPSK-B */
+ mcp_OQPSK_C = 4, /* O-QPSK-C */
+ mcp_OFDM_OPT1 = 5, /* OFDM Option 1 */
+ mcp_OFDM_OPT2 = 6, /* OFDM Option 2 */
+ mcp_OFDM_OPT3 = 7, /* OFDM Option 3 */
+ mcp_OFDM_OPT4 = 8, /* OFDM Option 4 */
/* Legacy (802.15.4-2011) PHY types mapped to . */
- mcp_OQPSK_L = 256, /* Legacy O-QPSK */
- mcp_BPSK_L = 257, /* Legacy BPSK */
+ mcp_OQPSK_L = 256, /* Legacy O-QPSK */
+ mcp_BPSK_L = 257, /* Legacy BPSK */
};
/* FCS Type (mcp_macFCSType). */
enum {
- mcp_FCS_TYPE_LONG = 0, /* 4 byte FCS is automatically generated by the PHY. */
- mcp_FCS_TYPE_SHORT = 1, /* 2 byte FCS is automatically generated by the PHY. */
- mcp_FCS_TYPE_LONG_RAW = 0x80, /* 4 byte FCS is not generated by the PHY, but the PHR is modified appropriately. */
- mcp_FCS_TYPE_SHORT_RAW = 0x81, /* 2 byte FCS is not generated by the PHY, but the PHR is modified appropriately. */
+ mcp_FCS_TYPE_LONG = 0, /* 4 byte FCS is automatically generated by the PHY. */
+ mcp_FCS_TYPE_SHORT = 1, /* 2 byte FCS is automatically generated by the PHY. */
+ mcp_FCS_TYPE_LONG_RAW = 0x80, /* 4 byte FCS is not generated by the PHY, but the PHR is modified appropriately. */
+ mcp_FCS_TYPE_SHORT_RAW = 0x81, /* 2 byte FCS is not generated by the PHY, but the PHR is modified appropriately. */
};
/* TSCH specific definitions. */
@@ -347,12 +389,12 @@ enum {
mcp_IEEE802154_PIE_ESDU = 0x0,
mcp_IEEE802154_PIE_MLME = 0x1,
mcp_IEEE802154_PIE_VENDOR_SPECIFIC = 0x2,
- mcp_IEEE802154_PIE_MPX = 0x3, /* IEEE 802.15.9 Support */
+ mcp_IEEE802154_PIE_MPX = 0x3, /* IEEE 802.15.9 Support */
mcp_IEEE802154_PIE_WISUN = 0x4, /* Wi-SUN Payload embedded IEs */
mcp_IEEE802154_PIE_RESERVED_MIN = 0x5,
mcp_IEEE802154_PIE_RESERVED_MAX = 0xe,
mcp_IEEE802154_PIE_TERM = 0xf,
-};
+ };
/* Nested TSCH MLME IE types. */
enum {
@@ -422,6 +464,28 @@ enum {
mcp_WS_DOMAIN_VIETNAM = 0x0f,
};
+/* Wi-SUN PHY Operating Modes */
+enum {
+ mcp_WS_OPMODE_1A = 0x00,
+ mcp_WS_OPMODE_1B = 0x01,
+ mcp_WS_OPMODE_2A = 0x02,
+ mcp_WS_OPMODE_2B = 0x03,
+ mcp_WS_OPMODE_3 = 0x04,
+ mcp_WS_OPMODE_4A = 0x05,
+ mcp_WS_OPMODE_4B = 0x06,
+ mcp_WS_OPMODE_5 = 0x07,
+};
+
+/* MLME-ASSOCIATE.request capabilities */
+#define MCP_ASSOC_CAP_ALT_COORD 0x01U /* Deprecated by IEEE 802.15.4-2015 */
+#define MCP_ASSOC_CAP_DEV_TYPE 0x02U /* 0 = RFD, 1 = FFD */
+#define MCP_ASSOC_CAP_PWR_SRC 0x04U /* 0 = battery, 1 = mains */
+#define MCP_ASSOC_CAP_RXONIDLE 0x08U
+#define MCP_ASSOC_CAP_ASSOC_TYPE 0x10U /* 0 = normal, 1 = fast association */
+/* Reserved bit: 0x20 */
+#define MCP_ASSOC_CAP_SECURITY 0x40U
+#define MCP_ASSOC_CAP_ALLOC_ADDR 0x80U /* 1 = coordinator (i.e. parent) allocates short address, 0 = otherwise */
+
/* Macro to compute the usage bit for security keys and levels. */
#define MCP_KEY_USAGE(_type_, _cmd_) (1ULL << (((_type_) == mcp_802154_FRAME_TYPE_CMD) ? ((_cmd_) + mcp_802154_FRAME_TYPE_CMD) : (_type_)))
#define MCP_KEY_USAGE_ALL ((1ULL << (mcp_802154_FRAME_TYPE_CMD + mcp_802154_CMD_TYPE_VENDOR + 1)) - 1)
@@ -429,9 +493,9 @@ enum {
/* Vendor-specific IE has different ID for HIE, PIE, MIE types. */
#define MCP_TLV_IE_IS_VENDOR(type, id) \
((((type) == MCP_TLV_HIE) && ((id) == mcp_IEEE802154_HIE_VENDOR_SPECIFIC)) \
- || (((type) == MCP_TLV_PIE) && ((id) == mcp_IEEE802154_PIE_VENDOR_SPECIFIC)) \
- || (((type) == MCP_TLV_MIE) && ((id) == mcp_IEEE802154_MIE_VENDOR_SPECIFIC)))
+ || (((type) == MCP_TLV_PIE) && ((id) == mcp_IEEE802154_PIE_VENDOR_SPECIFIC)) \
+ || (((type) == MCP_TLV_MIE) && ((id) == mcp_IEEE802154_MIE_VENDOR_SPECIFIC)))
/*lint -restore */
-#endif /* MCP_ENUMS_H */
+#endif /* MCP_ENUMS_H_ */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.drlc.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.drlc.h
new file mode 100644
index 000000000..326246dfa
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.drlc.h
@@ -0,0 +1,227 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL DRLC cluster.
+ *--------------------------------------------------------------------------
+ */
+#ifndef ZCL_DRLC_H
+# define ZCL_DRLC_H
+
+/*---------------------------------------------------------------
+ * Dependencies
+ *---------------------------------------------------------------
+ */
+#include "zcl/zcl.h"
+
+/*---------------------------------------------------------------
+ * Definitions
+ *---------------------------------------------------------------
+ */
+
+/* DRLC Server Commands */
+enum {
+ ZCL_DRLC_COMMAND_EVENT = 0x00,
+ ZCL_DRLC_COMMAND_CANCEL_EVENT = 0x01,
+ ZCL_DRLC_COMMAND_CANCEL_ALL = 0x02
+};
+
+/* DRLC Client Commands */
+enum {
+ ZCL_DRLC_COMMAND_REPORT_EVENT_STATUS = 0x00,
+ ZCL_DRLC_COMMAND_GET_SCHEDULED_EVENTS = 0x01
+};
+
+#define ZCL_DRLC_ISSUER_ID_INVALID 0xffffffffU
+
+/* DRLC Server attribute identifiers */
+/* none */
+
+/* DRLC Client attribute identifiers */
+enum {
+ ZCL_DRLC_CLI_ATTR_UTILITY_ENROL_GRP = 0x0000,
+ ZCL_DRLC_CLI_ATTR_START_RAND_MINS = 0x0001,
+ ZCL_DRLC_CLI_ATTR_STOP_RAND_MINS = 0x0002,
+ ZCL_DRLC_CLI_ATTR_DEVICE_CLASS = 0x0003
+};
+
+/* DRLC Device Class bitmaps */
+#define ZCL_DRLC_DEVICE_HVAC 0x0001U
+#define ZCL_DRLC_DEVICE_BASEBOARD_HEATER 0x0002U
+#define ZCL_DRLC_DEVICE_WATER_HEATER 0x0004U
+#define ZCL_DRLC_DEVICE_POOL_PUMP 0x0008U
+#define ZCL_DRLC_DEVICE_APPLIANCE 0x0010U
+#define ZCL_DRLC_DEVICE_IRRIGATION_PUMP 0x0020U
+#define ZCL_DRLC_DEVICE_COMMERCIAL_LOAD 0x0040U
+#define ZCL_DRLC_DEVICE_RESIDENTIAL_LOAD 0x0080U
+#define ZCL_DRLC_DEVICE_EXTERIOR_LIGHTING 0x0100U
+#define ZCL_DRLC_DEVICE_INTERIOR_LIGHTING 0x0200U
+#define ZCL_DRLC_DEVICE_ELECTRIC_VEHICLE 0x0400U
+#define ZCL_DRLC_DEVICE_GENERATOR 0x0800U
+
+/* DRLC Criticality Levels */
+enum ZbZclDrlcCriticalityLevelT {
+ ZCL_DRLC_CRITICALITY_GREEN = 1,
+ ZCL_DRLC_CRITICALITY_1 = 2,
+ ZCL_DRLC_CRITICALITY_2 = 3,
+ ZCL_DRLC_CRITICALITY_3 = 4,
+ ZCL_DRLC_CRITICALITY_4 = 5,
+ ZCL_DRLC_CRITICALITY_5 = 6,
+ ZCL_DRLC_CRITICALITY_EMERGENCY = 7,
+ ZCL_DRLC_CRITICALITY_PLANNED_OUTAGE = 8,
+ ZCL_DRLC_CRITICALITY_DISCONNECT = 9,
+ ZCL_DRLC_CRITICALITY_UTILITY_MIN = 0x0A,
+ ZCL_DRLC_CRITICALITY_UTILITY_MAX = 0x0F
+};
+
+/* Event Control Flags */
+#define ZCL_DRLC_EVENT_CTRL_RAND_START 0x01U
+#define ZCL_DRLC_EVENT_CTRL_RAND_END 0x02U
+
+/* Cancel Event Flags */
+#define ZCL_DRLC_CANCEL_CONTROL_GRACEFUL 0x01U
+
+/* Event Status Values */
+enum {
+ ZCL_DRLC_STATUS_EVENT_RECEIVED = 0x01,
+ ZCL_DRLC_STATUS_EVENT_STARTED = 0x02,
+ ZCL_DRLC_STATUS_EVENT_COMPLETED = 0x03,
+ ZCL_DRLC_STATUS_USER_OPT_OUT = 0x04,
+ ZCL_DRLC_STATUS_USER_OPT_IN = 0x05,
+ ZCL_DRLC_STATUS_EVENT_CANCELLED = 0x06,
+ ZCL_DRLC_STATUS_EVENT_SUPERSEDED = 0x07,
+ ZCL_DRLC_STATUS_EVENT_PARTOPTOUT = 0x08,
+ ZCL_DRLC_STATUS_EVENT_PARTOPTIN = 0x09,
+ ZCL_DRLC_STATUS_EVENT_COMPLETE_OPT_OUT = 0x0a,
+ ZCL_DRLC_STATUS_RJCTD_CANCEL_COMMAND = 0xf8,
+ ZCL_DRLC_STATUS_RJCTD_CANCEL_TIME = 0xf9,
+ ZCL_DRLC_STATUS_RJCTD_AFTER_EXPIRE = 0xfb,
+ ZCL_DRLC_STATUS_RJCTD_CANCEL_UNDEFINED = 0xfd,
+ ZCL_DRLC_STATUS_RJCTD = 0xfe
+};
+
+enum ZbZclDrlcSignatureT {
+ ZCL_DRLC_SIGNATURE_TYPE_NONE = 0x00,
+ ZCL_DRLC_SIGNATURE_TYPE_ECDSA = 0x01
+};
+
+/* Event status signature size. */
+#define ZCL_DRLC_SIGNATURE_LENGTH 42U
+
+/*---------------------------------------------------------------
+ * Structures
+ *---------------------------------------------------------------
+ */
+/* Structure describing a load control event. */
+struct ZbZclDrlcEventT {
+ uint32_t eventId;
+ uint16_t deviceClass;
+ uint8_t enrolmentGroup;
+ uint32_t startTime; /* UTC, or 0 = now */
+ uint16_t duration; /* minutes */
+ enum ZbZclDrlcCriticalityLevelT criticality;
+ uint8_t coolingOffset;
+ uint8_t heatingOffset;
+ uint16_t coolingSetPoint;
+ uint16_t heatingSetPoint;
+ int8_t loadAdjustment;
+ uint8_t dutyCycle;
+ uint8_t ctrl; /* e.g. ZCL_DRLC_EVENT_CTRL_RAND_START */
+};
+
+/* Structure describing a cancel event command. */
+struct ZbZclDrlcCancelT {
+ uint32_t eventId;
+ uint16_t deviceClass;
+ uint8_t enrolmentGroup;
+ uint8_t ctrl; /* e.g. ZCL_DRLC_CANCEL_CONTROL_GRACEFUL */
+#if 0 /* effectiveTime is now deprecated - must be zero */
+ uint32_t effectiveTime;
+#endif
+};
+
+/* Structure describing an event status. */
+struct ZbZclDrlcStatusT {
+ uint32_t eventId;
+ uint8_t status;
+ uint32_t statusTime;
+ uint8_t appliedCriticality;
+ uint16_t appliedCooling;
+ uint16_t appliedHeating;
+ int8_t loadAdjustment;
+ uint8_t appliedDutyCycle;
+ uint8_t eventControl;
+ enum ZbZclDrlcSignatureT signatureType;
+ /* */
+ uint8_t signature[ZCL_DRLC_SIGNATURE_LENGTH];
+};
+
+struct ZbZclDrlcGetEventsReqT {
+ uint32_t startTime;
+ uint8_t maxEvents;
+ uint32_t issuerId;
+};
+
+/*---------------------------------------------------------------
+ * DRLC Server Functions
+ *---------------------------------------------------------------
+ */
+struct ZbZclDrlcServerCallbacksT {
+ void (*report_status)(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo,
+ struct ZbZclDrlcStatusT *status, void *arg);
+
+ /* The get_events callback handler in the application should return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE
+ * if successful and the application will call ZbZclDrlcServerCommandEventNotify in response.
+ * Or, the callback should return ZCL_STATUS_NOT_FOUND if no events found and no response sent,
+ * which causes a Default Response to be sent with the error status code. */
+ enum ZclStatusCodeT (*get_events)(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo,
+ struct ZbZclDrlcGetEventsReqT *req, void *arg);
+};
+
+struct ZbZclClusterT * ZbZclDrlcServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclDrlcServerCallbacksT *callbacks, void *arg);
+
+/* Server Commands */
+enum ZclStatusCodeT ZbZclDrlcServerCommandEventReq(struct ZbZclClusterT *clusterPtr, struct ZbZclDrlcEventT *eventPtr,
+ const struct ZbApsAddrT *dst, void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+/* ZbZclDrlcServerCommandEventNotify is similar to ZbZclDrlcServerCommandEventReq, but it
+ * sends the ZCL_DRLC_COMMAND_EVENT command as a response to a ZCL_DRLC_COMMAND_GET_SCHEDULED_EVENTS. */
+enum ZclStatusCodeT ZbZclDrlcServerCommandEventNotify(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclDrlcEventT *eventPtr, struct ZbZclAddrInfoT *dstInfo);
+
+enum ZclStatusCodeT ZbZclDrlcServerCommandCancelReq(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclDrlcCancelT *cancelInfoPtr, const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+/* ctrl ; e.g. ZCL_DRLC_CANCEL_CONTROL_GRACEFUL */
+enum ZclStatusCodeT ZbZclDrlcServerCommandCancelAllReq(struct ZbZclClusterT *clusterPtr, uint8_t ctrl,
+ const struct ZbApsAddrT *dst, void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * DRLC Client Functions
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDrlcClientCallbacksT {
+ /* Should return true if started successfully, or false otherwise. */
+ bool (*start)(void *arg, struct ZbZclDrlcEventT *event);
+ void (*stop)(void *arg, struct ZbZclDrlcEventT *event);
+};
+
+struct ZbZclClusterT * ZbZclDrlcClientAlloc(struct ZigBeeT *zb, uint8_t endpoint, struct ZbZclClusterT *time_server,
+ struct ZbZclDrlcClientCallbacksT *callbacks, void *cb_arg);
+
+unsigned int ZbZclDrlcClientGetEventList(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclDrlcEventT *eventList, unsigned int maxEntries);
+
+/* Client Commands */
+enum ZclStatusCodeT ZbZclDrlcClientCommandReportStatusReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclDrlcStatusT *statusPtr,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclDrlcClientCommandGetEventsReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclDrlcGetEventsReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+#endif /* __ZCL_DRLC_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.keepalive.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.keepalive.h
new file mode 100644
index 000000000..c475cf73e
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.keepalive.h
@@ -0,0 +1,40 @@
+/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Keep Alive cluster.
+ *--------------------------------------------------------------------------
+ */
+#ifndef ZCL_KEEPALIVE_H
+# define ZCL_KEEPALIVE_H
+
+#include "zcl/zcl.h"
+
+/* Attributes */
+enum {
+ ZCL_KEEPALIVE_ATTR_BASE = 0x0000, /* minutes (valid range is from 0x01 to 0xff, but not enforced by cluster, for testing) */
+ ZCL_KEEPALIVE_ATTR_JITTER = 0x0001 /* seconds (valid range is from 0x0000 to 0x0200) */
+};
+
+#define ZCL_KEEPALIVE_BASE_MIN 0x01U
+#define ZCL_KEEPALIVE_BASE_MAX 0xffU
+#define ZCL_KEEPALIVE_BASE_DEFAULT 10U /* minutes */
+
+#define ZCL_KEEPALIVE_JITTER_MIN 0x0000U
+#define ZCL_KEEPALIVE_JITTER_MAX 0x0200U
+#define ZCL_KEEPALIVE_JITTER_DEFAULT 300U /* seconds */
+
+/* Server */
+struct ZbZclClusterT * ZbZclKeepAliveServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+/* Client */
+/* Allocate the Keepalive Client cluster.
+ * The tcso_callback is called when the TCSO is ever started (ZB_TCSO_STATUS_DISCOVERY_UNDERWAY),
+ * and when it completes, with the resultant status. */
+struct ZbZclClusterT * ZbZclKeepAliveClientAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ void (*tcso_callback)(enum ZbTcsoStatusT status, void *arg), void *tcso_arg);
+
+void ZbZclKeepAliveClientStart(struct ZbZclClusterT *clusterPtr);
+void ZbZclKeepAliveClientStop(struct ZbZclClusterT *clusterPtr);
+
+#endif /* __ZCL_KEEPALIVE_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.attr.gbcs.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.attr.gbcs.h
new file mode 100644
index 000000000..ca0a982e3
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.attr.gbcs.h
@@ -0,0 +1,577 @@
+/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#include "zcl/se/zcl.meter.h"
+
+#ifdef ZCL_METER_ATTR_GBCS_CALLBACK
+/* Optional attribute flags. If providing an attribute callback (), then need to specify the appropriate flag(s):
+ * ZCL_ATTR_FLAG_CB_READ
+ * ZCL_ATTR_FLAG_CB_WRITE
+ * ZCL_ATTR_FLAG_CB_NOTIFY
+ */
+# ifndef ZCL_METER_ATTR_GBCS_FLAGS
+# error "Must define ZCL_METER_ATTR_GBCS_FLAGS if defining ZCL_METER_ATTR_GBCS_CALLBACK"
+# endif
+#else
+# define ZCL_METER_ATTR_GBCS_CALLBACK NULL
+# define ZCL_METER_ATTR_GBCS_FLAGS ZCL_ATTR_FLAG_NONE
+#endif
+
+/* Uncrustify is adding too many new-lines. For some reason, it doesn't
+ * do this in a .c file. */
+/* *INDENT-OFF* */
+
+/* Use this as-is to append the GBCS Metering Attributes to the
+ * Metering Server. Or use this as a template to create the
+ * attribute's as your application requires. */
+
+const struct ZbZclAttrT zcl_meter_server_gbcs_attr_list[] = {
+ /* CurrentNoTierBlock1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(0, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(0, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(0, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(0, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier1Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(1, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(1, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(1, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(1, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier2Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(2, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(2, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(2, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(2, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier3Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(3, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(3, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(3, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(3, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier4Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(4, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(4, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(4, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(4, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier5Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(5, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(5, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(5, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(5, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier6Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(6, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(6, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(6, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(6, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier7Block1-4SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(7, 1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(7, 2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(7, 3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(7, 4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* Misc */
+ {
+ ZCL_METER_SVR_ATTR_MULTIPLIER, ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_DIVISOR, ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_DEVICE_TYPE, ZCL_DATATYPE_ENUMERATION_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_SITE_ID, ZCL_DATATYPE_STRING_OCTET, ZCL_METER_ATTR_GBCS_FLAGS, 32,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_SUMMATION_FORMAT, ZCL_DATATYPE_BITMAP_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ /* DemandFormatting is not listed, but providing since
+ * InstantaneousDemand is included. */
+ {
+ ZCL_METER_SVR_ATTR_DEMAND_FORMAT, ZCL_DATATYPE_BITMAP_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ /* HistoricalConsumptionFormatting is not listed, but providing since
+ * various consumption attributes are included. */
+ {
+ ZCL_METER_SVR_ATTR_HISTORICAL_CONSUMPTION_FORMAT, ZCL_DATATYPE_BITMAP_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_UNIT_OF_MEASURE, ZCL_DATATYPE_ENUMERATION_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_CUSTOMER_ID_NUMBER, ZCL_DATATYPE_STRING_OCTET, ZCL_METER_ATTR_GBCS_FLAGS, 24,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_INSTANTANEOUS_DEMAND, ZCL_DATATYPE_SIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_BILL_DELIV_TRAILING_DIGIT, ZCL_DATATYPE_BITMAP_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_BTD_DELIV, ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_AMBIENT_CONSUMPTION_INDICATOR, ZCL_DATATYPE_ENUMERATION_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_METER_STATUS, ZCL_DATATYPE_BITMAP_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_CURSUM_DELIV, ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_CURSUM_RECV, ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_SUPPLY_STATUS, ZCL_DATATYPE_ENUMERATION_8BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentDayConsumption */
+ {
+ ZCL_METER_SVR_ATTR_CURDAY_DM_DELIV, ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ /* PreviousDayConsumption */
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_DM_DELIV, ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ /* PreviousDay[2..8]Consumption */
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(2), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(3), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(4), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(5), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(6), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(7), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(8), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentMonthConsumptionDelivered and
+ * PreviousMonthConsumption and
+ * PreviousMonth[2..13]Consumption*/
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(0), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(1), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(2), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(3), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(4), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(5), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(6), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(7), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(8), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(9), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(10), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(11), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(12), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(13), ZCL_DATATYPE_UNSIGNED_32BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentWeekConsumptionDelivered and
+ * PreviousWeekConsumption and
+ * PreviousWeek[2..5]Consumption */
+ {
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(0), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(1), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(2), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(3), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(4), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(5), ZCL_DATATYPE_UNSIGNED_24BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier1-9SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(1), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(2), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(3), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(4), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(5), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(6), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(7), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(8), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(9), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier10-19SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(10), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(11), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(12), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(13), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(14), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(15), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(16), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(17), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(18), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(19), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier20-29SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(20), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(21), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(22), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(23), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(24), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(25), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(26), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(27), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(28), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(29), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier30-39SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(30), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(31), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(32), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(33), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(34), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(35), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(36), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(37), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(38), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(39), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+
+ /* CurrentTier40-48SummationDelivered */
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(40), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(41), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(42), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(43), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(44), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(45), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(46), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(47), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+ {
+ ZCL_METER_SVR_ATTR_TIERN_DELIV(48), ZCL_DATATYPE_UNSIGNED_48BIT, ZCL_METER_ATTR_GBCS_FLAGS, 0,
+ ZCL_METER_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+};
+
+const unsigned int ZCL_METER_SVR_GBCS_ATTR_LIST_LEN = ZCL_ATTR_LIST_LEN(zcl_meter_server_gbcs_attr_list);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.h
new file mode 100644
index 000000000..087b009f5
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.meter.h
@@ -0,0 +1,696 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_METER_H
+# define ZCL_METER_H
+
+#include "zcl/zcl.h"
+
+/* EXEGIN - Fixed most of them. Some stragglers remain. */
+/*lint -save -e621 [ identifier clash within 31 chars - 5.1 REQUIRED ] */
+
+/*---------------------------------------------------------------------------
+ * Metering Attributes
+ *--------------------------------------------------------------------------
+ */
+/*
+ * "Attribute identifiers are encoded such that the most significant octet
+ * specifies the attribute set and the least significant octet specifies
+ * the attribute within the set."
+ * */
+enum {
+ /* Reading Information Set (0x00) */
+ ZCL_METER_SVR_ATTR_CURSUM_DELIV = 0x0000,
+ ZCL_METER_SVR_ATTR_CURSUM_RECV = 0x0001,
+ ZCL_METER_SVR_ATTR_MAX_DMND_DELIV = 0x0002,
+ ZCL_METER_SVR_ATTR_MAX_DMND_RECV = 0x0003,
+ ZCL_METER_SVR_ATTR_DFT_SUM = 0x0004,
+ ZCL_METER_SVR_ATTR_DAILY_FREEZE_TIME = 0x0005,
+ ZCL_METER_SVR_ATTR_POWER_FACTOR = 0x0006,
+ ZCL_METER_SVR_ATTR_READ_SNAPSHOT_TIME = 0x0007,
+ ZCL_METER_SVR_ATTR_MAX_DMND_DELIV_TIME = 0x0008,
+ ZCL_METER_SVR_ATTR_MAX_DMND_RECV_TIME = 0x0009,
+ ZCL_METER_SVR_ATTR_DEFAULT_UPDATE_PERIOD = 0x000A,
+ ZCL_METER_SVR_ATTR_FAST_POLL_UPDATE_PERIOD = 0x000B,
+ ZCL_METER_SVR_ATTR_BLOCK_CONSUMP_DELIV = 0x000C,
+ ZCL_METER_SVR_ATTR_DAILY_CONSUMPTION_TARGET = 0x000D,
+ ZCL_METER_SVR_ATTR_CURBLOCK = 0x000E,
+ ZCL_METER_SVR_ATTR_PROFILE_INTERVAL_PERIOD = 0x000F,
+ ZCL_METER_SVR_ATTR_INTERVAL_REPORTING_PERIOD = 0x0010,
+ ZCL_METER_SVR_ATTR_PRESET_READING_TIME = 0x0011,
+ ZCL_METER_SVR_ATTR_VOLUME_PER_REPORT = 0x0012,
+ ZCL_METER_SVR_ATTR_FLOW_RESTRICTION = 0x0013,
+ ZCL_METER_SVR_ATTR_SUPPLY_STATUS = 0x0014,
+ ZCL_METER_SVR_ATTR_INLET_EC_SUMMATION = 0x0015,
+ ZCL_METER_SVR_ATTR_OUTLET_EC_SUMMATION = 0x0016,
+ ZCL_METER_SVR_ATTR_INLET_TEMPERATURE = 0x0017,
+ ZCL_METER_SVR_ATTR_OUTLET_TEMPERATURE = 0x0018,
+ ZCL_METER_SVR_ATTR_CONTROL_TEMPERATURE = 0x0019,
+ ZCL_METER_SVR_ATTR_INLET_EC_DEMAND = 0x001A,
+ ZCL_METER_SVR_ATTR_OUTLET_EC_DEMAND = 0x001B,
+ ZCL_METER_SVR_ATTR_PREVIOUS_BLOCK_DELIV = 0x001C,
+ ZCL_METER_SVR_ATTR_CURBLOCK_CONSUMPTION_RECIEVED = 0x001D,
+ ZCL_METER_SVR_ATTR_CURBLOCK_RECV = 0x001E,
+ ZCL_METER_SVR_ATTR_DFT_SUM_RECV = 0x001F,
+ ZCL_METER_SVR_ATTR_ACTREGTIER_DELIV = 0x0020, /* ActiveRegisterTierDelivered */
+ ZCL_METER_SVR_ATTR_ACTREGTIER_RECV = 0x0021, /* ActiveRegisterTierReceived */
+ ZCL_METER_SVR_ATTR_LAST_BLOCK_SWITCH_TIME = 0x0022,
+
+ /* TOU Information Set (0x01) */
+ /* For ZCL_METER_SVR_ATTR_TIERN_, see below. (0x0100) */
+
+ /* Meter Status (0x02) */
+ ZCL_METER_SVR_ATTR_METER_STATUS = 0x0200, /* ZCL_METER_STATUS_ */
+ ZCL_METER_SVR_ATTR_RMN_BATT_LIFE = 0x0201,
+ ZCL_METER_SVR_ATTR_HOURS_IN_OPERATION = 0x0202,
+ ZCL_METER_SVR_ATTR_HOURS_IN_FAULT = 0x0203,
+ ZCL_METER_SVR_ATTR_EXTENDED_STATUS = 0x0204,
+ ZCL_METER_SVR_ATTR_RMN_BATT_DAYS = 0x0205,
+ ZCL_METER_SVR_ATTR_CURMETER_ID = 0x0206,
+ ZCL_METER_SVR_ATTR_AMBIENT_CONSUMPTION_INDICATOR = 0x0207,
+
+ /* Formatting (0x03) */
+ ZCL_METER_SVR_ATTR_UNIT_OF_MEASURE = 0x0300,
+ ZCL_METER_SVR_ATTR_MULTIPLIER = 0x0301,
+ ZCL_METER_SVR_ATTR_DIVISOR = 0x0302,
+ ZCL_METER_SVR_ATTR_SUMMATION_FORMAT = 0x0303,
+ ZCL_METER_SVR_ATTR_DEMAND_FORMAT = 0x0304,
+ ZCL_METER_SVR_ATTR_HISTORICAL_CONSUMPTION_FORMAT = 0x0305,
+ ZCL_METER_SVR_ATTR_DEVICE_TYPE = 0x0306,
+ ZCL_METER_SVR_ATTR_SITE_ID = 0x0307,
+ ZCL_METER_SVR_ATTR_SERIAL_NUMBER = 0x0308,
+ ZCL_METER_SVR_ATTR_EC_UNIT_OF_MEASURE = 0x0309,
+ ZCL_METER_SVR_ATTR_EC_SUMMATION_FORMAT = 0x030A,
+ ZCL_METER_SVR_ATTR_EC_DEMAND_FORMAT = 0x030B,
+ ZCL_METER_SVR_ATTR_TEMP_UNIT_OF_MEASURE = 0x030C,
+ ZCL_METER_SVR_ATTR_TEMP_FORMAT = 0x030D,
+ ZCL_METER_SVR_ATTR_MODULE_SERIAL_NUMBER = 0x030E,
+ ZCL_METER_SVR_ATTR_OPERTRFLBL_DELIV = 0x030F, /* OperatingTariffLabelDelivered */
+ ZCL_METER_SVR_ATTR_OPERTRFLBL_RECIEVED = 0x0310, /* OperatingTariffLabelReceived */
+ ZCL_METER_SVR_ATTR_CUSTOMER_ID_NUMBER = 0x0311, /* Octet String (len = 25) */
+ ZCL_METER_SVR_ATTR_ALT_UNIT_OF_MEASURE = 0x0312,
+ ZCL_METER_SVR_ATTR_ALT_DEMAND_FORMATTING = 0x0313,
+ ZCL_METER_SVR_ATTR_ALT_CONSUMPTION_FORMATTING = 0x0314,
+
+ /* Historical Consumption (0x04) */
+ ZCL_METER_SVR_ATTR_INSTANTANEOUS_DEMAND = 0x0400,
+ ZCL_METER_SVR_ATTR_CURDAY_DM_DELIV = 0x0401, /* CurrentDayConsumptionDelivered */
+ ZCL_METER_SVR_ATTR_CURDAY_DM_RECV = 0x0402, /* CurrentDayConsumptionReceived */
+ ZCL_METER_SVR_ATTR_PRVDAY_DM_DELIV = 0x0403, /* PreviousDayConsumptionDelivered */
+ ZCL_METER_SVR_ATTR_PRVDAY_DM_RECV = 0x0404, /* PreviousDayConsumptionReceived */
+ ZCL_METER_SVR_ATTR_CURPRTL_DELIV_START = 0x0405, /* CurrentPartialProfileIntervalStartTimeDelivered (UTC Time) */
+ ZCL_METER_SVR_ATTR_CURPRTL_RECV_START = 0x0406, /* CurrentPartialProfileIntervalStartTimeReceived (UTC Time) */
+ ZCL_METER_SVR_ATTR_CURPRTL_DELIV = 0x0407,
+ ZCL_METER_SVR_ATTR_CURPRTL_RECV = 0x0408,
+ ZCL_METER_SVR_ATTR_CURDAY_MAX_PRESSURE = 0x0409,
+ ZCL_METER_SVR_ATTR_CURDAY_MIN_PRESSURE = 0x040A,
+ ZCL_METER_SVR_ATTR_PRVDAY_MAX_PRESSURE = 0x040B,
+ ZCL_METER_SVR_ATTR_PRVDAY_MIN_PRESSURE = 0x040C,
+ ZCL_METER_SVR_ATTR_CURDAY_MAX_DEMAND = 0x040D,
+ ZCL_METER_SVR_ATTR_PRVDAY_MAX_DEMAND = 0x040E,
+ ZCL_METER_SVR_ATTR_CURMTH_MAX_DEMAND = 0x040F,
+ ZCL_METER_SVR_ATTR_CURYR_MAX_DEMAND = 0x0410,
+ ZCL_METER_SVR_ATTR_CURDAY_EC_MAX_DEMAND = 0x0411,
+ ZCL_METER_SVR_ATTR_PRVDAY_EC_MAX_DEMAND = 0x0412,
+ ZCL_METER_SVR_ATTR_CURMTH_EC_MAX_DEMAND = 0x0413,
+ ZCL_METER_SVR_ATTR_CURMTH_EC_MIN_DEMAND = 0x0414,
+ ZCL_METER_SVR_ATTR_CURYR_EC_MAX_DEMAND = 0x0415,
+ ZCL_METER_SVR_ATTR_CURYR_EC_MIN_DEMAND = 0x0416,
+ /* PreviousDay[2-8]Consumption... (0x0420 to 0x042D) */
+#if 0
+ ZCL_METER_SVR_ATTR_PRVDAY_N_CONSUMP_DELIV
+ ZCL_METER_SVR_ATTR_PRVDAY_N_RECV_CONSUMP
+ /* PreviousWeek[0-5]Consumption... (0x0430 to 0x043B) */
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV
+ ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_RECV
+ /* PreviousMonth[0-13]Consumption... (0x0440 to 0x045B) */
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV
+ ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_RECV
+#endif
+ ZCL_METER_SVR_ATTR_HISTORICAL_FREEZE_TIME = 0x045C,
+
+ /* Load Profile Configuration (0x05) */
+ ZCL_METER_SVR_ATTR_MAX_PERIODS_DELIV = 0x0500,
+
+ /* Supply Limit (0x06) */
+ ZCL_METER_SVR_ATTR_CURDEMAND_DELIV = 0x0600,
+ ZCL_METER_SVR_ATTR_DEMAND_LIMIT = 0x0601,
+ ZCL_METER_SVR_ATTR_DEMAND_INTEGRATION_PERIOD = 0x0602,
+ ZCL_METER_SVR_ATTR_DEMAND_SUBINTERVALS = 0x0603,
+ ZCL_METER_SVR_ATTR_SUPPLY_LIMIT_ARM_DURATION = 0x0604,
+ ZCL_METER_SVR_ATTR_LOAD_LIMIT_SUPPLY_STATE = 0x0605,
+ ZCL_METER_SVR_ATTR_LOAD_LIMIT_COUNTER = 0x0606,
+ ZCL_METER_SVR_ATTR_SUPPLY_TAMPER_STATE = 0x0607,
+ ZCL_METER_SVR_ATTR_SUPPLY_DEPLETION_STATE = 0x0608,
+ ZCL_METER_SVR_ATTR_SUPPLY_UNCONTROLLED_FLOW_STATE = 0x0609,
+
+ /* Block Information (0x07) */
+ /* For ZCL_METER_SVR_ATTR_TIERN_BLOCKN_, see below. */
+
+ /* Alarms (0x08) */
+ ZCL_METER_SVR_ATTR_GENERIC_ALARM_MASK = 0x0800, /* access = read/write */
+ ZCL_METER_SVR_ATTR_ELECTRICITY_ALARM_MASK = 0x0801, /* access = read/write */
+ ZCL_METER_SVR_ATTR_FLOW_PRESSURE_ALARM_MASK = 0x0802, /* access = read/write */
+ ZCL_METER_SVR_ATTR_WATER_ALARM_MASK = 0x0803, /* access = read/write */
+ ZCL_METER_SVR_ATTR_HEAT_COOLING_ALARM_MASK = 0x0804, /* access = read/write */
+ ZCL_METER_SVR_ATTR_GAS_ALARM_MASK = 0x0805, /* access = read/write */
+ ZCL_METER_SVR_ATTR_EXTENDED_GENERIC_ALARM_MASK = 0x0806, /* access = read/write */
+ ZCL_METER_SVR_ATTR_MANUFACTURER_ALARM_MASK = 0x0807, /* access = read/write */
+
+ /* Meter Billing (0x0A) */
+ ZCL_METER_SVR_ATTR_BTD_DELIV = 0x0A00,
+ ZCL_METER_SVR_ATTR_BTD_TIMESTAMP_DELIV = 0x0A01,
+ ZCL_METER_SVR_ATTR_PROJ_BILL_DELIV = 0x0A02,
+ ZCL_METER_SVR_ATTR_PROJ_BILL_TIMESTAMP_DELIV = 0x0A03,
+ ZCL_METER_SVR_ATTR_BILL_DELIV_TRAILING_DIGIT = 0x0A04,
+ ZCL_METER_SVR_ATTR_BTD_RECV = 0x0A10,
+ ZCL_METER_SVR_ATTR_BTD_TIMESTAMP_RECV = 0x0A11,
+ ZCL_METER_SVR_ATTR_PROJ_BILL_RECV = 0x0A12,
+ ZCL_METER_SVR_ATTR_PROJ_BILL_TIMESTAMP_RECV = 0x0A13,
+ ZCL_METER_SVR_ATTR_BILL_RECV_TRAILING_DIGIT = 0x0A14,
+
+ /* Supply Control (0x0B) */
+ ZCL_METER_SVR_ATTR_PROP_CHG_SUPPLY_IMPL_TIME = 0x0B00,
+ ZCL_METER_SVR_ATTR_PROP_CHG_SUPPLY_STATUS = 0x0B01,
+ ZCL_METER_SVR_ATTR_UNCTLFLOW_THRESHOLD = 0x0B10, /* Uncontrolled Flow Threshold */
+ ZCL_METER_SVR_ATTR_UNCTLFLOW_UNIT_OF_MEASURE = 0x0B11, /* Uncontrolled Flow Threshold Unit of Measure */
+ ZCL_METER_SVR_ATTR_UNCTLFLOW_MULTIPLIER = 0x0B12, /* Uncontrolled Flow Multiplier */
+ ZCL_METER_SVR_ATTR_UNCTLFLOW_DIVISOR = 0x0B13, /* Uncontrolled Flow Divisor */
+ ZCL_METER_SVR_ATTR_FLOW_STABILISATION_PERIOD = 0x0B14,
+ ZCL_METER_SVR_ATTR_FLOW_MEASUREMENT_PERIOD = 0x0B15
+
+ /* Alternative Historical Consumption (0x0C) */
+ /* TBD */
+};
+
+/* Simple Metering Time of Use Information Attributes */
+
+/* Tiers start at 1 and go to a max of 48.
+ * They should have started at an index of 0, but oh well. */
+#define ZCL_METER_SVR_ATTR_TIERN_MAX 48U
+#define ZCL_METER_SVR_ATTR_TIERN_DELIV(_x_) (0x0100U + (2U * ((_x_) - 1U)))
+#define ZCL_METER_SVR_ATTR_TIERN_RECV(_x_) (0x0101U + (2U * ((_x_) - 1U)))
+
+/* Simple Metering Block Information Attributes (Delivered) */
+#define ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(_tier_, _blk_) (0x0700U + ((_blk_) - 1U) + (0x10U * (_tier_)))
+#define ZCL_METER_SVR_ATTR_NO_TIER_BLOCKN_DELIV(_blk_) ZCL_METER_SVR_ATTR_TIERN_BLOCKN_DELIV(0U, (_blk_))
+
+/* Simple Metering ESP Historical Attributes */
+#define ZCL_METER_SVR_ATTR_PRVDAY_N_DELIV_CONSUMP(_x_) (0x0420U + (2U * ((_x_) - 2U)))
+#define ZCL_METER_SVR_ATTR_PRVDAY_N_RECV_CONSUMP(_x_) (0x0421U + (2U * ((_x_) - 2U)))
+
+#define ZCL_METER_SVR_ATTR_WEEK_FIRST_CONSUMP_DELIV 0U
+#define ZCL_METER_SVR_ATTR_WEEK_MAX_CONSUMP_DELIV 6U /* less than, i.e. 0..5 */
+#define ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_DELIV(_x_) (0x0430U + (2U * (_x_)))
+#define ZCL_METER_SVR_ATTR_WEEK_N_CONSUMP_RECV(_x_) (0x0431U + (2U * (_x_)))
+#define ZCL_METER_SVR_ATTR_MONTH_FIRST_CONSUMP_DELIV 0U
+#define ZCL_METER_SVR_ATTR_MONTH_MAX_CONSUMP_DELIV 14U /* less than, i.e. 0..13 */
+#define ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_DELIV(_x_) (0x0440U + (2U * (_x_)))
+#define ZCL_METER_SVR_ATTR_MONTH_N_CONSUMP_RECV(_x_) (0x0441U + (2U * (_x_)))
+
+/* Simple Metering Block Information Attributes - Received */
+#define ZCL_METER_SVR_ATTR_TIERN_BLOCKN_RECV(_tier_, _blk_) (0x0900U + ((_blk_) - 1U) + (0x10U * (_tier_)))
+#define ZCL_METER_SVR_ATTR_NO_TIER_BLOCKN_RECV(_blk_) ZCL_METER_SVR_ATTR_TIERN_BLOCKN_RECV(0U, _blk_)
+
+enum ZbZclMeterClientAttrT {
+ /* Notification Set (0x00) */
+ /* Notification Flags (ZCL_METER_CLI_NOTIF_FLG_) */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_1 = 0x0000,
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_2, /* 0x0001 */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_3, /* 0x0002 */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_4, /* 0x0003 */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_5, /* 0x0004 */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_6, /* 0x0005 */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_7, /* 0x0006 */
+ ZCL_METER_CLI_ATTR_NOTIF_FLG_8 /* 0x0007 */
+};
+
+/* ZCL_METER_CLI_ATTR_NOTIF_FLG_ */
+#define ZCL_METER_CLI_NOTIF_FLG_NEW_OTA_FW 0x00000001U /* bit 0 */
+#define ZCL_METER_CLI_NOTIF_FLG_CBKE_UPDATE_REQ 0x00000002U /* bit 1 */
+#define ZCL_METER_CLI_NOTIF_FLG_TIME_SYNC 0x00000004U /* bit 2 */
+/* Reserved - 0x00000008U */
+#define ZCL_METER_CLI_NOTIF_FLG_STAY_AWAKE_HAN 0x00000010U /* bit 4 */
+#define ZCL_METER_CLI_NOTIF_FLG_STAY_AWAKE_WAN 0x00000020U /* bit 5 */
+#define ZCL_METER_CLI_NOTIF_FLG_PUSH_HIST_METER_MASK 0x000001C0U /* bits 6-8 */
+#define ZCL_METER_CLI_NOTIF_FLG_PUSH_HIST_PREPAY_SET 0x00000E00U /* bits 9-11 */
+#define ZCL_METER_CLI_NOTIF_FLG_PUSH_STATIC_BASIC 0x00001000U /* bit 12 */
+#define ZCL_METER_CLI_NOTIF_FLG_PUSH_STATIC_METER 0x00002000U /* bit 13 */
+#define ZCL_METER_CLI_NOTIF_FLG_PUSH_STATIC_PREPAY 0x00004000U /* bit 14 */
+#define ZCL_METER_CLI_NOTIF_FLG_NETWORK_KEY_ACTIVE 0x00008000U /* bit 15 */
+#define ZCL_METER_CLI_NOTIF_FLG_DISPLAY_MESSAGE 0x00010000U /* bit 16 */
+#define ZCL_METER_CLI_NOTIF_FLG_CANCEL_ALL_MESSAGES 0x00020000U /* bit 17 */
+#define ZCL_METER_CLI_NOTIF_FLG_CHANGE_SUPPLY 0x00040000U /* bit 18 */
+#define ZCL_METER_CLI_NOTIF_FLG_LOCAL_CHANGE_SUPPLY 0x00080000U /* bit 19 */
+#define ZCL_METER_CLI_NOTIF_FLG_SET_UNCONTROLLED_FLOW_THRESH 0x00100000U /* bit 20 */
+#define ZCL_METER_CLI_NOTIF_FLG_TUNNEL_MESSAGE_PEND 0x00200000U /* bit 21 */
+#define ZCL_METER_CLI_NOTIF_FLG_GET_SNAPSHOT 0x00400000U /* bit 22 */
+#define ZCL_METER_CLI_NOTIF_FLG_GET_SAMPLED_DATA 0x00800000U /* bit 23 */
+#define ZCL_METER_CLI_NOTIF_FLG_NEW_SUBGHZ_CHANNEL_MASKS 0x01000000U /* bit 24 */
+#define ZCL_METER_CLI_NOTIF_FLG_ENERGY_SCAN_PEND 0x02000000U /* bit 25 */
+#define ZCL_METER_CLI_NOTIF_FLG_CHANNEL_CHANGE_PEND 0x04000000U /* bit 26 */
+
+/* Meter Status flags */
+#define ZCL_METER_STATUS_CHECK_METER 0x01U
+#define ZCL_METER_STATUS_LOW_BATTERY 0x02U
+#define ZCL_METER_STATUS_TAMPER_DETECT 0x04U
+#define ZCL_METER_STATUS_POWER_FAILURE 0x08U
+#define ZCL_METER_STATUS_PIPE_EMPTY 0x08U
+#define ZCL_METER_STATUS_TEMPERATURE_SENSOR 0x08U
+#define ZCL_METER_STATUS_POWER_QUALITY 0x10U
+#define ZCL_METER_STATUS_LOW_PRESSURE 0x10U
+#define ZCL_METER_STATUS_BURST_DETECT 0x10U
+#define ZCL_METER_STATUS_LEAK_DETECT 0x20U
+#define ZCL_METER_STATUS_SERVICE_DISCONNECT 0x40U
+#define ZCL_METER_STATUS_REVERSE_FLOW 0x80U
+#define ZCL_METER_STATUS_FLOW_SENSOR 0x80U
+
+#define ZCL_METER_FORMAT_FRACTIONAL 0x07U
+#define ZCL_METER_FORMAT_INTEGER 0x78U
+#define ZCL_METER_FORMAT_SUPPRESS_LEADING_ZERO 0x80U
+#define ZCL_METER_FORMAT_OFFSET_FRACTIONAL 0U
+#define ZCL_METER_FORMAT_OFFSET_INTEGER 3U
+
+/* Simple Metering units of measure enumeration */
+enum ZbZclMeterUnitsT {
+ ZCL_METER_UNITS_BINARY_KWH = 0x00,
+ ZCL_METER_UNITS_BINARY_CUBIC_METERS = 0x01,
+ ZCL_METER_UNITS_BINARY_CUBIC_FEET = 0x02,
+ ZCL_METER_UNITS_BINARY_CCF = 0x03,
+ ZCL_METER_UNITS_BINARY_US_GALLON = 0x04,
+ ZCL_METER_UNITS_BINARY_IMPERIAL_GALLON = 0x05,
+ ZCL_METER_UNITS_BINARY_BTU = 0x06,
+ ZCL_METER_UNITS_BINARY_LITERS = 0x07,
+ ZCL_METER_UNITS_BINARY_RELATIVE_KPA = 0x08,
+ ZCL_METER_UNITS_BINARY_ABSOLUTE_KPA = 0x09,
+ ZCL_METER_UNITS_BINARY_MCF = 0x0A, /* SE 1.1 */
+ ZCL_METER_UNITS_BINARY_UNITLE = 0x0B, /* SE 1.1 */
+ ZCL_METER_UNITS_BINARY_MEGA_JOULE = 0x0C, /* SE 1.1 */
+ ZCL_METER_UNITS_BINARY_KVAR = 0x0D, /* SE 1.2a */
+
+ ZCL_METER_UNITS_BCD_KWH = 0x80,
+ ZCL_METER_UNITS_BCD_CUBIC_METERS = 0x81,
+ ZCL_METER_UNITS_BCD_CUBIC_FEET = 0x82,
+ ZCL_METER_UNITS_BCD_CCF = 0x83,
+ ZCL_METER_UNITS_BCD_US_GALLON = 0x84,
+ ZCL_METER_UNITS_BCD_IMPERIAL_GALLON = 0x85,
+ ZCL_METER_UNITS_BCD_BTU = 0x86,
+ ZCL_METER_UNITS_BCD_LITERS = 0x87,
+ ZCL_METER_UNITS_BCD_RELATIVE_KPA = 0x88,
+ ZCL_METER_UNITS_BCD_ABSOLUTE_KPA = 0x89,
+ ZCL_METER_UNITS_BCD_MCF = 0x8A, /* SE 1.1 */
+ ZCL_METER_UNITS_BCD_UNITLE = 0x8B, /* SE 1.1 */
+ ZCL_METER_UNITS_BCD_MEGA_JOULE = 0x8C, /* SE 1.1 */
+ ZCL_METER_UNITS_BCD_KVAR = 0x8D /* SE 1.2a */
+};
+
+/* Simple Metering device type enumerations (ZCL_METER_SVR_ATTR_DEVICE_TYPE)
+ *
+ * Funny how the mirrored types start with GAS at 0x80 instead
+ * of 0x81. Are we really correct to assume there will never be a
+ * mirrored electric meter?
+ *
+ * Also, SE states that the metering device type is an 8-bit bitmask,
+ * but it's actually an 8-bit enumeration.
+ */
+enum ZbZclMeterTypeT {
+ ZCL_METER_TYPE_ELECTRIC = 0x00,
+ ZCL_METER_TYPE_GAS = 0x01,
+ ZCL_METER_TYPE_WATER = 0x02,
+#if 0 /* Deprecated as of SE 1.1 */
+ ZCL_METER_TYPE_THERMAL = 0x03,
+#endif
+ ZCL_METER_TYPE_PRESSURE = 0x04,
+ ZCL_METER_TYPE_HEAT = 0x05,
+ ZCL_METER_TYPE_COOLING = 0x06,
+
+ ZCL_METER_TYPE_END_USE_METER = 0x07, /* SE 1.1b */
+ ZCL_METER_TYPE_PV_GEN = 0x08, /* SE 1.1b */
+ ZCL_METER_TYPE_WIND_GEN = 0x09, /* SE 1.1b */
+ ZCL_METER_TYPE_WATER_GEN = 0x0A, /* SE 1.1b */
+ ZCL_METER_TYPE_MICRO_GEN = 0x0B, /* SE 1.1b */
+ ZCL_METER_TYPE_SOLAR_HW = 0x0C, /* SE 1.1b */
+ ZCL_METER_TYPE_ELECTRIC_PHASE_1 = 0x0D, /* SE 1.1b */
+ ZCL_METER_TYPE_ELECTRIC_PHASE_2 = 0x0E, /* SE 1.1b */
+ ZCL_METER_TYPE_ELECTRIC_PHASE_3 = 0x0F, /* SE 1.1b */
+
+ ZCL_METER_TYPE_MIRR_ELECTRIC = 0x7F,
+ ZCL_METER_TYPE_MIRR_GAS = 0x80,
+ ZCL_METER_TYPE_MIRR_WATER = 0x81,
+#if 0 /* Deprecated as of SE 1.1 */
+ ZCL_METER_TYPE_MIRR_THERMAL = 0x82,
+#endif
+ ZCL_METER_TYPE_MIRR_PRESSURE = 0x83,
+ ZCL_METER_TYPE_MIRR_HEAT = 0x84,
+ ZCL_METER_TYPE_MIRR_COOLING = 0x85,
+
+ ZCL_METER_TYPE_MIRR_END_USE_METER = 0x86, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_PV_GEN = 0x87, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_WIND_GEN = 0x88, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_WATER_GEN = 0x89, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_MICRO_GEN = 0x8A, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_SOLAR_HW = 0x8B, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_ELECPHS_1 = 0x8C, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_ELECPHS_2 = 0x8D, /* SE 1.1b */
+ ZCL_METER_TYPE_MIRR_ELECPHS_3 = 0x8E /* SE 1.1b */
+};
+
+/*lint -save -e849 [ !MISRA - multiple string with same enum value. ] */
+/* In the infinite wisdom of zigbee, they use the same enumeration values
+ * for different meter types (e.g. alarm code 0x03 means power failure for
+ * electric meter , but means pipe empty for water meter).
+ */
+enum ZbZclMeterAlarmT {
+ /* Simple Metering alarm codes. */
+ ZCL_METER_ALARM_CHECK_METER = 0x00,
+ ZCL_METER_ALARM_LOW_BATTERY = 0x01,
+ ZCL_METER_ALARM_TAMPER_DETECT = 0x02,
+ ZCL_METER_ALARM_POWER_FAILURE = 0x03, /* Electricity alarm only. */
+ ZCL_METER_ALARM_PIPE_EMPTY = 0x03, /* Water alarm only. */
+ ZCL_METER_ALARM_TEMPERATURE_SENSOR = 0x03, /* Heating/Cooling alarm only. */
+ ZCL_METER_ALARM_POWER_QUALITY = 0x04, /* Electricity alarm only. */
+ ZCL_METER_ALARM_LOW_PRESSURE = 0x04, /* Gas and Water alarms only. */
+ ZCL_METER_ALARM_BURST_DETECT = 0x04, /* Heating/Cooling alarm only. */
+ ZCL_METER_ALARM_LEAK_DETECT = 0x05,
+ ZCL_METER_ALARM_SERVICE_DISCONNECT = 0x06,
+ ZCL_METER_ALARM_REVERSE_FLOW = 0x07, /* Gas and Water alarms only. */
+ ZCL_METER_ALARM_FLOW_SENSOR = 0x07, /* Heating/Cooling alarm only. */
+
+ /* Simple Metering Electricity alarm codes. */
+ ZCL_METER_ALARM_LOW_VOLTAGE_L1 = 0x10,
+ ZCL_METER_ALARM_HIGH_VOLTAGE_L1 = 0x11,
+ ZCL_METER_ALARM_LOW_VOLTAGE_L2 = 0x12,
+ ZCL_METER_ALARM_HIGH_VOLTAGE_L2 = 0x13,
+ ZCL_METER_ALARM_LOW_VOLTAGE_L3 = 0x14,
+ ZCL_METER_ALARM_HIGH_VOLTAGE_L4 = 0x15,
+ ZCL_METER_ALARM_OVER_CURRENT_L1 = 0x16,
+ ZCL_METER_ALARM_OVER_CURRENT_L2 = 0x17,
+ ZCL_METER_ALARM_OVER_CURRENT_L3 = 0x18,
+ ZCL_METER_ALARM_FREQ_LOW_L1 = 0x19,
+ ZCL_METER_ALARM_FREQ_HIGH_L1 = 0x1a,
+ ZCL_METER_ALARM_FREQ_LOW_L2 = 0x1b,
+ ZCL_METER_ALARM_FREQ_HIGH_L2 = 0x1c,
+ ZCL_METER_ALARM_FREQ_LOW_L3 = 0x1d,
+ ZCL_METER_ALARM_FREQ_HIGH_L3 = 0x1e,
+ ZCL_METER_ALARM_GROUND_FAULT = 0x1f,
+ ZCL_METER_ALARM_ELECTRIC_TAMPER_DETECT = 0x20,
+
+ /* Simple Metering Pressure/Flow alarm codes. */
+ ZCL_METER_ALARM_PRESSURE_BURST_DETECT = 0x30,
+ ZCL_METER_ALARM_PRESSURE_TOO_LOW = 0x31,
+ ZCL_METER_ALARM_PRESSURE_TOO_HIGH = 0x32,
+ ZCL_METER_ALARM_FLOW_COMM_ERROR = 0x33,
+ ZCL_METER_ALARM_FLOW_MEASUREMENT_FAULT = 0x34,
+ ZCL_METER_ALARM_FLOW_REVERSE = 0x35,
+ ZCL_METER_ALARM_FLOW_AIR_DETECT = 0x36,
+ ZCL_METER_ALARM_FLOW_PIPE_EMPTY = 0x37,
+
+ /* Simple Metering Heat and Cooling alarm codes. */
+ ZCL_METER_ALARM_INLET_TEMPERATURE_SENSOR = 0x50,
+ ZCL_METER_ALARM_OUTLET_TEMPERATURE_SENSOR = 0x51
+};
+/*lint -restore */
+
+/* Simple Metering profile intervals. */
+enum ZbZclMeterProfileIntervalT {
+ ZCL_METER_PRFL_PERIOD_DAILY = 0x00,
+ ZCL_METER_PRFL_PERIOD_HOURLY = 0x01,
+ ZCL_METER_PRFL_PERIOD_30MIN = 0x02,
+ ZCL_METER_PRFL_PERIOD_15MIN = 0x03,
+ ZCL_METER_PRFL_PERIOD_10MIN = 0x04,
+ ZCL_METER_PRFL_PERIOD_450SEC = 0x05,
+ ZCL_METER_PRFL_PERIOD_300SEC = 0x06,
+ ZCL_METER_PRFL_PERIOD_150SEC = 0x07
+};
+
+/* Simple Metering Get Profile Response Status. */
+enum ZbZclMeterGetProfileStatusT {
+ ZCL_METER_PRFL_STATUS_SUCCESS = 0x00,
+ ZCL_METER_PRFL_STATUS_CHAN_UNDEFINED = 0x01,
+ ZCL_METER_PRFL_STATUS_CHAN_UNSUPPORTED = 0x02,
+ ZCL_METER_PRFL_STATUS_INVALID_END_TIME = 0x03,
+ ZCL_METER_PRFL_STATUS_TOO_MANY_INTERVALS = 0x04,
+ ZCL_METER_PRFL_STATUS_NO_INTERVALS = 0x05
+};
+
+/* Simple Metering Server Generated Commands */
+enum ZbZclMeterServerCommandsT {
+ ZCL_METER_SVR_CMD_GET_PROFILE_RESPONSE = 0x00,
+ ZCL_METER_SVR_CMD_REQUEST_MIRROR = 0x01,
+ ZCL_METER_SVR_CMD_REMOVE_MIRROR = 0x02,
+ ZCL_METER_SVR_CMD_FAST_POLL_RESPONSE = 0x03,
+ ZCL_METER_SVR_CMD_SCHEDULE_SNAPSHOT_RESPONSE = 0x04,
+ ZCL_METER_SVR_CMD_TAKE_SNAPSHOT_RESPONSE = 0x05,
+ ZCL_METER_SVR_CMD_PUBLISH_SNAPSHOT = 0x06,
+ ZCL_METER_SVR_CMD_GET_SAMPLED_DATA_RESPONSE = 0x07,
+ ZCL_METER_SVR_CMD_CONFIGURE_MIRROR = 0x08,
+ ZCL_METER_SVR_CMD_CONFIGURE_NOTIFICATION_SCHEME = 0x09,
+ ZCL_METER_SVR_CMD_CONFIGURE_NOTIFICATION_FLAG = 0x0a,
+ ZCL_METER_SVR_CMD_GET_NOTIFIED_MESSAGE = 0x0b,
+ ZCL_METER_SVR_CMD_SUPPLY_STATUS_RESPONSE = 0x0c,
+ ZCL_METER_SVR_CMD_START_SAMPLING_RESPONSE_RESERVED = 0x0d
+};
+
+/* Simple Metering Client Generated Commands */
+enum ZbZclMeterClientCommandsT {
+ ZCL_METER_CLI_CMD_GET_PROFILE = 0x00,
+ ZCL_METER_CLI_CMD_REQUEST_MIRROR_RESPONSE = 0x01,
+ ZCL_METER_CLI_CMD_MIRROR_REMOVED = 0x02,
+ ZCL_METER_CLI_CMD_REQUEST_FAST_POLL_MODE = 0x03,
+ ZCL_METER_CLI_CMD_SCHEDULE_SNAPSHOT = 0x04,
+ ZCL_METER_CLI_CMD_TAKE_SNAPSHOT = 0x05,
+ ZCL_METER_CLI_CMD_GET_SNAPSHOT = 0x06,
+ ZCL_METER_CLI_CMD_START_SAMPLING = 0x07,
+ ZCL_METER_CLI_CMD_GET_SAMPLED_DATA = 0x08,
+ ZCL_METER_CLI_CMD_MIRROR_REPORT_ATTRIBUTE_RESPONSE = 0x09,
+ ZCL_METER_CLI_CMD_RESET_LOADLIMIT_COUNTER = 0x0a,
+ ZCL_METER_CLI_CMD_CHANGE_SUPPLY = 0x0b,
+ ZCL_METER_CLI_CMD_LOCAL_CHANGE_SUPPLY = 0x0c,
+ ZCL_METER_CLI_CMD_SET_SUPPLY_STATUS = 0x0d,
+ ZCL_METER_CLI_CMD_SET_UNCONTROLLED_FLOW_THRESHOLD = 0x0e
+};
+
+/* Sample Type Enumerations. These are the same as Interval Channel Values */
+enum ZbZclMeterSampleTypeT {
+ ZCL_METER_SAMPLE_TYPE_CONSUMP_DELIV = 0x00,
+ ZCL_METER_SAMPLE_TYPE_CONSUMP_RECV, /* 0x01 */
+ ZCL_METER_SAMPLE_TYPE_REACTIVE_CONSUMP_DELIV, /* 0x02 */
+ ZCL_METER_SAMPLE_TYPE_REACTIVE_CONSUMP_RECV, /* 0x03 */
+ ZCL_METER_SAMPLE_TYPE_INSTANTANEOUS_DEMAND /* 0x04 */
+};
+
+#if 0 /* not used */
+struct ZbZclMeterSampleT {
+ unsigned long long sumDelivered;
+ unsigned long long sumReceived;
+ unsigned long long demandDelivered;
+ unsigned long long demandReceived;
+ signed char powerFactor;
+ int currentTier;
+ int currentBlock;
+};
+#endif
+
+struct ZbZclMeterClientGetProfileReqT {
+ enum ZbZclMeterSampleTypeT interval_channel;
+ uint32_t end_time;
+ uint8_t number_of_periods;
+};
+
+struct ZbZclMeterServerGetProfileRspT {
+ uint32_t end_time;
+ enum ZbZclMeterGetProfileStatusT status;
+ uint8_t profile_interval_period;
+ uint8_t number_of_periods;
+ uint8_t *profile_data; /* ZbZclMeterFormSampledData */
+ unsigned int profile_length;
+};
+
+struct ZbZclMeterClientGetSampledDataReqT {
+ uint16_t sample_id;
+ uint32_t earliest_sample_time;
+ enum ZbZclMeterSampleTypeT sample_type;
+ uint16_t number_of_samples;
+};
+
+struct ZbZclMeterServerGetSampledDataRspT {
+ uint16_t sample_id;
+ uint32_t sample_start_time;
+ enum ZbZclMeterSampleTypeT sample_type;
+ uint16_t sample_request_interval;
+ uint16_t number_of_samples;
+ uint8_t *sample_data; /* can use ZbZclMeterFormSampledData */
+ unsigned int sample_length;
+};
+
+enum ZbZclMeterSupplyStatusT {
+ ZCL_METER_SUPPLY_STATUS_OFF = 0x00,
+ ZCL_METER_SUPPLY_STATUS_OFF_ARMED = 0x01,
+ ZCL_METER_SUPPLY_STATUS_ON = 0x02
+};
+
+struct ZbZclMeterClientLocalChangeSupplyReqT {
+ enum ZbZclMeterSupplyStatusT prop_supply_status;
+};
+
+/*---------------------------------------------------------------
+ * Metering Server Functions
+ *---------------------------------------------------------------
+ */
+struct ZbZclMeterServerCallbacksT {
+ /* Configure callback to handle ZCL_METER_CLI_CMD_GET_PROFILE.
+ * In handling of get_profile(), the application should call
+ * ZbZclMeterServerSendGetProfileRsp to send the response if successful.
+ * Otherwise, the application can return an error status, which will cause
+ * a Default Response to be sent with that status. */
+ enum ZclStatusCodeT (*get_profile)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclMeterClientGetProfileReqT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ /* Configure callback to handle ZCL_METER_CLI_CMD_GET_SAMPLED_DATA.
+ * In handling of get_sampled_data(), the application should call
+ * ZbZclMeterServerSendGetSampledDataRsp to send the response if successful.
+ * Otherwise, the application can return an error status, which will cause
+ * a Default Response to be sent with that status. */
+ enum ZclStatusCodeT (*get_sampled_data)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclMeterClientGetSampledDataReqT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ /* Configure callback to handle ZCL_METER_CLI_CMD_LOCAL_CHANGE_SUPPLY.
+ * In handling of local_change_supply, application returns the status code
+ * to include in the Default Response. */
+ enum ZclStatusCodeT (*local_change_supply)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclMeterClientLocalChangeSupplyReqT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ /* Configure callback to handle ZCL_METER_COMMAND_REQUEST_MIRROR command.
+ * Callback will register an endpoint for the mirrored metering cluster,
+ * and return the endpoint ID or 0xFFFF on error. */
+ uint16_t (*request_mirror)(void *arg, struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *srcInfo, struct ZbApsdeDataIndT *dataIndPtr);
+
+ uint16_t (*remove_mirror)(void *arg, struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *srcInfo, struct ZbApsdeDataIndT *dataIndPtr);
+
+ /* Optional commands not parsed into a struct or specific callback. If this is NULL,
+ * the cluster will return a Default Response with status of ZCL_STATUS_UNSUPP_CLUSTER_COMMAND.
+ * The application can also return that status value to include in the Default Response, or
+ * any other ZCL status (ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE means no Default Response). */
+ enum ZclStatusCodeT (*optional)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr);
+};
+
+/* Allocate the Metering Server Cluster.
+ * After initialization, ZbZclClusterSetCallbackArg is called with 'arg'
+ * to configure the application's callback argument. */
+struct ZbZclClusterT * ZbZclMeterServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclMeterServerCallbacksT *callbacks, void *arg);
+
+/* Converts the profile interval period enumerated value to a time in seconds,
+ * or -1 on error. */
+int ZbZclMeterGetProfileIntervalPeriod(uint8_t profile_interval_id);
+
+/* Helper function to send the Get Profile Response Command
+ * (get_profile callback, id = ZCL_METER_SVR_CMD_GET_PROFILE_RESPONSE) */
+enum ZclStatusCodeT ZbZclMeterServerSendGetProfileRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclMeterServerGetProfileRspT *rsp);
+
+/* Helper function to convert an array of 24-bit integers to the format
+ * that gets sent in the ZigBee frame. Returns the number of octets
+ * written to sample_data. */
+int ZbZclMeterFormSampledData(uint8_t *sample_data, unsigned int max_len, uint32_t *samples, uint16_t num_samples);
+
+/* Helper function to send the Get Sampled Data Response Command
+ * (get_sampled_data callback, id = ZCL_METER_SVR_CMD_GET_SAMPLED_DATA_RESPONSE) */
+enum ZclStatusCodeT ZbZclMeterServerSendGetSampledDataRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclMeterServerGetSampledDataRspT *rsp);
+
+/*---------------------------------------------------------------
+ * Metering Server Mirror Functions
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclMeterServerMirrorAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ uint64_t mirrorAddr, uint8_t mirrorEndpt);
+
+/* ZbZclMeterServerMirrorConfig enables mirroring on this endpoint, allowing
+ * reports from the srcExtAddr address to our dstEndPt endpoint to be
+ * handled as updates to this mirroring cluster. */
+void ZbZclMeterServerMirrorConfig(struct ZbZclClusterT *clusterPtr, uint64_t srcExtAddr, uint8_t dstEndpt);
+
+/*---------------------------------------------------------------
+ * Metering Client Functions
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclMeterClientCallbacksT {
+ /* Optional commands not parsed into a struct or specific callback. If this is NULL,
+ * the cluster will return a Default Response with status of ZCL_STATUS_UNSUPP_CLUSTER_COMMAND.
+ * The application can also return that status value to include in the Default Response, or
+ * any other ZCL status (ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE means no Default Response). */
+ enum ZclStatusCodeT (*optional)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr);
+};
+
+struct ZbZclClusterT * ZbZclMeterClientAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclMeterClientCallbacksT *callbacks, void *arg);
+
+uint8_t ZbZclMeterClientCommandGetProfileReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclMeterClientGetProfileReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+uint8_t ZbZclMeterClientCommandGetSampledDataReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclMeterClientGetSampledDataReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+uint8_t ZbZclMeterClientCommandLocalChangeSupplyReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclMeterClientLocalChangeSupplyReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclMeterClientAttrQueryT {
+ uint16_t attributeId;
+ uint8_t dataType;
+ uint8_t status;
+ union {
+ /* Reading Information Set */
+ uint64_t currentSummationDelivered;
+ uint64_t currentSummationReceived;
+ uint64_t currentMaxDemandDelivered;
+ uint64_t currentMaxDemandReceived;
+ uint64_t currentDftSummation;
+ uint16_t dailyFreezeTime;
+ int8_t powerFactor;
+ uint32_t readingSnapshotTime;
+ uint32_t currentMaxDemandDeliveredTime;
+ uint32_t currentMaxDemandReceivedTime;
+ uint64_t currentBlockPeriodConsumptionDelivered; /* HACK */
+ /* Time-of-Use Information Set */
+ uint64_t tierSummationDelivered;
+ uint64_t tierSummationReceived;
+ /* Meter Status Information Set */
+ uint8_t meterStatus;
+ /* Formatting Information Set */
+ uint8_t unitOfMeasure;
+ uint32_t multiplier;
+ uint32_t divisor;
+ uint8_t summationFormatting;
+ uint8_t demandFormatting;
+ uint8_t historicalFormatting;
+ uint8_t meterType;
+ /* Historical Information Set */
+ int32_t instantaneousDemand;
+ uint32_t dailyDemandDelivered;
+ uint32_t dailyDemandReceived;
+ uint32_t yesterdayDemandDelivered;
+ uint32_t yesterdayDemandReceived;
+ uint32_t partialDeliveredStartTime;
+ uint32_t partialReceivedStartTime;
+ uint32_t partialDemandDelivered;
+ uint32_t partialDemandReceived;
+ uint8_t maxPeriodsDelivered;
+ /* Supply Limit Information Set */
+ uint32_t currentDemandDelivered;
+ uint32_t demandLimit;
+ uint8_t demandIntegrationPeriod;
+ uint8_t demandSubintervals;
+ } data;
+};
+
+/*lint -restore */
+
+#endif /* __ZCL_METER_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.attr.gbcs.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.attr.gbcs.h
new file mode 100644
index 000000000..52197356e
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.attr.gbcs.h
@@ -0,0 +1,35 @@
+/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#include "zcl/se/zcl.price.h"
+
+#ifdef ZCL_PRICE_ATTR_GBCS_CALLBACK
+/* Optional attribute flags. If providing an attribute callback (), then need to specify the appropriate flag(s):
+ * ZCL_ATTR_FLAG_CB_READ
+ * ZCL_ATTR_FLAG_CB_WRITE
+ * ZCL_ATTR_FLAG_CB_NOTIFY
+ */
+# ifndef ZCL_PRICE_ATTR_GBCS_FLAGS
+# error "Must define ZCL_PRICE_ATTR_GBCS_FLAGS if defining ZCL_PRICE_ATTR_GBCS_CALLBACK"
+# endif
+#else
+# define ZCL_PRICE_ATTR_GBCS_CALLBACK NULL
+# define ZCL_PRICE_ATTR_GBCS_FLAGS ZCL_ATTR_FLAG_NONE
+#endif
+
+/* Uncrustify is adding too many new-lines. For some reason, it doesn't
+ * do this in a .c file. */
+/* *INDENT-OFF* */
+
+/* Use this as-is to append the GBCS Metering Attributes to the
+ * Metering Server. Or use this as a template to create the
+ * attribute's as your application requires. */
+
+const struct ZbZclAttrT zcl_price_server_gbcs_attr_list[] = {
+ /* CommodityType (Read-only) */
+ {
+ ZCL_PRICE_SVR_ATTR_COMMODITY_TYPE, ZCL_DATATYPE_ENUMERATION_8BIT, ZCL_PRICE_ATTR_GBCS_FLAGS, 0,
+ ZCL_PRICE_ATTR_GBCS_CALLBACK, {0, 0}, {0, 0}
+ },
+};
+
+const unsigned int ZCL_PRICE_SVR_GBCS_ATTR_LIST_LEN = ZCL_ATTR_LIST_LEN(zcl_price_server_gbcs_attr_list);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.h
new file mode 100644
index 000000000..e0e002a18
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.price.h
@@ -0,0 +1,318 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Price cluster.
+ *--------------------------------------------------------------------------
+ */
+#ifndef ZCL_PRICE_H
+# define ZCL_PRICE_H
+
+#include "zcl/zcl.h"
+
+enum ZbZclPriceServerAttrT {
+ ZCL_PRICE_SVR_ATTR_START_OF_BLOCK_PERIOD = 0x0200,
+ ZCL_PRICE_SVR_ATTR_BLOCK_PERIOD_DURATION = 0x0201,
+
+ ZCL_PRICE_SVR_ATTR_COMMODITY_TYPE = 0x0300,
+ ZCL_PRICE_SVR_ATTR_STANDING_CHARGE = 0x0301,
+
+ /* Current Bill Period (CBP) */
+ ZCL_PRICE_SVR_ATTR_CBP_START = 0x0700,
+ ZCL_PRICE_SVR_ATTR_CBP_DURATION = 0x0701,
+ /* Last Bill Period (LBP) */
+ ZCL_PRICE_SVR_ATTR_LBP_START = 0x0702,
+ ZCL_PRICE_SVR_ATTR_LBP_DURATION = 0x0703,
+ ZCL_PRICE_SVR_ATTR_LBP_CONSOLIDATED_BILL = 0x0704
+};
+
+/* Price Cluster Attribute identifiers. */
+#define ZCL_PRICE_SVR_ATTR_TIERN_LABEL(_x_) (0x0000U + ((_x_) - 1U))
+#define ZCL_PRICE_SVR_ATTR_BLOCKN_THRESHOLD(_x_) (0x0100U + ((_x_) - 1U))
+
+#define ZCL_PRICE_SVR_ATTR_TIERN_BLOCKN_PRICE(_tier_, _blk_) (0x0400U + ((_blk_) - 1U) + (0x10U * (_tier_)))
+#define ZCL_PRICE_SVR_ATTR_NO_TIER_BLOCKN_PRICE(_blk_) ZCL_PRICE_SVR_ATTR_TIERN_BLOCKN_PRICE(0U, _blk_)
+
+/* Price Server Generated Commands */
+enum ZbZclPriceServerCommandsT {
+ ZCL_PRICE_SVR_CMD_PUB_PRICE = 0x00, /* mandatory for GBCS ESI */
+ ZCL_PRICE_SVR_CMD_PUB_BLK_PERIOD = 0x01,
+ ZCL_PRICE_SVR_CMD_PUB_CONVERSION_FACTOR = 0x02,
+ ZCL_PRICE_SVR_CMD_PUB_CALORIFIC_VALUE = 0x03,
+ ZCL_PRICE_SVR_CMD_PUB_TARIFF_INFORMATION = 0x04, /* mandatory for GBCS ESI */
+ ZCL_PRICE_SVR_CMD_PUB_PRICE_MATRIX = 0x05, /* mandatory for GBCS ESI */
+ ZCL_PRICE_SVR_CMD_PUB_BLK_THRESHOLDS = 0x06, /* mandatory for GBCS ESI */
+ ZCL_PRICE_SVR_CMD_PUB_CO2_VALUE = 0x07,
+ ZCL_PRICE_SVR_CMD_PUB_TIER_LABELS = 0x08,
+ ZCL_PRICE_SVR_CMD_PUB_BILLING_PERIOD = 0x09,
+ ZCL_PRICE_SVR_CMD_PUB_CONSOLIDATED_BILL = 0x0a,
+ ZCL_PRICE_SVR_CMD_PUB_CPP_EVENT = 0x0b,
+ ZCL_PRICE_SVR_CMD_PUB_CREDIT_PAYMENT = 0x0c,
+ ZCL_PRICE_SVR_CMD_PUB_CURRENCY_CONVERSION = 0x0d,
+ ZCL_PRICE_SVR_CMD_PUB_CANCEL_TARIFF = 0x0e
+};
+
+/* Price Client Generated Commands */
+enum ZbZclPriceClientCommandsT {
+ ZCL_PRICE_CLI_CMD_GET_CURRENT_PRICE = 0x00, /* mandatory for GBCS ESI */
+ ZCL_PRICE_CLI_CMD_GET_SCHEDULED_PRICES = 0x01,
+ ZCL_PRICE_CLI_CMD_PRICE_ACKNOWLEDGEMENT = 0x02, /* mandatory for GBCS ESI */
+ ZCL_PRICE_CLI_CMD_GET_BLOCK_PERIODS = 0x03,
+ ZCL_PRICE_CLI_CMD_GET_CONVERSION_FACTOR = 0x04,
+ ZCL_PRICE_CLI_CMD_GET_CALORIFIC_VALUE = 0x05,
+ ZCL_PRICE_CLI_CMD_GET_TARIFF_INFORMATION = 0x06, /* mandatory for GBCS ESI */
+ ZCL_PRICE_CLI_CMD_GET_PRICE_MATRIX = 0x07, /* mandatory for GBCS ESI */
+ ZCL_PRICE_CLI_CMD_GET_BLOCK_THRESHOLDS = 0x08, /* mandatory for GBCS ESI */
+ ZCL_PRICE_CLI_CMD_GET_CO2_VALUE = 0x09,
+ ZCL_PRICE_CLI_CMD_GET_TIER_LABELS = 0x0a,
+ ZCL_PRICE_CLI_CMD_GET_BILLING_PERIOD = 0x0b,
+ ZCL_PRICE_CLI_CMD_GET_CONSOLIDATED_BILL = 0x0c,
+ ZCL_PRICE_CLI_CMD_CPP_EVENT_RESPONSE = 0x0d,
+ ZCL_PRICE_CLI_CMD_GET_CREDIT_PAYMENT = 0x0e,
+ ZCL_PRICE_CLI_CMD_GET_CURRENCY_CONVERSION = 0x0f,
+ ZCL_PRICE_CLI_CMD_GET_TARIFF_CANCELLATION = 0x10
+};
+
+/* Price Cluster get current flags. */
+#define ZCL_PRICE_GET_FLAGS_RX_ON_IDLE 0x01U
+
+/* Price tier label string lengths. */
+#define ZCL_PRICE_LABEL_MAX_LENGTH 12U
+
+#define ZCL_PRICE_TARIFF_LABEL_MAX_LENGTH 24U
+
+/* Infinite price duration */
+#define ZCL_PRICE_DURATION_INFINITE 0xffff
+
+/* Alternate Cost units. */
+#define ZCL_PRICE_ALTERNATE_KG_CO2 0x01
+
+/*---------------------------------------------------------------
+ * Structures
+ *---------------------------------------------------------------
+ */
+
+/* ZCL_PRICE_SVR_CMD_PUB_PRICE */
+#define ZCL_PRICE_PUBLISH_MIN_SIZE 28U /* assume rate_lable is only 1 byte */
+#define ZCL_PRICE_PUBLISH_MAX_SIZE 59U
+
+struct ZbZclPriceServerPublishPriceT {
+ uint32_t provider_id;
+ char rate_lable[ZCL_PRICE_LABEL_MAX_LENGTH + 1U];
+ uint32_t issuer_event_id;
+ uint32_t current_Time; /* UTC Time */
+ uint8_t unit_of_measure;
+ uint16_t currency;
+ uint8_t trailing_digit_and_price_tier;
+ uint8_t num_price_tiers;
+ uint32_t start_time; /* UTC Time */
+ uint16_t duration; /* minutes */
+ uint32_t price;
+ /* ZCL_PRICE_PUBLISH_MIN_SIZE */
+
+ /* Optional parameters.
+ * Value set to all 1's to indicate not present.
+ * First parameter to be all 1's will cut-off the
+ * response at that point. */
+ uint8_t price_ratio;
+ uint32_t generation_price;
+ uint8_t generation_price_ratio;
+
+ uint32_t alternate_cost_delivered;
+ uint8_t alternate_cost_units;
+ uint8_t alternate_cost_trail_digits;
+ uint8_t num_block_thresholds;
+ uint8_t price_control;
+
+ uint8_t number_of_gen_tiers;
+ uint8_t gen_tier;
+ uint8_t ext_number_price_tiers;
+ uint8_t ext_price_tier;
+ uint8_t ext_register_tier;
+};
+
+/* ZCL_PRICE_SVR_CMD_PUB_TARIFF_INFORMATION */
+struct ZbZclPriceServerPublishTariffInfoT {
+ uint32_t provider_id;
+ uint32_t issuer_event_id;
+ uint32_t issuer_tariff_id;
+ uint32_t start_time; /* UTC Time */
+ uint8_t tariff_type_and_charging_scheme;
+ char tariff_label[ZCL_PRICE_TARIFF_LABEL_MAX_LENGTH + 1U];
+ uint8_t number_of_price_tiers_in_use;
+ uint8_t number_of_block_thresh_in_use;
+ uint8_t unit_of_measure;
+ uint16_t currency;
+ uint8_t price_trailing_digit;
+ uint32_t standing_charge;
+ uint8_t tier_block_mode;
+ uint32_t block_thresh_multiplier; /* 24-bit */
+ uint32_t block_thresh_divisor; /* 24-bit */
+};
+
+/* ZCL_PRICE_SVR_CMD_PUB_PRICE_MATRIX */
+#define ZCL_PRICE_SVR_PRICE_MATRIX_NUM_SUB_PAYLOAD_MAX 15U
+#define ZCL_PRICE_SVR_PRICE_MATRIX_MAX_SIZE (19U + (5U * ZCL_PRICE_SVR_PRICE_MATRIX_NUM_SUB_PAYLOAD_MAX))
+
+struct ZbZclPriceServerPriceMatrixEntryT {
+ uint8_t tier_block_id;
+ uint32_t price;
+};
+
+struct ZbZclPriceServerPublishPriceMatrixT {
+ uint32_t provider_id;
+ uint32_t issuer_event_id;
+ uint32_t start_time; /* UTC Time */
+ uint32_t issuer_tariff_id;
+ uint8_t command_index;
+ uint8_t total_number_commands;
+ uint8_t sub_payload_control;
+ uint8_t num_sub_paylad;
+ struct ZbZclPriceServerPriceMatrixEntryT sub_payload[ZCL_PRICE_SVR_PRICE_MATRIX_NUM_SUB_PAYLOAD_MAX];
+};
+
+/* ZCL_PRICE_SVR_CMD_PUB_BLK_THRESHOLDS */
+/* max tiers */
+#define ZCL_PRICE_SVR_BLOCK_THRESH_NUM_SUB_PAYLOAD_MAX 15U
+
+struct ZbZclPriceServerBlockThreshEntryT {
+ uint8_t tier;
+ uint64_t *block_thresh; /* array of 48-bit integers */
+};
+
+struct ZbZclPriceServerPublishBlockThresholdsT {
+ uint32_t provider_id;
+ uint32_t issuer_event_id;
+ uint32_t start_time; /* UTC Time */
+ uint32_t issuer_tariff_id;
+ uint8_t command_index;
+ uint8_t total_number_commands;
+ uint8_t sub_payload_control;
+ uint8_t num_sub_paylad;
+ struct ZbZclPriceServerBlockThreshEntryT sub_payload[ZCL_PRICE_SVR_BLOCK_THRESH_NUM_SUB_PAYLOAD_MAX];
+};
+
+struct ZbZclPriceClientGetCurrentPriceT {
+ uint8_t command_options;
+};
+
+struct ZbZclPriceClientPriceAckT {
+ uint32_t provider_id;
+ uint32_t issuer_event_id;
+ uint32_t price_ack_time;
+ uint8_t control;
+};
+
+struct ZbZclPriceClientGetTariffInfoT {
+ uint32_t earliest_start_time;
+ uint32_t min_issuer_event_id;
+ uint8_t num_commands;
+ uint8_t tariff_type;
+};
+
+struct ZbZclPriceClientGetPriceMatrixT {
+ uint32_t issuer_tariff_id;
+};
+
+struct ZbZclPriceClientGetBlockThresholdsT {
+ uint32_t issuer_tariff_id;
+};
+
+/*---------------------------------------------------------------
+ * API Callback Types
+ *---------------------------------------------------------------
+ */
+struct ZbZclPriceServerCallbacksT {
+ enum ZclStatusCodeT (*get_current_price)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclPriceClientGetCurrentPriceT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*price_ack)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclPriceClientPriceAckT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*get_tariff_info)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclPriceClientGetTariffInfoT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*get_price_matrix)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclPriceClientGetPriceMatrixT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*get_block_thresholds)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclPriceClientGetBlockThresholdsT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ /* Optional commands not parsed into a struct or specific callback */
+ enum ZclStatusCodeT (*optional)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr);
+};
+
+/*---------------------------------------------------------------
+ * Price Server
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclPriceServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclPriceServerCallbacksT *callbacks, void *arg);
+
+/* ZCL_PRICE_SVR_CMD_PUB_PRICE */
+void ZbZclPriceServerPublishPriceInit(struct ZbZclPriceServerPublishPriceT *rsp);
+
+enum ZclStatusCodeT ZbZclPriceServerSendPublishPrice(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclPriceServerPublishPriceT *rsp);
+
+/* ZCL_PRICE_SVR_CMD_PUB_TARIFF_INFORMATION */
+enum ZclStatusCodeT ZbZclPriceServerSendPublishTariffInfo(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclPriceServerPublishTariffInfoT *rsp);
+
+/* ZCL_PRICE_SVR_CMD_PUB_PRICE_MATRIX */
+enum ZclStatusCodeT ZbZclPriceServerSendPublishMatrix(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclPriceServerPublishPriceMatrixT *rsp);
+
+/* ZCL_PRICE_SVR_CMD_PUB_BLK_THRESHOLDS */
+enum ZclStatusCodeT ZbZclPriceServerSendPublishBlockThresholds(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclPriceServerPublishBlockThresholdsT *rsp);
+
+/*---------------------------------------------------------------
+ * Price Client
+ *---------------------------------------------------------------
+ */
+struct ZbZclPriceClientCallbacksT {
+ enum ZclStatusCodeT (*publish_price)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclPriceServerPublishPriceT *price, struct ZbZclAddrInfoT *srcInfo);
+
+ /* Optional commands not parsed into a struct or specific callback */
+ enum ZclStatusCodeT (*optional)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr);
+};
+
+struct ZbZclClusterT * ZbZclPriceClientAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclPriceClientCallbacksT *callbacks, void *arg);
+
+/* ZCL_PRICE_CLI_CMD_GET_CURRENT_PRICE */
+enum ZclStatusCodeT ZbZclPriceClientCommandGetCurrentPriceReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_PRICE_CLI_CMD_GET_SCHEDULED_PRICES */
+enum ZclStatusCodeT ZbZclPriceClientCommandGetScheduledPricesReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ uint32_t startTime, uint8_t maxPrices,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_PRICE_CLI_CMD_PRICE_ACKNOWLEDGEMENT */
+enum ZclStatusCodeT ZbZclPriceClientCommandPriceAckReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclPriceClientPriceAckT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_PRICE_CLI_CMD_GET_TARIFF_INFORMATION */
+enum ZclStatusCodeT ZbZclPriceClientCommandGetTariffInfoReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclPriceClientGetTariffInfoT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_PRICE_CLI_CMD_GET_PRICE_MATRIX */
+enum ZclStatusCodeT ZbZclPriceClientCommandGetPriceMatrixReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclPriceClientGetPriceMatrixT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_PRICE_CLI_CMD_GET_BLOCK_THRESHOLDS */
+enum ZclStatusCodeT ZbZclPriceClientCommandGetBlockThresholdsReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclPriceClientGetBlockThresholdsT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* __ZCL_PRICE_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.tunnel.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.tunnel.h
new file mode 100644
index 000000000..c774513c6
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/se/zcl.tunnel.h
@@ -0,0 +1,156 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Tunneling cluster.
+ *--------------------------------------------------------------------------
+ */
+#ifndef ZCL_TUNNEL_H
+# define ZCL_TUNNEL_H
+
+#include "zcl/zcl.h"
+
+/* Tunneling cluster attributes */
+enum {
+ ZCL_TUNNEL_ATTR_TIMEOUT = 0x0000
+};
+
+/* Client-to-Server commands */
+enum {
+ ZCL_TUNNEL_SVR_CMD_REQUEST = 0x00,
+ ZCL_TUNNEL_SVR_CMD_CLOSE = 0x01,
+ ZCL_TUNNEL_SVR_CMD_DATA = 0x02,
+ ZCL_TUNNEL_SVR_CMD_ERROR = 0x03,
+ ZCL_TUNNEL_SVR_CMD_ACK = 0x04, /* for flow control */
+ ZCL_TUNNEL_SVR_CMD_READY = 0x05, /* for flow control */
+ ZCL_TUNNEL_SVR_CMD_SUPPORTED_REQ = 0x06
+};
+
+/* Server-to-Client commands. */
+enum {
+ ZCL_TUNNEL_CLI_CMD_RESPONSE = 0x00,
+ ZCL_TUNNEL_CLI_CMD_DATA = 0x01,
+ ZCL_TUNNEL_CLI_CMD_ERROR = 0x02,
+ ZCL_TUNNEL_CLI_CMD_ACK = 0x03,
+ ZCL_TUNNEL_CLI_CMD_READY = 0x04,
+ ZCL_TUNNEL_CLI_CMD_SUPPORTED_RSP = 0x05,
+ ZCL_TUNNEL_CLI_CMD_CLOSE_NOTIFY = 0x06
+};
+
+/* Tunnel protocol ID enumerations */
+enum ZbZclTunnelProtocolT {
+ ZCL_TUNNEL_PROTO_DLMS_COSEM = 0,
+ ZCL_TUNNEL_PROTO_IEC_61107 = 1,
+ ZCL_TUNNEL_PROTO_ANSI_C12 = 2,
+ ZCL_TUNNEL_PROTO_M_BUS = 3,
+ ZCL_TUNNEL_PROTO_SML = 4,
+ ZCL_TUNNEL_PROTO_CLIMATE_TALK = 5,
+ ZCL_TUNNEL_PROTO_GB_HRGP = 6,
+ ZCL_TUNNEL_PROTO_IPV6 = 7,
+ ZCL_TUNNEL_PROTO_IPV4 = 8,
+ ZCL_TUNNEL_PROTO_NULL = 9,
+ ZCL_TUNNEL_PROTO_TEST = 199,
+ ZCL_TUNNEL_PROTO_MANUFACTURER = 200,
+ ZCL_TUNNEL_PROTO_RESERVED = 0xff
+};
+
+/* Tunnel Status Codes.
+ * These are used with the RequestTunnelResponse
+ * (ZCL_TUNNEL_CLI_CMD_RESPONSE). */
+enum ZbZclTunnelStatusT {
+ ZCL_TUNNEL_STATUS_SUCCESS = 0x00,
+ ZCL_TUNNEL_STATUS_BUSY = 0x01,
+ ZCL_TUNNEL_STATUS_NO_RESOURCES = 0x02,
+ ZCL_TUNNEL_STATUS_PROTO_UNSUPPORTED = 0x03,
+ ZCL_TUNNEL_STATUS_FLOW_UNSUPPORTED = 0x04
+};
+
+/* Transfer Data Status codes.
+ * These are used with the TransferDataError (ZCL_TUNNEL_SVR_CMD_ERROR and
+ * ZCL_TUNNEL_CLI_CMD_ERROR) commands. */
+enum ZbZclTunnelXferStatusT {
+ /* ugh, why use 0x00 for an error code?
+ * And why couldn't these status codes be combined with the
+ * Tunnel Status Codes? */
+ ZCL_TUNNEL_XFER_STATUS_NO_TUNNEL = 0x00,
+ ZCL_TUNNEL_XFER_STATUS_WRONG_DEVICE = 0x01,
+ ZCL_TUNNEL_XFER_STATUS_OVERFLOW = 0x02,
+
+ /* Exegin add-on. If zcl_tunnel_handle_data returns
+ * ZCL_TUNNEL_XFER_STATUS_NO_RESPONSE, don't send a response. */
+ ZCL_TUNNEL_XFER_STATUS_NO_RESPONSE = 0xff
+};
+
+struct ZbZclTunnelStateT;
+
+/*---------------------------------------------------------------
+ * Server
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclTunnelServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+enum ZclStatusCodeT ZbZclTunnelServerAddProto(struct ZbZclClusterT *clusterPtr,
+ enum ZbZclTunnelProtocolT protocol, /* Protocol ID enumeration. */
+ uint16_t mfr, /* Manufacturer ID. */
+ uint16_t mtu, /* Protocol's MTU. */
+ /* request - mandatory */
+ enum ZbZclTunnelStatusT (*request)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv),
+ /* input - mandatory */
+ void (*input)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv),
+ /* close - optional (required if application needs to keep track of open tunnels, e.g. for persistence) */
+ void (*close)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv),
+ /* error - optional. To handle ZCL_TUNNEL_SVR_CMD_ERROR. Return false if tunnel should be closed */
+ bool (*error)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv, enum ZbZclTunnelXferStatusT status),
+ void *priv);
+
+struct ZbZclTunnelStateT * ZbZclTunnelServerStateFindById(struct ZbZclClusterT *clusterPtr, uint16_t tunnel_id);
+
+enum ZclStatusCodeT ZbZclTunnelServerSendto(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclTunnelStateT *state, const uint8_t *data, unsigned int len, enum ZbZclDirectionT direction,
+ void (*callback)(struct ZbZclCommandRspT *rspPtr, void *arg), void *arg);
+
+void ZbZclTunnelServerSendAllMatch(struct ZbZclClusterT *clusterPtr, uint64_t eui, void *data, unsigned int len);
+
+/*---------------------------------------------------------------
+ * Client
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclTunnelClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+enum ZclStatusCodeT ZbZclTunnelClientAddProto(struct ZbZclClusterT *clusterPtr,
+ enum ZbZclTunnelProtocolT protocol, /* Protocol ID enumeration. */
+ uint16_t mfr, /* Manufacturer ID. */
+ uint16_t mtu, /* Protocol's MTU. */
+ /* input - mandatory */
+ void (*input)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv),
+ /* close - optional */
+ void (*close)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv),
+ /* error - optional. To handle ZCL_TUNNEL_CLI_CMD_ERROR. Return false if tunnel should be closed */
+ bool (*error)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *statePtr, void *priv, enum ZbZclTunnelXferStatusT status),
+ void *priv);
+
+enum ZclStatusCodeT ZbZclTunnelClientConnectReq(struct ZbZclClusterT *clusterPtr, uint64_t dst_addr, uint8_t dst_ep,
+ void (*callback)(struct ZbZclClusterT *clusterPtr, struct ZbZclTunnelStateT *state, enum ZbZclTunnelStatusT status, void *arg),
+ void *arg);
+
+enum ZclStatusCodeT ZbZclTunnelClientCloseReq(struct ZbZclClusterT *clusterPtr,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+/* For testing only - close the tunnel without informing the server. */
+enum ZclStatusCodeT ZbZclTunnelClientCloseQuietReq(struct ZbZclClusterT *clusterPtr);
+
+enum ZclStatusCodeT ZbZclTunnelClientSendReq(struct ZbZclClusterT *clusterPtr, const uint8_t *data, uint16_t len,
+ void (*callback)(struct ZbZclCommandRspT *rspPr, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Misc Helpers
+ *---------------------------------------------------------------
+ */
+uint16_t ZbZclTunnelStateGetId(struct ZbZclTunnelStateT *state);
+enum ZbZclTunnelProtocolT ZbZclTunnelStateGetProtocol(struct ZbZclTunnelStateT *state);
+uint8_t * ZbZclTunnelStateGetDataPtr(struct ZbZclTunnelStateT *state);
+uint32_t ZbZclTunnelStateGetDataLen(struct ZbZclTunnelStateT *state, bool clear_data);
+/* For testing only - change the ID of the current tunnel. */
+bool zcl_tuncli_test_change_id(struct ZbZclClusterT *clusterPtr, uint16_t tunnel_id);
+
+#endif /* __ZCL_TUNNEL_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_ace.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_ace.h
index da3cc5a63..8624f58a9 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_ace.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_ace.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
/*--------------------------------------------------------------------------
* DESCRIPTION
@@ -285,9 +285,6 @@ struct ZbZclIasAceServerCallbacksT {
struct ZbZclClusterT * ZbZclIasAceServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
struct ZbZclIasAceServerCallbacksT *callbacks, void *arg);
-void ZbZclIasAceServerConfigCallbacks(struct ZbZclClusterT *clusterPtr,
- struct ZbZclIasAceServerCallbacksT *callbacks);
-
/* Change the Panel Arm/Disarm Code */
bool ZbZclIasAceServerPanelCodeConfig(struct ZbZclClusterT *clusterPtr,
const char *arm_code);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_wd.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_wd.h
index 9fa5ebc6c..5bce6b2d8 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_wd.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_wd.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
/*--------------------------------------------------------------------------
* DESCRIPTION
@@ -102,9 +102,6 @@ struct ZbZclIasWdServerCallbacksT {
struct ZbZclClusterT * ZbZclIasWdServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
struct ZbZclIasWdServerCallbacksT *callbacks, void *arg);
-void ZbZclIasWdServerConfigCallbacks(struct ZbZclClusterT *clusterPtr,
- struct ZbZclIasWdServerCallbacksT *callbacks);
-
/*---------------------------------------------------------------
* Client API
*---------------------------------------------------------------
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_zone.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_zone.h
index f97cbbbca..2e01b4b33 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_zone.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/security/zcl.ias_zone.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
/*--------------------------------------------------------------------------
* DESCRIPTION
@@ -177,9 +177,6 @@ struct ZbZclClusterT * ZbZclIasZoneServerAlloc(struct ZigBeeT *zb, uint8_t endpo
uint16_t zone_type, uint16_t manuf_code, bool use_trip_pair,
struct ZbZclIasZoneServerCallbacksT *callbacks, void *arg);
-void ZbZclIasZoneServerConfigCallbacks(struct ZbZclClusterT *clusterPtr,
- struct ZbZclIasZoneServerCallbacksT *callbacks);
-
/* Used with 'trip-to-pair'. Before sending a Zone Enroll Request, the IAS CIE
* must write to the IAS_CIE_Address attribute with its IEEE address. */
uint8_t ZbZclIasZoneServerEnrollRequest(struct ZbZclClusterT *clusterPtr,
@@ -215,12 +212,9 @@ struct ZbZclIasZoneClientCallbacksT {
struct ZbZclClusterT * ZbZclIasZoneClientAlloc(struct ZigBeeT *zb, uint8_t endpoint,
struct ZbZclIasZoneClientCallbacksT *callbacks, void *arg);
-void ZbZclIasZoneClientConfigCallbacks(struct ZbZclClusterT *clusterPtr,
- struct ZbZclIasZoneClientCallbacksT *callbacks);
-
uint8_t ZbZclIasZoneClientInitiateAutoEnroll(struct ZbZclClusterT *clusterPtr,
const struct ZbApsAddrT *dst,
- void (*callback)(const ZbZclWriteRspT *, void *), void *arg);
+ void (*callback)(const struct ZbZclWriteRspT *, void *), void *arg);
uint8_t ZbZclIasZoneClientSendAutoEnrollResponse(struct ZbZclClusterT *clusterPtr,
const struct ZbApsAddrT *dst, uint8_t zone_id,
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.alarm.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.alarm.h
index fe4f18c15..25bc01a34 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.alarm.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.alarm.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZCL_ALARM_H
# define ZCL_ALARM_H
@@ -100,19 +100,14 @@ uint8_t ZbZclAlarmClientBindDiscover(struct ZbZclClusterT *clusterPtr);
*/
enum ZclStatusCodeT ZbZclAlarmClientResetAlarmReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
uint8_t alarm_code, uint16_t cluster_id, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-enum ZclStatusCodeT ZbZclAlarmClientResetAlarmWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- uint8_t alarm_code, uint16_t cluster_id);
enum ZclStatusCodeT ZbZclAlarmClientResetAllAlarmsReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-enum ZclStatusCodeT ZbZclAlarmClientResetAllAlarmsWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst);
enum ZclStatusCodeT ZbZclAlarmClientGetAlarmReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-enum ZclStatusCodeT ZbZclAlarmClientGetAlarmWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst, struct ZbZclCommandRspT *rsp);
enum ZclStatusCodeT ZbZclAlarmClientResetAlarmLogReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-enum ZclStatusCodeT ZbZclAlarmClientResetAlarmLogWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst);
#endif /* __ZCL_ALARM_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.color.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.color.h
new file mode 100644
index 000000000..d67c9abcf
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.color.h
@@ -0,0 +1,619 @@
+/* Copyright [2016 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_COLOR_H
+#define ZCL_COLOR_H
+
+#include "zcl/zcl.h"
+
+/* PICS.ZCL.Color Control(0x0300)
+*
+* CC.S | TRUE
+* CC.C | TRUE
+*
+* Server Attributes
+* CC.S.A0000 | TRUE
+* CC.S.A0000.Report.Tx | TRUE
+* CC.S.A0001 | TRUE
+* CC.S.A0001.Scene | TRUE
+* CC.S.A0001.Report.Tx | TRUE
+* CC.S.A0002 | FALSE
+* CC.S.A0003 | TRUE
+* CC.S.A0003.Scene | TRUE
+* CC.S.A0003.Report.Tx | TRUE
+* CC.S.A0004 | TRUE
+* CC.S.A0004.Scene | TRUE
+* CC.S.A0004.Report.Tx | TRUE
+* CC.S.A0005 | FALSE
+* CC.S.A0006 | FALSE
+* CC.S.A0007 | TRUE
+* CC.S.A0007.Scene | TRUE
+* CC.S.A0007.Report.Tx | TRUE
+* CC.S.A0008 | TRUE
+* CC.S.A000f | TRUE
+* CC.S.A0010 | TRUE
+* CC.S.A0011 | FALSE
+* CC.S.A0012 | FALSE
+* CC.S.A0013 | FALSE
+* CC.S.A0015 | FALSE
+* CC.S.A0016 | FALSE
+* CC.S.A0017 | FALSE
+* CC.S.A0019 | FALSE
+* CC.S.A001a | FALSE
+* CC.S.A001b | FALSE
+* CC.S.A0020 | FALSE
+* CC.S.A0021 | FALSE
+* CC.S.A0022 | FALSE
+* CC.S.A0024 | FALSE
+* CC.S.A0025 | FALSE
+* CC.S.A0026 | FALSE
+* CC.S.A0028 | FALSE
+* CC.S.A0029 | FALSE
+* CC.S.A002a | FALSE
+* CC.S.A0030 | FALSE
+* CC.S.A0031 | FALSE
+* CC.S.A0032 | FALSE
+* CC.S.A0033 | FALSE
+* CC.S.A0034 | FALSE
+* CC.S.A0036 | FALSE
+* CC.S.A0037 | FALSE
+* CC.S.A0038 | FALSE
+* CC.S.A003a | FALSE
+* CC.S.A003b | FALSE
+* CC.S.A003c | FALSE
+* CC.S.A4000 | TRUE
+* CC.S.A4000.Scene | TRUE
+* CC.S.A4001 | FALSE
+* CC.S.A4002 | TRUE
+* CC.S.A4002.Scene | TRUE
+* CC.S.A4003 | TRUE
+* CC.S.A4003.Scene | TRUE
+* CC.S.A4004 | TRUE
+* CC.S.A4004.Scene | TRUE
+* CC.S.A4005 | TRUE
+* CC.S.A4006 | TRUE
+* CC.S.A400a | TRUE
+* CC.S.A400b | TRUE
+* CC.S.A400c | TRUE
+* CC.S.A400d | TRUE
+* CC.S.A4010 | TRUE
+* CC.S.Afffd | TRUE
+* CC.S.Afffe | NOT IN ZCL6
+*
+* Commands Received
+* CC.S.C00.Rsp | TRUE
+* CC.S.C01.Rsp | TRUE
+* CC.S.C02.Rsp | TRUE
+* CC.S.C03.Rsp | TRUE
+* CC.S.C04.Rsp | TRUE
+* CC.S.C05.Rsp | TRUE
+* CC.S.C06.Rsp | TRUE
+* CC.S.C07.Rsp | TRUE
+* CC.S.C08.Rsp | TRUE
+* CC.S.C09.Rsp | TRUE
+* CC.S.C0a.Rsp | TRUE
+* CC.S.C40.Rsp | TRUE
+* CC.S.C41.Rsp | TRUE
+* CC.S.C42.Rsp | TRUE
+* CC.S.C43.Rsp | TRUE
+* CC.S.C44.Rsp | TRUE
+* CC.S.C47.Rsp | TRUE
+* CC.S.C4b.Rsp | TRUE
+* CC.S.C4c.Rsp | TRUE
+*
+*
+* Client Attributes
+* CC.C.A0000.Report.Rsp | FALSE
+* CC.C.A0001.Report.Rsp | FALSE
+* CC.C.A0003.Report.Rsp | FALSE
+* CC.C.A0004.Report.Rsp | FALSE
+* CC.C.A0007.Report.Rsp | FALSE
+* CC.C.Afffd | TRUE
+* CC.C.Afffe | NOT IN ZCL6
+*
+* Commands Generated
+* CC.C.C00.Tx | TRUE
+* CC.C.C01.Tx | TRUE
+* CC.C.C02.Tx | TRUE
+* CC.C.C03.Tx | TRUE
+* CC.C.C04.Tx | TRUE
+* CC.C.C05.Tx | TRUE
+* CC.C.C06.Tx | TRUE
+* CC.C.C07.Tx | TRUE
+* CC.C.C08.Tx | TRUE
+* CC.C.C09.Tx | TRUE
+* CC.C.C0a.Tx | TRUE
+* CC.C.C40.Tx | TRUE
+* CC.C.C41.Tx | TRUE
+* CC.C.C42.Tx | TRUE
+* CC.C.C43.Tx | TRUE
+* CC.C.C44.Tx | TRUE
+* CC.C.C47.Tx | TRUE
+* CC.C.C4b.Tx | TRUE
+* CC.C.C4c.Tx | TRUE
+*/
+
+/* Color Control Attributes */
+#define ZCL_COLOR_ATTR_CURRENT_HUE 0x0000
+#define ZCL_COLOR_ATTR_CURRENT_SAT 0x0001
+#define ZCL_COLOR_ATTR_REMAINING_TIME 0x0002
+#define ZCL_COLOR_ATTR_CURRENT_X 0x0003
+#define ZCL_COLOR_ATTR_CURRENT_Y 0x0004
+#define ZCL_COLOR_ATTR_DRIFT_COMP 0x0005
+#define ZCL_COLOR_ATTR_COMPENSATION_TEXT 0x0006
+#define ZCL_COLOR_ATTR_COLOR_TEMP_MIREDS 0x0007
+#define ZCL_COLOR_ATTR_COLOR_MODE 0x0008
+#define ZCL_COLOR_ATTR_OPTIONS 0x000f
+#define ZCL_COLOR_ATTR_NUM_PRIMARIES 0x0010
+#define ZCL_COLOR_ATTR_PRIMARY_1X 0x0011
+#define ZCL_COLOR_ATTR_PRIMARY_1Y 0x0012
+#define ZCL_COLOR_ATTR_PRIMARY_1_INTENS 0x0013
+#define ZCL_COLOR_ATTR_PRIMARY_2X 0x0015
+#define ZCL_COLOR_ATTR_PRIMARY_2Y 0x0016
+#define ZCL_COLOR_ATTR_PRIMARY_2_INTENS 0x0017
+#define ZCL_COLOR_ATTR_PRIMARY_3X 0x0019
+#define ZCL_COLOR_ATTR_PRIMARY_3Y 0x001a
+#define ZCL_COLOR_ATTR_PRIMARY_3_INTENS 0x001b
+#define ZCL_COLOR_ATTR_PRIMARY_4X 0x0020
+#define ZCL_COLOR_ATTR_PRIMARY_4Y 0x0021
+#define ZCL_COLOR_ATTR_PRIMARY_4_INTENS 0x0022
+#define ZCL_COLOR_ATTR_PRIMARY_5X 0x0024
+#define ZCL_COLOR_ATTR_PRIMARY_5Y 0x0025
+#define ZCL_COLOR_ATTR_PRIMARY_5_INTENS 0x0026
+#define ZCL_COLOR_ATTR_PRIMARY_6X 0x0028
+#define ZCL_COLOR_ATTR_PRIMARY_6Y 0x0029
+#define ZCL_COLOR_ATTR_PRIMARY_6_INTENS 0x002a
+#define ZCL_COLOR_ATTR_WHITE_POINT_X 0x0030
+#define ZCL_COLOR_ATTR_WHITE_POINT_Y 0x0031
+#define ZCL_COLOR_ATTR_COLOR_POINT_RX 0x0032
+#define ZCL_COLOR_ATTR_COLOR_POINT_RY 0x0033
+#define ZCL_COLOR_ATTR_COLOR_POINT_R_INTENS 0x0034
+#define ZCL_COLOR_ATTR_COLOR_POINT_GX 0x0036
+#define ZCL_COLOR_ATTR_COLOR_POINT_GY 0x0037
+#define ZCL_COLOR_ATTR_COLOR_POINT_G_INTENS 0x0038
+#define ZCL_COLOR_ATTR_COLOR_POINT_BX 0x003a
+#define ZCL_COLOR_ATTR_COLOR_POINT_BY 0x003b
+#define ZCL_COLOR_ATTR_COLOR_POINT_B_INTENS 0x003c
+#define ZCL_COLOR_ATTR_ENH_CURR_HUE 0x4000
+#define ZCL_COLOR_ATTR_ENH_COLOR_MODE 0x4001
+#define ZCL_COLOR_ATTR_COLOR_LOOP_ACTIVE 0x4002
+#define ZCL_COLOR_ATTR_COLOR_LOOP_DIR 0x4003
+#define ZCL_COLOR_ATTR_COLOR_LOOP_TIME 0x4004
+#define ZCL_COLOR_ATTR_COLOR_LOOP_START_HUE 0x4005
+#define ZCL_COLOR_ATTR_COLOR_LOOP_STORE_HUE 0x4006
+#define ZCL_COLOR_ATTR_COLOR_CAPABILITIES 0x400A
+#define ZCL_COLOR_ATTR_COLOR_TEMP_MIN 0x400B
+#define ZCL_COLOR_ATTR_COLOR_TEMP_MAX 0x400C
+#define ZCL_COLOR_ATTR_COUPLE_COLOR_TL_MIN 0x400d
+#define ZCL_COLOR_ATTR_STARTUP_COLOR_TEMP 0x4010
+
+/* Color Control Command Identifiers */
+enum ZbZclColorCommandT {
+ ZCL_COLOR_COMMAND_MOVE_TO_HUE = 0x00,
+ ZCL_COLOR_COMMAND_MOVE_HUE = 0x01,
+ ZCL_COLOR_COMMAND_STEP_HUE = 0x02,
+ ZCL_COLOR_COMMAND_MOVE_TO_SAT = 0x03,
+ ZCL_COLOR_COMMAND_MOVE_SAT = 0x04,
+ ZCL_COLOR_COMMAND_STEP_SAT = 0x05,
+ ZCL_COLOR_COMMAND_MOVE_TO_HS = 0x06,
+ ZCL_COLOR_COMMAND_MOVE_TO_COLOR = 0x07,
+ ZCL_COLOR_COMMAND_MOVE_COLOR = 0x08,
+ ZCL_COLOR_COMMAND_STEP_COLOR = 0x09,
+ ZCL_COLOR_COMMAND_MOVE_TO_COLOR_TEMP = 0x0a,
+ ZCL_COLOR_COMMAND_ENH_MOVE_TO_HUE = 0x40,
+ ZCL_COLOR_COMMAND_ENH_MOVE_HUE = 0x41,
+ ZCL_COLOR_COMMAND_ENH_STEP_HUE = 0x42,
+ ZCL_COLOR_COMMAND_ENH_MOVE_TO_HS = 0x43,
+ ZCL_COLOR_COMMAND_COLOR_LOOP_SET = 0x44,
+ ZCL_COLOR_COMMAND_STOP_MOVE_STEP = 0x47,
+ ZCL_COLOR_COMMAND_MOVE_COLOR_TEMP = 0x4b,
+ ZCL_COLOR_COMMAND_STEP_COLOR_TEMP = 0x4c,
+};
+
+/* drift compensation */
+enum ZbZclColorDriftComp {
+ ZCL_COLOR_DRIFT_NONE = 0x00,
+ ZCL_COLOR_DRIFT_OTHER_UKN = 0x01,
+ ZCL_COLOR_DRIFT_TEMP_MON = 0x02,
+ ZCL_COLOR_DRIFT_OPTIC_LUM = 0x03,
+ ZCL_COLOR_DRIFT_OPTIC_COLOR = 0x04,
+};
+
+/* color mode */
+enum ZbZclColorMode {
+ ZCL_COLOR_MODE_HS = 0x00,
+ ZCL_COLOR_MODE_XY = 0x01,
+ ZCL_COLOR_MODE_TEMP = 0x02,
+};
+
+/* enhanced color mode */
+enum ZbZclColorModeEnh {
+ ZCL_COLOR_ENH_MODE_CURR_HS = 0x00,
+ ZCL_COLOR_ENH_MODE_CURR_XY = 0x01,
+ ZCL_COLOR_ENH_MODE_COLOR_TEMP = 0x02,
+ ZCL_COLOR_ENH_MODE_ENH_HUE_SAT = 0x03,
+};
+
+/* color capabilities - bit field */
+#define ZCL_COLOR_CAP_HS 0x01U
+#define ZCL_COLOR_CAP_ENH_HUE 0x02U
+#define ZCL_COLOR_CAP_COLOR_LOOP 0x04U
+#define ZCL_COLOR_CAP_XY 0x08U
+#define ZCL_COLOR_CAP_COLOR_TEMP 0x10U
+
+/* direction field */
+enum ZbZclColorMoveDir {
+ ZCL_COLOR_MOVE_TO_DIR_SHORTEST = 0x00,
+ ZCL_COLOR_MOVE_TO_DIR_LONGEST = 0x01,
+ ZCL_COLOR_MOVE_TO_DIR_UP = 0x02,
+ ZCL_COLOR_MOVE_TO_DIR_DOWN = 0x03,
+};
+
+/* move mode */
+enum ZbZclColorMoveMode {
+ ZCL_COLOR_MOVE_MODE_STOP = 0x00,
+ ZCL_COLOR_MOVE_MODE_UP = 0x01,
+ ZCL_COLOR_MOVE_MODE_DOWN = 0x03,
+};
+
+/* step mode */
+enum ZbZclColorStepMode {
+ ZCL_COLOR_STEP_MODE_UP = 0x01,
+ ZCL_COLOR_STEP_MODE_DOWN = 0X03,
+};
+
+/* color loop set direction */
+enum ZbZclColorLoopAction {
+ ZCL_COLOR_LOOP_ACTION_DEACTIVATE = 0x00,
+ ZCL_COLOR_LOOP_ACTION_ACTIVATE_FIELD = 0x01,
+ ZCL_COLOR_LOOP_ACTION_ACTIVATE_ATTR = 0x02,
+};
+
+/* color loop set direction */
+enum ZbZclColorLoopDir {
+ ZCL_COLOR_LOOP_DIR_DECREMENT_HUE = 0x00,
+ ZCL_COLOR_LOOP_DIR_INCREMENT_HUE = 0x01,
+};
+
+/* color loop update flags */
+enum ZbZclColorLoopFlags {
+ ZCL_COLOR_LOOP_FLAG_UPDATE_ACTION = 0x01,
+ ZCL_COLOR_LOOP_FLAG_UPDATE_DIRECTION = 0x02,
+ ZCL_COLOR_LOOP_FLAG_UPDATE_TIME = 0x04,
+ ZCL_COLOR_LOOP_FLAG_UPDATE_START_HUE = 0x08,
+};
+
+#define ZCL_COLOR_OPTIONS_EXECUTE_IF_OFF 0x01
+
+#define ZCL_COLOR_MODE_DEFAULT 0x01
+#define ZCL_COLOR_OPTIONS_DEFAULT 0x00
+#define ZCL_COLOR_ILLEGAL_HUE 0xFFFF
+#define ZCL_COLOR_MAX_HUE_SAT 0xFE
+#define ZCL_COLOR_X_DEFAULT 0x616B
+#define ZCL_COLOR_X_MAX 0xFEFF
+#define ZCL_COLOR_Y_DEFAULT 0x607D
+#define ZCL_COLOR_Y_MAX 0xFEFF
+#define ZCL_COLOR_TEMP_DEFAULT 0x00FA
+#define ZCL_COLOR_TEMP_MAX 0xFEFF
+#define ZCL_COLOR_LOOP_TIME_DEFAULT 0x0019
+#define ZCL_COLOR_LOOP_START_HUE_DEFAULT 0x2300
+#define ZCL_COLOR_STARTUP_COLOR_TEMP_MAX 0xFFFF
+
+/*-----------------------------------------------------------------------------
+ * Structures
+ *-----------------------------------------------------------------------------
+ */
+struct ZbZclColorClientMoveToHueReqT {
+ uint8_t hue;
+ uint8_t direction;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveHueReqT {
+ uint8_t move_mode;
+ uint8_t rate;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientStepHueReqT {
+ uint8_t step_mode;
+ uint8_t step_size;
+ uint8_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveToSatReqT {
+ uint8_t sat;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveSatReqT {
+ uint8_t move_mode;
+ uint8_t rate;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientStepSatReqT {
+ uint8_t step_mode;
+ uint8_t step_size;
+ uint8_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveToHueSatReqT {
+ uint8_t hue;
+ uint8_t sat;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveToColorXYReqT {
+ uint16_t color_x;
+ uint16_t color_y;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveColorXYReqT {
+ uint16_t rate_x;
+ uint16_t rate_y;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientStepColorXYReqT {
+ uint16_t step_x;
+ uint16_t step_y;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveToColorTempReqT {
+ uint16_t color_temp;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveToHueEnhReqT {
+ uint16_t enh_hue;
+ uint8_t direction;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveHueEnhReqT {
+ uint8_t move_mode;
+ uint16_t rate;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientStepHueEnhReqT {
+ uint8_t step_mode;
+ uint16_t step_size;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveToHueSatEnhReqT {
+ uint16_t enh_hue;
+ uint8_t sat;
+ uint16_t transition_time;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientColorLoopSetReqT {
+ uint8_t update_flags;
+ uint8_t action;
+ uint8_t direction;
+ uint16_t transition_time;
+ uint16_t start_hue;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientStopMoveStepReqT {
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientMoveColorTempReqT {
+ uint8_t move_mode;
+ uint16_t rate;
+ uint16_t color_temp_min;
+ uint16_t color_temp_max;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclColorClientStepColorTempReqT {
+ uint8_t step_mode;
+ uint16_t step_size;
+ uint16_t transition_time;
+ uint16_t color_temp_min;
+ uint16_t color_temp_max;
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+/*-----------------------------------------------------------------------------
+ * Server
+ *-----------------------------------------------------------------------------
+ */
+struct ZbZclColorServerCallbacksT {
+ /* Returns a ZCL Status code to send in the Default Response, or ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE
+ * if no Default Response to be generated. */
+
+ enum ZclStatusCodeT (*move_to_hue)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToHueReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*move_hue)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveHueReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*step_hue)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientStepHueReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move_to_sat)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToSatReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*move_sat)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveSatReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*step_sat)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientStepSatReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move_to_hue_sat)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToHueSatReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move_to_color_xy)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToColorXYReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*move_color_xy)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveColorXYReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*step_color_xy)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientStepColorXYReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move_to_color_temp)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToColorTempReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move_to_hue_enh)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToHueEnhReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*move_hue_enh)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveHueEnhReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*step_hue_enh)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientStepHueEnhReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*move_to_hue_sat_enh)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveToHueSatEnhReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*color_loop_set)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientColorLoopSetReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*stop_move_step)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientStopMoveStepReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move_color_temp)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientMoveColorTempReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*step_color_temp)(struct ZbZclClusterT *cluster,
+ struct ZbZclColorClientStepColorTempReqT *req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+};
+
+struct ZbColorClusterConfig {
+ struct ZbZclColorServerCallbacksT callbacks;
+ uint8_t capabilities; /* e.g. ZCL_COLOR_CAP_HS */
+ bool enhanced_supported;
+};
+
+struct ZbZclClusterT * ZbZclColorServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, struct ZbZclClusterT *onoff_server,
+ const struct ZbZclAttrT *attribute_list, unsigned int num_attrs, struct ZbColorClusterConfig *config, void *arg);
+
+/*-----------------------------------------------------------------------------
+ * Client
+ *-----------------------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclColorClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToHueReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToHueReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveHueReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveHueReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientStepHueReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientStepHueReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToSatReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToSatReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveSatReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveSatReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientStepSatReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientStepSatReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToHueSatReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToHueSatReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToColorXYReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToColorXYReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveColorXYReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveColorXYReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientStepColorXYReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientStepColorXYReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToColorTempReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToColorTempReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToHueEnhReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToHueEnhReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveHueEnhReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveHueEnhReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientStepHueEnhReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientStepHueEnhReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveToHueSatEnhReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveToHueSatEnhReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientColorLoopSetReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientColorLoopSetReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientStopMoveStepReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientStopMoveStepReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientMoveColorTempReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientMoveColorTempReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclColorClientStepColorTempReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclColorClientStepColorTempReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* ZCL_COLOR_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h
new file mode 100644
index 000000000..5674d3aba
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h
@@ -0,0 +1,256 @@
+/* Copyright [2019 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_COMMISSION_H
+# define ZCL_COMMISSION_H
+
+#include "zcl/zcl.h"
+
+/* PICS.ZCL.Commissioning
+ * CS.S | True
+ * CS.C | True
+ *
+ * Server Attributes
+ * CS.S.A0000 | True
+ * CS.S.A0001 | True
+ * CS.S.A0002 | True
+ * CS.S.A0003 | True
+ * CS.S.A0004 | True
+ * CS.S.A0005 | True
+ * CS.S.A0006 | True
+ * CS.S.A0010 | True
+ * CS.S.A0011 | False
+ * CS.S.A0012 | True
+ * CS.S.A0013 | True
+ * CS.S.A0014 | True
+ * CS.S.A0015 | True
+ * CS.S.A0016 | True
+ * CS.S.A0017 | True
+ * CS.S.A0020 | True
+ * CS.S.A0021 | False
+ * CS.S.A0022 | False
+ * CS.S.A0023 | False
+ * CS.S.A0030 | False
+ * CS.S.A0031 | False
+ * CS.S.A0040 | False
+ * CS.S.A0041 | False
+ * CS.S.A0042 | False
+ * CS.S.Afffd | True
+ * CS.S.Afffe | False
+ *
+ * Commands received
+ * CS.S.C00.Rsp | depends on customer application
+ * CS.S.C01.Rsp | depends on customer application
+ * CS.S.C02.Rsp | depends on customer application
+ * CS.S.C03.Rsp | depends on customer application
+ *
+ * Commands generated
+ * CS.S.C00.Tx | depends on customer application
+ * CS.S.C01.Tx | depends on customer application
+ * CS.S.C02.Tx | depends on customer application
+ * CS.S.C03.Tx | depends on customer application
+ *
+ * Client attributes
+ * CS.C.Afffd | True
+ * CS.C.Afffe | False
+ *
+ * Commands received
+ * CS.C.C00.Rsp | depends on customer application
+ * CS.C.C01.Rsp | depends on customer application
+ * CS.C.C02.Rsp | depends on customer application
+ * CS.C.C03.Rsp | depends on customer application
+ *
+ * Commands generated
+ * CS.C.C00.Tx | True
+ * CS.C.C01.Tx | True
+ * CS.C.C02.Tx | True
+ * CS.C.C03.Tx | True
+ */
+
+#define ZCL_COMMISSION_TXOPTIONS_UNSECURE \
+ (ZB_APSDE_DATAREQ_TXOPTIONS_ACK | ZB_APSDE_DATAREQ_TXOPTIONS_FRAG)
+
+#define ZCL_COMMISSION_TXOPTIONS_SECURE \
+ (ZCL_COMMISSION_TXOPTIONS_UNSECURE | ZB_APSDE_DATAREQ_TXOPTIONS_SECURITY)
+
+#define ZCL_COMMISSION_RESTART_DEVICE_DELAY_MS 100U
+
+enum ZbZclCommissionServerCommandsT {
+ ZCL_COMMISSION_SVR_CMD_RESTART_DEVICE_RSP = 0x00,
+ ZCL_COMMISSION_SVR_CMD_SAVE_STARTUP_RSP = 0x01,
+ ZCL_COMMISSION_SVR_CMD_RESTORE_STARTUP_RSP = 0x02,
+ ZCL_COMMISSION_SVR_CMD_RESET_STARTUP_RSP = 0x03
+};
+
+enum ZbZclCommissionClientCommandsT {
+ ZCL_COMMISSION_CLI_CMD_RESTART_DEVICE = 0x00,
+ ZCL_COMMISSION_CLI_CMD_SAVE_STARTUP = 0x01,
+ ZCL_COMMISSION_CLI_CMD_RESTORE_STARTUP = 0x02,
+ ZCL_COMMISSION_CLI_CMD_RESET_STARTUP = 0x03
+};
+
+enum ZbZclCommissionServerAttrT {
+ /* Startup Parameters */
+ ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR = 0x0000,
+ ZCL_COMMISSION_CLI_ATTR_EPID = 0x0001,
+ ZCL_COMMISSION_CLI_ATTR_PANID = 0x0002,
+ ZCL_COMMISSION_CLI_ATTR_CHANNELMASK = 0x0003,
+ ZCL_COMMISSION_CLI_ATTR_PROTOCOLVER = 0x0004,
+ ZCL_COMMISSION_CLI_ATTR_STACKPROFILE = 0x0005,
+ ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL = 0x0006,
+ ZCL_COMMISSION_CLI_ATTR_TCADDR = 0x0010,
+ ZCL_COMMISSION_CLI_ATTR_TCMASTER = 0x0011,
+ ZCL_COMMISSION_CLI_ATTR_NWKKEY = 0x0012,
+ ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN = 0x0013,
+ ZCL_COMMISSION_CLI_ATTR_PRECONFLINKKEY = 0x0014,
+ ZCL_COMMISSION_CLI_ATTR_NWKKEYSEQNUM = 0x0015,
+ ZCL_COMMISSION_CLI_ATTR_NWKKEYTYPE = 0x0016,
+ ZCL_COMMISSION_CLI_ATTR_NWKMGRADDR = 0x0017,
+
+ /* Join Parameters */
+ ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS = 0x0020,
+ ZCL_COMMISSION_CLI_ATTR_TIMEBTWSCANS = 0x0021,
+ ZCL_COMMISSION_CLI_ATTR_REJOININTERVAL = 0x0022,
+ ZCL_COMMISSION_CLI_ATTR_MAXREJOININTERVAL = 0x0023,
+
+ /* End Device Parameters */
+ ZCL_COMMISSION_CLI_ATTR_POLLRATE = 0x0030,
+ ZCL_COMMISSION_CLI_ATTR_PARENTRETRYTHRESH = 0x0031,
+
+ /* Concentrator Parameters */
+ ZCL_COMMISSION_CLI_ATTR_CONCFLAG = 0x0040,
+ ZCL_COMMISSION_CLI_ATTR_CONCRADIUS = 0x0041,
+ ZCL_COMMISSION_CLI_ATTR_CONCDISCTIME = 0x0042
+};
+
+/* Options Field */
+#define ZCL_COMMISSION_OPTIONS_MODE_MASK 0x07U
+#define ZCL_COMMISSION_OPTIONS_MODE_USE_NEW 0x00U
+#define ZCL_COMMISSION_OPTIONS_MODE_USE_CURRENT 0x01U
+/* Reserved Mode bits: 2 */
+#define ZCL_COMMISSION_OPTIONS_IMMEDIATE 0x08U
+/* Reserved Options Field bits: 4..7 */
+
+/*** Client Commands (Requests) */
+struct ZbZclCommissionClientRestartDev {
+ uint8_t options; /* e.g. ZCL_COMMISSION_OPTIONS_MODE_MASK */
+ uint8_t delay; /* seconds */
+ uint8_t jitter; /* RAND(jitter * 80) milliseconds */
+};
+
+struct ZbZclCommissionClientSaveStartup {
+ uint8_t options; /* Startup Mode, ... */
+ uint8_t index;
+};
+
+struct ZbZclCommissionClientRestoreStartup {
+ uint8_t options; /* Startup Mode, ... */
+ uint8_t index;
+};
+
+struct ZbZclCommissionClientResetStartup {
+ uint8_t options; /* Startup Mode, ... */
+ uint8_t index;
+};
+
+/*** Server Commands (Responses) */
+struct ZbZclCommissionServerRestartDevRsp {
+ enum ZclStatusCodeT status;
+};
+
+struct ZbZclCommissionServerSaveStartupRsp {
+ enum ZclStatusCodeT status;
+};
+
+struct ZbZclCommissionServerRestoreStartupRsp {
+ enum ZclStatusCodeT status;
+};
+
+struct ZbZclCommissionServerResetStartupRsp {
+ enum ZclStatusCodeT status;
+};
+
+struct ZbZclCommissionServerEnableInfoT {
+ uint8_t page;
+ uint8_t channel;
+};
+
+struct ZbZclCommissionClientEnableInfoT {
+ uint8_t page;
+ uint8_t channel;
+};
+
+/*** Server API ***/
+
+/**
+ * Commissioning Server Cluster Callbacks
+ */
+struct ZbZclCommissionServerCallbacksT {
+ enum ZclStatusCodeT (*restart_device)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclCommissionClientRestartDev *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Restart Device Request callback. Should call ZbZclCommissionServerSendRestartRsp
+ * to send response. Since the application will end up calling ZbStartup or similar, the
+ * application must wait and let the stack send the response before something like ZbStartup
+ * is called. 100 milliseconds should be sufficient (ZCL_COMMISSION_RESTART_DEVICE_DELAY_MS). */
+
+ enum ZclStatusCodeT (*save_startup)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclCommissionClientSaveStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Save Startup Request callback */
+
+ enum ZclStatusCodeT (*restore_startup)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclCommissionClientRestoreStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Restore Startup Request callback */
+
+ enum ZclStatusCodeT (*reset_startup)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclCommissionClientResetStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Reset Startup Request callback */
+};
+
+struct ZbZclClusterT * ZbZclCommissionServerAlloc(struct ZigBeeT *zb, uint16_t profile, bool aps_secured,
+ struct ZbZclCommissionServerCallbacksT *callbacks, void *arg);
+
+/* Helper function to load the startup configuration from the Cluster Server's Attributes
+ * into the ZbStartupT struct. */
+enum ZclStatusCodeT ZbZclCommissionServerGetStartup(struct ZbZclClusterT *clusterPtr, struct ZbStartupT *config);
+
+/* Helper to configure MAC layer to listen for packets
+ * If info = NULL, then Commissioning Server will stop processing any received Commissioning
+ * packets. */
+enum ZclStatusCodeT ZbZclCommissionServerEnable(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclCommissionServerEnableInfoT *info);
+
+enum ZclStatusCodeT ZbZclCommissionServerSendRestartRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerRestartDevRsp *rsp);
+
+enum ZclStatusCodeT ZbZclCommissionServerSendSaveStartupRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerSaveStartupRsp *rsp);
+
+enum ZclStatusCodeT ZbZclCommissionServerSendRestoreStartupRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerRestoreStartupRsp *rsp);
+
+enum ZclStatusCodeT ZbZclCommissionServerSendResetStartupRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerResetStartupRsp *rsp);
+
+/*** Client API */
+struct ZbZclClusterT * ZbZclCommissionClientAlloc(struct ZigBeeT *zb, uint16_t profile, bool aps_secured);
+
+/* Helper to configure MAC layer to listen for packets */
+enum ZclStatusCodeT ZbZclCommissionClientEnable(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclCommissionClientEnableInfoT *info);
+
+enum ZclStatusCodeT ZbZclCommissionClientSendRestart(struct ZbZclClusterT *clusterPtr, uint64_t ext_addr,
+ struct ZbZclCommissionClientRestartDev *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclCommissionClientSendSaveStartup(struct ZbZclClusterT *clusterPtr, uint64_t ext_addr,
+ struct ZbZclCommissionClientSaveStartup *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclCommissionClientSendRestoreStartup(struct ZbZclClusterT *clusterPtr, uint64_t ext_addr,
+ struct ZbZclCommissionClientRestoreStartup *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclCommissionClientSendResetStartup(struct ZbZclClusterT *clusterPtr, uint64_t ext_addr,
+ struct ZbZclCommissionClientResetStartup *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* ZCL_COMMISSION_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.dehum.ctrl.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.dehum.ctrl.h
new file mode 100644
index 000000000..20579ab54
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.dehum.ctrl.h
@@ -0,0 +1,40 @@
+/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_DEHUM_CTRL_H
+#define ZCL_DEHUM_CTRL_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Dehumidification Control
+ * cluster.
+ *--------------------------------------------------------------------------
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_DEHUM_CTRL_ATTR_REL_HUM = 0x0000,
+ ZCL_DEHUM_CTRL_ATTR_DEHUM_COOLING = 0x0001,
+ ZCL_DEHUM_CTRL_ATTR_RHDH_SETPT = 0x0010,
+ ZCL_DEHUM_CTRL_ATTR_RH_MODE = 0x0011,
+ ZCL_DEHUM_CTRL_ATTR_DH_LOCKOUT = 0x0012,
+ ZCL_DEHUM_CTRL_ATTR_DH_HYS = 0x0013,
+ ZCL_DEHUM_CTRL_ATTR_DH_MAX_COOL = 0x0014,
+ ZCL_DEHUM_CTRL_ATTR_RH_DISPLAY = 0x0015
+};
+
+/* Dehumidification Control Defines */
+#define ZCL_DEHUM_CTRL_UNKNOWN 0xff
+#define ZCL_DEHUM_CTRL_RHDH_SETPT_DEFAULT 0x32
+#define ZCL_DEHUM_CTRL_DH_HYS_DEFAULT 0x02
+#define ZCL_DEHUM_CTRL_DH_MAX_COOL_DEFAULT 0x14
+
+/*---------------------------------------------------------------
+ * Dehumidification Control Cluster Definitions
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclDehumCtrlClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclDehumCtrlServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+#endif /* __ZCL_DEHUM_CTRL_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h
new file mode 100644
index 000000000..2e8f52f92
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h
@@ -0,0 +1,111 @@
+/* Copyright [2019 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_DIAGNOSTICS_H
+#define ZCL_DIAGNOSTICS_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Diagnostics Cluster
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.Diagnostics
+ * DIAG.S | True
+ * DIAG.C | True
+ *
+ * Server Attributes
+ * DIAG.S.A0000 | False
+ * DIAG.S.A0001 | False
+ * DIAG.S.A0100 | True
+ * DIAG.S.A0101 | True
+ * DIAG.S.A0102 | True
+ * DIAG.S.A0103 | True
+ * DIAG.S.A0104 | True
+ * DIAG.S.A0105 | True
+ * DIAG.S.A0106 | True
+ * DIAG.S.A0107 | True
+ * DIAG.S.A0108 | True
+ * DIAG.S.A0109 | True
+ * DIAG.S.A010a | True
+ * DIAG.S.A010b | True
+ * DIAG.S.A010c | True
+ * DIAG.S.A010d | True
+ * DIAG.S.A010e | True
+ * DIAG.S.A010f | True
+ * DIAG.S.A0110 | True
+ * DIAG.S.A0111 | True
+ * DIAG.S.A0112 | True
+ * DIAG.S.A0113 | True
+ * DIAG.S.A0114 | False
+ * DIAG.S.A0115 | True
+ * DIAG.S.A0116 | True
+ * DIAG.S.A0117 | True
+ * DIAG.S.A0118 | True
+ * DIAG.S.A0119 | False
+ * DIAG.S.A011a | True
+ * DIAG.S.A011b | False
+ * DIAG.S.A011c | True
+ * DIAG.S.A011d | True
+ * DIAG.S.Afffd | True
+ * DIAG.S.Afffe | False
+ *
+ * Client Attributes
+ * ILLVL.C.Afffd | True
+ * ILLVL.C.Afffe | False
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_DIAG_ATTR_RESETS = 0x0000,
+ ZCL_DIAG_ATTR_PERSIST_WRITES = 0x0001,
+ ZCL_DIAG_ATTR_MAC_RX_BCAST = 0x0100,
+ ZCL_DIAG_ATTR_MAC_TX_BCAST = 0x0101,
+ ZCL_DIAG_ATTR_MAC_RX_UCAST = 0x0102,
+ ZCL_DIAG_ATTR_MAC_TX_UCAST = 0x0103,
+ ZCL_DIAG_ATTR_MAC_TX_UCAST_RETRY = 0x0104,
+ ZCL_DIAG_ATTR_MAC_TX_UCAST_FAIL = 0x0105,
+ ZCL_DIAG_ATTR_APS_RX_BCAST = 0x0106,
+ ZCL_DIAG_ATTR_APS_TX_BCAST = 0x0107,
+ ZCL_DIAG_ATTR_APS_RX_UCAST = 0x0108,
+ ZCL_DIAG_ATTR_APS_TX_UCAST_SUCCESS = 0x0109,
+ ZCL_DIAG_ATTR_APS_TX_UCAST_RETRY = 0x010a,
+ ZCL_DIAG_ATTR_APS_TX_UCAST_FAIL = 0x010b,
+ ZCL_DIAG_ATTR_ROUTE_DISC_INIT = 0x010c,
+ ZCL_DIAG_ATTR_NEIGHBOR_ADDED = 0x010d,
+ ZCL_DIAG_ATTR_NEIGHBOUR_REMOVED = 0x010e,
+ ZCL_DIAG_ATTR_NEIGHBOUR_STALE = 0x010f,
+ ZCL_DIAG_ATTR_JOIN_IND = 0x0110,
+ ZCL_DIAG_ATTR_CHILD_MOVED = 0x0111,
+ ZCL_DIAG_ATTR_NWK_FC_FAILURE = 0x0112,
+ ZCL_DIAG_ATTR_APS_FC_FAILURE = 0x0113,
+ ZCL_DIAG_ATTR_APS_UNAUTH_KEY = 0x0114,
+ ZCL_DIAG_ATTR_NWK_DECRYPT_FAILS = 0x0115,
+ ZCL_DIAG_ATTR_APS_DECRYPT_FAILS = 0x0116,
+ ZCL_DIAG_ATTR_PACKET_BUF_ALLOC_FAILS = 0x0117,
+ ZCL_DIAG_ATTR_RELAYED_UCAST = 0x0118,
+ ZCL_DIAG_ATTR_PHY_MAC_QUEUE_LIM = 0x0119,
+ ZCL_DIAG_ATTR_PACKET_VAL_DROP_COUNT = 0x011a,
+ ZCL_DIAG_ATTR_AVG_MAC_RETRY_PER_APS_MSG = 0x011b,
+ ZCL_DIAG_ATTR_LAST_MSG_LQI = 0x011c,
+ ZCL_DIAG_ATTR_LAST_MSG_RSSI = 0x011d,
+};
+
+/*---------------------------------------------------------------
+ * Diagnostics Client
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclDiagnosticsClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+/*---------------------------------------------------------------
+ * Diagnostics Server
+ *---------------------------------------------------------------
+ */
+/* endpoint - set the Endpoint for this cluster */
+/* profileId - set the Profile ID, unless set to ZCL_PROFILE_WILDCARD. */
+/* minSecurity - can be either: ZB_APS_STATUS_UNSECURED, ZB_APS_STATUS_SECURED_NWK_KEY, or ZB_APS_STATUS_SECURED_LINK_KEY */
+/* Note, only one diagnostics server can be allocated on the device. */
+bool ZbZclDiagnosticsServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, uint16_t profileId, enum ZbStatusCodeT minSecurity);
+
+#endif /* __ZCL_DIAGNOSTICS_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h
new file mode 100644
index 000000000..72988cd4f
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h
@@ -0,0 +1,946 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_DOORLOCK_H
+#define ZCL_DOORLOCK_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL OnOff cluster.
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.Doorlock
+ * DRLK.S | True
+ * DRLK.C | True
+ *
+ * Server Attributes
+ * DRLK.S.A0000 | True
+ * DRLK.S.A0001 | True
+ * DRLK.S.A0002 | True
+ * DRLK.S.A0003 | False
+ * DRLK.S.A0004 | False
+ * DRLK.S.A0005 | False
+ * DRLK.S.A0006 | False
+ * DRLK.S.A0010 | False
+ * DRLK.S.A0011 | False
+ * DRLK.S.A0012 | False
+ * DRLK.S.A0013 | False
+ * DRLK.S.A0014 | False
+ * DRLK.S.A0015 | False
+ * DRLK.S.A0016 | False
+ * DRLK.S.A0017 | True
+ * DRLK.S.A0018 | True
+ * DRLK.S.A0019 | True
+ * DRLK.S.A001a | True
+ * DRLK.S.A0020 | False
+ * DRLK.S.A0021 | True
+ * DRLK.S.A0022 | False
+ * DRLK.S.A0023 | False
+ * DRLK.S.A0024 | False
+ * DRLK.S.A0025 | False
+ * DRLK.S.A0026 | True
+ * DRLK.S.A0027 | False
+ * DRLK.S.A0028 | True
+ * DRLK.S.A0029 | False
+ * DRLK.S.A002a | False
+ * DRLK.S.A002b | False
+ * DRLK.S.A0030 | False
+ * DRLK.S.A0031 | False
+ * DRLK.S.A0032 | False
+ * DRLK.S.A0033 | False
+ * DRLK.S.A0034 | False
+ * DRLK.S.A0040 | False
+ * DRLK.S.A0041 | False
+ * DRLK.S.A0042 | False
+ * DRLK.S.A0043 | False
+ * DRLK.S.A0044 | False
+ * DRLK.S.A0045 | False
+ * DRLK.S.A0046 | False
+ * DRLK.S.A0047 | False
+ * DRLK.S.Afffd | True
+ * DRLK.S.Afffe | False
+ *
+ * Commands Received
+ * DRLK.S.C00.Rsp | True
+ * DRLK.S.C01.Rsp | True
+ * DRLK.S.C02.Rsp | True
+ * DRLK.S.C03.Rsp | False
+ * DRLK.S.C04.Rsp | False
+ * DRLK.S.C05.Rsp | False
+ * DRLK.S.C06.Rsp | False
+ * DRLK.S.C07.Rsp | False
+ * DRLK.S.C08.Rsp | False
+ * DRLK.S.C09.Rsp | False
+ * DRLK.S.C0a.Rsp | False
+ * DRLK.S.C0b.Rsp | False
+ * DRLK.S.C0c.Rsp | False
+ * DRLK.S.C0d.Rsp | False
+ * DRLK.S.C0e.Rsp | False
+ * DRLK.S.C0f.Rsp | False
+ * DRLK.S.C10.Rsp | False
+ * DRLK.S.C11.Rsp | False
+ * DRLK.S.C12.Rsp | False
+ * DRLK.S.C13.Rsp | False
+ * DRLK.S.C14.Rsp | False
+ * DRLK.S.C15.Rsp | False
+ * DRLK.S.C16.Rsp | False
+ * DRLK.S.C17.Rsp | False
+ * DRLK.S.C18.Rsp | False
+ * DRLK.S.C19.Rsp | False
+ *
+ * Commands Generated
+ * DRLK.S.C00.Tx | True
+ * DRLK.S.C01.Tx | True
+ * DRLK.S.C02.Tx | True
+ * DRLK.S.C03.Tx | False
+ * DRLK.S.C04.Tx | False
+ * DRLK.S.C05.Tx | False
+ * DRLK.S.C06.Tx | False
+ * DRLK.S.C07.Tx | False
+ * DRLK.S.C08.Tx | False
+ * DRLK.S.C09.Tx | False
+ * DRLK.S.C0a.Tx | False
+ * DRLK.S.C0b.Tx | False
+ * DRLK.S.C0c.Tx | False
+ * DRLK.S.C0d.Tx | False
+ * DRLK.S.C0e.Tx | False
+ * DRLK.S.C0f.Tx | False
+ * DRLK.S.C10.Tx | False
+ * DRLK.S.C11.Tx | False
+ * DRLK.S.C12.Tx | False
+ * DRLK.S.C13.Tx | False
+ * DRLK.S.C14.Tx | False
+ * DRLK.S.C15.Tx | False
+ * DRLK.S.C16.Tx | False
+ * DRLK.S.C17.Tx | False
+ * DRLK.S.C18.Tx | False
+ * DRLK.S.C19.Tx | False
+ * DRLK.S.C20.Tx | False
+ * DRLK.S.C21.Tx | False
+ *
+ *
+ * Client Attributes
+ * DRLK.C.Afffd | True
+ * DRLK.C.Afffe | False
+ *
+ * Commands Received
+ * DRLK.C.C00.Rsp | True
+ * DRLK.C.C01.Rsp | True
+ * DRLK.C.C02.Rsp | True
+ * DRLK.C.C03.Rsp | False
+ * DRLK.C.C04.Rsp | False
+ * DRLK.C.C05.Rsp | False
+ * DRLK.C.C06.Rsp | False
+ * DRLK.C.C07.Rsp | False
+ * DRLK.C.C08.Rsp | False
+ * DRLK.C.C09.Rsp | False
+ * DRLK.C.C0a.Rsp | False
+ * DRLK.C.C0b.Rsp | False
+ * DRLK.C.C0c.Rsp | False
+ * DRLK.C.C0d.Rsp | False
+ * DRLK.C.C0e.Rsp | False
+ * DRLK.C.C0f.Rsp | False
+ * DRLK.C.C10.Rsp | False
+ * DRLK.C.C11.Rsp | False
+ * DRLK.C.C12.Rsp | False
+ * DRLK.C.C13.Rsp | False
+ * DRLK.C.C14.Rsp | False
+ * DRLK.C.C15.Rsp | False
+ * DRLK.C.C16.Rsp | False
+ * DRLK.C.C17.Rsp | False
+ * DRLK.C.C18.Rsp | False
+ * DRLK.C.C19.Rsp | False
+ * DRLK.C.C20.Rsp | False
+ * DRLK.C.C21.Rsp | False
+ *
+ * Commands Generated
+ * DRLK.C.C00.Tx | True
+ * DRLK.C.C01.Tx | True
+ * DRLK.C.C02.Tx | True
+ * DRLK.C.C03.Tx | False
+ * DRLK.C.C04.Tx | False
+ * DRLK.C.C05.Tx | False
+ * DRLK.C.C06.Tx | False
+ * DRLK.C.C07.Tx | False
+ * DRLK.C.C08.Tx | False
+ * DRLK.C.C09.Tx | False
+ * DRLK.C.C0a.Tx | False
+ * DRLK.C.C0b.Tx | False
+ * DRLK.C.C0c.Tx | False
+ * DRLK.C.C0d.Tx | False
+ * DRLK.C.C0e.Tx | False
+ * DRLK.C.C0f.Tx | False
+ * DRLK.C.C10.Tx | False
+ * DRLK.C.C11.Tx | False
+ * DRLK.C.C12.Tx | False
+ * DRLK.C.C13.Tx | False
+ * DRLK.C.C14.Tx | False
+ * DRLK.C.C15.Tx | False
+ * DRLK.C.C16.Tx | False
+ * DRLK.C.C17.Tx | False
+ * DRLK.C.C18.Tx | False
+ * DRLK.C.C19.Tx | False
+ */
+
+/* DoorLock Cluster Attributes */
+enum {
+ ZCL_DOORLOCK_ATTR_LOCKSTATE = 0x0000, /* R- mandatory! */
+ ZCL_DOORLOCK_ATTR_LOCKTYPE = 0x0001, /* R- mandatory! */
+ ZCL_DOORLOCK_ATTR_ACT_ENABLED = 0x0002, /* R- mandatory! */
+ ZCL_DOORLOCK_ATTR_DOORSTATE = 0x0003, /* R- Optional. */
+ ZCL_DOORLOCK_ATTR_OPENEVENTS = 0x0004, /* R/W- Optional*/
+ ZCL_DOORLOCK_ATTR_CLOSEDEVENTS = 0x0005, /* R/W- Optional*/
+ ZCL_DOORLOCK_ATTR_OPENPERIOD = 0x0006, /* R/W- Optional*/
+ /* User/PIN/Schedule/Log attributes - all optional. */
+ ZCL_DOORLOCK_ATTR_NUM_LOGRECORDS = 0x0010, /* R */
+ ZCL_DOORLOCK_ATTR_NUM_TOTALUSERS = 0x0011, /* R */
+ ZCL_DOORLOCK_ATTR_NUM_PINUSERS = 0x0012, /* R */
+ ZCL_DOORLOCK_ATTR_NUM_RFIDUSERS = 0x0013, /* R */
+ ZCL_DOORLOCK_ATTR_NUM_WD_SCHEDULES = 0x0014, /* R - weekday schedule*/
+ ZCL_DOORLOCK_ATTR_NUM_YD_SCHEDULES = 0x0015, /* R - yearday schedule*/
+ ZCL_DOORLOCK_ATTR_NUM_HD_SCHEDULES = 0x0016, /* R - holiday schedule*/
+ ZCL_DOORLOCK_ATTR_MAX_PIN_LEN = 0x0017, /* R - max pin code len. */
+ ZCL_DOORLOCK_ATTR_MIN_PIN_LEN = 0x0018, /* R - min pin code len. */
+ ZCL_DOORLOCK_ATTR_MAX_RFID_LEN = 0x0019, /* R - min pin code len. */
+ ZCL_DOORLOCK_ATTR_MIN_RFID_LEN = 0x001A, /* R - min pin code len. */
+ /* Operational Settings. - all optional. */
+ ZCL_DOORLOCK_ATTR_LOGGING = 0x0020, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_LANGUAGE = 0x0021, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_LED_SETTINGS = 0x0022, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_AUTO_RELOCK = 0x0023, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_VOLUME = 0x0024, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_MODE = 0x0025, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_SUPPORTED_MODES = 0x0026, /* R */
+ ZCL_DOORLOCK_ATTR_DEF_CFG = 0x0027, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_LOCAL_PROG = 0x0028, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_ONETOUCH_LOCK = 0x0029, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_INSIDE_STATUS = 0x002A, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_PRIV_BUTTON = 0x002B, /* R/W-Report */
+ /* Security Settings. - all optional. */
+ ZCL_DOORLOCK_ATTR_WRONGCODE_LIMIT = 0x0030, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_TEMP_DISABLE = 0x0031, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_PIN_OTA = 0x0032, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_PIN_FOR_RF = 0x0033, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_SEC_LEVEL = 0x0034, /* R/W-Report */
+ /* Alarms and Event masks. - all optional. */
+ ZCL_DOORLOCK_ATTR_ALARM_MASK = 0x0040, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_KEYPAD_OP_EVENT_MASK = 0x0041, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_RF_OP_EVENT_MASK = 0x0042, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_MANUAL_OP_EVENT_MASK = 0x0043, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_RFID_EVENT_MASK = 0x0044, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_KEYPAD_EVENT_MASK = 0x0045, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_RF_PROG_EVENT_MASK = 0x0046, /* R/W-Report */
+ ZCL_DOORLOCK_ATTR_RFID_PROG_EVENT_MASK = 0x0047 /* R/W-Report */
+};
+
+/* Default Values */
+#define DOORLOCK_LOGRECORDS_DEFAULT 0
+#define DOORLOCK_TOTALUSERS_DEFAULT 0
+#define DOORLOCK_PINUSERS_DEFAULT 0
+#define DOORLOCK_RFIDUSERS_DEFAULT 0
+#define DOORLOCK_WD_SCHEDULES_DEFAULT 0
+#define DOORLOCK_YD_SCHEDULES_DEFAULT 0
+#define DOORLOCK_HD_SCHEDULES_DEFAULT 0
+#define DOORLOCK_AUTO_RELOCK_DEFAULT 0
+#define DOORLOCK_MODE_DEFAULT 0
+#define DOORLOCK_BADCODE_LIMIT_DEFAULT 0
+#define DOORLOCK_TEMP_DISABLE_DEFAULT 0
+#define DOORLOCK_PIN_FOR_RF_DEFAULT 0
+#define DOORLOCK_SEC_LEVEL_DEFAULT 0
+#define DOORLOCK_ALARM_DEFAULT 0
+
+/* LOCKSTATE attribute values */
+#define DOORLOCK_LOCKSTATE_NOTFULLYLOCKED 0
+#define DOORLOCK_LOCKSTATE_LOCKED 1
+#define DOORLOCK_LOCKSTATE_UNLOCKED 2
+#define DOORLOCK_LOCKSTATE_UNDEFINED 0xFF
+
+/* LOCKTYPE attributes... many of these set yours accordingly. */
+#define DOORLOCK_LOCKTYPE 0x00
+
+/* ACT_ENABLED attribute values */
+#define DOORLOCK_ACT_ENABLED_DISABLED 0
+#define DOORLOCK_ACT_ENABLED_ENABLED 1
+
+/* Min and Max Values */
+#define DOORLOCK_MAX_PIN 0x08
+#define DOORLOCK_MIN_PIN 0x04
+#define DOORLOCK_MAX_RFID 0x14
+#define DOORLOCK_MIN_RFID 0x08
+#define DOORLOCK_MAX_USERS 0x10
+#define DOORLOCK_MAX_PIN_USERS 0x08
+#define DOORLOCK_MAX_RFID_USERS 0x08
+#define DOORLOCK_WD_SCHED_SUPP 0x02
+#define DOORLOCK_YD_SCHED_SUPP 0x02
+#define DOORLOCK_HD_SCHED_SUPP 0x02
+
+/* User Status Values */
+#define DOORLOCK_USER_STATUS_AVAILABLE (uint8_t)0x00
+#define DOORLOCK_USER_STATUS_OCC_ENABLED (uint8_t)0x01
+#define DOORLOCK_USER_STATUS_OCC_DISABLED (uint8_t)0x03
+#define DOORLOCK_USER_STATUS_NOT_SUPP (uint8_t)0xFF
+
+/* User Type Values */
+#define DOORLOCK_USER_TYPE_UNRESTRICTED (uint8_t)0x00
+#define DOORLOCK_USER_TYPE_YD_SCHEDULE (uint8_t)0x01
+#define DOORLOCK_USER_TYPE_WD_SCHEDULE (uint8_t)0x02
+#define DOORLOCK_USER_TYPE_MASTER (uint8_t)0x03
+#define DOORLOCK_USER_TYPE_NON_ACCESS (uint8_t)0x04
+#define DOORLOCK_USER_TYPE_NOT_SUPPORTED (uint8_t)0xFF
+
+/* Response Status Values */
+#define DOORLOCK_STATUS_SUCCESS (uint8_t)0x0
+#define DOORLOCK_STATUS_GENERAL_FAILURE (uint8_t)0x1
+#define DOORLOCK_STATUS_MEM_FULL (uint8_t)0x2
+#define DOORLOCK_STATUS_DUPLICATE (uint8_t)0x3
+
+/* Schedule Values */
+#define DOORLOCK_HOURS_LIMIT (uint8_t)0x17
+#define DOORLOCK_MINUTES_LIMIT (uint8_t)0x3B
+
+/* Security Settings */
+#define DOORLOCK_PIN_REQUIRED 1
+#define DOORLOCK_PIN_NOT_REQUIRED 0
+
+/* Client Generated Commands */
+enum {
+ ZCL_DOORLOCK_CLI_LOCK = 0x00, /* Mandatory */
+ ZCL_DOORLOCK_CLI_UNLOCK = 0x01, /* Mandatory */
+ ZCL_DOORLOCK_CLI_TOGGLE = 0x02,
+ ZCL_DOORLOCK_CLI_UNLOCK_TIMEOUT = 0x03,
+ ZCL_DOORLOCK_CLI_GET_LOG = 0x04,
+ ZCL_DOORLOCK_CLI_SETPIN = 0x05,
+ ZCL_DOORLOCK_CLI_GETPIN = 0x06,
+ ZCL_DOORLOCK_CLI_CLRPIN = 0x07,
+ ZCL_DOORLOCK_CLI_CLR_ALL_PINS = 0x08,
+ ZCL_DOORLOCK_CLI_SETUSER_STATUS = 0x09,
+ ZCL_DOORLOCK_CLI_GETUSER_STATUS = 0x0a,
+ ZCL_DOORLOCK_CLI_SETWD_SCHED = 0x0b,
+ ZCL_DOORLOCK_CLI_GETWD_SCHED = 0x0c,
+ ZCL_DOORLOCK_CLI_CLRWD_SCHED = 0x0d,
+ ZCL_DOORLOCK_CLI_SETYD_SCHED = 0x0e,
+ ZCL_DOORLOCK_CLI_GETYD_SCHED = 0x0f,
+ ZCL_DOORLOCK_CLI_CLRYD_SCHED = 0x10,
+ ZCL_DOORLOCK_CLI_SETHD_SCHED = 0x11,
+ ZCL_DOORLOCK_CLI_GETHD_SCHED = 0x12,
+ ZCL_DOORLOCK_CLI_CLRHD_SCHED = 0x13,
+ ZCL_DOORLOCK_CLI_SET_USERTYPE = 0x14,
+ ZCL_DOORLOCK_CLI_GET_USERTYPE = 0x15,
+ ZCL_DOORLOCK_CLI_SET_RFID = 0x16,
+ ZCL_DOORLOCK_CLI_GET_RFID = 0x17,
+ ZCL_DOORLOCK_CLI_CLR_RFID = 0x18,
+ ZCL_DOORLOCK_CLI_CLR_ALL_RFIDS = 0x19
+};
+
+/* Server Generated Commands */
+enum {
+ ZCL_DOORLOCK_SVR_LOCK_RSP = 0x00, /* Mandatory */
+ ZCL_DOORLOCK_SVR_UNLOCK_RSP = 0x01, /* Mandatory */
+ ZCL_DOORLOCK_SVR_TOGGLE_RSP = 0x02,
+ ZCL_DOORLOCK_SVR_UNLOCK_TO_RSP = 0x03,
+ ZCL_DOORLOCK_SVR_GET_LOG_RSP = 0x04,
+ ZCL_DOORLOCK_SVR_SETPIN_RSP = 0x05,
+ ZCL_DOORLOCK_SVR_GETPIN_RSP = 0x06,
+ ZCL_DOORLOCK_SVR_CLRPIN_RSP = 0x07,
+ ZCL_DOORLOCK_SVR_CLR_ALL_PINS_RSP = 0x08,
+ ZCL_DOORLOCK_SVR_SETUSER_STATUS_RSP = 0x09,
+ ZCL_DOORLOCK_SVR_GETUSER_STATUS_RSP = 0x0a,
+ ZCL_DOORLOCK_SVR_SETWD_SCHED_RSP = 0x0b,
+ ZCL_DOORLOCK_SVR_GETWD_SCHED_RSP = 0x0c,
+ ZCL_DOORLOCK_SVR_CLRWD_SCHED_RSP = 0x0d,
+ ZCL_DOORLOCK_SVR_SETYD_SCHED_RSP = 0x0e,
+ ZCL_DOORLOCK_SVR_GETYD_SCHED_RSP = 0x0f,
+ ZCL_DOORLOCK_SVR_CLRYD_SCHED_RSP = 0x10,
+ ZCL_DOORLOCK_SVR_SETHD_SCHED_RSP = 0x11,
+ ZCL_DOORLOCK_SVR_GETHD_SCHED_RSP = 0x12,
+ ZCL_DOORLOCK_SVR_CLRHD_SCHED_RSP = 0x13,
+ ZCL_DOORLOCK_SVR_SET_USERTYPE_RSP = 0x14,
+ ZCL_DOORLOCK_SVR_GET_USERTYPE_RSP = 0x15,
+ ZCL_DOORLOCK_SVR_SET_RFID_RSP = 0x16,
+ ZCL_DOORLOCK_SVR_GET_RFID_RSP = 0x17,
+ ZCL_DOORLOCK_SVR_CLR_RFID_RSP = 0x18,
+ ZCL_DOORLOCK_SVR_CLR_ALL_RFIDS_RSP = 0x19,
+ /* Warning, discontinuity from 0x19 to 0x20 (someone can't count in hex?) */
+ /* Notifications */
+ ZCL_DOORLOCK_SVR_OPER_EVENT_NOTIFY = 0x20,
+ ZCL_DOORLOCK_SVR_PROG_EVENT_NOTIFY = 0x21
+};
+
+/*---------------------------------------------------------------
+ * Client
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclDoorLockClientAlloc(struct ZigBeeT *zb, uint8_t ep);
+
+/*---------------------------------------------------------------
+ * Client Lock/Unlock Helper
+ *---------------------------------------------------------------
+ */
+
+/* One of:
+ * ZCL_DOORLOCK_CLI_LOCK
+ * ZCL_DOORLOCK_CLI_UNLOCK
+ * ZCL_DOORLOCK_CLI_TOGGLE
+ * ZCL_DOORLOCK_CLI_UNLOCK_TIMEOUT
+ */
+
+/* ZCL_DOORLOCK_CLI_LOCK */
+struct ZbZclDoorLockLockDoorReqT {
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockClientLockReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockLockDoorReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockLockDoorRspT {
+ uint8_t status;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockServerSendLockRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockLockDoorRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/* ZCL_DOORLOCK_CLI_UNLOCK */
+struct ZbZclDoorLockUnlockDoorReqT {
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockClientUnlockReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockUnlockDoorReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockUnlockDoorRspT {
+ uint8_t status;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockServerSendUnlockRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockUnlockDoorRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/* ZCL_DOORLOCK_CLI_TOGGLE */
+struct ZbZclDoorLockToggleReqT {
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockClientToggleReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockToggleReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockToggleRspT {
+ uint8_t status;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockServerSendToggleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockToggleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/* ZCL_DOORLOCK_CLI_UNLOCK_TIMEOUT */
+struct ZbZclDoorLockUnlockTimeoutReqT {
+ uint16_t timeout;
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockClientUnlockTimeoutReq(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockUnlockTimeoutReqT *cmd_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockUnlockTimeoutRspT {
+ uint8_t status;
+};
+
+enum ZclStatusCodeT ZbZclDoorLockServerSendUnlockTimeoutRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockUnlockTimeoutRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get Log Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetLogReqT {
+ uint16_t log_index;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetLogReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetLogReqT *get_log_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetLogRspT {
+ uint16_t log_entry_id;
+ uint32_t time_stamp;
+ uint8_t event_type;
+ uint8_t source;
+ uint8_t alarm_code;
+ uint16_t user_id;
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetLogRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetLogRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set Pin Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetPinReqT {
+ uint16_t user_id;
+ uint8_t user_status; /* e.g. DOORLOCK_USER_STATUS_AVAILABLE */
+ uint8_t user_type; /* e.g. DOORLOCK_USER_TYPE_UNRESTRICTED */
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetPinReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetPinReqT *set_pin_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetPinRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get Pin Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetPinReqT {
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetPinReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetPinReqT *get_pin_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetPinRspT {
+ uint16_t user_id;
+ uint8_t user_status;
+ uint8_t user_type;
+ uint8_t pin[DOORLOCK_MAX_PIN];
+ uint8_t pin_len;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear Pin Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockClrPinReqT {
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientClrPinReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockClrPinReqT *clr_pin_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrPinRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear All Pin Helper
+ *---------------------------------------------------------------
+ */
+
+enum ZclStatusCodeT ZbZclDoorLockClientClrAllPinReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrAllPinRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrAllPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set User Status Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetUserStatusReqT {
+ uint16_t user_id;
+ uint8_t user_status;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetUserStatusReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetUserStatusReqT *set_user_status_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetUserStatusRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetUserStatusRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetUserStatusRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get User Status Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetUserStatusReqT {
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetUserStatusReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetUserStatusReqT *get_user_status_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetUserStatusRspT {
+ uint16_t user_id;
+ uint8_t user_status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetUserStatusRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetUserStatusRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set WD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetWDScheduleReqT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+ uint8_t days_mask;
+ uint8_t start_hour;
+ uint8_t start_minute;
+ uint8_t end_hour;
+ uint8_t end_minute;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetWDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetWDScheduleReqT *set_wd_sched_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetWDScheduleRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetWDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetWDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get WD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetWDScheduleReqT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetWDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetWDScheduleReqT *get_wd_sched_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetWDScheduleRspT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+ uint8_t status;
+ uint8_t days_mask;
+ uint8_t start_hour;
+ uint8_t start_minute;
+ uint8_t end_hour;
+ uint8_t end_minute;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetWDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetWDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear WD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockClrWDScheduleReqT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientClrWDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockClrWDScheduleReqT *clr_wd_schedule_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrWDScheduleRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrWDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrWDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set YD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetYDScheduleReqT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+ uint32_t local_start_time;
+ uint32_t local_end_time;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetYDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetYDScheduleReqT *set_yd_sched_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetYDScheduleRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetYDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetYDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get YD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetYDScheduleReqT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetYDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetYDScheduleReqT *get_yd_sched_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetYDScheduleRspT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+ uint8_t status;
+ uint32_t local_start_time;
+ uint32_t local_end_time;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetYDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetYDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear YD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockClrYDScheduleReqT {
+ uint8_t schedule_id;
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientClrYDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockClrYDScheduleReqT *clr_yd_schedule_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrYDScheduleRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrYDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrYDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set HD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetHDScheduleReqT {
+ uint8_t schedule_id;
+ uint32_t local_start_time;
+ uint32_t local_end_time;
+ uint8_t operating_mode;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetHDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetHDScheduleReqT *set_hd_sched_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetHDScheduleRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetHDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetHDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get HD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetHDScheduleReqT {
+ uint8_t schedule_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetHDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetHDScheduleReqT *get_hd_sched_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetHDScheduleRspT {
+ uint8_t schedule_id;
+ uint8_t status;
+ uint32_t local_start_time;
+ uint32_t local_end_time;
+ uint8_t operating_mode;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetHDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetHDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear HD Schedule Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockClrHDScheduleReqT {
+ uint8_t schedule_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientClrHDScheduleReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockClrHDScheduleReqT *clr_hd_schedule_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrHDScheduleRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrHDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrHDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set User Type Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetUserTypeReqT {
+ uint16_t user_id;
+ uint8_t user_type;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetUserTypeReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetUserTypeReqT *set_user_type_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetUserTypeRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetUserTypeRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetUserTypeRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get User Type Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetUserTypeReqT {
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetUserTypeReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetUserTypeReqT *get_user_type_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetUserTypeRspT {
+ uint16_t user_id;
+ uint8_t user_type;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetUserTypeRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetUserTypeRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Set RFID Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockSetRfidReqT {
+ uint16_t user_id;
+ uint8_t user_status;
+ uint8_t user_type;
+ uint8_t rfid[DOORLOCK_MAX_RFID];
+ uint8_t rfid_len;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientSetRfidReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockSetRfidReqT *set_rfid_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockSetRfidRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockSetRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Get RFID Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockGetRfidReqT {
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientGetRfidReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockGetRfidReqT *get_rfid_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockGetRfidRspT {
+ uint16_t user_id;
+ uint8_t user_status;
+ uint8_t user_type;
+ uint8_t rfid[DOORLOCK_MAX_RFID];
+ uint8_t rfid_len;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockGetRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear RFID Helper
+ *---------------------------------------------------------------
+ */
+
+struct ZbZclDoorLockClrRfidReqT {
+ uint16_t user_id;
+};
+enum ZclStatusCodeT ZbZclDoorLockClientClrRfidReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct ZbZclDoorLockClrRfidReqT *clr_rfid_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrRfidRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Client Clear All RFID Helper
+ *---------------------------------------------------------------
+ */
+
+enum ZclStatusCodeT ZbZclDoorLockClientClrAllRfidReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclDoorLockClrAllRfidRspT {
+ uint8_t status;
+};
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+ struct ZbZclDoorLockClrAllRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/*---------------------------------------------------------------
+ * Server
+ *---------------------------------------------------------------
+ */
+
+/* These callbacks are used to implemented command functionality in the application.
+ * The callbacks should return ZCL_STATUS_SUCCESS or ZCL_STATUS_FAILURE, and that status
+ * will be attached to the payload sent in cluster response. The response can either
+ * be sent with ZbZclClusterCommandRsp() using srcInfo provided, or the app can call
+ * ZbZclSendDefaultResponse2 to send a ZCL Default Response */
+struct ZbZclDoorLockServerCallbacksT {
+ enum ZclStatusCodeT (*lock)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockLockDoorReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*unlock)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockUnlockDoorReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*toggle)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockToggleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*unlock_timeout)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockUnlockTimeoutReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_log)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetLogReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_pin)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetPinReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_pin)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetPinReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_pin)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockClrPinReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_all_pins)(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_user_status)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetUserStatusReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_user_status)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetUserStatusReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_wd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetWDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_wd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetWDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_wd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockClrWDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_yd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetYDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_yd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetYDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_yd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockClrYDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_hd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetHDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_hd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetHDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_hd_sched)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockClrHDScheduleReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_user_type)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetUserTypeReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_user_type)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetUserTypeReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*set_rfid)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetRfidReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*get_rfid)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockGetRfidReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_rfid)(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockClrRfidReqT *cmd_req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ enum ZclStatusCodeT (*clr_all_rfids)(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg);
+};
+
+struct ZbZclClusterT * ZbZclDoorLockServerAlloc(struct ZigBeeT *zb, uint8_t ep,
+ struct ZbZclDoorLockServerCallbacksT *callbacks, void *arg);
+
+#endif /* ZCL_DOORLOCK_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.elec.meas.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.elec.meas.h
new file mode 100644
index 000000000..80a563a0c
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.elec.meas.h
@@ -0,0 +1,384 @@
+/* Copyright [2019 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_ELEC_MEAS_H
+#define ZCL_ELEC_MEAS_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Electrical Measurement cluster.
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.Electrical.Measurement
+ * EMR.S | True
+ * EMR.C | True
+ *
+ * Server Attributes
+ * EMR.S.A0000 | True
+ * EMR.S.A0100 | False
+ * EMR.S.A0101 | False
+ * EMR.S.A0102 | False
+ * EMR.S.A0103 | False
+ * EMR.S.A0104 | False
+ * EMR.S.A0105 | False
+ * EMR.S.A0106 | False
+ * EMR.S.A0107 | False
+ * EMR.S.A0108 | False
+ * EMR.S.A0200 | False
+ * EMR.S.A0201 | False
+ * EMR.S.A0202 | False
+ * EMR.S.A0203 | False
+ * EMR.S.A0204 | False
+ * EMR.S.A0205 | False
+ * EMR.S.A0300 | False
+ * EMR.S.A0301 | False
+ * EMR.S.A0302 | False
+ * EMR.S.A0303 | False
+ * EMR.S.A0304 | False
+ * EMR.S.A0305 | False
+ * EMR.S.A0306 | False
+ * EMR.S.A0307 | False
+ * EMR.S.A0308 | False
+ * EMR.S.A0309 | False
+ * EMR.S.A030a | False
+ * EMR.S.A030b | False
+ * EMR.S.A030c | False
+ * EMR.S.A030d | False
+ * EMR.S.A030e | False
+ * EMR.S.A030f | False
+ * EMR.S.A0310 | False
+ * EMR.S.A0311 | False
+ * EMR.S.A0312 | False
+ * EMR.S.A0400 | False
+ * EMR.S.A0401 | False
+ * EMR.S.A0402 | False
+ * EMR.S.A0403 | False
+ * EMR.S.A0404 | False
+ * EMR.S.A0405 | False
+ * EMR.S.A0501 | False
+ * EMR.S.A0502 | False
+ * EMR.S.A0503 | False
+ * EMR.S.A0505 | False
+ * EMR.S.A0506 | False
+ * EMR.S.A0507 | False
+ * EMR.S.A0508 | False
+ * EMR.S.A0509 | False
+ * EMR.S.A050a | False
+ * EMR.S.A050b | False
+ * EMR.S.A050c | False
+ * EMR.S.A050d | False
+ * EMR.S.A050e | False
+ * EMR.S.A050f | False
+ * EMR.S.A0510 | False
+ * EMR.S.A0511 | False
+ * EMR.S.A0512 | False
+ * EMR.S.A0513 | False
+ * EMR.S.A0514 | False
+ * EMR.S.A0515 | False
+ * EMR.S.A0516 | False
+ * EMR.S.A0517 | False
+ * EMR.S.A0600 | False
+ * EMR.S.A0601 | False
+ * EMR.S.A0602 | False
+ * EMR.S.A0603 | False
+ * EMR.S.A0604 | False
+ * EMR.S.A0605 | False
+ * EMR.S.A0700 | False
+ * EMR.S.A0701 | False
+ * EMR.S.A0702 | False
+ * EMR.S.A0800 | False
+ * EMR.S.A0801 | False
+ * EMR.S.A0802 | False
+ * EMR.S.A0803 | False
+ * EMR.S.A0804 | False
+ * EMR.S.A0805 | False
+ * EMR.S.A0806 | False
+ * EMR.S.A0807 | False
+ * EMR.S.A0808 | False
+ * EMR.S.A0809 | False
+ * EMR.S.A080a | False
+ * EMR.S.A0901 | False
+ * EMR.S.A0902 | False
+ * EMR.S.A0903 | False
+ * EMR.S.A0905 | False
+ * EMR.S.A0906 | False
+ * EMR.S.A0907 | False
+ * EMR.S.A0908 | False
+ * EMR.S.A0909 | False
+ * EMR.S.A090a | False
+ * EMR.S.A090b | False
+ * EMR.S.A090c | False
+ * EMR.S.A090d | False
+ * EMR.S.A090e | False
+ * EMR.S.A090f | False
+ * EMR.S.A0910 | False
+ * EMR.S.A0911 | False
+ * EMR.S.A0912 | False
+ * EMR.S.A0913 | False
+ * EMR.S.A0914 | False
+ * EMR.S.A0915 | False
+ * EMR.S.A0916 | False
+ * EMR.S.A0917 | False
+ * EMR.S.A0a01 | False
+ * EMR.S.A0a02 | False
+ * EMR.S.A0a03 | False
+ * EMR.S.A0a05 | False
+ * EMR.S.A0a06 | False
+ * EMR.S.A0a07 | False
+ * EMR.S.A0a08 | False
+ * EMR.S.A0a09 | False
+ * EMR.S.A0a0a | False
+ * EMR.S.A0a0b | False
+ * EMR.S.A0a0c | False
+ * EMR.S.A0a0d | False
+ * EMR.S.A0a0e | False
+ * EMR.S.A0a0f | False
+ * EMR.S.A0a10 | False
+ * EMR.S.A0a11 | False
+ * EMR.S.A0a12 | False
+ * EMR.S.A0a13 | False
+ * EMR.S.A0a14 | False
+ * EMR.S.A0a15 | False
+ * EMR.S.A0a16 | False
+ * EMR.S.A0a17 | False
+ * EMR.S.Afffd | True
+ * EMR.S.Afffe | False
+
+ * Commands Received
+ * EMR.S.C00.Rsp | depends on customer application
+ * EMR.S.C01.Rsp | depends on customer application
+
+ * Commands Generated
+ * EMR.S.C00.Tx | depends on customer application
+ * EMR.S.C01.Tx | depends on customer application
+ *
+ * Client Attributes
+ * DRLK.C.Afffd | True
+ * DRLK.C.Afffe | False
+ *
+ * Commands Received
+ * EMR.C.C00.Rsp | depends on customer application
+ * EMR.C.C01.Rsp | depends on customer application
+ *
+ * Commands Generated
+ * EMR.C.C00.Tx | True
+ * EMR.C.C01.Tx | True
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_ELEC_MEAS_ATTR_MEAS_TYPE = 0x0000,
+ ZCL_ELEC_MEAS_ATTR_DC_VOLT = 0x0100,
+ ZCL_ELEC_MEAS_ATTR_DC_VOLT_MIN = 0x0101,
+ ZCL_ELEC_MEAS_ATTR_DC_VOLT_MAX = 0x0102,
+ ZCL_ELEC_MEAS_ATTR_DC_CURRENT = 0x0103,
+ ZCL_ELEC_MEAS_ATTR_DC_CURRENT_MIN = 0x0104,
+ ZCL_ELEC_MEAS_ATTR_DC_CURRENT_MAX = 0x0105,
+ ZCL_ELEC_MEAS_ATTR_DC_POWER = 0x0106,
+ ZCL_ELEC_MEAS_ATTR_DC_POWER_MIN = 0x0107,
+ ZCL_ELEC_MEAS_ATTR_DC_POWER_MAX = 0x0108,
+ ZCL_ELEC_MEAS_ATTR_DC_VOLT_MULTIPLIER = 0x0200,
+ ZCL_ELEC_MEAS_ATTR_DC_VOLT_DIVISOR = 0x0201,
+ ZCL_ELEC_MEAS_ATTR_DC_CURR_MULTIPLIER = 0x0202,
+ ZCL_ELEC_MEAS_ATTR_DC_CURR_DIVISOR = 0x0203,
+ ZCL_ELEC_MEAS_ATTR_DC_PWR_MULTIPLIER = 0x0204,
+ ZCL_ELEC_MEAS_ATTR_DC_PWR_DIVISOR = 0x0205,
+ ZCL_ELEC_MEAS_ATTR_AC_FREQ = 0x0300,
+ ZCL_ELEC_MEAS_ATTR_AC_FREQ_MIN = 0x0301,
+ ZCL_ELEC_MEAS_ATTR_AC_FREQ_MAX = 0x0302,
+ ZCL_ELEC_MEAS_ATTR_NEUTRAL_CURR = 0x0303,
+ ZCL_ELEC_MEAS_ATTR_TOTAL_ACTIVE_PWR = 0x0304,
+ ZCL_ELEC_MEAS_ATTR_TOTAL_REACTIVE_PWR = 0x0305,
+ ZCL_ELEC_MEAS_ATTR_TOTAL_APPARENT_PWR = 0x0306,
+ ZCL_ELEC_MEAS_ATTR_1ST_HARM_CURR = 0x0307,
+ ZCL_ELEC_MEAS_ATTR_3RD_HARM_CURR = 0x0308,
+ ZCL_ELEC_MEAS_ATTR_5TH_HARM_CURR = 0x0309,
+ ZCL_ELEC_MEAS_ATTR_7TH_HARM_CURR = 0x030a,
+ ZCL_ELEC_MEAS_ATTR_9TH_HARM_CURR = 0x030b,
+ ZCL_ELEC_MEAS_ATTR_11TH_HARM_CURR = 0x030c,
+ ZCL_ELEC_MEAS_ATTR_PHASE_1ST_HARM_CURR = 0x030d,
+ ZCL_ELEC_MEAS_ATTR_PHASE_3RD_HARM_CURR = 0x030e,
+ ZCL_ELEC_MEAS_ATTR_PHASE_5TH_HARM_CURR = 0x030f,
+ ZCL_ELEC_MEAS_ATTR_PHASE_7TH_HARM_CURR = 0x0310,
+ ZCL_ELEC_MEAS_ATTR_PHASE_9TH_HARM_CURR = 0x0311,
+ ZCL_ELEC_MEAS_ATTR_PHASE_11TH_HARM_CURR = 0x0312,
+ ZCL_ELEC_MEAS_ATTR_AC_FREQ_MULTIPLIER = 0x0400,
+ ZCL_ELEC_MEAS_ATTR_AC_FREQ_DIVISOR = 0x0401,
+ ZCL_ELEC_MEAS_ATTR_PWR_MULTIPLIER = 0x0402,
+ ZCL_ELEC_MEAS_ATTR_PWR_DIVISOR = 0x0403,
+ ZCL_ELEC_MEAS_ATTR_HARM_CURR_MULTIPLIER = 0x0404,
+ ZCL_ELEC_MEAS_ATTR_PHASE_CURR_MULTIPLIER = 0x0405,
+ ZCL_ELEC_MEAS_ATTR_LINE_CURR = 0x0501,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_CURR = 0x0502,
+ ZCL_ELEC_MEAS_ATTR_REACTIVE_CURR = 0x0503,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT = 0x0505,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_MIN = 0x0506,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_MAX = 0x0507,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR = 0x0508,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_MIN = 0x0509,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_MAX = 0x050a,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR = 0x050b,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_MIN = 0x050c,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_MAX = 0x050d,
+ ZCL_ELEC_MEAS_ATTR_REACTIVE_PWR = 0x050e,
+ ZCL_ELEC_MEAS_ATTR_APPARENT_PWR = 0x050f,
+ ZCL_ELEC_MEAS_ATTR_PWR_FACTOR = 0x0510,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_VOLT_PERIOD = 0x0511,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_OV_COUNT = 0x0512,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_UV_COUNT = 0x0513,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_OVER_PERIOD = 0x0514,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_UNDER_PERIOD = 0x0515,
+ ZCL_ELEC_MEAS_ATTR_VOLT_SAG_PERIOD = 0x0516,
+ ZCL_ELEC_MEAS_ATTR_VOLT_SWELL_PERIOD = 0x0517,
+ ZCL_ELEC_MEAS_ATTR_AC_VOLT_MULTIPLIER = 0x0600,
+ ZCL_ELEC_MEAS_ATTR_AC_VOLT_DIVISOR = 0x0601,
+ ZCL_ELEC_MEAS_ATTR_AC_CURR_MULT = 0x0602,
+ ZCL_ELEC_MEAS_ATTR_AC_CURR_DIVISOR = 0x0603,
+ ZCL_ELEC_MEAS_ATTR_AC_PWR_MULTIPLIER = 0x0604,
+ ZCL_ELEC_MEAS_ATTR_AC_PWR_DIVISOR = 0x0605,
+ ZCL_ELEC_MEAS_ATTR_DC_OL_ALARMS_MASK = 0x0700,
+ ZCL_ELEC_MEAS_ATTR_DC_VOLT_OL = 0x0701,
+ ZCL_ELEC_MEAS_ATTR_DC_CURR_OL = 0x0702,
+ ZCL_ELEC_MEAS_ATTR_AC_ALARMS_MASK = 0x0800,
+ ZCL_ELEC_MEAS_ATTR_AC_VOLT_OL = 0x0801,
+ ZCL_ELEC_MEAS_ATTR_AC_CURR_OL = 0x0802,
+ ZCL_ELEC_MEAS_ATTR_AC_ACTIVE_PWR_OL = 0x0803,
+ ZCL_ELEC_MEAS_ATTR_AC_REACTIVE_PWR_OL = 0x0804,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_OV = 0x0805,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_UV = 0x0806,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_OV = 0x0807,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_UV = 0x0808,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_SAG = 0x0809,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_SWELL = 0x080a,
+ ZCL_ELEC_MEAS_ATTR_LINE_CURR_B = 0x0901,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_CURR_B = 0x0902,
+ ZCL_ELEC_MEAS_ATTR_REACTIVE_CURR_B = 0x0903,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_B = 0x0905,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_MIN_B = 0x0906,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_MAX_B = 0x0907,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_B = 0x0908,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_MIN_B = 0x0909,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_MAX_B = 0x090a,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_B = 0x090b,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_MIN_B = 0x090c,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_MAX_B = 0x090d,
+ ZCL_ELEC_MEAS_ATTR_REACTIVE_PWR_B = 0x090e,
+ ZCL_ELEC_MEAS_ATTR_APPARENT_PWR_B = 0x090f,
+ ZCL_ELEC_MEAS_ATTR_PWR_FACTOR_B = 0x0910,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_VOLT_PERIOD_B = 0x0911,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_OV_B = 0x0912,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_UV_B = 0x0913,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_OVER_B = 0x0914,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_UNDER_B = 0x0915,
+ ZCL_ELEC_MEAS_ATTR_RMS_SAG_PERIOD_B = 0x0916,
+ ZCL_ELEC_MEAS_ATTR_RMS_SWELL_PERIOD_B = 0x0917,
+ ZCL_ELEC_MEAS_ATTR_LINE_CURR_C = 0x0a01,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_CURR_C = 0x0a02,
+ ZCL_ELEC_MEAS_ATTR_REACTIVE_CURR_C = 0x0a03,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_C = 0x0a05,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_MIN_C = 0x0a06,
+ ZCL_ELEC_MEAS_ATTR_RMS_VOLT_MAX_C = 0x0a07,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_C = 0x0a08,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_MIN_C = 0x0a0a,
+ ZCL_ELEC_MEAS_ATTR_RMS_CURR_MAX_C = 0x0a0a,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_C = 0x0a0C,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_MIN_C = 0x0a0c,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_MAX_C = 0x0a0d,
+ ZCL_ELEC_MEAS_ATTR_REACTIVE_PWR_C = 0x0a0e,
+ ZCL_ELEC_MEAS_ATTR_APPARENT_PWR_C = 0x0a0f,
+ ZCL_ELEC_MEAS_ATTR_PWR_FACTOR_C = 0x0a10,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_VOLT_PERIOD_C = 0x0a11,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_OV_C = 0x0a12,
+ ZCL_ELEC_MEAS_ATTR_AVG_RMS_UV_C = 0x0a13,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_OVER_C = 0x0a14,
+ ZCL_ELEC_MEAS_ATTR_RMS_EXT_UNDER_C = 0x0a15,
+ ZCL_ELEC_MEAS_ATTR_RMS_SAG_PERIOD_C = 0x0a16,
+ ZCL_ELEC_MEAS_ATTR_RMS_SWELL_PERIOD_C = 0x0a17,
+};
+
+/* Default Values */
+
+#define ZCL_ELEC_MEAS_DEFAULT_MEAS_TYPE 0x00000000
+#define ZCL_ELEC_MEAS_DEFAULT_DC_MEAS 0x8000
+#define ZCL_ELEC_MEAS_DEFAULT_DC_FORMATTING 0x0001
+#define ZCL_ELEC_MEAS_DEFAULT_DC_OL_ALARMS_MASK 0x00
+#define ZCL_ELEC_MEAS_DEFAULT_DC_VOLT_OL 0xffff
+
+/* Min and Max Values */
+
+#define ZCL_ELEC_MEAS_MIN_DC_MEAS 0x8001
+#define ZCL_ELEC_MEAS_MAX_DC_MEAS 0x7fff
+#define ZCL_ELEC_MEAS_MIN_DC_FORMATTING 0x0001
+#define ZCL_ELEC_MEAS_MAX_DC_FORMATTING 0xffff
+#define ZCL_ELEC_MEAS_MIN_OL_ALARMS_MASK 0x00
+#define ZCL_ELEC_MEAS_MAX_OL_ALARMS_MASK 0x03
+
+/* Client Generated Commands */
+enum {
+ ZCL_ELEC_MEAS_CLI_GET_PROFILE_INFO = 0x00,
+ ZCL_ELEC_MEAS_CLI_GET_MEAS_PROFILE = 0x01
+};
+
+/* Server Generated Commands */
+enum {
+ ZCL_ELEC_MEAS_SVR_GET_PROFILE_INFO_RSP = 0x00,
+ ZCL_ELEC_MEAS_SVR_GET_MEAS_PROFILE_RSP = 0x01
+};
+
+struct elec_meas_get_meas_profile_req_t {
+ uint16_t attr_id;
+ uint32_t start_time;
+ uint8_t num_intervals;
+};
+
+struct elec_meas_get_profile_info_rsp_t {
+ /* Profile count is the total number for supported profile, and the list of
+ * attributes is the list of attributes being profiled. This relationship has
+ * been interpreted as profile count holding the number of attributes in
+ * attribute list. */
+ uint8_t profile_count;
+ uint8_t profile_interval_period;
+ uint8_t max_num_intervals;
+ uint16_t *attr_list;
+};
+
+struct elec_meas_get_meas_profile_rsp_t {
+ uint32_t start_time;
+ uint8_t status;
+ uint8_t profile_interval_period;
+ uint8_t num_intervals_delivered;
+ uint8_t attr_id;
+ uint8_t *intervals;
+};
+
+struct zcl_elec_meas_callbacks_t {
+ enum ZclStatusCodeT (*get_profile_info)(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*get_meas_profile)(struct ZbZclClusterT *clusterPtr, struct elec_meas_get_meas_profile_req_t *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+};
+
+/*---------------------------------------------------------------
+ * Electrical Measurement Function Declarations
+ *---------------------------------------------------------------
+ */
+
+/* Allocation Functions */
+struct ZbZclClusterT * ZbZclElecMeasClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclElecMeasServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, struct zcl_elec_meas_callbacks_t *callbacks, void *arg);
+
+/* Client Generated Commands */
+enum ZclStatusCodeT ZbZclElecMeasClientGetProfileInfoReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+enum ZclStatusCodeT ZbZclElecMeasClientGetMeasProfileReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct elec_meas_get_meas_profile_req_t *get_meas_profile_req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* Server Reponse Commands */
+enum ZclStatusCodeT ZbZclElecMeasServerSendProfileInfoRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct elec_meas_get_profile_info_rsp_t *rsp);
+enum ZclStatusCodeT ZbZclElecMeasServerSendMeasProfileRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct elec_meas_get_meas_profile_rsp_t *rsp);
+
+#endif /* _ZCL_ELEC_MEAS_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h
new file mode 100644
index 000000000..fdd320918
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h
@@ -0,0 +1,60 @@
+/* Copyright [2017 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_FAN_H
+#define ZCL_FAN_H
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * ZCL FAN cluster definitions
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.Fan
+ *
+ * FAN.S | True
+ * FAN.C | True
+ *
+ * Server Attributes
+ * FAN.S.A0000 | True
+ * FAN.S.A0001 | True
+ * FAN.S.Afffd | True
+ * FAN.S.Afffe | False
+ *
+ *
+ * Client Attributes
+ * FAN.C.Afffd | True
+ * FAN.C.Afffe | False
+ */
+
+#include "zcl/zcl.h"
+
+/*---------------------------------------------------------------
+ * Definitions
+ *---------------------------------------------------------------
+ */
+/* Attribute Identifiers */
+enum {
+ ZCL_FAN_ATTR_MODE = 0x0000,
+ ZCL_FAN_ATTR_SEQUENCE = 0x00001,
+};
+
+/* FAN_MODES */
+#define FAN_MODE_OFF 0x00
+#define FAN_MODE_LOW 0x01
+#define FAN_MODE_MED 0x02
+#define FAN_MODE_HI 0x03
+#define FAN_MODE_ON 0x04
+#define FAN_MODE_AUTO 0x05
+#define FAN_MODE_SMART 0x06
+
+/* FAN_SEQUENCES */
+#define FAN_SEQ_LMH 0x00
+#define FAN_SEQ_LH 0x01
+#define FAN_SEQ_LMHA 0x02
+#define FAN_SEQ_LHA 0x03
+#define FAN_SEQ_OA 0x04
+
+struct ZbZclClusterT * ZbZclFanClientAlloc(struct ZigBeeT *zb, uint8_t ep);
+struct ZbZclClusterT * ZbZclFanServerAlloc(struct ZigBeeT *zb, uint8_t ep);
+
+#endif /* __ZCL_DEVICE_TEMP_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h
new file mode 100644
index 000000000..1da3f0429
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h
@@ -0,0 +1,120 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_GROUPS_H
+# define ZCL_GROUPS_H
+
+/* PICS.ZCL.Groups
+ *
+ * G.S | True
+ * G.C | True
+ *
+ * Server Attributes
+ * G.S.A0000 | True
+ * G.S.Afffd | True
+ *
+ * Commands Received
+ * G.S.C00.Rsp | True
+ * G.S.C01.Rsp | True
+ * G.S.C02.Rsp | True
+ * G.S.C03.Rsp | True
+ * G.S.C04.Rsp | True
+ * G.S.C05.Rsp | True
+ *
+ * Commands Generated
+ * G.S.C00.Tx | True
+ * G.S.C01.Tx | True
+ * G.S.C02.Tx | True
+ * G.S.C03.Tx | True
+ *
+ *
+ * Client Attributes
+ * G.C.Afffd | True
+ *
+ * Commands Received
+ * G.C.C00.Rsp | True
+ * G.C.C01.Rsp | True
+ * G.C.C06.Rsp | True
+ * G.C.C02.Rsp | True
+ *
+ * Commands Generated
+ * G.C.C00.Tx | True
+ * G.C.C01.Tx | True
+ * G.C.C02.Tx | True
+ * G.C.C03.Tx | True
+ * G.C.C04.Tx | True
+ * G.C.C05.Tx | True
+ *
+ */
+
+#include "zcl/zcl.h"
+
+#define ZCL_GROUPS_GET_MEMBERS_MAX 16U /* arbitrary */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_GROUPS_ATTR_NAME_SUPPORT = 0x0000,
+};
+
+/* Commands */
+enum {
+ ZCL_GROUPS_COMMAND_ADD = 0x00,
+ ZCL_GROUPS_COMMAND_VIEW = 0x01,
+ ZCL_GROUPS_COMMAND_GET_MEMBERSHIP = 0x02,
+ ZCL_GROUPS_COMMAND_REMOVE = 0x03,
+ ZCL_GROUPS_COMMAND_REMOVE_ALL = 0x04,
+ ZCL_GROUPS_COMMAND_ADD_IDENTIFYING = 0x05,
+};
+
+typedef void (*ZbZclGroupsServerCallbackT)(void *arg, uint8_t state);
+struct ZbZclClusterT * ZbZclGroupsServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclGroupClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+/* Client APIs */
+
+struct ZbZclGroupsClientAddReqT {
+ struct ZbApsAddrT dst;
+ uint16_t group_id;
+};
+enum ZclStatusCodeT ZbZclGroupsClientAddReq(struct ZbZclClusterT *clusterPtr, struct ZbZclGroupsClientAddReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclGroupsClientViewReqT {
+ struct ZbApsAddrT dst;
+ uint16_t group_id;
+};
+enum ZclStatusCodeT ZbZclGroupsClientViewReq(struct ZbZclClusterT *clusterPtr, struct ZbZclGroupsClientViewReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclGroupsClientGetMembershipReqT {
+ struct ZbApsAddrT dst;
+ uint8_t num_groups;
+ uint16_t group_list[ZCL_GROUPS_GET_MEMBERS_MAX];
+};
+enum ZclStatusCodeT ZbZclGroupsClientGetMembershipReq(struct ZbZclClusterT *clusterPtr, struct ZbZclGroupsClientGetMembershipReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclGroupsClientRemoveReqT {
+ struct ZbApsAddrT dst;
+ uint16_t group_id;
+};
+enum ZclStatusCodeT ZbZclGroupsClientRemoveReq(struct ZbZclClusterT *clusterPtr, struct ZbZclGroupsClientRemoveReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclGroupsClientRemoveAllReqT {
+ struct ZbApsAddrT dst;
+ uint8_t num_groups;
+ uint16_t group_list[ZCL_GROUPS_GET_MEMBERS_MAX];
+};
+enum ZclStatusCodeT ZbZclGroupsClientRemoveAllReq(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclGroupsClientRemoveAllReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+struct ZbZclGroupsClientAddIdentifyingReqT {
+ struct ZbApsAddrT dst;
+ uint16_t group_id;
+};
+enum ZclStatusCodeT ZbZclGroupsClientAddIdentifyingReq(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclGroupsClientAddIdentifyingReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* __ZCL_GROUPS_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.h
index 67f1515c4..f8d0c6412 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZCL_H
# define ZCL_H
@@ -358,7 +358,7 @@ enum ZclDataTypeT {
enum ZclStatusCodeT {
ZCL_STATUS_SUCCESS = 0x00,
ZCL_STATUS_FAILURE = 0x01,
- ZCL_STATUS_ALLOC_FAIL = 0x70,
+ ZCL_STATUS_REQUEST_DENIED = 0x70,
ZCL_STATUS_NOT_AUTHORIZED = 0x7e,
ZCL_STATUS_MALFORMED_COMMAND = 0x80,
ZCL_STATUS_UNSUPP_CLUSTER_COMMAND = 0x81,
@@ -393,6 +393,8 @@ enum ZclStatusCodeT {
ZCL_STATUS_UNSUPP_CLUSTER = 0xc3,
ZCL_STATUS_LIMIT_REACHED = 0xc4,
+ /* Exegin add-ons */
+ ZCL_STATUS_ALLOC_FAIL = 0xfe,
/* Exegin add-on: Used with cluster command callback to indicate
* command was handled successfully, but don't send a Default Response
* for success. I.e. a response has already been sent. */
@@ -454,7 +456,7 @@ enum ZbZclDeviceIdT {
ZCL_DEVICE_ONOFF_COLOR_DIMMER_SWITCH = 0x0105,
ZCL_DEVICE_ONOFF_LIGHT_SENSOR = 0x0106,
ZCL_DEVICE_ONOFF_OCCUPANCY_SENSOR = 0x0107,
- /* TODO - add more from Lighting and Occupancy Device Spec */
+ /* EXEGIN - add more from Lighting and Occupancy Device Spec */
/* IAS (0x0400) */
ZCL_DEVICE_IAS_CONTROL_AND_INDICATING_EQUIPMENT = 0x0400,
@@ -658,7 +660,7 @@ struct ZbZclHeaderT {
* Cluster Commands
*---------------------------------------------------------------
*/
-typedef struct {
+typedef struct ZbZclCommandReqT {
/* From APSDE-DATA.request */
struct ZbApsAddrT dst;
uint16_t profileId;
@@ -670,7 +672,7 @@ typedef struct {
/* ZCL command */
struct ZbZclHeaderT hdr;
/* if (txOptions & ZB_APSDE_DATAREQ_TXOPTIONS_VECTOR), then payload is
- * a pointer to list of ZbApsBufT, and length is the number of ZbApsBufT
+ * a pointer to list of struct ZbApsBufT, and length is the number of struct ZbApsBufT
* items in the list. */
const void *payload;
unsigned int length;
@@ -685,7 +687,11 @@ typedef struct {
* - hdr.cmdId = request command id
*/
struct ZbZclCommandRspT {
+ enum ZbStatusCodeT aps_status; /**< APS-DATA.confirm status */
enum ZclStatusCodeT status;
+ /**< Status of the ZCL response. If Default Response, it is the status code found
+ * within the response. If a cluster-specific response, it is set to ZB_STATUS_SUCCESS,
+ * and the application must parse the payload, if any, for any embedded status. */
struct ZbApsAddrT src;
uint16_t profileId;
enum ZbZclClusterIdT clusterId;
@@ -697,18 +703,9 @@ struct ZbZclCommandRspT {
/* Send a ZCL command. The callback function is called when the
* associated ZCL response is received, or there's an error. */
-enum ZclStatusCodeT ZbZclCommandReq(struct ZigBeeT *zb, ZbZclCommandReqT *zclReq,
+enum ZclStatusCodeT ZbZclCommandReq(struct ZigBeeT *zb, struct ZbZclCommandReqT *zclReq,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-/* Blocking version of ZbZclCommandReq */
-/* Response Info (rsp) may be NULL. If not NULL, make sure to provide a valid buffer pointer
- * to rsp->payload and specify the maximum length to rsp->length. */
-void ZbZclCommandWait(struct ZigBeeT *zb, ZbZclCommandReqT *req, struct ZbZclCommandRspT *rsp);
-
-/* A version of ZbZclCommandReq that doesn't wait for a response. */
-enum ZclStatusCodeT ZbZclCommandNoResp(struct ZigBeeT *zb, ZbZclCommandReqT *req,
- void (*callback)(ZbApsdeDataConfT *confPtr, void *arg), void *arg);
-
/*---------------------------------------------------------------
* Cluster Attributes
*---------------------------------------------------------------
@@ -802,24 +799,43 @@ enum ZclStatusCodeT ZbZclAttrAppendList(struct ZbZclClusterT *clusterPtr, const
/* Attribute Callback Types */
enum ZbZclAttrCbTypeT {
- ZCL_ATTR_CB_TYPE_READ, /* Read Attribute */
- ZCL_ATTR_CB_TYPE_WRITE, /* Write Attribute */
- ZCL_ATTR_CB_TYPE_NOTIFY /* Write Notification */
+ ZCL_ATTR_CB_TYPE_READ,
+ /**< Read attribute callback. Use to have the application handle
+ * the ZCL Read Requests, rather than the cluster. */
+ ZCL_ATTR_CB_TYPE_WRITE,
+ /**< Write attribute callback. Used to have the application handle
+ * the ZCL Write Requests, rather than the cluster. If not used, the
+ * cluster will handle the incoming requests. */
+ ZCL_ATTR_CB_TYPE_NOTIFY
+ /**< Write notification callback. Can be used if ZCL_ATTR_CB_TYPE_WRITE
+ * is not being used and the applicaiton needs to be notified of
+ * ZCL Write Requests. */
};
/* Attribute Callback Information */
struct ZbZclAttrCbInfoT {
- const struct ZbZclAttrT *info; /* The original info used to create the attribute */
- enum ZbZclAttrCbTypeT type;
- /* Source of attribute data if ZCL_ATTR_CB_TYPE_WRITE.
- * Destination of attribute data if ZCL_ATTR_CB_TYPE_READ. */
+ const struct ZbZclAttrT *info;
+ /**< Pointer to the original info struct used to create the attribute */
+
+ enum ZbZclAttrCbTypeT type; /**< Callback type (read, write, etc) */
+
uint8_t *zcl_data;
- unsigned int zcl_len; /* Maximum length of 'zcl_data' */
+ /**< Incoming or outgoing ZCL attribute payload data. If callback type
+ * is ZCL_ATTR_CB_TYPE_WRITE, this is the source of the new value.
+ * If callback type is ZCL_ATTR_CB_TYPE_READ, this is the destination
+ * of the value to return in the ZCL Read Response. */
+
+ unsigned int zcl_len;
+ /**< Maximum length of 'zcl_data' */
/* The following are only used if type == ZCL_ATTR_CB_TYPE_WRITE */
ZclWriteModeT write_mode;
- void *attr_data; /* Location to write the new attribute value. */
- struct ZbApsAddrT *src; /* Source of the command, if not locally generated. May be NULL. */
+
+ void *attr_data;
+ /**< Local attribute storage, if application is letting the cluster maintain
+ * the attribute data. */
+
+ struct ZbApsAddrT *src; /**< Source of the command, if not locally generated. May be NULL. */
/* Application's defined callback argument */
void *app_cb_arg;
@@ -846,12 +862,50 @@ enum ZclStatusCodeT ZbZclAttrCallbackExec(struct ZbZclClusterT *clusterPtr,
struct ZbZclAttrListEntryT *attrPtr, struct ZbZclAttrCbInfoT *cb);
/*---------------------------------------------------------------
- * Alarm Reset Handler
+ * Alarm Cluster Helpers
*---------------------------------------------------------------
*/
+/**
+ * ZbZclClusterReverseBind is used by the Alarms Server so it can receive loopback
+ * messages sent in the direction of the client (i.e. reverse).
+ * @param clusterPtr
+ * @param filter
+ * @return ZCL Status
+ */
+enum ZclStatusCodeT ZbZclClusterReverseBind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter);
+void ZbZclClusterReverseUnbind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter);
+
+/**
+ * Send an alarm from a cluster as if it originated from the alarms cluster
+ * on the same endpoint. Typically, src_endpoint = ZbZclClusterGetEndpoint(clusterPtr).
+ * If the cluster appears on multiple endpoints (e.g. Basic Cluster), the src_endpoint
+ * is required to know which one to actually send the Alarm Command from.
+ * The alarm message is sent via APS binding(s).
+ * @param clusterPtr
+ * @param src_endpoint
+ * @param alarm_code
+ * @return None
+ */
+void ZbZclClusterSendAlarm(struct ZbZclClusterT *clusterPtr, uint8_t src_endpoint, uint8_t alarm_code);
+
+/**
+ * Alarm Reset handler prototype
+ * @param clusterPtr
+ * @param alarm_code
+ * @param cluster_id
+ * @param data_ind
+ * @param hdr
+ * @return None
+ */
typedef void (*ZbZclAlarmResetFuncT)(struct ZbZclClusterT *clusterPtr, uint8_t alarm_code,
- uint16_t cluster_id, ZbApsdeDataIndT *data_ind, struct ZbZclHeaderT *hdr);
+ uint16_t cluster_id, struct ZbApsdeDataIndT *data_ind, struct ZbZclHeaderT *hdr);
+/**
+ * Register a callback handler for the given cluster to receive Alarm Reset messages.
+ * @param clusterPtr
+ * @param callback
+ * @return ZCL Status Code
+ */
enum ZclStatusCodeT ZbZclClusterRegisterAlarmResetHandler(struct ZbZclClusterT *clusterPtr, ZbZclAlarmResetFuncT callback);
void ZbZclClusterRemoveAlarmResetHandler(struct ZbZclClusterT *clusterPtr);
@@ -904,13 +958,13 @@ struct ZbZclClusterT {
/* Return value is a ZCL_STATUS_ code. If not ZCL_STATUS_SUCCESS, a default
* response with the status code is sent to the originator of the command. */
enum ZclStatusCodeT (*command)(struct ZbZclClusterT *clusterPtr, struct ZbZclHeaderT *zclHdrPtr,
- ZbApsdeDataIndT *dataIndPtr);
+ struct ZbApsdeDataIndT *dataIndPtr);
/* Configure reporting */
- void (*config)(struct ZbZclClusterT *clusterPtr, ZbApsdeDataIndT *dataIndPtr, uint16_t attributeId,
+ void (*config)(struct ZbZclClusterT *clusterPtr, struct ZbApsdeDataIndT *dataIndPtr, uint16_t attributeId,
enum ZclStatusCodeT status, uint8_t direction);
- void (*report)(struct ZbZclClusterT *clusterPtr, ZbApsdeDataIndT *dataIndPtr, uint16_t attributeId,
+ void (*report)(struct ZbZclClusterT *clusterPtr, struct ZbApsdeDataIndT *dataIndPtr, uint16_t attributeId,
enum ZclDataTypeT dataType, const uint8_t *in_payload, uint16_t in_len);
/* ZCL Internal Callback for the Scenes Cluster to Get a cluster's attribute
@@ -951,14 +1005,14 @@ struct ZbZclClusterT {
* returns ZCL_STATUS_UNSUPPORTED_CLUSTER. Sets up filter bindings for the Basic Server
* cluster (global stack clusters) and register's their cluster IDs with the endpoint
* (e.g. for ZDO Match_Desc_req) */
-void ZbZclAddEndpoint(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *addReqPtr, ZbApsmeAddEndpointConfT *addConfPtr);
+void ZbZclAddEndpoint(struct ZigBeeT *zb, struct ZbApsmeAddEndpointReqT *req, struct ZbApsmeAddEndpointConfT *conf);
/* ZbZclAddEndpointNoBasic is the same as ZbZclAddEndpoint, except it does not allocate
* a Basic Server cluster for the endpoint. */
-void ZbZclAddEndpointNoBasic(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *addReqPtr, ZbApsmeAddEndpointConfT *addConfPtr);
+void ZbZclAddEndpointNoBasic(struct ZigBeeT *zb, struct ZbApsmeAddEndpointReqT *addReqPtr, struct ZbApsmeAddEndpointConfT *addConfPtr);
/* Helper to remove a ZCL endpoint created by ZbZclAddEndpoint.
* Calls ZbApsmeRemoveEndpoint and removes the ZCL filters created by ZbZclAddEndpoint. */
-void ZbZclRemoveEndpoint(struct ZigBeeT *zb, ZbApsmeRemoveEndpointReqT *req, ZbApsmeRemoveEndpointConfT *conf);
+void ZbZclRemoveEndpoint(struct ZigBeeT *zb, struct ZbApsmeRemoveEndpointReqT *req, struct ZbApsmeRemoveEndpointConfT *conf);
/* Allocate and initialize a new cluster */
void * ZbZclClusterAlloc(struct ZigBeeT *zb, unsigned int alloc_sz, enum ZbZclClusterIdT cluster_id,
@@ -976,15 +1030,15 @@ bool ZbZclClusterEndpointRemove(struct ZbZclClusterT *clusterPtr);
* Building and Parsing Frames
*---------------------------------------------------------------
*/
-/* Parses a ZCL Header from a received frame.
+/** Parses a ZCL Header from a received frame.
* Returns Length of the ZCL header, or negative value (-1) on error. */
int ZbZclParseHeader(struct ZbZclHeaderT *zclHdrPtr, const uint8_t *buf, unsigned int len);
-/* Builds and appends a ZCL Header to the start of a buffer.
+/** Builds and appends a ZCL Header to the start of a buffer.
* Returns length of data written, or negative value (-1) on error. */
int ZbZclPrependHeader(struct ZbZclHeaderT *zclHdrPtr, uint8_t *data, unsigned int len);
-/* Builds and appends a ZCL Header to the end of a buffer.
+/** Builds and appends a ZCL Header to the end of a buffer.
* Returns Length of data written, or negative value (-1) on error. */
int ZbZclAppendHeader(struct ZbZclHeaderT *zclHdrPtr, uint8_t *data, unsigned int max_len);
@@ -1090,13 +1144,13 @@ enum ZclStatusCodeT ZbZclAttrReportReadReq(struct ZbZclClusterT *clusterPtr, str
* Those depend on maximum ASDU limits and other resources. */
#define ZCL_ATTRIBUTE_LIST_MAX_SZ 8U
-typedef struct {
+typedef struct ZbZclReadReqT {
struct ZbApsAddrT dst;
unsigned int count;
uint16_t attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
} ZbZclReadReqT;
-typedef struct {
+typedef struct ZbZclReadRspDataT {
enum ZclStatusCodeT status;
uint16_t attrId;
enum ZclDataTypeT type;
@@ -1104,86 +1158,74 @@ typedef struct {
unsigned int length;
} ZbZclReadRspDataT;
-typedef struct {
+typedef struct ZbZclReadRspT {
enum ZclStatusCodeT status;
struct ZbApsAddrT src;
uint16_t profileId;
uint8_t linkQuality;
unsigned int count;
- ZbZclReadRspDataT attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
+ struct ZbZclReadRspDataT attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
} ZbZclReadRspT;
-/* ZbZclReadWait
- * zb ;
- * req ; request struct
- * rsp ; response struct
- * buf ; buffer to hold the response attribute data. Allocated by caller.
- * sz ; maximum length of 'buf' */
-void ZbZclReadWait(struct ZbZclClusterT *clusterPtr, ZbZclReadReqT *req, ZbZclReadRspT *rsp, void *buf, unsigned int sz);
-
-enum ZclStatusCodeT ZbZclReadReq(struct ZbZclClusterT *clusterPtr, ZbZclReadReqT *req,
- void (*callback)(const ZbZclReadRspT *readRsp, void *cb_arg), void *arg);
+enum ZclStatusCodeT ZbZclReadReq(struct ZbZclClusterT *clusterPtr, struct ZbZclReadReqT *req,
+ void (*callback)(const struct ZbZclReadRspT *readRsp, void *cb_arg), void *arg);
-typedef struct {
- /* TODO: implement a selector for structured version. */
+typedef struct ZbZclWriteReqDataT {
+ /* EXEGIN: implement a selector for structured version. */
uint16_t attrId;
enum ZclDataTypeT type;
const uint8_t *value; /* in zigbee format (integers are little endian) */
unsigned int length;
} ZbZclWriteReqDataT;
-typedef struct {
+typedef struct ZbZclWriteRspDataT {
enum ZclStatusCodeT status;
uint16_t attrId;
} ZbZclWriteRspDataT;
-typedef struct {
+typedef struct ZbZclWriteReqT {
struct ZbApsAddrT dst;
unsigned int count;
- ZbZclWriteReqDataT attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
+ struct ZbZclWriteReqDataT attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
} ZbZclWriteReqT;
-typedef struct {
+typedef struct ZbZclWriteRspT {
enum ZclStatusCodeT status;
struct ZbApsAddrT src;
uint16_t profileId;
uint8_t linkQuality;
unsigned int count;
- ZbZclWriteRspDataT attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
+ struct ZbZclWriteRspDataT attr[ZCL_ATTRIBUTE_LIST_MAX_SZ];
} ZbZclWriteRspT;
-void ZbZclWriteWait(struct ZbZclClusterT *clusterPtr, ZbZclWriteReqT *req, ZbZclWriteRspT *rsp);
-
-enum ZclStatusCodeT ZbZclWriteReq(struct ZbZclClusterT *clusterPtr, ZbZclWriteReqT *req,
- void (*callback)(const ZbZclWriteRspT *writeResp, void *cb_arg), void *arg);
+enum ZclStatusCodeT ZbZclWriteReq(struct ZbZclClusterT *clusterPtr, struct ZbZclWriteReqT *req,
+ void (*callback)(const struct ZbZclWriteRspT *writeResp, void *cb_arg), void *arg);
/*---------------------------------------------------------------
* Attribute Discovery
*---------------------------------------------------------------
*/
-typedef struct {
+typedef struct ZbZclDiscoverAttrReqT {
struct ZbApsAddrT dst;
uint16_t startAttr;
uint8_t max;
} ZbZclDiscoverAttrReqT;
-typedef struct {
+typedef struct ZbZclDiscoverAttrRspDataT {
uint16_t attrId;
enum ZclDataTypeT type;
} ZbZclDiscoverAttrRspDataT;
-typedef struct {
+typedef struct ZbZclDiscoverAttrRspT {
enum ZclStatusCodeT status;
struct ZbApsAddrT src;
uint8_t discComplete;
- ZbZclDiscoverAttrRspDataT attrInfo[ZCL_ATTRIBUTE_LIST_MAX_SZ];
+ struct ZbZclDiscoverAttrRspDataT attrInfo[ZCL_ATTRIBUTE_LIST_MAX_SZ];
uint8_t numAttr;
} ZbZclDiscoverAttrRspT;
-enum ZclStatusCodeT ZbZclDiscoverAttrReq(struct ZbZclClusterT *clusterPtr, ZbZclDiscoverAttrReqT *req,
- void (*callback)(const ZbZclDiscoverAttrRspT *discRsp, void *cb_arg), void *arg);
-
-void ZbZclDiscoverAttrWait(struct ZbZclClusterT *clusterPtr, ZbZclDiscoverAttrReqT *req, ZbZclDiscoverAttrRspT *rsp);
+enum ZclStatusCodeT ZbZclDiscoverAttrReq(struct ZbZclClusterT *clusterPtr, struct ZbZclDiscoverAttrReqT *req,
+ void (*callback)(const struct ZbZclDiscoverAttrRspT *discRsp, void *cb_arg), void *arg);
/*---------------------------------------------------------------
* Attribute Reporting
@@ -1254,12 +1296,6 @@ struct ZbZclClusterCommandReqT {
enum ZclStatusCodeT ZbZclClusterCommandReq(struct ZbZclClusterT *clusterPtr, struct ZbZclClusterCommandReqT *req,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
-/* Blocking version of ZbZclClusterCommandReq */
-/* Response Info (rsp) may be NULL. If not NULL, make sure to provide a valid buffer pointer
- * to rsp->payload and specify the maximum length to rsp->length. */
-enum ZclStatusCodeT ZbZclClusterCommandWait(struct ZbZclClusterT *clusterPtr, struct ZbZclClusterCommandReqT *req,
- struct ZbZclCommandRspT *zcl_rsp);
-
/*---------------------------------------------------------------
* Cluster Response helpers
*---------------------------------------------------------------
@@ -1271,23 +1307,26 @@ enum ZclStatusCodeT ZbZclClusterCommandWait(struct ZbZclClusterT *clusterPtr, st
* Returns ZCL_STATUS_SUCCESS if the message was queued to the stack, or an error status
* otherwise. */
enum ZclStatusCodeT ZbZclClusterCommandRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dstInfo,
- uint8_t cmdId, ZbApsBufT *payloads, uint8_t numPayloads);
+ uint8_t cmdId, struct ZbApsBufT *payloads, uint8_t numPayloads);
enum ZclStatusCodeT ZbZclClusterCommandRspWithCb(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dstInfo,
- uint8_t cmdId, ZbApsBufT *payloads, uint8_t numPayloads, void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
-
-/* ZbZclSendClusterStatusResponse is a wrapper to ZbZclClusterCommandRsp. The parameters zclPayload and zclPaylen must
- * be populated and the first byte must represent a status code of some sort with success == 0x00. If the request was
- * broadcast (address or endpoint) and status != 0x00, then the response will not be sent. */
+ uint8_t cmdId, struct ZbApsBufT *payloads, uint8_t numPayloads, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
+
+/* ZbZclSendClusterStatusResponse is a wrapper to ZbZclClusterCommandRsp. The parameters
+ * zclPayload and zclPaylen must be populated and the first byte must represent a status
+ * code of some sort with success == 0x00. Most ZCL respones follow this format. If the
+ * request was broadcast (address or endpoint) and status != 0x00 (ZCL_STATUS_SUCCESS),
+ * then the response will not be sent. This simplifies the cluster application from having
+ * to make these checks. */
enum ZclStatusCodeT ZbZclSendClusterStatusResponse(struct ZbZclClusterT *clusterPtr,
- ZbApsdeDataIndT *dataIndPtr, struct ZbZclHeaderT *zclHdrPtr, uint8_t cmdId,
+ struct ZbApsdeDataIndT *dataIndPtr, struct ZbZclHeaderT *zclHdrPtr, uint8_t cmdId,
uint8_t *zclPayload, uint8_t zclPaylen);
/* Send a Default Response. */
-void ZbZclSendDefaultResponse(struct ZbZclClusterT *clusterPtr, ZbApsdeDataIndT *dataIndPtr,
+void ZbZclSendDefaultResponse(struct ZbZclClusterT *clusterPtr, struct ZbApsdeDataIndT *dataIndPtr,
struct ZbZclHeaderT *zclHdrPtr, enum ZclStatusCodeT status);
/* Different version of ZbZclSendDefaultResponse, but takes in ZbZclAddrInfoT rather than
- * ZbApsdeDataIndT and ZbZclHeaderT */
+ * struct ZbApsdeDataIndT and ZbZclHeaderT */
void ZbZclSendDefaultResponse2(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dstInfo,
uint8_t cmdId, enum ZclStatusCodeT status);
@@ -1301,9 +1340,6 @@ enum ZclStatusCodeT ZbZclClusterBind(struct ZbZclClusterT *clusterPtr, uint8_t e
uint16_t profileId, enum ZbZclDirectionT direction);
void ZbZclClusterUnbind(struct ZbZclClusterT *clusterPtr);
-enum ZclStatusCodeT ZbZclClusterLoopbackBind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter);
-void ZbZclClusterLoopbackUnbind(struct ZbZclClusterT *clusterPtr, struct ZbApsFilterT *filter);
-
/*---------------------------------------------------------------
* Device Log (whitelist)
*---------------------------------------------------------------
@@ -1325,9 +1361,9 @@ enum ZclStateReqReturn {
ZCL_STATE_CLEANUP /**< Return one to cleanup the state. */
};
-typedef enum ZclStateReqReturn (*ZbZclHandlerFuncT)(struct ZbZclCommandRspT *cmdRsp, void *callback, void *arg);
+typedef enum ZclStateReqReturn (*ZbZclHandlerFuncT)(struct ZigBeeT *zb, struct ZbZclCommandRspT *cmdRsp, void *callback, void *arg);
-enum ZclStatusCodeT ZbZclStateBegin(struct ZigBeeT *zb, ZbApsdeDataReqT *apsReq, struct ZbZclHeaderT *zclHdr,
+enum ZclStatusCodeT ZbZclStateBegin(struct ZigBeeT *zb, struct ZbApsdeDataReqT *apsReq, struct ZbZclHeaderT *zclHdr,
unsigned int timeout, ZbZclHandlerFuncT handler, void *callback, void *arg);
/*---------------------------------------------------------------
@@ -1354,8 +1390,8 @@ void ZbZclClusterSetRadius(struct ZbZclClusterT *clusterPtr, uint8_t radius);
bool ZbZclClusterSetMaxAsduLength(struct ZbZclClusterT *clusterPtr, uint16_t maxAsduLength);
/* Helper functions to initialize requests based on cluster parameters */
-void ZbZclClusterInitCommandReq(struct ZbZclClusterT *clusterPtr, ZbZclCommandReqT *cmdReq);
-void ZbZclClusterInitApsdeReq(struct ZbZclClusterT *clusterPtr, ZbApsdeDataReqT *apsReq, ZbApsdeDataIndT *dataIndPtr);
+void ZbZclClusterInitCommandReq(struct ZbZclClusterT *clusterPtr, struct ZbZclCommandReqT *cmdReq);
+void ZbZclClusterInitApsdeReq(struct ZbZclClusterT *clusterPtr, struct ZbApsdeDataReqT *apsReq, struct ZbApsdeDataIndT *dataIndPtr);
/* Helper to generate proper APS TX Options (e.g. ZB_APSDE_DATAREQ_TXOPTIONS_SECURITY)
* for a response, based on the given (incoming message) security status code. */
uint16_t ZbZclTxOptsFromSecurityStatus(enum ZbStatusCodeT security_status);
@@ -1371,16 +1407,9 @@ uint8_t ZbZclClusterGetRadius(struct ZbZclClusterT *clusterPtr);
unsigned int ZbZclClusterGetMaxAsduLength(struct ZbZclClusterT *clusterPtr);
void ZbZclClusterReportCallbackAttach(struct ZbZclClusterT *clusterPtr,
- void (*callback)(struct ZbZclClusterT *clusterPtr, ZbApsdeDataIndT *dataIndPtr,
+ void (*callback)(struct ZbZclClusterT *clusterPtr, struct ZbApsdeDataIndT *dataIndPtr,
uint16_t attr_id, enum ZclDataTypeT data_type, const uint8_t *in_payload, uint16_t in_len));
-/* Send an alarm from a cluster as if it originated from the alarms cluster
- * on the same endpoint. Typically, src_endpoint = ZbZclClusterGetEndpoint(clusterPtr).
- * If the cluster appears on multiple endpoints (e.g. Basic Cluster), the src_endpoint
- * is required to know which one to actually send the Alarm Command from.
- * The alarm message is sent via APS binding(s). */
-void ZbZclClusterSendAlarm(struct ZbZclClusterT *clusterPtr, uint8_t src_endpoint, uint8_t alarm_code);
-
/*---------------------------------------------------------------
* Exegin Internal ZCL Loopback Commands
*---------------------------------------------------------------
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.identify.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.identify.h
index 77746b9bb..e7b1806a6 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.identify.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.identify.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZCL_CORE_IDENTIFY_H
# define ZCL_CORE_IDENTIFY_H
@@ -65,7 +65,7 @@ enum ZbZclIdentifyServerStateT {
/* Create the Identify Server Cluster.
* 'arg' gets assigned to ZbZclClusterSetCallbackArg. */
struct ZbZclClusterT * ZbZclIdentifyServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, void *arg);
-struct ZbZclClusterT * ZbZclIdentifyClientAlloc(struct ZigBeeT *zb, uint8_t endpoint, void *arg);
+struct ZbZclClusterT * ZbZclIdentifyClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
/* Configure a callback to receive events to "start" or "stop" identifying. */
typedef void (*ZbZclIdentifyCallbackT)(struct ZbZclClusterT *clusterPtr,
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.illum.level.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.illum.level.h
new file mode 100644
index 000000000..83143ed27
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.illum.level.h
@@ -0,0 +1,70 @@
+/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_ILLUM_LEVEL_H
+#define ZCL_ILLUM_LEVEL_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Illuminance Level Sensing
+ * cluster. This cluster's "level status" attribute is expected
+ * to change depending on the current value of the "target level"
+ * attribute and the illuminance measurement cluster's "measured
+ * value" attribute. This behaviour should be implemented in the
+ * application.
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.Illuminance_Level_Sensing
+ * ILLVL.S | True
+ * ILLVL.C | True
+ *
+ * Server Attributes
+ * ILLVL.S.A0000 | True
+ * ILLVL.S.A0001 | False
+ * ILLVL.S.A0010 | True
+ * ILLVL.S.Afffd | True
+ * ILLVL.S.Afffe | False
+ *
+ * Client Attributes
+ * ILLVL.C.Afffd | True
+ * ILLVL.C.Afffe | False
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_ILLUM_LEVEL_ATTR_LEVEL_STATUS = 0x0000,
+ ZCL_ILLUM_LEVEL_ATTR_LIGHT_SENSOR_TYPE = 0x0001,
+ ZCL_ILLUM_LEVEL_ATTR_ILLUM_TARGET_LEVEL = 0x0010
+};
+
+/* Level Status values */
+#define ZCL_ILLUM_LEVEL_STATUS_ON_TARGET 0x00U
+#define ZCL_ILLUM_LEVEL_STATUS_BELOW_TARGET 0x01U
+#define ZCL_ILLUM_LEVEL_STATUS_ABOVE_TARGET 0x02U
+
+/* Light Sensor Type values */
+#define ZCL_ILLUM_LEVEL_SENSOR_TYPE_PHOTODIODE 0x00U
+#define ZCL_ILLUM_LEVEL_SENSOR_TYPE_CMOS 0x01U
+#define ZCL_ILLUM_LEVEL_SENSOR_TYPE_UNKNOWN 0xffU
+
+/* Illuminance Target Level values */
+#define ZCL_ILLUM_LEVEL_TARGET_INVALID 0xffff
+
+/* Illum Level Sensing Defines */
+#define ZCL_ILLUM_LEVEL_STATUS_MIN 0x00
+#define ZCL_ILLUM_LEVEL_STATUS_MAX 0xfe
+#define ZCL_ILLUM_LEVEL_SEN_TYPE_MIN 0x00
+#define ZCL_ILLUM_LEVEL_SEN_TYPE_MAX 0xff
+#define ZCL_ILLUM_LEVEL_TARGET_MIN 0x0000
+#define ZCL_ILLUM_LEVEL_TARGET_MAX 0xffff
+
+/*---------------------------------------------------------------
+ * Illumination Level Sensing Cluster Definitions
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclIllumLevelClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclIllumLevelServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+#endif /* __ZCL_ILLUM_LEVEL_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.level.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.level.h
new file mode 100644
index 000000000..6924da15f
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.level.h
@@ -0,0 +1,220 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_LEVEL_H
+#define ZCL_LEVEL_H
+
+/* PICS.ZCL.Level
+ *
+ * LC.S | TRUE
+ * LC.C | TRUE
+ *
+ * Server Attributes
+ * LC.S.A0000 | TRUE
+ * LC.S.A0000.Scene | TRUE
+ * LC.S.A0000.Report.Tx | TRUE
+ * LC.S.A0001 | FALSE
+ * LC.S.A000f | TRUE
+ * LC.S.A0010 | FALSE
+ * LC.S.A0011 | FALSE
+ * LC.S.A0012 | FALSE
+ * LC.S.A0013 | FALSE
+ * LC.S.A0014 | FALSE
+ * LC.S.A4000 | FALSE
+ * LC.S.Afffd | TRUE
+ *
+ * Commands Received
+ * LC.S.C00.Rsp | TRUE
+ * LC.S.C01.Rsp | TRUE
+ * LC.S.C02.Rsp | TRUE
+ * LC.S.C03.Rsp | TRUE
+ * LC.S.C04.Rsp | TRUE
+ * LC.S.C05.Rsp | TRUE
+ * LC.S.C06.Rsp | TRUE
+ * LC.S.C07.Rsp | TRUE
+ *
+ *
+ * Client Attributes
+ * LC.C.A0000.Report.Rsp | FALSE
+ * LC.C.Afffd | TRUE
+ *
+ * Commands Generated
+ * LC.S.C00.Tx | TRUE
+ * LC.S.C01.Tx | TRUE
+ * LC.S.C02.Tx | TRUE
+ * LC.S.C03.Tx | TRUE
+ * LC.S.C04.Tx | TRUE
+ * LC.S.C05.Tx | TRUE
+ * LC.S.C06.Tx | TRUE
+ * LC.S.C07.Tx | TRUE
+ *
+ */
+
+#include "zcl/zcl.h"
+
+/*---------------------------------------------------------------
+ * Level Control Cluster
+ *---------------------------------------------------------------
+ */
+/* Level Control Cluster Attribute */
+enum {
+ ZCL_LEVEL_ATTR_CURRLEVEL = 0x0000,
+ ZCL_LEVEL_ATTR_REMAINTIME = 0x0001,
+ ZCL_LEVEL_ATTR_MINLEVEL = 0x0002,
+ ZCL_LEVEL_ATTR_MAXLEVEL = 0x0003,
+ ZCL_LEVEL_ATTR_CURRFREQ = 0x0004,
+ ZCL_LEVEL_ATTR_MINFREQ = 0x0005,
+ ZCL_LEVEL_ATTR_MAXFREQ = 0x0006,
+ ZCL_LEVEL_ATTR_OPTIONS = 0x000f,
+ ZCL_LEVEL_ATTR_ONOFF_TRANS_TIME = 0x0010,
+ ZCL_LEVEL_ATTR_ONLEVEL = 0x0011,
+ ZCL_LEVEL_ATTR_ON_TRANS_TIME = 0x0012,
+ ZCL_LEVEL_ATTR_OFF_TRANS_TIME = 0x0013,
+ ZCL_LEVEL_ATTR_DEFAULT_MOVE_RATE = 0x0014,
+ ZCL_LEVEL_ATTR_STARTUP_CURRLEVEL = 0x4000
+};
+
+/* Level Control Command Identifiers */
+enum {
+ ZCL_LEVEL_COMMAND_MOVELEVEL = 0x00,
+ ZCL_LEVEL_COMMAND_MOVE = 0x01,
+ ZCL_LEVEL_COMMAND_STEP = 0x02,
+ ZCL_LEVEL_COMMAND_STOP = 0x03,
+ ZCL_LEVEL_COMMAND_MOVELEVEL_ONOFF = 0x04,
+ ZCL_LEVEL_COMMAND_MOVE_ONOFF = 0x05,
+ ZCL_LEVEL_COMMAND_STEP_ONOFF = 0x06,
+ ZCL_LEVEL_COMMAND_STOP_ONOFF = 0x07
+};
+
+/* Move mode field */
+enum {
+ ZCL_LEVEL_MODE_UP = 0x00,
+ ZCL_LEVEL_MODE_DOWN = 0x01
+};
+
+#define ZCL_LEVEL_OPTIONS_EXECUTE_IF_OFF 0x01
+#define ZCL_LEVEL_OPTIONS_COUPLE_TO_COLOR 0x02
+
+#define ZCL_LEVEL_MINIMUM_LEVEL 0x00
+#define ZCL_LEVEL_MAXIMUM_LEVEL 0xFE
+#define ZCL_LEVEL_ILLEGAL_LEVEL 0xFF
+
+#define ZCL_LEVEL_MINIMUM_RATE 0x00
+#define ZCL_LEVEL_MAXIMUM_RATE 0xFE
+#define ZCL_LEVEL_ILLEGAL_RATE 0xFF
+
+#define ZCL_LEVEL_MINIMUM_TRANS_TIME 0x0000
+#define ZCL_LEVEL_MAXIMUM_TRANS_TIME 0xFFFE
+#define ZCL_LEVEL_ILLEGAL_TRANS_TIME 0xFFFF
+
+/* The CoupleColorTempToLevel bit (bit 1) of the Options attribute indicates whether color
+ * temperature in the color cluster is to be linked with current level in this cluster. If the
+ * CoupleColorTempToLevel bit is 1 and ColorMode or EnhancedColorMode is 0x02, then changes in
+ * Current Level shall effect the ColorTemperatureMireds attribute. This relationship is
+ * defined by the manufacturer, with the qualification that the maximum value of CurrentLevel
+ * shall correspond to a ColorTemperatureMired value equal to the CoupleColorTempToLevelMinMireds
+ * attribute. A low value of the CurrentLevel attribute shall be associated with a high value of
+ * the ColorTemperatureMireds attribute.
+ */
+
+/*-----------------------------------------------------------------------------
+ * Structures
+ *-----------------------------------------------------------------------------
+ */
+struct ZbZclLevelClientMoveToLevelReqT {
+ bool with_onoff; /* If true then cmd is ZCL_LEVEL_COMMAND_MOVELEVEL_ONOFF, else ZCL_LEVEL_COMMAND_MOVELEVEL */
+ uint8_t level;
+ uint16_t transition_time;
+ /* Note: OptionsMask and OptionsOverride are not included in the "With OnOff"
+ * version of this command */
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclLevelClientMoveReqT {
+ bool with_onoff; /* If true then cmd is ZCL_LEVEL_COMMAND_MOVE_ONOFF, else ZCL_LEVEL_COMMAND_MOVE */
+ uint8_t mode;
+ uint8_t rate;
+ /* Note: OptionsMask and OptionsOverride are not included in the "With OnOff"
+ * version of this command */
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclLevelClientStepReqT {
+ bool with_onoff; /* If true then cmd is ZCL_LEVEL_COMMAND_STEP_ONOFF, else ZCL_LEVEL_COMMAND_STEP */
+ uint8_t mode;
+ uint8_t size;
+ uint16_t transition_time;
+ /* Note: OptionsMask and OptionsOverride are not included in the "With OnOff"
+ * version of this command */
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+struct ZbZclLevelClientStopReqT {
+ bool with_onoff; /* If true then cmd is ZCL_LEVEL_COMMAND_STOP_ONOFF, else ZCL_LEVEL_COMMAND_STOP */
+ /* Note: OptionsMask and OptionsOverride are not included in the "With OnOff"
+ * version of this command */
+ uint8_t mask; /* OptionsMask */
+ uint8_t override; /* OptionsOverride */
+};
+
+/*-----------------------------------------------------------------------------
+ * Server
+ *-----------------------------------------------------------------------------
+ */
+
+struct ZbZclLevelServerCallbacksT {
+ /* Returns a ZCL Status code to send in the Default Response, or ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE
+ * if no Default Response to be generated. */
+
+ enum ZclStatusCodeT (*move_to_level)(struct ZbZclClusterT *cluster,
+ struct ZbZclLevelClientMoveToLevelReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*move)(struct ZbZclClusterT *cluster,
+ struct ZbZclLevelClientMoveReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*step)(struct ZbZclClusterT *cluster,
+ struct ZbZclLevelClientStepReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+ enum ZclStatusCodeT (*stop)(struct ZbZclClusterT *cluster,
+ struct ZbZclLevelClientStopReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+};
+
+/**
+ * Allocate the Level Server cluster.
+ * @param zb
+ * @param endpoint
+ * @param onoff_server OnOff Server cluster pointer for processing commands with the Options
+ * fields. May be NULL.
+ * @param callback
+ * @param arg
+ * @return ZCL Status Code
+ */
+struct ZbZclClusterT * ZbZclLevelServerAlloc(struct ZigBeeT *zb,
+ uint8_t endpoint, struct ZbZclClusterT *onoff_server,
+ struct ZbZclLevelServerCallbacksT *callbacks, void *arg);
+
+/*-----------------------------------------------------------------------------
+ * Client
+ *-----------------------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclLevelClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+enum ZclStatusCodeT ZbZclLevelClientMoveToLevelReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclLevelClientMoveToLevelReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclLevelClientMoveReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclLevelClientMoveReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclLevelClientStepReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclLevelClientStepReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclLevelClientStopReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclLevelClientStopReqT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* ZCL_LEVEL_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.nearest.gw.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.nearest.gw.h
new file mode 100644
index 000000000..bb2f2a327
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.nearest.gw.h
@@ -0,0 +1,27 @@
+/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the Nearest Gateway cluster.
+ *--------------------------------------------------------------------------
+ */
+
+#ifndef ZCL_NEAREST_GW_H
+#define ZCL_NEAREST_GW_H
+
+#include "zcl/zcl.h"
+
+/* Attribute Identifiers */
+enum {
+ ZCL_NEAREST_GW_ATTR_NEAREST_GW = 0x0000,
+ ZCL_NEAREST_GW_ATTR_NEW_MOBILE_NODE = 0x0001,
+};
+
+#define ZCL_NEAREST_GW_DEFAULT_NEAREST_GW 0x0000
+#define ZCL_NEAREST_GW_DEFAULT_NEW_MOBILE_NODE 0x0000
+
+/* Allocation Functions */
+struct ZbZclClusterT * ZbZclNearestGwClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclNearestGwServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+#endif /* ZCL_NEAREST_GW_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.h
index 8c430e6ab..ea166a68b 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZCL_ONOFF_H
# define ZCL_ONOFF_H
@@ -96,18 +96,12 @@ struct ZbZclClusterT * ZbZclOnOffClientAlloc(struct ZigBeeT *zb, uint8_t endpoin
/* Client Cluster Commands */
enum ZclStatusCodeT ZbZclOnOffClientOnReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-/* Blocking version. Not supported on all platforms. */
-enum ZclStatusCodeT ZbZclOnOffClientOnWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst);
enum ZclStatusCodeT ZbZclOnOffClientOffReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-/* Blocking version. Not supported on all platforms. */
-enum ZclStatusCodeT ZbZclOnOffClientOffWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst);
enum ZclStatusCodeT ZbZclOnOffClientToggleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
-/* Blocking version. Not supported on all platforms. */
-enum ZclStatusCodeT ZbZclOnOffClientToggleWait(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.swconfig.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.swconfig.h
new file mode 100644
index 000000000..4ed100caf
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.onoff.swconfig.h
@@ -0,0 +1,50 @@
+/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_ONOFF_SWCONFIG_H
+#define ZCL_ONOFF_SWCONFIG_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL OnOff cluster.
+ *
+ * This cluster is dependent on the OnOff client cluster, as the switch
+ * actions attribute specifies the commands of the OnOff cluster to be
+ * generated when the switch moves between it's two states.
+ *--------------------------------------------------------------------------
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_ONOFF_SWCONFIG_ATTR_TYPE = 0x0000, /* R- mandatory! */
+ ZCL_ONOFF_SWCONFIG_ATTR_ACTIONS = 0x0010 /* RW mandatory! */
+};
+
+/* Switch Info values */
+enum {
+ ZCL_ONOFF_SWCONFIG_TOGGLE = 0x00,
+ ZCL_ONOFF_SWCONFIG_MOMENTARY = 0x01,
+ ZCL_ONOFF_SWCONFIG_MULTIFUNCTION = 0x02
+};
+
+/* Switch Settings values */
+enum {
+ ZCL_ONOFF_SWCONFIG_ON_OFF = 0x00,
+ ZCL_ONOFF_SWCONFIG_OFF_ON = 0x01,
+ ZCL_ONOFF_SWCONFIG_TOGGLE_TOGGLE = 0x02
+};
+
+/*---------------------------------------------------------------
+ * OnOff Switch Configuration Server Cluster
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclOnOffSwConfigServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, uint8_t switch_type);
+
+/*---------------------------------------------------------------
+ * OnOff Switch Configuration Client Cluster
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclOnOffSwConfigClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+#endif /* __ZCL_ONOFF_SWCONFIG_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h
new file mode 100644
index 000000000..494bc42b7
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h
@@ -0,0 +1,430 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL OTA upgrade cluster.
+ *
+ * SPECIFICATION
+ * docs-14-0477-00-pfnd-ota-bootload-cluster-with-outstanding-se-ccbs.docx
+ * Interim spec, not released.
+ * Oct 16, 2014.
+ *
+ * DOCUMENTATION
+ * Exegin can provide an OTA Firmware Upgrade Process sequence chart
+ * to better explain the OTA process implemented by these clusters.
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.OTA
+ *
+ * OTA Upgrade Image
+ * OUI1 | True
+ * OUI2a | False
+ * OUI2b | True
+ *
+ * OTA.S | True
+ * OTA.C | True
+ *
+ * Server Attributes
+ * OTA.S.Afffd | True
+ * OTA.S.Afffe | False
+ *
+ * Commands Received
+ * OTA.S.C01.Rsp | True
+ * OTA.S.C03.Rsp | True
+ * OTA.S.C04.Rsp | False
+ * OTA.S.C06.Rsp | True
+ * OTA.S.C08.Rsp | False
+ *
+ * Commands Generated
+ * OTA.S.C00.Tx | True
+ * OTA.S.C02.Tx | True
+ * OTA.S.C05.Tx | True
+ * OTA.S.C07.Tx | True
+ * OTA.S.C09.Tx | False
+ * OOMTS6 | False
+ *
+ * OTA Upgrade Policies
+ * OUPS1 | True
+ * OUPS2 | True (customer application can override)
+ * OUPS3 | False
+ * OUPS4 | True
+ * OUPS5 | False
+ *
+ * Image Notify Payload Types
+ * INPT01 | True
+ * INPT02 | True
+ * INPT03 | True
+ *
+ * Client Attributes
+ * OTA.C.A0000 | True
+ * OTA.C.A0001 | True
+ * OTA.C.A0002 | True
+ * OTA.C.A0003 | True
+ * OTA.C.A0004 | True
+ * OTA.C.A0005 | True
+ * OTA.C.A0006 | True
+ * OTA.C.A0007 | True
+ * OTA.C.A0008 | True
+ * OTA.C.A0009 | True
+ * OTA.C.A000a | True
+ * OTA.C.A000b | True
+ * OTA.C.A000c | True
+ * OTA.C.Afffd | True
+ * OTA.C.Afffe | False
+ *
+ * Commands Received
+ * OTA.C.C00.Rsp | True
+ * OTA.C.C02.Rsp | True
+ * OTA.C.C05.Rsp | True
+ * OTA.C.C07.Rsp | True
+ * OTA.C.C09.Rsp | False
+ *
+ * Commands Generated
+ * OTA.C.C01.Tx | True
+ * OTA.C.C03.Tx | True
+ * OTA.C.C04.Tx | False
+ * OTA.C.C06.Tx | True
+ * OTA.C.C08.Tx | False
+ * OOMTC6 | False
+ *
+ * OTA Upgrade Policies
+ * OUPC0a | depends on customer application
+ * OUPC0b | depends on customer application
+ * OUPC1 | True
+ * OUPC2 | True
+ * OUPC3 | True
+ * OUPC4 | True
+ * OUPC5 | False
+ * OUPC6 | False
+ * OUPC7 | True
+ * OUPC8 | True
+ * OUPC9 | depends on customer application
+ * OUPC10 | depends on customer application
+ * OUPC11 | True
+ * OUPC12 | True
+ */
+#ifndef ZCL_OTA_H
+# define ZCL_OTA_H
+
+/*---------------------------------------------------------------
+ * Dependencies
+ *---------------------------------------------------------------
+ */
+/* Prototype the structs we need in this header file, rather than including
+ * other header files. This file is included by tools outside of zigbee.git. */
+struct ZbZclClusterT;
+struct ZbApsAddrT;
+struct ZbZclCommandRspT;
+
+/*---------------------------------------------------------------
+ * Definitions
+ *---------------------------------------------------------------
+ */
+/* OTA Upgrade Cluster attributes */
+enum ZbZclOtaAttrId {
+ ZCL_OTA_ATTR_UPGRADE_SERVER_ID = 0x0000,
+ ZCL_OTA_ATTR_FILE_OFFSET = 0x0001,
+ ZCL_OTA_ATTR_CURRENT_FILE_VERSION = 0x0002,
+ ZCL_OTA_ATTR_CURRENT_STACK_VERSION = 0x0003,
+ ZCL_OTA_ATTR_DOWNLOAD_FILE_VERSION = 0x0004,
+ ZCL_OTA_ATTR_DOWNLOAD_STACK_VERSION = 0x0005,
+ ZCL_OTA_ATTR_IMAGE_UPGRADE_STATUS = 0x0006,
+ ZCL_OTA_ATTR_MANUFACTURER_ID = 0x0007,
+ ZCL_OTA_ATTR_IMAGE_TYPE_ID = 0x0008,
+ ZCL_OTA_ATTR_MIN_BLOCK_PERIOD = 0x0009,
+ ZCL_OTA_ATTR_IMAGE_STAMP = 0x000a,
+ ZCL_OTA_ATTR_UPGRADE_ACTIVATION_POLICY = 0x00b,
+ ZCL_OTA_ATTR_UPGRADE_TIMEOUT_POLICY = 0x000c
+};
+
+/* Upgrade Status Values */
+enum ZbZclOtaStatus {
+ ZCL_OTA_STATUS_NORMAL = 0,
+ ZCL_OTA_STATUS_DOWNLOAD_IN_PROGRESS = 1,
+ ZCL_OTA_STATUS_DOWNLOAD_COMPLETE = 2,
+ ZCL_OTA_STATUS_WAITING_TO_UPGRADE = 3,
+ ZCL_OTA_STATUS_COUNT_DOWN = 4,
+ ZCL_OTA_STATUS_WAIT_FOR_MORE = 5
+};
+
+/* OTA ZCL commands */
+enum ZbZclOtaCommandId {
+ ZCL_OTA_COMMAND_IMAGE_NOTIFY = 0x00,
+ ZCL_OTA_COMMAND_QUERY_IMAGE_REQUEST = 0x01,
+ ZCL_OTA_COMMAND_QUERY_IMAGE_RESPONSE = 0x02,
+ ZCL_OTA_COMMAND_IMAGE_BLOCK_REQUEST = 0x03,
+ ZCL_OTA_COMMAND_IMAGE_PAGE_REQUEST = 0x04,
+ ZCL_OTA_COMMAND_IMAGE_BLOCK_RESPONSE = 0x05,
+ ZCL_OTA_COMMAND_UPGRADE_END_REQUEST = 0x06,
+ ZCL_OTA_COMMAND_UPGRADE_END_RESPONSE = 0x07,
+ ZCL_OTA_COMMAND_QUERY_FILE_REQUEST = 0x08,
+ ZCL_OTA_COMMAND_QUERY_FILE_RESPONSE = 0x09
+};
+
+enum ZbZclOtaStackVersion {
+ ZCL_OTA_STACK_VERSION_2006 = 0x0000,
+ ZCL_OTA_STACK_VERSION_2007 = 0x0001,
+ ZCL_OTA_STACK_VERSION_PRO = 0x0002,
+ ZCL_OTA_STACK_VERSION_IP = 0x0003
+};
+
+enum ZbZclOtaActivationPolicy {
+ ZCL_OTA_ACTIVATION_POLICY_SERVER = 0x00,
+ ZCL_OTA_ACTIVATION_POLICY_OUT_OF_BAND = 0x01
+};
+
+enum ZbZclOtaTimeoutPolicy {
+ ZCL_OTA_TIMEOUT_POLICY_APPLY_UPGRADE = 0x00,
+ ZCL_OTA_TIMEOUT_POLICY_DO_NOT_APPLY = 0x01
+};
+
+enum ZbZclOtaSecCredential {
+ ZCL_OTA_SEC_CRED_SE_1_0 = 0x00,
+ ZCL_OTA_SEC_CRED_SE_1_1 = 0x01,
+ ZCL_OTA_SEC_CRED_SE_2_0 = 0x02,
+ ZCL_OTA_SEC_CRED_SE_1_2 = 0x03
+};
+
+enum {
+ ZCL_OTA_NOTIFY_TYPE_JITTER = 0x00, /* just jitter */
+ ZCL_OTA_NOTIFY_TYPE_MFG_CODE = 0x01, /* also includes jitter */
+ ZCL_OTA_NOTIFY_TYPE_IMAGE_TYPE = 0x02, /* also includes jitter, mfg code*/
+ ZCL_OTA_NOTIFY_TYPE_FILE_VERSION = 0x03 /* includes all */
+};
+
+enum {
+ ZCL_OTA_QUERY_FIELD_CONTROL_HW_VERSION = 0x01
+};
+
+enum {
+ ZCL_OTA_IMAGE_BLOCK_FC_IEEE = 0x01,
+ ZCL_OTA_IMAGE_BLOCK_FC_MAX_BLOCK = 0x02
+};
+
+#define ZCL_OTA_HARDWARE_VERSION_UNDEFINED ZCL_INVALID_UNSIGNED_16BIT
+
+#define ZCL_OTA_HEADER_FILE_IDENTIFIER 0x0BEEF11E
+#define ZCL_OTA_HEADER_FILE_VERSION 0x0100
+#define ZCL_OTA_HEADER_LENGTH_MIN 56 /* no optional fields */
+#define ZCL_OTA_HEADER_LENGTH_MAX 69 /* all optional fields */
+#define ZCL_OTA_IMAGE_BLOCK_SUB_ELEMENT_HEADER 6 /* tag id [2] tag length [4] */
+#define ZCL_OTA_IMAGE_BLOCK_ZCL_MESSAGE_SIZE 14 /* size of Image Block Response ZCL excluding data */
+#define ZCL_OTA_BLOCK_DATA_SIZE_MAX \
+ (ZCL_PAYLOAD_UNFRAG_SAFE_SIZE - ZCL_OTA_IMAGE_BLOCK_ZCL_MESSAGE_SIZE)
+
+struct ZbZclOtaHeader {
+ /* Mandatory fields. */
+ uint32_t file_identifier;
+ uint16_t header_version;
+ uint16_t header_length;
+ uint16_t header_field_control;
+ uint16_t manufacturer_code;
+ uint16_t image_type;
+ uint32_t file_version;
+ uint16_t stack_version;
+ uint8_t header_string[32];
+ uint32_t total_image_size;
+ /* Optional fields. */
+ uint8_t sec_credential_version;
+ uint64_t file_destination;
+ uint16_t min_hardware_version;
+ uint16_t max_hardware_version;
+};
+
+enum {
+ ZCL_OTA_HEADER_FIELD_CONTROL_SECURITY_VERSION = 0x01,
+ ZCL_OTA_HEADER_FIELD_CONTROL_DEVICE_SPECIFIC = 0x02,
+ ZCL_OTA_HEADER_FIELD_CONTROL_HARDWARE_VERSIONS = 0x04
+};
+
+struct ZbZclOtaImageDefinition {
+ uint16_t manufacturer_code;
+ uint16_t image_type;
+ uint32_t file_version;
+};
+
+enum ZbZclOtaImageType {
+ ZCL_OTA_IMAGE_TYPE_MFG_MIN = 0x0000,
+ ZCL_OTA_IMAGE_TYPE_MFG_MAX = 0xffbf,
+ ZCL_OTA_IMAGE_TYPE_CLI_SECURITY_CRED = 0xffc0,
+ ZCL_OTA_IMAGE_TYPE_CLI_CONFIG = 0xffc1,
+ ZCL_OTA_IMAGE_TYPE_SERVER_LOG = 0xffc2,
+ ZCL_OTA_IMAGE_TYPE_PICTURE = 0xffc3,
+ ZCL_OTA_IMAGE_TYPE_WILDCARD = 0xffff
+};
+
+enum ZbZclOtaSubElementTag {
+ ZCL_OTA_SUB_TAG_UPGRADE_IMAGE = 0x0000,
+ ZCL_OTA_SUB_TAG_ECDSA_SIG1 = 0x0001,
+ ZCL_OTA_SUB_TAG_ECDSA_CERT_1 = 0x0002,
+ ZCL_OTA_SUB_TAG_IMAGE_INTEGRITY_CODE = 0x0003,
+ ZCL_OTA_SUB_TAG_PICTURE_DATA = 0x0004,
+ ZCL_OTA_SUB_TAG_ECDSA_SIG2 = 0x0005,
+ ZCL_OTA_SUB_TAG_ECDSA_CERT_2 = 0x0006
+};
+#define ZCL_OTA_SUB_TAG_TOTAL 7U
+
+struct ZbZclOtaImageData {
+ uint32_t file_offset;
+ uint8_t data_size;
+ uint8_t data[256];
+};
+
+struct ZbZclOtaImageWaitForData {
+ uint32_t current_time;
+ uint32_t request_time;
+ uint16_t minimum_block_period;
+};
+
+struct ZbZclOtaEndResponseTimes {
+ uint32_t current_time;
+ uint32_t upgrade_time;
+};
+
+/*------------------------------------------------------------------------------
+ * OTA Client
+ *------------------------------------------------------------------------------
+ */
+/* Application Callbacks
+ * Note, 'arg' is always the cluster's callback argument, which is passed in through
+ * ZbZclOtaClientAlloc, and can also be configured with ZbZclClusterSetCallbackArg. */
+struct ZbZclOtaClientCallbacksT {
+ /* discover_complete: If NULL and ZbZclOtaClientDiscover is successful, the default handler
+ * will automatically call ZbZclOtaClientQueryNextImageReq. */
+ enum ZclStatusCodeT (*discover_complete)(struct ZbZclClusterT *clusterPtr, void *arg);
+
+ /* If NULL, the OTA Client has default callback handlers to take care of a typical OTA
+ * firmware upgrade file. */
+ enum ZclStatusCodeT (*image_notify)(struct ZbZclClusterT *clusterPtr,
+ uint8_t payload_type, uint8_t jitter, struct ZbZclOtaImageDefinition *image_definition,
+ struct ZbApsdeDataIndT *data_ind, struct ZbZclHeaderT *zcl_header);
+
+ void (*query_next)(struct ZbZclClusterT *clusterPtr, enum ZclStatusCodeT status,
+ struct ZbZclOtaImageDefinition *image_definition, uint32_t image_size, void *arg);
+
+ /* update_raw: Raw image data is sent through this callback, to update running hash of image for example. */
+ enum ZclStatusCodeT (*update_raw)(struct ZbZclClusterT *clusterPtr, uint8_t length, uint8_t *data, void *arg);
+
+ enum ZclStatusCodeT (*write_tag)(struct ZbZclClusterT *clusterPtr, struct ZbZclOtaHeader *header,
+ uint16_t tag_id, uint32_t tag_length, uint8_t data_length, uint8_t *data, void *arg);
+
+ /* write_image: If set, called by the 'write_tag' default handler (ZbZclOtaClientImageWriteTagCb)
+ * for ZCL_OTA_SUB_TAG_UPGRADE_IMAGE data. The return status codes tell the OTA Client what
+ * to do next:
+ * ZCL_STATUS_SUCCESS : request the next block
+ * ZCL_STATUS_WAIT_FOR_DATA : wait for NHLE to call ??? before requesting the next block.
+ * Anything else : abort the OTA download */
+ enum ZclStatusCodeT (*write_image)(struct ZbZclClusterT *clusterPtr, struct ZbZclOtaHeader *header,
+ uint8_t length, uint8_t *data, void *arg);
+
+ /* image_validate: If NULL, provide the ca_pub_key_array in ZbZclOtaClientConfig. */
+ enum ZclStatusCodeT (*image_validate)(struct ZbZclClusterT *clusterPtr, struct ZbZclOtaHeader *header, void *arg);
+
+ enum ZclStatusCodeT (*upgrade_end)(struct ZbZclClusterT *clusterPtr, struct ZbZclOtaHeader *header,
+ uint32_t current_time, uint32_t upgrade_time, void *arg);
+
+ /* reboot: Shall not be NULL. If set, called by the 'upgrade_end' default handler if successful. */
+ void (*reboot)(struct ZbZclClusterT *clusterPtr, void *arg);
+
+ /* abort_download: Shall not be NULL. */
+ enum ZclStatusCodeT (*abort_download)(struct ZbZclClusterT *clusterPtr, enum ZbZclOtaCommandId commandId, void *arg);
+};
+
+struct ZbZclOtaClientConfig {
+ uint16_t profile_id;
+ uint8_t endpoint;
+
+ enum ZbZclOtaActivationPolicy activation_policy;
+ enum ZbZclOtaTimeoutPolicy timeout_policy; /* Value written to ZCL_OTA_ATTR_UPGRADE_TIMEOUT_POLICY. */
+ uint32_t image_block_delay; /* milliseconds */
+
+ /* App needs to provide information about the current running image and hardware. */
+ struct ZbZclOtaHeader current_image;
+ uint16_t hardware_version; /* Version (0xNN00) | Revision (0x00NN) */
+
+ /* If the image_validate() callback is set to the default callback for Suite 2
+ * (by ZbZclOtaClientGetDefaultCallbacks), it requires the OTA Certificate
+ * Authority's Public Key. */
+ const uint8_t *ca_pub_key_array;
+ unsigned int ca_pub_key_len;
+
+ /* OTA client callbacks. Can be intialzied by calling ZbZclOtaClientGetDefaultCallbacks(). */
+ struct ZbZclOtaClientCallbacksT callbacks;
+};
+
+/* Called to retrieve the default callbacks for ECDSA Suite 2 support. */
+void ZbZclOtaClientGetDefaultCallbacks(struct ZbZclOtaClientCallbacksT *callbacks);
+
+/* Allocate the OTA Client */
+struct ZbZclClusterT * ZbZclOtaClientAlloc(struct ZigBeeT *zb, struct ZbZclOtaClientConfig *config, void *arg);
+
+/* Callback "discover" is called once complete */
+enum ZclStatusCodeT ZbZclOtaClientDiscover(struct ZbZclClusterT *cluster, struct ZbApsAddrT *addr);
+
+void ZbZclOtaClientDiscoverForced(struct ZbZclClusterT *cluster, uint64_t ieee,
+ uint8_t endpoint, uint16_t nwkaddr);
+
+enum ZclStatusCodeT ZbZclOtaClientQueryNextImageReq(struct ZbZclClusterT *cluster,
+ struct ZbZclOtaImageDefinition *image_definition, uint8_t field_control,
+ uint16_t hardware_version);
+
+enum ZclStatusCodeT ZbZclOtaClientImageTransferStart(struct ZbZclClusterT *cluster);
+/* ZbZclOtaClientImageTransferResume is only called by the NHLE if it returned
+ * ZCL_STATUS_WAIT_FOR_DATA for the write_image callback. */
+enum ZclStatusCodeT ZbZclOtaClientImageTransferResume(struct ZbZclClusterT *cluster);
+
+/*------------------------------------------------------------------------------
+ * OTA Server
+ *------------------------------------------------------------------------------
+ */
+
+/* Callback to determine if a suitable image exists. Implements policies for
+ * the OTA server such as is a downgrade permitted.
+ */
+typedef bool (*ZbZclOtaServerImageEvalT)(struct ZbZclOtaImageDefinition *query_image,
+ uint8_t field_control, uint16_t hadware_version, uint32_t *image_size, void *arg);
+
+/* called to retrieve more image data from the server */
+typedef enum ZclStatusCodeT (*ZbZclOtaServerImageReadT)(struct ZbZclOtaImageDefinition *image,
+ struct ZbZclOtaImageData *image_data, uint8_t field_control, uint64_t request_node_address,
+ struct ZbZclOtaImageWaitForData *image_wait, void *arg);
+
+/* called when the client sends an Upgrade End request with status of SUCCESS
+ * server responds with */
+typedef enum ZclStatusCodeT (*ZbZclOtaServerUpgradeEndTimeT)(struct ZbZclOtaHeader *image,
+ uint32_t *current_time, uint32_t *upgrade_time, void *arg);
+
+/* called when the client sends an Upgrade End request */
+typedef enum ZclStatusCodeT (*ZbZclOtaServerUpgradeEndReqT)(
+ struct ZbZclOtaImageDefinition *image_definition,
+ enum ZclStatusCodeT *status, struct ZbZclOtaEndResponseTimes *end_response_times, void *arg);
+
+/* Server side configuration */
+struct ZbZclOtaServerConfig {
+ uint16_t profile_id;
+ uint8_t endpoint;
+ uint16_t minimum_block_period;
+ uint32_t upgrade_end_current_time;
+ uint32_t upgrade_end_upgrade_time;
+ ZbZclOtaServerImageEvalT image_eval;
+ ZbZclOtaServerImageReadT image_read;
+ ZbZclOtaServerUpgradeEndReqT image_upgrade_end_req;
+ void *arg; /* application argument to be returned in callbacks */
+};
+
+struct ZbZclClusterT * ZbZclOtaServerAlloc(struct ZigBeeT *zb, struct ZbZclOtaServerConfig *config, void *arg);
+
+/* Registering an image does not automatically send an Image Notify message, the OTA Server application can use */
+/* ZbZclOtaServerImageNotifyReq or ZbZclOtaServerImageNotifyWait after registering an image to notify clients of the
+ * availability of a new image */
+enum ZclStatusCodeT ZbZclOtaServerImageNotifyReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
+ uint8_t payload_type, uint8_t jitter, struct ZbZclOtaImageDefinition *image_definition);
+
+/*------------------------------------------------------------------------------
+ * OTA Misc Helpers
+ *------------------------------------------------------------------------------
+ */
+uint8_t ZbZclOtaHeaderParse(const uint8_t *payload, const uint8_t length, struct ZbZclOtaHeader *header);
+
+#endif /* __ZCL_OTA_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.payload.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.payload.h
new file mode 100644
index 000000000..30044296a
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.payload.h
@@ -0,0 +1,177 @@
+/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_PAYLOAD_H
+# define ZCL_PAYLOAD_H
+
+#include "zcl/zcl.h"
+
+/*lint -save -e9021 [ useof 'undef' is discouraged - 20.5 ADVISORY ] */
+/*lint -save -e9016 [ pointer arithmetic - 18.4 ADVISORY] */
+
+/*---------------------------------------------------------------
+ * ZCL Payload Helpers
+ *---------------------------------------------------------------
+ */
+#define ZCL_BUILDER_CHECK_LEN(size) \
+ do { \
+ if (payload == NULL) { \
+ return -1; \
+ } \
+ if (index == NULL) { \
+ return -1; \
+ } \
+ if ((*index + (size)) > capacity) { \
+ return -1; \
+ } \
+ } while (false)
+
+#define ZCL_BUILDER_TEMPLATE(size, append_func) \
+ do { \
+ ZCL_BUILDER_CHECK_LEN(size); \
+ append_func; \
+ *index += (size); \
+ return (int)*index; \
+ } while (false)
+
+/*
+ * Helper Functions for constructing a ZCL payload
+ */
+static inline int
+zb_zcl_append_uint8(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint8_t value)
+{
+ ZCL_BUILDER_TEMPLATE(1U, payload[*index] = value);
+}
+
+static inline int
+zb_zcl_append_uint16(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint16_t value)
+{
+ ZCL_BUILDER_TEMPLATE(2U, putle16(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint24(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint32_t value)
+{
+ ZCL_BUILDER_TEMPLATE(3U, putle24(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint32(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint32_t value)
+{
+ ZCL_BUILDER_TEMPLATE(4U, putle32(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint40(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint64_t value)
+{
+ ZCL_BUILDER_TEMPLATE(5U, putle40(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint48(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint64_t value)
+{
+ ZCL_BUILDER_TEMPLATE(6U, putle48(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint56(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint64_t value)
+{
+ ZCL_BUILDER_TEMPLATE(7U, putle56(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint64(uint8_t *payload, const unsigned int capacity, unsigned int *index, uint64_t value)
+{
+ ZCL_BUILDER_TEMPLATE(8U, putle64(payload + *index, value));
+}
+
+static inline int
+zb_zcl_append_uint8_array(uint8_t *payload, const unsigned int capacity, unsigned int *index,
+ const uint8_t *value, const unsigned int value_length)
+{
+ unsigned i;
+
+ ZCL_BUILDER_CHECK_LEN(value_length);
+ /* ZbMemCpy is not portable (internal stack use only) */
+ for (i = 0; i < value_length; i++) {
+ payload[*index + i] = value[i];
+ }
+ *index += value_length;
+ return (int)*index;
+}
+
+/* prevent accidental reuse */
+#undef ZCL_BUILDER_TEMPLATE
+
+#define ZCL_PARSER_TEMPLATE(size, extract_func) \
+ do { \
+ if (payload == NULL) { \
+ return -1; \
+ } \
+ if (index == NULL) { \
+ return -1; \
+ } \
+ if ((*index + (size)) > length) { \
+ return -1; \
+ } \
+ *value = extract_func; \
+ *index += (size); \
+ return (int)*index; \
+ } while (false)
+
+/*
+ * Helper Functions for processing a ZCL payload
+ */
+static inline int
+zb_zcl_parse_uint8(const uint8_t *payload, const unsigned int length, unsigned int *index, uint8_t *value)
+{
+ ZCL_PARSER_TEMPLATE(1U, payload[*index]);
+}
+
+static inline int
+zb_zcl_parse_uint16(const uint8_t *payload, const unsigned int length, unsigned int *index, uint16_t *value)
+{
+ ZCL_PARSER_TEMPLATE(2U, pletoh16(payload + *index));
+}
+
+static inline int
+zb_zcl_parse_uint24(const uint8_t *payload, const unsigned int length, unsigned int *index, uint32_t *value)
+{
+ ZCL_PARSER_TEMPLATE(3U, pletoh24(payload + *index));
+}
+
+static inline int
+zb_zcl_parse_uint32(const uint8_t *payload, const unsigned int length, unsigned int *index, uint32_t *value)
+{
+ ZCL_PARSER_TEMPLATE(4U, pletoh32(payload + *index));
+}
+
+static inline int
+zb_zcl_parse_uint40(const uint8_t *payload, const unsigned int length, unsigned int *index, uint64_t *value)
+{
+ ZCL_PARSER_TEMPLATE(5U, pletoh40(payload + *index));
+}
+
+static inline int
+zb_zcl_parse_uint48(const uint8_t *payload, const unsigned int length, unsigned int *index, uint64_t *value)
+{
+ ZCL_PARSER_TEMPLATE(6U, pletoh48(payload + *index));
+}
+
+static inline int
+zb_zcl_parse_uint56(const uint8_t *payload, const unsigned int length, unsigned int *index, uint64_t *value)
+{
+ ZCL_PARSER_TEMPLATE(7U, pletoh56(payload + *index));
+}
+
+static inline int
+zb_zcl_parse_uint64(const uint8_t *payload, const unsigned int length, unsigned int *index, uint64_t *value)
+{
+ ZCL_PARSER_TEMPLATE(8U, pletoh64(payload + *index));
+}
+
+/* prevent accidental reuse */
+#undef ZCL_PARSER_TEMPLATE
+
+/*lint -restore */
+/*lint -restore */
+#endif /* __ZCL_PAYLOAD_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.poll.control.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.poll.control.h
new file mode 100644
index 000000000..38a132e98
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.poll.control.h
@@ -0,0 +1,171 @@
+/* Copyright [2019 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_POLL_CONTROL_H
+# define ZCL_POLL_CONTROL_H
+
+/* PICS.ZCL.Poll.Control
+ * POLL.S | True
+ * POLL.C | True
+ *
+ * Server Attributes
+ * POLL.S.A0000 | True
+ * POLL.S.A0001 | True
+ * POLL.S.A0002 | True
+ * POLL.S.A0003 | True
+ * POLL.S.A0004 | True
+ * POLL.S.A0005 | True
+ * POLL.S.A0006 | True
+ * POLL.S.AFFFD | True
+ * POLL.S.AFFFE | False
+ *
+ * Commands received
+ * POLL.S.C00.Rsp | True
+ * POLL.S.C01.Rsp | True
+ * POLL.S.C02.Rsp | True
+ * POLL.S.C03.Rsp | True
+ *
+ * Commands sent
+ * POLL.S.C00.Tx | True
+ *
+ * Client Attributes
+ * POLL.C.AFFFD | True
+ * POLL.C.AFFFE | False
+ *
+ * Commands received
+ * POLL.C.C00.Rsp | True
+ *
+ * Commands sent
+ * POLL.C.C00.Tx | True
+ * POLL.C.C01.Tx | True
+ * POLL.C.C02.Tx | True
+ * POLL.C.C03.Tx | True
+ */
+
+#include "zcl/zcl.h"
+
+/* Poll Control Cluster Attribute Set */
+enum {
+ /* Server Attribute Set */
+ ZCL_POLL_CHECK_IN_INTERVAL = 0x0000, /* RW- mandatory */
+ ZCL_POLL_LONG_POLL_INTERVAL = 0x0001, /* R - mandatory */
+ ZCL_POLL_SHORT_POLL_INTERVAL = 0x0002, /* R - mandatory */
+ ZCL_POLL_FAST_POLL_TIMEOUT = 0x0003, /* RW - mandatory */
+ ZCL_POLL_CHECK_IN_INTERVAL_MIN = 0x0004, /* R */
+ ZCL_POLL_LONG_POLL_INTERVAL_MIN = 0x0005, /* R */
+ ZCL_POLL_FAST_POLL_TIMEOUT_MAX = 0x0006, /* R */
+
+};
+
+/* Client Generated Commands */
+enum {
+ ZCL_POLL_CTRL_CLI_CHECK_IN_RSP = 0x00, /* mandatory */
+ ZCL_POLL_CTRL_CLI_FAST_POLL_STOP = 0x01, /* mandatory */
+ ZCL_POLL_CTRL_CLI_SET_LONG_POLL_INTERVAL = 0x02,
+ ZCL_POLL_CTRL_CLI_SET_SHOR_POLL_INTERVAL = 0x03
+};
+
+/* Server Generated Commands */
+enum {
+ ZCL_POLL_CTRL_SVR_CHECK_IN = 0x00 /* mandatory */
+};
+
+struct zcl_poll_checkin_rsp_t {
+ enum ZclStatusCodeT status;
+ bool start_fast_poll;
+ uint16_t fast_poll_timeout;
+};
+
+/*---------------------------------------------------------------
+ * Server API
+ *---------------------------------------------------------------
+ */
+struct ZbZclPollControlServerCallbackT {
+ void (*checkin_rsp)(struct ZbZclClusterT *clusterPtr,
+ struct zcl_poll_checkin_rsp_t *rsp_info, struct ZbZclAddrInfoT *srcInfo, void *arg);
+};
+
+/**
+ * Allocate the Poll Control Server cluster
+ * @param zb Zigbee instance
+ * @param endpoint Endpoint to allocate cluster on
+ * @return Cluster instance
+ */
+struct ZbZclClusterT * zcl_poll_server_alloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclPollControlServerCallbackT *callbacks, void *arg);
+
+/**
+ * Get the Poll Control Server to send a Check-in Request to any bound Clients.
+ * @param cluster Cluster instance
+ * @return ZCL Status Code
+ */
+enum ZclStatusCodeT zcl_poll_server_send_checkin(struct ZbZclClusterT *cluster);
+
+/**
+ * Change the long polling interval. Default is disabled (ZCL_INVALID_UNSIGNED_32BIT = 0xffffffff).
+ * @param clusterPtr
+ * @param long_poll_intvl Polling interval in quarter-seconds (1 = 250 mS)
+ * @return ZCL Status Code
+ */
+enum ZclStatusCodeT zcl_poll_server_write_long_poll_intvl(struct ZbZclClusterT *clusterPtr,
+ uint32_t long_poll_intvl);
+
+/*---------------------------------------------------------------
+ * Client API
+ *---------------------------------------------------------------
+ */
+struct ZbZclPollControlClientCheckinInfo {
+ struct ZbApsAddrT dst;
+ bool start_fast_poll;
+ uint16_t fast_poll_timeout;
+};
+
+struct ZbZclPollControlClientStopReq {
+ struct ZbApsAddrT dst;
+};
+
+struct ZbZclPollControlClientSetLongReq {
+ struct ZbApsAddrT dst;
+ uint32_t interval;
+};
+
+struct ZbZclPollControlClientSetShortReq {
+ struct ZbApsAddrT dst;
+ uint16_t interval;
+};
+
+struct ZbZclPollControlClientCallbackT {
+ /* Callback limitation note:
+ * If timeout returned to the callback is zero, that means that the server is fast polling
+ * for the amount of time it's fast poll timeout attribute is set to.
+ *
+ * We can only assume that the server is fast polling if the default response status is
+ * success, since there is no way for the client to know if the server is actually fast
+ * polling from the check-in response due to various reasons (i.e. already fast polling,
+ * fails to start fast poll after sending the default response, or stopped fast polling).
+ *
+ * If the polling boolean is false, there is a chance that the server is fast polling
+ * still. This could be due to other Poll Clients the server is bound to.
+ * */
+ enum ZclStatusCodeT (*checkin_rsp_callback)(struct ZbZclClusterT *clusterPtr,
+ struct zcl_poll_checkin_rsp_t *rsp_info, struct ZbZclAddrInfoT *srcInfo, void *arg);
+};
+
+struct ZbZclClusterT * zcl_poll_client_alloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclPollControlClientCallbackT *callbacks, void *arg);
+
+enum ZclStatusCodeT zcl_poll_client_set_checkin_rsp(struct ZbZclClusterT *cluster,
+ struct ZbZclPollControlClientCheckinInfo *info);
+
+enum ZclStatusCodeT zcl_poll_client_stop_fastpoll_req(struct ZbZclClusterT *cluster,
+ struct ZbZclPollControlClientStopReq *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_poll_client_set_long_intvl_req(struct ZbZclClusterT *cluster,
+ struct ZbZclPollControlClientSetLongReq *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_poll_client_set_short_intvl_req(struct ZbZclClusterT *cluster,
+ struct ZbZclPollControlClientSetShortReq *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* ZCL_POLL_CONTROL_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.config.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.config.h
new file mode 100644
index 000000000..378275e27
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.config.h
@@ -0,0 +1,158 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_POWER_H
+# define ZCL_POWER_H
+
+/* PICS.ZCL.Power
+ * PC.S | True
+ * PC.C | True
+ *
+ * Server Attributes
+ * PC.S.A0000 | True
+ * PC.S.A0001 | True
+ * PC.S.A0010 | False
+ * PC.S.A0011 | True
+ * PC.S.A0012 | True
+ * PC.S.A0013 | False
+ * PC.S.A0020 | False
+ * PC.S.A0021 | False
+ * PC.S.A0030 | False
+ * PC.S.A0031 | True
+ * PC.S.A0032 | False
+ * PC.S.A0033 | False
+ * PC.S.A0034 | False
+ * PC.S.A0035 | False
+ * PC.S.A0036 | False
+ * PC.S.A0037 | False
+ * PC.S.A0038 | False
+ * PC.S.A0039 | False
+ * PC.S.A003a | False
+ * PC.S.A003b | False
+ * PC.S.A003c | False
+ * PC.S.A003d | False
+ * PC.S.A003e | False
+ * PC.S.A0040 | False
+ * PC.S.A0041 | False
+ * PC.S.A0050 | False
+ * PC.S.A0051 | True
+ * PC.S.A0052 | False
+ * PC.S.A0053 | False
+ * PC.S.A0054 | False
+ * PC.S.A0055 | False
+ * PC.S.A0056 | False
+ * PC.S.A0057 | False
+ * PC.S.A0058 | False
+ * PC.S.A0059 | False
+ * PC.S.A005a | False
+ * PC.S.A005b | False
+ * PC.S.A005c | False
+ * PC.S.A005d | False
+ * PC.S.A005e | False
+ * PC.S.A0060 | False
+ * PC.S.A0061 | False
+ * PC.S.A0070 | False
+ * PC.S.A0071 | True
+ * PC.S.A0072 | False
+ * PC.S.A0073 | False
+ * PC.S.A0074 | False
+ * PC.S.A0075 | False
+ * PC.S.A0076 | False
+ * PC.S.A0077 | False
+ * PC.S.A0078 | False
+ * PC.S.A0079 | False
+ * PC.S.A007a | False
+ * PC.S.A007b | False
+ * PC.S.A007c | False
+ * PC.S.A007d | False
+ * PC.S.A007e | False
+ * PC.S.Afffd | False
+ * PC.S.Afffe | False
+ *
+ * Client Attributes
+ * PC.C.Afffd | True
+ * PC.C.Afffe | False
+ */
+
+#include "zcl/zcl.h"
+
+/* Power Configuration Cluster Attributes */
+enum {
+ ZCL_POWER_CONFIG_ATTR_MAINS_VOLTAGE = 0x0000,
+ ZCL_POWER_CONFIG_ATTR_MAINS_FREQ = 0x0001,
+ ZCL_POWER_CONFIG_ATTR_MAINS_ALARM_MASK = 0x0010,
+ ZCL_POWER_CONFIG_ATTR_MAINS_VOLT_MIN = 0x0011,
+ ZCL_POWER_CONFIG_ATTR_MAINS_VOLT_MAX = 0x0012,
+ ZCL_POWER_CONFIG_ATTR_MAINS_VOLT_DWELL = 0x0013,
+ /* First battery.*/
+ ZCL_POWER_CONFIG_ATTR_BATTERY_VOLTAGE = 0x0020,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_PCT = 0x0021,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_MFR_NAME = 0x0030,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_SIZE = 0x0031,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_HRRATING = 0x0032,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_QUANTITY = 0x0033,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_RATED_VOLT = 0x0034,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_ALARM_MASK = 0x0035,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_VOLT_MIN = 0x0036,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_VTHRESHOLD1 = 0x0037,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_VTHRESHOLD2 = 0x0038,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_VTHRESHOLD3 = 0x0039,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_PCT_MIN = 0x003A,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_PTHRESHOLD1 = 0x003B,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_PTHRESHOLD2 = 0x003C,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_PTHRESHOLD3 = 0x003D,
+ ZCL_POWER_CONFIG_ATTR_BATTERY_ALARM_STATE = 0x003E,
+ /* Second battery.*/
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_VOLTAGE = 0x0040,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_PCT = 0x0041,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_MFR_NAME = 0x0050,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_SIZE = 0x0051,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_HRRATING = 0x0052,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_QUANTITY = 0x0053,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_RATED_VOLT = 0x0054,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_ALARM_MASK = 0x0055,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_VOLT_MIN = 0x0056,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_VTHRESHOLD1 = 0x0057,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_VTHRESHOLD2 = 0x0058,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_VTHRESHOLD3 = 0x0059,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_PCT_MIN = 0x005A,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_PTHRESHOLD1 = 0x005B,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_PTHRESHOLD2 = 0x005C,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_PTHRESHOLD3 = 0x005D,
+ ZCL_POWER_CONFIG_ATTR_BATTERY2_ALARM_STATE = 0x005E,
+ /* Third battery! */
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_VOLTAGE = 0x0060,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_PCT = 0x0061,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_MFR_NAME = 0x0070,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_SIZE = 0x0071,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_HRRATING = 0x0072,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_QUANTITY = 0x0073,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_RATED_VOLT = 0x0074,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_ALARM_MASK = 0x0075,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_VOLT_MIN = 0x0076,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_VTHRESHOLD1 = 0x0077,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_VTHRESHOLD2 = 0x0078,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_VTHRESHOLD3 = 0x0079,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_PCT_MIN = 0x007A,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_PTHRESHOLD1 = 0x007B,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_PTHRESHOLD2 = 0x007C,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_PTHRESHOLD3 = 0x007D,
+ ZCL_POWER_CONFIG_ATTR_BATTERY3_ALARM_STATE = 0x007E,
+};
+
+/* Default Values */
+#define ZCL_POWER_CONFIG_MAINS_ALARM_MASK_DEFAULT 0x00
+#define ZCL_POWER_CONFIG_MAINS_VOLT_MIN_DEFAULT 0x0000
+#define ZCL_POWER_CONFIG_MAINS_VOLT_MAX_DEFAULT 0xFFFF
+#define ZCL_POWER_CONFIG_BATTERY_PCT_DEFAULT 0x00
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_DEFAULT 0xFF
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_MASK_DEFAULT 0x00
+#define ZCL_POWER_CONFIG_BATTERY_VOLT_MIN_DEFAULT 0x0000
+#define ZCL_POWER_CONFIG_BATTERY_PCT_MIN_DEFAULT 0x00
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_DEFAULT 0x00000000
+#define ZCL_POWER_CONFIG_BATTERY2_SIZE_DEFAULT 0xFF
+#define ZCL_POWER_CONFIG_BATTERY3_SIZE_DEFAULT 0xFF
+
+/* Power Config Client/Server */
+struct ZbZclClusterT * ZbZclPowerConfigClientAlloc(struct ZigBeeT *zb, uint8_t ept);
+struct ZbZclClusterT * ZbZclPowerConfigServerAlloc(struct ZigBeeT *zb, uint8_t ept);
+#endif /* __ZCL_POWER_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.profile.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.profile.h
index f267528a6..804032521 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.profile.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.profile.h
@@ -1,4 +1,4 @@
-/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2019 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZCL_PWR_PROF_H
#define ZCL_PWR_PROF_H
@@ -54,9 +54,9 @@ enum {
#define ZCL_PWR_PROF_SCHED_MODE_CHEAPEST 0x01U
#define ZCL_PWR_PROF_SCHED_MODE_GREENEST 0x02U
-/* BUGBUG - review these values */
-#define ZCL_PWR_PROF_MAX_PROFILES 16U /* theoretical max is 0xfe (254) */
-#define ZCL_PWR_PROF_MAX_ENERGY_PHASES 16U /* theoretical max is 0xfe (254) */
+/* These are arbitrary limits to save memory. Theoretical max is 0xfe (254) */
+#define ZCL_PWR_PROF_MAX_PROFILES 16U
+#define ZCL_PWR_PROF_MAX_ENERGY_PHASES 16U
enum ZbZclPowerProfState {
ZCL_PWR_PROF_STATE_PROFILE_IDLE = 0x00,
@@ -205,22 +205,22 @@ enum ZclStatusCodeT ZbZclPowerProfClientStateReq(struct ZbZclClusterT *clusterPt
/* ZCL_PWR_PROF_CLI_PRICE_RSP */
enum ZclStatusCodeT ZbZclPowerProfClientPriceRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliPriceRsp *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_SCHED_PRICE_RSP */
enum ZclStatusCodeT ZbZclPowerProfClientSchedPriceRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliSchedPriceRsp *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PHASES_NOTIFY */
enum ZclStatusCodeT ZbZclPowerProfClientPhasesNotify(struct ZbZclClusterT *clusterPtr,
struct ZbZclPowerProfCliPhasesNotify *notify, struct ZbApsAddrT *dst,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PHASES_RSP */
enum ZclStatusCodeT ZbZclPowerProfClientPhasesResponse(struct ZbZclClusterT *clusterPtr,
struct ZbZclPowerProfCliPhasesNotify *notify, struct ZbZclAddrInfoT *dst,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_SCHED_CONS_REQ */
enum ZclStatusCodeT ZbZclPowerProfClientSchedConsReq(struct ZbZclClusterT *clusterPtr,
@@ -235,7 +235,7 @@ enum ZclStatusCodeT ZbZclPowerProfClientPhasesSchedStateReq(struct ZbZclClusterT
/* ZCL_PWR_PROF_CLI_PRICE_EXT_RSP */
enum ZclStatusCodeT ZbZclPowerProfClientPriceExtRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliPriceRsp *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* Power Profile Server Callbacks
* If application sends a response, the callback return code should be set to
@@ -269,17 +269,17 @@ struct ZbZclClusterT * ZbZclPowerProfServerAlloc(struct ZigBeeT *zb, uint8_t end
/* ZCL_PWR_PROF_SVR_PROFILE_NOTIFY */
enum ZclStatusCodeT ZbZclPowerProfServerProfileNotify(struct ZbZclClusterT *clusterPtr,
struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrProfileRsp *notify,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_PROFILE_RSP */
enum ZclStatusCodeT ZbZclPowerProfServerProfileRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrProfileRsp *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_STATE_RSP */
enum ZclStatusCodeT ZbZclPowerProfServerStateRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrStateRsp *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_GET_PRICE */
enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReq(struct ZbZclClusterT *clusterPtr,
@@ -289,7 +289,7 @@ enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReq(struct ZbZclClusterT *cluste
/* ZCL_PWR_PROF_SVR_STATE_NOTIFY */
enum ZclStatusCodeT ZbZclPowerProfServerStateNotify(struct ZbZclClusterT *clusterPtr,
struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrStateRsp *notify,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_GET_SCHED_PRICE */
enum ZclStatusCodeT ZbZclPowerProfServerGetSchedPriceReq(struct ZbZclClusterT *clusterPtr,
@@ -303,22 +303,22 @@ enum ZclStatusCodeT ZbZclPowerProfServerPhasesReq(struct ZbZclClusterT *clusterP
/* ZCL_PWR_PROF_SVR_PHASES_RSP */
enum ZclStatusCodeT ZbZclPowerProfServerPhasesRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrPhasesRsp *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_PHASES_NOTIFY */
enum ZclStatusCodeT ZbZclPowerProfServerPhasesNotify(struct ZbZclClusterT *clusterPtr,
struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrPhasesRsp *notify,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_CONSTRAINTS_NOTIFY */
enum ZclStatusCodeT ZbZclPowerProfServerConstraintsNotify(struct ZbZclClusterT *clusterPtr,
struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrConstraintsNotify *notify,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_CONSTRAINTS_RSP */
enum ZclStatusCodeT ZbZclPowerProfServerConstraintsRsp(struct ZbZclClusterT *clusterPtr,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrConstraintsNotify *rsp,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_GET_PRICE_EXT */
enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReqExtReq(struct ZbZclClusterT *clusterPtr,
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.pump.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.pump.h
new file mode 100644
index 000000000..50de37a43
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.pump.h
@@ -0,0 +1,65 @@
+/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_PUMP_H
+#define ZCL_PUMP_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Pump Configuration and
+ * Control cluster. There are many optional attributes for this
+ * cluster. If external pressure, flow or temperture measurements
+ * are expected to be processed, then these measurements can be
+ * obtained from clusters 0x0402, 0x0403 and 0x0404 which may or
+ * may not be on the same endpoint. If alarms are used, the Alarm
+ * Server cluster must be on the same endpoint. More information
+ * can be found in the Zigbee Cluster Library Specification.
+ *--------------------------------------------------------------------------
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_PUMP_ATTR_MAX_PRESSURE = 0x0000,
+ ZCL_PUMP_ATTR_MAX_SPEED = 0x0001,
+ ZCL_PUMP_ATTR_MAX_FLOW = 0x0002,
+ ZCL_PUMP_ATTR_MIN_CONST_PRESSURE = 0x0003,
+ ZCL_PUMP_ATTR_MAX_CONST_PRESSURE = 0x0004,
+ ZCL_PUMP_ATTR_MIN_COMP_PRESSURE = 0x0005,
+ ZCL_PUMP_ATTR_MAX_COMP_PRESSURE = 0x0006,
+ ZCL_PUMP_ATTR_MIN_CONST_SPEED = 0x0007,
+ ZCL_PUMP_ATTR_MAX_CONST_SPEED = 0x0008,
+ ZCL_PUMP_ATTR_MIN_CONST_FLOW = 0x0009,
+ ZCL_PUMP_ATTR_MAX_CONST_FLOW = 0x000a,
+ ZCL_PUMP_ATTR_MIN_CONST_TEMP = 0x000b,
+ ZCL_PUMP_ATTR_MAX_CONST_TEMP = 0x000c,
+ ZCL_PUMP_ATTR_PUMP_STATUS = 0x0010,
+ ZCL_PUMP_ATTR_EFF_OP_MODE = 0x0011,
+ ZCL_PUMP_ATTR_EFF_CTRL_MODE = 0x0012,
+ ZCL_PUMP_ATTR_CAPACITY = 0x0013,
+ ZCL_PUMP_ATTR_SPEED = 0x0014,
+ ZCL_PUMP_ATTR_RUNNING_HOURS = 0x0015,
+ ZCL_PUMP_ATTR_POWER = 0x0016,
+ ZCL_PUMP_ATTR_ENERGY_CONSUMED = 0x0017,
+ ZCL_PUMP_ATTR_OP_MODE = 0x0020,
+ ZCL_PUMP_ATTR_CTRL_MODE = 0x0021,
+ ZCL_PUMP_ATTR_ALARM_MASK = 0x0022
+};
+
+#define ZCL_PUMP_OP_MODE_DEFAULT 0x00
+#define ZCL_PUMP_PRESSURE_MIN (int16_t)0x8001
+#define ZCL_PUMP_PRESSURE_MAX (int16_t)0x7fff
+#define ZCL_PUMP_TEMP_MIN (int16_t)0x954d
+#define ZCL_PUMP_TEMP_MAX (int16_t)0x7fff
+#define ZCL_PUMP_CAPACITY_MIN (int16_t)0x0000
+#define ZCL_PUMP_CAPACITY_MAX (int16_t)0x7fff
+#define ZCL_PUMP_CAPACITY_UNKNOWN (int16_t)0x8000
+
+/*---------------------------------------------------------------
+ * Illumination Level Sensing Cluster Definitions
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclPumpClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclPumpServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+#endif /* __ZCL_PUMP_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.rssi.loc.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.rssi.loc.h
new file mode 100644
index 000000000..627c6aa52
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.rssi.loc.h
@@ -0,0 +1,259 @@
+/* Copyright [2019 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_RSSI_LOC_H
+#define ZCL_RSSI_LOC_H
+
+#include "zcl/zcl.h"
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the RSSI Location cluster.
+ *--------------------------------------------------------------------------
+ */
+
+/* Attribute Identifiers */
+enum {
+ ZCL_RSSI_LOC_SVR_ATTR_LOCATION_TYPE = 0x0000,
+ ZCL_RSSI_LOC_SVR_ATTR_LOCATION_METHOD = 0x0001,
+ ZCL_RSSI_LOC_SVR_ATTR_LOCATION_AGE = 0x0002,
+ ZCL_RSSI_LOC_SVR_ATTR_QUALITY_MEAS = 0x0003,
+ ZCL_RSSI_LOC_SVR_ATTR_NUM_DEVICES = 0x0004,
+ ZCL_RSSI_LOC_SVR_ATTR_COORD1 = 0x0010,
+ ZCL_RSSI_LOC_SVR_ATTR_COORD2 = 0x0011,
+ ZCL_RSSI_LOC_SVR_ATTR_COORD3 = 0x0012,
+ ZCL_RSSI_LOC_SVR_ATTR_POWER = 0x0013,
+ ZCL_RSSI_LOC_SVR_ATTR_PATH_LOSS_EXP = 0x0014,
+ ZCL_RSSI_LOC_SVR_ATTR_REPORT_PERIOD = 0x0015,
+ ZCL_RSSI_LOC_SVR_ATTR_CALC_PERIOD = 0x0016,
+ ZCL_RSSI_LOC_SVR_ATTR_NUM_RSSI_MEAS = 0x0017
+};
+
+/* Commands */
+#define ZCL_RSSI_LOC_CLI_CMD_SET_ABS_LOC 0x00
+#define ZCL_RSSI_LOC_CLI_CMD_SET_DEV_CONFIG 0x01
+#define ZCL_RSSI_LOC_CLI_CMD_GET_DEV_CONFIG 0x02
+#define ZCL_RSSI_LOC_CLI_CMD_GET_LOC_DATA 0x03
+#define ZCL_RSSI_LOC_CLI_CMD_RSSI_RSP 0x04
+#define ZCL_RSSI_LOC_CLI_CMD_SEND_PINGS 0x05
+#define ZCL_RSSI_LOC_CLI_CMD_ANCHOR_NODE_ANNC 0x06
+
+#define ZCL_RSSI_LOC_CLI_CMD_DEV_CONFIG_RSP 0x00
+#define ZCL_RSSI_LOC_CLI_CMD_LOC_DATA_RSP 0x01
+#define ZCL_RSSI_LOC_CLI_CMD_LOC_DATA_NOTIF 0x02
+#define ZCL_RSSI_LOC_CLI_CMD_COMP_DATA_NOTIF 0x03
+#define ZCL_RSSI_LOC_CLI_CMD_RSSI_PING 0x04
+#define ZCL_RSSI_LOC_CLI_CMD_RSSI_REQUEST 0x05
+#define ZCL_RSSI_LOC_CLI_CMD_REPORT_RSSI 0x06
+#define ZCL_RSSI_LOC_CLI_CMD_REQ_OWN_LOC 0x07
+
+/* Attribute Values */
+#define ZCL_RSSI_LOC_LOC_TYPE_ABSOLUTE 0x01 /* 1 = Abs, 0 = Measured */
+#define ZCL_RSSI_LOC_LOC_TYPE_2D 0x02 /* 1 = 2D, 0 = 3D */
+#define ZCL_RSSI_LOC_LOC_TYPE_COORD_MASK 0x0c
+#define ZCL_RSSI_LOC_LOC_TYPE_COORD_RECT 0x00
+
+#define ZCL_RSSI_LOC_MAX_NEIGHBOURS 16U
+
+/* Structures */
+struct rssi_loc_set_abs_loc {
+ int16_t coord1;
+ int16_t coord2;
+ int16_t coord3;
+ int16_t power;
+ uint16_t path_loss_exp;
+};
+
+struct rssi_loc_set_dev_config {
+ int16_t power;
+ uint16_t path_loss_exp;
+ uint16_t calc_period;
+ uint8_t num_rssi_meas;
+ uint16_t report_period;
+};
+
+struct rssi_loc_get_dev_config {
+ uint64_t target_addr;
+};
+
+struct rssi_loc_get_loc_data {
+ uint8_t bitmap;
+ uint8_t num_responses;
+ uint64_t target_addr;
+};
+
+struct rssi_loc_rssi_rsp {
+ uint64_t replying_dev;
+ int16_t x;
+ int16_t y;
+ int16_t z;
+ int8_t rssi;
+ uint8_t num_rssi_meas;
+};
+
+struct rssi_loc_send_pings {
+ uint64_t target_addr;
+ uint8_t num_rssi_meas;
+ uint16_t calc_period;
+};
+
+struct rssi_loc_anchor_node_annc {
+ uint64_t addr;
+ int16_t x;
+ int16_t y;
+ int16_t z;
+};
+
+struct rssi_loc_dev_config_rsp {
+ enum ZclStatusCodeT status;
+ int16_t power;
+ uint16_t path_loss_exp;
+ uint16_t calc_period;
+ uint8_t num_rssi_meas;
+ uint16_t report_period;
+};
+
+struct rssi_loc_loc_data_rsp {
+ enum ZclStatusCodeT status;
+ uint8_t loc_type;
+ int16_t coord1;
+ int16_t coord2;
+ int16_t coord3;
+ int16_t power;
+ uint16_t path_loss_exp;
+ uint8_t loc_method;
+ uint8_t quality_meas;
+ uint16_t loc_age;
+};
+
+struct rssi_loc_loc_data_notif {
+ uint8_t loc_type;
+ int16_t coord1;
+ int16_t coord2;
+ int16_t coord3;
+ int16_t power;
+ uint16_t path_loss_exp;
+ uint8_t loc_method;
+ uint8_t quality_meas;
+ uint16_t loc_age;
+};
+
+struct rssi_loc_comp_data_notif {
+ uint8_t loc_type;
+ int16_t coord1;
+ int16_t coord2;
+ int16_t coord3;
+ uint8_t quality_meas;
+ uint16_t loc_age;
+};
+
+struct rssi_loc_rssi_ping {
+ uint8_t loc_type;
+};
+
+struct rssi_loc_rssi_req {
+ uint8_t rssi;
+};
+
+struct rssi_loc_neighbour_info {
+ uint64_t neighbour;
+ int16_t x;
+ int16_t y;
+ int16_t z;
+ int8_t rssi;
+ uint8_t num_rssi_meas;
+};
+
+struct rssi_loc_report_rssi {
+ uint64_t measuring_dev;
+ uint8_t n_neighbours;
+ struct rssi_loc_neighbour_info neighbours_info[ZCL_RSSI_LOC_MAX_NEIGHBOURS];
+};
+
+struct rssi_loc_req_own_loc {
+ uint64_t addr;
+};
+
+/* Callbacks */
+struct zcl_rssi_loc_server_callbacks_t {
+ enum ZclStatusCodeT (*set_abs_loc)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_set_abs_loc *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*set_dev_config)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_set_dev_config *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*get_dev_config)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_get_dev_config *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*get_loc_data)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_get_loc_data *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*send_pings)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_send_pings *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*anchor_node_annc)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_anchor_node_annc *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+};
+
+struct zcl_rssi_loc_client_callbacks_t {
+ enum ZclStatusCodeT (*loc_data_notif)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_loc_data_notif *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*comp_data_notif)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_comp_data_notif *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*rssi_ping)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_rssi_ping *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*rssi_req)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_rssi_req *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*report_rssi)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_report_rssi *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*req_own_loc)(struct ZbZclClusterT *clusterPtr, struct rssi_loc_req_own_loc *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+};
+
+/* Allocation Functions */
+struct ZbZclClusterT * ZbZclRssiLocClientAlloc(struct ZigBeeT *zb, uint8_t endpoint, struct zcl_rssi_loc_client_callbacks_t *callbacks, void *arg);
+struct ZbZclClusterT * ZbZclRssiLocServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, struct zcl_rssi_loc_server_callbacks_t *callbacks, void *arg);
+
+/* Client API */
+enum ZclStatusCodeT ZbZclRssiLocClientSetAbsLocation(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_set_abs_loc *set_abs_loc, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocClientSetDevConfig(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_set_dev_config *set_dev_config, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocClientGetDevConfig(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_get_dev_config *get_dev_config, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocClientGetLocData(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_get_loc_data *get_loc_data, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocServerSendRssiRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct rssi_loc_rssi_rsp *rsp);
+
+enum ZclStatusCodeT ZbZclRssiLocClientSendPings(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_send_pings *send_pings, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocClientAnchorNodeAnnc(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_anchor_node_annc *anchor_node_annc, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* Server API */
+
+enum ZclStatusCodeT ZbZclRssiLocServerSendDevConfigRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct rssi_loc_dev_config_rsp *rsp);
+
+enum ZclStatusCodeT ZbZclRssiLocServerSendLocDataRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct rssi_loc_loc_data_rsp *rsp);
+
+enum ZclStatusCodeT ZbZclRssiLocServerLocDataNotif(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocServerCompDataNotif(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocServerRssiPing(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocServerRssiReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocServerReportRssi(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_report_rssi *report_rssi, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclRssiLocServerReqOwnLoc(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct rssi_loc_req_own_loc *req_own_loc, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+#endif /* ZCL_RSSI_LOC_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h
new file mode 100644
index 000000000..760600f49
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h
@@ -0,0 +1,333 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_SCENES_H
+# define ZCL_SCENES_H
+
+#include "zcl/zcl.h"
+
+/* PICS.ZCL.Scenes
+ *
+ * S.S | True
+ * S.C | True
+ *
+ * Server Attributes
+ * S.S.A0000 | True
+ * S.S.A0001 | True
+ * S.S.A0002 | True
+ * S.S.A0003 | True
+ * S.S.A0004 | True
+ * S.S.A0005 | True
+ * S.S.Afffd | True
+ *
+ * Commands Received
+ * S.S.C00.Rsp | True
+ * S.S.C01.Rsp | True
+ * S.S.C02.Rsp | True
+ * S.S.C03.Rsp | True
+ * S.S.C04.Rsp | True
+ * S.S.C05.Rsp | True
+ * S.S.C06.Rsp | True
+ * S.S.C40.Rsp | True
+ * S.S.C41.Rsp | True
+ * S.S.C42.Rsp | True
+ *
+ * Commands Generated
+ * S.S.C00.Tx | True
+ * S.S.C01.Tx | True
+ * S.S.C02.Tx | True
+ * S.S.C03.Tx | True
+ * S.S.C04.Tx | True
+ * S.S.C06.Tx | True
+ * S.S.C40.Tx | True
+ * S.S.C41.Tx | True
+ * S.S.C42.Tx | True
+ *
+ *
+ * Client Attributes
+ * S.C.Afffd | True
+ *
+ * Commands Received
+ * S.C.C00.Rsp | True
+ * S.C.C01.Rsp | True
+ * S.C.C02.Rsp | True
+ * S.C.C03.Rsp | True
+ * S.C.C04.Rsp | True
+ * S.C.C05.Rsp | True
+ * S.C.C06.Rsp | True
+ * S.C.C40.Rsp | True
+ * S.C.C41.Rsp | True
+ * S.C.C42.Rsp | True
+ *
+ * Commands Generated
+ * S.C.C00.Tx | True
+ * S.C.C01.Tx | True
+ * S.C.C02.Tx | True
+ * S.C.C03.Tx | True
+ * S.C.C04.Tx | True
+ * S.C.C06.Tx | True
+ * S.C.C40.Tx | True
+ * S.C.C41.Tx | True
+ * S.C.C42.Tx | True
+ */
+
+/*---------------------------------------------------------------
+ * Definitions
+ *---------------------------------------------------------------
+ */
+/* Attribute Identifiers */
+enum {
+ ZCL_SCENES_ATTR_SCENE_COUNT = 0x0000,
+ ZCL_SCENES_ATTR_CURRENT_SCENE = 0x0001,
+ ZCL_SCENES_ATTR_CURRENT_GROUP = 0x0002,
+ ZCL_SCENES_ATTR_SCENE_VALID = 0x0003,
+ ZCL_SCENES_ATTR_NAME_SUPPORT = 0x0004,
+ ZCL_SCENES_ATTR_LAST_CONFIGURED_BY = 0x0005,
+};
+
+/* Commands (Request IDs are the same as the Response IDs. */
+enum {
+ ZCL_SCENES_COMMAND_ADD_SCENE = 0x00,
+ ZCL_SCENES_COMMAND_VIEW_SCENE = 0x01,
+ ZCL_SCENES_COMMAND_REMOVE_SCENE = 0x02,
+ ZCL_SCENES_COMMAND_REMOVE_ALL_SCENES = 0x03,
+ ZCL_SCENES_COMMAND_STORE_SCENE = 0x04,
+ ZCL_SCENES_COMMAND_RECALL_SCENE = 0x05,
+ ZCL_SCENES_COMMAND_GET_SCENE_MBRSHIP = 0x06,
+ ZCL_SCENES_COMMAND_ENH_ADD_SCENE = 0x40,
+ ZCL_SCENES_COMMAND_ENH_VIEW_SCENE = 0x41,
+ ZCL_SCENES_COMMAND_COPY_SCENE = 0x42,
+};
+
+#define ZCL_SCENES_NAME_MAX_LENGTH 16
+
+#define ZCL_SCENES_RECALL_TRANSITION_INVALID 0xffff
+
+/*---------------------------------------------------------------------------
+ * Scenes Server
+ *---------------------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclScenesServerAlloc(
+ struct ZigBeeT *zb,
+ /* Define the endpoint to bind this cluster to. */
+ uint8_t endpoint,
+ /* Define the maximum number of scenes supported by this cluster. */
+ uint8_t max_scenes);
+
+/*---------------------------------------------------------------------------
+ * Scenes Client
+ *---------------------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclScenesClientAlloc(
+ struct ZigBeeT *zb,
+ /* Define the endpoint to bind this cluster to. */
+ uint8_t endpoint);
+
+/*---------------------------------------------------------------
+ * Client Add Scene Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_add_request_t {
+ bool isEnhanced;
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+ uint8_t sceneId;
+ uint16_t transition;
+ const char *sceneName; /* string length must be <= ZCL_SCENES_NAME_MAX_LENGTH */
+ const char *extStrPtr;
+};
+
+struct zcl_scenes_add_response_t {
+ uint8_t status;
+ uint16_t groupId;
+ uint8_t sceneId;
+};
+
+enum ZclStatusCodeT zcl_scenes_client_add_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_add_request_t *add_req, void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_add_rsp_parse(struct zcl_scenes_add_response_t *add_rsp,
+ struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client View Scene Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_view_request_t {
+ bool isEnhanced;
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+ uint8_t sceneId;
+};
+
+/* EXEGIN - arbitrary */
+#define ZCL_SCENES_VIEW_NAME_MAX_LEN 128
+#define ZCL_SCENES_VIEW_EXT_FIELD_MAX_LEN 128
+#define ZCL_SCENES_VIEW_EXT_LIST_MAX_SZ 8
+
+struct zcl_scenes_view_response_t {
+ uint8_t status;
+ uint16_t groupId;
+ uint8_t sceneId;
+ uint16_t transition;
+ char nameStr[ZCL_SCENES_NAME_MAX_LENGTH + 1U];
+
+ uint8_t extNum;
+ struct {
+ uint16_t clusterId;
+ uint8_t length;
+ uint8_t field[ZCL_SCENES_VIEW_EXT_FIELD_MAX_LEN];
+ } extList[ZCL_SCENES_VIEW_EXT_LIST_MAX_SZ];
+};
+
+enum ZclStatusCodeT zcl_scenes_client_view_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_view_request_t *view_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_view_rsp_parse(struct zcl_scenes_view_response_t *view_rsp,
+ struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client Remove Scene Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_remove_request_t {
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+ uint8_t sceneId;
+};
+
+struct zcl_scenes_remove_response_t {
+ uint8_t status;
+ uint16_t groupId;
+ uint8_t sceneId;
+};
+
+enum ZclStatusCodeT zcl_scenes_client_remove_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_remove_request_t *remove_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_remove_rsp_parse(struct zcl_scenes_remove_response_t *remove_rsp,
+ struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client Remove All Scenes Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_remove_all_request_t {
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+};
+
+struct zcl_scenes_remove_all_response_t {
+ uint8_t status;
+ uint16_t groupId;
+};
+
+enum ZclStatusCodeT zcl_scenes_client_remove_all_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_remove_all_request_t *remove_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_remove_all_rsp_parse(struct zcl_scenes_remove_all_response_t *remove_rsp,
+ struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client Store Scene Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_store_request_t {
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+ uint8_t sceneId;
+};
+
+struct zcl_scenes_store_response_t {
+ uint8_t status;
+ uint16_t groupId;
+ uint8_t sceneId;
+};
+
+enum ZclStatusCodeT zcl_scenes_client_store_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_store_request_t *store_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_store_rsp_parse(struct zcl_scenes_store_response_t *store_rsp,
+ struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client Recall Scene Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_recall_request_t {
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+ uint8_t sceneId;
+ /* [optional] Transition time in tenths. ZCL_SCENES_RECALL_TRANSITION_INVALID
+ * (0xffff) means invalid, and won't be included. */
+ uint16_t transition;
+};
+
+/* No cluster-specific response. Expect a Default Response with status. */
+struct zcl_scenes_recall_response_t {
+ uint8_t status;
+};
+
+enum ZclStatusCodeT zcl_scenes_client_recall_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_recall_request_t *recall_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_recall_rsp_parse(struct zcl_scenes_recall_response_t *recall_rsp, struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client Get Membership Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_membership_request_t {
+ struct ZbApsAddrT dst;
+ uint16_t groupId;
+};
+
+/* EXEGIN - arbitrary */
+#define ZCL_SCENES_GET_MEMBERSHIP_MAX_SCENES 128
+
+struct zcl_scenes_membership_response_t {
+ uint8_t status;
+ uint8_t capacity;
+ uint16_t groupId;
+ uint8_t sceneCount;
+ uint8_t sceneList[ZCL_SCENES_GET_MEMBERSHIP_MAX_SCENES];
+};
+
+enum ZclStatusCodeT zcl_scenes_client_get_membership_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_membership_request_t *get_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_get_membership_rsp_parse(
+ struct zcl_scenes_membership_response_t *get_rsp, struct ZbZclCommandRspT *zcl_rsp);
+
+/*---------------------------------------------------------------
+ * Client Copy Scene Helper
+ *---------------------------------------------------------------
+ */
+struct zcl_scenes_copy_request_t {
+ struct ZbApsAddrT dst;
+ bool allScenes;
+ uint16_t groupFrom;
+ uint8_t sceneFrom; /* only used if allScenes is false */
+ uint16_t groupTo;
+ uint8_t sceneTo; /* only used if allScenes is false */
+};
+
+struct zcl_scenes_copy_response_t {
+ uint8_t status;
+ uint16_t groupFrom;
+ uint8_t sceneFrom;
+};
+
+enum ZclStatusCodeT zcl_scenes_client_copy_req(struct ZbZclClusterT *clusterPtr,
+ struct zcl_scenes_copy_request_t *copy_req,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT zcl_scenes_client_copy_rsp_parse(struct zcl_scenes_copy_response_t *copy_rsp,
+ struct ZbZclCommandRspT *zcl_rsp);
+
+#endif /* __ZCL_SCENES_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h
new file mode 100644
index 000000000..4f4e3313d
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h
@@ -0,0 +1,299 @@
+/* Copyright [2017 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_THERM_H
+#define ZCL_THERM_H
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * ZCL Thermostat cluster definitions
+ *--------------------------------------------------------------------------
+ */
+
+/* PICS.ZCL.Thermostat
+ * TSTAT.S | True
+ * TSTAT.C | True
+ *
+ * Server Attributes
+ * TSTAT.S.A0000 | True
+ * TSTAT.S.A0000.Report.Tx | True
+ * TSTAT.S.A0001 | False
+ * TSTAT.S.A0002 | False
+ * TSTAT.S.A0003 | False
+ * TSTAT.S.A0004 | False
+ * TSTAT.S.A0005 | False
+ * TSTAT.S.A0006 | False
+ * TSTAT.S.A0007 | False
+ * TSTAT.S.A0007.Report.Tx | False
+ * TSTAT.S.A0008 | False
+ * TSTAT.S.A0008.Report.Tx | False
+ * TSTAT.S.A0010 | False
+ * TSTAT.S.A0011 | False
+ * TSTAT.S.A0011.Scene | False
+ * TSTAT.S.A0012 | False
+ * TSTAT.S.A0012.Scene | False
+ * TSTAT.S.A0013 | False
+ * TSTAT.S.A0014 | False
+ * TSTAT.S.A0015 | False
+ * TSTAT.S.A0016 | False
+ * TSTAT.S.A0017 | False
+ * TSTAT.S.A0018 | False
+ * TSTAT.S.A0019 | False
+ * TSTAT.S.A001A | False
+ * TSTAT.S.A001B | True
+ * TSTAT.S.A001C | True
+ * TSTAT.S.A001C.Scene | True
+ * TSTAT.S.A001D | False
+ * TSTAT.S.A001E | False
+ * TSTAT.S.A0020 | False
+ * TSTAT.S.A0021 | False
+ * TSTAT.S.A0022 | False
+ * TSTAT.S.A0023 | False
+ * TSTAT.S.A0024 | False
+ * TSTAT.S.A0025 | False
+ * TSTAT.S.A0029 | False
+ * TSTAT.S.A0030 | False
+ * TSTAT.S.A0031 | False
+ * TSTAT.S.A0032 | False
+ * TSTAT.S.A0040 | False
+ * TSTAT.S.A0041 | False
+ * TSTAT.S.A0042 | False
+ * TSTAT.S.A0043 | False
+ * TSTAT.S.A0044 | False
+ * TSTAT.S.A0045 | False
+ * TSTAT.S.A0046 | False
+ * TSTAT.S.A0047 | False
+ * TSTAT.S.Afffd | True
+ * TSTAT.S.Afffe | False
+ *
+ * Commands Received
+ * TSTAT.S.C00.Rsp | True
+ * TSTAT.S.C01.Rsp | False
+ * TSTAT.S.C02.Rsp | False
+ * TSTAT.S.C03.Rsp | False
+ * TSTAT.S.C04.Rsp | False
+ *
+ * Commands Generated
+ * TSTAT.S.C00.Tx | True
+ * TSTAT.S.C01.Tx | True
+ *
+ *
+ * Client Attributes
+ * TSTAT.C.A0000.Report.Rsp | False
+ * TSTAT.C.A0007.Report.Rsp | False
+ * TSTAT.C.A0008.Report.Rsp | False
+ * TSTAT.C.Afffd | True
+ * TSTAT.C.Afffd | False
+ */
+
+#include "zcl/zcl.h"
+
+/*---------------------------------------------------------------
+ * Definitions
+ *---------------------------------------------------------------
+ */
+/* Attribute Identifiers */
+enum {
+ /* Thermostat Info - 0x000x */
+ ZCL_THERM_SVR_ATTR_LOCAL_TEMP = 0x0000, /* int16 [0x954d,0x7fff] - MANDATORY */
+ ZCL_THERM_SVR_ATTR_OUTDOOR_TEMP = 0x0001, /* int16 */
+ ZCL_THERM_SVR_ATTR_OCCUPANCY = 0x0002, /* map8 */
+ ZCL_THERM_SVR_ATTR_ABS_MIN_HEAT_SETPOINT_LIMIT = 0x0003, /* int16 [0x954d,0x7fff] */
+ ZCL_THERM_SVR_ATTR_ABS_MAX_HEAT_SETPOINT_LIMIT = 0x0004, /* int16 */
+ ZCL_THERM_SVR_ATTR_ABS_MIN_COOL_SETPOINT_LIMIT = 0x0005, /* int16 */
+ ZCL_THERM_SVR_ATTR_ABS_MAX_COOL_SETPOINT_LIMIT = 0x0006, /* int16 */
+ ZCL_THERM_SVR_ATTR_PI_COOLING_DEMAND = 0x0007, /* uint8 [0x00,0x64] */
+ ZCL_THERM_SVR_ATTR_PI_HEATING_DEMAND = 0x0008, /* uint8 [0x00,0x64] */
+ ZCL_THERM_SVR_ATTR_HVAC_SYSTYPE_CONFIG = 0x0009, /* map8 */
+
+ /* Thermostat Settings - 0x001x */
+ ZCL_THERM_SVR_ATTR_LOCAL_TEMP_CALIB = 0x0010, /* int8 [0xe7,0x19] */
+ ZCL_THERM_SVR_ATTR_OCCUP_COOL_SETPOINT = 0x0011, /* int16 - MANDATORY* */
+ ZCL_THERM_SVR_ATTR_OCCUP_HEAT_SETPOINT = 0x0012, /* int16 - MANDATORY* */
+ ZCL_THERM_SVR_ATTR_UNOCCUP_COOL_SETPOINT = 0x0013, /* int16 */
+ ZCL_THERM_SVR_ATTR_UNOCCUP_HEAT_SETPOINT = 0x0014, /* int16 */
+ ZCL_THERM_SVR_ATTR_MIN_HEAT_SETPOINT = 0x0015, /* int16 [0x954d,0x7fff] */
+ ZCL_THERM_SVR_ATTR_MAX_HEAT_SETPOINT = 0x0016, /* int16 [0x954d,0x7fff] */
+ ZCL_THERM_SVR_ATTR_MIN_COOL_SETPOINT = 0x0017, /* int16 [0x954d,0x7fff] */
+ ZCL_THERM_SVR_ATTR_MAX_COOL_SETPOINT = 0x0018, /* int16 [0x954d,0x7fff] */
+ ZCL_THERM_SVR_ATTR_MIN_SETPOINT_DEADBAND = 0x0019, /* int8 [0x0a,0x19] */
+ ZCL_THERM_SVR_ATTR_RMT_SENSE = 0x001A, /* map8 */
+ ZCL_THERM_SVR_ATTR_CONTROL_SEQ_OPER = 0x001B, /* enum8 [00,05] - MANDATORY */
+ ZCL_THERM_SVR_ATTR_SYSTEM_MODE = 0x001C, /* enum - MANDATORY */
+ ZCL_THERM_SVR_ATTR_ALARM_MASK = 0x001D, /* map8 */
+ ZCL_THERM_SVR_ATTR_RUNNING_MODE = 0x001E, /* enum [0,4] */
+
+ /* Thermostat Schedule - 0x002x */
+ ZCL_THERM_SVR_ATTR_START_OF_WEEK = 0x0020,
+ ZCL_THERM_SVR_ATTR_NUM_WEEKLY_TRANSITIONS = 0x0021,
+ ZCL_THERM_SVR_ATTR_NUM_DAILY_TRANSITIONS = 0x0022,
+ ZCL_THERM_SVR_ATTR_TEMP_SETPOINT_HOLD = 0x0023,
+ ZCL_THERM_SVR_ATTR_TEMP_SETPOINT_HOLD_DUR = 0x0024,
+ ZCL_THERM_SVR_ATTR_PROG_OPER_MODE = 0x0025,
+ ZCL_THERM_SVR_ATTR_RUNNING_STATE = 0x0029,
+
+ /* Thermostat Setpoint Change Tracking - 0x003x */
+ ZCL_THERM_SVR_ATTR_SETPOINT_CHANGE_SRC = 0x0030,
+ ZCL_THERM_SVR_ATTR_SETPOINT_CHANGE_AMT = 0x0031,
+ ZCL_THERM_SVR_ATTR_SETPOINT_CHANGE_TIMESTAMP = 0x0032,
+ /* Reserved - 0x0033 */
+ ZCL_THERM_SVR_ATTR_OCCUP_SETBACK = 0x0034,
+ ZCL_THERM_SVR_ATTR_OCCUP_SETBACK_MIN = 0x0035,
+ ZCL_THERM_SVR_ATTR_OCCUP_SETBACK_MAX = 0x0036,
+ ZCL_THERM_SVR_ATTR_UNOCCUP_SETBACK = 0x0037,
+ ZCL_THERM_SVR_ATTR_UNOCCUP_SETBACK_MIN = 0x0038,
+ ZCL_THERM_SVR_ATTR_UNOCCUP_SETBACK_MAX = 0x0039,
+ ZCL_THERM_SVR_ATTR_EMERGENCY_HEAT_DELTA = 0x003a,
+
+ /* AC Information - 0x004x */
+ ZCL_THERM_SVR_ATTR_AC_TYPE = 0x0040,
+ ZCL_THERM_SVR_ATTR_AC_CAPACITY = 0x0041,
+ ZCL_THERM_SVR_ATTR_AC_REFIGERANT_TYPE = 0x0042,
+ ZCL_THERM_SVR_ATTR_AC_COMPRESSOR_TYPE = 0x0043,
+ ZCL_THERM_SVR_ATTR_AC_ERROR_CODE = 0x0044,
+ ZCL_THERM_SVR_ATTR_AC_LOUVER_POSITION = 0x0045,
+ ZCL_THERM_SVR_ATTR_AC_COIL_TEMP = 0x0046,
+ ZCL_THERM_SVR_ATTR_AC_CAPACITY_FORMAT = 0x0047
+};
+
+#define ZCL_THERM_TEMP_MIN (-27315) /* 0x954d = -27315 */
+#define ZCL_THERM_TEMP_MAX (32767) /* 0x7fff = 32797 */
+
+/* Meaning for CNTRL_SEQ */
+#define ZCL_THERM_CONTROL_OPERCOOL_ONLY 0x00
+#define ZCL_THERM_CONTROL_OPERCOOL_REHEAT 0x01
+#define ZCL_THERM_CONTROL_OPERHEAT_ONLY 0x02
+#define ZCL_THERM_CONTROL_OPERHEAT_REHEAT 0x03
+#define ZCL_THERM_CONTROL_OPERCOOL_HEAT 0x04
+#define ZCL_THERM_CONTROL_OPERCOOL_HEAT_REHEAT 0x05
+
+/* Meaning for SYS_MODE */
+#define ZCL_THERM_SYSMODE_OFF 0x00
+#define ZCL_THERM_SYSMODE_AUTO 0x01
+#define ZCL_THERM_SYSMODE_COOL 0x03
+#define ZCL_THERM_SYSMODE_HEAT 0x04
+#define ZCL_THERM_SYSMODE_EHEAT 0x05
+#define ZCL_THERM_SYSMODE_PRECOOL 0x06
+#define ZCL_THERM_SYSMODE_FAN 0x07
+#define ZCL_THERM_SYSMODE_DRY 0x08
+#define ZCL_THERM_SYSMODE_SLEEP 0x09
+
+/* Client Generated Commands */
+enum {
+ ZCL_THERM_CLI_SETPOINT_RAISE_LOWER = 0x00, /* mandatory */
+ ZCL_THERM_CLI_SET_WEEK_SCHED = 0x01,
+ ZCL_THERM_CLI_GET_WEEK_SCHED = 0x02,
+ ZCL_THERM_CLI_CLEAR_WEEK_SCHED = 0x03,
+ ZCL_THERM_CLI_GET_RELAY_LOG = 0x04
+};
+
+/* Server Generated Commands */
+enum {
+ ZCL_THERM_SVR_GET_WEEK_RSP = 0x00,
+ ZCL_THERM_SVR_GET_RELAY_LOG_RSP = 0x01
+};
+
+struct ZbZclThermCliSetpointT {
+ uint8_t mode;
+ int8_t amount;
+};
+
+#define ZCL_THERM_NUM_TRANSITIONS_MAX 10U
+
+struct ZbZclThermTransitionsT {
+ uint16_t transition_time;
+ int16_t heat_set_point; /* optional */
+ int16_t cool_set_point; /* optional */
+};
+
+#define ZCL_THERM_DAY_OF_WEEK_SUNDAY 0x01
+#define ZCL_THERM_DAY_OF_WEEK_MONDAY 0x02
+#define ZCL_THERM_DAY_OF_WEEK_TUESDAY 0x04
+#define ZCL_THERM_DAY_OF_WEEK_WEDNESDAY 0x08
+#define ZCL_THERM_DAY_OF_WEEK_THURSDAY 0x10
+#define ZCL_THERM_DAY_OF_WEEK_FRIDAY 0x20
+#define ZCL_THERM_DAY_OF_WEEK_SATURDAY 0x40
+#define ZCL_THERM_DAY_OF_WEEK_VACATION 0x80
+
+#define ZCL_THERM_MODE_HEAT_SETPOINT_PRESENT 0x01
+#define ZCL_THERM_MODE_COOL_SETPOINT_PRESENT 0x02
+
+struct ZbZclThermWeeklySchedT {
+ uint8_t num_transitions;
+ uint8_t day_of_week_seq; /* e.g. ZCL_THERM_DAY_OF_WEEK_SUNDAY */
+ uint8_t mode_for_seq; /* e.g. ZCL_THERM_MODE_HEAT_SETPOINT_PRESENT */
+ struct ZbZclThermTransitionsT transitions[ZCL_THERM_NUM_TRANSITIONS_MAX];
+};
+
+struct ZbZclThermCliGetWeeklyT {
+ uint8_t days_to_return;
+ uint8_t mode_to_return;
+};
+
+/* Thermostat Client */
+struct ZbZclClusterT * ZbZclThermClientAlloc(struct ZigBeeT *zb, uint8_t ep);
+
+/* ZCL_THERM_CLI_SETPOINT_RAISE_LOWER */
+enum ZclStatusCodeT ZbZclThermClientSetpointRaiseLower(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclThermCliSetpointT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_THERM_CLI_SET_WEEK_SCHED */
+enum ZclStatusCodeT ZbZclThermClientSetWeeklySched(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclThermWeeklySchedT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_THERM_CLI_GET_WEEK_SCHED */
+enum ZclStatusCodeT ZbZclThermClientGetWeeklySched(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst, struct ZbZclThermCliGetWeeklyT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_THERM_CLI_CLEAR_WEEK_SCHED */
+enum ZclStatusCodeT ZbZclThermClientClearWeeklySched(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* ZCL_THERM_CLI_GET_RELAY_LOG */
+enum ZclStatusCodeT ZbZclThermClientGetRelayStatusLog(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/* Thermostat Server */
+
+struct ZbZclThermSvrGetRelayStatusLogRspT {
+ uint16_t time_of_day;
+ uint16_t relay_status;
+ int16_t local_temp;
+ uint8_t humidity_percent;
+ int16_t set_point;
+ uint16_t unread_entries;
+};
+
+struct ZbZclThermServerCallbacksT {
+ enum ZclStatusCodeT (*setpoint_raise_lower)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclThermCliSetpointT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*set_weekly)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclThermWeeklySchedT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*get_weekly)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclThermCliGetWeeklyT *req, struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*clear_weekly)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclAddrInfoT *srcInfo);
+
+ enum ZclStatusCodeT (*get_relay_status_log)(struct ZbZclClusterT *clusterPtr, void *arg,
+ struct ZbZclAddrInfoT *srcInfo);
+};
+
+struct ZbZclClusterT * ZbZclThermServerAlloc(struct ZigBeeT *zb, uint8_t ep,
+ struct ZbZclThermServerCallbacksT *callbacks, void *arg);
+
+/* ZCL_THERM_SVR_GET_WEEK_RSP */
+enum ZclStatusCodeT ZbZclThermServerGetWeeklySchedRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclThermWeeklySchedT *rsp);
+
+/* ZCL_THERM_SVR_GET_RELAY_LOG_RSP */
+enum ZclStatusCodeT ZbZclThermServerGetRelayStatusLogRsp(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclAddrInfoT *dstInfo, struct ZbZclThermSvrGetRelayStatusLogRspT *rsp);
+
+#endif /* __ZCL_TERM__H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.voice.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.voice.h
new file mode 100644
index 000000000..f9ef26ec3
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.voice.h
@@ -0,0 +1,141 @@
+/* Copyright [2019 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_VOICE_H
+#define ZCL_VOICE_H
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the Voice Over Zigbee cluster.
+ *--------------------------------------------------------------------------
+ */
+
+#include "zcl/zcl.h"
+
+/* Attribute Identifiers */
+enum {
+ ZCL_VOICE_ATTR_CODEC_TYPE = 0x0000,
+ ZCL_VOICE_ATTR_SAMP_FREQ = 0x0001,
+ ZCL_VOICE_ATTR_CODECRATE = 0x0002,
+ ZCL_VOICE_ATTR_ESTAB_TIMEOUT = 0x0003,
+ ZCL_VOICE_ATTR_CODEC_TYPE_SUB_1 = 0x0004,
+ ZCL_VOICE_ATTR_CODEC_TYPE_SUB_2 = 0x0005,
+ ZCL_VOICE_ATTR_CODEC_TYPE_SUB_3 = 0x0006,
+ ZCL_VOICE_ATTR_COMPRESSION_TYPE = 0x0007,
+ ZCL_VOICE_ATTR_COMPRESSION_RATE = 0x0008,
+ ZCL_VOICE_ATTR_OPTION_FLAGS = 0x0009,
+ ZCL_VOICE_ATTR_THRESHOLD = 0x000a
+};
+
+/* Client Generated Commands */
+enum {
+ ZCL_VOICE_CLI_ESTAB_REQ = 0x00,
+ ZCL_VOICE_CLI_VOICE_TX = 0x01,
+ ZCL_VOICE_CLI_TX_COMPLETE = 0x02,
+ ZCL_VOICE_CLI_CONTROL_RSP = 0x03
+};
+
+/* Server Generated Commands */
+enum {
+ ZCL_VOICE_SVR_ESTAB_RSP = 0x00,
+ ZCL_VOICE_SVR_VOICE_TX_RSP = 0x01,
+ ZCL_VOICE_SVR_CONTROL = 0x02
+};
+
+/* Voice of Zigbee Defined Values */
+#define FLAG_CODEC_TYPE_SUB_1 0x01
+#define FLAG_CODEC_TYPE_SUB_2 0x02
+#define FLAG_CODEC_TYPE_SUB_3 0x04
+#define FLAG_COMPRESSION_TYPE 0x08
+#define FLAG_COMPRESSION_RATE 0x10
+
+/* Request and Response Structures */
+struct voice_estab_req_t {
+ uint8_t flag;
+ uint8_t codec_type;
+ uint8_t samp_freq;
+ uint8_t codec_rate;
+ uint8_t service_type;
+ uint8_t codec_type_s1;
+ uint8_t codec_type_s2;
+ uint8_t codec_type_s3;
+ uint8_t comp_type;
+ uint8_t comp_rate;
+};
+
+struct voice_estab_rsp_t {
+ uint8_t ack_nak;
+ uint8_t codec_type;
+};
+
+struct voice_voice_tx_t {
+ uint8_t *voice_data;
+ uint16_t voice_data_len;
+};
+
+struct voice_voice_tx_rsp_t {
+ uint8_t seq_no;
+ uint8_t error_flag;
+};
+
+struct voice_control_t {
+ uint8_t control_type;
+};
+
+struct voice_control_rsp_t {
+ uint8_t ack_nak;
+};
+
+/* Callback Structures */
+struct zcl_voice_server_callbacks_t {
+ /* For voice_tx, the application should return ZCL_STATUS_SUCCESS for all received packets, which will send
+ * a Default Response with SUCCESS. The ZCL7 spec is written such that it appears the server should not
+ * send a response at all, and the application would return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE and only
+ * send ZbZclVoiceServerSendVoiceTxRsp() upon error. This doesn't follow the standard ZCL method, where all
+ * requests should generate a reponse using the same ZCL sequence number. We'll leave this open to the
+ * application developer to decide. */
+ enum ZclStatusCodeT (*estab_req)(struct ZbZclClusterT *clusterPtr, struct voice_estab_req_t *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*voice_tx)(struct ZbZclClusterT *clusterPtr, struct voice_voice_tx_t *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*tx_complete)(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *src_info, void *arg);
+};
+
+struct zcl_voice_client_callbacks_t {
+ enum ZclStatusCodeT (*voice_tx_rsp)(struct ZbZclClusterT *clusterPtr, struct voice_voice_tx_rsp_t *cmd_rsp,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+ enum ZclStatusCodeT (*control)(struct ZbZclClusterT *clusterPtr, struct voice_control_t *cmd_req,
+ struct ZbZclAddrInfoT *src_info, void *arg);
+};
+
+/* Allocation Functions */
+struct ZbZclClusterT * ZbZclVoiceClientAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct zcl_voice_client_callbacks_t *callbacks, void *arg);
+struct ZbZclClusterT * ZbZclVoiceServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct zcl_voice_server_callbacks_t *callbacks, void *arg);
+
+/* Client API */
+enum ZclStatusCodeT ZbZclVoiceClientEstabReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct voice_estab_req_t *estab_req, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclVoiceVoiceTxReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct voice_voice_tx_t *voice_tx, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclVoiceTxCompletedReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclVoiceClientSendControlRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct voice_control_rsp_t *rsp);
+
+/* Server API */
+enum ZclStatusCodeT ZbZclVoiceServerControlReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
+ struct voice_control_t *control_cmd, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+enum ZclStatusCodeT ZbZclVoiceServerSendEstabRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst_info,
+ struct voice_estab_rsp_t *rsp);
+
+/* The application calls this to send the Voice Transmission Reponse Command if it ever encounters an
+ * error processing a Voice Transmission packet */
+enum ZclStatusCodeT ZbZclVoiceServerSendVoiceTxRsp(struct ZbZclClusterT *clusterPtr, struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), struct voice_voice_tx_rsp_t *rsp, void *arg);
+
+#endif /* ZCL_VOICE_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.water.content.meas.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.water.content.meas.h
new file mode 100644
index 000000000..0ca165c41
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.water.content.meas.h
@@ -0,0 +1,67 @@
+/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_WATER_CONTENT_MEAS_H
+# define ZCL_WATER_CONTENT_MEAS_H
+
+/*--------------------------------------------------------------------------
+ * DESCRIPTION
+ * Interface definition for the ZCL Water Content Measurement cluster.
+ *--------------------------------------------------------------------------
+ */
+/* PICS.ZCL.Water_Content_Measurement
+ * WCM.S | True
+ * WCM.C | True
+ *
+ * Server Attributes
+ * WCM.S.A0000 | True
+ * WCM.S.A0000.Report | True
+ * WCM.S.A0001 | True
+ * WCM.S.A0002 | True
+ * WCM.S.A0003 | False
+ * WCM.S.Afffd | True
+ * WCM.S.Afffe | False
+ *
+ *
+ * Client Attributes
+ * WCM.C.A0000.Report.Rsp | False
+ * WCM.C.Afffd | True
+ * WCM.C.Afffe | False
+ */
+
+#include "zcl/zcl.h"
+
+/*---------------------------------------------------------------
+ * Water Content Measurement Cluster Definitions
+ *---------------------------------------------------------------
+ */
+/* Water Content Measurement Information Attribute Set */
+enum {
+ ZCL_WC_MEAS_ATTR_MEAS_VAL = 0x0000,
+ ZCL_WC_MEAS_ATTR_MIN_MEAS_VAL = 0x0001,
+ ZCL_WC_MEAS_ATTR_MAX_MEAS_VAL = 0x0002,
+ ZCL_WC_MEAS_ATTR_TOLERANCE = 0x0003,
+};
+
+/* Water Content Measurement Defines */
+#define ZCL_WC_MEAS_MEASURED_DEFAULT 0xffff
+#define ZCL_WC_MEAS_UNKNOWN 0xffff
+#define ZCL_WC_MEAS_MIN_MEAS_VAL_MIN 0x0000
+#define ZCL_WC_MEAS_MIN_MEAS_VAL_MAX 0x270f
+#define ZCL_WC_MEAS_MIN_MEAS_VAL_UNKNOWN 0xffff
+#define ZCL_WC_MEAS_MAX_MEAS_VAL_MIN 0x0001
+#define ZCL_WC_MEAS_MAX_MEAS_VAL_MAX 0x2710
+#define ZCL_WC_MEAS_MAX_MEAS_VAL_UNKNOWN 0xffff
+#define ZCL_WC_MEAS_TOLERANCE_MIN 0x0000
+#define ZCL_WC_MEAS_TOLERANCE_MAX 0x0800
+
+/*---------------------------------------------------------------
+ * Water Content Measurement Cluster Definitions
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclWaterContentMeasServerAlloc(struct ZigBeeT *zb,
+ uint8_t endpoint, enum ZbZclClusterIdT clusterID, uint16_t min, uint16_t max);
+
+struct ZbZclClusterT * ZbZclWaterContentMeasClientAlloc(struct ZigBeeT *zb,
+ uint8_t endpoint, enum ZbZclClusterIdT clusterID);
+
+#endif /* __ZCL_WATER_CONTENT_MEAS_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.window.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.window.h
new file mode 100644
index 000000000..6386882f1
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.window.h
@@ -0,0 +1,190 @@
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
+
+#ifndef ZCL_WINDOW_H
+# define ZCL_WINDOW_H
+
+/* IMPORTANT INFORMATION:
+ *
+ * The Window Covering Cluster uses scene data to save and restore configurations
+ * and therefore needs 2 additional callback functions.
+ * Instead of writing attributes directly from the callback functions:
+ * windowServerSetSceneData, this function serves a as helper function instead to
+ * check if the tilt and lift pecentage attributes exist and unpack the scene data.
+ *
+ * The additional callback functions must be implemented and used in the application layer
+ * to read and write the attributes.
+ */
+
+/* PICS.ZCL.Window
+ * WNCV.S | True
+ * WNCV.S.Lift | True
+ * WNCV.S.Tilt | True
+ * WNCV.S.ClosedLoop | False
+ * WNCV.C | True
+ *
+ * Server Attributes
+ * WNCV.S.Afffd | True
+ * WNCV.S.A0000 | True
+ * WNCV.S.A0001 | False
+ * WNCV.S.A0002 | False
+ * WNCV.S.A0003 | False
+ * WNCV.S.A0004 | False
+ * WNCV.S.A0005 | False
+ * WNCV.S.A0006 | False
+ * WNCV.S.A0007 | True
+ * WNCV.S.A0008 | False
+ * WNCV.S.A0008.Scene | False
+ * WNCV.S.A0008.Report.DefaultConfig | False
+ * WNCV.S.A0008.Report.Tx | False
+ * WNCV.S.A0009 | False
+ * WNCV.S.A0009.Scene | False
+ * WNCV.S.A0009.Report.DefaultConfig | False
+ * WNCV.S.A0009.Report.Tx | False
+ * WNCV.S.A0010 | False
+ * WNCV.S.A0012 | False
+ * WNCV.S.A0013 | False
+ * WNCV.S.A0014 | False
+ * WNCV.S.A0015 | False
+ * WNCV.S.A0016 | False
+ * WNCV.S.A0017 | True
+ * WNCV.S.A0018 | False
+ * WNCV.S.A0019 | False
+ *
+ * Commands Received
+ * WNCV.S.C00.Rsp | True
+ * WNCV.S.C01.Rsp | True
+ * WNCV.S.C02.Rsp | True
+ * WNCV.S.C04.Rsp | False
+ * WNCV.S.C05.Rsp | False
+ * WNCV.S.C07.Rsp | False
+ * WNCV.S.C08.Rsp | False
+ *
+ *
+ * Client Attributes
+ * WNCV.C.Afffd | True
+ * WNCV.C.A0008.Report.Rsp | False
+ * WNCV.C.A0009.Report.Rsp | False
+ *
+ * Commands Generated
+ * WNCV.C.C00.Tx | True
+ * WNCV.C.C01.Tx | True
+ * WNCV.C.C02.Tx | True
+ * WNCV.C.C04.Tx | False
+ * WNCV.C.C05.Tx | False
+ * WNCV.C.C07.Tx | False
+ * WNCV.C.C08.Tx | False
+ */
+
+#include "zcl/zcl.h"
+
+/* Window Covering Cluster Attribute Set */
+enum {
+ /* M* - mandatory if closed loop and lift/tile action is supported */
+ /* Information Attribute Set */
+ ZCL_WINDOW_ATTR_COVERING_TYPE = 0x0000, /* R- mandatory */
+ ZCL_WINDOW_PHY_CLOSE_LIMIT_LIFT = 0x0001, /* R */
+ ZCL_WINDOW_PHY_CLOSE_LIMIT_TILT = 0x0002, /* R */
+ ZCL_WINDOW_CURR_POSITION_LIFT = 0x0003, /* R */
+ ZCL_WINDOW_CURR_POSITION_TILT = 0x0004, /* R */
+ ZCL_WINDOW_ACTUATION_NUMBER_LIFT = 0x0005, /* R */
+ ZCL_WINDOW_ACCUATION_NUMBER_TILT = 0x0006, /* R */
+ ZCL_WINDOW_CONFIG_STATUS = 0x0007, /* R - mandatory */
+ ZCL_WINDOW_CURR_POS_LIFT_PERCENT = 0x0008, /* RSP - M* */
+ ZCL_WINDOW_CURR_POS_TILT_PERCENT = 0x0009, /* RSP - M* */
+ /* Settings Attribute Set */
+ ZCL_WINDOW_INSTALLED_OPENED_LIMIT_LIFT = 0x0010, /* R - M* */
+ ZCL_WINDOW_INSTALLED_CLOSED_LIMIT_LIFT = 0x0011, /* R - M* */
+ ZCL_WINDOW_INSTALLED_OPENED_LIMIT_TILT = 0x0012, /* R - M* */
+ ZCL_WINDOW_INSTALLED_CLOSED_LIMIT_TILT = 0x0013, /* R - M* */
+ ZCL_WINDOW_VELOCITY_LIFT = 0x0014, /* RW */
+ ZCL_WINDOW_ACCELERATION_TIME_LIFT = 0x0015, /* RW */
+ ZCL_WINDOW_DECELERATION_TIME_LIFT = 0x0016, /* RW */
+ ZCL_WINDOW_MODE = 0x0017, /* RW - mandatory */
+ ZCL_WINDOW_INTERMEDIATE_SETPOINTS_LIFT = 0x0018, /* RW */
+ ZCL_WINDOW_INTERMEDIATE_SETPOINTS_TILT = 0x0019 /* RW */
+
+};
+
+/* Window Covering Type Attributes */
+enum {
+ WINDOW_ROLLERSHADE = 0x00,
+ WINDOW_ROLLERSHADE_2_MOTOR,
+ WINDOW_ROLLERSHADE_EXTERIOR,
+ WINDOW_ROLLERSHADE_EXTERIOR_2_MOTOR,
+ WINDOW_DRAPERY,
+ WINDOW_AWNING,
+ WINDOW_SHUTTER,
+ WINDOW_TILT_BLIND_TILT,
+ WINDOW_TILT_BLIND_LIFT_TILT,
+ WINDOW_PROJECTOR_SCREEN
+};
+
+/* Commands */
+#define ZCL_WINDOW_COMMAND_UP 0x00 /* mandatory */
+#define ZCL_WINDOW_COMMAND_DOWN 0x01 /* mandatory */
+#define ZCL_WINDOW_COMMAND_STOP 0x02 /* mandatory */
+#define ZCL_WINDOW_COMMAND_GOTO_LIFT_VALUE 0x04
+#define ZCL_WINDOW_COMMAND_GOTO_LIFT_PERCENTAGE 0x05
+#define ZCL_WINDOW_COMMAND_GOTO_TILT_VALUE 0x07
+#define ZCL_WINDOW_COMMAND_GOTO_TILT_PERCENTAGE 0x08
+
+/* Config/Status Bits */
+#define ZCL_WINDOW_OPERATIONAL 0x01
+#define ZCL_WINDOW_ONLINE 0x02
+#define ZCL_WINDOW_UP_REVERSED 0x04
+#define ZCL_WINDOW_LIFT_CLOSED_LOOP 0x08
+#define ZCL_WINDOW_TILT_CLOSED_LOOP 0x16
+#define ZCL_WINDOW_LIFT_ENCODER 0x32
+#define ZCL_WINDOW_TILT_ENCODER 0x64
+
+/* Mode Bits */
+#define ZCL_WINDOW_REVERSED 0x01
+#define ZCL_WINDOW_CALIBRATION 0x02
+#define ZCL_WINDOW_MAINTENANCE 0x04
+#define ZCL_WINDOW_LED_FEEDBACK 0x08
+
+/*---------------------------------------------------------------
+ * Server API
+ *---------------------------------------------------------------
+ */
+struct ZbZclWindowServerCallbacksT {
+ /* Returns a ZCL Status code to send in the Default Response, or
+ * ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE if no Default Response
+ * to be generated.
+ * All 3 commnads should update ZCL_WINDOW_CURR_POS_LIFT_PERCENT&
+ * ZCL_WINDOW_CURR_POS_TILT_PERCENT accordingly*/
+ uint8_t (*up_command)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr, void *arg);
+
+ uint8_t (*down_command)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr, void *arg);
+
+ uint8_t (*set_lift_and_tilt_command)(struct ZbZclClusterT *clusterPtr, void *arg, uint8_t liftPercentage, uint8_t tiltPercentage);
+
+ uint8_t (*stop_command)(struct ZbZclClusterT *clusterPtr,
+ struct ZbZclHeaderT *zclHdrPtr, struct ZbApsdeDataIndT *dataIndPtr, void *arg);
+};
+
+struct ZbZclClusterT * ZbZclWindowServerAlloc(struct ZigBeeT *zb, uint8_t ept,
+ struct ZbZclWindowServerCallbacksT *callbacks, void *arg);
+
+uint8_t ZbZclWindowClosureServerMode(struct ZbZclClusterT *clusterPtr, uint8_t mode);
+
+/*---------------------------------------------------------------
+ * Client API
+ *---------------------------------------------------------------
+ */
+struct ZbZclClusterT * ZbZclWindowClientAlloc(struct ZigBeeT *zb, uint8_t ept);
+uint8_t ZbZclWindowClientCommandUp(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+uint8_t ZbZclWindowClientCommandDown(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+uint8_t ZbZclWindowClientCommandStop(struct ZbZclClusterT *clusterPtr,
+ const struct ZbApsAddrT *dst,
+ void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+
+#endif /* __ZCL_WINDOW_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.aps.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.aps.h
index aa47943e3..a6215c83e 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.aps.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.aps.h
@@ -1,8 +1,12 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_APS_H
# define ZIGBEE_APS_H
+#if defined ( __CC_ARM )
+#pragma anon_unions
+#endif
+
/*---------------------------------------------------------------
* Definitions
*---------------------------------------------------------------
@@ -130,11 +134,11 @@ extern const struct ZbApsAddrT *ZbApsAddrBinding;
#define ZB_APSDE_DATAREQ_TXOPTIONS_NWKKEY 0x0002U
#define ZB_APSDE_DATAREQ_TXOPTIONS_ACK 0x0004U
#define ZB_APSDE_DATAREQ_TXOPTIONS_FRAG 0x0008U
-#define ZB_APSDE_DATAREQ_TXOPTIONS_NONCE 0x0010U /* TODO: CCB 1184 */
+#define ZB_APSDE_DATAREQ_TXOPTIONS_NONCE 0x0010U /* EXEGIN: CCB 1184 */
/* Exegin addons */
/*
* When the VECTOR option is set, the ASDU points instead to an array of
- * ZbApsBufT structures that point to fragments of the message to assemble into
+ * struct ZbApsBufT structures that point to fragments of the message to assemble into
* one ASDU, and the ASDU length is the number of buffer structures. This is
* used for scatter-gather mode API calls to reduce heap activity.
*/
@@ -142,8 +146,10 @@ extern const struct ZbApsAddrT *ZbApsAddrBinding;
/* Used in place of the R21 useAlias parameter. */
#define ZB_APSDE_DATAREQ_TXOPTIONS_ALIAS 0x0200U
-/* APSDE-DATA.request */
-typedef struct {
+/**
+ * APSDE-DATA.request
+ */
+typedef struct ZbApsdeDataReqT {
struct ZbApsAddrT dst;
uint16_t profileId;
uint16_t clusterId;
@@ -151,71 +157,75 @@ typedef struct {
const void *asdu;
uint16_t asduLength;
uint32_t asduHandle;
- /*
- * You should not set ZB_APSDE_DATAREQ_TXOPTIONS_ACK if you are trying to
+
+ uint16_t txOptions;
+ /**< You should not set ZB_APSDE_DATAREQ_TXOPTIONS_ACK if you are trying to
* send to a sleepy device. The default timeout to wait for an APS ACK
* is 1.5 seconds, which can be much shorter than the time a sleepy device
* can be asleep for. APS transmission may still work, but you will get
- * a lot of APS retries and error messages.
- */
- uint16_t txOptions;
- /*
- * If you perform route discovery separately using ZbNlmeRouteDiscWait(),
+ * a lot of APS retries and error messages. */
+
+ bool discoverRoute;
+ /**< If you perform route discovery separately using ZbNlmeRouteDiscReq(),
* then you can set discoverRoute to zero, decreasing the length of time
* an APS data request may take if there is a problem sending the packet
- * to the target.
- */
- bool discoverRoute;
- uint8_t radius;
- uint16_t aliasAddr;
- uint8_t aliasSeqnum;
+ * to the target. */
+
+ uint8_t radius; /**< Network radius. If 0, default value is used. */
+ uint16_t aliasAddr; /**< Requires ZB_APSDE_DATAREQ_TXOPTIONS_ALIAS to be enabled. */
+ uint8_t aliasSeqnum; /**< Requires ZB_APSDE_DATAREQ_TXOPTIONS_ALIAS to be enabled. */
} ZbApsdeDataReqT;
-/* Buffer descriptor for vectored/scatter-gather API */
-typedef struct {
+/** Buffer descriptor for vectored/scatter-gather API */
+typedef struct ZbApsBufT {
const uint8_t *data;
unsigned int len;
} ZbApsBufT;
-/* APSDE-DATA.confirm */
-typedef struct {
+/**
+ * APSDE-DATA.confirm
+ */
+typedef struct ZbApsdeDataConfT {
struct ZbApsAddrT dst;
uint8_t srcEndpt;
uint32_t asduHandle;
enum ZbStatusCodeT status;
} ZbApsdeDataConfT;
-/* APSDE-DATA.indication */
-typedef struct {
+/**
+ * APSDE-DATA.indication
+ */
+typedef struct ZbApsdeDataIndT {
struct ZbApsAddrT dst;
struct ZbApsAddrT src;
uint16_t profileId;
uint16_t clusterId;
uint8_t *asdu;
uint16_t asduLength;
- /* securityStatus, one of:
+
+ enum ZbStatusCodeT securityStatus;
+ /**< securityStatus, one of:
* ZB_APS_STATUS_UNSECURED (no decryption necessary)
* ZB_APS_STATUS_SECURED_NWK_KEY (decrypted with the Network Key)
* ZB_APS_STATUS_SECURED_LINK_KEY (decrypted with a Link Key) */
- enum ZbStatusCodeT securityStatus;
+
uint8_t linkQuality;
int8_t rssi;
- /* Exegin Addon for Intra-PAN portability. */
- uint16_t linkAddr;
- /* TO BE DONE :missing aps data- not implemented yet, needed for gateway */
- int rxTime;
-} ZbApsdeDataIndT;
-/* APSDE-DATA.request */
-void ZbApsdeDataReqWait(struct ZigBeeT *zb, ZbApsdeDataReqT *dataReqPtr, ZbApsdeDataConfT *dataConfPtr);
-
-/* ZbApsdeDataReq is deprecated, use ZbApsdeDataReqWait instead. */
-#define ZbApsdeDataReq(_zb_, _req_, _conf_) ZbApsdeDataReqWait(_zb_, _req_, _conf_)
+ uint16_t linkAddr; /**< Exegin Addon for Intra-PAN portability. */
+} ZbApsdeDataIndT;
-/* Non-blocking version of APSDE-DATA.request.
- * If the packet was queued, ZB_STATUS_SUCCESS is returned. Otherwise, an error status is returned. */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbApsdeDataReqCallback(struct ZigBeeT *zb, ZbApsdeDataReqT *req,
- void (*callback)(ZbApsdeDataConfT *conf, void *arg), void *arg);
+/**
+ * APSDE-DATA.request
+ * If the packet was queued, ZB_STATUS_SUCCESS is returned. Otherwise, an error status is returned.
+ * @param zb
+ * @param req
+ * @param callback
+ * @param arg
+ * @return Zigbee Status Code
+ */
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbApsdeDataReqCallback(struct ZigBeeT *zb, struct ZbApsdeDataReqT *req,
+ void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
* APSME
@@ -224,11 +234,11 @@ enum ZbStatusCodeT ZB_WARN_UNUSED ZbApsdeDataReqCallback(struct ZigBeeT *zb, ZbA
/* APS IB Attributes */
enum ZbApsmeIbAttrIdT {
ZB_APS_IB_ID_ADDRESS_MAP = 0xc0, /* 0xc0 Removed in ZigBee 2007 */
- ZB_APS_IB_ID_BINDING_TABLE, /* 0xc1 (ZbApsmeBindT) */
+ ZB_APS_IB_ID_BINDING_TABLE, /* 0xc1 (struct ZbApsmeBindT) */
ZB_APS_IB_ID_DESIGNATED_COORD, /* 0xc2 (uint8_t) */
ZB_APS_IB_ID_CHANNEL_MASK, /* 0xc3 (struct ZbChannelListT) Converted to a list in R22. */
ZB_APS_IB_ID_USE_EPID, /* 0xc4 (uint64_t) */
- ZB_APS_IB_ID_GROUP_TABLE, /* 0xc5 (ZbApsmeGroupT) */
+ ZB_APS_IB_ID_GROUP_TABLE, /* 0xc5 (struct ZbApsmeGroupT) */
ZB_APS_IB_ID_NONMEMBER_RADIUS, /* 0xc6 (uint8_t) */
#if 0 /* REMOVED */
ZB_APS_IB_ID_PERMISSIONS_CONFIG, /* 0xc7 */
@@ -244,7 +254,7 @@ enum ZbApsmeIbAttrIdT {
#endif
/*** Security attributes ***/
- ZB_APS_IB_ID_DEVICE_KEY_PAIR_SET = 0xaa, /* 0xaa (ZbApsmeKeyPairT) */
+ ZB_APS_IB_ID_DEVICE_KEY_PAIR_SET = 0xaa, /* 0xaa (struct ZbApsmeKeyPairT) */
ZB_APS_IB_ID_TRUST_CENTER_ADDRESS, /* 0xab (uint64_t) */
ZB_APS_IB_ID_SECURITY_TIMEOUT_PERIOD, /* 0xac (uint16_t) */
@@ -277,7 +287,7 @@ enum ZbApsmeIbAttrIdT {
};
/* APSME-GET.request */
-typedef struct {
+typedef struct ZbApsmeGetReqT {
enum ZbApsmeIbAttrIdT attrId;
void *attr;
unsigned int attrLength;
@@ -285,37 +295,37 @@ typedef struct {
} ZbApsmeGetReqT;
/* APSME-GET.confirm */
-typedef struct {
+typedef struct ZbApsmeGetConfT {
enum ZbStatusCodeT status;
enum ZbApsmeIbAttrIdT attrId;
-} ZbApsmeGetConfT;
+} ZbApsmeGetConfT;
/* APSME-SET.request */
-typedef struct {
+typedef struct ZbApsmeSetReqT {
enum ZbApsmeIbAttrIdT attrId;
const void *attr;
unsigned int attrLength;
unsigned int attrIndex;
-} ZbApsmeSetReqT;
+} ZbApsmeSetReqT;
/* APSME-SET.confirm */
-typedef struct {
+typedef struct ZbApsmeSetConfT {
enum ZbStatusCodeT status;
enum ZbApsmeIbAttrIdT attrId;
-} ZbApsmeSetConfT;
+} ZbApsmeSetConfT;
/* APSME-BIND.request */
-typedef struct {
+typedef struct ZbApsmeBindReqT {
uint64_t srcExtAddr;
uint8_t srcEndpt;
uint16_t clusterId;
/* dst.panId not used, dst.nwkAddr is only for the group address,
* and dst.endpoint only used if mode == ZB_APSDE_ADDRMODE_EXT */
struct ZbApsAddrT dst;
-} ZbApsmeBindReqT;
+} ZbApsmeBindReqT;
/* APSME-BIND.confirm */
-typedef struct {
+typedef struct ZbApsmeBindConfT {
enum ZbStatusCodeT status;
uint64_t srcExtAddr;
uint8_t srcEndpt;
@@ -323,20 +333,20 @@ typedef struct {
/* dst.panId not used, dst.nwkAddr is only for the group address,
* and dst.endpoint only used if mode == ZB_APSDE_ADDRMODE_EXT */
struct ZbApsAddrT dst;
-} ZbApsmeBindConfT;
+} ZbApsmeBindConfT;
/* APSME-UNBIND.request */
-typedef struct {
+typedef struct ZbApsmeUnbindReqT {
uint64_t srcExtAddr;
uint8_t srcEndpt;
uint16_t clusterId;
/* dst.panId not used, dst.nwkAddr is only for the group address,
* and dst.endpoint only used if mode == ZB_APSDE_ADDRMODE_EXT */
struct ZbApsAddrT dst;
-} ZbApsmeUnbindReqT;
+} ZbApsmeUnbindReqT;
/* APSME-UNBIND.confirm */
-typedef struct {
+typedef struct ZbApsmeUnbindConfT {
enum ZbStatusCodeT status;
uint64_t srcExtAddr;
uint8_t srcEndpt;
@@ -344,47 +354,47 @@ typedef struct {
/* dst.panId not used, dst.nwkAddr is only for the group address,
* and dst.endpoint only used if mode == ZB_APSDE_ADDRMODE_EXT */
struct ZbApsAddrT dst;
-} ZbApsmeUnbindConfT;
+} ZbApsmeUnbindConfT;
/* APSME-ADD-GROUP.request */
-typedef struct {
+typedef struct ZbApsmeAddGroupReqT {
uint16_t groupAddr;
uint8_t endpt;
-} ZbApsmeAddGroupReqT;
+} ZbApsmeAddGroupReqT;
/* APSME-ADD-GROUP.confirm */
-typedef struct {
+typedef struct ZbApsmeAddGroupConfT {
enum ZbStatusCodeT status;
uint16_t groupAddr;
uint8_t endpt;
-} ZbApsmeAddGroupConfT;
+} ZbApsmeAddGroupConfT;
/* APSME-REMOVE-GROUP.request */
-typedef struct {
+typedef struct ZbApsmeRemoveGroupReqT {
uint16_t groupAddr;
uint8_t endpt;
-} ZbApsmeRemoveGroupReqT;
+} ZbApsmeRemoveGroupReqT;
/* APSME-REMOVE-GROUP.confirm */
-typedef struct {
+typedef struct ZbApsmeRemoveGroupConfT {
enum ZbStatusCodeT status;
uint16_t groupAddr;
uint8_t endpt;
-} ZbApsmeRemoveGroupConfT;
+} ZbApsmeRemoveGroupConfT;
/* APSME-REMOVE-ALL-GROUPS.request */
-typedef struct {
+typedef struct ZbApsmeRemoveAllGroupsReqT {
uint8_t endpt;
-} ZbApsmeRemoveAllGroupsReqT;
+} ZbApsmeRemoveAllGroupsReqT;
/* APSME-REMOVE-ALL-GROUPS.confirm */
-typedef struct {
+typedef struct ZbApsmeRemoveAllGroupsConfT {
enum ZbStatusCodeT status;
uint8_t endpt;
-} ZbApsmeRemoveAllGroupsConfT;
+} ZbApsmeRemoveAllGroupsConfT;
/* APSME-ADD-ENDPOINT.request - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeAddEndpointReqT {
/* Application Information */
uint8_t endpoint;
uint16_t profileId;
@@ -398,22 +408,22 @@ typedef struct {
} ZbApsmeAddEndpointReqT;
/* APSME-ADD-ENDPOINT.confirm - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeAddEndpointConfT {
enum ZbStatusCodeT status;
-} ZbApsmeAddEndpointConfT;
+} ZbApsmeAddEndpointConfT;
/* APSME-REMOVE-ENDPOINT.request - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeRemoveEndpointReqT {
uint8_t endpoint;
-} ZbApsmeRemoveEndpointReqT;
+} ZbApsmeRemoveEndpointReqT;
/* APSME-REMOVE-ENDPOINT.confirm - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeRemoveEndpointConfT {
enum ZbStatusCodeT status;
-} ZbApsmeRemoveEndpointConfT;
+} ZbApsmeRemoveEndpointConfT;
/* APS Binding Table entry. */
-typedef struct {
+typedef struct ZbApsmeBindT {
/* Source */
uint64_t srcExtAddr; /* if zero, entry is invalid */
uint8_t srcEndpt;
@@ -426,31 +436,31 @@ typedef struct {
} ZbApsmeBindT;
/* APS Group ID Table entry. */
-typedef struct {
+typedef struct ZbApsmeGroupT {
uint16_t groupAddr;
uint8_t endpoint;
} ZbApsmeGroupT;
-void ZbApsmeGetReq(struct ZigBeeT *zb, ZbApsmeGetReqT *getReqPtr, ZbApsmeGetConfT *getConfPtr);
-void ZbApsmeSetReq(struct ZigBeeT *zb, ZbApsmeSetReqT *setReqPtr, ZbApsmeSetConfT *setConfPtr);
-void ZbApsmeBindReq(struct ZigBeeT *zb, ZbApsmeBindReqT *bindReqPtr, ZbApsmeBindConfT *bindConfPtr);
-void ZbApsmeUnbindReq(struct ZigBeeT *zb, ZbApsmeUnbindReqT *unbindReqPtr, ZbApsmeUnbindConfT *unbindConfPtr);
+void ZbApsmeGetReq(struct ZigBeeT *zb, struct ZbApsmeGetReqT *getReqPtr, struct ZbApsmeGetConfT *getConfPtr);
+void ZbApsmeSetReq(struct ZigBeeT *zb, struct ZbApsmeSetReqT *setReqPtr, struct ZbApsmeSetConfT *setConfPtr);
+void ZbApsmeBindReq(struct ZigBeeT *zb, struct ZbApsmeBindReqT *bindReqPtr, struct ZbApsmeBindConfT *bindConfPtr);
+void ZbApsmeUnbindReq(struct ZigBeeT *zb, struct ZbApsmeUnbindReqT *unbindReqPtr, struct ZbApsmeUnbindConfT *unbindConfPtr);
void ZbApsUnbindAllReq(struct ZigBeeT *zb);
-void ZbApsmeAddGroupReq(struct ZigBeeT *zb, ZbApsmeAddGroupReqT *r, ZbApsmeAddGroupConfT *c);
-void ZbApsmeRemoveGroupReq(struct ZigBeeT *zb, ZbApsmeRemoveGroupReqT *r, ZbApsmeRemoveGroupConfT *c);
-void ZbApsmeRemoveAllGroupsReq(struct ZigBeeT *zb, ZbApsmeRemoveAllGroupsReqT *r, ZbApsmeRemoveAllGroupsConfT *c);
+void ZbApsmeAddGroupReq(struct ZigBeeT *zb, struct ZbApsmeAddGroupReqT *r, struct ZbApsmeAddGroupConfT *c);
+void ZbApsmeRemoveGroupReq(struct ZigBeeT *zb, struct ZbApsmeRemoveGroupReqT *r, struct ZbApsmeRemoveGroupConfT *c);
+void ZbApsmeRemoveAllGroupsReq(struct ZigBeeT *zb, struct ZbApsmeRemoveAllGroupsReqT *r, struct ZbApsmeRemoveAllGroupsConfT *c);
uint8_t ZbApsGroupsGetCapacity(struct ZigBeeT *zb);
uint8_t ZbApsGroupsGetMembership(struct ZigBeeT *zb, uint8_t endpoint, uint16_t *group_list,
uint8_t max_len);
-void ZbApsmeAddEndpoint(struct ZigBeeT *zb, ZbApsmeAddEndpointReqT *r, ZbApsmeAddEndpointConfT *c);
-void ZbApsmeRemoveEndpoint(struct ZigBeeT *zb, ZbApsmeRemoveEndpointReqT *r, ZbApsmeRemoveEndpointConfT *c);
+void ZbApsmeAddEndpoint(struct ZigBeeT *zb, struct ZbApsmeAddEndpointReqT *r, struct ZbApsmeAddEndpointConfT *c);
+void ZbApsmeRemoveEndpoint(struct ZigBeeT *zb, struct ZbApsmeRemoveEndpointReqT *r, struct ZbApsmeRemoveEndpointConfT *c);
/* Attach a callback to receive all APS messages for this endpoint that have
* not matched any other filter rules. */
bool ZbApsmeEndpointConfigNoMatchCallback(struct ZigBeeT *zb, uint8_t endpoint,
- int (*callback)(ZbApsdeDataIndT *ind, void *cbarg), void *arg);
+ int (*callback)(struct ZbApsdeDataIndT *ind, void *cbarg), void *arg);
/* Add a cluster ID to the input cluster list of an existing endpoint */
bool ZbApsmeEndpointClusterListAppend(struct ZigBeeT *zb, uint8_t endpoint,
@@ -580,17 +590,7 @@ enum ZbApsmePolicyT {
};
/* APSME-TRANSPORT-KEY.request */
-typedef struct {
- /*
- * Under normal stack operation, destination address mode must be
- * ZB_APSDE_ADDRMODE_EXT. If dstAddrMode == ZB_APSDE_ADDRMODE_EXT
- * and dstExtAddr == 0, the transport key command will be sent to the
- * 0xffff broadcast address.
- *
- * For ZigBee Pro testing, we need to have finer control over the
- * broadcast address. For test 14.24, we need to be able to
- * specify 0xffff as well as 0xfffd (rx-on only).
- */
+typedef struct ZbApsmeTransportKeyReqT {
enum ZbApsAddrModeT dstAddrMode;
/*lint -e658 [ !MISRA - Anonymous union assumed. ] */
union {
@@ -619,7 +619,7 @@ typedef struct {
} ZbApsmeTransportKeyReqT;
/* APSME-TRANSPORT-KEY.indication */
-typedef struct {
+typedef struct ZbApsmeTransKeyIndT {
uint64_t srcExtAddr;
enum ZbSecKeyTypeT keyType;
union {
@@ -641,7 +641,7 @@ typedef struct {
} ZbApsmeTransKeyIndT;
/* APSME-UPDATE-DEVICE.request */
-typedef struct {
+typedef struct ZbApsmeUpdateDeviceReqT {
uint64_t dstExtAddr;
uint64_t devExtAddr;
enum ZbApsmeDeviceStatusT status;
@@ -649,7 +649,7 @@ typedef struct {
} ZbApsmeUpdateDeviceReqT;
/* APSME-UPDATE-DEVICE.indication */
-typedef struct {
+typedef struct ZbApsmeUpdateDeviceIndT {
uint64_t srcExtAddr;
uint64_t devExtAddr;
uint16_t devShortAddr;
@@ -658,13 +658,13 @@ typedef struct {
} ZbApsmeUpdateDeviceIndT;
/* APSME-REMOVE-DEVICE.request */
-typedef struct {
+typedef struct ZbApsmeRemoveDeviceReqT {
uint64_t dstExtAddr;
uint64_t targetAddr;
} ZbApsmeRemoveDeviceReqT;
/* APSME-REMOVE-DEVICE.indication */
-typedef struct {
+typedef struct ZbApsmeRemoveDeviceIndT {
uint64_t srcExtAddr;
uint64_t targetAddr;
enum ZbSecEncryptT encryptKeyType; /* key used to encrypt the incoming command. */
@@ -678,14 +678,14 @@ enum ZbApsRequestKeyTypeT {
};
/* APSME-REQUEST-KEY.request */
-typedef struct {
+typedef struct ZbApsmeRequestKeyReqT {
uint64_t dstExtAddr;
enum ZbApsRequestKeyTypeT keyType;
uint64_t partnerAddr; /* only used with application keys. */
} ZbApsmeRequestKeyReqT;
/* APSME-REQUEST-KEY.indication */
-typedef struct {
+typedef struct ZbApsmeRequestKeyIndT {
uint64_t srcExtAddr;
enum ZbApsRequestKeyTypeT keyType;
uint64_t partnerAddr;
@@ -693,7 +693,7 @@ typedef struct {
} ZbApsmeRequestKeyIndT;
/* APSME-SWITCH-KEY.request */
-typedef struct {
+typedef struct ZbApsmeSwitchKeyReqT {
/*
* Under normal stack operation, destination address mode must be
* ZB_APSDE_ADDRMODE_EXT. If dstAddrMode == ZB_APSDE_ADDRMODE_EXT
@@ -715,20 +715,20 @@ typedef struct {
} ZbApsmeSwitchKeyReqT;
/* APSME-SWITCH-KEY.indication */
-typedef struct {
+typedef struct ZbApsmeSwitchKeyIndT {
uint64_t srcExtAddr;
uint8_t keySeqNum;
enum ZbSecEncryptT encryptKeyType; /* key used to encrypt the incoming command. */
} ZbApsmeSwitchKeyIndT;
/* APSME-VERIFY-KEY.request */
-typedef struct {
+typedef struct ZbApsmeVerifyKeyReqT {
uint64_t dstExtAddr;
enum ZbSecKeyTypeT keyType;
} ZbApsmeVerifyKeyReqT;
/* APSME-VERIFY-KEY.indication */
-typedef struct {
+typedef struct ZbApsmeVerifyKeyIndT {
uint64_t srcExtAddr;
enum ZbSecKeyTypeT keyType;
uint8_t hash[ZB_SEC_KEYSIZE];
@@ -736,14 +736,14 @@ typedef struct {
} ZbApsmeVerifyKeyIndT;
/* APSME-CONFIRM-KEY.request */
-typedef struct {
+typedef struct ZbApsmeConfirmKeyReqT {
enum ZbStatusCodeT status;
uint64_t dstExtAddr;
enum ZbSecKeyTypeT keyType;
} ZbApsmeConfirmKeyReqT;
/* APSME-CONFIRM-KEY.indication */
-typedef struct {
+typedef struct ZbApsmeConfirmKeyIndT {
enum ZbStatusCodeT status;
uint64_t srcExtAddr;
enum ZbSecKeyTypeT keyType;
@@ -751,7 +751,7 @@ typedef struct {
} ZbApsmeConfirmKeyIndT;
/* APSME-ADD-KEY.request - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeAddKeyReqT {
enum ZbSecKeyTypeT keyType;
uint8_t key[ZB_SEC_KEYSIZE];
uint8_t keyAttribute;
@@ -762,12 +762,12 @@ typedef struct {
} ZbApsmeAddKeyReqT;
/* APSME-ADD-KEY.confirm - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeAddKeyConfT {
enum ZbStatusCodeT status;
} ZbApsmeAddKeyConfT;
/*STRUCTURE:-----------------------------------------------------
- * NAME ZbApsmeGetKeyReqT
+ * NAME struct ZbApsmeGetKeyReqT
* DESC Exegin Custom
* PARAMS
* keyType ;
@@ -777,14 +777,14 @@ typedef struct {
* partnerAddr ;
*---------------------------------------------------------------
*/
-typedef struct {
+typedef struct ZbApsmeGetKeyReqT {
enum ZbSecKeyTypeT keyType;
uint8_t keySeqNumber;
uint64_t partnerAddr;
} ZbApsmeGetKeyReqT;
/* APSME-GET-KEY.confirm - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeGetKeyConfT {
enum ZbStatusCodeT status;
uint8_t key[ZB_SEC_KEYSIZE];
uint32_t outgoingCounter;
@@ -793,18 +793,18 @@ typedef struct {
} ZbApsmeGetKeyConfT;
/* APSME-REMOVE-KEY.request - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeRemoveKeyReqT {
enum ZbSecKeyTypeT keyType;
uint64_t partnerAddr;
} ZbApsmeRemoveKeyReqT;
/* APSME-REMOVE-KEY.confirm - Exegin Custom */
-typedef struct {
+typedef struct ZbApsmeRemoveKeyConfT {
enum ZbStatusCodeT status;
} ZbApsmeRemoveKeyConfT;
/* APS Key/Pair Descriptor - used with ZB_APS_IB_ID_DEVICE_KEY_PAIR_SET */
-typedef struct {
+typedef struct ZbApsmeKeyPairT {
uint64_t deviceAddress;
uint8_t linkKey[ZB_SEC_KEYSIZE];
uint32_t outgoingFrameCounter;
@@ -815,18 +815,18 @@ typedef struct {
ZbUptimeT cooldown;
} ZbApsmeKeyPairT;
-void ZbApsmeTransportKeyReq(struct ZigBeeT *zb, ZbApsmeTransportKeyReqT *req);
-enum ZbSecHdrKeyIdT ZbApsmeUpdateDeviceReq(struct ZigBeeT *zb, ZbApsmeUpdateDeviceReqT *req);
-void ZbApsmeRemoveDeviceReq(struct ZigBeeT *zb, ZbApsmeRemoveDeviceReqT *req);
-enum ZbStatusCodeT ZbApsmeRequestKeyReq(struct ZigBeeT *zb, ZbApsmeRequestKeyReqT *req);
-void ZbApsmeSwitchKeyReq(struct ZigBeeT *zb, ZbApsmeSwitchKeyReqT *req);
-void ZbApsmeVerifyKeyReq(struct ZigBeeT *zb, ZbApsmeVerifyKeyReqT *req);
-void ZbApsmeConfirmKeyReq(struct ZigBeeT *zb, ZbApsmeConfirmKeyReqT *req);
-void ZbApsmeAddKeyReq(struct ZigBeeT *zb, ZbApsmeAddKeyReqT *req, ZbApsmeAddKeyConfT *conf);
+void ZbApsmeTransportKeyReq(struct ZigBeeT *zb, struct ZbApsmeTransportKeyReqT *req);
+enum ZbSecHdrKeyIdT ZbApsmeUpdateDeviceReq(struct ZigBeeT *zb, struct ZbApsmeUpdateDeviceReqT *req);
+void ZbApsmeRemoveDeviceReq(struct ZigBeeT *zb, struct ZbApsmeRemoveDeviceReqT *req);
+enum ZbStatusCodeT ZbApsmeRequestKeyReq(struct ZigBeeT *zb, struct ZbApsmeRequestKeyReqT *req);
+void ZbApsmeSwitchKeyReq(struct ZigBeeT *zb, struct ZbApsmeSwitchKeyReqT *req);
+void ZbApsmeVerifyKeyReq(struct ZigBeeT *zb, struct ZbApsmeVerifyKeyReqT *req);
+void ZbApsmeConfirmKeyReq(struct ZigBeeT *zb, struct ZbApsmeConfirmKeyReqT *req);
+void ZbApsmeAddKeyReq(struct ZigBeeT *zb, struct ZbApsmeAddKeyReqT *req, struct ZbApsmeAddKeyConfT *conf);
/* For ZbApsmeGetKeyReq, key types ZB_SEC_KEYTYPE_TC_LINK and ZB_SEC_KEYTYPE_APP_LINK are treated
* the same when searching, so you can use either to get the link key for the requested EUI. */
-void ZbApsmeGetKeyReq(struct ZigBeeT *zb, ZbApsmeGetKeyReqT *req, ZbApsmeGetKeyConfT *conf);
-void ZbApsmeRemoveKeyReq(struct ZigBeeT *zb, ZbApsmeRemoveKeyReqT *req, ZbApsmeRemoveKeyConfT *conf);
+void ZbApsmeGetKeyReq(struct ZigBeeT *zb, struct ZbApsmeGetKeyReqT *req, struct ZbApsmeGetKeyConfT *conf);
+void ZbApsmeRemoveKeyReq(struct ZigBeeT *zb, struct ZbApsmeRemoveKeyReqT *req, struct ZbApsmeRemoveKeyConfT *conf);
/*---------------------------------------------------------------
* Filter API
@@ -849,7 +849,7 @@ struct ZbApsFilterT {
struct LinkListT link;
/* Packet handler actions */
enum ZbApsFilterTypeT type;
- int (*callback)(ZbApsdeDataIndT *dataInd, void *cb_arg);
+ int (*callback)(struct ZbApsdeDataIndT *dataInd, void *cb_arg);
void *arg;
/* Packet filter rules */
uint32_t r[ZB_APS_FILTER_RULES_MAX];
@@ -857,10 +857,10 @@ struct ZbApsFilterT {
/* Create an APS indication filter and callback for an endpoint, with no specific cluster being filtered. */
struct ZbApsFilterT * ZbApsFilterEndpointAdd(struct ZigBeeT *zb, uint8_t endpoint, uint16_t profileId,
- int (*callback)(ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg);
+ int (*callback)(struct ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg);
/* Create an APS indication filter and callback for an endpoint and a specific cluster ID. */
struct ZbApsFilterT * ZbApsFilterClusterAdd(struct ZigBeeT *zb, uint8_t endpoint, uint16_t clusterId, uint16_t profileId,
- int (*callback)(ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg);
+ int (*callback)(struct ZbApsdeDataIndT *dataInd, void *cb_arg), void *arg);
void ZbApsFilterClusterFree(struct ZigBeeT *zb, struct ZbApsFilterT *filter);
/*---------------------------------------------------------------
@@ -876,7 +876,7 @@ enum ZbStatusCodeT ZbApsSetIndex(struct ZigBeeT *zb, enum ZbApsmeIbAttrIdT attrI
bool ZbApsGroupIsMember(struct ZigBeeT *zb, uint16_t groupAddr, uint8_t endpoint);
bool ZbApsLinkKeyExists(struct ZigBeeT *zb, uint64_t partner);
-ZbApsmeKeyPairT * ZbApsLookupKey(struct ZigBeeT *zb, ZbApsmeKeyPairT *key,
+struct ZbApsmeKeyPairT * ZbApsLookupKey(struct ZigBeeT *zb, struct ZbApsmeKeyPairT *key,
uint64_t addr, unsigned int *idx);
bool ZbApsAddrIsBcast(struct ZbApsAddrT *addr);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.bdb.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.bdb.h
index 53c86c761..4c012260b 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.bdb.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.bdb.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_BDB_H
#define ZIGBEE_BDB_H
@@ -113,7 +113,7 @@ enum ZbBdbAttrIdT {
ZB_BDB_JoinScanType, /* 0x110a - MCP_SCAN_ACTIVE (default) or MCP_SCAN_ENHANCED */
ZB_BDB_JoinIgnoreLqi, /* 0x110b - bool - Ignore LQI (link cost <= 3) of potential parent's beacon */
ZB_BDB_NlmeSyncFailNumBeforeError, /* 0x110c - uint8_t - Number of consecutive NLME-SYNC failures before reporting ZB_NWK_STATUS_CODE_PARENT_LINK_FAILURE */
- ZB_BDB_ZdoTimeout, /* 0x110d - ZDO response-wait timeout - default is 6 seconds */
+ ZB_BDB_ZdoTimeout, /* 0x110d - ZDO response wait timeout in milliseconds - default is 6000 mS */
ZB_BDB_TLStealFlags, /* 0x110e */
ZB_BDB_JoinTclkNodeDescReqDelay, /* 0x110f */
ZB_BDB_JoinTclkRequestKeyDelay, /* 0x1110 */
@@ -128,6 +128,7 @@ enum ZbBdbAttrIdT {
ZB_BDB_MaxConcurrentJoiners, /* 0x1119 - uint8_t - maximum number of concurrent joiners the coordinator supports */
ZB_BDB_DisablePersistRejoin, /* 0x111a - boolean */
ZB_BDB_ZdoBindCheckCluster, /* boolean */
+ ZB_BDB_ApsInterpanDisabled, /* boolean */
/* Constants which are accessible through a BDB GET IB request. */
ZB_BDBC_MaxSameNetworkRetryAttempts = 0x1200,
@@ -141,7 +142,7 @@ enum ZbBdbAttrIdT {
};
/* BDB-GET.request */
-typedef struct {
+typedef struct ZbBdbGetReqT {
enum ZbBdbAttrIdT attrId;
void *attr;
unsigned int attrLength;
@@ -149,13 +150,13 @@ typedef struct {
} ZbBdbGetReqT;
/* BDB-GET.confirm */
-typedef struct {
+typedef struct ZbBdbGetConfT {
enum ZbStatusCodeT status;
enum ZbBdbAttrIdT attrId;
} ZbBdbGetConfT;
/* BDB-SET.request */
-typedef struct {
+typedef struct ZbBdbSetReqT {
enum ZbBdbAttrIdT attrId;
const void *attr;
unsigned int attrLength;
@@ -163,7 +164,7 @@ typedef struct {
} ZbBdbSetReqT;
/* BDB-SET.confirm */
-typedef struct {
+typedef struct ZbBdbSetConfT {
enum ZbStatusCodeT status;
enum ZbBdbAttrIdT attrId;
} ZbBdbSetConfT;
@@ -172,8 +173,8 @@ typedef struct {
#define ZbBdbSet(_zb_, _id_, _ptr_, _sz_) ZbBdbSetIndex(_zb_, _id_, _ptr_, _sz_, 0)
enum ZbStatusCodeT ZbBdbGetIndex(struct ZigBeeT *zb, enum ZbBdbAttrIdT attrId, void *attrPtr, unsigned int attrSz, unsigned int attrIndex);
enum ZbStatusCodeT ZbBdbSetIndex(struct ZigBeeT *zb, enum ZbBdbAttrIdT attrId, const void *attrPtr, unsigned int attrSz, unsigned int attrIndex);
-void ZbBdbGetReq(struct ZigBeeT *zb, ZbBdbGetReqT *getReqPtr, ZbBdbGetConfT *getConfPtr);
-void ZbBdbSetReq(struct ZigBeeT *zb, ZbBdbSetReqT *setReqPtr, ZbBdbSetConfT *setConfPtr);
+void ZbBdbGetReq(struct ZigBeeT *zb, struct ZbBdbGetReqT *getReqPtr, struct ZbBdbGetConfT *getConfPtr);
+void ZbBdbSetReq(struct ZigBeeT *zb, struct ZbBdbSetReqT *setReqPtr, struct ZbBdbSetConfT *setConfPtr);
/* Helpers for bdbCommissioningMode bits */
/* ZbBdbCommissionModeBitSupported - Check if a BDB_COMMISSION_MODE_ bit or mask is
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h
index fb03e19d3..586617265 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_H
# define ZIGBEE_H
@@ -19,18 +19,24 @@
#include "zb_make_config.h"
#endif
+#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <inttypes.h>
+
+/* stdarg is required for the logging (ZbSetLogging) */
/*lint -save -e829 [ 'stdarg.h' usage should be deprecated - 17.1 REQUIRED] */
/*lint -save -e451 [ header file included withoutstandard guard - 4.10 REQUIRED] */
#include <stdarg.h>
/*lint -restore */
/*lint -restore */
-#include "ieee802154.api.h"
#include "llist.h"
+#include "ieee802154_enums.h"
+
+struct ZigBeeT;
+struct WpanPublicT;
/* ZigBee Protocol Versions as related to the spec version. */
#if 0 /* deprecated */
@@ -66,7 +72,6 @@ enum ZbStatusCodeT {
/* General Status Codes */
ZB_STATUS_SUCCESS = 0x00,
ZB_STATUS_ALLOC_FAIL = 0x70, /* Memory allocation failure. */
- ZB_STATUS_TIMEOUT = 0x71, /* Message timeout. */
/* ZDP Status Codes */
ZB_ZDP_STATUS_SUCCESS = ZB_STATUS_SUCCESS,
@@ -133,7 +138,7 @@ enum ZbStatusCodeT {
ZB_NWK_STATUS_INVALID_INDEX = 0xd4,
ZB_NWK_STATUS_INTERNAL_ERR = 0xd6,
- /* WPAN Status Codes (copied from ieee802154.api.h to here for MISRA) */
+ /* WPAN Status Codes (copied from mcp_enums.h to here for MISRA) */
ZB_WPAN_STATUS_SUCCESS = ZB_STATUS_SUCCESS,
ZB_WPAN_STATUS_COUNTER_ERROR = mcp_STATUS_COUNTER_ERROR,
ZB_WPAN_STATUS_IMPROPER_KEY_TYPE = mcp_STATUS_IMPROPER_KEY_TYPE,
@@ -183,6 +188,10 @@ enum ZbTcsoStatusT {
ZB_TCSO_STATUS_FATAL /* TCSO failed and unable to restore previous operation. */
};
+/*---------------------------------------------------------------
+ * Stack Logging
+ *---------------------------------------------------------------
+ */
/* Debugging log mask. */
#define ZB_LOG_MASK_FATAL 0x00000001U /* Unrecoverable errors. */
#define ZB_LOG_MASK_ERROR 0x00000002U /* Recoverable internal errors. */
@@ -204,7 +213,9 @@ enum ZbTcsoStatusT {
#define ZB_LOG_MASK_ZCL 0x00002000U
/* Green Power */
#define ZB_LOG_MASK_GREENPOWER 0x00004000U
-/* Reserved 0x0fffc000U */
+/* Diagnostics */
+#define ZB_LOG_MASK_DIAG 0x00008000U
+/* Reserved 0x0fff0000U */
/* MAC */
#define ZB_LOG_MASK_MAC_RSSI 0x10000000U /* Print debug message per MCPS-DATA.indication showing RSSI */
@@ -218,6 +229,17 @@ enum ZbTcsoStatusT {
#define ZB_LOG_MASK_LEVEL_6 (ZB_LOG_MASK_LEVEL_5 | ZB_LOG_MASK_ZCL)
#define ZB_LOG_MASK_LEVEL_ALL 0xFFFFFFFFU
+/* Specifies the level of logging to use, and a callback that outputs the log information. */
+void ZbSetLogging(struct ZigBeeT *zb, uint32_t mask,
+ void (*func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr, const char *fmt, va_list argptr));
+
+void ZbGetLogging(struct ZigBeeT *zb, uint32_t *mask,
+ void(**func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr, const char *fmt, va_list argptr));
+
+/*---------------------------------------------------------------
+ * Exegin Manufacturing ID
+ *---------------------------------------------------------------
+ */
/* The Exegin manufacturer ID. */
#define ZB_MFG_CODE_EXEGIN 0x10D7U
#define ZB_MFG_CODE_WILDCARD 0xFFFFU
@@ -255,20 +277,20 @@ unsigned int ZbTimeoutRemaining(ZbUptimeT now, ZbUptimeT expire_time);
/* A pointer to this struct type is passed to ZbInit to define the various
* ZigBee tables used in the stack. If the pointer to ZbInit is NULL, the
* default sizes are used. */
-typedef struct {
+typedef struct ZbInitTblSizesT {
/* NWK Table Sizes */
unsigned int nwkNeighborTblSz; /* Default: 64 */
unsigned int nwkRouteTblSz; /* Default: 32 */
unsigned int nwkAddrMapTblSz; /* Default: 32 */
unsigned int nwkBttSz; /* Default is 32 */
unsigned int nwkRReqSz; /* default 16 */
-#if 0 /* TODO? */
+#if 0 /* EXEGIN? */
unsigned int nwkRRecBits; /* default 10 */
#endif
/* APS Table Sizes */
unsigned int apsPeerLinkKeyTblSz; /* Default: 32 */
-#if 0 /* TODO? */
+#if 0 /* EXEGIN? */
unsigned int aps_binding_table_size; /* Default: 64 */
unsigned int aps_group_table_size; /* Default: 16 */
#endif
@@ -276,14 +298,14 @@ typedef struct {
/* Same parameters as ZbSetLogging takes. Allows debug log output
* as stack is being initialized. */
-typedef struct {
+typedef struct ZbInitSetLoggingT {
uint32_t mask;
void (*func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr,
const char *fmt, va_list argptr);
} ZbInitSetLoggingT;
/* Allocates a new Zigbee stack instance. */
-struct ZigBeeT * ZbInit(uint64_t extAddr, ZbInitTblSizesT *tblSizes, ZbInitSetLoggingT *setLogging);
+struct ZigBeeT * ZbInit(uint64_t extAddr, struct ZbInitTblSizesT *tblSizes, struct ZbInitSetLoggingT *setLogging);
/* Deallocates a Zigbee stack instance. */
void ZbDestroy(struct ZigBeeT *zb);
@@ -314,7 +336,6 @@ void ZbChangeExtAddr(struct ZigBeeT *zb, uint64_t extAddr);
struct ZbNlmeLeaveConfT;
enum ZbStatusCodeT ZB_WARN_UNUSED ZbLeaveReq(struct ZigBeeT *zb,
void (*callback)(struct ZbNlmeLeaveConfT *conf, void *arg), void *cbarg);
-enum ZbStatusCodeT ZbLeaveWait(struct ZigBeeT *zb);
/* Helper function to perform an APS and NWK reset */
void ZbReset(struct ZigBeeT *zb);
@@ -326,13 +347,6 @@ bool ZbIfAttach(struct ZigBeeT *zb, struct WpanPublicT *dev);
/* Detaches an IEEE 802.15.4 device driver from the ZigBee stack. */
void ZbIfDetach(struct ZigBeeT *zb, struct WpanPublicT *dev);
-/* Specifies the level of logging to use, and a callback that outputs the log information. */
-void ZbSetLogging(struct ZigBeeT *zb, uint32_t mask,
- void (*func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr, const char *fmt, va_list argptr));
-
-void ZbGetLogging(struct ZigBeeT *zb, uint32_t *mask,
- void(**func)(struct ZigBeeT *zb, uint32_t mask, const char *hdr, const char *fmt, va_list argptr));
-
/*---------------------------------------------------------------
* ZCL Basic Server API
*---------------------------------------------------------------
@@ -391,25 +405,26 @@ unsigned int ZbTimerRemaining(struct ZbTimerT *timer);
*/
/* Asynchronous message filter mask. */
/* NWK Indications */
-#define ZB_MSG_FILTER_JOIN_IND 0x00000001U /* NLME-JOIN.indication (ZbNlmeJoinIndT) */
-#define ZB_MSG_FILTER_LEAVE_IND 0x00000002U /* NLME-LEAVE.indication (ZbNlmeLeaveIndT) */
-#define ZB_MSG_FILTER_STATUS_IND 0x00000004U /* NLME-NETWORK-STATUS.indication (ZbNlmeNetworkStatusIndT) */
+#define ZB_MSG_FILTER_JOIN_IND 0x00000001U /* NLME-JOIN.indication (struct ZbNlmeJoinIndT) */
+#define ZB_MSG_FILTER_LEAVE_IND 0x00000002U /* NLME-LEAVE.indication (struct ZbNlmeLeaveIndT) */
+#define ZB_MSG_FILTER_STATUS_IND 0x00000004U /* NLME-NETWORK-STATUS.indication (struct ZbNlmeNetworkStatusIndT) */
/* APS Indications */
-#define ZB_MSG_FILTER_TRANSPORT_KEY_IND 0x00000008U /* APSME-TRANSPORT-KEY.indication (ZbApsmeTransKeyIndT) */
-#define ZB_MSG_FILTER_UPDATE_DEVICE_IND 0x00000010U /* APSME-UPDATE-DEVICE.indication (ZbApsmeUpdateDeviceIndT) */
-#define ZB_MSG_FILTER_REMOVE_DEVICE_IND 0x00000020U /* APSME-REMOVE-DEVICE.indication (ZbApsmeRemoveDeviceIndT) */
-#define ZB_MSG_FILTER_REQUEST_KEY_IND 0x00000040U /* APSME-REQUEST-KEY.indication (ZbApsmeRequestKeyIndT) */
-#define ZB_MSG_FILTER_SWITCH_KEY_IND 0x00000080U /* APSME-SWITCH-KEY.indication (ZbApsmeSwitchKeyIndT) */
-#define ZB_MSG_FILTER_VERIFY_KEY_IND 0x00000100U /* APSME-VERIFY-KEY.indication (ZbApsmeVerifyKeyIndT) */
-#define ZB_MSG_FILTER_CONFIRM_KEY_IND 0x00000200U /* APSME-CONFIRM-KEY.indication (ZbApsmeConfirmKeyIndT) */
+#define ZB_MSG_FILTER_TRANSPORT_KEY_IND 0x00000008U /* APSME-TRANSPORT-KEY.indication (struct ZbApsmeTransKeyIndT) */
+#define ZB_MSG_FILTER_UPDATE_DEVICE_IND 0x00000010U /* APSME-UPDATE-DEVICE.indication (struct ZbApsmeUpdateDeviceIndT) */
+#define ZB_MSG_FILTER_REMOVE_DEVICE_IND 0x00000020U /* APSME-REMOVE-DEVICE.indication (struct ZbApsmeRemoveDeviceIndT) */
+#define ZB_MSG_FILTER_REQUEST_KEY_IND 0x00000040U /* APSME-REQUEST-KEY.indication (struct ZbApsmeRequestKeyIndT) */
+#define ZB_MSG_FILTER_SWITCH_KEY_IND 0x00000080U /* APSME-SWITCH-KEY.indication (struct ZbApsmeSwitchKeyIndT) */
+#define ZB_MSG_FILTER_VERIFY_KEY_IND 0x00000100U /* APSME-VERIFY-KEY.indication (struct ZbApsmeVerifyKeyIndT) */
+#define ZB_MSG_FILTER_CONFIRM_KEY_IND 0x00000200U /* APSME-CONFIRM-KEY.indication (struct ZbApsmeConfirmKeyIndT) */
/* Data Indications */
#define ZB_MSG_FILTER_MCPS_DATA_IND 0x00000400U /* MCPS-DATA.indication (struct wpan_data_ind) */
-#define ZB_MSG_FILTER_NLDE_DATA_IND 0x00000800U /* NLDE-DATA.indication (ZbNldeDataIndT) */
-#define ZB_MSG_FILTER_APSDE_DATA_IND 0x00001000U /* APSDE-DATA.indication (ZbApsdeDataIndT) */
+#define ZB_MSG_FILTER_NLDE_DATA_IND 0x00000800U /* NLDE-DATA.indication (struct ZbNldeDataIndT) */
+#define ZB_MSG_FILTER_APSDE_DATA_IND 0x00001000U /* APSDE-DATA.indication (struct ZbApsdeDataIndT) */
/* Startup Indications */
#define ZB_MSG_FILTER_STARTUP_IND 0x00002000U /* (struct ZbMsgStartupInd) */
/* Reset to Factory Defaults (e.g. Basic Server ZCL_BASIC_RESET_FACTORY command) */
#define ZB_MSG_FILTER_FACTORY_RESET 0x00004000U
+#define ZB_MSG_FILTER_RESET_REPORTS 0x00008000U
/* Note, max filter bit we can specify here is 0x00080000U */
/* Groups of messages that are filterable. */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.nwk.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.nwk.h
index bface2329..345dbb7fd 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.nwk.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.nwk.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_NWK_H
# define ZIGBEE_NWK_H
@@ -36,26 +36,29 @@ enum nwkAddrAllocMethod {
/* Status codes for network status indications. */
enum ZbNwkNetworkStatusCodeT {
- ZB_NWK_STATUS_CODE_NO_ROUTE_AVAILABLE = 0x00,
- ZB_NWK_STATUS_CODE_TREE_LINK_FAILURE = 0x01,
- ZB_NWK_STATUS_CODE_NON_TREE_LINK_FAILURE = 0x02,
- ZB_NWK_STATUS_CODE_LOW_BATTERY = 0x03,
- ZB_NWK_STATUS_CODE_NO_ROUTING_CAPACITY = 0x04,
- ZB_NWK_STATUS_CODE_NO_INDIRECT_CAPACITY = 0x05,
- ZB_NWK_STATUS_CODE_INDIRECT_EXPIRY = 0x06,
- ZB_NWK_STATUS_CODE_TARGET_UNAVAILABLE = 0x07,
- ZB_NWK_STATUS_CODE_TARGET_UNALLOCATED = 0x08,
- ZB_NWK_STATUS_CODE_PARENT_LINK_FAILURE = 0x09,
- ZB_NWK_STATUS_CODE_VALIDATE_ROUTE = 0x0a,
- ZB_NWK_STATUS_CODE_SOURCE_ROUTE_FAILURE = 0x0b,
- ZB_NWK_STATUS_CODE_MANY_TO_ONE_FAILURE = 0x0c,
- ZB_NWK_STATUS_CODE_ADDRESS_CONFLICT = 0x0d,
- ZB_NWK_STATUS_CODE_VERIFY_ADDRESS = 0x0e,
- ZB_NWK_STATUS_CODE_PANID_UPDATE = 0x0f,
- ZB_NWK_STATUS_CODE_ADDRESS_UPDATE = 0x10,
- ZB_NWK_STATUS_CODE_BAD_FRAME_COUNTER = 0x11,
- ZB_NWK_STATUS_CODE_BAD_KEY_SEQNUM = 0x12,
- ZB_NWK_STATUS_CODE_UNKNOWN_COMMAND = 0x13
+ ZB_NWK_STATUS_CODE_NO_ROUTE_AVAILABLE = 0x00, /* No route available */
+ ZB_NWK_STATUS_CODE_TREE_LINK_FAILURE = 0x01, /* Tree link failure */
+ ZB_NWK_STATUS_CODE_NON_TREE_LINK_FAILURE = 0x02, /* Non-tree link failure */
+ ZB_NWK_STATUS_CODE_LOW_BATTERY = 0x03, /* Low battery level */
+ ZB_NWK_STATUS_CODE_NO_ROUTING_CAPACITY = 0x04, /* No routing capacity */
+ ZB_NWK_STATUS_CODE_NO_INDIRECT_CAPACITY = 0x05, /* No indirect capacity */
+ ZB_NWK_STATUS_CODE_INDIRECT_EXPIRY = 0x06, /* Indirect transaction expiry */
+ ZB_NWK_STATUS_CODE_TARGET_UNAVAILABLE = 0x07, /* Target device unavailable */
+ ZB_NWK_STATUS_CODE_TARGET_UNALLOCATED = 0x08, /* Target address unallocated */
+ ZB_NWK_STATUS_CODE_PARENT_LINK_FAILURE = 0x09, /* Parent link failure */
+ ZB_NWK_STATUS_CODE_VALIDATE_ROUTE = 0x0a, /* Validate route */
+ ZB_NWK_STATUS_CODE_SOURCE_ROUTE_FAILURE = 0x0b, /* Source route failure */
+ ZB_NWK_STATUS_CODE_MANY_TO_ONE_FAILURE = 0x0c, /* Many-to-one route failure */
+ ZB_NWK_STATUS_CODE_ADDRESS_CONFLICT = 0x0d, /* Address conflict */
+ ZB_NWK_STATUS_CODE_VERIFY_ADDRESS = 0x0e, /* Verify address */
+ ZB_NWK_STATUS_CODE_PANID_UPDATE = 0x0f, /* PAN identifier update */
+ ZB_NWK_STATUS_CODE_ADDRESS_UPDATE = 0x10, /* Network address update */
+ ZB_NWK_STATUS_CODE_BAD_FRAME_COUNTER = 0x11, /* Bad frame counter */
+ ZB_NWK_STATUS_CODE_BAD_KEY_SEQNUM = 0x12, /* Bad key sequence number */
+ ZB_NWK_STATUS_CODE_UNKNOWN_COMMAND = 0x13, /* Unknown Command */
+ /* 0x14 - 0xff = Reserved */
+ /* Custom Exegin status codes */
+ ZB_NWK_STATUS_CODE_INCOMING_FRAME_COUNTER = 0xff /* An incoming frame counter is greater than 0x80000000 */
};
/* NWK DstAddrMode values */
@@ -169,13 +172,20 @@ enum ZbNwkNibAttrIdT {
ZB_NWK_NIB_ID_PassiveAckEnabled /* uint8_t - Enable/Disable Broadcast Passive ACK */
};
-/* Possible values for ZbNlmeJoinReqT.rejoinNetwork */
+/* Possible values for struct ZbNlmeJoinReqT.rejoinNetwork */
enum ZbNwkRejoinTypeT {
ZB_NWK_REJOIN_TYPE_ASSOC = 0x00,
ZB_NWK_REJOIN_TYPE_ORPHAN,
ZB_NWK_REJOIN_TYPE_NWKREJOIN
};
+/* R22 (GB-868) Joining Policies */
+enum WpanJoinPolicyT {
+ WPAN_JOIN_POLICY_ALL = 0, /* 0x00 = ALL_JOIN */
+ WPAN_JOIN_POLICY_IEEELIST, /* 0x01 = IEEELIST_JOIN */
+ WPAN_JOIN_POLICY_NONE /* 0x02 = NO_JOIN */
+};
+
/* Maximum link cost. */
#define ZB_NWK_LINK_COST_MAX 7U
@@ -216,7 +226,7 @@ enum ZbNwkRejoinTypeT {
#define ZB_NWK_CONST_ENDDEV_TIMEOUT_DISABLED 0xffU
/* NWK Security Material Set (ZB_NWK_NIB_ID_SecurityMaterialSet) */
-typedef struct {
+typedef struct ZbNwkSecMaterialT {
bool valid;
uint8_t keySeqNumber;
uint8_t key[ZB_SEC_KEYSIZE];
@@ -224,7 +234,7 @@ typedef struct {
} ZbNwkSecMaterialT;
/* Frame Counter Attribute Set (ZB_NWK_NIB_ID_FrameCounterSet) */
-typedef struct {
+typedef struct ZbNwkFrameCounterT {
uint8_t keySeqNumber;
uint64_t senderAddr;
uint32_t counter;
@@ -233,7 +243,7 @@ typedef struct {
uint32_t persistCounter; /* Last saved counter value */
} ZbNwkFrameCounterT;
-typedef struct {
+typedef struct ZbNwkRouteRecordInfoT {
unsigned int recordsSent;
bool doSendNext; /* Send Route Record before next tx */
bool doRenew; /* Whether to renew sending a Route Record after renewTime. */
@@ -255,12 +265,12 @@ struct ZbNwkDiscoveryInfoT {
bool endDevCapacity;
bool potentialParent;
uint8_t updateId;
- uint8_t lqi; /* mirror of ZbNwkNeighborT.lqi value */
+ uint8_t lqi; /* mirror of struct ZbNwkNeighborT.lqi value */
/* Exegin add-ons */
uint8_t beaconOrder;
uint8_t superframeOrder;
- /* Duplicates of ZbNwkNeighborT. Only used by ZB_NWK_NIB_ID_DiscoveryTable */
+ /* Duplicates of struct ZbNwkNeighborT. Only used by ZB_NWK_NIB_ID_DiscoveryTable */
uint16_t nwkAddr; /* Entry is empty if == ZB_NWK_ADDR_UNDEFINED */
};
@@ -287,6 +297,7 @@ enum ZbNwkNeighborRelT {
ZB_NWK_NEIGHBOR_REL_SIBLING = 0x02,
ZB_NWK_NEIGHBOR_REL_NONE = 0x03,
ZB_NWK_NEIGHBOR_REL_PREV_CHILD = 0x04,
+ /* Exegin Custom Values follow here */
ZB_NWK_NEIGHBOR_REL_UNAUTH_CHILD = 0x05,
/* Temporary values to use during association. */
ZB_NWK_NEIGHBOR_REL_PEND_ASSOCIATE = 0x06,
@@ -308,7 +319,7 @@ enum ZbNwkNeighborRelT {
#define ZB_NWK_NEIGHBOR_IFINDEX_UNKNOWN 0xffU
-typedef struct {
+typedef struct ZbNwkNeighborT {
/*** Mandatory Neighbor Table Entries */
uint64_t extAddr;
uint16_t nwkAddr; /* Set to ZB_NWK_ADDR_UNDEFINED to invalidate entry */
@@ -341,11 +352,11 @@ enum ZbNwkRouteStatusT {
#define ZB_NWK_ROUTE_RECORD_RENEWAL_TIMEOUT (60U * 1000U) /* ms */
#define ZB_NWK_ROUTE_RECORD_POST_SLEEP (20U) /* ms */
-typedef struct {
+typedef struct ZbNwkRouteEntryT {
enum ZbNwkRouteStatusT status;
bool noCache; /* flag indicating destination doesn't store source routes. */
bool isManyToOne; /* flag indicating if destination is a concentrator */
- ZbNwkRouteRecordInfoT routeRecord;
+ struct ZbNwkRouteRecordInfoT routeRecord;
uint16_t destAddr;
uint16_t nextAddr;
ZbUptimeT lastUsed; /* Used to measure route table ageing. */
@@ -357,7 +368,7 @@ typedef struct {
*---------------------------------------------------------------
*/
/* NLDE-DATA.request */
-typedef struct {
+typedef struct ZbNldeDataReqT {
enum ZbNwkAddrModeT dstAddrMode;
uint8_t nonMemberRadius;
uint16_t dstAddr;
@@ -374,13 +385,13 @@ typedef struct {
} ZbNldeDataReqT;
/* NLDE-DATA.confirm */
-typedef struct {
+typedef struct ZbNldeDataConfT {
uint32_t handle;
enum ZbStatusCodeT status;
} ZbNldeDataConfT;
/* NLDE-DATA.indication */
-typedef struct {
+typedef struct ZbNldeDataIndT {
enum ZbNwkAddrModeT dstAddrMode;
uint16_t dstAddr;
uint16_t srcAddr;
@@ -392,13 +403,12 @@ typedef struct {
bool useSecurity;
} ZbNldeDataIndT;
-void ZbNldeDataReqWait(struct ZigBeeT *zb, ZbNldeDataReqT *req, ZbNldeDataConfT *conf);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeDataReqCallback(struct ZigBeeT *zb, ZbNldeDataReqT *req,
- void (*callback)(ZbNldeDataConfT *dataConf, void *cb_arg), void *arg);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeDataReqCallback(struct ZigBeeT *zb, struct ZbNldeDataReqT *req,
+ void (*callback)(struct ZbNldeDataConfT *dataConf, void *cb_arg), void *arg);
/* NLDE-FRAME.request */
/* Exegin addon for RAW MAC frame transmission. */
-typedef struct {
+typedef struct ZbNldeFrameReqT {
enum ZbNwkAddrModeT dstAddrMode;
enum ZbNwkAddrModeT srcAddrMode;
uint16_t dstAddr16;
@@ -410,10 +420,9 @@ typedef struct {
uint32_t handle;
} ZbNldeFrameReqT;
-typedef ZbNldeDataConfT ZbNldeFrameConfT;
+typedef struct ZbNldeDataConfT ZbNldeFrameConfT;
-void ZbNldeFrameReqWait(struct ZigBeeT *zb, ZbNldeFrameReqT *req, ZbNldeFrameConfT *conf);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeFrameReqCallback(struct ZigBeeT *zb, ZbNldeFrameReqT *req,
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeFrameReqCallback(struct ZigBeeT *zb, struct ZbNldeFrameReqT *req,
void (*callback)(ZbNldeFrameConfT *FrameConf, void *cb_arg), void *arg);
/*---------------------------------------------------------------
@@ -421,7 +430,7 @@ enum ZbStatusCodeT ZB_WARN_UNUSED ZbNldeFrameReqCallback(struct ZigBeeT *zb, ZbN
*---------------------------------------------------------------
*/
/* NLME-GET.request */
-typedef struct {
+typedef struct ZbNlmeGetReqT {
enum ZbNwkNibAttrIdT attrId;
void *attr; /* Buffer for attribute data */
unsigned int attrLength; /* Max length of input, actual length returned */
@@ -429,13 +438,13 @@ typedef struct {
} ZbNlmeGetReqT;
/* NLME-GET.confirm */
-typedef struct {
+typedef struct ZbNlmeGetConfT {
enum ZbStatusCodeT status;
enum ZbNwkNibAttrIdT attrId;
} ZbNlmeGetConfT;
/* NLME-SET.request */
-typedef struct {
+typedef struct ZbNlmeSetReqT {
enum ZbNwkNibAttrIdT attrId;
const void *attr;
unsigned int attrLength;
@@ -443,38 +452,38 @@ typedef struct {
} ZbNlmeSetReqT;
/* NLME-SET.confirm */
-typedef struct {
+typedef struct ZbNlmeSetConfT {
enum ZbStatusCodeT status;
enum ZbNwkNibAttrIdT attrId;
} ZbNlmeSetConfT;
/* NLME-RESET.request */
-typedef struct {
+typedef struct ZbNlmeResetReqT {
bool warmStart;
} ZbNlmeResetReqT;
/* NLME-RESET.confirm */
-typedef struct {
+typedef struct ZbNlmeResetConfT {
enum ZbStatusCodeT status;
} ZbNlmeResetConfT;
/* NLME-SYNC.request */
-typedef struct {
+typedef struct ZbNlmeSyncReqT {
bool track;
} ZbNlmeSyncReqT;
/* NLME-SYNC.confirm */
-typedef struct {
+typedef struct ZbNlmeSyncConfT {
enum ZbStatusCodeT status;
} ZbNlmeSyncConfT;
/* NLME-SYNC.indication */
-typedef struct {
+typedef struct ZbNlmeSyncIndT {
void *voidPtr; /* empty */
} ZbNlmeSyncIndT;
/* NLME-NETWORK-FORMATION.request */
-typedef struct {
+typedef struct ZbNlmeNetFormReqT {
struct ZbChannelListT scanChannels;
uint8_t scanDuration;
uint8_t beaconOrder;
@@ -484,34 +493,34 @@ typedef struct {
} ZbNlmeNetFormReqT;
/* NLME-NETWORK-FORMATION.confirm */
-typedef struct {
+typedef struct ZbNlmeNetFormConfT {
enum ZbStatusCodeT status;
} ZbNlmeNetFormConfT;
/* NLME-NETWORK-DISCOVERY.request */
-typedef struct {
+typedef struct ZbNlmeNetDiscReqT {
struct ZbChannelListT scanChannels;
uint8_t scanDuration;
} ZbNlmeNetDiscReqT;
/* NLME-NETWORK-DISCOVERY.confirm */
-typedef struct {
+typedef struct ZbNlmeNetDiscConfT {
enum ZbStatusCodeT status;
/* Use ZB_NWK_NIB_ID_DiscoveryTable to retrieve the discovery table entries. */
} ZbNlmeNetDiscConfT;
/* NLME-PERMIT-JOIN.request */
-typedef struct {
+typedef struct ZbNlmePermitJoinReqT {
uint8_t permitDuration;
} ZbNlmePermitJoinReqT;
/* NLME-PERMIT-JOIN.confirm */
-typedef struct {
+typedef struct ZbNlmePermitJoinConfT {
enum ZbStatusCodeT status;
} ZbNlmePermitJoinConfT;
/* NLME-JOIN.request */
-typedef struct {
+typedef struct ZbNlmeJoinReqT {
uint64_t epid;
enum ZbNwkRejoinTypeT rejoinNetwork;
struct ZbChannelListT scanChannels;
@@ -521,13 +530,13 @@ typedef struct {
} ZbNlmeJoinReqT;
/* NLME-JOIN.confirm */
-typedef struct {
+typedef struct ZbNlmeJoinConfT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
} ZbNlmeJoinConfT;
/* NLME-JOIN.indication */
-typedef struct {
+typedef struct ZbNlmeJoinIndT {
uint16_t nwkAddr;
uint64_t extAddr;
uint8_t capabilityInfo;
@@ -536,7 +545,7 @@ typedef struct {
} ZbNlmeJoinIndT;
/* NLME-DIRECT-JOIN.request */
-typedef struct {
+typedef struct ZbNlmeDirectJoinReqT {
uint64_t deviceAddr;
uint16_t nwkAddr; /* Exegin addon - set to ZB_NWK_ADDR_UNDEFINED if not used. */
uint8_t capabilityInfo;
@@ -544,7 +553,7 @@ typedef struct {
} ZbNlmeDirectJoinReqT;
/* NLME-DIRECT-JOIN.confirm */
-typedef struct {
+typedef struct ZbNlmeDirectJoinConfT {
uint64_t deviceAddr;
enum ZbStatusCodeT status;
} ZbNlmeDirectJoinConfT;
@@ -563,7 +572,7 @@ typedef struct ZbNlmeLeaveConfT {
} ZbNlmeLeaveConfT;
/* NLME-LEAVE.indication */
-typedef struct {
+typedef struct ZbNlmeLeaveIndT {
uint64_t deviceAddr;
bool rejoin;
/* Exegin extension */
@@ -574,7 +583,7 @@ typedef struct {
} ZbNlmeLeaveIndT;
/* NLME-START-ROUTER.request */
-typedef struct {
+typedef struct ZbNlmeStartRouterReqT {
uint8_t beaconOrder;
uint8_t superframeOrder;
uint8_t battLifeExtension;
@@ -582,25 +591,25 @@ typedef struct {
} ZbNlmeStartRouterReqT;
/* NLME-START-ROUTER.confirm */
-typedef struct {
+typedef struct ZbNlmeStartRouterConfT {
enum ZbStatusCodeT status;
} ZbNlmeStartRouterConfT;
/* NLME-ED-SCAN.request */
-typedef struct {
+typedef struct ZbNlmeEdScanReqT {
uint32_t channelMask; /* Channel Page Structure [PAGE|MASK] */
uint8_t scanDuration;
} ZbNlmeEdScanReqT;
/* NLME-ED-SCAN.confirm */
-typedef struct {
+typedef struct ZbNlmeEdScanConfT {
uint32_t unscannedChannels;
uint8_t energyDetectList[WPAN_PAGE_CHANNELS_MAX];
enum ZbStatusCodeT status;
} ZbNlmeEdScanConfT;
/* NLME-ROUTE-DISCOVERY.request */
-typedef struct {
+typedef struct ZbNlmeRouteDiscReqT {
enum ZbNwkAddrModeT dstAddrMode;
uint16_t dstAddr;
uint8_t radius;
@@ -608,18 +617,18 @@ typedef struct {
} ZbNlmeRouteDiscReqT;
/* NLME-ROUTE-DISCOVERY.confirm */
-typedef struct {
+typedef struct ZbNlmeRouteDiscConfT {
enum ZbStatusCodeT status;
} ZbNlmeRouteDiscConfT;
/* NLME-NETWORK-STATUS.indication */
-typedef struct {
+typedef struct ZbNlmeNetworkStatusIndT {
uint16_t shortAddr;
enum ZbNwkNetworkStatusCodeT status;
} ZbNlmeNetworkStatusIndT;
/* NLME-SET-INTERFACE.request */
-typedef struct {
+typedef struct ZbNlmeSetInterfaceReqT {
uint8_t ifcIndex;
uint8_t state;
uint32_t channelInUse;
@@ -627,16 +636,16 @@ typedef struct {
bool routersAllowed;
} ZbNlmeSetInterfaceReqT;
-typedef struct {
+typedef struct ZbNlmeSetInterfaceConfT {
enum ZbStatusCodeT status;
} ZbNlmeSetInterfaceConfT;
/* NLME-GET-INTERFACE.request */
-typedef struct {
+typedef struct ZbNlmeGetInterfaceReqT {
uint8_t ifcIndex;
} ZbNlmeGetInterfaceReqT;
-typedef struct {
+typedef struct ZbNlmeGetInterfaceConfT {
enum ZbStatusCodeT status;
uint8_t ifcIndex;
uint8_t state;
@@ -649,7 +658,7 @@ typedef struct {
} ZbNlmeGetInterfaceConfT;
/* Broadcast transaction table entry */
-typedef struct {
+typedef struct ZbNwkBttEntryT {
uint16_t srcAddr;
uint8_t seqnum;
/* EXEGIN - replace pAckCount with a list of router neighbors */
@@ -657,31 +666,42 @@ typedef struct {
ZbUptimeT expireTime; /* expiration time relative to ZbUptime. */
} ZbNwkBttEntryT;
+/* Commissioning API (so we don't have to expose the wpan_set_xxx() API */
+struct ZbNwkCommissioningInfo {
+ uint8_t ifc_index;
+ uint16_t nwk_addr;
+ uint16_t pan_id;
+ uint8_t rx_on;
+ uint8_t page;
+ uint8_t channel;
+};
+
+/* ifcIndex should be 0. */
+bool ZbNwkCommissioningConfig(struct ZigBeeT *zb, struct ZbNwkCommissioningInfo *commission_info);
+
/* NLME-GET.request */
-void ZbNlmeGetReq(struct ZigBeeT *zb, ZbNlmeGetReqT *getReqPtr, ZbNlmeGetConfT *getConfPtr);
+void ZbNlmeGetReq(struct ZigBeeT *zb, struct ZbNlmeGetReqT *getReqPtr, struct ZbNlmeGetConfT *getConfPtr);
/* NLME-SET.request */
-void ZbNlmeSetReq(struct ZigBeeT *zb, ZbNlmeSetReqT *setReqPtr, ZbNlmeSetConfT *setConfPtr);
+void ZbNlmeSetReq(struct ZigBeeT *zb, struct ZbNlmeSetReqT *setReqPtr, struct ZbNlmeSetConfT *setConfPtr);
/* NLME-RESET.request */
-void ZbNlmeResetReq(struct ZigBeeT *zb, ZbNlmeResetReqT *resetReqPtr, ZbNlmeResetConfT *resetConfPtr);
+void ZbNlmeResetReq(struct ZigBeeT *zb, struct ZbNlmeResetReqT *resetReqPtr, struct ZbNlmeResetConfT *resetConfPtr);
/* NLME-SYNC.request */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeSyncReq(struct ZigBeeT *zb, ZbNlmeSyncReqT *syncReqPtr,
- void (*callback)(ZbNlmeSyncConfT *syncConfPtr, void *arg), void *arg);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeSyncReq(struct ZigBeeT *zb, struct ZbNlmeSyncReqT *syncReqPtr,
+ void (*callback)(struct ZbNlmeSyncConfT *syncConfPtr, void *arg), void *arg);
/* NLME-NETWORK-DISCOVERY.request */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeNetDiscReq(struct ZigBeeT *zb, ZbNlmeNetDiscReqT *req,
- void (*callback)(ZbNlmeNetDiscConfT *conf, void *cbarg), void *cbarg);
-void ZbNlmeNetDiscWait(struct ZigBeeT *zb, ZbNlmeNetDiscReqT *req, ZbNlmeNetDiscConfT *conf);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeNetDiscReq(struct ZigBeeT *zb, struct ZbNlmeNetDiscReqT *req,
+ void (*callback)(struct ZbNlmeNetDiscConfT *conf, void *cbarg), void *cbarg);
/* NLME-NETWORK-FORMATION.request */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeNetFormReq(struct ZigBeeT *zb, ZbNlmeNetFormReqT *req,
- void (*callback)(ZbNlmeNetFormConfT *formConf, void *arg), void *cbarg);
-void ZbNlmeNetFormWait(struct ZigBeeT *zb, ZbNlmeNetFormReqT *req, ZbNlmeNetFormConfT *conf);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeNetFormReq(struct ZigBeeT *zb, struct ZbNlmeNetFormReqT *req,
+ void (*callback)(struct ZbNlmeNetFormConfT *formConf, void *arg), void *cbarg);
/* NLME-PERMIT-JOIN.request */
-void ZbNlmePermitJoinReq(struct ZigBeeT *zb, ZbNlmePermitJoinReqT *permitReq, ZbNlmePermitJoinConfT *permitConf);
+void ZbNlmePermitJoinReq(struct ZigBeeT *zb, struct ZbNlmePermitJoinReqT *permitReq, struct ZbNlmePermitJoinConfT *permitConf);
/* Exegin Custom API to manage the IEEE Joining List in the NWK layer.
* Let the NWK layer manage configuring the individual MACs. */
@@ -694,38 +714,32 @@ bool ZbNlmeIeeeJoiningListRemove(struct ZigBeeT *zb, uint64_t extAddr);
bool ZbNwkIeeeJoiningListEnabled(struct ZigBeeT *zb);
/* NLME-JOIN.request */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeJoinReq(struct ZigBeeT *zb, ZbNlmeJoinReqT *joinReqPtr,
- void (*callback)(ZbNlmeJoinConfT *joinConf, void *arg), void *cbarg);
-void ZbNlmeJoinWait(struct ZigBeeT *zb, ZbNlmeJoinReqT *req, ZbNlmeJoinConfT *conf);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeJoinReq(struct ZigBeeT *zb, struct ZbNlmeJoinReqT *joinReqPtr,
+ void (*callback)(struct ZbNlmeJoinConfT *joinConf, void *arg), void *cbarg);
/* NLME-DIRECT-JOIN.request */
-void ZbNlmeDirectJoinReq(struct ZigBeeT *zb, ZbNlmeDirectJoinReqT *directJoinReqPtr, ZbNlmeDirectJoinConfT
+void ZbNlmeDirectJoinReq(struct ZigBeeT *zb, struct ZbNlmeDirectJoinReqT *directJoinReqPtr, struct ZbNlmeDirectJoinConfT
*directJoinConfPtr);
/* NLME-START-ROUTER.request */
-void ZbNlmeStartRouterReq(struct ZigBeeT *zb, ZbNlmeStartRouterReqT *req, ZbNlmeStartRouterConfT *conf);
+void ZbNlmeStartRouterReq(struct ZigBeeT *zb, struct ZbNlmeStartRouterReqT *req, struct ZbNlmeStartRouterConfT *conf);
/* NLME-ED-SCAN.request */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeEdScanReq(struct ZigBeeT *zb, ZbNlmeEdScanReqT *req,
- void (*callback)(ZbNlmeEdScanConfT *scanConf, void *arg), void *cbarg);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeEdScanReq(struct ZigBeeT *zb, struct ZbNlmeEdScanReqT *req,
+ void (*callback)(struct ZbNlmeEdScanConfT *scanConf, void *arg), void *cbarg);
-/* NLME-LEAVE.request.
- * If the local device is being requested to leave, it may take some time
- * (hundreds of mS) to send the appropriate commands and reset the stack
- * before the callback is eventually called, or ZbNlmeLeaveWait returns. */
+/* NLME-LEAVE.request. */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeLeaveReq(struct ZigBeeT *zb, struct ZbNlmeLeaveReqT *leaveReqPtr,
void (*callback)(struct ZbNlmeLeaveConfT *leaveConfPtr, void *arg), void *cbarg);
-void ZbNlmeLeaveWait(struct ZigBeeT *zb, struct ZbNlmeLeaveReqT *leaveReqPtr, struct ZbNlmeLeaveConfT *leaveConfPtr);
/* NLME-ROUTE-DISCOVERY.request */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeRouteDiscReq(struct ZigBeeT *zb, ZbNlmeRouteDiscReqT *routeDiscReqPtr,
- void (*callback)(ZbNlmeRouteDiscConfT *discConf, void *cbarg), void *arg);
-void ZbNlmeRouteDiscWait(struct ZigBeeT *zb, ZbNlmeRouteDiscReqT *req, ZbNlmeRouteDiscConfT *conf);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbNlmeRouteDiscReq(struct ZigBeeT *zb, struct ZbNlmeRouteDiscReqT *routeDiscReqPtr,
+ void (*callback)(struct ZbNlmeRouteDiscConfT *discConf, void *cbarg), void *arg);
/* NLME-SET-INTERFACE.request */
-void ZbNlmeSetInterface(struct ZigBeeT *zb, ZbNlmeSetInterfaceReqT *req, ZbNlmeSetInterfaceConfT *conf);
+void ZbNlmeSetInterface(struct ZigBeeT *zb, struct ZbNlmeSetInterfaceReqT *req, struct ZbNlmeSetInterfaceConfT *conf);
/* NLME-GET-INTERFACE.request */
-void ZbNlmeGetInterface(struct ZigBeeT *zb, ZbNlmeGetInterfaceReqT *req, ZbNlmeGetInterfaceConfT *conf);
+void ZbNlmeGetInterface(struct ZigBeeT *zb, struct ZbNlmeGetInterfaceReqT *req, struct ZbNlmeGetInterfaceConfT *conf);
/* Helper to enable/disable interface */
bool ZbNwkIfToggleByName(struct ZigBeeT *zb, const char *name, bool enable);
@@ -733,8 +747,6 @@ bool ZbNwkIfToggleByName(struct ZigBeeT *zb, const char *name, bool enable);
bool ZbNwkIfSetTxPower(struct ZigBeeT *zb, const char *name, int8_t tx_power);
bool ZbNwkIfGetTxPower(struct ZigBeeT *zb, const char *name, int8_t *tx_power);
-bool ZbNwkIfSetDsn(struct ZigBeeT *zb, const char *name, uint8_t macDsn);
-
/* ZbNwkToggleDutyCycle - Enable or disable Duty Cycle management in the MAC.
* Disabling duty cycle will also clear the duty cycle history and set the status to
* MCP_DUTYCYCLE_STATUS_NORMAL.
@@ -764,8 +776,6 @@ enum ZbStatusCodeT ZbNwkSetIndex(struct ZigBeeT *zb, enum ZbNwkNibAttrIdT attrId
* NIB Attribute Helper Functions
*---------------------------------------------------------------
*/
-bool ZbNwkAddrIsChildNwk(struct ZigBeeT *zb, uint16_t nwkAddr, uint64_t *extAddrPtr);
-bool ZbNwkAddrIsChildExt(struct ZigBeeT *zb, uint64_t extAddr, uint16_t *nwkAddrPtr);
unsigned int ZbNwkAddrMapFreeSpace(struct ZigBeeT *zb);
bool ZbNwkAddrStoreMap(struct ZigBeeT *zb, uint16_t nwkAddr, uint64_t extAddr, bool resolve_conflict);
void ZbNwkAddrClearMap(struct ZigBeeT *zb, bool isShortAddr, uint64_t addr);
@@ -777,9 +787,9 @@ uint16_t ZbNwkAddrLookupNwk(struct ZigBeeT *zb, uint64_t extAddr);
* if known, otherwise returns 0. */
uint64_t ZbNwkAddrLookupExt(struct ZigBeeT *zb, uint16_t nwkAddr);
-bool ZbNwkGetSecMaterial(struct ZigBeeT *zb, uint8_t keySeqno, ZbNwkSecMaterialT *material);
+bool ZbNwkGetSecMaterial(struct ZigBeeT *zb, uint8_t keySeqno, struct ZbNwkSecMaterialT *material);
bool ZbNwkSetFrameCounter(struct ZigBeeT *zb, uint8_t keySeqno, uint64_t srcAddr, uint32_t newFrameCount);
-bool ZbNwkGetActiveKey(struct ZigBeeT *zb, ZbNwkSecMaterialT *active_key);
+bool ZbNwkGetActiveKey(struct ZigBeeT *zb, struct ZbNwkSecMaterialT *active_key);
bool ZbNwkClearActiveKey(struct ZigBeeT *zb);
/*---------------------------------------------------------------
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.security.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.security.h
index 4f746c5dc..d8a433ac8 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.security.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.security.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_SECURITY_H
#define ZIGBEE_SECURITY_H
@@ -24,26 +24,6 @@ struct ZigBeeT;
#define ZB_SEC_KEYSTR_SIZE ((ZB_SEC_KEYSIZE * 2U) + ZB_SEC_KEYSIZE /* separators */ + 1U /* NULL */)
/*---------------------------------------------------------------
- * Security Keys
- *---------------------------------------------------------------
- */
-/* Null (all zeroes)
- * 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 */
-extern const uint8_t sec_key_null[ZB_SEC_KEYSIZE];
-
-/* "ZigBeeAlliance09"
- * 5a:69:67:42:65:65:41:6c:6c:69:61:6e:63:65:30:39 */
-extern const uint8_t sec_key_ha[ZB_SEC_KEYSIZE];
-
-/* Uncertified Device's Distributed Link Key
- * d0:d1:d2:d3:d4:d5:d6:d7:d8:d9:da:db:dc:dd:dedf */
-extern const uint8_t sec_key_distrib_uncert[ZB_SEC_KEYSIZE];
-
-/* TOUCHLINK_KEY_INDEX_CERTIFICATION key
- * c0:c1:c2:c3:c4:c5:c6:c7 0xc8:c9:ca:cb:cc:cd:ce:cf */
-extern const uint8_t sec_key_touchlink_cert[ZB_SEC_KEYSIZE];
-
-/*---------------------------------------------------------------
* Security Level
*---------------------------------------------------------------
*/
@@ -121,7 +101,7 @@ enum ZbSecHdrKeyIdT {
/* Frame Counter Resets are controlled much like a lollipop counter, and require
* the 'new' value to be near zero to guard against replay attacks. */
-#define ZB_FRAME_COUNTER_RESET_MAX 256U
+#define ZB_FRAME_COUNTER_RESET_MAX 256U
/* Key Type Enumerations (Primitives and over-the-air). */
enum ZbSecKeyTypeT {
@@ -259,9 +239,17 @@ void ZbSecMakeNonce(uint8_t *nonce, uint64_t extAddr, uint32_t frameCounter, uin
* Security Transformations
*---------------------------------------------------------------
*/
-void ZbAesMmoHash(uint8_t const *data, const unsigned int length, uint8_t *hash);
+bool ZbAesMmoHash(struct ZigBeeT *zb, uint8_t const *data, const unsigned int length, uint8_t *digest);
void ZbSecKeyTransform(uint8_t *key, uint8_t input, uint8_t *keyOut);
+/* Add a device-key-pair */
+uint8_t ZbSecAddDeviceLinkKeyByKey(struct ZigBeeT *zb, uint64_t extAddr, uint8_t *key);
+uint8_t ZbSecAddDeviceLinkKeyByKeyStr(struct ZigBeeT *zb, uint64_t extAddr, char *str);
+
+/*---------------------------------------------------------------
+ * Extras: Install Code Helpers (Optional, may not be included in all builds)
+ *---------------------------------------------------------------
+ */
/* Produces an install code with CRC. */
bool ZbSecInstallCodeCreate(struct ZigBeeT *zb, const void *inputCode, void *outputCode, unsigned int codeLen);
@@ -272,10 +260,6 @@ bool ZbSecInstallCodeCheck(const void *installCode, unsigned int codeLen, void *
/* Computes the 2-byte CRC of the input Install Code */
void ZbSecInstallCodeCrc(const uint8_t *ic_in, uint8_t ic_len, uint8_t *crc_out);
-/* Add a device-key-pair */
-uint8_t ZbSecAddDeviceLinkKeyByKey(struct ZigBeeT *zb, uint64_t extAddr, uint8_t *key);
-uint8_t ZbSecAddDeviceLinkKeyByKeyStr(struct ZigBeeT *zb, uint64_t extAddr, char *str);
-
/* Add a device-key-pair using an Install Code (includes trailing 2-octet CRC). */
uint8_t ZbSecAddDeviceLinkKeyByInstallCode(struct ZigBeeT *zb, uint64_t extAddr, uint8_t *ic, unsigned int len);
@@ -288,6 +272,21 @@ enum ZbSecEcdsaSigType {
ZB_SEC_ECDSA_SIG_SUITE_2
};
+#define ZB_SEC_CRYPTO_SUITE_V2_CERT_LEN 74U
+#define ZB_SEC_CRYPTO_SUITE_V2_SIG_LEN 80U /* IEEE[8] r[36] s[36] */
+
+/**
+ * Description
+ * @param zb
+ * @param sig_type
+ * @param ca_pub_key_array
+ * @param ca_pub_key_len
+ * @param certificate Length must be ZB_SEC_CRYPTO_SUITE_V2_CERT_LEN (74 bytes)
+ * @param signature Length must be ZB_SEC_CRYPTO_SUITE_V2_SIG_LEN (80 bytes)
+ * @param image_digest Length is AES_BLOCK_SIZE (16 bytes)
+ * @param cert_digest Length is AES_BLOCK_SIZE (16 bytes)
+ * @return
+ */
enum ZbStatusCodeT ZbSecEcdsaValidate(struct ZigBeeT *zb, enum ZbSecEcdsaSigType sig_type,
const uint8_t *ca_pub_key_array, unsigned int ca_pub_key_len,
const uint8_t *certificate, const uint8_t *signature,
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.startup.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.startup.h
index 25d38c990..a4674f15d 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.startup.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.startup.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_STARTUP_H
# define ZIGBEE_STARTUP_H
@@ -123,9 +123,6 @@ struct ZbStartupT {
/* Non-blocking startup function */
enum ZbStatusCodeT ZB_WARN_UNUSED ZbStartup(struct ZigBeeT *zb, struct ZbStartupT *configPtr, void (*callback)(enum ZbStatusCodeT status, void *cb_arg), void *arg);
-/* Blocking version of ZbStartup. Not supported on all platforms. */
-enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
-
/* If Touchlink Target was started with ZbStartup, this API can be used to stop it. */
enum ZbStatusCodeT ZbStartupTouchlinkTargetStop(struct ZigBeeT *zb);
@@ -144,10 +141,7 @@ enum ZbStatusCodeT ZB_WARN_UNUSED ZbStartupFindBindStartEndpoint(struct ZigBeeT
*
* Must already be connected to a network. If not on a network and want to
* rejoin as way to connect, use ZbStartup with ZbStartTypeRejoin.*/
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbStartupRejoin(struct ZigBeeT *zb, void (*callback)(ZbNlmeJoinConfT *conf, void *arg), void *cbarg);
-
-/* Blocking version. Not supported on all platforms. */
-enum ZbStatusCodeT ZbStartupRejoinWait(struct ZigBeeT *zb);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbStartupRejoin(struct ZigBeeT *zb, void (*callback)(struct ZbNlmeJoinConfT *conf, void *arg), void *cbarg);
/* Trust Center Rejoin - unsecured rejoin (already joined to network, but
* missed a NWK key update). */
@@ -165,6 +159,6 @@ void ZbStartupConfigGetProSeDefaults(struct ZbStartupT *configPtr);
* Trust Center. The Trust Center Swap Out process will be performed.
* The callback status is set to ZB_STATUS_SUCCESS if the stack is operational. */
bool ZB_WARN_UNUSED ZbStartupTcsoStart(struct ZigBeeT *zb, void (*callback)(enum ZbTcsoStatusT status, void *arg), void *arg);
-void ZbStartupTcsoAbort(struct ZigBeeT *zb);
+bool ZbStartupTcsoAbort(struct ZigBeeT *zb);
#endif /* ZIGBEE_STARTUP_H */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zdo.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zdo.h
index 0a5360666..8a079b149 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zdo.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zdo.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_ZDO_H
# define ZIGBEE_ZDO_H
@@ -72,7 +72,7 @@ enum ZbZdoAddrReqTypeT {
#define ZB_ZDP_POWER_LEVEL_66 (uint8_t)0x08U
#define ZB_ZDP_POWER_LEVEL_100 (uint8_t)0x0cU
-/* ZbNodeDescriptorT Mask Flag - Section 2.3.2.3 */
+/* struct ZbNodeDescriptorT Mask Flag - Section 2.3.2.3 */
#define ZB_ZDP_NODE_OPT_MASK_TYPE (uint16_t)0x0007U
#define ZB_ZDP_NODE_OPT_MASK_COMPLEX (uint16_t)0x0008U
#define ZB_ZDP_NODE_OPT_MASK_USER (uint16_t)0x0010U
@@ -98,7 +98,7 @@ enum ZbZdoAddrReqTypeT {
#define ZB_ZDP_NODE_OPT_FREQBAND_EU_FSK_SUBGHZ 0x10U /* 868 MHz and 915 MHz */
#define ZB_ZDP_NODE_OPT_BAND(_freqband_) (((uint16_t)_freqband_) << ZB_ZDP_NODE_OPT_OFFSET_FREQBAND)
-/* ZbPowerDescriptorT Mask Flag - Section 2.3.2.4 */
+/* struct ZbPowerDescriptorT Mask Flag - Section 2.3.2.4 */
#define ZB_ZDP_POWER_MASK_MODE 0x000fU
#define ZB_ZDP_POWER_MASK_AVAILABLE 0x00f0U
#define ZB_ZDP_POWER_MASK_SOURCE 0x0f00U
@@ -219,7 +219,7 @@ enum ZbZdoAddrReqTypeT {
#define ZB_ZDO_MGMT_UNSOLICITED_UPDATE_NOTIFY 0x003bU
/* ZigBee Node Descriptor - Section 2.3.2.3 */
-typedef struct {
+typedef struct ZbNodeDescriptorT {
uint8_t logicalType;
uint8_t complexDesc;
uint8_t userDesc;
@@ -235,7 +235,7 @@ typedef struct {
} ZbNodeDescriptorT;
/* ZigBee Power Descriptor - Section 2.3.2.4. */
-typedef struct {
+typedef struct ZbPowerDescriptorT {
uint8_t currentMode;
uint8_t availableSources;
uint8_t currentSource;
@@ -243,7 +243,7 @@ typedef struct {
} ZbPowerDescriptorT;
/* ZigBee Simple (Application) Descriptor. */
-typedef struct {
+typedef struct ZbSimpleDescriptorT {
uint8_t endpoint;
uint16_t profileId;
uint16_t deviceId;
@@ -255,7 +255,7 @@ typedef struct {
} ZbSimpleDescriptorT;
/* Network Descriptor */
-typedef struct {
+typedef struct ZbZdoNetworkDescT {
uint64_t epid;
uint8_t logicalChannel;
uint8_t version;
@@ -266,7 +266,7 @@ typedef struct {
} ZbZdoNetworkDescT;
/* Neighbor Descriptor */
-typedef struct {
+typedef struct ZbZdoNeighborDescT {
uint64_t epid;
uint64_t extAddr;
uint16_t nwkAddr;
@@ -279,7 +279,7 @@ typedef struct {
} ZbZdoNeighborDescT;
/* Routing Descriptor */
-typedef struct {
+typedef struct ZbZdoRoutingDescT {
uint16_t destAddr;
uint8_t status; /* EXEGIN - convert to an enum type? */
uint8_t constrained;
@@ -289,7 +289,7 @@ typedef struct {
} ZbZdoRoutingDescT;
/* Binding Descriptor */
-typedef struct {
+typedef struct ZbZdoBindingDescT {
uint64_t srcAddr;
uint8_t srcEndpt;
uint16_t clusterId;
@@ -298,18 +298,12 @@ typedef struct {
struct ZbApsAddrT dst;
} ZbZdoBindingDescT;
-/* Child Descriptor */
-typedef struct {
- uint64_t extAddr;
- uint32_t age;
-} ZbZdoChildDescT;
-
/*---------------------------------------------------------------
* ZDP Discovery Requests
*---------------------------------------------------------------
*/
/* NWK_addr_req */
-typedef struct {
+typedef struct ZbZdoNwkAddrReqT {
uint16_t dstNwkAddr; /* typically set to ZB_NWK_ADDR_BCAST_RXON (0xfffd) */
uint64_t extAddr;
enum ZbZdoAddrReqTypeT reqType;
@@ -317,7 +311,7 @@ typedef struct {
} ZbZdoNwkAddrReqT;
/* NWK_addr_rsp */
-typedef struct {
+typedef struct ZbZdoNwkAddrRspT {
enum ZbStatusCodeT status;
uint64_t extAddr;
uint16_t nwkAddr;
@@ -327,74 +321,78 @@ typedef struct {
} ZbZdoNwkAddrRspT;
/* IEEE_addr_req */
-typedef struct {
+typedef struct ZbZdoIeeeAddrReqT {
uint16_t dstNwkAddr;
uint16_t nwkAddrOfInterest;
enum ZbZdoAddrReqTypeT reqType;
uint8_t startIndex;
} ZbZdoIeeeAddrReqT;
-/*
- * IEEE_addr_rsp - just so happens to have the exact same format as
- * the network address response.
- */
-typedef ZbZdoNwkAddrRspT ZbZdoIeeeAddrRspT;
+/* IEEE_addr_rsp */
+typedef struct ZbZdoIeeeAddrRspT {
+ enum ZbStatusCodeT status;
+ uint64_t extAddr;
+ uint16_t nwkAddr;
+ uint8_t deviceCount;
+ uint8_t startIndex;
+ uint16_t deviceList[ZB_ZDO_ADDRRSP_DEVLIST_MAX];
+} ZbZdoIeeeAddrRspT;
/* Node_Desc_req */
-typedef struct {
+typedef struct ZbZdoNodeDescReqT {
uint16_t dstNwkAddr;
uint16_t nwkAddrOfInterest;
} ZbZdoNodeDescReqT;
/* Node_Desc_rsp */
-typedef struct {
+typedef struct ZbZdoNodeDescRspT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
- ZbNodeDescriptorT nodeDesc;
+ struct ZbNodeDescriptorT nodeDesc;
} ZbZdoNodeDescRspT;
/* Power_Desc_req */
-typedef struct {
+typedef struct ZbZdoPowerDescReqT {
uint16_t dstNwkAddr;
uint16_t nwkAddrOfInterest;
} ZbZdoPowerDescReqT;
/* Power_Desc_rsp */
-typedef struct {
+typedef struct ZbZdoPowerDescRspT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
- ZbPowerDescriptorT powerDesc;
+ struct ZbPowerDescriptorT powerDesc;
} ZbZdoPowerDescRspT;
/* Simple_Desc_req */
-typedef struct {
+typedef struct ZbZdoSimpleDescReqT {
uint16_t dstNwkAddr;
uint16_t nwkAddrOfInterest;
uint8_t endpt;
} ZbZdoSimpleDescReqT;
/* Simple_Desc_rsp */
-typedef struct {
+typedef struct ZbZdoSimpleDescRspT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
- ZbSimpleDescriptorT simpleDesc;
+ struct ZbSimpleDescriptorT simpleDesc;
} ZbZdoSimpleDescRspT;
/* Discovery_Cache_rsp */
-typedef struct {
+typedef struct ZbZdoDiscCacheRspT {
enum ZbStatusCodeT status;
/* Added by Exegin */
uint16_t nwkAddr;
} ZbZdoDiscCacheRspT;
/* Active_EP_req */
-typedef struct {
+typedef struct ZbZdoActiveEpReqT {
uint16_t dstNwkAddr;
uint16_t nwkAddrOfInterest;
} ZbZdoActiveEpReqT;
/* Active_EP_rsp */
-typedef struct {
+typedef struct ZbZdoActiveEpRspT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
uint8_t activeEpCount;
@@ -402,7 +400,7 @@ typedef struct {
} ZbZdoActiveEpRspT;
/* Match_Desc_req */
-typedef struct {
+typedef struct ZbZdoMatchDescReqT {
uint16_t dstNwkAddr;
uint16_t nwkAddrOfInterest;
uint16_t profileId;
@@ -413,7 +411,7 @@ typedef struct {
} ZbZdoMatchDescReqT;
/* Match_Desc_rsp */
-typedef struct {
+typedef struct ZbZdoMatchDescRspT {
enum ZbStatusCodeT status;
uint16_t nwkAddr;
uint8_t matchLength;
@@ -421,14 +419,14 @@ typedef struct {
} ZbZdoMatchDescRspT;
/* Device_annce (ZB_ZDO_DEVICE_ANNCE) */
-typedef struct {
+typedef struct ZbZdoDeviceAnnceT {
uint16_t nwkAddr;
uint64_t extAddr;
uint8_t capability;
} ZbZdoDeviceAnnceT;
/* Bind_req */
-typedef struct {
+typedef struct ZbZdoBindReqT {
/* Destination for the ZDO Bind Request message */
uint16_t target;
/* Binding Source */
@@ -443,71 +441,71 @@ typedef struct {
} ZbZdoBindReqT;
/* Bind_rsp */
-typedef struct {
+typedef struct ZbZdoBindRspT {
enum ZbStatusCodeT status;
} ZbZdoBindRspT;
/* Mgmt_Lqi_req */
-typedef struct {
+typedef struct ZbZdoLqiReqT {
uint16_t destAddr;
uint8_t startIndex;
} ZbZdoLqiReqT;
/* Mgmt_Lqi_rsp */
-typedef struct {
+typedef struct ZbZdoLqiRspT {
enum ZbStatusCodeT status;
uint16_t respAddr;
uint8_t neighborTblSz;
uint8_t startIndex;
uint8_t neighborListSz;
- ZbZdoNeighborDescT neighborList[ZB_ZDO_NEIGHBOR_LIST_MAX_SZ];
+ struct ZbZdoNeighborDescT neighborList[ZB_ZDO_NEIGHBOR_LIST_MAX_SZ];
} ZbZdoLqiRspT;
/* Mgmt_Rtg_req */
-typedef struct {
+typedef struct ZbZdoRtgReqT {
uint16_t destAddr;
uint8_t startIndex;
} ZbZdoRtgReqT;
/* Mgmt_Rtg_rsp */
-typedef struct {
+typedef struct ZbZdoRtgRspT {
enum ZbStatusCodeT status;
uint16_t respAddr;
uint8_t routeTblSz;
uint8_t startIndex;
uint8_t routeListSz;
- ZbZdoRoutingDescT routeList[ZB_ZDO_ROUTE_LIST_MAX_SZ];
+ struct ZbZdoRoutingDescT routeList[ZB_ZDO_ROUTE_LIST_MAX_SZ];
} ZbZdoRtgRspT;
/* Mgmt_Bind_req */
-typedef struct {
+typedef struct ZbZdoMgmtBindReqT {
uint16_t destAddr;
uint8_t startIndex;
} ZbZdoMgmtBindReqT;
/* Mgmt_Bind_rsp */
-typedef struct {
+typedef struct ZbZdoMgmtBindRspT {
enum ZbStatusCodeT status;
uint8_t bindTblSz; /* Total number */
uint8_t startIndex; /* Starting index being reported here */
uint8_t bindListSz; /* Number reported here */
- ZbZdoBindingDescT bindList[ZB_ZDO_BIND_LIST_MAX_SZ];
+ struct ZbZdoBindingDescT bindList[ZB_ZDO_BIND_LIST_MAX_SZ];
} ZbZdoMgmtBindRspT;
/* Mgmt_Permit_Join_req */
-typedef struct {
+typedef struct ZbZdoPermitJoinReqT {
uint16_t destAddr;
uint8_t duration;
uint8_t tcSignificance;
} ZbZdoPermitJoinReqT;
/* Mgmt_Permit_Join_rsp */
-typedef struct {
+typedef struct ZbZdoPermitJoinRspT {
enum ZbStatusCodeT status;
} ZbZdoPermitJoinRspT;
/* Mgmt_Nwk_Update_req */
-typedef struct {
+typedef struct ZbZdoNwkUpdateReqT {
uint16_t destAddr;
uint32_t channelMask;
uint8_t scanDuration; /* or ZB_ZDP_NWK_UPDATE_CHANNEL_SWITCH, or ZB_ZDP_NWK_UPDATE_MANAGER_PARAMETERS */
@@ -527,7 +525,7 @@ struct ZbZdoNwkEnhUpdateReqT {
};
/* Mgmt_Nwk_Update_notify */
-typedef struct {
+typedef struct ZbZdoNwkUpdateNotifyT {
enum ZbStatusCodeT status;
uint32_t scannedChannels;
uint16_t txTotal;
@@ -540,14 +538,14 @@ typedef struct {
#define ZB_ZDO_MGMT_NWK_LEAVE_FLAG_REMOVE_CHILDREN 0x40U
/* Mgmt_Nwk_Leave_req */
-typedef struct {
+typedef struct ZbZdoLeaveReqT {
uint16_t destAddr;
uint64_t deviceAddr;
uint8_t flags;
} ZbZdoLeaveReqT;
/* Mgmt_Nwk_Leave_rsp */
-typedef struct {
+typedef struct ZbZdoLeaveRspT {
enum ZbStatusCodeT status;
} ZbZdoLeaveRspT;
@@ -578,89 +576,88 @@ struct ZbZdoNwkIeeeJoinListRspT {
/* Get the next ZDO sequence number */
uint8_t ZbZdoGetNextSeqNum(struct ZigBeeT *zb);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkAddrReq(struct ZigBeeT *zb, ZbZdoNwkAddrReqT *req, void (*callback)(ZbZdoNwkAddrRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoNwkAddrWait(struct ZigBeeT *zb, ZbZdoNwkAddrReqT *req, ZbZdoNwkAddrRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkAddrReq(struct ZigBeeT *zb, struct ZbZdoNwkAddrReqT *req,
+ void (*callback)(struct ZbZdoNwkAddrRspT *rsp, void *cb_arg), void *arg);
+
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoIeeeAddrReq(struct ZigBeeT *zb, struct ZbZdoIeeeAddrReqT *req,
+ void (*callback)(struct ZbZdoIeeeAddrRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoIeeeAddrReq(struct ZigBeeT *zb, ZbZdoIeeeAddrReqT *req, void (*callback)(ZbZdoIeeeAddrRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoIeeeAddrWait(struct ZigBeeT *zb, ZbZdoIeeeAddrReqT *req, ZbZdoIeeeAddrRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNodeDescReq(struct ZigBeeT *zb, struct ZbZdoNodeDescReqT *req,
+ void (*callback)(struct ZbZdoNodeDescRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNodeDescReq(struct ZigBeeT *zb, ZbZdoNodeDescReqT *req, void (*callback)(ZbZdoNodeDescRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoNodeDescWait(struct ZigBeeT *zb, ZbZdoNodeDescReqT *req, ZbZdoNodeDescRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoPowerDescReq(struct ZigBeeT *zb, struct ZbZdoPowerDescReqT *req,
+ void (*callback)(struct ZbZdoPowerDescRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoPowerDescReq(struct ZigBeeT *zb, ZbZdoPowerDescReqT *req, void (*callback)(ZbZdoPowerDescRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoPowerDescWait(struct ZigBeeT *zb, ZbZdoPowerDescReqT *req, ZbZdoPowerDescRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoSimpleDescReq(struct ZigBeeT *zb, struct ZbZdoSimpleDescReqT *req,
+ void (*callback)(struct ZbZdoSimpleDescRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoSimpleDescReq(struct ZigBeeT *zb, ZbZdoSimpleDescReqT *req, void (*callback)(ZbZdoSimpleDescRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoSimpleDescWait(struct ZigBeeT *zb, ZbZdoSimpleDescReqT *req, ZbZdoSimpleDescRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoActiveEpReq(struct ZigBeeT *zb, struct ZbZdoActiveEpReqT *req,
+ void (*callback)(struct ZbZdoActiveEpRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoActiveEpReq(struct ZigBeeT *zb, ZbZdoActiveEpReqT *req, void (*callback)(ZbZdoActiveEpRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoActiveEpWait(struct ZigBeeT *zb, ZbZdoActiveEpReqT *req, ZbZdoActiveEpRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoMatchDescReq(struct ZigBeeT *zb, struct ZbZdoMatchDescReqT *req,
+ void (*callback)(struct ZbZdoMatchDescRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoMatchDescReq(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req, void (*callback)(ZbZdoMatchDescRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoMatchDescWait(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req, ZbZdoMatchDescRspT *rsp);
/* ZbZdoMatchDescMulti:
* Returns ZB_ZDP_STATUS_SUCCESS for received responses.
* Returns ZB_ZDP_STATUS_TABLE_FULL if there's a problem starting the request.
* Returns ZB_ZDP_STATUS_TIMEOUT when the stack decides to stop receiving responses. */
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoMatchDescMulti(struct ZigBeeT *zb, ZbZdoMatchDescReqT *req, void (*callback)(ZbZdoMatchDescRspT *rsp, void *cb_arg), void *arg);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoMatchDescMulti(struct ZigBeeT *zb, struct ZbZdoMatchDescReqT *req,
+ void (*callback)(struct ZbZdoMatchDescRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoDeviceAnnce(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *deviceAnncePtr);
-void ZbZdoDeviceAnnceAlias(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *deviceAnncePtr);
-int ZbZdoParseDeviceAnnce(ZbZdoDeviceAnnceT *structPtr, const uint8_t *buf, unsigned int len);
+void ZbZdoDeviceAnnce(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceT *deviceAnncePtr);
+void ZbZdoDeviceAnnceAlias(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceT *deviceAnncePtr);
+int ZbZdoParseDeviceAnnce(struct ZbZdoDeviceAnnceT *structPtr, const uint8_t *buf, unsigned int len);
/* API to register a filter in the ZDO for the application to
* receive Device_Annce messages. */
struct ZbZdoDeviceAnnceFilterT;
struct ZbZdoDeviceAnnceFilterT * ZbZdoDeviceAnnceFilterRegister(struct ZigBeeT *zb,
- void (*callback)(struct ZigBeeT *zb, ZbZdoDeviceAnnceT *annce, uint8_t seqno));
+ void (*callback)(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceT *annce, uint8_t seqno, void *arg), void *arg);
void ZbZdoDeviceAnnceFilterRemove(struct ZigBeeT *zb, struct ZbZdoDeviceAnnceFilterT *handler);
/*---------------------------------------------------------------
* ZDP Binding Requests
*---------------------------------------------------------------
*/
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoBindReq(struct ZigBeeT *zb, ZbZdoBindReqT *req, void (*callback)(ZbZdoBindRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoBindWait(struct ZigBeeT *zb, ZbZdoBindReqT *req, ZbZdoBindRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoBindReq(struct ZigBeeT *zb, struct ZbZdoBindReqT *req,
+ void (*callback)(struct ZbZdoBindRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoUnbindReq(struct ZigBeeT *zb, ZbZdoBindReqT *req, void (*callback)(ZbZdoBindRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoUnbindWait(struct ZigBeeT *zb, ZbZdoBindReqT *req, ZbZdoBindRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoUnbindReq(struct ZigBeeT *zb, struct ZbZdoBindReqT *req,
+ void (*callback)(struct ZbZdoBindRspT *rsp, void *cb_arg), void *arg);
/*---------------------------------------------------------------
* ZDP Management Requests
*---------------------------------------------------------------
*/
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoLqiReq(struct ZigBeeT *zb, ZbZdoLqiReqT *req, void (*callback)(ZbZdoLqiRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoLqiWait(struct ZigBeeT *zb, ZbZdoLqiReqT *req, ZbZdoLqiRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoLqiReq(struct ZigBeeT *zb, struct ZbZdoLqiReqT *req,
+ void (*callback)(struct ZbZdoLqiRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoRtgReq(struct ZigBeeT *zb, ZbZdoRtgReqT *req, void (*callback)(ZbZdoRtgRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoRtgWait(struct ZigBeeT *zb, ZbZdoRtgReqT *req, ZbZdoRtgRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoRtgReq(struct ZigBeeT *zb, struct ZbZdoRtgReqT *req,
+ void (*callback)(struct ZbZdoRtgRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoMgmtBindReq(struct ZigBeeT *zb, ZbZdoMgmtBindReqT *req, void (*callback)(ZbZdoMgmtBindRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoMgmtBindWait(struct ZigBeeT *zb, ZbZdoMgmtBindReqT *req, ZbZdoMgmtBindRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoMgmtBindReq(struct ZigBeeT *zb, struct ZbZdoMgmtBindReqT *req,
+ void (*callback)(struct ZbZdoMgmtBindRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoPermitJoinReq(struct ZigBeeT *zb, ZbZdoPermitJoinReqT *req,
- void (*callback)(ZbZdoPermitJoinRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoPermitJoinWait(struct ZigBeeT *zb, ZbZdoPermitJoinReqT *req, ZbZdoPermitJoinRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoPermitJoinReq(struct ZigBeeT *zb, struct ZbZdoPermitJoinReqT *req,
+ void (*callback)(struct ZbZdoPermitJoinRspT *rsp, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkUpdateReq(struct ZigBeeT *zb, ZbZdoNwkUpdateReqT *req,
- void (*callback)(ZbZdoNwkUpdateNotifyT *reqPtr, void *cb_arg), void *arg);
-void ZbZdoNwkUpdateWait(struct ZigBeeT *zb, ZbZdoNwkUpdateReqT *req, ZbZdoNwkUpdateNotifyT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkUpdateReq(struct ZigBeeT *zb, struct ZbZdoNwkUpdateReqT *req,
+ void (*callback)(struct ZbZdoNwkUpdateNotifyT *reqPtr, void *cb_arg), void *arg);
enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkEnhUpdateReq(struct ZigBeeT *zb, struct ZbZdoNwkEnhUpdateReqT *req,
- void (*callback)(ZbZdoNwkUpdateNotifyT *reqPtr, void *cb_arg), void *arg);
+ void (*callback)(struct ZbZdoNwkUpdateNotifyT *reqPtr, void *cb_arg), void *arg);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkUpdateNotify(struct ZigBeeT *zb, ZbZdoNwkUpdateNotifyT *reqPtr);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoNwkUpdateNotify(struct ZigBeeT *zb, struct ZbZdoNwkUpdateNotifyT *reqPtr);
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoLeaveReq(struct ZigBeeT *zb, ZbZdoLeaveReqT *req,
- void (*callback)(ZbZdoLeaveRspT *rsp, void *cb_arg), void *arg);
-void ZbZdoLeaveWait(struct ZigBeeT *zb, ZbZdoLeaveReqT *req, ZbZdoLeaveRspT *rsp);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoLeaveReq(struct ZigBeeT *zb, struct ZbZdoLeaveReqT *req,
+ void (*callback)(struct ZbZdoLeaveRspT *rsp, void *cb_arg), void *arg);
/*---------------------------------------------------------------
* Receive incoming ZDO messages
*---------------------------------------------------------------
*/
/* Configures the callback to receive incoming ZDO messages in your application. */
-typedef int (*ZbZdoPreHandlerFuncT)(struct ZigBeeT *zb, ZbApsdeDataIndT *dataIndPtr, uint8_t seqnum);
+typedef int (*ZbZdoPreHandlerFuncT)(struct ZigBeeT *zb, struct ZbApsdeDataIndT *dataIndPtr, uint8_t seqnum);
void ZbZdoSetPreHandler(struct ZigBeeT *zb, ZbZdoPreHandlerFuncT func);
/*---------------------------------------------------------------
@@ -668,13 +665,13 @@ void ZbZdoSetPreHandler(struct ZigBeeT *zb, ZbZdoPreHandlerFuncT func);
*---------------------------------------------------------------
*/
/* Internal complex descriptor format */
-typedef struct {
+typedef struct ZbZdoComplexDescT {
char manufacturerName[16];
char modelName[16];
char serialNumber[16];
} ZbZdoComplexDescT;
-enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoSetComplexDesc(struct ZigBeeT *zb, ZbZdoComplexDescT *structPtr);
+enum ZbStatusCodeT ZB_WARN_UNUSED ZbZdoSetComplexDesc(struct ZigBeeT *zb, struct ZbZdoComplexDescT *structPtr);
/*---------------------------------------------------------------
* IEEE Joining List
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zgp.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zgp.h
index e5a01a09c..74643abdc 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zgp.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.zgp.h
@@ -1,4 +1,4 @@
-/* Copyright [2009 - 2019] Exegin Technologies Limited. All rights reserved. */
+/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
#ifndef ZIGBEE_ZGP_H
# define ZIGBEE_ZGP_H
@@ -181,14 +181,13 @@ typedef struct ZbZgpDataReqT {
uint16_t lifetime;
} ZbZgpDataReqT;
-/* Same format as ZbNldeDataConfT */
+/* Same format as struct ZbNldeDataConfT */
typedef struct ZbZgpDataConfT {
uint32_t handle;
enum ZgpStatusCodeT status;
} ZbZgpDataConfT;
/* Add items to the gpTxQueue */
-void ZbZgpDataReqWait(struct ZigBeeT *zb, ZbZgpDataReqT *req, ZbZgpDataConfT *conf);
void ZbZgpDataReqCallback(struct ZigBeeT *, ZbZgpDataReqT *, void (*callback)(ZbZgpDataConfT *, void *), void *arg);
/* Remove items from the gpTxQueue */
@@ -229,9 +228,9 @@ uint8_t ZbZgpAddKey(struct ZigBeeT *zb, uint8_t applicationId, uint64_t gpdId, u
uint8_t level, uint8_t keytype, const void *key);
#if 0 /* EXEGIN - NOT_INCLUDED */
-void ZbZgpRecvDataInd(ZbApsdeDataIndT *dataIndPtr, void *arg);
-bool ZbZgpHandleUnsolicited(struct ZbZgpT *zgp, ZbApsdeDataIndT *dataIndPtr, uint8_t seqnum);
-void ZbZgpHandleUnsupported(struct ZigBeeT *zb, ZbApsdeDataIndT *ind, uint8_t seqnum);
+void ZbZgpRecvDataInd(struct ZbApsdeDataIndT *dataIndPtr, void *arg);
+bool ZbZgpHandleUnsolicited(struct ZbZgpT *zgp, struct ZbApsdeDataIndT *dataIndPtr, uint8_t seqnum);
+void ZbZgpHandleUnsupported(struct ZigBeeT *zb, struct ZbApsdeDataIndT *ind, uint8_t seqnum);
#endif
/* NOTE! This is only an empty server used for testing */
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c
index aa215bfdf..305fe56a6 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c
@@ -76,7 +76,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t HciAclDataBuffer[sizeof(TL_P
static uint8_t RxHostData[5];
static HciReceiveStatus_t HciReceiveStatus;
-static TL_CmdPacket_t SysLocalCmd;
+ALIGN(4) static TL_CmdPacket_t SysLocalCmd;
static uint8_t *pHostRx;
static tListNode HostTxQueue;
static TL_EvtPacket_t *pTxToHostPacket;
@@ -280,11 +280,10 @@ static void TM_SysLocalCmd ( void )
case LHCI_OPCODE_C1_READ_REG:
LHCI_C1_Read_Register( &SysLocalCmd );
break;
-#ifndef LITTLE_DORY
+
case LHCI_OPCODE_C1_DEVICE_INF:
LHCI_C1_Read_Device_Information( &SysLocalCmd );
- break;
-#endif
+ break;
default:
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/EWARM/Thread_Cli_Cmd.ewp b/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/EWARM/Thread_Cli_Cmd.ewp
index 3b2a2b2f1..d4cfea2d8 100644
--- a/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/EWARM/Thread_Cli_Cmd.ewp
+++ b/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/EWARM/Thread_Cli_Cmd.ewp
@@ -1,1291 +1,1301 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
- <fileVersion>3</fileVersion>
- <configuration>
- <name>Thread_Cli_Cmd_LittleDory</name>
- <toolchain>
- <name>ARM</name>
- </toolchain>
- <debug>1</debug>
- <settings>
- <name>General</name>
- <archiveVersion>3</archiveVersion>
- <data>
- <version>29</version>
- <wantNonLocal>1</wantNonLocal>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Thread_Cli_Cmd_LittleDory</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
<debug>1</debug>
- <option>
- <name>ExePath</name>
- <state>Thread_Cli_Cmd_LittleDory/Exe</state>
- </option>
- <option>
- <name>ObjPath</name>
- <state>Thread_Cli_Cmd_LittleDory/Obj</state>
- </option>
- <option>
- <name>ListPath</name>
- <state>Thread_Cli_Cmd_LittleDory/List</state>
- </option>
- <option>
- <name>GEndianMode</name>
- <state>0</state>
- </option>
- <option>
- <name>Input description</name>
- <state>No specifier n, no float nor long long, no scan set, no assignment suppressing, with multibyte support.</state>
- </option>
- <option>
- <name>Output description</name>
- <state>No specifier a, A, no specifier n, no float nor long long, with multibyte support.</state>
- </option>
- <option>
- <name>GOutputBinary</name>
- <state>0</state>
- </option>
- <option>
- <name>OGCoreOrChip</name>
- <state>1</state>
- </option>
- <option>
- <name>GRuntimeLibSelect</name>
- <version>0</version>
- <state>2</state>
- </option>
- <option>
- <name>GRuntimeLibSelectSlave</name>
- <version>0</version>
- <state>2</state>
- </option>
- <option>
- <name>RTDescription</name>
- <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
- </option>
- <option>
- <name>OGProductVersion</name>
- <state>4.41A</state>
- </option>
- <option>
- <name>OGLastSavedByProductVersion</name>
- <state>8.20.1.14181</state>
- </option>
- <option>
- <name>GeneralEnableMisra</name>
- <state>0</state>
- </option>
- <option>
- <name>GeneralMisraVerbose</name>
- <state>0</state>
- </option>
- <option>
- <name>OGChipSelectEditMenu</name>
- <state>STM32WB35CE_M4 ST STM32WB35CE_M4</state>
- </option>
- <option>
- <name>GenLowLevelInterface</name>
- <state>1</state>
- </option>
- <option>
- <name>GEndianModeBE</name>
- <state>1</state>
- </option>
- <option>
- <name>OGBufferedTerminalOutput</name>
- <state>0</state>
- </option>
- <option>
- <name>GenStdoutInterface</name>
- <state>0</state>
- </option>
- <option>
- <name>GeneralMisraRules98</name>
- <version>0</version>
- <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
- </option>
- <option>
- <name>GeneralMisraVer</name>
- <state>0</state>
- </option>
- <option>
- <name>GeneralMisraRules04</name>
- <version>0</version>
- <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
- </option>
- <option>
- <name>RTConfigPath2</name>
- <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
- </option>
- <option>
- <name>GBECoreSlave</name>
- <version>26</version>
- <state>39</state>
- </option>
- <option>
- <name>OGUseCmsis</name>
- <state>0</state>
- </option>
- <option>
- <name>OGUseCmsisDspLib</name>
- <state>0</state>
- </option>
- <option>
- <name>GRuntimeLibThreads</name>
- <state>0</state>
- </option>
- <option>
- <name>CoreVariant</name>
- <version>26</version>
- <state>39</state>
- </option>
- <option>
- <name>GFPUDeviceSlave</name>
- <state>STM32WB35CE_M4 ST STM32WB35CE_M4</state>
- </option>
- <option>
- <name>FPU2</name>
- <version>0</version>
- <state>6</state>
- </option>
- <option>
- <name>NrRegs</name>
- <version>0</version>
- <state>1</state>
- </option>
- <option>
- <name>NEON</name>
- <state>0</state>
- </option>
- <option>
- <name>GFPUCoreSlave2</name>
- <version>26</version>
- <state>39</state>
- </option>
- <option>
- <name>OGCMSISPackSelectDevice</name>
- </option>
- <option>
- <name>OgLibHeap</name>
- <state>0</state>
- </option>
- <option>
- <name>OGLibAdditionalLocale</name>
- <state>0</state>
- </option>
- <option>
- <name>OGPrintfVariant</name>
- <version>0</version>
- <state>1</state>
- </option>
- <option>
- <name>OGPrintfMultibyteSupport</name>
- <state>1</state>
- </option>
- <option>
- <name>OGScanfVariant</name>
- <version>0</version>
- <state>1</state>
- </option>
- <option>
- <name>OGScanfMultibyteSupport</name>
- <state>1</state>
- </option>
- <option>
- <name>GenLocaleTags</name>
- <state></state>
- </option>
- <option>
- <name>GenLocaleDisplayOnly</name>
- <state></state>
- </option>
- <option>
- <name>DSPExtension</name>
- <state>1</state>
- </option>
- </data>
- </settings>
- <settings>
- <name>ICCARM</name>
- <archiveVersion>2</archiveVersion>
- <data>
- <version>34</version>
- <wantNonLocal>1</wantNonLocal>
- <debug>1</debug>
- <option>
- <name>CCOptimizationNoSizeConstraints</name>
- <state>0</state>
- </option>
- <option>
- <name>CCDefines</name>
- <state>CORE_CM4</state>
- <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</state>
- <state>USE_HAL_DRIVER</state>
- <state>STM32WB35xx</state>
- <state>USE_STM32WBXX_NUCLEO</state>
- <state>THREAD_WB</state>
- </option>
- <option>
- <name>CCPreprocFile</name>
- <state>0</state>
- </option>
- <option>
- <name>CCPreprocComments</name>
- <state>0</state>
- </option>
- <option>
- <name>CCPreprocLine</name>
- <state>0</state>
- </option>
- <option>
- <name>CCListCFile</name>
- <state>0</state>
- </option>
- <option>
- <name>CCListCMnemonics</name>
- <state>0</state>
- </option>
- <option>
- <name>CCListCMessages</name>
- <state>0</state>
- </option>
- <option>
- <name>CCListAssFile</name>
- <state>0</state>
- </option>
- <option>
- <name>CCListAssSource</name>
- <state>0</state>
- </option>
- <option>
- <name>CCEnableRemarks</name>
- <state>0</state>
- </option>
- <option>
- <name>CCDiagSuppress</name>
- <state></state>
- </option>
- <option>
- <name>CCDiagRemark</name>
- <state></state>
- </option>
- <option>
- <name>CCDiagWarning</name>
- <state></state>
- </option>
- <option>
- <name>CCDiagError</name>
- <state></state>
- </option>
- <option>
- <name>CCObjPrefix</name>
- <state>1</state>
- </option>
- <option>
- <name>CCAllowList</name>
- <version>1</version>
- <state>11111110</state>
- </option>
- <option>
- <name>CCDebugInfo</name>
- <state>1</state>
- </option>
- <option>
- <name>IEndianMode</name>
- <state>1</state>
- </option>
- <option>
- <name>IProcessor</name>
- <state>1</state>
- </option>
- <option>
- <name>IExtraOptionsCheck</name>
- <state>0</state>
- </option>
- <option>
- <name>IExtraOptions</name>
- <state></state>
- </option>
- <option>
- <name>CCLangConformance</name>
- <state>0</state>
- </option>
- <option>
- <name>CCSignedPlainChar</name>
- <state>1</state>
- </option>
- <option>
- <name>CCRequirePrototypes</name>
- <state>1</state>
- </option>
- <option>
- <name>CCDiagWarnAreErr</name>
- <state>0</state>
- </option>
- <option>
- <name>CCCompilerRuntimeInfo</name>
- <state>0</state>
- </option>
- <option>
- <name>IFpuProcessor</name>
- <state>1</state>
- </option>
- <option>
- <name>OutputFile</name>
- <state>$FILE_BNAME$.o</state>
- </option>
- <option>
- <name>CCLibConfigHeader</name>
- <state>1</state>
- </option>
- <option>
- <name>PreInclude</name>
- <state></state>
- </option>
- <option>
- <name>CompilerMisraOverride</name>
- <state>0</state>
- </option>
- <option>
- <name>CCIncludePath2</name>
- <state>$PROJ_DIR$/../Core/Inc</state>
- <state>$PROJ_DIR$/../STM32_WPAN/App</state>
- <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
- <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
- <state>$PROJ_DIR$/../../../../../../Drivers/BSP/NUCLEO-WB35CE</state>
- <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
- <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
- <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
- <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread</state>
- <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform</state>
- </option>
- <option>
- <name>CCStdIncCheck</name>
- <state>0</state>
- </option>
- <option>
- <name>CCCodeSection</name>
- <state>.text</state>
- </option>
- <option>
- <name>IProcessorMode2</name>
- <state>1</state>
- </option>
- <option>
- <name>CCOptLevel</name>
- <state>3</state>
- </option>
- <option>
- <name>CCOptStrategy</name>
- <version>0</version>
- <state>1</state>
- </option>
- <option>
- <name>CCOptLevelSlave</name>
- <state>3</state>
- </option>
- <option>
- <name>CompilerMisraRules98</name>
- <version>0</version>
- <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
- </option>
- <option>
- <name>CompilerMisraRules04</name>
- <version>0</version>
- <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
- </option>
- <option>
- <name>CCPosIndRopi</name>
- <state>0</state>
- </option>
- <option>
- <name>CCPosIndRwpi</name>
- <state>0</state>
- </option>
- <option>
- <name>CCPosIndNoDynInit</name>
- <state>0</state>
- </option>
- <option>
- <name>IccLang</name>
- <state>0</state>
- </option>
- <option>
- <name>IccCDialect</name>
- <state>1</state>
- </option>
- <option>
- <name>IccAllowVLA</name>
- <state>0</state>
- </option>
- <option>
- <name>IccStaticDestr</name>
- <state>0</state>
- </option>
- <option>
- <name>IccCppInlineSemantics</name>
- <state>0</state>
- </option>
- <option>
- <name>IccCmsis</name>
- <state>1</state>
- </option>
- <option>
- <name>IccFloatSemantics</name>
- <state>0</state>
- </option>
- <option>
- <name>CCNoLiteralPool</name>
- <state>0</state>
- </option>
- <option>
- <name>CCOptStrategySlave</name>
- <version>0</version>
- <state>1</state>
- </option>
- <option>
- <name>CCGuardCalls</name>
- <state>1</state>
- </option>
- <option>
- <name>CCEncSource</name>
- <state>0</state>
- </option>
- <option>
- <name>CCEncOutput</name>
- <state>0</state>
- </option>
- <option>
- <name>CCEncOutputBom</name>
- <state>1</state>
- </option>
- <option>
- <name>CCEncInput</name>
- <state>0</state>
- </option>
- <option>
- <name>IccExceptions2</name>
- <state>0</state>
- </option>
- <option>
- <name>IccRTTI2</name>
- <state>0</state>
- </option>
- </data>
- </settings>
- <settings>
- <name>AARM</name>
- <archiveVersion>2</archiveVersion>
- <data>
- <version>10</version>
- <wantNonLocal>1</wantNonLocal>
- <debug>1</debug>
- <option>
- <name>AObjPrefix</name>
- <state>1</state>
- </option>
- <option>
- <name>AEndian</name>
- <state>1</state>
- </option>
- <option>
- <name>ACaseSensitivity</name>
- <state>1</state>
- </option>
- <option>
- <name>MacroChars</name>
- <version>0</version>
- <state>0</state>
- </option>
- <option>
- <name>AWarnEnable</name>
- <state>0</state>
- </option>
- <option>
- <name>AWarnWhat</name>
- <state>0</state>
- </option>
- <option>
- <name>AWarnOne</name>
- <state></state>
- </option>
- <option>
- <name>AWarnRange1</name>
- <state></state>
- </option>
- <option>
- <name>AWarnRange2</name>
- <state></state>
- </option>
- <option>
- <name>ADebug</name>
- <state>1</state>
- </option>
- <option>
- <name>AltRegisterNames</name>
- <state>0</state>
- </option>
- <option>
- <name>ADefines</name>
- <state></state>
- </option>
- <option>
- <name>AList</name>
- <state>0</state>
- </option>
- <option>
- <name>AListHeader</name>
- <state>1</state>
- </option>
- <option>
- <name>AListing</name>
- <state>1</state>
- </option>
- <option>
- <name>Includes</name>
- <state>0</state>
- </option>
- <option>
- <name>MacDefs</name>
- <state>0</state>
- </option>
- <option>
- <name>MacExps</name>
- <state>1</state>
- </option>
- <option>
- <name>MacExec</name>
- <state>0</state>
- </option>
- <option>
- <name>OnlyAssed</name>
- <state>0</state>
- </option>
- <option>
- <name>MultiLine</name>
- <state>0</state>
- </option>
- <option>
- <name>PageLengthCheck</name>
- <state>0</state>
- </option>
- <option>
- <name>PageLength</name>
- <state>80</state>
- </option>
- <option>
- <name>TabSpacing</name>
- <state>8</state>
- </option>
- <option>
- <name>AXRef</name>
- <state>0</state>
- </option>
- <option>
- <name>AXRefDefines</name>
- <state>0</state>
- </option>
- <option>
- <name>AXRefInternal</name>
- <state>0</state>
- </option>
- <option>
- <name>AXRefDual</name>
- <state>0</state>
- </option>
- <option>
- <name>AProcessor</name>
- <state>1</state>
- </option>
- <option>
- <name>AFpuProcessor</name>
- <state>1</state>
- </option>
- <option>
- <name>AOutputFile</name>
- <state>$FILE_BNAME$.o</state>
- </option>
- <option>
- <name>ALimitErrorsCheck</name>
- <state>0</state>
- </option>
- <option>
- <name>ALimitErrorsEdit</name>
- <state>100</state>
- </option>
- <option>
- <name>AIgnoreStdInclude</name>
- <state>0</state>
- </option>
- <option>
- <name>AUserIncludes</name>
- <state></state>
- </option>
- <option>
- <name>AExtraOptionsCheckV2</name>
- <state>0</state>
- </option>
- <option>
- <name>AExtraOptionsV2</name>
- <state></state>
- </option>
- <option>
- <name>AsmNoLiteralPool</name>
- <state>0</state>
- </option>
- </data>
- </settings>
- <settings>
- <name>OBJCOPY</name>
- <archiveVersion>0</archiveVersion>
- <data>
- <version>1</version>
- <wantNonLocal>1</wantNonLocal>
- <debug>1</debug>
- <option>
- <name>OOCOutputFormat</name>
- <version>3</version>
- <state>3</state>
- </option>
- <option>
- <name>OCOutputOverride</name>
- <state>1</state>
- </option>
- <option>
- <name>OOCOutputFile</name>
- <state>stm32wb35xx_Thread_Cli_Cmd.bin</state>
- </option>
- <option>
- <name>OOCCommandLineProducer</name>
- <state>1</state>
- </option>
- <option>
- <name>OOCObjCopyEnable</name>
- <state>1</state>
- </option>
- </data>
- </settings>
- <settings>
- <name>CUSTOM</name>
- <archiveVersion>3</archiveVersion>
- <data>
- <extensions></extensions>
- <cmdline></cmdline>
- <hasPrio>0</hasPrio>
- </data>
- </settings>
- <settings>
- <name>BICOMP</name>
- <archiveVersion>0</archiveVersion>
- <data></data>
- </settings>
- <settings>
- <name>BUILDACTION</name>
- <archiveVersion>1</archiveVersion>
- <data>
- <prebuild></prebuild>
- <postbuild></postbuild>
- </data>
- </settings>
- <settings>
- <name>ILINK</name>
- <archiveVersion>0</archiveVersion>
- <data>
- <version>20</version>
- <wantNonLocal>1</wantNonLocal>
- <debug>1</debug>
- <option>
- <name>IlinkLibIOConfig</name>
- <state>1</state>
- </option>
- <option>
- <name>XLinkMisraHandler</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkInputFileSlave</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkOutputFile</name>
- <state>stm32wb35xx_Thread_Cli_Cmd.out</state>
- </option>
- <option>
- <name>IlinkDebugInfoEnable</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkKeepSymbols</name>
- <state></state>
- </option>
- <option>
- <name>IlinkRawBinaryFile</name>
- <state></state>
- </option>
- <option>
- <name>IlinkRawBinarySymbol</name>
- <state></state>
- </option>
- <option>
- <name>IlinkRawBinarySegment</name>
- <state></state>
- </option>
- <option>
- <name>IlinkRawBinaryAlign</name>
- <state></state>
- </option>
- <option>
- <name>IlinkDefines</name>
- <state></state>
- </option>
- <option>
- <name>IlinkConfigDefines</name>
- <state></state>
- </option>
- <option>
- <name>IlinkMapFile</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkLogFile</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogInitialization</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogModule</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogSection</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogVeneer</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkIcfOverride</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkIcfFile</name>
- <state>$PROJ_DIR$\stm32wb35xx_flash_cm4.icf</state>
- </option>
- <option>
- <name>IlinkIcfFileSlave</name>
- <state></state>
- </option>
- <option>
- <name>IlinkEnableRemarks</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkSuppressDiags</name>
- <state></state>
- </option>
- <option>
- <name>IlinkTreatAsRem</name>
- <state></state>
- </option>
- <option>
- <name>IlinkTreatAsWarn</name>
- <state></state>
- </option>
- <option>
- <name>IlinkTreatAsErr</name>
- <state></state>
- </option>
- <option>
- <name>IlinkWarningsAreErrors</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkUseExtraOptions</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkExtraOptions</name>
- <state></state>
- </option>
- <option>
- <name>IlinkLowLevelInterfaceSlave</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkAutoLibEnable</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkAdditionalLibs</name>
- <state></state>
- </option>
- <option>
- <name>IlinkOverrideProgramEntryLabel</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkProgramEntryLabelSelect</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkProgramEntryLabel</name>
- <state>__iar_program_start</state>
- </option>
- <option>
- <name>DoFill</name>
- <state>0</state>
- </option>
- <option>
- <name>FillerByte</name>
- <state>0xFF</state>
- </option>
- <option>
- <name>FillerStart</name>
- <state>0x0</state>
- </option>
- <option>
- <name>FillerEnd</name>
- <state>0x0</state>
- </option>
- <option>
- <name>CrcSize</name>
- <version>0</version>
- <state>1</state>
- </option>
- <option>
- <name>CrcAlign</name>
- <state>1</state>
- </option>
- <option>
- <name>CrcPoly</name>
- <state>0x11021</state>
- </option>
- <option>
- <name>CrcCompl</name>
- <version>0</version>
- <state>0</state>
- </option>
- <option>
- <name>CrcBitOrder</name>
- <version>0</version>
- <state>0</state>
- </option>
- <option>
- <name>CrcInitialValue</name>
- <state>0x0</state>
- </option>
- <option>
- <name>DoCrc</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkBE8Slave</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkBufferedTerminalOutput</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkStdoutInterfaceSlave</name>
- <state>1</state>
- </option>
- <option>
- <name>CrcFullSize</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkIElfToolPostProcess</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogAutoLibSelect</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogRedirSymbols</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkLogUnusedFragments</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkCrcReverseByteOrder</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkCrcUseAsInput</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkOptInline</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkOptExceptionsAllow</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkOptExceptionsForce</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkCmsis</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkOptMergeDuplSections</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkOptUseVfe</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkOptForceVfe</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkStackAnalysisEnable</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkStackControlFile</name>
- <state></state>
- </option>
- <option>
- <name>IlinkStackCallGraphFile</name>
- <state></state>
- </option>
- <option>
- <name>CrcAlgorithm</name>
- <version>1</version>
- <state>1</state>
- </option>
- <option>
- <name>CrcUnitSize</name>
- <version>0</version>
- <state>0</state>
- </option>
- <option>
- <name>IlinkThreadsSlave</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkLogCallGraph</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkIcfFile_AltDefault</name>
- <state></state>
- </option>
- <option>
- <name>IlinkEncInput</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkEncOutput</name>
- <state>0</state>
- </option>
- <option>
- <name>IlinkEncOutputBom</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkHeapSelect</name>
- <state>1</state>
- </option>
- <option>
- <name>IlinkLocaleSelect</name>
- <state>1</state>
- </option>
- </data>
- </settings>
- <settings>
- <name>IARCHIVE</name>
- <archiveVersion>0</archiveVersion>
- <data>
- <version>0</version>
- <wantNonLocal>1</wantNonLocal>
- <debug>1</debug>
- <option>
- <name>IarchiveInputs</name>
- <state></state>
- </option>
- <option>
- <name>IarchiveOverride</name>
- <state>0</state>
- </option>
- <option>
- <name>IarchiveOutput</name>
- <state>###Unitialized###</state>
- </option>
- </data>
- </settings>
- <settings>
- <name>BILINK</name>
- <archiveVersion>0</archiveVersion>
- <data></data>
- </settings>
- </configuration>
- <group>
- <name>Application</name>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Thread_Cli_Cmd_LittleDory/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Thread_Cli_Cmd_LittleDory/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Thread_Cli_Cmd_LittleDory/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB35CE ST STM32WB35CE</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB35CE ST STM32WB35CE</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>CORE_CM4</state>
+ <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB35xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>THREAD_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/NUCLEO-WB35CE</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>stm32wb35xx_Thread_Cli_Cmd.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>stm32wb35xx_Thread_Cli_Cmd.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb35xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
<group>
- <name>EWARM</name>
- <file>
- <name>$PROJ_DIR$/startup_stm32wb35xx_cm4.s</name>
- </file>
- </group>
- <group>
- <name>User</name>
- <group>
- <name>Core</name>
- <file>
- <name>$PROJ_DIR$/../Core/Src/main.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/stm_logging.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/app_entry.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/stm32_lpm_if.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/hw_timerserver.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/hw_uart.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/stm32wbxx_it.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../Core/Src/stm32wbxx_hal_msp.c</name>
- </file>
- </group>
- <group>
- <name>STM32_WPAN</name>
+ <name>Application</name>
<group>
- <name>Target</name>
- <file>
- <name>$PROJ_DIR$/../STM32_WPAN/Target/hw_ipcc.c</name>
- </file>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb35xx_cm4.s</name>
+ </file>
</group>
<group>
- <name>App</name>
- <file>
- <name>$PROJ_DIR$/../STM32_WPAN/App/app_thread.c</name>
- </file>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_thread.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
</group>
- </group>
- </group>
- </group>
- <group>
- <name>Drivers</name>
- <group>
- <name>BSP</name>
- <file>
- <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\NUCLEO-WB35CE\nucleo_wb35ce.c</name>
- </file>
</group>
<group>
- <name>CMSIS</name>
- <file>
- <name>$PROJ_DIR$/../Core/Src/system_stm32wbxx.c</name>
- </file>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
</group>
<group>
- <name>STM32WBxx_HAL_Driver</name>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</name>
- </file>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\NUCLEO-WB35CE\nucleo_wb35ce.c</name>
+ </file>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
</group>
- </group>
- <group>
- <name>Middlewares</name>
<group>
- <name>STM32_WPAN</name>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</name>
- </file>
- <file>
- <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</name>
- </file>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_manager.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_monitor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\child_supervision.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\coap.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\commissioner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\crypto.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\diag.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dns.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\icmp6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\instance.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\ip6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\jam_detection.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\joiner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link_raw.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\message.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\netdata.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread_api_wb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\radio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\tasklet.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_thread_hci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\udp.c</name>
+ </file>
+ </group>
</group>
- </group>
<group>
<name>Utilities</name>
<file>
@@ -1295,11 +1305,4 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
</file>
</group>
- <group>
- <name>Doc</name>
- <file>
- <name>$PROJ_DIR$\..\readme.txt</name>
- </file>
- </group>
</project>
-
diff --git a/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c b/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
index a0d8b3b5b..a58b95cad 100644
--- a/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/NUCLEO-WB35CE/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Src/main.c
index fffe89652..e31de98cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/Core/Src/main.c
@@ -356,6 +356,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/App/ibeacon_service.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/App/ibeacon_service.c
index dda093761..832ff9cff 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/App/ibeacon_service.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/App/ibeacon_service.c
@@ -127,28 +127,6 @@ static tBleStatus IBeacon_Init(IBeacon_InitTypeDef *IBeacon_Init)
IBeacon_Init->CalibratedTxPower, /*< Ranging data. */
};
- uint8_t service_uuid_list[] =
- {
- 17, /*< Length. */
- AD_TYPE_16_BIT_SERV_UUID_CMPLT_LIST, /*< Complete list of 16-bit Service UUIDs data type value. */
- IBeacon_Init->UuID[0], /*< 16-byte Proximity UUID. */
- IBeacon_Init->UuID[1],
- IBeacon_Init->UuID[2],
- IBeacon_Init->UuID[3],
- IBeacon_Init->UuID[4],
- IBeacon_Init->UuID[5],
- IBeacon_Init->UuID[6],
- IBeacon_Init->UuID[7],
- IBeacon_Init->UuID[8],
- IBeacon_Init->UuID[9],
- IBeacon_Init->UuID[10],
- IBeacon_Init->UuID[11],
- IBeacon_Init->UuID[12],
- IBeacon_Init->UuID[13],
- IBeacon_Init->UuID[14],
- IBeacon_Init->UuID[15],
- };
-
uint8_t flags[] =
{
2, /*< Length. */
@@ -164,14 +142,6 @@ static tBleStatus IBeacon_Init(IBeacon_InitTypeDef *IBeacon_Init)
return ret;
}
- /* Update the service UUID list. */
- ret = aci_gap_update_adv_data(sizeof(service_uuid_list), service_uuid_list);
-
- if (ret != BLE_STATUS_SUCCESS)
- {
- return ret;
- }
-
/* Update the adverstising flags. */
ret = aci_gap_update_adv_data(sizeof(flags), flags);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Beacon/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Src/main.c
index fffe89652..e31de98cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/Core/Src/main.c
@@ -356,6 +356,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..669bcdbf2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/App/app_ble.c
index 69c6c71db..407dcd5be 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/App/app_ble.c
@@ -242,7 +242,9 @@ static void LinkConfiguration(void);
uint8_t TimerDataThroughputWrite_Id;
#if (CFG_BLE_CENTRAL != 0)
+#if (((CFG_TX_PHY == 2) || (CFG_RX_PHY == 2)) || (CFG_ENCRYPTION_ENABLE != 0))
static void GapProcReq(GapProcId_t GapProcId);
+#endif
static void Connect_Request(void);
static void Scan_Request(void);
static void Connection_Update(void);
@@ -545,7 +547,7 @@ static void Ble_Hci_Gap_Gatt_Init(void){
static void LinkConfiguration(void)
{
tBleStatus status;
-#if(CFG_BLE_CENTRAL != 0)
+#if (CFG_BLE_CENTRAL != 0)
uint8_t tx_phy;
uint8_t rx_phy;
#endif
@@ -556,11 +558,11 @@ static void LinkConfiguration(void)
* Setup Data Length
* Setup Pairing
*/
-#if(((CFG_TX_PHY == 2) | (CFG_RX_PHY == 2)) && (CFG_BLE_CENTRAL != 0))
+#if (((CFG_TX_PHY == 2) || (CFG_RX_PHY == 2)) && (CFG_BLE_CENTRAL != 0))
GapProcReq(GAP_PROC_SET_PHY);
#endif
-#if(CFG_BLE_CENTRAL != 0)
+#if (CFG_BLE_CENTRAL != 0)
APP_DBG_MSG("Reading_PHY\n");
status = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&tx_phy,&rx_phy);
if (status != BLE_STATUS_SUCCESS)
@@ -827,6 +829,7 @@ const uint8_t* BleGetBdAddress( void )
}
#if (CFG_BLE_CENTRAL != 0)
+#if (((CFG_TX_PHY == 2) || (CFG_RX_PHY == 2)) || (CFG_ENCRYPTION_ENABLE != 0))
static void GapProcReq(GapProcId_t GapProcId)
{
tBleStatus status;
@@ -864,6 +867,7 @@ static void GapProcReq(GapProcId_t GapProcId)
}
return;
}
+#endif
static void Scan_Request( void )
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..669bcdbf2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Src/main.c
index 7cebe8df3..b28a928fb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/Core/Src/main.c
@@ -356,6 +356,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HealthThermometer/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Src/main.c
index cea2fdfb2..143bc0312 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/Core/Src/main.c
@@ -367,6 +367,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Src/main.c
index 1c06069e0..0e42160cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/Core/Src/main.c
@@ -80,7 +80,7 @@ osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.priority = (osPriority_t) osPriorityNormal,
- .stack_size = 256 * sizeof(StackType_t)
+ .stack_size = 128 * 4
};
/* USER CODE BEGIN PV */
@@ -406,6 +406,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.cproject
index b71cc3905..b1b2b6f3f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.cproject
@@ -17,16 +17,16 @@
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1471698577" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1471698577." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.842439666" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
- <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.891315979" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.918864504" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.board.195667265" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.891315979" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.918864504" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.195667265" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" useByScannerDiscovery="false" valueType="stringList">
<listOptionValue builtIn="false" value="ARM Cortex-M4"/>
<listOptionValue builtIn="false" value="CM4"/>
</option>
- <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.592443320" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1279485587" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.490458115" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.592443320" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1279485587" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.490458115" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.1709529787" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
<builder buildPath="${workspace_loc:/BLE_HeartRateFreeRTOS}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1128057867" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
<outputEntries>
@@ -62,9 +62,9 @@
<listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
<listOptionValue builtIn="false" value="STM32WB55xx"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
- <listOptionValue builtIn="false" value="CORE_CM4"/>
</option>
<option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.846197884" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <option id="gnu.c.compiler.option.dialect.std.1814884468" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1043208234" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.1805700620" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
</tool>
@@ -105,10 +105,10 @@
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.108392807" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.730989397" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.386523083" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
- <option id="gnu.c.link.option.libs.1418564794" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
- <option id="gnu.c.link.option.paths.236993093" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
- <option id="gnu.c.link.option.ldflags.395074187" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.386523083" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1418564794" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false"/>
+ <option id="gnu.c.link.option.paths.236993093" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false"/>
+ <option id="gnu.c.link.option.ldflags.395074187" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
<option id="gnu.c.link.option.other.338026491" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.769219343" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -128,7 +128,7 @@
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.471980061" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1412995831" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
- <option id="gnu.both.asm.option.include.paths.494520591" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+ <option id="gnu.both.asm.option.include.paths.494520591" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../../../Core/Inc"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.105116726" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
@@ -160,4 +160,5 @@
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.project
index cef35ffbb..689153b9f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/SW4STM32/BLE_HeartRateFreeRTOS/.project
@@ -1,7 +1,6 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
<name>BLE_HeartRateFreeRTOS</name>
- <comment></comment>
+ <comment/>
<projects>
</projects>
<buildSpec>
@@ -28,332 +27,332 @@
<link>
<name>Doc/readme.txt</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/readme.txt</locationURI>
+ <location>PARENT-2-PROJECT_LOC/readme.txt</location>
</link>
<link>
<name>Utilities/stm32_lpm.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
</link>
<link>
<name>Utilities/stm32_seq.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
</link>
<link>
<name>Application/Core/app_entry.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</location>
</link>
<link>
<name>Application/Core/freertos_port.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/freertos_port.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/freertos_port.c</location>
</link>
<link>
<name>Application/Core/hw_timerserver.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</location>
</link>
<link>
<name>Application/Core/hw_uart.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</location>
</link>
<link>
<name>Application/Core/main.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/main.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/main.c</location>
</link>
<link>
<name>Application/Core/app_debug.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</location>
</link>
<link>
<name>Application/Core/stm32_lpm_if.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</location>
</link>
<link>
<name>Application/Core/stm32wbxx_hal_msp.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_msp.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_msp.c</location>
</link>
<link>
<name>Application/Core/stm32wbxx_hal_timebase_tim.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_timebase_tim.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_timebase_tim.c</location>
</link>
<link>
<name>Application/Core/stm32wbxx_it.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</location>
</link>
<link>
<name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
<type>1</type>
- <locationURI>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</locationURI>
+ <location>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</location>
</link>
<link>
<name>Application/SW4STM32/syscalls.c</name>
<type>1</type>
- <locationURI>PARENT-1-PROJECT_LOC/syscalls.c</locationURI>
+ <location>PARENT-1-PROJECT_LOC/syscalls.c</location>
</link>
<link>
<name>Drivers/CMSIS/system_stm32wbxx.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_adc.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_adc_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma_ex.c</name>
<type>1</type>
- <location>C:/dev/GIT_Dory/stm32wb_M4_Firmware/Firmware/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_spi.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_spi_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_spi_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
</link>
<link>
<name>Application/STM32_WPAN/app/app_ble.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_ble.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_ble.c</location>
</link>
<link>
<name>Application/STM32_WPAN/app/dis_app.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/App/dis_app.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/dis_app.c</location>
</link>
<link>
<name>Application/STM32_WPAN/app/hrs_app.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/App/hrs_app.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/hrs_app.c</location>
</link>
<link>
<name>Application/STM32_WPAN/target/hw_ipcc.c</name>
<type>1</type>
- <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</locationURI>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</location>
</link>
<link>
<name>Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/utilities/otp.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/blesvc/dis.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/dis.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/dis.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/blesvc/hrs.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/hrs.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/hrs.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/core/ble_gap_aci.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/core/ble_gatt_aci.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/core/ble_hal_aci.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/core/ble_hci_le.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/core/ble_l2cap_aci.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/ble/core/osal.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/list.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/list.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/list.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/queue.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/queue.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/queue.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/tasks.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/tasks.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/tasks.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/timers.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/timers.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/timers.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c</location>
</link>
<link>
<name>Middlewares/Third_Party/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c</name>
<type>1</type>
- <locationURI>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c</locationURI>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c</location>
</link>
</linkedResources>
</projectDescription>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Binary/BLE_HeartRateFreeRTOS_ANCS_reference.hex b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Binary/BLE_HeartRateFreeRTOS_ANCS_reference.hex
new file mode 100644
index 000000000..092689770
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Binary/BLE_HeartRateFreeRTOS_ANCS_reference.hex
@@ -0,0 +1,4898 @@
+:020000040800F2
+:10000000806C002019300108D52D0108D72D01087A
+:10001000D92D0108DB2D0108DD2D010800000000AD
+:10002000000000000000000000000000491401086A
+:10003000DF2D010800000000F1130108EDDC0008CD
+:10004000513001085530010859300108272E0108A8
+:100050005D300108613001081B2E0108212E0108C6
+:100060006530010869300108152E01086D3001085E
+:100070007130010875300108E12D0108793001085F
+:100080007D30010881300108853001088930010880
+:100090008D30010891300108953001089930010830
+:1000A0009D300108A1300108E72D0108A5300108A5
+:1000B000A9300108AD300108B1300108B5300108A0
+:1000C000B9300108BD300108C1300108C530010850
+:1000D000ED2D0108F32D0108C9300108CD300108CC
+:1000E000D1300108D5300108D9300108DD300108D0
+:1000F0002F2E01082B2E0108E1300108E530010800
+:10010000E9300108ED300108F1300108F53001084F
+:10011000F9300108FD3001080131010805310108FD
+:10012000093101080D310108F92D010811310108CB
+:1001300015310108193101081D31010818B10228D3
+:1001400007D003D370470FF2140004E00FF2200031
+:1001500001E00FF2340006F0DBBB00002A2A204544
+:1001600076656E7449443A2041646465640D0A0002
+:100170002A2A204576656E7449443A204D6F646999
+:10018000666965640D0A00002A2A204576656E744A
+:1001900049443A2052656D6F7665640D0A0000008F
+:1001A00010B50128044608D0022809D004280AD036
+:1001B00008280BD010280CD00FE00FF26C000AE0DA
+:1001C0000FF27C0007E00FF2940004E00FF2AC00A5
+:1001D00001E00FF2C80006F09BFB0FF2E00006F012
+:1001E00097FBE00744BF0FF2E40006F091FBA00785
+:1001F00044BF0FF2E00006F08BFB600744BF0FF234
+:10020000E00006F085FB200744BF0FF2E40006F093
+:100210007FFBE00644BF0FF2E80006F079FBBDE883
+:10022000104001F00DBE00002A2A204576656E744C
+:10023000466C61673A2053696C656E740D0A000064
+:100240002A2A204576656E74466C61673A20496DAE
+:10025000706F7274616E740D0A0000002A2A2045C6
+:1002600076656E74466C61673A20507265204578F9
+:10027000697374696E670D0A000000002A2A204520
+:1002800076656E74466C61673A20506F7369746965
+:10029000766520416374696F6E0D0A002A2A204535
+:1002A00076656E74466C61673A204E656761746965
+:1002B000766520416374696F6E0D0A002A2A204515
+:1002C00076656E74466C6167733A00002053696C02
+:1002D000656E740020496D706F7274616E740000F9
+:1002E000205072654578697374696E67000000007C
+:1002F00020506F736974697665416374696F6E002D
+:10030000204E65676174697665416374696F6E003C
+:100310000B282CD8DFE800F006090C0F1215181B6B
+:100320001E2124270FF248001FE00FF25C001CE0A2
+:100330000FF2740019E00FF2900016E00FF2A40023
+:1003400013E00FF2B80010E00FF2CC000DE00FF256
+:10035000E0000AE00FF2F00007E00FF2101004E0F6
+:100360000FF2301001E00FF2481006F0D1BA7047DA
+:100370002A2A2043617465676F727949443A204F95
+:10038000746865720D0A00002A2A2043617465674B
+:100390006F727949443A20496E636F6D696E6720C8
+:1003A00043616C6C0D0A00002A2A20436174656762
+:1003B0006F727949443A204D6973736564204361D3
+:1003C0006C6C0D0A000000002A2A204361746567E6
+:1003D0006F727949443A20566F696365204D6169AF
+:1003E0006C0D0A002A2A2043617465676F7279498F
+:1003F000443A20536F6369616C0D0A002A2A204336
+:10040000617465676F727949443A20536368656423
+:10041000756C650D0A0000002A2A20436174656727
+:100420006F727949443A20456D61696C0D0A00008C
+:100430002A2A2043617465676F727949443A204ED5
+:100440006577730D0A0000002A2A204361746567EE
+:100450006F727949443A204865616C7420616E641A
+:10046000204669746E6573730D0A00002A2A2043C2
+:10047000617465676F727949443A20427573696E99
+:1004800065737320616E642046696E616E63650DED
+:100490000A0000002A2A2043617465676F72794957
+:1004A000443A204C6F636174696F6E0D0A0000005E
+:1004B0002A2A2043617465676F727949443A20455E
+:1004C0006E7465727461696E6D656E740D0A0000FC
+:1004D00007281ED8DFE800F004070A0D10131619CC
+:1004E0000FF2300013E00FF2400010E00FF2440072
+:1004F0000DE00FF250000AE00FF2580007E00FF293
+:10050000680004E00FF26C0001E00FF2840006F0D6
+:10051000FFB970472A2A204170704964656E74697A
+:10052000666965723A2000002A2A205469746C6555
+:100530003A2000002A2A205375625469746C653A87
+:10054000200000002A2A204D6573736167653A20F8
+:10055000000000002A2A204D6573736167655369A6
+:100560007A653A20000000002A2A20446174653A26
+:10057000200000002A2A20506F7369746976654153
+:100580006374696F6E4C6162656C3A200000000014
+:100590002A2A204E65676174697665416374696FC4
+:1005A0006E4C6162656C3A20000000000FB42DE9CA
+:1005B000FC4585B068460FF25011142206F0CCF9C4
+:1005C0000E988DF8010000240E988DF80040000A66
+:1005D0008DF8020005250E98000C8DF803000E988A
+:1005E000000E8DF804009DF83C00012804BF8DF832
+:1005F000054006259DF83D00012807D1BDF83E00C5
+:1006000020B101210DF8051000F0AEF89DF8400072
+:10061000012806D1BDF8420018B1EAB2022100F06B
+:10062000A1F89DF84400012806D1BDF8460018B194
+:10063000EAB2032100F096F89DF84800012803D1A2
+:10064000E8B2042100F08AF89DF84900012803D19E
+:10065000E8B2052100F082F89DF84A00012803D194
+:10066000E8B2062100F07AF89DF84B00012803D18A
+:10067000E8B2072100F072F8DFF8A88DDFF8A86D66
+:100680000FF2980ADFF8A44D02F035F801464FF456
+:10069000E173524600F046F90E990FF2A000EAB25B
+:1006A00006F036F9002705E01DF80010204606F098
+:1006B0002FF97F1CF8B2E9B28842F5D301F07CFB38
+:1006C00000F028F9EAB206F03BFB00F045F9002CF7
+:1006D00040460AD106F006FC01464FF4E773524645
+:1006E00000F020F900F021F909E006F0FBFB0146DB
+:1006F0004FF4E973524600F015F900F0EBF807B03B
+:10070000BDE8F0055DF814FB00000000000001FFEB
+:10071000FF02FFFF03FFFF0405060700414E43539E
+:100720005F436D645F4765744E6F746966696361AA
+:1007300074696F6E417474720000000020617474FB
+:10074000722E5549443D30782530387820436D6409
+:1007500053697A653D2564200A0D00000DF80010EC
+:100760006D1C70470DF802106D1CE9B26D1C0DF880
+:100770000100E9B2000A0DF801006D1C70472DE977
+:10078000FC420FF2B8020FF2BC07DFF8A09CD2E9DE
+:100790000035CDE900350446200A8DF80200220E0E
+:1007A000200C8DF8030002268DF804208DF805102A
+:1007B0008DF800608DF80140DFF8685CDFF8686C48
+:1007C000284606F08FFB014640F2EB133A4600F054
+:1007D000A9F8062221460FF2900006F099F80024AD
+:1007E000E0B2641C1DF80010484606F091F8E0B233
+:1007F0000528F5DD01F0E0FA00F08CF8062206F09D
+:100800009FFA00F0A9F8002C28460AD106F06AFBEE
+:1008100001464FF4FC733A4600F084F800F085F886
+:1008200009E006F05FFB01464FF4FE733A4600F024
+:1008300079F800F04FF8BDE8F382000002000000F4
+:1008400000000000414E43535F436D645F5065728A
+:10085000666F726D4E6F74696669636174696F6EFD
+:10086000416374696F6E000020506572666F726D2F
+:10087000204E6F74696669636174696F6E204163AD
+:1008800074696F6E207468726F75676820414E439B
+:1008900053436F6E74726F6C506F696E744368610E
+:1008A0007256616C756548646C65203A206E6F7491
+:1008B000696669636174696F6E5549443D30782596
+:1008C00030385820436D6453697A65203D25642093
+:1008D0000A0D000021460FF2080006F019B80000CA
+:1008E000206163695F676174745F77726974655FC3
+:1008F000636861725F76616C756520636D64204E1C
+:100900004F4B20737461747573203D3078253032FD
+:1009100058200A00DFF8180BB0F8C21740886B4661
+:1009200070474A46304605F0F3BF0FF2080005F065
+:10093000EFBF0000206163695F676174745F777265
+:100940006974655F636861725F76616C7565206369
+:100950006D64206F6B0A0000044647F2305000F0CF
+:10096000F6BC2DE9F843A0B005460C466846802148
+:1009700006F026FB01268DF800600120002104E02E
+:10098000635C0DF800303846491C471CA942C0B2D0
+:10099000F6DB00210DF80010DFF8889ADFF8888A6E
+:1009A0000FF2640602F0A6FC014640F21123324623
+:1009B00000F014FE2B462246F9B20FF2600005F05B
+:1009C000A7FFFFF7A7FFFAB206F0BAF9FFF7C4FFD7
+:1009D000002C48460AD106F085FA014640F21A2357
+:1009E000324600F0FBFDFFF7A0FF09E006F07AFABF
+:1009F000014640F21E23324600F0F0FDFFF76AFF89
+:100A000021B0BDE8F0830000414E43535F436D6465
+:100A10005F4765744170704174747200436F6D6D0F
+:100A2000616E6449444765744170704174747269C1
+:100A3000627574657320436D6453697A653D2564FE
+:100A4000203A204170704964656E74696669657208
+:100A50003D2573204170704964656E7469666965EF
+:100A6000724C656E6774683D2564200A0D000000B5
+:100A70002DE9FE4F07460D461646DFF8A8090FF28E
+:100A8000981906F02FFA01464FF40A734A4602F00D
+:100A900085FFD3A005F03CFF0024B846002F18BF07
+:100AA000B8F1010F00F0B080BDE8F78FE41CA4B2EC
+:100AB000BDF804008442F7DA3019411C022268466E
+:100AC00006F081FABDF800000028EFD09DF8021072
+:100AD00007F5F2654FF00C0A59BBA87820BBB5F8B2
+:100AE00000B00FF24C100AFB0BFABA4405F010FFED
+:100AF0000AF2911B9BF80000FFF720FB9BF8010016
+:100B0000FFF74EFB9BF80200FFF702FC9BF8031077
+:100B10000FF2701005F0FCFEDAF898110FF27C105D
+:100B200005F0F6FE0120A870305DFFF7D1FC3420FF
+:100B30002BE0B8F1010F29D1305D18B90FF27C100C
+:100B400005F0E6FE298807F293100AFB01F1405CEC
+:100B5000012818BF052803D101202872352014E090
+:100B600002F02CFF014640F251234A4602F016FFE4
+:100B700029880FF25C1005F0CBFE28880AFB00F1F3
+:100B80007818002180F8901137203870305DBDF85A
+:100B90000020451EAD41641CA4B2ED0F3019B2F522
+:100BA000807F07F18F0A09D2811C504606F00BFAAC
+:100BB000BDF8001000200AF8010007E0811CFE22A9
+:100BC000504606F000FA002087F88D01BDF80000BD
+:100BD0000419A41CA4B26DB1421C812A05DA00F0EC
+:100BE00095F8BDF80000401C03E0802200F08EF86C
+:100BF0008020B873BDF80000002804D051460FF2E1
+:100C0000041005F085FE53E78DF80270ADF804502E
+:100C1000DFF81C784CE70000414E43535F5061728F
+:100C200073655F476574417474725F5265737000D9
+:100C30000D0A2A2A2A2A2A2A2A2A2A2A2A2A2A2A51
+:100C40002A204461746120536F7572636520446586
+:100C50007461696C20496E666F6D6174696F6E2096
+:100C60005265636569766564202A2A2A2A2A2A2A17
+:100C70002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0DF1
+:100C80000A0000002A2A2043617465676F72794365
+:100C90006F756E743A2025640D0A00002A2A204ED2
+:100CA0006F74696669636174696F6E5549443A206F
+:100CB0003078253038780D0A000000002A2A2044B8
+:100CC0006973706C61794E616D653A2000000000B7
+:100CD000436F6D6D616E6449444765744170704146
+:100CE000747472696275746573206E6F7469667965
+:100CF000456E7472793D25642052656D6F7665642A
+:100D00000A0D00002025730D0A000000514607F16E
+:100D10000F0006F058B92DE9FC410546089CDFF8A4
+:100D200004070E461746984606F0DCF8014640F2E6
+:100D30008B230FF2B00202F031FE01F03DF80FF20A
+:100D4000CC0005F0E5FD2846FFF7F8F93046FFF73F
+:100D500027FA3846FFF7DCFA41460FF2081005F093
+:100D6000D7FD21460FF2141005F0D2FD0C22022D02
+:100D7000DFF8BC3611D1002102FB01F0184400F568
+:100D8000C8708568A54203D0491C8029F4DB24E0A3
+:100D9000002202700FF204101BE0002102FB01F0A0
+:100DA000184400F5C87C9CF8000018B1491C802943
+:100DB000F4DB12E001208CF800008CF801508CF874
+:100DC00002608CF803708CF80480CCF808400FF2B5
+:100DD000EC00BDE8FC4105F09BBDBDE8F3810000DF
+:100DE000200A0D00414E43535F4E6F74696669637C
+:100DF0006174696F6E5F536F757263655F5265638F
+:100E000065697665645F6576656E74002A2A2A2AAC
+:100E10002A2A2A2A2A2A2A2A2A2A2A204E6F74694A
+:100E20006669636174696F6E20536F7572636520C4
+:100E3000426173696320496E666F6D6174696F6E9C
+:100E4000205265636569766564202A2A2A2A2A2A3F
+:100E50002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AF2
+:100E60000D0A00002A2A2043617465676F72794376
+:100E70006F756E743A202564200D0A002A2A204ED0
+:100E80006F74696669636174696F6E5549443A208D
+:100E9000307825303878200D0A0000002A2A206E8C
+:100EA0006F74696679456E7472793A2025642052B0
+:100EB000656D6F7665640D0A000000002A2A206EB9
+:100EC0006F74696679456E7472793A2025642041A1
+:100ED000646465640D0A00007CB5DFF8544504F5D0
+:100EE000F2654FF6FF7601462E8000220C23534315
+:100EF000234403F5C873187828B19878C30702D43F
+:100F00000840884213D0521C802AEFDB2888B04268
+:100F10000CD102F053FD01464FF4367302F03CFD54
+:100F20000FF2300005F0F4FC0220207073BD0020A9
+:100F3000A870D2B2332020702A8002F03FFD014613
+:100F400040F2D12302F028FD29880FF24C0005F071
+:100F5000DFFCDBE720616E63735F636F6E7465783F
+:100F6000742E6E6F74696679456E747279203D3D9A
+:100F700020494E56414C49445F4E4F544946595FB3
+:100F8000454E545259203D3E20414E43535F494403
+:100F90004C45200A0D000000206E6F74696679458B
+:100FA0006E7472793D2564203D3D3E20414E435391
+:100FB0005F4745545F4E4F54494649434154494F5A
+:100FC0004E5F415454524942555445200A0D000089
+:100FD00010B5DFF85C4440F2CC71204605F0F0FF1C
+:100FE00000200C210023C2B24A432244401C82F854
+:100FF0009031C2B2802AF6DB022020704FF6FF70DB
+:101000006080A4F8900702F0D9FC01464FF43E73CB
+:101010000FF2100202F0C2FCBDE810400FF21800FF
+:1010200005F076BC414E43535F436C69656E745F57
+:101030005265736574000000414E435320434C4990
+:10104000454E54205245534554200A0D00000000DF
+:101050002DE9F0410FF23404DFF8CC530FF27006A3
+:10106000DFF8C08340F213374FF0FF320021012038
+:1010700006F09FF801F03FFB01463B4600F057F9B0
+:10108000204605F045FC02F00CFEEDE76F73546856
+:1010900072656164466C6167735761697420656449
+:1010A0002020416E637350726F63657373496420CF
+:1010B0003D3D3E20414E43535F4170705F5570642B
+:1010C0006174655F53657276696365200A0D00007F
+:1010D000416E637350726F636573730010B5DFF810
+:1010E000680DDFF8684D05F0FDFE014640F21F3344
+:1010F0000FF2200202F052FCA06806F005F801464B
+:101100000FF21C0005F004FCA068BDE810400121AE
+:1011100006F012B8416E63735F4D67720000000005
+:101120006F73546872656164466C6167735365746C
+:1011300020416E637350726F63657373496420203E
+:101140007769746820617661696C61626C6520738F
+:101150007461636B20737061636520206F6620414A
+:101160006E637350726F636573734964203A203005
+:101170007825303878200A0D00000000F8B5DFF837
+:10118000D00CDFF8C44CA84D0FF29406DFF8BC7CFD
+:1011900006F0F4F900F0CFF801464FF44B7300F07D
+:1011A000C6F80FF2940005F0B3FB0FF2C802DFF8A7
+:1011B000A40C002105F052FFB86000F0BCF8014615
+:1011C00040F22E3300F0B3F8B9680FF2CC004FF4C0
+:1011D000A06205F09DFB00F0AEF8014640F22F330F
+:1011E00000F0A5F8B86805F08FFF01460FF2E000A7
+:1011F00005F08EFB00F096F8386000F093F8786008
+:10120000FFF7E6FE00F097F801464FF44E7300F04A
+:101210008EF8BDE8F2400FF2EC0005F079BB00005B
+:10122000414E43535F436C69656E745F4170705FFC
+:10123000496E6974000000002D2D206F7354687290
+:101240006561644E65772020416E637350726F63F1
+:10125000657373203D3D3E20414E43535F417070A6
+:101260005F5570646174655F536572766963650A82
+:1012700000000000081D0108000000000000000040
+:101280000000000000000000000500000000000059
+:101290000000000000000000746F74616C20737423
+:1012A00061636B20737061636520206F6620416EFF
+:1012B000637350726F6365737349643D20307825A2
+:1012C000303878203A20307825303878200A0000ED
+:1012D000617661696C61626C6520737461636B2017
+:1012E000737061636520206F6620416E6373507276
+:1012F0006F636573734964203A20307825303878FD
+:10130000200A0D002D2D20414E435320434C4945CA
+:101310004E5420494E495449414C495A4544200AAB
+:101320000D00000000220021012006F03FB83246E7
+:10133000284605F0EDBA204605F0D4BDDFF80C0BC9
+:10134000006806F0B9B8DFF8040B006802E0DFF8C7
+:10135000FC0A40684FF0FF3106F07FB82DE9F047F6
+:101360000446DFF8E4AADFF8C0800FF2C8090FF2E4
+:10137000DC0500F02FF901464FF4587300F02DF909
+:10138000A27821880FF2241005F0C2FA002740F25B
+:10139000653610E000F01EF90146334600F01DF9F5
+:1013A00004EB8700B0F80520B0F80310284605F0DC
+:1013B000AFFA7F1CFFB2A0788742EBDB1C4E30787F
+:1013C0001E2806F2AA7512D1B4F80310A981B4F848
+:1013D0000500E88100F0FEF8014640F26E3300F0AF
+:1013E000FCF8EA89A9890FF21C1005F091FA30780F
+:1013F0001D2814D1B4F803102980B4F805006880C2
+:1014000000F0E8F8014640F2763300F0E6F86A882A
+:1014100029880FF25810BDE8F04705F079BABDE809
+:10142000F0870000606800084C6800080869000840
+:10143000C0410020476174745061727365536572D6
+:101440007669636573427955554944004556545F42
+:10145000424C55455F4154545F46494E445F4259A2
+:101460005F545950455F56414C5F52455350202DB3
+:1014700020466F756E645F4174747269627574653D
+:101480005F48616E646C653D3078253034582C4778
+:10149000726F75705F456E645F48616E646C653D28
+:1014A0003078253034580A0D000000004556545F4E
+:1014B000424C55455F4154545F46494E445F425942
+:1014C0005F545950455F56414C5F52455350202D53
+:1014D00020436F6E6E656374696F6E5F48616E6402
+:1014E0006C653D3078253034582C4E756D5F6F66D5
+:1014F0005F48616E646C655F506169723D25640A86
+:101500000D0000004556545F424C55455F41545410
+:101510005F46494E445F42595F545950455F5641BA
+:101520004C5F52455350202D20466F756E6420410C
+:101530004E435353657276696365537461727448A0
+:10154000616E646C653D3078253034582C414E43D3
+:101550005353657276696365456E6448616E646C69
+:10156000653D3078253034580A0D00004556545FEB
+:10157000424C55455F4154545F46494E445F425981
+:101580005F545950455F56414C5F52455350202D92
+:1015900020466F756E6420474154545365727669D6
+:1015A0006365537461727448616E646C653D307834
+:1015B000253034582C47415454536572766963651D
+:1015C000456E6448616E646C653D307825303458F2
+:1015D0000A0D0000504605F085BC4A46404605F01D
+:1015E00097B92DE9F14FDFF860888AB001F083F8F0
+:1015F000DFF868980FF24C3B014640F2873300F069
+:10160000D7FB0A98C378827801880FF24C3005F036
+:101610007FF90A980188DFF83C0C428808918A42D9
+:1016200040F07F810A990A9A8978D37893FBF1F286
+:10163000D2B21429069203D10C220424102505925B
+:10164000062903D1002104240225059100228DF8EA
+:101650000C206D1E079500F29A70049028E005F0AA
+:1016600041FC014640F2F13300F0A2FB0FF254308E
+:1016700033462A4651460FE045F22B00824540464C
+:10168000EDD105F02FFC40F2EF33014600F090FB66
+:1016900033462A465146204605F03AF90A99009CFD
+:1016A000887804199DF80C00401CE4B28DF80C00F9
+:1016B0009DF80C700698874280F241810A98204478
+:1016C000867805784178C07845EA012546EA002603
+:1016D00005980A9900F0FCFF42EA002A01F00BF895
+:1016E000014640F2AD3300F063FB0296019553468C
+:1016F0000899069A0FF2F4200091394605F008F98E
+:101700000FF2403005F004F9079F02E00A9900F05B
+:10171000E5FF002FFAD5009400F04EFB04980088F6
+:1017200008B1854201DA049805800498408808B120
+:10173000B04201DA04984680BAF5C05F0ED1049831
+:10174000858040460499CE8005F0CCFB014640F2EE
+:10175000C33300F02DFB0FF2F42089E741F60100BE
+:1017600082450ED104980582404604994E8205F0C8
+:10177000B9FB014640F2C93300F01AFB0FF2F82022
+:1017800076E741F6020082450FF2283404D100F0DA
+:10179000B2FF4FF4737378E741F60300824509D135
+:1017A00000F0A9FF014640F2CE3300F001FB0FF23A
+:1017B00030305DE741F60400824509D100F09BFF1F
+:1017C00001464FF4747300F0F3FA0FF248304FE71C
+:1017D00041F60500824509D100F08DFF014640F237
+:1017E000D23300F0E5FA0FF2603041E741F606002F
+:1017F000824509D100F07FFF01464FF4757300F078
+:10180000D7FA0FF27C3033E741F60700824509D161
+:1018100000F071FF014640F2D63300F0C9FA0FF232
+:10182000A03025E741F60800824509D100F063FFAA
+:1018300001464FF4767300F0BBFA0FF2BC3017E7A5
+:1018400041F60900824509D100F055FF014640F2FA
+:10185000DA3300F0ADFA0FF2D03009E741F60A00B2
+:10186000824509D100F047FF01464FF4777300F03D
+:101870009FFA0FF2F030FBE641F60B0082450FF2C3
+:1018800020470BD100F037FF014640F2DE3300F075
+:101890008FFA33462A4651463846FDE641F60C009B
+:1018A000824505D100F027FF01464FF47873EEE73B
+:1018B00041F60D00824504D100F01DFF40F2E233F5
+:1018C000E3E641F60E00824509D100F014FF01461F
+:1018D0004FF4797300F06CFA0FF2EC30C8E641F681
+:1018E0000F00824509D100F006FF014640F2E633C1
+:1018F00000F05EFA0FF20440BAE64FF23140824542
+:101900007FF4BAAE0498858340460499CE8305F0EF
+:10191000E9FA014640F2ED3300F04AFA0FF20C40CA
+:10192000A6E600F0E8FE014640F2FB3300F040FA84
+:101930000BB0BDE8F04F0FF2244004F0E9BF0BB04C
+:10194000BDE8F08F476174745061727365536572BE
+:1019500076696365730000004556545F424C5545F7
+:101960005F4154545F524541445F42595F47524F73
+:1019700055505F545950455F52455350202D2043D8
+:101980006F6E6E656374696F6E5F48616E646C65DF
+:101990003D3078253034582C417474726962757406
+:1019A000655F446174615F4C656E6774683D256472
+:1019B0002C446174615F4C656E6774683D256420DA
+:1019C000210A0000696E76616C69642055554944AE
+:1019D0003D30782530345820666F756E64205B2565
+:1019E00030345820253034585D210A006E756D530F
+:1019F0006572763D25642F25642C73686F727420A0
+:101A0000555549443D30782530345820464F554E81
+:101A1000442048616E646C653D3078253034582030
+:101A20005365727669636548616E646C65205B30EE
+:101A30007825303458202D203078253034585D20DA
+:101A40000A0D000055554944203A00004741505FB7
+:101A5000534552564943455F555549443D307825D5
+:101A600030345820666F756E64205B253034582002
+:101A7000253034585D210A0047454E455249435FA1
+:101A80004154545249425554455F53455256494377
+:101A9000455F555549443D30782530345820666FB0
+:101AA000756E64205B2530345820253034585D2114
+:101AB0000A000000414D535F534552564943455F6C
+:101AC000555549443D30782530345820666F756E41
+:101AD00064205B2530345820253034585D210A00BD
+:101AE0004C494E4B5F4C4F53535F534552564943FD
+:101AF000455F555549443D30782530345820666F50
+:101B0000756E64205B2530345820253034585D21B3
+:101B10000A00000054585F504F5745525F534552DA
+:101B2000564943455F555549443D30782530345832
+:101B300020666F756E64205B253034582025303464
+:101B4000585D210A0000000043555252454E545F33
+:101B500054494D455F534552564943455F55554994
+:101B6000443D30782530345820666F756E64205BB4
+:101B70002530345820253034585D210A00000000FB
+:101B80005245464552454E43455F555044415445A4
+:101B90005F54494D455F534552564943455F55553E
+:101BA00049443D30782530345820666F756E642086
+:101BB0005B2530345820253034585D210A00000060
+:101BC0004E4558545F4453545F4348414E47455F28
+:101BD000534552564943455F555549443D30782554
+:101BE00030345820666F756E64205B253034582081
+:101BF000253034585D210A00474C55434F53455F0B
+:101C0000534552564943455F555549443D30782523
+:101C100030345820666F756E64205B253034582050
+:101C2000253034585D210A004845414C54485F54E2
+:101C30004845524D4F4D455445525F5345525649C4
+:101C400043455F555549443D30782530345820662A
+:101C50006F756E64205B2530345820253034585D14
+:101C6000210A00004445564943455F494E464F52BC
+:101C70004D4154494F4E5F534552564943455F5578
+:101C80005549443D30782530345820666F756E6470
+:101C9000205B2530345820253034585D210A00005F
+:101CA000556E6B6F776E20555549443D3078253021
+:101CB000345820666F756E64205B253034582025BB
+:101CC0003034585D210A000050484F4E455F414C6A
+:101CD0004552545F534552564943455F5555494413
+:101CE0003D30782530345820666F756E64205B2552
+:101CF00030345820253034585D210A004241545474
+:101D00004552595F534552564943455F55554944DD
+:101D10003D30782530345820666F756E64205B2521
+:101D200030345820253034585D210A00414E435349
+:101D30005F534552564943455F555549443D3078B8
+:101D40002530345820666F756E64205B253034581A
+:101D500020253034585D210A000000004556545FAC
+:101D6000424C55455F4154545F524541445F42598E
+:101D70005F47524F55505F545950455F524553503D
+:101D80002C206661696C6564206E6F2066726565E3
+:101D900020696E64657820696E20636F6E6E65637E
+:101DA00074696F6E207461626C6520210A0D0000F9
+:101DB0005A46484604F0ACBD27A004F0A9BD2DE961
+:101DC000F0470446DFF88080244D0FF2940900F0BC
+:101DD00092FC014640F20B434A46FFF7A9FA2379E9
+:101DE000628821880FF2900004F092FD20796788C4
+:101DF000132814BF05280326A0198678C178007916
+:101E000041EA002A00F077FC014640F224434A46AA
+:101E1000FFF78EFA53463A4631460FF2D800DFF804
+:101E2000406C04F075FD002504E020446D1C4179F0
+:101E300001F05DFA2179E8B28842F6D3BDE8F047B7
+:101E400005A004F065BD000060680008EC5B0020A0
+:101E5000FB320008511000080A0D00004C68000811
+:101E6000476174745061727365436861727342793B
+:101E700055554944000000004556545F424C5545B5
+:101E80005F474154545F444953435F524541445F67
+:101E9000434841525F42595F555549445F5245534B
+:101EA00050202D20436F6E6E656374696F6E5F48BE
+:101EB000616E646C653D3078253034582C41747403
+:101EC0007269627574655F48616E646C653D3078F7
+:101ED00025303458204174747269627574655F5698
+:101EE000616C75655F4C656E6774683D25640A0DAD
+:101EF000000000004368617250726F70657274690F
+:101F000065733D30782530325820436861725374D0
+:101F100061727448616E646C653D30782530345868
+:101F2000204368617256616C756548616E646C65CA
+:101F30003D307825303458200A0D00002DE9F14F4E
+:101F4000DFF8208B88B000F0D6FBDFF81C9B0FF287
+:101F5000083A014640F23C4300F0C8FB0898C378B9
+:101F6000827801880FF2003004F0D2FC089AB94858
+:101F700013884188994240F05B8111468A78C9787C
+:101F80000B4693FBF2F3DBB2152A079303D10C2324
+:101F9000052410250493072A03D1002205240225D5
+:101FA0000492491E089AD17000216D1E00F2A270A1
+:101FB0008DF808100695039028E000F09CFB014680
+:101FC00040F2A54300F092FB0FF2043010E042F61D
+:101FD000A6208345F1D1039806800398458000F040
+:101FE0008AFB014640F2A34300F080FB0FF2103061
+:101FF0002B463246594604F08BFC08998878041920
+:102000009DF80800401CE4B28DF808009DF80870A7
+:102010000798874280F21A810898204410F8016CD2
+:10202000017846EA0126417805918578C0780899BB
+:1020300045EA0025049800F04BFB52EA002B1CBF38
+:1020400005980028D9D0002E18BF002DD5D000F05B
+:1020500052FB014640F2664300F048FB059B0FF23D
+:10206000DC20019500965A46394604F051FC0FF2E7
+:10207000383004F04DFC069F02E0089900F02EFB7A
+:10208000002FFAD5FFF798FEBBF5285F09D100F0C5
+:1020900032FB014640F26E4300F028FB0FF218308D
+:1020A000A6E742F6012083450FF23C370BD100F042
+:1020B00022FB01464FF48E6300F018FB2B4632469C
+:1020C0005946384697E742F60220834509D100F089
+:1020D00012FB014640F2724300F008FB0FF2383069
+:1020E00086E742F60320834505D100F004FB014654
+:1020F00040F27443E0E742F60420834505D100F046
+:10210000FAFA014640F27643D6E742F605208345C7
+:102110000ED10398868140460399CD8104F0E2FEFA
+:10212000014640F27C4300F0E1FA0FF228305FE70D
+:1021300042F61920834509D100F0DDFA014640F24C
+:102140007F4300F0D3FA0FF2503051E742F62B20D4
+:10215000834509D100F0CFFA014640F2824300F0F6
+:10216000C5FA0FF2683043E742F60F20834509D1E4
+:1021700000F0C1FA014640F2844300F0B7FA0FF2D2
+:10218000803035E742F62920834509D100F0B3FAC3
+:10219000014640F2874300F0A9FA0FF2A03027E78A
+:1021A00042F62420834509D100F0A5FA014640F209
+:1021B000894300F09BFA0FF2D03019E741F20D206D
+:1021C00083450ED10398068340460399CD8304F0DE
+:1021D00089FE01464FF4926300F088FA0FF2F03066
+:1021E00006E74DF6F30083450ED10398468340463B
+:1021F00003990D8404F076FE014640F2964300F008
+:1022000075FA0FF20C40F3E64CF2E96083457FF477
+:10221000DEAE03988683404603994D8404F062FE47
+:10222000014640F29C4300F061FA0FF21C40DFE6E9
+:1022300000F061FA01464FF4966300F057FA09B0D6
+:10224000BDE8F04F0FF2384004F062BB09B0BDE8C2
+:10225000F08F0000C04100204761747450617273B8
+:1022600065436861727300004556545F424C5545A2
+:102270005F4154545F524541445F42595F54595045
+:10228000455F52455350202D20436F6E6E65637439
+:10229000696F6E5F48616E646C653D307825782C9F
+:1022A00048616E646C655F56616C75655F5061690D
+:1022B000725F4C656E6774683D25642C446174617F
+:1022C0005F4C656E6774683D25640A0D0000000070
+:1022D000556E6B6E6F776E5F6368617220555549FE
+:1022E000443D30782530345820666F756E64205B2D
+:1022F0002530345820253034585D210A0000000074
+:1023000043454E5452414C5F414444524553535F00
+:102310005245534F4C5554494F4E5F555549443DD6
+:1023200030782530345820666F756E64205B253018
+:10233000345820253034585D210A00002D2D2047C7
+:10234000415454203A206E756D48646C6556616C3A
+:102350007565506169723D25642C73686F727420D5
+:10236000555549443D30782530345820464F554E18
+:1023700044204368617250726F706572746965734E
+:102380003D307825303458204368617248616E646E
+:102390006C65205B307825303458202D203078252E
+:1023A0003034585D0A0000000A0D2046756C6C2020
+:1023B00055554944203A000047415020444556496C
+:1023C00043455F4E414D455F555549443D30782565
+:1023D00030345820666F756E64205B253034582089
+:1023E000253034585D210A00474150204150504566
+:1023F0004152414E43455F555549443D3078253063
+:10240000345820666F756E64205B25303458202563
+:102410003034585D210A0000474150205045524950
+:1024200050484552414C5F505249564143595F46CE
+:102430004C41475F555549443D307825303458204C
+:10244000666F756E64205B25303458202530345813
+:102450005D210A0047415454205345525649434593
+:102460005F4348414E4745445F43484152414354CE
+:10247000455249535449435F555549443D307825A9
+:1024800030345820666F756E64205B2530345820D8
+:10249000253034585D210A00424154544552595F59
+:1024A0004C4556454C5F434841525F555549443D64
+:1024B00030782530345820666F756E64205B253087
+:1024C000345820253034585D210A000043555252BB
+:1024D000454E545F54494D455F434841525F555501
+:1024E00049443D30782530345820666F756E64203D
+:1024F0005B2530345820253034585D210A00000017
+:102500004C4F43414C5F54494D455F494E464F52F5
+:102510004D4154494F4E5F434841525F55554944E0
+:102520003D30782530345820666F756E64205B2509
+:1025300030345820253034585D210A0044657669CE
+:102540006365496E666F726D6174696F6E53657213
+:1025500076696365204D414E554641435455524579
+:10256000525F4E414D455F555549443D30782530C9
+:10257000345820666F756E64205B253034582025F2
+:102580003034585D210A0000446576696365496E00
+:10259000666F726D6174696F6E536572766963659B
+:1025A000204D4F44454C5F4E554D4245525F555569
+:1025B00049443D30782530345820666F756E64206C
+:1025C0005B2530345820253034585D210A00000046
+:1025D000414E43535F4E4F54494649434154494F3E
+:1025E0004E5F534F555243455F434841525F5555E7
+:1025F00049443D30782530345820666F756E64202C
+:102600005B2530345820253034585D210A00000005
+:10261000414E43535F434F4E54524F4C5F504F49CE
+:102620004E545F434841525F555549443D307825EB
+:1026300030345820666F756E64205B253034582026
+:10264000253034585D210A00414E43535F444154C4
+:10265000415F534F555243455F434841525F555583
+:1026600049443D30782530345820666F756E6420BB
+:102670005B2530345820253034585D210A00000095
+:102680004556545F424C55455F4154545F52454155
+:10269000445F42595F545950455F524553502C2076
+:1026A0006661696C65642068616E646C65206E6F3C
+:1026B0007420666F756E6420696E20636F6E6E6540
+:1026C0006374696F6E207461626C6520210A0D006D
+:1026D00000190A1D125C084440797047DFF8800336
+:1026E0000A1D39197F1E515C04F012B95246484642
+:1026F00004F00EB92070404604F0F4BB2DE9F04F11
+:102700000646DFF8608387B0FFF7F5FFDFF858A3D0
+:102710000FF2583B014640F2BE4300F00FFCF37845
+:10272000B27831880FF2543004F0F2F8DFF8182E46
+:1027300031885088884240F08181B078012803D1E7
+:1027400002244FF000090425022803D102244FF08F
+:102750000C09122502F5F662F078DFF8F07D02929E
+:10276000E9B2039690FBF1F1CDF81890C9B2059546
+:102770000020049121E004F0B5FB014640F2315302
+:1027800000F0DCFB0FF254300DE042F6A62086424A
+:102790004046F0D104F0A6FB014640F22F5300F072
+:1027A000CDFB0FF274302A46314604F0B1F805989B
+:1027B00004199DF80400E4B2401C8DF804009DF853
+:1027C00004100498814280F247810398811C00190B
+:1027D0000D5DC078039945EA0025069800190A1D89
+:1027E000165C0844407946EA0026B6F5205F09D118
+:1027F000FFF781FF014640F2E14300F09FFB0FF23B
+:102800005C30D0E742F6030086420ED100203880CB
+:10281000B880F8807D80FFF76EFF014640F2ED43FF
+:1028200000F08CFB0FF26030BDE7B6F5245F1CBFF3
+:1028300042F60210864240D1FD800299B8880A888B
+:102840000FF2803990420FD14D80FFF754FF40F2D4
+:10285000F743014600F072FB0095BB887A88314649
+:10286000484604F055F8A2E70A8A904205D1CD8285
+:10287000FFF741FF40F2FB43EBE78A8A904205D124
+:102880004D83FFF738FF40F2FF43E2E74A8A904268
+:1028900005D10D83FFF72FFF40F20353D9E7FFF770
+:1028A0002AFF014640F2055300F048FB0095BB8823
+:1028B0007A880FF23C303146D3E73E80B6F5285F88
+:1028C000BD8009D1FFF717FF014640F20E5300F01B
+:1028D00035FB0FF25C3066E742F6012086420FF2CC
+:1028E0007C390AD1FFF707FF01464FF4A26300F0DD
+:1028F00025FB2A463146484657E742F602208642E3
+:1029000009D1FFF7F8FE014640F2125300F016FB22
+:102910000FF2743047E742F60320864205D1FFF7F5
+:10292000EAFE014640F21453E1E742F604208642F3
+:1029300005D1FFF7E0FE014640F21653D7E742F615
+:102940000520864209D1FFF7D6FE014640F2195311
+:1029500000F0F4FA0FF2683025E742F619208642BB
+:1029600009D1FFF7C8FE014640F21C5300F0E6FA19
+:102970000FF2903017E742F62B20864209D1FFF77D
+:10298000BAFE014640F21F5300F0D8FA0FF2A4300D
+:1029900009E742F60F20864209D1FFF7ACFE014657
+:1029A00040F2215300F0CAFA0FF2B830FBE642F6CB
+:1029B0002920864209D1FFF79EFE014640F22453AA
+:1029C00000F0BCFA0FF2D430EDE642F62420864245
+:1029D00009D1FFF790FE014640F2265300F0AEFA0F
+:1029E0000FF20040DFE641F20D20864209D1FFF7E9
+:1029F00082FE014640F2295300F0A0FA0FF228406F
+:102A0000D1E64DF6F300864209D1FFF774FE014688
+:102A100040F22B5300F092FA0FF25040C3E64CF212
+:102A2000E96086427FF4B1AEFFF765FE014640F2F1
+:102A30002D5300F083FA0FF27440B4E6FFF75BFE0B
+:102A4000014640F2395300F079FA07B0BDE8F04F83
+:102A50000FF2944003F05CBF07B0BDE8F08F0000B8
+:102A600008690008606800084C68000847617474D1
+:102A70005061727365446573637300004556545F1B
+:102A8000424C55455F4154545F46494E445F494E60
+:102A9000464F524D4154494F4E5F52455350202DA1
+:102AA00020436F6E6E656374696F6E5F48616E641C
+:102AB0006C653D307825782C466F726D61743D25CC
+:102AC000642C4576656E745F446174615F4C656E1D
+:102AD0006774683D25640A0D0000000020696E7669
+:102AE000616C696420636861722076616C75652031
+:102AF000555549443D30782530345820436861723B
+:102B000056616C756548616E646C65205B25303478
+:102B1000585D210A00000000202043454E545241D8
+:102B20004C5F414444524553535F5245534F4C55BB
+:102B300054494F4E5F555549443D307825303458FF
+:102B4000204368617256616C756548616E646C659E
+:102B5000205B253034585D210A0000005052494D59
+:102B60004152595F534552564943455F5555494473
+:102B70003D3078253034582068616E646C653D3096
+:102B800078253034580A0D00726573657420434807
+:102B90004152414354455249535449435F55554965
+:102BA000443D307825303458204368617253746155
+:102BB000727448616E646C653D3078253034580A13
+:102BC0000D000000757569643D307825303458205B
+:102BD00068616E646C653D3078253034582D3078EE
+:102BE000253034582D3078253034580A0D0A0D0020
+:102BF00020756E6B6F776E5F636861725F6465737B
+:102C00006320555549443D3078253034582068615B
+:102C10006E646C653D3078253034582D3078253021
+:102C200034582D307825303458200A0D000000002B
+:102C3000474150204445564943455F4E414D455F0D
+:102C4000555549443D30782530345820666F756EAF
+:102C500064205B253034585D210A00004741502034
+:102C6000415050454152414E43455F555549443DC1
+:102C700030782530345820666F756E64205B2530BF
+:102C800034585D210A000000474150205045524908
+:102C900050484552414C5F505249564143595F4656
+:102CA0004C41475F555549443D30782530345820D4
+:102CB000666F756E64205B253034585D210A000014
+:102CC00020534552564943455F4348414E4745448A
+:102CD0005F43484152414354455249535449435F2D
+:102CE000555549443D307825303458204368617249
+:102CF00056616C756548616E646C65205B25303487
+:102D0000585D0A00424154544552595F4C4556455E
+:102D10004C5F434841525F555549443D307825301A
+:102D2000345820666F756E64205B253034585D2101
+:102D30000A00000043555252454E545F54494D45D8
+:102D40005F434841525F555549443D307825303402
+:102D50005820666F756E64205B253034585D210AFB
+:102D6000000000004C4F43414C5F54494D455F49C2
+:102D70004E464F524D4154494F4E5F434841525F7A
+:102D8000555549443D30782530345820666F756E6E
+:102D900064205B253034585D210A00004465766963
+:102DA0006365496E666F726D6174696F6E536572AB
+:102DB00076696365204D414E554641435455524511
+:102DC000525F4E414D455F555549443D3078253061
+:102DD000345820666F756E64205B253034585D2151
+:102DE0000A000000446576696365496E666F726D1E
+:102DF0006174696F6E53657276696365204D4F44E7
+:102E0000454C5F4E554D4245525F555549443D3006
+:102E1000782530345820666F756E64205B25303419
+:102E2000585D210A0000000020414E43535F4E4F81
+:102E300054494649434154494F4E5F534F555243BD
+:102E4000455F434841525F555549443D30782530F0
+:102E50003458204368617256616C756548616E64D0
+:102E60006C65205B253034585D210A002020414EDE
+:102E700043535F434F4E54524F4C5F504F494E5453
+:102E80005F434841525F555549443D3078253034C1
+:102E900058204368617256616C756548616E646C58
+:102EA00065205B253034585D210A000020414E43E7
+:102EB000535F444154415F534F555243455F43482C
+:102EC00041525F555549443D3078253034582043B0
+:102ED00068617256616C756548616E646C65205BF3
+:102EE000253034585D210A004556545F424C554503
+:102EF0005F4154545F46494E445F494E464F524DE0
+:102F00004154494F4E5F524553502C206661696CC5
+:102F100065642068616E646C65206E6F7420666FF6
+:102F2000756E6420696E20636F6E6E656374696F81
+:102F30006E207461626C6520210A0D005A4650466D
+:102F400003F0E6BC2DE9F0470446DFF8BC9CA0B0D6
+:102F500000F0D0F90146DFF8B4AC0FF29C1840F253
+:102F600043534246FFF7EBFF2379628821880FF233
+:102F7000A01003F0CDFCDFF8D005228841889142F3
+:102F800040F0AA8000F5F8656188288881420AD15E
+:102F900000F0B0F9014640F249534246FFF7CFFF37
+:102FA0000FF2D41018E0A888814248460AD103F0F5
+:102FB00099FF014640F24B534246FFF7C0FF0FF224
+:102FC000DC1009E003F08EFF014640F24D5342460B
+:102FD000FFF7B5FF0FF2E010DFF83C6E03F098FC4E
+:102FE000002704E0601DF9B27F1C00F07FF9217911
+:102FF000F8B28842F6D3FEF7DFFE6088298888425F
+:103000001ED100F077F9014640F257534246FFF7D0
+:1030100096FF0FF2BC1003F07BFC6779A679D4F819
+:1030200009000090237AE27931463846FDF773FEB5
+:1030300037B9F00704D43046FDF74EFFFEF74EF8DF
+:103040006088A988884253D165796846802103F059
+:10305000B7FF00F04FF9014640F27B534246FFF7BD
+:103060006EFF0FF28C1003F053FC9DB900F042F993
+:1030700001464FF4B0634246FFF761FF0FF28C1038
+:1030800003F046FC2079411F04F10A0289B20020B6
+:10309000FDF7EEFC012D1CD100F02CF9014640F2A9
+:1030A000AE534246FFF74BFF0FF2C41003F030FC63
+:1030B000A11D684604F0CAFAA01D04F0EDFAE11D56
+:1030C00082B20A442179081A811E89B20120FDF7D3
+:1030D000CFFCFEF703F80BE000F00CF9014640F2DC
+:1030E000BF534246FFF72BFF0FF2B41003F010FC62
+:1030F00020B0BDE8F08700004761747450617273BE
+:10310000654E6F74696669636174696F6E00000073
+:103110004556545F424C55455F474154545F4E4FAE
+:1031200054494649434154494F4E202D20436F6E28
+:103130006E656374696F6E5F48616E646C653D3087
+:103140007825782C4174747269627574655F486182
+:103150006E646C653D3078253034582C417474723F
+:1031600069627574655F56616C75655F4C656E6705
+:1031700074683D25640A0D00414E43534E6F7469D7
+:103180006669636174696F6E536F757263654368D6
+:10319000617256616C7565203A200000414E4353C0
+:1031A00044617461536F75726365436861725661FF
+:1031B0006C7565203A200000414E43534E6F746990
+:1031C0006669636174696F6E203A0A0D0000000041
+:1031D000726563656976656420424153494320699D
+:1031E0006E666F726D6174696F6E203A200A0D0011
+:1031F00050617273652044657461696C20496E6624
+:103200006F6D6174696F6E73200A0D005061727387
+:103210006520436F6D6D616E6449444765744E6F00
+:1032200074696669636174696F6E4174747269620E
+:103230007574657320526573706F6E7365203A20E4
+:1032400044657461696C20496E666F6D6174696F65
+:103250006E206F66204E6F74696669636174696F72
+:103260006E20417474726962757465200A0D0000E5
+:10327000506172736520436F6D6D616E64494447A0
+:1032800065744170704174747269627574657320FD
+:10329000526573706F6E7365203A200A0D0000004E
+:1032A0004556545F424C55455F474154545F4E4F1D
+:1032B00054494649434154494F4E2C206661696C3C
+:1032C00065642068616E646C65206E6F7420666F43
+:1032D000756E6420696E20636F6E6E656374696FCE
+:1032E0006E207461626C6520210A0D00415C3046DD
+:1032F00003F00EBB484603F0F5BDFEB5044660780A
+:10330000FF282FD1B4F80300DFF800590FF2402650
+:10331000DFF8F47840F60141401A6FD0801E00F0CB
+:103320009580401E2ED0401E4AD0401E1BD0001F4C
+:103330000AD0401F53D0401E00F0AD80401E00F068
+:10334000E280401E2DD0F0E000F0A8FC014640F2E3
+:10335000DC53FDF7ECFF0FF2142003F0D9FA601DE7
+:10336000FEF73FF9EEE000F099FC014640F2E3532E
+:10337000FDF7DDFF0FF21C2003F0CAFA601DFEF717
+:10338000DDFDDFE000F08AFC014640F2EA53FDF784
+:10339000CEFF0FF2242003F0BBFA601DFFF7AEF959
+:1033A000D0E000F07BFC014640F2F253FDF7BFFF96
+:1033B0000FF22C2003F0ACFA601DFEF700FDC1E017
+:1033C00000F06CFC014640F2FA53FDF7B0FF0FF23B
+:1033D0003C2003F09DFA601DFDF7C0FFB2E000F055
+:1033E0005DFC014640F20263FDF7A1FF0FF24420AD
+:1033F00003F08EFA601DFFF7A5FDA3E000F04EFC80
+:10340000014640F20D63FDF792FFB4F80B30B4F8BB
+:103410000920B4F807100FF23C20DFF8FC6903F034
+:1034200077FA002505E004F10D00E9B26D1CFFF705
+:103430005DFFB4F80B10E8B28842F4D3B4F80D2065
+:103440000FF27020114603F063FA7BE000F026FCD7
+:10345000014640F21D63FDF76AFFB4F80720B4F897
+:1034600005100FF2782003F053FA00F017FC014624
+:1034700040F21F63FDF75BFF0FF2B02003F048FA44
+:103480000F208DF8040001A8B4F80510ADF806105F
+:1034900002F022FE56E0E079002838460DD103F014
+:1034A00021FD014640F22B63FDF741FFB4F8051002
+:1034B0000FF2BC2003F02CFA0DE003F013FD0146DF
+:1034C00040F22F63FDF733FFE279B4F805100FF2F5
+:1034D000E82003F01DFA1C484188B4F80500814239
+:1034E00005D1DFF83809406803F0E6FF2AE000F074
+:1034F000D5FB014640F23763FDF719FF0FF2183094
+:1035000003F006FA1EE000F0C9FB014640F23E63FC
+:10351000FDF70DFFA07A00902389E279B4F8051039
+:103520000FF2483003F0F4F90CE000F0B7FB01466D
+:1035300040F24363FDF7FBFEB4F803100FF2DC30FA
+:1035400003F0E6F90020FEBDC0410020105C002021
+:10355000414E43535F436C69656E745F4576656E9B
+:10356000745F48616E646C657200000020455654BB
+:103570005F424C55455F4154545F524541445F4260
+:10358000595F47524F55505F545950455F5245530C
+:10359000500A0000204556545F424C55455F415447
+:1035A000545F524541445F42595F545950455F5200
+:1035B0004553500A00000000204556545F424C55C8
+:1035C000455F4154545F46494E445F494E464F5211
+:1035D0004D4154494F4E5F524553500A0000000080
+:1035E000204556545F424C55455F474154545F4413
+:1035F0004953435F524541445F434841525F4259FA
+:103600005F555549445F524553500A002045565472
+:103610005F424C55455F4154545F46494E445F42BA
+:10362000595F545950455F56414C5F524553500ABB
+:1036300000000000204556545F424C55455F47410D
+:1036400054545F4E4F54494649434154494F4E0AE2
+:10365000000000004556545F424C55455F474154B9
+:10366000545F4154545249425554455F4D4F44496B
+:103670004649454420417474725F48616E646C65CC
+:103680003D307825303458204F66667365743D3080
+:10369000782530345820417474725F446174615FDE
+:1036A0004C656E6774683D307825303458200A0DBB
+:1036B000000000000A0D20474150204170706561F4
+:1036C00072616E63652043617465676F72793D3026
+:1036D00078253034583D2564200A0D004556545F46
+:1036E000424C55455F4154545F45584348414E470D
+:1036F000455F4D54555F5245535020436F6E6E6584
+:103700006374696F6E5F48616E646C653D307825E7
+:10371000303458205365727665725F52585F4D544D
+:1037200055203D202564200A000000004556545FC6
+:10373000424C55455F4154545F45584348414E47BC
+:10374000455F4D54555F52455350203D3D3E20410D
+:103750004E43535F4D54555F45584348414E47458E
+:103760005F434F4D504C455445200A0D000000006A
+:103770004556545F424C55455F474154545F505243
+:103780004F4345445552455F434F4D504C4554457A
+:10379000202D20436F6E6E656374696F6E5F4861A4
+:1037A0006E646C653D3078253034782C20737563F9
+:1037B00063657373200A0D004556545F424C5545AE
+:1037C0005F474154545F50524F4345445552455F03
+:1037D000434F4D504C455445202D20436F6E6E6530
+:1037E0006374696F6E5F48616E646C653D30782507
+:1037F0003034782C4572726F725F436F64653D3070
+:1038000078253032582028307834313A20466169A2
+:103810006C6564290A0D00004556545F424C5545BD
+:103820005F474154545F50524F4345445552455FA2
+:10383000434F4D504C4554452C206661696C65647E
+:103840002068616E646C65206E6F7420666F756EA3
+:103850006420696E20636F6E6E656374696F6E209D
+:103860007461626C6520210A0D0000004556545FAA
+:10387000424C55455F474154545F4552524F525F49
+:103880005245535020436F6E6E656374696F6E5F6F
+:1038900048616E646C653D3078253034582052653F
+:1038A000715F4F70636F64653D307825303258200A
+:1038B0004174747269627574655F48616E646C65A9
+:1038C0003D307825303458204572726F725F436FF7
+:1038D00064653D3078253032582028307830353ACC
+:1038E00020496E73756666696369656E74206175DB
+:1038F0007468656E7469636174696F6E2C307830BA
+:10390000413A20417474726962757465206E6F74F7
+:1039100020666F756E64290A00000000696E76618A
+:103920006C69642065636F64652030782530345895
+:103930000A00000080B500F041F8014640F25163F2
+:103940000FF2180200F02AF80FF22C0002F0E0FF4C
+:10395000DFF89C0A4088BDE804408CE0414E4353A8
+:103960005F4170705F4B6579427574746F6E314161
+:103970006374696F6E0000000A0D202A2A205465C6
+:10398000726D20434F4E4E454354494F4E202A2AD4
+:1039900020200A0D000000000FF208029B4802F0F0
+:1039A000B7BF0000414E43535F4E6F746966696351
+:1039B0006174696F6E5F436865636B00924803F0E2
+:1039C00091BA80B5FFF7FAFF014640F256630FF255
+:1039D0002C02FFF7E3FF0FF2400002F099FF3620C0
+:1039E0008DF80000DFF8081A4888ADF80200684634
+:1039F00002F072FBFDF772FB01BD0000414E435324
+:103A00005F4170705F4B6579427574746F6E3241BF
+:103A10006374696F6E000000526576696577207483
+:103A200068652050726545786973746564204E6FCF
+:103A300074696669636174696F6E200A0D00000025
+:103A400010B57148DFF8A84903F04CFA014640F27E
+:103A50005F630FF22802FFF7A1FF0FF23C0002F0B4
+:103A600057FFE07904F1080104F087F803F0D7FF6D
+:103A70006088BDE81040132103F0BFBF414E43539F
+:103A80005F4170705F4B6579427574746F6E33413E
+:103A90006374696F6E000000206163695F67617025
+:103AA0005F636C6561725F73656375726974795F7A
+:103AB00064622026206163695F6761705F72656D73
+:103AC0006F76655F626F6E6465645F646576696377
+:103AD000652026206163695F6761705F7465726D40
+:103AE000696E617465200A0D0000000080B5FFF763
+:103AF00065FF014640F267630FF22402FFF74EFFB5
+:103B00000FF23C0002F004FFDFF8E40800F10801C6
+:103B1000C07904F032F8BDE8014003F080BF000036
+:103B2000414E43535F4170705F52656D6F76655FC4
+:103B3000426F6E64696E675F496E666F00000000D9
+:103B4000206163695F6761705F636C6561725F7359
+:103B5000656375726974795F6462202620616369A8
+:103B60005F6761705F72656D6F76655F626F6E64CF
+:103B700065645F646576696365200A0D0000000076
+:103B8000F8B5DFF86C48204F204D0FF284066080B6
+:103B9000E17104F108015079607310792073D078D5
+:103BA000E0729078A0725078607210782072E0799C
+:103BB00003F0ADFF401E8041C00F207100F06EF891
+:103BC000014640F28363FDF7B2FB21790FF25C00FE
+:103BD00002F09EFE608802F02FFE9DF801106171D8
+:103BE0009DF80010A17170B900F058F8014640F23C
+:103BF0008C63FDF79CFB9DF800209DF801100FF2EF
+:103C0000580002F085FEF1BD606800084C680008AD
+:103C1000414E43535F4170705F506565725F426F04
+:103C20006E6465645F436865636B00006163695F30
+:103C30006761705F69735F6465766963655F626F12
+:103C40006E64656420506565725F426F6E64656482
+:103C50003D25640A000000006163695F6761705F71
+:103C60006765745F73656375726974795F6C657697
+:103C7000656C2053656375726974795F4D6F646517
+:103C80003D2025642C2053656375726974795F4CFF
+:103C90006576656C3D202564200A0D00384603F0EA
+:103CA00021B9F8B5DFF84877DFF8BC4E38780FF265
+:103CB0007015DFF8406712280FD017280BD01E2888
+:103CC0000FD033286BD0342877D0352800F083808C
+:103CD000372856D090E0032000E00520BDE8F240F0
+:103CE00082E1012000F07EFE022000F07BFE032036
+:103CF00000F078FE042000F075FE00F071F9014636
+:103D000040F2AA632A4602F09DFDBB797A7939799F
+:103D10000FF2241002F0FCFD07F2B67001880029B2
+:103D20001CBF4088002827D0387930B1012801BF56
+:103D300078790128B97901291ED1012000F054F9C0
+:103D400000F04EF9014640F2B3632A4602F07AFDD4
+:103D50000FF21C1002F0DCFD47F23050FDF7F3FAD1
+:103D600000F03EF9014640F2B5632A4602F06AFDD2
+:103D70000FF2281002F0CCFDBDE8F240052000F063
+:103D800031BE00F02DF9014640F2BF632A4602F031
+:103D900059FD0FF2341002F0BBFD002028E000F0C6
+:103DA0001FF9014640F2C6632A4602F04BFD0FF2AE
+:103DB000341002F0ADFD01201AE000F011F90146C7
+:103DC00040F2CD632A4602F03DFD0FF2641002F08E
+:103DD0009FFD02200CE000F003F9014640F2D4639D
+:103DE0002A4602F02FFD0FF2841002F091FD03200D
+:103DF000BDE8F24001F0B8BF00F0F2F8014640F231
+:103E0000DB632A4602F01EFD39780FF2B010BDE8E0
+:103E1000F44002F07DBD000008690008EC5B002062
+:103E2000414E43535F4170705F5570646174655FCC
+:103E30005365727669636500506565725F426F6EA7
+:103E40006465643D25642053656375726974795FA8
+:103E50004D6F64653D2025642C2053656375726940
+:103E600074795F4C6576656C3D202564200A0D00F1
+:103E700077616974696E6720666F722020455654B9
+:103E80005F424C55455F4741505F50414952494E52
+:103E9000475F434D504C54200A0D00007761697410
+:103EA000656420666F7220204556545F424C55452C
+:103EB0005F4741505F50414952494E475F434D5023
+:103EC0004C54200A0D000000414E43535F434845C7
+:103ED000434B5F4E4F54494649434154494F4E204E
+:103EE0000A0D000020414E43535F4745545F4E4F3B
+:103EF00054494649434154494F4E5F4154545249F5
+:103F000042555445203D3E20414E43535F50524F51
+:103F1000435F4745545F4E4F5449464943415449D6
+:103F20004F4E5F415454524942555445200A0D00AA
+:103F3000414E43535F4745545F4150505F41545495
+:103F4000524942555445203D3E20414E43535F5017
+:103F5000524F435F4745545F4150505F4154545264
+:103F60004942555445200A0D00000000414E43537C
+:103F70005F504552464F524D5F4E4F54494649435C
+:103F80004154494F4E5F414354494F4E203D3E20DE
+:103F9000414E43535F50524F435F504552464F523C
+:103FA0004D5F4E4F54494649434154494F4E5F413E
+:103FB0004354494F4E200A0D00000000696E76619F
+:103FC0006C696420616E63735F636F6E746578748F
+:103FD0002E73746174653D2564200A0D0000000095
+:103FE000304602F07FBF00002DE9FE43082847F26B
+:103FF0003055DFF8FC73DFF8706B0FF20049DFF823
+:10400000F4835BD8DFE810F0C601090049005B00CB
+:104010007C006A00A600D0000901102038700DF164
+:10402000060278880DF1070103F09AFC002845D1BB
+:10403000FEF761FB014640F2EF63FCF772FC9DF86E
+:1040400006209DF807100FF2C03002F061FC78885E
+:1040500003F04DFC50B9FEF74EFB014640F2F3630E
+:10406000FCF75FFC0FF2E03002F052FCFEF743FB7E
+:10407000014640F2F663FCF754FC0FF2004002F0F8
+:1040800047FC00F0ABFCFEF736FB01464FF4DF6364
+:10409000FCF747FC0FF23040A6E116203870FEF71F
+:1040A0002AFB01464FF4E063FCF73BFC0FF264404F
+:1040B00002F02EFC7888D04903F0BEFB96E1172071
+:1040C00000F088FC03F03FFDFEF715FB014640F2CF
+:1040D0000A73FCF726FC0FF2584085E11220387075
+:1040E000FEF709FB014640F21173FCF71AFC7988D0
+:1040F0000FF2A04002F00CFC788803F0A2FC75E1FE
+:10410000FEF7F9FA014640F21973FCF70AFC0FF2C8
+:10411000B84002F0FDFB132000F05CFC03F0CBFC88
+:1041200004000BD0FEF7E7FA014640F21E73FCF7DD
+:10413000F8FB21460FF2B84002F0EAFB00F04EFC1B
+:10414000FEF7D9FA014640F22273FCF7EAFB0FF2C0
+:10415000CC4049E1FEF7CFFA01464FF4E563FCF7A6
+:10416000E0FB0FF2E44002F0D3FB182000F032FC39
+:1041700003F054FB04000BD0FEF7BDFA014640F2F9
+:104180002E73FCF7CEFB21460FF2F04002F0C0FB8D
+:1041900000F024FCFEF7AFFA014640F23173FCF761
+:1041A000C0FB0FF214501FE11A2000F013FC03F0C3
+:1041B00060FB040040460BD102F094FE014640F241
+:1041C0003C73FCF7AEFB0FF2205002F0A1FB0BE0BA
+:1041D00002F088FE01464FF4E863FCF7A2FB21469B
+:1041E0000FF2445002F094FB78880DF106020DF1B5
+:1041F000070103F0B5FB00280ED1FEF77CFA01465B
+:1042000040F24673FCF78DFB9DF806209DF80710E1
+:104210000FF2645002F07CFBE8E00A20387001AA3B
+:1042200078880DF1050103F024FD0400404640F0BC
+:10423000A48002F057FE014640F25173FCF771FB77
+:104240009DF804209DF805100FF29C5002F060FBD1
+:104250009DF80500012804BF9DF8041001290BD129
+:10426000FEF749FA014640F25473FCF75AFB0FF28D
+:10427000A85002F04DFB0EE0FEF73DFA01464FF468
+:10428000EB63FCF74EFB9DF804209DF805100FF240
+:10429000B45002F03DFBFEF72EFA014640F25B738C
+:1042A000FCF73FFB0FF2CC5002F032FB0B203870D2
+:1042B00002230020009002227888002103F034FDC0
+:1042C0000028404609D102F00DFE01464FF4EC6390
+:1042D000FCF727FB0FF2B45008E002F003FE0146A2
+:1042E00040F26473FCF71DFB0FF2B85002F010FBB4
+:1042F00000F074FBFEF7FFF9014640F26773FCF72C
+:1043000010FB0FF2B85002F003FBFEF7F4F9014680
+:1043100040F26973FCF705FB0FF2CC5002F0F8FA9B
+:10432000788801AA0DF1050103F0A3FC04004046C2
+:104330000AD002F0D7FD014640F26D73FCF7F1FAA6
+:1043400021460FF2B45022E002F0CCFD014640F2CB
+:104350007173FCF7E6FA9DF805100FF2BC5002F0FD
+:10436000D7FAFEF7C8F9014640F27273FCF7D9FAA2
+:104370009DF804100FF2B05009E002F0B3FD0146C1
+:104380004FF4EF63FCF7CDFA21460FF2AC5002F088
+:10439000BFFA2BE0FEF7AFF9014640F27E73FCF75F
+:1043A000C0FA0FF2BC5002F0B3FA082038701321A3
+:1043B000788803F022FB04000BD0FEF79CF901463D
+:1043C00040F28373FCF7ADFA21460FF2AC5002F0D5
+:1043D0009FFA00F003FBFEF78EF9014640F2877367
+:1043E000FCF79FFA0FF2B45002F092FABDE8F7839F
+:1043F000C04100206068000807B2010047617050AA
+:10440000726F635265710000414E43535F534543E1
+:1044100055524954595F5245514553542053656391
+:1044200075726974795F4D6F64653D2025642C2039
+:1044300053656375726974795F4C6576656C3D2070
+:104440002564200A00000000414E43535F5345435A
+:1044500055524954595F524551455354206163693F
+:104460005F6761705F736C6176655F7365637572BA
+:104470006974795F72657120200A0D00414E4353C3
+:104480005F53454355524954595F52455145535422
+:104490002077616974696E6720666F722045565493
+:1044A0005F424C55455F4741505F534C4156455F15
+:1044B00053454355524954595F494E495449415413
+:1044C0004544200A0D000000414E43535F534543CD
+:1044D00055524954595F52455145535420776169AB
+:1044E00074656420666F72204556545F424C554592
+:1044F0005F4741505F534C4156455F5345435552CA
+:104500004954595F494E4954494154454420200A71
+:104510000D000000414E43535F504153535F4B45E4
+:10452000595F524553504F4E5345200A0D0000002D
+:104530004741505F50524F435F4E554D455249439E
+:104540005F434F4D50415249534F4E5F56414C557A
+:10455000455F434F4E4649524D202A2A20616369E8
+:104560005F6761705F6E756D657269635F636F6DC4
+:1045700070617269736F6E5F76616C75655F636F92
+:104580006E6669726D5F7965736E6F2D2D3E59454C
+:1045900053200A00414E43535F414C4C4F575F52EA
+:1045A00045424F4E44206163695F6761705F616C93
+:1045B0006C6F775F7265626F6E6428307825303477
+:1045C00058290A0D000000004741505F50524F43E8
+:1045D0005F50414952494E472073656E64696E676A
+:1045E0002070616972696E6720726571200A00002F
+:1045F0004741505F50524F435F50414952494E47E7
+:104600002070616972696E6720636D6420666169FC
+:104610006C7572653A20307825780A004741505F02
+:1046200050524F435F50414952494E4720636F6D8E
+:10463000706C657465206576656E7420726563655F
+:10464000697665640A0000004741505F50524F434D
+:104650005F415554484F52495A4154494F4E207377
+:10466000656E64696E6720417574686F72697A61FE
+:1046700074696F6E20726571200A00004741505FB7
+:1046800050524F435F415554484F52495A41544943
+:104690004F4E20417574686F72697A6174696F6EEC
+:1046A0002072657120636D64206661696C75726546
+:1046B0003A20307825780A004741505F50524F43E6
+:1046C0005F415554484F52495A4154494F4E206317
+:1046D0006F6D706C657465206576656E74207265AB
+:1046E0006365697665640A00414E43535F415554E2
+:1046F000484F52495A4154494F4E5F524553504FCB
+:104700004E5345206163695F6761705F61757468CE
+:104710006F72697A6174696F6E5F7265737020631E
+:104720006D64206F6B0A0000414E43535F41555446
+:10473000484F52495A4154494F4E5F524553504F8A
+:104740004E5345206163695F6761705F617574688E
+:104750006F72697A6174696F6E5F726573702063DE
+:104760006D64204E4F4B20737461747573203D301F
+:104770007825303258200A00414E43535F4155544A
+:10478000484F52495A4154494F4E5F524553504F3A
+:104790004E5345206163695F6761705F6765745F51
+:1047A00073656375726974795F6C6576656C207783
+:1047B00069746820424C4520342E322020536563B2
+:1047C00075726974795F4D6F64653D2025642C2096
+:1047D00053656375726974795F4C6576656C3D20CD
+:1047E0002564200A00000000414E43535F524541BA
+:1047F000445F50485920526561645F5048592073A6
+:104800007563636573732054583D2025642C2052D2
+:10481000583D202564200A004F726967696E616CFB
+:1048200020636F6E666967206973204C4520314DA7
+:10483000205048592C20636F7272656374200A0DF2
+:10484000000000004F726967696E616C20636F6ED3
+:10485000666967206E6F7420636F7272656374207F
+:1048600054583D2025782C2052583D202578200A88
+:104870000000000073656E64696E672053657420E4
+:1048800050687920726571200A00000073657420F9
+:104890004C4520324D2050485920636D64206F6B89
+:1048A0000A000000736574204C4520324D205048AA
+:1048B0005920636D64204E4F4B0A00004741505F02
+:1048C00050524F435F5345545F50485920636F6DBA
+:1048D000706C657465206576656E742072656365BD
+:1048E000697665640A00000052656164696E675FFD
+:1048F0005048590A000000005265616420706879D0
+:1049000020636D64206661696C7572653A20307849
+:104910002578200A00000000545820504859203DB6
+:104920002025640A00000000525820504859203DBC
+:104930002025640A000000006863695F6C655F728F
+:104940006561645F706879206572726F722072654C
+:1049500073756C743D307825303278200A0D000074
+:104960007465726D696E61746520636F6E6E6563E8
+:1049700074696F6E200A00005465726D20436F6E7B
+:104980006E656374696F6E20636D64206661696C27
+:104990007572653A20307825780A00004741505FEB
+:1049A00050524F435F5445524D494E4154455F4329
+:1049B0004F4E4E454354494F4E20636F6D706C65AA
+:1049C0007465206576656E742072656365697665C9
+:1049D000640A000038700121788870472846FCF787
+:1049E000B2BC00002DE9F04FDFF8D849DFF8D879E4
+:1049F000DFF874A1DFF8D4B9DFF8D489102885B0C6
+:104A000004F29A7547F23059D5A61BD8DFE810F0AA
+:104A100011004900BC000A018801EF0176027C0305
+:104A2000CC0325047E04A103A103A103FC022303FC
+:104A300050030D2020704FF404626088FA2103F0C7
+:104A4000E5F8002840F0BB84FDF755FE014640F232
+:104A50009C73FEF773FA4FF40462FA21DFF87409CD
+:104A600001F056FF0E202070608802F09BF801F0E4
+:104A700077F9002C404609D102F034FA014640F2A1
+:104A8000A273FEF75BFADFF85009AEE002F02AFAF3
+:104A9000014640F2A673FEF751FA2146DFF83C09C1
+:104AA000D6E21E2020700021D0208DF800008DF865
+:104AB00001102D208DF8020012218DF803101E2008
+:104AC0008DF804004B218DF805100F208DF806009D
+:104AD000A4218DF8071099208DF808004E218DF83B
+:104AE0000910CE208DF80A00B5218DF80B10312069
+:104AF0008DF80C00F4218DF80D1005208DF80E00B6
+:104B000079218DF80F106A466088022102F08DF835
+:104B1000040040460BD102F0E5F9014640F2B573BE
+:104B2000FEF70CFADFF8B80801F0F2FE0BE002F035
+:104B3000D9F9014640F2B973FEF700FA21460FF6A3
+:104B4000F40001F0E5FE01F0F2F8E88BA98B69B9F9
+:104B500000283FD1FDF7CFFD014640F2BF73FEF7BD
+:104B6000EDF9DFF8800840E04C68000800283ED0EE
+:104B7000FDF7C1FD014640F2C373FEF7DFF9EA8B92
+:104B8000A98B0FF60C10C8E01B202070608802F083
+:104B900032F8040040460BD102F0A4F9014640F27D
+:104BA000CF73FEF7CBF9DFF8400801F0B1FE0BE060
+:104BB00002F098F9014640F2D373FEF7BFF921469F
+:104BC000DFF8280801F0A4FE01F0B1F8E88BA98B0A
+:104BD00061B9002840F0F383FDF78DFD014640F2F6
+:104BE000D973FEF7ABF90FF61410E6E3002800F0D6
+:104BF000E683FDF780FD014640F2DD73FEF79EF986
+:104C0000EA8BA98BDFF8E80701F082FEFDF773FD60
+:104C1000014640F2DE73FEF791F96A8A298ADFF8CD
+:104C2000D4077AE01F20FDF765FD014640F2E973E5
+:104C3000FEF784F9A88B019000906B882A88618820
+:104C40000FF6001001F064FE6A882988608802F07F
+:104C50000FF80028404609D102F044F9014640F21D
+:104C6000F173FEF76BF9DFF8900708E002F03AF90C
+:104C7000014640F2F573FEF761F9DFF8800701F0B5
+:104C800047FE01F054F8298C00291CBFE88C00284D
+:104C90000CD0FDF730FD014640F2FB73FEF74EF9F4
+:104CA000EA8C298C0FF60C1001F032FEA98C002939
+:104CB0001CBF688D00280CD0FDF71DFD014640F299
+:104CC000FF73FEF73BF96A8DA98CDFF8340701F01A
+:104CD0001FFE698C00291CBF288D00280CD0FDF711
+:104CE0000AFD014640F60303FEF728F92A8D698C78
+:104CF0000FF6341001F00CFEA98A00291CBFE88AC7
+:104D000000280CD0FDF7F7FC014640F60703FEF73C
+:104D100015F9EA8AA98ADFF8EC0601F0F9FD4EE3FD
+:104D20002520FDF7E7FC014640F61103FEF706F9E2
+:104D30006A882988DFF8D00601F0EAFD6A882988A8
+:104D4000608801F0DEFF002840460BD102F0CAF86F
+:104D5000014640F61803FEF7F1F838460BE000BFB5
+:104D60000A0D000002F0BEF8014640F61C03FEF7F3
+:104D7000E5F8DFF8980601F0CBFD00F0D8FFA88D2C
+:104D800058B1FDF7B8FC014640F62203FEF7D6F80D
+:104D9000A98D0FF6FC0001F0BBFDE88D58B1FDF7C1
+:104DA000AAFC014640F62603FEF7C8F8E98D0FF687
+:104DB000281001F0ADFD288E58B1FDF79CFC01468E
+:104DC00040F62A03FEF7BAF8298EDFF8440601F010
+:104DD0009FFD288B0028A2D0FDF78DFC014640F6F0
+:104DE0002E03FEF7ABF8298B0FF62C1030E10120D3
+:104DF000298BADF8000001B32E2000F0A1FF00F0D8
+:104E000095FF002E40460CD102F06CF8014640F6AA
+:104E10004203FEF793F8298B0FF63C1001F078FD62
+:104E20000BE002F05FF8014640F64703FEF786F814
+:104E3000298BDFF8E00500F08FFF288E00282DD0A9
+:104E40002D212170FDF757FC01464FF40563FEF755
+:104E500075F82A8E61880FF6481001F059FD00F0B0
+:104E600075FF00F063FF002E40460BD102F03AF8C8
+:104E7000014640F65903FEF761F80FF6601001F0A5
+:104E800047FD0BE002F02EF8014640F65E03FEF708
+:104E900055F8298EDFF8800500F05EFFA88D002808
+:104EA00000F08D822C212170FDF725FC014640F693
+:104EB0006703FEF743F8AA8D61880FF6601001F0D2
+:104EC00027FDA98D00F043FF00F04AFF002C40466B
+:104ED00009D102F007F801464FF40763FEF72EF8F8
+:104EE000DFF8380569E201F0FDFF014640F6740382
+:104EF000FEF724F821460FF66810A9E00120298B5F
+:104F0000ADF8000001B3322000F01AFF00F00EFFF0
+:104F1000002E40460CD101F0E5FF014640F68A0321
+:104F2000FEF70CF8298BDFF8F80401F0F1FC0BE038
+:104F300001F0D8FF014640F68F03FDF7FFFF298BF4
+:104F40000FF66C1000F008FF288E00282DD03121BC
+:104F50002170FDF7D0FB014640F69803FDF7EEFF08
+:104F60002A8E6188DFF8BC0401F0D2FC00F0EEFE6E
+:104F700000F0DCFE002E40460BD101F0B3FF0146ED
+:104F800040F6A103FDF7DAFFDFF89C0401F0C0FC56
+:104F90000BE001F0A7FF014640F6A603FDF7CEFFA8
+:104FA000298E0FF6781000F0D7FEA88D002851D07A
+:104FB00030212170FDF79FFB014640F6AF03FDF75E
+:104FC000BDFFAA8D6188DFF8640401F0A1FCA98D02
+:104FD00000F0BDFE00F0C4FE002C404609D101F0F7
+:104FE00081FF014640F6B803FDF7A8FFDFF8400453
+:104FF000E3E101F077FF014640F6BC03FDF79EFFB9
+:1050000021460FF6841023E01D2020706A4641F6E9
+:105010000100ADF800000121608801F006FE00F0FB
+:105020009FFE002C404609D101F05CFF014640F68E
+:10503000CC03FDF783FFDFF8CC0EBEE101F052FF99
+:1050400001464FF40D63FDF779FF21460FF68810F6
+:1050500001F05EFCB3E12420FDF74CFB014640F675
+:10506000DB03FDF76BFF6B8A2A8A6188DFF8980EF5
+:1050700001F04EFC6A8A298A608801F0F9FD00F08F
+:105080006FFE002C404609D101F02CFF014640F68E
+:10509000E303FDF753FFDFF8740E8EE101F022FF0A
+:1050A000014640F6E703FDF749FF0FF6881084E15B
+:1050B0002A20FDF71FFB014640F6F103FDF73EFFF6
+:1050C0006A8A298A0FF6981001F022FC6A8A298AD6
+:1050D000608801F016FE00F043FE002C404609D126
+:1050E00001F000FF014640F6F803FDF727FFDFF867
+:1050F000200E62E101F0F6FE014640F6FC03FDF7EA
+:105100001DFFDFF8100E58E12020FDF7F3FA0146ED
+:1051100040F60713FDF712FFEB8BAA8B61880FF6A1
+:10512000881001F0F5FBEA8BA98B608801F0A0FDE7
+:1051300000F016FE002C404605D101F0D3FE0146DA
+:1051400040F60F137AE001F0CDFE014640F613134E
+:105150007EE02620FDF7CEFA01464FF41263FDF7FC
+:10516000EDFEEA8BA98B0FF6A01001F0D1FBEA8BC4
+:10517000A98B608801F0C5FD00F0F2FD002C4046CF
+:1051800008D101F0AFFE014640F62913FDF7D6FE27
+:10519000384612E101F0A6FE014640F62D13FDF758
+:1051A000CDFE0FF6A01008E1212020701D21BD20AA
+:1051B0008DF804008DF80510A2208DF806009921C5
+:1051C0008DF80710E6208DF8080025218DF80910CC
+:1051D00058208DF80A008C218DF80B10D9208DF8FD
+:1051E0000C0042218DF80D1001208DF80E00632176
+:1051F0008DF80F100D208DF8100012218DF8111070
+:10520000BF208DF812009F218DF813100F270FF685
+:10521000681001F07DFB00F08DFD7F1EFBD5304650
+:1052200001F076FB00F07AFD00F09AFD002C40467C
+:1052300009D101F057FE014640F64613FDF77EFE08
+:105240000FF66010B9E001F04DFE014640F64A133A
+:10525000FDF774FE0FF67C10AFE0222020707B215A
+:10526000FB208DF804008DF805107C208DF80600D9
+:10527000CE218DF807106A208DF80800B3218DF833
+:10528000091044208DF80A00BE218DF80B10B520BE
+:105290008DF80C004B218DF80D10D6208DF80E00E6
+:1052A00024218DF80F10E9208DF81000C6218DF80B
+:1052B0001110EA208DF8120022218DF813100F270B
+:1052C0000FF63C1001F024FB00F034FD7F1EFBD5EF
+:1052D000304601F01DFB00F021FD00F041FD002CE7
+:1052E000404609D101F0FEFD014640F66213FDF78C
+:1052F00025FE0FF6301060E001F0F4FD014640F6A7
+:105300006613FDF71BFE0FF6541056E023202070A5
+:10531000FD21D9208DF804008DF805008DF80710C7
+:10532000AA208DF806009B21BD208DF808008DF87D
+:10533000091021208DF80A0098218DF80B10A82063
+:105340008DF80C0049218DF80D10E1208DF80E002C
+:1053500045218DF80F10F3208DF81000D8218DF81D
+:105360001110D1208DF8120069218DF813100F272C
+:105370000FF6181001F0CCFA00F0DCFC7F1EFBD514
+:10538000304601F0C5FA00F0C9FC00F0E9FC002C41
+:10539000404609D101F0A6FD014640F67D13FDF718
+:1053A000CDFD0FF60C1008E001F09CFD014640F623
+:1053B0008113FDF7C3FD0FF6301001F0A9FA05B017
+:1053C000BDE8F08FC041002018210108181D010818
+:1053D00060680008241D0108701D0108941D010863
+:1053E000C81D0108141E0108741E0108C41E01080E
+:1053F000241F0108781F0108CC1F0108FC1F0108A9
+:105400002420010888200108EC200108445B0008E2
+:105410005421010894210108002201086C2201088E
+:10542000B4220108FC220108382301087C2301086A
+:10543000C0230108474154545F50524F435F4449D1
+:1054400053435F414E43535F5345525649434520B2
+:105450006163695F676174745F646973635F7072CD
+:10546000696D6172795F736572766963655F627990
+:105470005F7575696420636D64204E4F4B207374B3
+:1054800061747573203D307825303258200A000051
+:10549000474154545F50524F435F444953435F4127
+:1054A0004E43535F5345525649434520414E435363
+:1054B0002053657276696365205B307825303458F7
+:1054C000202D203078253034585D20697320666F98
+:1054D000756E6420212121203D3D3E20636F6E6E5C
+:1054E000656374656420746F20694F532050686F42
+:1054F0006E652F506164200A0D000000474154542E
+:105500005F50524F435F444953435F414C4C5F509F
+:1055100052494D4152595F534552564943455320D4
+:10552000414E435320536572766963652069732049
+:105530004E4F5420666F756E6420212121200A0D84
+:1055400000000000414E43535F444953434F5645CA
+:10555000525F414C4C5F434841525320636F6E6E23
+:10556000656374696F6E5F68616E646C653D307809
+:105570002530345820414C4C536572766963654838
+:10558000616E646C655B25303458202D20253034E5
+:10559000585D20414E435353657276696365486197
+:1055A0006E646C655B25303458202D2025303458CE
+:1055B0005D0A0000474154545F50524F435F4449D5
+:1055C00053435F414C4C5F434841525320414E434B
+:1055D000534E6F74696669636174696F6E536F755A
+:1055E00072636543686172537461727448646C6578
+:1055F0003D3078253034582020414E43534E6F744F
+:10560000696669636174696F6E536F757263654330
+:1056100068617256616C756548646C653D307825CB
+:10562000303458200A0D0000474154545F50524F07
+:10563000435F444953435F414C4C5F43484152539D
+:1056400020414E4353436F6E74726F6C506F696E9E
+:105650007443686172537461727448646C653D3060
+:1056600078253034582020414E4353436F6E747276
+:105670006F6C506F696E744368617256616C7565CA
+:1056800048646C653D307825303458200A0D0000A0
+:10569000474154545F50524F435F444953435F4125
+:1056A0004C4C5F444553435320414E43534E6F741B
+:1056B000696669636174696F6E536F757263654380
+:1056C0006861724465736348646C653D3078253069
+:1056D0003458200A0D000000474154545F50524F87
+:1056E000435F444953435F414C4C5F4445534353EC
+:1056F00020414E4353436F6E74726F6C506F696EEE
+:1057000074436861724465736348646C653D3078C6
+:1057100025303458200A0D00474154545F50524FF1
+:10572000435F444953435F414C4C5F4445534353AB
+:1057300020536572766963654368616E676564438B
+:105740006861724465736348646C653D30782530E8
+:105750003458200A0D000000536572766963654372
+:1057600068616E6765644368617244657363486429
+:105770006C653D307825303458206E6F74696669E9
+:10578000636174696F6E20656E61626C656420533D
+:1057900075636365737366756C6C79200A0D000020
+:1057A000414E43535F454E41424C455F4E4F544935
+:1057B0004649434154494F4E5F444154415F534F22
+:1057C000555243455F444553432030782530345883
+:1057D00020307825303458200A000000414E4353D1
+:1057E00044617461536F75726365436861724465A7
+:1057F000736348646C65206E6F7469666963617475
+:10580000696F6E20656E61626C65642053756363B9
+:1058100065737366756C6C79200A0D00414E4353B5
+:105820005F454E41424C455F4E4F544946494341C6
+:1058300054494F4E5F4E4F54494649434154494F96
+:105840004E5F534F555243455F4445534320307894
+:105850002530345820307825303458200A00000094
+:10586000414E43534E6F74696669636174696F6E2C
+:10587000536F75726365436861724465736348640E
+:105880006C65206E6F74696669636174696F6E2000
+:10589000656E61626C6564204661696C6564207246
+:1058A0006573756C743D3078253032580A000000FD
+:1058B000536572766963654368616E6765644368C2
+:1058C00061724465736348646C653D30782530349B
+:1058D00058206E6F74696669636174696F6E2064C5
+:1058E000697361626C6564204661696C656420421D
+:1058F0004C455F5354415455535F4E4F545F414C98
+:105900004C4F5745443D30782530327820726573CE
+:10591000756C743D3078253032580A00414E43533F
+:1059200044617461536F7572636543686172446565
+:10593000736348646C653D307825303458206E6F51
+:1059400074696669636174696F6E2064697361620A
+:105950006C6564204661696C656420424C455F5308
+:1059600054415455535F4E4F545F414C4C4F574533
+:10597000443D30782530327820726573756C743D03
+:105980003078253032580A00414E43534E6F7469C7
+:105990006669636174696F6E536F7572636543689E
+:1059A00061724465736348646C65206E6F746966E8
+:1059B00069636174696F6E2064697361626C6564A8
+:1059C000204661696C656420726573756C743D3046
+:1059D00078253032580A0000414E43535F44495302
+:1059E000434F5645525F474154545F5345525649C1
+:1059F0004345206163695F676174745F64697363C1
+:105A00005F7072696D6172795F73657276696365E3
+:105A10005F62795F7575696420636D64204E4F4BDA
+:105A200020737461747573203D30782530325820AE
+:105A30000A00000047415454206368617261637436
+:105A4000657269737469637320646973636F7665E3
+:105A50007279204661696C6564200A0D00000000BF
+:105A6000414E43535F444953434F5645525F53455C
+:105A700052564943455F4348414E4745445F43487A
+:105A800041525F4445534320474154545365727615
+:105A900069636548616E646C655B25303458202D00
+:105AA00020253034585D0A00414E43535F4449532A
+:105AB000434F5645525F4E4F54494649434154491E
+:105AC0004F4E5F534F555243455F43484152206309
+:105AD0006F6E6E656374696F6E5F68616E646C652E
+:105AE0003D30782530345820414E4353536572760B
+:105AF00069636548616E646C655B25303458202DA0
+:105B000020253034585D0A00414E43535F444953C9
+:105B1000434F5645525F4E4F5449464943415449BD
+:105B20004F4E5F534F555243455F434841525F4488
+:105B3000455343205B25303458202D2025303458E0
+:105B40005D0A0000416C6C2063686172616374657A
+:105B50007269737469632064657363726970746FCA
+:105B6000727320646973636F766572792046616928
+:105B70006C6564200A0D0000616E63735F6E6F7464
+:105B8000696669636174696F6E5F736F757263656F
+:105B90005F757569642E555549445F313238203A36
+:105BA00000000000414E43532063686172616374DA
+:105BB000657269737469637320646973636F766572
+:105BC000726564205375636365737366756C6C7975
+:105BD000200A0D00414E4353206368617261637473
+:105BE000657269737469637320646973636F766542
+:105BF0007279204661696C6564200A0D000000001E
+:105C0000616E63735F646174615F736F7572636506
+:105C10005F757569642E555549445F313238203AB5
+:105C2000000000006461746120736F757263652009
+:105C30006368617261637465726973746963206417
+:105C40006973636F7665726564205375636365730A
+:105C50007366756C6C79200A0D00000064617461D4
+:105C600020736F7572636520636861726163746528
+:105C700072697374696320646973636F766572799E
+:105C8000204661696C6564200A0D0000616E6373D3
+:105C90005F636F6E74726F6C5F706F696E745F7547
+:105CA0007569642E555549445F313238203A0000F9
+:105CB000636F6E74726F6C20706F696E74206368AE
+:105CC0006172616374657269737469632064697376
+:105CD000636F76657265642053756363657373667D
+:105CE000756C6C79200A0D00636F6E74726F6C2096
+:105CF000706F696E74206368617261637465726944
+:105D00007374696320646973636F76657279204682
+:105D100061696C6564200A0D0000000001A8009014
+:105D2000EA8BA98B6088022300F0B3BF0646484681
+:105D3000FBF70DBB01A90FF6D030C95D00F0E8BD3F
+:105D400020706B466088022201F014B8298E6088AA
+:105D50006B46022201F00EB83346462200F0D8BD51
+:105D600004464846FBF7F3BA2DE9F8430C27DFF861
+:105D7000F4460FF6D8250FF2A0180FF6E4290328F1
+:105D800086B004F5CC764FF6FF7157D8DFE800F007
+:105D9000020A577007B0372020701F20BDE8F0437B
+:105DA000FBF79AB8B4F8900733228842227001D0EA
+:105DB00080280CDBFDF79EFA014640F69E13424612
+:105DC000FBF7B6FAB4F890170FF2581064E0FDF73D
+:105DD00091FA014640F6A4134246FBF7A9FAB4F83B
+:105DE0009007784331580FF2781000F091FDB4F825
+:105DF000900747430121F05901908DF808108DF864
+:105E000009108DF80C108DF810108DF814108DF805
+:105E100015108DF816108DF817104FF49470ADF81A
+:105E20000A00ADF80E00ADF8120001A984B0684672
+:105E3000142200F091FD0FBCFAF7B8FB5FE03427A5
+:105E40002770FDF757FA014640F6BC134246FBF7B0
+:105E50006FFAA17B0FF2701004F10F0200F058FDF1
+:105E6000A07B04F10F0107B0BDE8F043FAF779BD5C
+:105E700035202070B4F89007884201D0802810DBCC
+:105E8000FDF738FA014640F6C6134246FBF750FAD2
+:105E9000B4F890170FF2741007B0BDE8F04300F0AB
+:105EA00037BDFDF727FA014640F6CC134246FBF713
+:105EB0003FFAB4F8901707FB01F0002332580FF2B5
+:105EC000881000F025FDB4F8900778430021305881
+:105ED000FAF755FCFDF70EFA014640F6D11342469B
+:105EE000FBF726FAB4F890170FF2B01000F010FD8F
+:105EF000B4F890074743E019002180F8901107B0EB
+:105F0000BDE8F0830C24010858240108B4240108DA
+:105F1000E42401082C250108416E637350726F63FD
+:105F200052657100414E43535F4745545F4E4F5495
+:105F3000494649434154494F4E5F415454524942A6
+:105F400055544520494E56414C49445F4E4F5449A3
+:105F500046595F454E545259202564200A0D0000D1
+:105F6000414E43535F4745545F4E4F544946494362
+:105F70004154494F4E5F4154545249425554452073
+:105F8000696E746572616374207769746820694F03
+:105F900053204E6F74696669636174696F6E49441A
+:105FA000203078253038782C2072657472696576D7
+:105FB00065206D6F726520696E666F726D617469C0
+:105FC0006F6E0A0D00000000414E43535F47455479
+:105FD0005F4150505F41545452494255544520410D
+:105FE00070704964656E7469666965724C656E6748
+:105FF00074683D2564204170704964656E746966FB
+:106000006965723A2573200A0D000000414E435322
+:106010005F504552464F524D5F4E4F54494649439B
+:106020004154494F4E5F414354494F4E20494E56CB
+:10603000414C49445F4E4F544946595F454E545276
+:1060400059202564200A0D00414E43535F504552AC
+:10605000464F524D5F4E4F54494649434154494F74
+:106060004E5F414354494F4E206E6F7469667945C7
+:106070006E7472793D2564204E6F74696669636140
+:1060800074696F6E49442030782530387820616318
+:106090007449443D2564200A0D000000414E4353DD
+:1060A0005F504552464F524D5F4E4F54494649430B
+:1060B0004154494F4E5F414354494F4E206E6F74D7
+:1060C000696679456E7472793D25642052656D6FFD
+:1060D0007665640A0D0000002DE9FC4101780FF29D
+:1060E0006C740FF288370FF27878DFF8785306294E
+:1060F0002ED009293AD00A2900F047810B2900F057
+:1061000051810C2900F05B810D2900F011810E29CD
+:1061100000F01B810F2900F02581112954D012298C
+:1061200000F0FA8014295DD0152935D017293FD009
+:10613000192900F0E5801B2900F055811D2900F088
+:106140006C811E2900F05C81362900F0748184E1A5
+:10615000408868801E202870FCF7CDFA014640F682
+:10616000E71300F06EFB0FF21C3072E1FCF7C3FA8C
+:10617000014640F6EF1300F064FB0FF23C3000F0F4
+:10618000C7FB2878082804BF0020FBF7D7F80920B0
+:106190002870FAF71DFF60E116202870FCF7ABFAB3
+:1061A000014640F6FB1300F04CFB0FF2283050E1A3
+:1061B00017202870FCF79FFA014640F6032300F0F1
+:1061C00040FB0FF2443044E111202870FCF793FAB1
+:1061D000014640F60B2300F034FB0FF2583000F07C
+:1061E00097FB89E0FCF787FA014640F6142300F09C
+:1061F00028FB29790FF2583000F08AFB688800F0FC
+:106200001BFB70B9FCF777FA014640F6182300F043
+:1062100018FB9DF800209DF801100FF2603000F08F
+:1062200077FB2879002805F2B6763CD1E87905F1AC
+:10623000080101F06CFC401E8041C00F2871FCF782
+:106240005AFA014640F6262300F0FBFA29790FF2AC
+:10625000843000F05DFBFCF74EFA014640F628233F
+:1062600000F0EFFA0FF2A430DFF8FC8100F050FBF1
+:106270000A247BA741460846411E0028FBD1384628
+:1062800000F046FB641EF5D16888132101F0B5FBD0
+:10629000002834D1308800281CBF718800292ED0F6
+:1062A000FAF796FE28E0012829D16879012801BF74
+:1062B000A97901299DF80100012817D19DF8001046
+:1062C000022913DBFCF717FA014640F6442300F0DD
+:1062D000B8FA9DF80020A9790FF2983000F018FB69
+:1062E0009DF80000A8719DF80100687130880028B1
+:1062F0001CBF7188002902D00020FBF71FF8ACE01A
+:106300001A202870FCF7F7F9014640F6522300F0F6
+:1063100098FA0FF2A4309CE012202870FCF7EBF9F9
+:10632000014640F65A2300F08CFA0FF2CC3090E090
+:10633000FCF7E1F9014640F6612300F082FA0FF222
+:10634000D03000F0E5FA0D2073E0FCF7D4F90146F7
+:1063500040F6692300F075FA0FF2CC3000F0D8FA5D
+:106360000E2066E0FCF7C7F9014640F6712300F005
+:1063700068FA0FF2C83000F0CBFA28780E2804BF74
+:106380000020FAF7DBFF0F202BE0FCF7B4F9014601
+:1063900040F67B2300F055FA0FF2C03000F0B8FA57
+:1063A0000A2046E0FCF7A7F9014640F6832300F0F7
+:1063B00048FA0FF2BC3000F0ABFA0B2039E0FCF7E2
+:1063C0009AF9014640F68B2300F03BFA0FF2B03009
+:1063D00000F09EFA28780B2804BF0020FAF7AEFFE1
+:1063E0000C20287039E0FCF786F9014640F6952329
+:1063F00000F027FA0FF2A43000F08AFA1B2018E010
+:10640000FCF779F9014640F69D2300F01AFA0FF2E5
+:10641000AC3000F07DFA1E200BE0FCF76CF9014671
+:1064200040F6A52300F00DFA0FF2B03000F070FA3C
+:106430001D2028700FE0372028701F20FAF74CFD30
+:10644000FCF759F9014640F6AF2300F0FAF90FF2D4
+:10645000AC3000F05DFAFAF741FEBDE8F3810000D0
+:106460002E0A0D00C041002040420F00414E435310
+:106470005F4170705F4E6F74696669636174696FC4
+:106480006E000000414E43535F434F4E4E45435410
+:106490004544203D3D3E20414E43535F44495343D4
+:1064A0004F5645525F414E43535F53455256494301
+:1064B00045200A0D00000000414E43535F444953FC
+:1064C000434F4E4E5F434F4D504C455445200A0DAF
+:1064D00000000000414E43535F504153535F4B4512
+:1064E000595F52455155455354203D3D3E20414E44
+:1064F00043535F504153535F4B45595F524553508F
+:106500004F4E5345200A0D00414E43535F4E554DAB
+:10651000455249435F434F4D50415249534F4E5F9F
+:1065200056414C55455F434F4E4649524D200A0D4A
+:1065300000000000414E43535F53454355524954B8
+:10654000595F494E49544941544544200A0D0000C1
+:10655000414E43535F50414952494E475F434F4D6F
+:10656000504C45544520506565725F426F6E6465BE
+:10657000643D25642020200A0D000000414E435355
+:106580005F50414952494E475F434F4D504C45542F
+:1065900045206163695F6761705F6765745F7365FC
+:1065A0006375726974795F6C6576656C2053656399
+:1065B00075726974795F4D6F64653D25642053651C
+:1065C0006375726974795F4C6576656C3D256420EE
+:1065D0000A0000006163695F6761705F69735F64EF
+:1065E00065766963655F626F6E646564205065659A
+:1065F000725F426F6E6465642066726F6D203078E2
+:106600003030203D3D3E2025640A0000414E43537A
+:106610005F50414952494E475F434F4D504C45549E
+:106620004520205465726D20436F6E6E65637469FA
+:106630006F6E20666F72207468652066697273746D
+:106640002070616972696E6720636F6D706C65742C
+:106650006520746F207361766520626F6E64696E69
+:106660006720696E666F6D6174696F6E20212121EC
+:10667000200A0D00414E43535F50414952494E4755
+:106680005F434F4D504C4554452020536563757210
+:106690006974795F4C6576656C3D2564203D3D3EAF
+:1066A0002053656375726974795F4C6576656C3DDE
+:1066B0002564200A0D000000414E43535F415554AC
+:1066C000484F52495A4154494F4E5F5245515F45D8
+:1066D0005654203D3D3E20414E43535F4155544862
+:1066E0004F52495A4154494F4E5F524553504F4EB5
+:1066F0005345200A0D000000414E43535F414C4C6E
+:106700004F575F5245424F4E44200A0D0000000093
+:10671000414E43535F5345545F444154415F4C45A0
+:106720004E475448200A0D00414E43535F4D545587
+:106730005F555044415445200A0D0000414E4353DB
+:106740005F4D54555F45584348414E47455F434F61
+:106750004D504C455445200A0D000000414E435316
+:106760005F524541445F504859200A0D0000000027
+:10677000414E43535F5345545F504859200A0D0022
+:10678000414E43535F5345545F5048595F434F4D0B
+:10679000504C455445200A0D00000000414E435323
+:1067A0005F444953434F5645525F414C4C5F5345FC
+:1067B000525649434553200A0D000000414E4353B1
+:1067C0005F444953434F5645525F414E43535F53D5
+:1067D000455256494345200A0D000000414E43539F
+:1067E0005F444953434F5645525F474154545F53AA
+:1067F000455256494345200A0D000000414E43537F
+:106800005F434845434B5F4E4F54494649434154CB
+:10681000494F4E5F455654203D3D3E20414E435327
+:106820005F434845434B5F4E4F54494649434154AB
+:10683000494F4E200A0D00006A460DF1010101F09A
+:106840008FB83A46204600F063B800000D0A205B7E
+:1068500025735D5B25735D5B25645D200000000092
+:10686000433A5C6465765C4749545F446F72795F74
+:106870004C6974746C65446F72795F4E5C73746DAF
+:10688000333277625F4D345F4669726D776172654E
+:106890005C4669726D776172655C50726F6A6563A0
+:1068A00074735C502D4E55434C454F2D5742353532
+:1068B0002E4E75636C656F5C4170706C69636174BA
+:1068C000696F6E735C424C455C424C455F48656144
+:1068D0007274526174654672656552544F535F41DC
+:1068E0004E43535C53544D33325F5750414E5C41DD
+:1068F00070705C616E63735F636C69656E745F6119
+:1069000070702E6300000000253032582000000017
+:106910000EB4C0B5024603A800210190009101AB5E
+:106920000121044878440C3001F026FA06BC5DF8D9
+:1069300010FB00BFC1C6000062B38B0708D0521E17
+:1069400011F8013B00F8013B00F024808B07F6D1E1
+:10695000830740F0208000BF103A07D330B4B1E87D
+:106960003810103AA0E83810F9D230BC530724BFD1
+:10697000B1E80810A0E8081044BF51F8043B40F803
+:10698000043BD20724BF31F8022B20F8022B44BF6E
+:106990000B7803707047121F17D35B0009D151F8B1
+:1069A000043B20F8023B1B0C121F20F8023BF6D2DE
+:1069B0000BE051F8043B00F8013B1B0A20F8023BB6
+:1069C0001B0C121F00F8013BF3D238BF121D521EE0
+:1069D00024BF11F8013B00F8013BF8D8704700B51F
+:1069E00087B000208DF8000000F0BFF940F20110E0
+:1069F000ADF806003F220120069000F02EFA002894
+:106A00004CBFFF209DF8000007B000BD2DE9F84104
+:106A100007460128C7B0884615461E4608BF022013
+:106A200003D002280CBF102000200DF11D010C180E
+:106A300000F036F8012F8DF81C7002D0022F18D00C
+:106A400019E002273A4641460DF11D0000F0BBFA5D
+:106A50002570667000F089F93F204FF4817100F0D5
+:106A600016F8FF1C049700F0FAF9002805D5FF205E
+:106A700009E01027E6E7472005E09DF8000010B97F
+:106A80004E9800F067F8FFE748B0BDE8F081ADF838
+:106A90000400ADF8061007A8032103900691704783
+:106AA00003220021684600F094BA2DE9F64F0C4607
+:106AB0000546012CC7B09B4608BF022003D0022C1C
+:106AC0000CBF102000200DF11F010E18FFF7E8FF8A
+:106AD000012CADF81C508DF81E4002D0022C2CD099
+:106AE0002DE00227569C559DDDF85091DDF84CA114
+:106AF000DDF8488148993A4600F0B6F8A6F800B0AB
+:106B000086F8028086F803A086F804907571B47147
+:106B100000F02BF93F20ADF804004FF4827107A874
+:106B2000ADF80610039003210A370497069100F090
+:106B300096F9002805D5FF2009E01027D2E7472065
+:106B400005E09DF8000010B9579800F003F849B02F
+:106B5000BDE8F08FBDF8011001800020704730B50E
+:106B6000C7B01C464A9B00F05BF900258DF8005029
+:106B70008DF82140224619460DF1220000F023FA3B
+:106B800000F0F3F83F204FF4837100F054F9A41D96
+:106B9000049400F064F900284CBFFF209DF8000029
+:106BA00047B030BD00B5C7B000F039F800F017F8B5
+:106BB0000F21029140F20B10022100F046F900284B
+:106BC0004CBFFF209DF8000047B000BD0023ADF88A
+:106BD0001C008DF8003007A8418082800021182217
+:106BE00001A800F0F6B900228DF80020ADF81C00D5
+:106BF0008DF81E10704700B5C7B000F010F8FFF711
+:106C0000EEFF0F2102914FF48970022100F01DF96F
+:106C100000284CBFFF209DF8000047B000BD0021B8
+:106C2000ADF81C008DF80010704718B5C7B01346BA
+:106C300000228DF800200229FFF7D8FF0CBF102496
+:106C400002242246194600F00FF800F08EF840F2B8
+:106C5000131100F067F800F002F900284CBFFF2084
+:106C60009DF8000048B010BD0DF11F0000F0ABB959
+:106C700000B5C7B0FFF7AAFF0F21029140F215102F
+:106C800000F0E2F800284CBFFF209DF8000047B05C
+:106C900000BD30B5C7B000F01BF80CBF10250225B1
+:106CA00000F011F800F0C3F800F05FF84FF48B71BA
+:106CB00000F019F800F0D3F800284CBFFF209DF831
+:106CC000000047B030BD8DF822302A46214670477B
+:106CD0000024ADF81C008DF8004007A8022B4A9C48
+:106CE000418082807047ADF806103F2007A9ADF8BB
+:106CF000040003910F20012102900691ED1D0495DF
+:106D0000704700B5C7B0FFF761FF0F21029140F255
+:106D1000171000F099F800284CBFFF209DF80000E4
+:106D200047B000BDADF806103F2007A9ADF804003C
+:106D300003910F20012102900691E41C04947047F6
+:106D400018B5C7B000F02BF800F041F800F00DF8CE
+:106D50004FF48E7100F02DF800F081F800284CBF40
+:106D6000FF209DF8000048B010BD1822002101A8A6
+:106D700000F02FB918B5C7B000F011F800F027F8EF
+:106D8000FFF7F3FF40F2211100F013F800F067F86D
+:106D900000284CBFFF209DF8000048B010BD1446ED
+:106DA000ADF81C00002207A88DF800204180047176
+:106DB0007047ADF806103F2007A9ADF80400039115
+:106DC0000F20012102900691641D04947047224611
+:106DD00019460DF1210000F0F6B878B5C7B04C9C0B
+:106DE0004D9D00F01DF800268DF821308DF80060D3
+:106DF0008DF822402246294600F019F8FFF7B5FF2A
+:106E00003F204FF4937100F016F8E41D049400F055
+:106E100026F800284CBFFF209DF8000048B070BD48
+:106E2000ADF81C00ADF81E108DF8202070470DF154
+:106E3000230000F0C8B8ADF80400ADF8061007A8AC
+:106E400001210390069170470621ADF806000491D8
+:106E500007A801213F2203900691ADF80420CDF848
+:106E600014D0002101A801F0ECBEF0B40246106875
+:106E700095681318506803EB5004C00721D54D44A2
+:106E80001FE0F0BC02F10C00704713F8017B05F81D
+:106E9000017B491EF9D1A0B1B60813F8011B06F019
+:106EA0000306032E08BF13F8016B01EB06214942CC
+:106EB000801C294405D011F8016B05F8016B401EB8
+:106EC000F9D1A342DDD013F8016B16F0030104BF22
+:106ED00013F8011BC91C30090F28DAD113F8010B74
+:106EE0000F30D6E738B55C21044601F03BFF25465C
+:106EF00008B15C2105E02F21204601F033FF20B1CD
+:106F00002F21204601F02EFF451C284632BD38B502
+:106F1000EFF3108472B6284D6946281D02F047F839
+:106F20006946281D02F0A0F838B184F31088BDF836
+:106F30000010224A02F080F931BD0120287084F34C
+:106F4000108831BD80B502F075F90221009100234F
+:106F5000194800F124014FF48052001D01F00EFF8A
+:106F600001BD00BFF8B514460026EFF3108510F1FF
+:106F7000010F1ED001281CBF02284FF0FF3618D188
+:106F8000BCB1264672B60C4F012392B2381D01F0F7
+:106F900009FF00281CBF3978002908D000223A7068
+:106FA00085F31088A1B2054A02F046F901E085F3A5
+:106FB00010883046F2BD00002C0000200F6F000842
+:106FC000002202F0D9B910B50446FFF7B5FC2046FF
+:106FD00010BD10B5044610460A460146204602F090
+:106FE000E5F9204610BD0000EFF3058060B9DFF839
+:106FF0009412EFF31080002804BFEFF311800028F3
+:1070000003D00A68022A00D193E0086810B901226F
+:107010000A6070474FF0FF30704780B5EFF305808E
+:1070200058B9DFF8601200F01BF904BFEFF31180CC
+:10703000002803D00868022800D109E00A68012A64
+:1070400005D10220086002F0EBFA002002BD02E048
+:107050006FF0050002BD4FF0FF3002BDF8B584B0FF
+:1070600000230393EFF30583002B4AD1EFF3108342
+:10707000002B04BFEFF31183002B04D0DFF80432A0
+:107080001C68022C3DD003003BD08025182600242C
+:107090005AB3136803B11C4693691BB11E0004D098
+:1070A000392E02D21379DF0701D500202AE0536977
+:1070B00003B19D08D2F80CC0976887B1BCF15C0F92
+:1070C0001FD31269002A18BF002B1AD001920B4659
+:1070D000029700962A46214602F09CF910E0BCF186
+:1070E000000F04BF1269002A0BD103AB0193009675
+:1070F0000B46AAB2214602F0BCF9012801D00020BB
+:107100000390039805B0F0BDEFF3058169B9EFF383
+:107110001081002904BFEFF31181002904D0DFF8AA
+:1071200064110A68022A00D008B90020704702F0F2
+:107130008BBC6FF0050070473EB5040001D00029FC
+:1071400003D56FF00300019031E04FF0FF32019260
+:10715000EFF3058058B900F083F804BFEFF3118016
+:10716000002819D0DFF81C010268022A14D102A8F5
+:1071700000900025029500230122204602F0F4FD34
+:10718000009501AB00220021204602F0EDFD02989F
+:1071900068B100F0B8F90AE000230122204602F0AD
+:1071A00083FD01AB00220021204602F07DFD019805
+:1071B0003EBD2DE9FE4F8346EFF3058058B900F040
+:1071C0004FF804BFEFF31180002808D0DFF8B400B7
+:1071D0000368022B03D16FF00500BDE8FE8FBBF101
+:1071E000000F48BF6FF00300F7D4144601940E4619
+:1071F000B0074CBF4FF00009D94602F0BCFA029626
+:107200000025019F6FF001086FF0020A064606E0B4
+:1072100002F0B1FA801B87422CBF3F1A00273B4681
+:107220006A464946002002F001FD012810D100986D
+:1072300002990BEA05050543CA0705EA0B0002D5CA
+:10724000584501D10AE048B9002CE1D15046C4E7C5
+:10725000002C0CBF554645460028E0D12846BCE727
+:10726000EFF3108000287047DFF81800016802294A
+:107270007047EFF310810029704702490A68022A1B
+:1072800070470000585C002070B504460026EFF3FC
+:107290000580002831D1FFF7E3FF04BFEFF3118031
+:1072A000002802D0FFF7E0FF27D0002C14BF606851
+:1072B000002000F0010500071FD454B1E068A16868
+:1072C00031B1502819D38DB1042002F091FE06E0AF
+:1072D00098B9002D14BF0420012002F07EFE0600A4
+:1072E0000BD0002C14BF2168002101E00120ECE745
+:1072F00003F01FFA0DB146F00106304670BDF8B537
+:10730000024650080C4640000025EFF3058159B9AC
+:10731000FFF7AFFF04BFEFF31181002907D0DFF8BB
+:1073200030120B68022B02D16FF0050515E010B981
+:107330006FF0030511E0D1076FF002066FF001074F
+:10734000214602D502F07AFE01E003F06CF8012834
+:1073500003D0002C14BF3D4635462846F2BD38B553
+:107360000146480840000024EFF305824AB900F0C6
+:10737000D5F804BFEFF31182002A05D000F0D2F84F
+:1073800002D16FF005040FE010B96FF003040BE0B9
+:10739000C9076FF0020502D502F037FE01E000F0E8
+:1073A00057F8012818BF2C46204632BD7CB50E4642
+:1073B00014460025EFF30581002947D1FFF759FF57
+:1073C00004BFEFF31181002902D0FFF756FF3DD033
+:1073D00000283BD0B04239D344B1E268A16819B16A
+:1073E000502A33D3012102E0002A2FD100210128A5
+:1073F00019D1012908D1032000900022A36800219F
+:10740000012002F084FD02E0032202F0AFFD05003E
+:107410001CD0A6B100F01CF8012810D0284603F0BB
+:10742000F2F8002512E0012904D1A268314602F0E9
+:1074300027FE02E0314602F03DFE050006D0002C9A
+:1074400014BF21680021284603F073F9284676BD51
+:1074500000230022002102F044BE7CB50C4600252A
+:1074600078B16FF00206EFF3058149B9FFF701FF2C
+:1074700004BFEFF31181002912D0FFF7FEFE0FD1F8
+:1074800014B16FF0030515E000956A46002103F082
+:1074900079F801280DD1009860B100F034F809E0C6
+:1074A000214602F0C0FF012804D014B16FF001059D
+:1074B00000E03546284676BD38B5002410B96FF097
+:1074C00003041EE06FF00205EFF3058149B9FFF7F1
+:1074D000D0FE04BFEFF3118100290DD0FFF7CDFEE0
+:1074E0000AD10094694602F0D9FE012808D100981B
+:1074F00038B100F008F804E0FFF7AAFF012800D037
+:107500002C46204632BD044A4FF080511160BFF333
+:107510004F8FBFF36F8F704704ED00E0EFF31082E1
+:10752000002A70470A4A1368022B7047094B036010
+:1075300003F15C000860802010607047064B036018
+:1075400003F15C0008604FF4807010607047000029
+:10755000585C002048520020EC4D002027490020B4
+:10756000087700222648027300F04CB823490A7FAE
+:1075700041F82200087F401C0877704720490A7BA9
+:1075800041F82200087B401C0873704770B5044620
+:107590006078FF2802BFB4F8031001F47F41B1F511
+:1075A000406F1FD10025154E317FE8B2884222D2AC
+:1075B000E9B256F8211020468847002808BF6D1C04
+:1075C000F2D018E0761C297BF0B288420AD2F1B2E0
+:1075D00055F82110204688470100F3D002D0022838
+:1075E00005D006E02046BDE8704003F0BBB900209E
+:1075F00070BD012070BD0026014DE4E78C5B0020CA
+:10760000CC5B002080B5C046C046C046C04604F0F2
+:1076100049FCC046C046C046C04604F023FEC046F2
+:10762000C046C046C046C046C046C046C046C0462A
+:10763000C046C046C046C046C046C046C046C0461A
+:10764000C046BDE8014005F07BB800005FEA000CD1
+:1076500080EA01039B0715D1830706D011F8013B8F
+:1076600000F8013BB3B18307F8D10A68B2F10133E6
+:1076700023EA020313F0803F02BF40F8042B51F8C5
+:10768000042FF3E711F8013B00F8013B13B111F8A7
+:10769000013BF9E76046704700F10103810704D020
+:1076A00010F8011B89B18107FAD10268B2F10131EA
+:1076B000914311F0803F04BF50F8042FF6E710F813
+:1076C000011B11B110F8011BFBE7C01A704700B590
+:1076D00087B000F08EF900F0CEF9812000F084F937
+:1076E00000F0E0F900284CBFFF209DF8000007B033
+:1076F00000BD2DE9F84DC7B09446DDF840E1519A40
+:10770000559D569EDDF84CA1ADF81D108DF81C005E
+:107710004FF0000BADF81FC08DF821308DF822E03E
+:1077200000F024F800F017F824F8095F668000F0F4
+:10773000A2F93F20832100F0E2F9574406910D376A
+:10774000049700F0B2F900284CBFFF209DF800001C
+:1077500048B0BDE8F08D88F800A007AC5499E41952
+:10776000524608F101005444FFF72DBC8DF8232048
+:10777000174652998DF800B00DF1240809A8B844B5
+:10778000FFF721BC00B5C7B000F00CF8852000F071
+:10779000DFF800F087F900284CBFFF209DF80000BB
+:1077A00047B000BD00218DF81C008DF80010182294
+:1077B00001A8FFF70EBC2DE9F841C7B04FF0000853
+:1077C00000F026F80DF12300DDF844E14E9F4F9EB6
+:1077D000509D529C8DF81F30C0F800E08DF800805D
+:1077E0008DF820708DF821608DF822508DF827409B
+:1077F00000F041F98620ADF8060007A90C2000F042
+:107800004DF900284CBFFF209DF8000000F0A9B9F9
+:107810008DF81C0007A841708270704700B5C7B092
+:1078200000F022F9872000F035F900284CBFFF2036
+:107830009DF8000047B000BD00B5C7B00022ADF80C
+:107840001C008DF800200DF11E001822016001A817
+:107850000021FFF7BEFB8820ADF8060007A906202F
+:1078600000F01CF900284CBFFF209DF8000047B035
+:1078700000BD00B5C7B000F0F7F8892000F00AF9A4
+:1078800000284CBFFF209DF8000047B000BDF8B5B0
+:10789000C8B005460E4617461C4600F023F808A857
+:1078A000467087708DF8205000F024F98A21ADF8D9
+:1078B0000A103F20032100F010F9002848BFFF20E4
+:1078C0000ED49DF8000058B94F994E98BDF801208C
+:1078D0002280BDF803200280BDF80500088000204A
+:1078E00049B0F0BD072200216846FFF772BB00B522
+:1078F000C7B00021ADF81C00FFF757FF0F21029120
+:107900008D20022100F0BDF800F0CDF800284CBF1A
+:10791000FF209DF8000047B000BD18B5C7B0044671
+:1079200000F067F88DF81C40224600F008F900F0DE
+:10793000A2F83F208E2100F017F9641C049400F097
+:10794000B4F800284CBFFF209DF8000048B010BDDF
+:10795000ADF8060007A901203F220391049070476B
+:1079600078B5C7B006460C4615460322FFF7BBFFA5
+:10797000ADF81C6000F07FF8902100F01AF80221A9
+:10798000ADF80400049107A803210390069100F0CC
+:107990008CF8002848BFFF2009D49DF8000030B9BA
+:1079A0009DF8010020709DF802002870002048B06A
+:1079B00070BDADF806103F207047ADF8060007A96E
+:1079C0000220704700B587B000F013F800F053F8BC
+:1079D000922000F009F800F065F800284CBFFF2065
+:1079E0009DF8000007B000BDADF806003F22012061
+:1079F000704700208DF80000704700B5C7B000F058
+:107A000033F80F210291932000F03AF800F04BF880
+:107A100000284CBFFF209DF8000047B000BD00B516
+:107A200087B0FFF7E6FF00F026F89420FFF7DCFFB1
+:107A300000F038F800284CBFFF209DF8000007B088
+:107A400000BD00B5C7B00021ADF81C00FFF7ADFECA
+:107A50009520FFF7B2FF00F021F800284CBFFF206F
+:107A60009DF8000047B000BD00228DF80020ADF861
+:107A70001C008DF81E101822002101A8FFF7A9BADA
+:107A80000321ADF80600049107A801213F220390CD
+:107A900006917047ADF8060007A9032004903F2225
+:107AA000012003910690ADF80420CDF814D00021F8
+:107AB00001A801F0C6B800B5C7B0FFF7D5FF0F2188
+:107AC00002919F20FFF7DCFFFFF7EDFF00284CBF7E
+:107AD000FF209DF8000047B000BDADF808000591FB
+:107AE00008A8072104900791CDF818D0002102A81A
+:107AF00001F0A7B81822002102A8FFF76ABAADF872
+:107B00000400ADF8061007A801210390704700B5E6
+:107B1000C7B000F00EF8FFF7AEFFA42100F03FF869
+:107B2000FFF7C3FF00284CBFFF209DF8000047B0BF
+:107B300000BD00228DF800208DF81C0006220DF1FA
+:107B40001D00FFF740BA00B5C7B0FFF78DFFA520B5
+:107B5000FFF7A0FF00284CBFFF209DF8000047B0B2
+:107B600000BD48B0BDE8F081ADF80400ADF80610E6
+:107B700007A8012103900691704700B5C7B0FFF731
+:107B8000D8FFFFF778FFAA2100F009F8FFF78DFF73
+:107B900000284CBFFF209DF8000047B000BDADF8A5
+:107BA00006103F200721ADF80400049107A8012129
+:107BB00003900691704700B587B000F014F80120DB
+:107BC00003220690ADF80420ADF8062000F0CEF8B0
+:107BD00000284CBFFF209DF8000007B000BDADF8A5
+:107BE00006100820704700208DF8000018220021A0
+:107BF00001A8FFF7EEB9ADF80600049107A801212E
+:107C0000082203900691ADF80420704778B5C7B0FC
+:107C100004460D461646032200F01EF8ADF81C403F
+:107C2000ADF81E50ADF82060FFF7E0FF2221FFF70E
+:107C3000D6FF062100F009F800F096F800284CBFA6
+:107C4000FF209DF8000048B070BDADF8040004911D
+:107C500007A803217047092200216846FFF7B9B938
+:107C60001822002102A8FFF7B4B9182201A8FFF7D3
+:107C7000B0B970B5C8B006460C4615460522FFF7E8
+:107C8000EBFFADF82060FFF7EBFF302100F014F8B8
+:107C90000521049000F019F8002848BFFF2009D4FE
+:107CA0009DF8000030B99DF8030020709DF8040095
+:107CB0002870002048B070BDADF80A1008200221DD
+:107CC000ADF80800059108A870470791CDF818D0C5
+:107CD000002102A800F0B5BF00B5C7B000F00EF853
+:107CE000FFF7C3FF312000F013F800F03FF8002841
+:107CF0004CBFFF209DF8000047B000BD00238DF869
+:107D00001C008DF8003007A8417082700021704778
+:107D1000ADF8060007A90320049008220120039172
+:107D20000690ADF80420704730B5C7B00025ADF817
+:107D30001C008DF81F2007A84A9C817003718DF8E4
+:107D40000050ADF82140FFF751FF0F210291322082
+:107D50000721FFF750FF00F009F800284CBFFF2073
+:107D60009DF8000047B030BD03900691CDF814D0C7
+:107D7000002101A800F065BF2DE9F0439FB00FF28C
+:107D80009C16269CDFF8E48A02918DF83B40002186
+:107D90000B914FF0FF37044691461D460AE019F853
+:107DA000011B0298A0470028029000F0A4800B98C5
+:107DB000401C0B9099F8000050B12528EFD100200D
+:107DC0000021059006910790089109900A9103E01F
+:107DD0000B98A7E041F0010119F8010F2028F9D014
+:107DE00023280CD02B2804D02D2805D0302809D0EA
+:107DF00083E041F00201EFE741F00401ECE741F0DC
+:107E00000801E9E741F01001E6E700200D900AE0E3
+:107E10000D98404505DA00EB800302EB4302303A4F
+:107E20000D9209F1010999F80020A2F130000A2809
+:107E3000EED399F800002E2818BF0C9726D119F818
+:107E4000010F2A2808D12868286009F1010950F893
+:107E5000042B28600C9219E02D280CBF19F8010B97
+:107E6000002000220C920BE040B90C9A424505DA42
+:107E700002EB820203EB4203303B0C9309F1010950
+:107E800099F80030A3F130020A2AEDD3ADF838108A
+:107E9000304699F8001004F055FC08B119F8010BB0
+:107EA0008DF83A009DF83A00682804BF99F8001050
+:107EB000682903D162208DF83A0008E06C2804BFDD
+:107EC00099F800006C2804D171218DF83A1009F15D
+:107ED000010910A804902A4619F8013B694620467A
+:107EE00000F060F838B910AA6946204600F08CF915
+:107EF00000287FF55FAF384614E02A2885D12A682C
+:107F00002A6052F8040B2A6000280D9003D54042E5
+:107F10000D9041F0040109F101098AE7686A6C7467
+:107F20007A4C00001FB0BDE8F083622820D068289A
+:107F300011D06A2803D06C2827D0712825D1086871
+:107F4000C01D20F007000860D0E900230830086059
+:107F5000194610467047002A0A680A60106803D064
+:107F6000121D0A6000B217E0121D0A6080B217E00D
+:107F7000002A0A680A60106803D0121D0A6040B225
+:107F80000AE0121D0A60C0B20AE0002A0A680A600C
+:107F9000106803D0121D0A60C1177047121D0A60D5
+:107FA0000021704770B51C460D46B4F125002E69BE
+:107FB000114600F017811C386AD0001F022867D9CB
+:107FC000133843D0093863D0801E16D0401E1ED00F
+:107FD000401E02285CD9001F19D0401F00F083808A
+:107FE000401E33D0401E00F0CD80C01E00F0D8806F
+:107FF000801E2BD0C01E29D0FAE06869421C6A613D
+:108000000A680A6052F8043B0A603354FAE095F8B3
+:108010003A000122FFF789FFC5E9000100239942D8
+:1080200004DA6869411C69612D210DE0288F810700
+:1080300004D56869411C69612B2105E0C00722D580
+:108040006869411C6961202131541CE095F83A00AF
+:108050000022FFF76AFFC5E9000195F83800010723
+:1080600011D5D5E900230020834208BF82420AD0FF
+:1080700044F02000782806D1686930213154401C32
+:10808000411C69613454214668693044E86083E0EA
+:108090000868C01D20F007000860D0E90023083000
+:1080A0000860C5E90023D5E90001C80F04D068695C
+:1080B000411C69612D210DE0288F810704D5686975
+:1080C000411C69612B2105E0C00704D56869411C8A
+:1080D00069612021315468693044E86021462846AE
+:1080E00000F0C4F98EE005F13A02507820B14FF06B
+:1080F000FF340FF648205EE01078622808D0682828
+:1081000024D06A2812D06C282ED071280ED02BE0F3
+:108110000A680A6052F8040B0A6020B94FF0FF3475
+:108120000FF6302047E0E96A01706BE00A680A60E8
+:1081300052F8040B0A6020B94FF0FF340FF61420F8
+:1081400039E0EA6AD317C0E900235BE00A680A60F5
+:1081500052F8040B0A6020B94FF0FF340FF6F41008
+:1081600029E0E96A01804DE00A680A6052F8040BD0
+:108170000A6020B94FF0FF340FF6D8101BE0E96A0F
+:1081800001603FE00A680A6052F8040B0A600021AF
+:10819000C5E90001EE607821284600F0BBF831E027
+:1081A0000868086050F8044B0860EC603CB94FF078
+:1081B000FF340FF6B81004F0D1FA201A70BD2E6B00
+:1081C000002E04D52046FFF767FA044608E0324641
+:1081D0000021204604F0E4FA002814BF041B3446B2
+:1081E000AC610FE06869411C69612521315409E0E7
+:1081F0006969481C686125227254210002D0411C23
+:1082000069613454002070BD2DE9FC410F460646DB
+:10821000796B7869BC6A091A386A091AB869091A47
+:10822000786A091AF869091A97F838000C1B41078F
+:1082300090460FD42021002C8DF800100ADD254631
+:1082400001236A463946304600F060FC00285DD1C3
+:108250006D1EF5D17B6942463946304600F056FC2A
+:10826000002853D130208DF800003D6A002D09DD33
+:1082700001236A463946304600F048FC002845D1C3
+:108280006D1EF5D1BB69FA683946304600F03EFCF8
+:1082900000283BD130208DF800007D6A002D08DDDC
+:1082A00001236A463946304600F030FC70BB6D1E33
+:1082B000F6D1F868B969FB6942183946304600F0D2
+:1082C00025FC18BB30208DF80000BD6A002D08DDAC
+:1082D00001236A463946304600F018FCB0B96D1EDD
+:1082E000F6D197F8380041070DD52021002C8DF8E4
+:1082F000001008DD01236A463946304600F006FCCE
+:1083000020B9641EF6D10020BDE8F6814FF0FF30A1
+:10831000BDE8F6812DE9FC4707468A463E69BAF179
+:108320006F0F08BF082405D04AF02001782914BF38
+:108330000A2410243C25D7E90023BAF1640F18BFA2
+:10834000BAF1690F9046994606D100218B4203DAB3
+:10835000D8F1000869EB49090020814508BF804534
+:108360001FD1386BE8B9082C4CD197F838000107B9
+:1083700048D530203B2586F83B0043E000280ED549
+:1083800097F8380000F01400102808D17A6B78694B
+:10839000121A386A121A511A0029C8BF3962BDE888
+:1083A000F3878DF800A0404649462246E31704F0C3
+:1083B00023FA3032D0B26D1E3A28019504DB9DF8C5
+:1083C0000000A0F151018A187255404649462246E4
+:1083D000E31704F011FA804689460020814508BF62
+:1083E000804503D0F86871198842DCD3082C09D184
+:1083F00097F83800010705D5715D302902D06D1E50
+:1084000030207055C5F13C01B9617019F860386BC6
+:108410008142B3DA411A39624FF6EF70398F014069
+:108420003987BDE8F3872DE9D04306460F46144649
+:108430004FF00008DFF8389412E0E00707D5424615
+:108440004B463046394604F0EFFA06460F464046A2
+:10845000494642464B4604F0E7FA64108046894696
+:10846000002CEAD130463946BDE8D0832DE9F34FE0
+:10847000054641F020048DB0D5E90089612C02AE9B
+:1084800009D0286B002848BF062003D408BF672CFA
+:1084900001D101202863D5E9002358004015401C74
+:1084A0000ED119030CD00320A8619DF83800613863
+:1084B0001A2802D20FF2D06111E00FF2D0610EE063
+:1084C00058004015401C0FD119030DD10320A8619D
+:1084D0009DF8380061381A2814D30FF2B861E868A3
+:1084E0000322FEF729FAD3E1194621F00043B3F540
+:1084F000801F10460DD20027BB4208BFBA42019729
+:1085000003D111E00FF28861E9E701AA04F05EFBF4
+:108510000AE0DFF8607307EB1352DFF85C33019277
+:108520001940DFF858331943C5E90001612C0ED119
+:10853000E86830210170811CE9609DF838106129DC
+:108540000CBF7821582141706869801C6861D5E9A9
+:1085500000AB2BF0004300202AF00002834204BF4E
+:108560008242002300F05A81612C40F0A980286BE0
+:1085700000284CBF2120401C00904046009F7F1CDB
+:1085800049460022002304F059FBD94601988DF892
+:10859000082038BF89F00049001F0190002FD04605
+:1085A0000DF1090040F3498140F2FF71DFF8D0B2CC
+:1085B0000C910646404649460022002304F056FB33
+:1085C00080F03A814800400D00F11C0210D0002AD2
+:1085D0000EDD0C98824205DB09F0004040EA0B01F9
+:1085E000002013E0A448084040EA025140460DE054
+:1085F00029F00043002028F00002834208BF824295
+:108600000FBF40461C22404604F048FB8046894686
+:1086100004F0E2FBFF1F002F044609DD04F0FAFB23
+:1086200002460B464046494604F006FC8046894611
+:10863000F01D072104E004F00F0200F8012D2411C1
+:10864000002C01DD491EF6D5491E5CBF002200F852
+:10865000012DF9D5ECE00020194602AA0A4400E0F9
+:108660005B1E12F80149491E8442F9D00F2804D13B
+:108670000DF10900425C521C4254002904D50198B6
+:10868000001D02AE5B1C0190591E12D49DF83800EB
+:108690007218147804F130085FFA88F4392CC4BFDA
+:1086A000A0F13A04A044491E02F80189F1D58DF8E1
+:1086B0003800286B002840F1B080591E2963ACE0D7
+:1086C000404649460022002304F0B8FA019938BF19
+:1086D00089F0004947F2975041436A4A91FBF2F210
+:1086E0000192D2F1070204DD40464946FFF79BFEA6
+:1086F0000AE0524200206449FFF795FE02460B460D
+:108700004046494604F00AFC8046662C286BDFF898
+:108710007CB106BF019F0A3706273F18142FC8BF38
+:10872000142730208DF8080089460DF1090000E07B
+:108730003046002F34DD06464046494604F012FD1F
+:1087400001460A4606F1080304200A26B2FBF6F6A3
+:1087500006EB860EA2EB4E02303203F8012C0A2201
+:10876000B6FBF2F202EB820EA6EB4E063036401E4E
+:1087700003F8026DE9D1083F002F03F10806D7DDA9
+:10878000084604F003FD02460B464046494604F005
+:1087900053FB00225B4604F047F980468946CBE74D
+:1087A0000DF10901401A0DF1090604E00199491E75
+:1087B000401E0191761C31783029F7D0662C02D109
+:1087C0000199491C03E0652C0CBF012100212B6B92
+:1087D000CB189842B8BF431E002B1ED4834204DA44
+:1087E000F05C3528A8BF392000DA30201946721E07
+:1087F00002EB010800E05B1E18F80199491E814553
+:10880000F9D0392802D1705C401C7054002904D57D
+:108810000198401C16465B1C0190019800B2009024
+:108820001BB29DF838103246284600F034F82FE08D
+:10883000C61D002F3FF7BEAE30460DF10901401AAC
+:10884000009903468842C8BF0B46002B0DF109066C
+:108850003FF52FAF8342BFF6FEAE0DF10900C05CBD
+:1088600007287FF7F8AE0F20F6E60000CBCCCC0C43
+:108870000000244002FCFFFFFFFF0F800000E03FEC
+:108880000000F07FA08601000000F03F84D79741F0
+:108890000FB0BDE8F08F2DE9F84783B006468A4651
+:1088A0001746984604F080FCB8F1000F406A356B1B
+:1088B00090F8009003DC4FF001080FF2DC27BDF9BF
+:1088C00030404AF02000662808BF641C15D0672895
+:1088D00040F0848014F1040FC0F28680AC4280F234
+:1088E000838096F83800641C010702D4A845B8BFFD
+:1088F000454620B22D1A48BF00250FFA84FAF068C9
+:10890000B169BAF1000F25DC4A1C30234354002D15
+:1089100003DC96F83800010703D5F06800F80290F0
+:10892000521C15EB0A0FB8BF6C4220B244194142E9
+:108930004445B8BFA046B26171620FFA88F5F5618F
+:10894000F068B3692A4639461844FDF7F5FF641B01
+:10895000B462C4E022B29045084417DA4246394670
+:10896000FDF7EAFFB0694044B061AAEB0801002DB1
+:10897000716203DC96F838100A0705D5F16801F832
+:108980000090F069401CF061B562A8E03946FDF73F
+:10899000D3FFB069002D5044A8EB040803DC96F81F
+:1089A00038100A0703D5F16801F80090401CB06147
+:1089B0000FFA88F08542F068B369B8BFA8460FFA8D
+:1089C00088F207EB0A011844FDF7B6FFB0690FFA09
+:1089D00088F10844B061681A706280E0BAF1610FF2
+:1089E00014D14FF0700A16E0A84504DA96F8381052
+:1089F0000A0758BF45466D1E48BF0025BAF1670FEC
+:108A000014BF4FF0450A4FF0650A04E0BAF1410F78
+:108A100008BF4FF0500AB169F368481CB061002DDF
+:108A200017F8012B5A5403DC96F838100A071BD5A7
+:108A3000F168431CB36101F80090002D14DDA8F12A
+:108A400001080FFA88F08542F068B8BFA8460FFA0F
+:108A500088F239461844FDF76FFFB0690FFA88F1C4
+:108A600008446D1AB0617562F068B1690844002C61
+:108A700080F800A003D42B214170811C03E02D213C
+:108A800041706442811C00206A460AE023460A24A1
+:108A900093FBF4F404EB8405A3EB450302F8013BDC
+:108AA000401C24B2002CF1DC012806DC4AF0200234
+:108AB000652A04BF302201F8012B48B9302001F8A3
+:108AC000010B07E0401E1DF80020303201F8012B99
+:108AD0000028F7DCF068B2691044091AF16196F8D1
+:108AE000380000F0140010280DD17169B0694118E8
+:108AF000706A4118F0694118B06A4118706B814280
+:108B0000BCBF411A316204B0BDE8F087F8B5054634
+:108B10000E4617461C46002074B117F8011BB068BA
+:108B2000A847B06030B1F06A401CF0620020641EBB
+:108B3000F3D1F2BD4FF0FF30F2BD00007072696EEC
+:108B400074665F733A20256E20646973616C6C6F84
+:108B5000776564007072696E74663A2062616420A1
+:108B6000256E20617267756D656E74007072696E36
+:108B700074665F733A2062616420257320617267B6
+:108B8000756D656E740000006E616E004E414E00A2
+:108B9000696E6600494E4600300000007FB50C4605
+:108BA0006D4D61686D4EE8612962284604F002FB54
+:108BB000246805F1240000604060746006F108003C
+:108BC0000060406001203070296829B10FF2551013
+:108BD00000900294684688477FBD1FB55F4C04F142
+:108BE000080004F0F4FA00BB2178F1B1694604F101
+:108BF000080004F015FB5848C16949B1009802907B
+:108C000001228DF8042001A888479DF8040000E0A7
+:108C100001202070207818B1009804F0B7FB04E020
+:108C2000009904F1080004F0DBFA04F1080004F0F4
+:108C3000CEFA28B9207818B104F1080002F06CFBD4
+:108C40001FBD2DE9F8430646002000F05FF8748848
+:108C50003088B268DFF80081C4F3090444EA802454
+:108C6000F068A4B2C1B2204600F03CF8002748F2F8
+:108C7000E809484602F059FB08E06888A04202D1A2
+:108C8000316928780870687800B1012708F124005C
+:108C900004F09DFAF0B9694608F1240004F0C0FA26
+:108CA000009800F10B05407A0F28E6D0B5F80110C6
+:108CB000A1420DD10098817AC81E7169C0B2884264
+:108CC000C8BF0846706102463069E91CFDF734FEF2
+:108CD0002878D9E73800CCD0012000F017F8002020
+:108CE000BDE8F28310B513461C4A5468A4F8090085
+:108CF000E1720A46194604F10C00FDF71DFE164A02
+:108D00001369BDE810400021002018471249096A84
+:108D100082B008B921B101E011B1012002B00847C9
+:108D200002B0704710B50146487A0F2818BF0E28C8
+:108D300007D10B4804F05EFABDE81040002002F0B5
+:108D4000F0BA064C04F1080004F054FA04F10800EB
+:108D5000BDE8104002F0E0BA145B0020BC5B0020CC
+:108D6000385B00200246C9B2002013788B4208BF4E
+:108D7000104612F8013B002BF7D1704710B5029C4A
+:108D8000016042600021C160016141618161038134
+:108D9000A107047704D5008910B14FF0FF3010BD52
+:108DA000002010BD2DE9F04F064685B030890C46F5
+:108DB0000027BB4600287169DC460CBF4FF0020853
+:108DC000D84681B168B930697768451CBD4228BF73
+:108DD000ED1B3768385C7D5D00EB0527BF1CBFB21B
+:108DE00003E0074600E000B102463069F568A8429A
+:108DF00023BF7568281AC01B0020154608EB05091B
+:108E000003FB09FE864532BF0020B0FBF9FA09FBDF
+:108E10001A00C0B2804509DA96F81C905FEAC97A58
+:108E200048BF84465FEA897048BFC446100000F01E
+:108E3000B4807068714461448842C0F0AE8008EB31
+:108E4000020080B20390D946100AADF802000294E5
+:108E5000ADF80020049359E0800740D53089002800
+:108E600040F09B803268D018A34600F8024C200ADC
+:108E700032681A4402F8010C224630681844FDF7A3
+:108E80005BFD706920187061B069019C401CB06185
+:108E9000200A31680C70316848701CE08CB3307F58
+:108EA000C207D9D5308940B931681944FF2001F88B
+:108EB000020C3168194401F8010C4FF0000B706985
+:108EC000241874612C463089002340B931680C7035
+:108ED000210A3068417002237069801C706108EBC0
+:108EE00004070021BFB231615CB1DA44029800EBA3
+:108EF0000A01306822461844FDF71EFD70692418E7
+:108F0000746109F10109B069401CB061049A70688C
+:108F10003169914545D2791881422CBF081A08461B
+:108F2000306103463089A0B93068BDF80010C154E3
+:108F30005B1C70683168834228BF1B1ABDF80200B1
+:108F4000C8545B1C7068834228BF1B1A7069801C60
+:108F5000706105FB09FA7468BDF80000E41A8442E8
+:108F600088BF0446029800EB0A01281BAC4201901E
+:108F700003D093D2307F002890D137682246F8186A
+:108F8000FDF7DAFC706920187061A346019C039F0D
+:108F90000023A9E73068404400E0002005B0BDE8A8
+:108FA000F08F88448045F5D3A8EB0008F2E778B548
+:108FB000028900230B80002A44690CBF022500258A
+:108FC000002C4FD0028952B9C2684668531CB34284
+:108FD00028BF9B1B0668B25CF35C02EB03220A808D
+:108FE000027F02F00302012A25D10B884FF6FF729F
+:108FF000934204BF0289002A09D0C36802699A42D9
+:1090000019D20289BAB14668F31A934213D243685F
+:10901000C268E41A14190022C260446102894AB984
+:1090200002681478012B94BFC3F101030123D25CC1
+:1090300004EB02220A80C468426806682B19934236
+:1090400028BF9B1A33440E884169891B491B416123
+:1090500005D034192D19954228BFAD1AC560816914
+:10906000491E8161184672BDF8B5028900230B8044
+:10907000002A42690CBF02240024002A3BD0C568A4
+:1090800002892B464AB946686A1CB24228BF921B25
+:109090000668775DB25C07EB02220A80067F06F065
+:1090A0000306012E20D10F884FF6FF72974204BFAE
+:1090B0000289002A07D142680023012A94BFC2F125
+:1090C000010201220AE00269AA420DD202895AB1C4
+:1090D0004668751B954207D2002304E005682E7888
+:1090E000AA5C06EB02220A8041680068E4188C4200
+:1090F00028BF641A03191846F2BD0000484900E071
+:10910000484981B00A6802430A6009680840009033
+:10911000009801B0704780B504F0A0F904F0A0F900
+:109120004148016841F480310160FDF70BFFBDE863
+:1091300001400EE000B587B068460FF218211C22EE
+:10914000FDF70AFC04F041F9684604F0A9F907B0FC
+:1091500000BDF0B585B068461421FDF731FF00264B
+:109160000025002400210FF2DC0000EBC102907901
+:1091700088B11368B3F1904F08D02C4FBB4208D090
+:109180002B4FBB4204BF9088044304E09088064301
+:1091900001E090880543491C2229E4DB002002906D
+:1091A0000121032003900191B0B288B10090012009
+:1091B000FFF7A4FF0120FFF7A3FF69464FF090409F
+:1091C00004F076F90022B1B24FF0904004F02DFA8D
+:1091D000A8B280B100900220FFF790FF0220FFF7B5
+:1091E0008FFF124E6946304604F062F90022A9B2A0
+:1091F000304604F01AFAA0B280B100900420FFF7C4
+:109200007DFF0420FFF77CFF094D6946284604F0E6
+:109210004FF90022A1B2284604F007FA05B0F0BDCC
+:109220004C0000584C0100589008005800040048B9
+:109230000008004804F010BB13460A46014600200F
+:1092400004F0AEBB00000048010000000000004830
+:10925000010000000000004801000000000000487C
+:10926000010000000000004801000000000000486C
+:10927000010000000000004801000000000000485C
+:10928000010000000000004801000000000000484C
+:10929000010000000000004801000000000000483C
+:1092A000010000000000004801000000000000482C
+:1092B000010000000000004801000000000000481C
+:1092C000010000000000004801000000000000480C
+:1092D00001000000000000480100000000000048FC
+:1092E00001000000000000480100000000000048EC
+:1092F00001000000000000480100000000000048DC
+:1093000001000000000000480100000000000048CB
+:1093100001000000000000480100000000000048BB
+:1093200001000000000000480100000000000048AB
+:10933000010000000000004801000000000000489B
+:10934000010000000000004801000000000000488B
+:10935000010000000000000000000000000000000C
+:1093600044920008280003202C000320220404005B
+:1093700062F30F2262F31F4200B500BF130096464E
+:109380009446103928BFA0E80C50FAD85FEA417C17
+:1093900028BF0CC048BF40F8042BC90728BF20F8DD
+:1093A000022B48BF00F8012B00BD000062F30F2222
+:1093B00062F31F42401810F0030308D0C91A1FD3EC
+:1093C000DB0748BF00F8012D28BF20F8022D13004D
+:1093D00030B414461546103928BF20E93C00FAD8AD
+:1093E000490728BF20E90C0048BF40F8042D890038
+:1093F00028BF20F8022D48BF00F8012D30BC70476F
+:10940000C91818BF00F8012DCB0728BF00F8012D9F
+:1094100070470000F0B585B050260B9D25B986F346
+:10942000118800F0B7FBFEE70C9C24B986F3118885
+:1094300000F0B0FBFEE75C270097009F5C2F04D094
+:1094400086F3118800F0A6FBFEE70A9E009F2563C5
+:10945000022584F85950029400250395009604AD26
+:10946000019500F034F8204600F077F8049805B034
+:10947000F0BD2DE9F8430646174684B08846994664
+:10948000B80004F0B5FA05001CD05C2004F0B0FA76
+:10949000040014D00D990C982563002284F85920FB
+:1094A00003920191009002944B463A464146304661
+:1094B00000F00DF8204600F050F8012004E02846A6
+:1094C00004F01FFB4FF0FF3005B0BDE8F0832DE93D
+:1094D000F0470A9F81460C461546386B9A46A522EE
+:1094E000A900FFF745FF386B00EB8501081FC00896
+:1094F0004FEAC00808F0070007F1340554B1002115
+:10950000605C6854605C10B1491C1029F8D30020DD
+:10951000E87300E02870089E099C372E88BF372624
+:10952000FE62AE61E861C6F13806381D00210161B6
+:1095300007F11800002101613F61BE617F620020D8
+:10954000286287F8580052464946404604F02AFBF4
+:10955000386004B12760BDE8F0872DE9F04100F0E4
+:1095600056F8DFF85455DFF85485E86C401CE86481
+:109570001426A86A28BBAC62E86C012829D1002710
+:1095800006FB07F0404404F0FBFB7F1C382FF7D3A9
+:1095900005F1740004F0F4FB05F18807384604F087
+:1095A000EFFB284604F0ECFB05F1140004F0E8FBA7
+:1095B00005F1380004F0E4FB05F17400E8622F6364
+:1095C00007E0A86D28B9E16AA86AC26A914228BF7B
+:1095D000AC62A86E401CA8666064E06A696D814256
+:1095E00038BF68654643211D08EB060004F0D5FB33
+:1095F00004F06BFBA86D40B1A96AC86AE16A8842B1
+:1096000003D200F007F800F0C5FABDE8F081044687
+:1096100004F042BBDFF840174FF0805008607047FD
+:1096200080B586B000200590049003AA04A905A87F
+:10963000FDF77CFF059904980291002200920190A9
+:109640000023039A0FF248010FF26D30FFF7E2FE9C
+:1096500098B104F0DBFB5021012810D181F311886F
+:1096600000F098FADFF820084FF0FF31C1660121C1
+:1096700081650021016504F0BDFA07B000BD10F15D
+:10968000010FFAD181F3118800F084FAFEE700009F
+:1096900049444C4500000000DFF8EC07016F491C0D
+:1096A00001677047DFF81024506D002100B10121DF
+:1096B000936AD86A28B9DFF8D4371868012800D827
+:1096C00009B100207047D16E106D081A704770B54F
+:1096D000DFF8E463306F0024002520B900F043F880
+:1096E00000F058FAFEE704F0D7FA306F401E3067FA
+:1096F000316F002936D1F06CD0B933E0F168CC6815
+:1097000000F035F800F011FAE06A716DDFF87C279F
+:10971000814238BF706514235843211D104404F062
+:109720003CFBE06AB16ACA6A904224BF01203066FD
+:1097300030680028E2D10CB100F0A1F9F46D3CB121
+:1097400000F01DF808B101203066641EF8D1F565FF
+:10975000306E38B1DFF838074FF0805101250160D5
+:1097600000F018FA5EE2502181F31188704704F18D
+:10977000180004F037BBDFF81007006D70472DE9C3
+:10978000F843DFF83473386F002600284ED13C6D63
+:10979000641C3C6510D1F86A006820B1FFF7E3FF54
+:1097A00000F0F8F9FEE7F86A396BF9623863786E11
+:1097B000401C786600F063F9F86EDFF8D0968442BA
+:1097C0004FF0140824D319E0281D04F00BFBA86AFD
+:1097D00018B105F1180004F005FBE86A796D8142C3
+:1097E00038BF786508FB00F0291D484404F0D5FA1D
+:1097F000E86AB96ACA6A904228BF0126F86A006816
+:1098000080B1F96AC868C56868688442DCD2F866C5
+:10981000B86AC06A08FB00F159F80100022808D3B1
+:10982000012606E04FF0FF31F966F1E7F86D401CC4
+:10983000F865386E00B101268BE218B5DFF87822A2
+:10984000106F10B10121116611BD1066516DDFF866
+:109850003C3600E0491E14244C43185930B9002905
+:10986000F8D1FFF780FF00F095F9FEE7181900F135
+:10987000080443685B684360A34204BF5B684360BD
+:109880004068C3689362516511BD10B50C4610B9AC
+:1098900000F07DF9FEE700F01DF804F08AFA20469A
+:1098A000BDE81040FFE7012100F0C7BA38B50D460A
+:1098B000144610B900F06BF9FEE700F00BF804F065
+:1098C0006CFA0CB14FF0FF3521462846BDE8344014
+:1098D00000F0B3BADFF8B025936A03F118017047BE
+:1098E00038B5C068C46814B900F051F9FEE7FFF755
+:1098F0003EFF714D286F50B900F017F900F014F8D1
+:1099000038BF6A6500F016F800F0B9F804E004F119
+:109910001801284604F041FA00F020FA02D2012092
+:10992000286632BD002032BDE26A686DDFF85C3522
+:109930009042704714204243211D981804F02DBA1C
+:10994000DFF844154A6E0260096D41607047F8B552
+:1099500004460D46502014B900F01AF9FEE715B977
+:1099600000F016F9FEE704F097F9DFF81C05016D29
+:1099700062682E688B1A16F1010F0ED0476ED4F86C
+:1099800000C0674501D091420BD2B34207D2F31A0F
+:109990002B60416E2160006D6060002402E00020B9
+:1099A0002860012404F091F92046F2BDDFF8D814B4
+:1099B00001200866704700002DE9F041DFF8984368
+:1099C000DFF8F8803C4F4FF0805511E004F064F967
+:1099D000386AC668301D04F005FAF86C401EF86459
+:1099E000786B401E786304F070F9304600F032F86E
+:1099F000786B0028EAD1D8F80010012902D9256037
+:109A000000F0C8F8FFF74EFE0128F1D9386F401C6E
+:109A10003867F86E396D884208D3FFF743FE012896
+:109A200088BF04F0A9FBFFF752FEE1E700F0AFF8B2
+:109A3000FEE70146002000E0401C11F8012BA52A9A
+:109A4000FAD08003000C704710B9DFF83C04806A3C
+:109A5000006BEEE710B5044694F8590040B9206B4E
+:109A600004F04FF82046BDE8104004F04AB810BD9D
+:109A70000128F7D00228FAD000F089F8FEE70E4955
+:109A8000C86A006810B94FF0FF3203E0C86AC268C4
+:109A9000D0684268CA667047DFF8EC03806A704796
+:109AA000DFF8E413886D08B901207047086F08B922
+:109AB0000220704700207047705600208C4900201B
+:109AC000F8B5044600207CB3E16ADFF8BC53AA6A0B
+:109AD000D36A994222D2A069002804D4A86AC26A33
+:109AE000C2F13802A2611427DFF8A06360697943EC
+:109AF000314488420ED100F018F8A96AC86AE062C1
+:109B0000696D814238BF68654743211DF01904F033
+:109B100044F908E0A86AC16AE16204E0E16CAA6A5B
+:109B2000D36A994200D20120F2BD201D04F05AB937
+:109B300038B50446002144B3DFF84C53A86A5022DC
+:109B4000844204D082F3118800F024F8FEE7206DEF
+:109B500020B982F3118800F01DF8FEE7E26AE36C99
+:109B6000401E9A42206510D078B9FFF7DEFFE26C04
+:109B7000DFF81833E262C2F13800A061686D9042EC
+:109B800038BF6A65FFF7D6FE0121084632BD502076
+:109B900080F31188BFF34F8FBFF36F8F7047F8B515
+:109BA000040034D0206D502220B982F31188FFF7D1
+:109BB000F1FFFEE7E36C994238BF1946E36A8B4236
+:109BC00025D0012823D1DFF8C052A86A844204D1ED
+:109BD00082F31188FFF7DEFFFEE7A069DFF8AC62D1
+:109BE000E16200285CBFC1F13801A16114276069FE
+:109BF0007B43F11888420AD1FFF797FFE06A696D4D
+:109C0000814238BF68654743211DF01942E1F1BD2B
+:109C1000DFF87412886A18B1886A026D521C0265F6
+:109C2000886A704704F051F8284670BD2DE9F0416C
+:109C300080460F4614461D4604F02EF8924EB06A38
+:109C400090F85800022811D0B06A416D21EA08014D
+:109C500041650120B16A81F858003DB101212846D3
+:109C600000F0EBF8FFF7D6FCFFF794FF04F02DF8B7
+:109C700004F012F814B1B06A406D2060B06A90F838
+:109C80005800022818BF002405D1B06A416D21EAAE
+:109C9000070747650124B16A002081F8580004F0E5
+:109CA00014F82046BDE8F0812DE9F84304460F463C
+:109CB00091461D4601264FF0500824B988F31188BB
+:109CC000FFF768FFFEE703F0E7FF0DB1606D286066
+:109CD00000F0A8F8B9F1040F27D8DFE809F006036F
+:109CE0001E052200616D0F43676501282FD1FFF724
+:109CF0001CFFE06A644D654B696D814238BF686541
+:109D000014225043211D184404F047F8A06AA8B15A
+:109D100088F31188FFF73EFFFEE7616D491C61651E
+:109D2000E3E70228E0D1002611E0616D11F1010F97
+:109D3000DBD088F31188FFF72DFFFEE7FFF79FFECA
+:109D400000F00CF803D2FFF765FCFFF723FF03F0E8
+:109D5000BCFF3046BDE8F28304ED00E0A86AC16AAA
+:109D6000E06A8142704700002DE9F04704460F4643
+:109D700092461D4601264FF0500824B988F31188F9
+:109D8000FFF708FFFEE703F0C7FFEFF3118988F341
+:109D90001188FFF7FFFE0DB1606D286000F042F8FA
+:109DA000BAF1040F18D8DFE80AF006030F05130014
+:109DB000616D0F43676501282FD1A06AA8B188F3B0
+:109DC0001188FFF7E7FEFEE7616D491C6165F2E768
+:109DD0000228EFD1002620E0616D11F1010FEAD0D9
+:109DE00088F31188FFF7D6FEFEE7274D286F40B9AC
+:109DF000FFF79BFEFFF798FD38BF6A6500F018F883
+:109E000002E004F11801284603F0C7FFFFF7A6FFA0
+:109E100003D2089800B106602E6689F31188304697
+:109E2000BDE8F087022194F8580084F85810704774
+:109E300014204243211D98187047F8B5124D2F6D1C
+:109E40000C46A96A0646081D03F0CCFF16F1010F67
+:109E500005D124B1A86A011D05F138001AE0A86AED
+:109E6000F6194660BE42A86A05D2011D286BBDE8FE
+:109E7000F44003F09EBF011DE86A03F09AFFE86E0C
+:109E8000864238BFEE66F1BD705600208C49002036
+:109E900004ED00E0BDE8F44003F07FBF38B50400F6
+:109EA0000D4602D100F0E4F8FEE703F0F5FE206C69
+:109EB000E16B226800FB01F3491E13444843A36091
+:109EC00010440023A363E060626004F144004FF09B
+:109ED000FF310170417075B92069A0B104F1100023
+:109EE000FFF7FEFC78B1DFF890184FF08050086063
+:109EF00000F043FB07E004F1100003F041FF04F120
+:109F0000240003F03DFF03F0E0FE012032BD7CB5EC
+:109F10001C46502320B983F3118800F02EFBFEE786
+:109F200024B983F3118800F028FBFEE72AB129B990
+:109F300083F3118800F021FBFEE769B90093009ECE
+:109F4000502E0ED1069B009D012684F84660009499
+:109F500000F02BF8204676BD83F3118800F00DFB4E
+:109F6000FEE783F3118800F008FBFEE7F8B5060072
+:109F70000D46174602D100F07BF8FEE7002D0EBF1C
+:109F8000502005FB06F0503003F032FD04000AD0EB
+:109F9000002084F8460000943B4604F15002294614
+:109FA000304600F002F82046F2BD38B5049D1C464C
+:109FB00001B92A462A60E863296428460121FFF78F
+:109FC0006DFF85F84C4031BD30B1002181600160EA
+:109FD000C1600023002284E0704710B502460021D2
+:109FE0000120FFF7C3FF0446FFF7EEFF204610BD38
+:109FF0001CB500900B46002200210120FFF787FFCF
+:10A000000446FFF7E1FF204616BD10B5040002D15B
+:10A0100000F02EF8FEE7FFF73FFDA16881420BD16B
+:10A02000E068401EE06005D10023002200212046A8
+:10A0300000F057F8012010BD002010BD38B5040015
+:10A040000D4602D100F014F8FEE7FFF725FDA168E8
+:10A05000814204D1E068401CE060012032BD294605
+:10A06000204600F0E0F910B1E168491CE16032BD22
+:10A07000502080F31188BFF34F8FBFF36F8F70476D
+:10A080001CB50C461346502120B981F3118800F00D
+:10A0900074FAFEE7A04204D281F3118800F06DFA51
+:10A0A000FEE70221009100220021FFF730FF00B1FE
+:10A0B000846316BD10B50C46502120B981F3118878
+:10A0C00000F05BFAFEE7A04204D281F3118800F0B1
+:10A0D00054FAFEE702220021FFF748FF00B1846333
+:10A0E00010BD2DE9F64782B004461E46502714B92C
+:10A0F00000F041FAFEE75FEA010A01D1206C70B975
+:10A10000022E02D1E06B01280CD1FFF7C9FC002818
+:10A110005ED1039800285BD000F02DFAFEE700F036
+:10A120002AFAFEE700F027FAFEE7039907F110008C
+:10A13000FFF7ABFB384600F0BFFAFFF7C8FA18B9D3
+:10A14000C8F8009000F019FA03F0A6FDB86BF96B9F
+:10A15000884242D3022E40D00398002835D014B94B
+:10A1600000F0F5F9012403F0B0FDFFF795FA03F0D4
+:10A1700093FD07F1440000F0EDF904BF00220270E6
+:10A1800000F0EDF904BF0022427003F09EFD00F0E4
+:10A190003CF888BB03F080FDB86BF96B884214BFB4
+:10A1A0000025012503F091FD002DBED1384600F0B9
+:10A1B00083FAFFF78CFAC7E718B1C8F8009000F0EF
+:10A1C000DCF903F082FD01201CE003F07EFD18E0C5
+:10A1D0002746002400F022F9B6E7324651463846B9
+:10A1E00000F022FA796A0029E6D007F12400FFF78F
+:10A1F00077FB0028E1D1E4E7384600F05DFAFFF78D
+:10A2000066FA002004B0BDE8F08703A96846FFF7AE
+:10A210009EBB2DE9F8430446884615461E46502746
+:10A2200014B900F0A8F9FEE7B8F1000F01D1206CD5
+:10A2300020BB022E02D1E06B012822D103F06CFD7D
+:10A24000EFF3118900F062F801D3022E21D194F9C5
+:10A25000457032464146204600F0E6F917F1010FFD
+:10A2600012D1606A98B104F12400FFF739FB00288D
+:10A2700018BF002D0BD00120286008E000F07BF90A
+:10A28000FEE700F078F9FEE77F1C84F845700120B6
+:10A2900000E0002089F31188BDE8F283F8B5044698
+:10A2A0000D46502714B900F066F9FEE7206C10B196
+:10A2B00000F061F9FEE7216809B9A068D0B903F0A0
+:10A2C0002BFDEFF3118600F021F81BD294F9451015
+:10A2D000401C11F1010FA0630FD1606A80B104F13D
+:10A2E0002400FFF7FDFA002818BF002D08D0012038
+:10A2F000286005E000F03FF9FEE7491C84F84510AE
+:10A30000012000E0002086F31188F2BD87F3118858
+:10A31000BFF34F8FBFF36F8FA06BE16B8842704725
+:10A320002DE9F74306460F460024502526B985F34C
+:10A33000118800F022F9FEE70FB9306C48B9FFF739
+:10A34000AFFB78B9029868B185F3118800F015F970
+:10A35000FEE785F3118800F010F9FEE700F009F937
+:10A36000FFF7B5F903F098FCB56B00F057F825B985
+:10A370000298B8B903F0A9FC4DE03946304600F028
+:10A3800087F96D1EB563306940B106F11000FFF723
+:10A39000A7FA18B1C8F8009000F0EFF803F095FCA8
+:10A3A000012039E014B900F0D2F8012403F08DFC4B
+:10A3B000FFF772F903F070FC06F14400415711F108
+:10A3C000010F04BF0022027000F0C9F804BF002290
+:10A3D000427003F07AFC02A9FFF718FF002830460C
+:10A3E00010D100F09BF90028B8D000F0BDF800F0C3
+:10A3F000C0F8FFF76CF90028B4D1C8F8009000F05D
+:10A40000BCF8AFE700F058F9FFF761F9304600F00B
+:10A4100085F90028A6D00020BDE8FE83DFF8588328
+:10A420004FF0805970472DE9F24382B00646002470
+:10A430000025502716B900F09EF8FEE7306C10B1E9
+:10A4400000F099F8FEE7FFF72BFB40B9029830B116
+:10A4500000F091F8FEE700F08CF8FFF738F903F010
+:10A460001BFCB06BFFF7DAFF28B90298D0B9C5B171
+:10A4700000F081F8FEE7401EB063306810B9FFF7C6
+:10A48000C7FBB060306940B106F11000FFF728FA51
+:10A4900018B1C8F8009000F070F803F016FC012025
+:10A4A00053E04FE014B900F052F8012403F00DFC22
+:10A4B000FFF7F2F803F0F0FB06F1440000F04AF871
+:10A4C00004BF0022027000F04AF804BF002242706C
+:10A4D00003F0FBFB02A9FFF799FE002830461AD1D2
+:10A4E00000F01CF90028B6D0306838B903F0D4FB6E
+:10A4F000B068FFF7E5FA054603F0E7FB00F034F833
+:10A5000000F037F8FFF7E3F80028A8D1C8F800906A
+:10A5100000F033F8A3E700F0CFF8FFF7D8F83046A3
+:10A5200000F0FCF800289AD075B103F0B5FB706A12
+:10A5300000281DBF306B0168C1F138010021B068EF
+:10A54000FFF72DFB03F0C1FB0020BDE8FE8368464A
+:10A55000FFF7F6B990F9001011F1010F704790F96B
+:10A56000011011F1010F7047029906F12400FFF765
+:10A570008CB93046A0E087F31188BFF34F8FBFF34B
+:10A580006F8F70472DE9F84304460F461546502655
+:10A5900024B986F31188FFF7F0FFFEE70FB9206CAE
+:10A5A00070B903F0B9FBEFF3118886F31188FFF758
+:10A5B000E4FFA66B4EB9002088F31188BDE8F28352
+:10A5C00086F31188FFF7D9FFFEE794F944903946E6
+:10A5D000204600F05DF8761E19F1010FA6630CD13C
+:10A5E000206970B104F11000FFF77AF9002818BF54
+:10A5F000002D06D00120286003E009F1010084F855
+:10A6000044000120D8E710B5040002D1FFF730FD67
+:10A61000FEE700F09EF894F8460020B92046BDE819
+:10A62000104003F06EBA10BDF8B506461546B46B7F
+:10A63000326C002742B9316831BBB068FFF778FA55
+:10A6400000210746B1601FE065B97068FCF774F936
+:10A650007068316C0844B1687060884214D3306807
+:10A66000706011E0F068FCF767F9306CF168404207
+:10A670000144F1603268914202D2B1680844F0604E
+:10A68000022D01D104B1641E641CB4633846F2BDCE
+:10A69000026C002A0B4600D1704710B5C16884686F
+:10A6A0001144C160A14224BF0168C160C168BDE816
+:10A6B00010401846FCF740B9F8B5054603F0ECFA2F
+:10A6C00005F1440494F9016070B2012815DB686A51
+:10A6D00098B105F12400FFF703F908B1FFF766F917
+:10A6E000761EF1E72869A0B105F11000FFF7F8F830
+:10A6F00008B1FFF75BF97F1E08E04FF0FF36667088
+:10A7000003F0E3FA03F0C8FA94F9007078B2012874
+:10A71000E8DA2670BDE8F14003F0D7BA10B5044678
+:10A7200003F0BAFAA06B441EA44103F0CEFAE00F86
+:10A7300010BD10B50023114C54F833201AB15B1C26
+:10A74000082BF9D310BD44F8331004EBC301486063
+:10A7500010BD10B50021094A02EBC1035C688442B8
+:10A7600003D0491C0829F7D310BD002042F831005E
+:10A77000586010BD0000000004ED00E0945A002075
+:10A78000F8B504460D46164603F086FA04F138077C
+:10A7900097F90C0010F1010F04BF0021397397F9EC
+:10A7A0000D0010F1010F04BF0021797303F08DFA41
+:10A7B000386828B93246294604F12400FFF776F8B4
+:10A7C0002046BDE8F24077E72DE9F8438EB002A8B5
+:10A7D0000FF6F031DFF8A04BDFF8A05BDFF8A06BDD
+:10A7E000DFF8A09BDFF8A08B3022FCF7B5F8002043
+:10A7F000FCF74AFDA061002200210120FCF7D6FDF4
+:10A80000E06108F12607DFF8840B0FF64531009070
+:10A81000019169460FF62130FEF7C0F901210220AF
+:10A8200003F0CFFC0FF6CC320FF6D5200021FCF759
+:10A8300015FC606200F00AFC014640F25B1300F078
+:10A84000EFFA616ADFF8480B4FF4C062FCF760F87A
+:10A8500000F0FCFB01464FF4AE7300F0E1FA606AD1
+:10A86000FCF752FC0146DFF82C0BFCF751F802A86C
+:10A8700002F008FE00F0E1FAFCF770FE002088F814
+:10A8800090004FF6FF70388000F0E0FB014640F288
+:10A89000791300F0C5FA4FF44861DFF8FC0AFCF7C1
+:10A8A00037F800F0D3FB01464FF4BF7300F0B8FA5D
+:10A8B0004FF47061DFF8E40AFCF72AF800F0C6FBF9
+:10A8C000014640F2851300F0ABFA4FF4A051DFF8D7
+:10A8D000D00AFCF71DF80FF640320FF6A110002148
+:10A8E000FCF7BCFB206200F0B1FB01464FF4C473DF
+:10A8F00000F096FA216ADFF8AC0A4FF44072FCF7D8
+:10A9000007F800F0A3FB014640F2891300F088FA33
+:10A9100000F074FC00F075FC03F06AFC03F095FC99
+:10A92000F6F72CFC0FF6ED03002208F19C01002045
+:10A9300003F076FF0220F87080210120B8700D200E
+:10A9400038710220B870182078710320B870DFF8D1
+:10A95000580A0180A0214180012000F07AFB0FB04D
+:10A96000BDE8F0832DE9F843044688B06078DFF84D
+:10A97000185ADFF80C6ADFF8349ADFF8008A0528E5
+:10A9800005F1900705D03E284FD0FF2800F0368112
+:10A9900042E2A088E98C884243D10020E8843870E4
+:10A9A000A07950B900F040FA01464FF4E97300F085
+:10A9B00037FAA179DFF8F80928E016280AD100F063
+:10A9C00033FA01464FF4EA7300F02AFAA179DFF86E
+:10A9D000E4091BE03D2840460ED1FCF783FA01460E
+:10A9E0004FF4EB7300F01CFAA1790FF65020FBF73F
+:10A9F0008FFFF9F77BF80BE0FCF774FA01464FF490
+:10AA0000ED7300F00DFAA1790FF6A020FBF780FF9F
+:10AA100009208DF8180006A8A188ADF81A10FBF7D8
+:10AA20005BFB012000F015FBF6E1E078012800F067
+:10AA30009780032802D00C2822D0EDE100F0F4F931
+:10AA400001464FF4FA7300F0EBF90FF6A820FBF77C
+:10AA50005FFF00F0E9F9014640F2F91300F0E0F978
+:10AA6000B4F80B000190B4F809000090B4F8073076
+:10AA7000B4F8052021790FF6A820FBF749FFCBE1B8
+:10AA800000F0D2F9014640F2022300F0C9F9207A21
+:10AA90000090E379B4F8052021790FF61030FBF728
+:10AAA00037FF20790028404609D1FCF71BFA014600
+:10AAB00040F2052300F0B4F90FF6443008E0FCF74B
+:10AAC00011FA014640F2092300F0AAF90FF65830B6
+:10AAD000FBF71EFF0C208DF8180006A8B4F805102F
+:10AAE000ADF81A10FBF7F8FAE88C07AA0DF11D0172
+:10AAF000FDF7BFF80028404628D1FCF7F3F90146DE
+:10AB000040F2132300F08CF90FF644300FF6543462
+:10AB1000FBF7FEFE9DF81D00022804BF9DF81C10E7
+:10AB2000022904D100F080F940F2172303E000F07D
+:10AB30007BF940F21B23014600F072F99DF81C20BE
+:10AB40009DF81D102046FBF7E3FE65E1FCF7CAF90E
+:10AB500001464FF4087300F063F90FF6243059E111
+:10AB6000387B03F083FE00F05FF9014640F23123A9
+:10AB700000F056F9B4F805100FF62030FBF7C8FEC8
+:10AB8000387804280CBF062005203870B4F805007A
+:10AB9000E88400F049F9014640F2472300F040F90B
+:10ABA000607A0590A07A0490E07A0390207B02906E
+:10ABB000607B0190A07B0090237AE279B4F80510C5
+:10ABC0000FF60C30FBF7A4FEB4F80500788004F112
+:10ABD0000902207A7871A07BF872607BB872207BC2
+:10ABE0007872E07A3872A07AF871607AB871217A56
+:10ABF000B4F80500F8F7C4FF0620EEE0B4F803004F
+:10AC00000FF648374FF48061401A1BD0401E00F009
+:10AC10009E80401E20D0401E2DD0401E3AD0401EA7
+:10AC200045D0401E50D0401E00F0EB80401E51D059
+:10AC3000401E62D0401E56D040F60601401A00F079
+:10AC4000D680E9E000F0F0F8014640F26F2300F012
+:10AC5000E7F80FF61C30DDE000F0E6F8014640F2C0
+:10AC6000752300F0DDF8B4F805100FF63030FBF76F
+:10AC70004FFE1520B1E000F0D7F8014640F27F23E7
+:10AC800000F0CEF8B4F805100FF66430FBF740FE84
+:10AC90001920A2E000F0C8F801464FF4227300F03A
+:10ACA000BFF80FF6AC30FBF733FE11204BE000F09D
+:10ACB000BBF8014640F2922300F0B2F80FF61040C4
+:10ACC000FBF726FE12203EE000F0AEF8014640F20F
+:10ACD0009A2304E000F0A8F8014640F29E2300F019
+:10ACE0009FF8384696E000F09FF8014640F2A22314
+:10ACF00000F096F80FF608408CE000F095F8014659
+:10AD000040F2A72300F08CF8D4F807100FF61C408F
+:10AD1000FBF7FEFD00F088F801464FF42A7300F0BF
+:10AD20007FF8D4F807100FF61C40FBF7F1FD00F098
+:10AD30007BF8014640F2AA2300F072F80FF61840A3
+:10AD4000FBF7E6FD1720E98C8DF8180049E000F0CC
+:10AD50006BF8014640F2B52300F062F8237AE279FD
+:10AD6000B4F805100FF64440FBF7D2FDE07948B97E
+:10AD700000F05AF8014640F2B72300F051F80FF600
+:10AD80007C400AE001280BD100F04EF8014640F269
+:10AD9000B92300F045F80FF67840FBF7B9FD10E055
+:10ADA00002280ED100F040F8014640F2BB2300F02B
+:10ADB00037F8227AE1790FF67040FBF7A9FDF8F732
+:10ADC00095FE00F031F801464FF4307300F028F89A
+:10ADD0000FF6F440FBF79CFD14208DF81800B4F832
+:10ADE0000510ADF81A1006A8FBF776F914E000F08C
+:10ADF0001BF801464FF4327300F012F80FF60050C2
+:10AE000008E000F011F8014640F2CF2300F008F806
+:10AE10000FF61450FBF77CFD012009B0BDE8F0836C
+:10AE20004A463046FBF774BD4046FCF75BB8F8F77E
+:10AE300081BDF8F7C6BDF8F703BE2DE9F8470FF658
+:10AE40001050DFF874550088DFF82C6589B0ADF834
+:10AE50001A00FCF7B0FE286810F1010F0ED06968E7
+:10AE60003074090A020A000CB074727406F11004FE
+:10AE700068683175F074090A717507E0002003F005
+:10AE800091FD002814BF04460FF6C844224606214F
+:10AE9000002003F099FD60790FF6C0480FF6CC4909
+:10AEA0000FF6D84A30724246207970721021E0784D
+:10AEB000B07207AFA078F07260783073207870734A
+:10AEC000182003F081FD00F0B8F84EF66E5078605F
+:10AED00007AA2868DFF8A454DFF8A46407900621C5
+:10AEE0002E2003F071FD00F0B1F8014640F24B3323
+:10AEF00000F0A8F82078029060780190A078009087
+:10AF0000E378227961790FF68C40FBF701FD00F0C0
+:10AF10009DF801464FF4537300F094F8079A79684E
+:10AF20000FF69C40FBF7F4FC42461021182003F07A
+:10AF30004BFD00F082F81821012003F06CFDFBF7B7
+:10AF40004EFD00F083F801464FF45A7300F07AF892
+:10AF50000FF68840FBF7DCFC0DF1160006A9019006
+:10AF6000009105AB072200210120FCF790FC0FF6B1
+:10AF70008C40BDF8181000900523BDF81400002285
+:10AF8000FBF7EDFD50B100F061F8014640F2793376
+:10AF900000F058F80FF66C40FBF7BAFC0DF11A0000
+:10AFA00000900223BDF81610BDF814000022FBF734
+:10AFB000D6FD50B100F04AF8014640F2833300F06C
+:10AFC00041F80FF67040FBF7A3FC0222022100209B
+:10AFD000FCF782FEDFF8B04303202070FCF7D2FBC1
+:10AFE00000206070E070082060751020A0750020BF
+:10AFF0002075DFF8C803A0610120A0700020211D8A
+:10B00000C2B28854401CC1B21029F8DB0020049061
+:10B010000023A069617803900122207D0290A07D29
+:10B020000190607D0090A078FCF7C5FBA07808B186
+:10B03000FCF7C8FC0AB0BDE8F0874A46102108209A
+:10B0400003F0C2BC52463046FBF762BC2846FBF711
+:10B0500049BF2DE9F04F05462E46012E89B003D198
+:10B06000D1480788408803E04FF4C8674FF47A60FE
+:10B07000ADF82000DFF810830FF650590FF6385A5C
+:10B080000FF6E03B08F190000790007B03F0EEFB29
+:10B0900000F0BCF8014640F2C93300F0ABF8079865
+:10B0A00001780FF6CC30FBF733FC022E22D1079843
+:10B0B0000078012818BF02281CD1FCF708FB040007
+:10B0C00048460BD1FBF70EFF014640F2D33300F0A8
+:10B0D00091F80FF6B830FBF71BFC0BE0FBF702FF13
+:10B0E000014640F2D73300F085F821460FF6C03014
+:10B0F000FBF70EFC00F08AF8014640F2DA3300F06C
+:10B1000079F89D4C00F07AF800F07BF8079805700C
+:10B1100000200690059008F129010491062298F874
+:10B1200028000FF6B431019203900291002300939E
+:10B130003946BDF820200020FCF7DBFA00F066F865
+:10B14000014640F2EB3300F055F800F057F800F0FC
+:10B1500058F821460E20FCF7E0FB05001FD1012E18
+:10B16000484610D1FBF7BEFE014640F2F33300F033
+:10B1700041F80FF66C30FBF7CBFB07989049007B4A
+:10B1800003F0C3FB25E0FBF7ADFE014640F2F933C7
+:10B1900000F030F80FF67030FBF7BAFB19E0012E23
+:10B1A00048460AD1FBF79EFE01464FF4806300F04B
+:10B1B00021F829460FF67C3009E0FBF793FE0146A3
+:10B1C00040F2044300F016F829460FF69830FBF7DA
+:10B1D0009FFB00F01BF801464FF4816300F00AF872
+:10B1E00000F00CF809B0BDE8F04F01460FF67C40C6
+:10B1F000FBF78EBB5A465046FBF78ABB206AFBF72B
+:10B2000083BF01460FF66440FBF782BB4846FBF75D
+:10B2100069BE00002DE9F0410FF6B0340FF6983505
+:10B220000FF67836544F0FF644482046FBF75AFE87
+:10B23000014640F2534332462846FBF769FB386A21
+:10B24000FBF762FF01464046FBF762FB386A0121CB
+:10B25000FBF772FF2046FBF745FE014640F25543DF
+:10B2600032462846FBF754FB386AFBF74DFF014690
+:10B270004046BDE8F041FBF74BBB00002DE9F0472D
+:10B2800040F266440FF6E4353B4E0FF62C370FF6CE
+:10B2900014380FF6383A40F264495046FBF722FE64
+:10B2A00001464B4600F024F8306AFBF72DFF00F012
+:10B2B00023F800F02BF85046FBF714FE0146234616
+:10B2C00000F016F8306AFBF71FFF00F015F80220B7
+:10B2D000FFF7BFFE5046FBF705FE01464FF48D63B6
+:10B2E00000F006F8306AFBF70FFF00F005F8D4E72E
+:10B2F00042463846FBF70CBB01462846FBF708BB25
+:10B3000080B500F003F8FDF768FCFAE74FF0FF3274
+:10B3100000210120FBF74DBF1748406A0121FBF7D0
+:10B320000BBF1548C069FCF7C7B81348C0694FF098
+:10B33000FF31FCF792B8000010B50446616801F1D6
+:10B340000800FCF723F900B10120207010BD0000B7
+:10B35000094A926982B010B1012806D009E04FF085
+:10B36000FF31104602B0FBF7CABF104602B0FBF730
+:10B37000F6BF02B07047000004000020CCBD0008FA
+:10B38000B8BD000898250108D0550020B00803205A
+:10B39000A8250108E4250108202601084C260108FB
+:10B3A0007C260108B0260108705C0020EC2601080C
+:10B3B00004270108502701088075FF1F07B201000C
+:10B3C00046E0010000000000000000000000000056
+:10B3D00000000000000000004400080040050801D3
+:10B3E0003A79FA00F4010000FFFFFFFF4801010075
+:10B3F000000000008025010800000000000000009F
+:10B400000000000000000000000600000000000036
+:10B4100000000000000000006C2501080000000092
+:10B420000000000000000000000000000003000019
+:10B430000000000000000000000000000D0A0D2ABE
+:10B440002A20444953434F4E4E454354494F4E20C2
+:10B450004556454E54205749544820434C49454E83
+:10B460005420646973636F6E6E656374696F6E20D8
+:10B47000526561736F6E3D30782530325820436FCE
+:10B480006E6E656374696F6E207465726D696E614E
+:10B490007465642064756520746F204D494320668F
+:10B4A00061696C757265200A0D0000000D0A0D2A95
+:10B4B0002A20444953434F4E4E454354494F4E2052
+:10B4C0004556454E54205749544820434C49454E13
+:10B4D0005420646973636F6E6E656374696F6E2068
+:10B4E000526561736F6E3D307825303258200A0DF9
+:10B4F000000000000D0A0D2A2A20434F4E4E4543FE
+:10B5000054494F4E20555044415445204556454ED0
+:10B5100054205749544820434C49454E54200A0072
+:10B520004556545F4C455F434F4E4E5F5550444126
+:10B5300054455F434F4D504C4554452053746174FE
+:10B5400075733D30782530325820436F6E6E6563D9
+:10B5500074696F6E5F48616E646C653D307825304C
+:10B56000345820436F6E6E5F496E74657276616CFD
+:10B570003D30782530345820436F6E6E5F4C6174D7
+:10B58000656E63793D307825303458205375706589
+:10B5900072766973696F6E5F54696D656F75743D1E
+:10B5A000307825303458200A0D0000004556545F8D
+:10B5B0005550444154455F5048595F434F4D504C9E
+:10B5C000455445205374617475733D30782530328D
+:10B5D0005820436F6E6E656374696F6E5F48616E6D
+:10B5E000646C653D3078253034582054585F50489D
+:10B5F000593D25642C52585F5048593D25640A0036
+:10B600004556545F5550444154455F5048595F4337
+:10B610004F4D504C4554452C207374617475732004
+:10B620006F6B200A000000004556545F555044419E
+:10B6300054455F5048595F434F4D504C4554452C3D
+:10B6400020737461747573206E6F6B200A000000A4
+:10B65000526561645F504859207375636365737305
+:10B66000200A000050485920506172616D2020541A
+:10B67000583D2025642C2052583D202564200A0086
+:10B680005265616420636F6E66206E6F74207375FF
+:10B69000636365657373200A000000004556545FBC
+:10B6A0004C455F434F4E4E5F434F4D504C455445C4
+:10B6B00020666F7220636F6E6E656374696F6E20B3
+:10B6C00068616E646C6520307825780A000000009F
+:10B6D0004556545F4C455F434F4E4E5F434F4D5070
+:10B6E0004C45544520436F6E6E656374696F6E5FA1
+:10B6F00048616E646C653D30782530345820526F57
+:10B700006C653D256420506565725F4164647265B7
+:10B7100073735F547970653D256420506565725F71
+:10B72000416464726573733A253032582025303293
+:10B7300058202530325820253032582025303258B4
+:10B740002025303258200A0D000000000D0A0D2A75
+:10B750002A204556545F424C55455F4741505F444F
+:10B7600045564943455F464F554E44200A00000068
+:10B770000D0A0D2A2A204556545F424C55455F4715
+:10B7800041505F4C494D495445445F444953434FF0
+:10B7900056455241424C45200A0000004556545F30
+:10B7A000424C55455F4741505F504153535F4B45B5
+:10B7B000595F52455155455354203D3D3E20414E21
+:10B7C00043535F504153535F4B45595F5245515569
+:10B7D00045535420436F6E6E656374696F6E5F48A6
+:10B7E000616E646C653D307825303458200A0D0058
+:10B7F0004556545F424C55455F4741505F41555453
+:10B80000484F52495A4154494F4E5F524551554550
+:10B81000535420436F6E6E656374696F6E5F486149
+:10B820006E646C653D307825303458203D3D3E20B7
+:10B83000414E43535F415554484F52495A41544930
+:10B840004F4E5F5245515F4556540A0D00000000AF
+:10B850004556545F424C55455F4741505F534C41FC
+:10B8600056455F53454355524954595F494E4954D3
+:10B87000494154454420736C617665207365637556
+:10B8800072697479207265717565737420697320AB
+:10B890007375636365737366756C6C792073656E1D
+:10B8A0007420746F20746865206D617374657220F4
+:10B8B0003D3E20414E43535F5345435552495459F1
+:10B8C0005F494E49544941544544200A0000000054
+:10B8D0004556545F424C55455F4741505F424F4E7D
+:10B8E000445F4C4F5354203D3D3E20414E43535FF7
+:10B8F000414C4C4F575F5245424F4E44200A0D0079
+:10B900000D0A0D2A2A204556545F424C55455F4783
+:10B9100041505F4B455950524553535F4E4F544928
+:10B920004649434154494F4E200A0000206E756D30
+:10B93000657269635F76616C7565203D2025640AD8
+:10B9400000000000204865785F76616C7565203DD9
+:10B950002025780A000000004556545F424C5545AA
+:10B960005F4741505F4E554D455249435F434F4DF0
+:10B9700050415249534F4E5F56414C5545203D3D35
+:10B980003E20414E43535F4E554D455249435F4320
+:10B990004F4D50415249534F4E5F56414C55455FB4
+:10B9A000434F4E4649524D200A0D00004556545F04
+:10B9B000424C55455F4741505F50414952494E47BF
+:10B9C0005F434D504C542C20436F6E6E6563746919
+:10B9D0006F6E5F48616E646C653D30782530345819
+:10B9E000205374617475733D256420526561736FD3
+:10B9F0006E3D307825303278200A0000202A2A2037
+:10BA000050616972696E67204F4B200A0000000088
+:10BA1000202A2A2050616972696E672054696D6519
+:10BA20006F7574200A000000202A2A205061697274
+:10BA3000696E67204B4F205374617475733D2564A4
+:10BA400020526561736F6E3D307825303278202C3E
+:10BA5000200A0D2021212120506C65617365206929
+:10BA6000676E6F7265207468697320424C4520448C
+:10BA70006576696365206F6E2074686520694F5331
+:10BA80002F416E64726F6964204465766963652036
+:10BA900053657474696E673D3E426C7565746F6F73
+:10BAA00074683D3E4D7920446576696365206F7208
+:10BAB0002050616972656420446576696365202160
+:10BAC0002121200A0D0000004556545F424C554587
+:10BAD0005F4741505F50414952494E475F434D5087
+:10BAE0004C54203D3D3E20414E43535F504149520E
+:10BAF000494E475F434F4D504C455445200A0D0079
+:10BB0000202A2A204556545F424C55455F474154F0
+:10BB1000545F50524F4345445552455F434F4D503B
+:10BB20004C455445200A00000D0A0D2A2A2045568E
+:10BB3000545F424C55455F4741505F50524F43451B
+:10BB4000445552455F434F4D504C455445200A00E3
+:10BB5000400300006C7AD8AC57720000123456785B
+:10BB60009ABCDEF0123456789ABCDEF0FEDCBA09DC
+:10BB700087654321FEDCBA0987654321426C655F16
+:10BB80004863695F4761705F476174745F496E69BC
+:10BB90007400000062645F616464723A2025303290
+:10BBA0005820253032582025303258202530325840
+:10BBB00020253032582025303258200A0D00000050
+:10BBC0007372645F62645F616464723A2025303826
+:10BBD000582025303858200A0D00000047415020D9
+:10BBE000726F6C65202B204741505F504552495081
+:10BBF000484552414C5F524F4C450A004852616ED5
+:10BC000063000000446576696365204E616D6520C0
+:10BC10006163695F676174745F7570646174655FA7
+:10BC2000636861725F76616C7565206661696C65D9
+:10BC3000642E0A00417070656172616E63652061F7
+:10BC400063695F676174745F7570646174655F6375
+:10BC50006861725F76616C7565206661696C6564A8
+:10BC60002E0A00004164765F526571756573740039
+:10BC7000466972737420696E64657820696E202548
+:10BC800064207374617465200A0000005375636357
+:10BC900065737366756C6C792053746F707065642E
+:10BCA000204164766572746973696E67200A0000CA
+:10BCB00053746F70204164766572746973696E673E
+:10BCC000204661696C6564202C20726573756C7404
+:10BCD0003A202564200A0000094852616E63000082
+:10BCE0005375636365737366756C6C792053746107
+:10BCF000727420466173742041647665727469734E
+:10BD0000696E67200A00000053756363657373668C
+:10BD1000756C6C79205374617274204C6F7720506D
+:10BD20006F776572204164766572746973696E67B6
+:10BD3000200A0000537461727420466173742041BC
+:10BD400064766572746973696E67204661696C65B3
+:10BD500064202C20726573756C743A30782530320B
+:10BD600078200A005374617274204C6F7720506FF2
+:10BD7000776572204164766572746973696E6720B5
+:10BD80004661696C6564202C20726573756C743A29
+:10BD900020307825303278200A0000004164765F38
+:10BDA0004D67720041647655706461746550726FBE
+:10BDB00063657373000000000D0A205B25735D5BF3
+:10BDC00025735D5B25645D2000000000433A5C64E0
+:10BDD00065765C4749545F446F72795F4C6974744F
+:10BDE0006C65446F72795F4E5C73746D3332776249
+:10BDF0005F4D345F4669726D776172655C4669724A
+:10BE00006D776172655C50726F6A656374735C50C4
+:10BE10002D4E55434C454F2D574235352E4E7563AB
+:10BE20006C656F5C4170706C69636174696F6E738F
+:10BE30005C424C455C424C455F486561727452619E
+:10BE400074654672656552544F535F414E43535C6F
+:10BE500053544D33325F5750414E5C4170705C61BA
+:10BE600070705F626C652E6300000000617661692E
+:10BE70006C61626C6520737461636B2073706163C5
+:10BE80006520206F6620416476557064617465504A
+:10BE9000726F636573734964203A203078253038B7
+:10BEA00078200A002DE9F841384D0FF204180FF2FE
+:10BEB000EC060FF2DC070020286087B041F60A008C
+:10BEC000ADF8180000950323012206A90120FAF716
+:10BED0009DFD0400404609D1FBF704F80146872385
+:10BEE00000F03FF829880FF2301008E0FAF7FAFF67
+:10BEF00001468C2300F035F821460FF25C10FAF76A
+:10BF000007FD42F62920ADF81800012204920A200C
+:10BF1000A91C039000230222059102930193009231
+:10BF20002023288806AA0121FAF7BFFD0400404615
+:10BF300009D1FAF7D7FF0146A22300F012F8698869
+:10BF40000FF2541008E0FAF7CDFF0146A72300F0E6
+:10BF500008F821460FF27C10FAF7DAFC08B0BDE8C9
+:10BF6000F0813A463046FAF7D3BC80B542F6292232
+:10BF7000904209D10A680548009200220B79418855
+:10BF80000088FAF7ECFD02BD002002BD745C0020C1
+:10BF90004449535F496E6974000000000D0A205B3C
+:10BFA00025735D5B25735D5B25645D2000000000EB
+:10BFB000433A5C6465765C4749545F446F72795FCD
+:10BFC0004C6974746C65446F72795F4E5C73746D08
+:10BFD000333277625F4D345F4669726D77617265A7
+:10BFE0005C4669726D776172655C4D6964646C650D
+:10BFF00077617265735C53545C53544D33325F57B1
+:10C0000050414E5C626C655C7376635C5372635C3A
+:10C010006469732E63000000446576696365204996
+:10C020006E666F726D6174696F6E205365727669AA
+:10C03000636520284449532920697320616464653D
+:10C0400064205375636365737366756C6C79202522
+:10C050003034580A000000004641494C45442074E1
+:10C060006F206164642044657669636520496E666B
+:10C070006F726D6174696F6E205365727669636566
+:10C080002028444953292C204572726F723A20258A
+:10C090003032582021210A004D616E75666163744B
+:10C0A00075726572204E616D6520436861726163CF
+:10C0B00074657269737469632041646465642053B4
+:10C0C00075636365737366756C6C792020253034F5
+:10C0D00058200A004641494C454420746F20616451
+:10C0E00064204D616E756661637475726572204E71
+:10C0F000616D652043686172616374657269737410
+:10C1000069632C204572726F723A202530325820B4
+:10C1100021210A002DE9F041054686B06878002407
+:10C12000FF2861D1B5F803100FF208360FF2EC28A2
+:10C130000FF21430B74F40F60142891A2BD0123952
+:10C1400052D1FAF7CFFE01467123424600F049F979
+:10C150000FF25C30FAF7DCFBFA88B5F80710521CD6
+:10C16000914241D1AB7AB5F805006A7A0124012BDE
+:10C1700008D100920A35019500230022FAF72DFE1E
+:10C1800000202CE005F10A03019300928023012294
+:10C19000FAF723FE28E07A88B5F80710921C91423E
+:10C1A00022D1697B0124CA070DD5FAF79BFE01460F
+:10C1B000A323424600F015F90FF21430FAF7A8FB5A
+:10C1C0008DF808400DE0FAF78DFE0146A92342469E
+:10C1D00000F007F90FF23430FAF79AFB02208DF8DD
+:10C1E000080002A802F012F8204606B0BDE8F0816F
+:10C1F000FEB5014601AA487A8DF804004B7A0888FA
+:10C200005070DC0704D50888000A9070032300E012
+:10C210000223487A040707D54888D0545B1C488815
+:10C22000DCB2000A10555B1C4C7AE00610D50D7A82
+:10C2300000200BE001EB4004DFB2A688D6555B1C62
+:10C24000A488DEB2240A94555B1C401CA842F1DB92
+:10C2500001A970480091DBB2418800880022FAF7FA
+:10C260007EFCFEBD2DE9F84187B06B48694D0FF2A9
+:10C27000D8180FF2C0160FF2D027FBF777F941F666
+:10C280000D01ADF8181000950823012206A9012020
+:10C29000FAF7BCFB040040460AD1FAF723FE014638
+:10C2A00040F2B31300F09CF829880FF2A82009E0AF
+:10C2B000FAF718FE01464FF4DC7300F091F82146BE
+:10C2C0000FF2C820FAF724FB42F63720ADF8180029
+:10C2D000012204920A20A91C039000231022059138
+:10C2E0000293019300920723288806AA0121FAF7F6
+:10C2F000DCFB040040460AD1FAF7F4FD01464FF496
+:10C30000EA7300F06DF869880FF2B82009E0FAF7D7
+:10C31000E9FD014640F2D91300F062F821460FF220
+:10C32000E820FAF7F5FA42F63820ADF818000022B6
+:10C330000492029201920A20291D03900222059183
+:10C3400000F047F8040040460AD1FAF7CBFD014659
+:10C3500040F2EF1300F044F8A9880FF2F42009E04E
+:10C36000FAF7C0FD01464FF4FA7300F039F82146A0
+:10C370000FF21830FAF7CCFA42F63920ADF818006F
+:10C380000022049201920A20A91D03900223082290
+:10C390000591029300F01DF8040040460AD1FAF717
+:10C3A000A1FD014640F2092300F01AF8E9880FF2D6
+:10C3B0001C3009E0FAF796FD014640F20E2300F02A
+:10C3C0000FF821460FF23C30FAF7A2FA08B0BDE8A8
+:10C3D000F08100920123288806AA0121FAF765BBA3
+:10C3E0003A463046FAF794BA80B5002242F637232F
+:10C3F000C01A09D0401E0BD1064800910123818844
+:10C400000088FAF7ACFB02E00846FFF7F1FE0246AF
+:10C41000104602BD485C002015C1000848656172E5
+:10C42000526174655F4576656E745F48616E646CD9
+:10C43000657200000D0A205B25735D5B25735D5BF3
+:10C4400025645D2000000000433A5C6465765C472B
+:10C4500049545F446F72795F4C6974746C65446FC2
+:10C4600072795F4E5C73746D333277625F4D345F07
+:10C470004669726D776172655C4669726D7761724B
+:10C48000655C4D6964646C6577617265735C535477
+:10C490005C53544D33325F5750414E5C626C655C67
+:10C4A0007376635C5372635C6872732E6300000082
+:10C4B0004556545F424C55455F474154545F57526F
+:10C4C0004954455F5045524D49545F5245510A0009
+:10C4D0004556545F424C55455F474154545F415463
+:10C4E000545249425554455F4D4F4449464945448D
+:10C4F000204852535F4E4F54494649434154494F97
+:10C500004E5F454E41424C45440A00004556545F3B
+:10C51000424C55455F474154545F4154545249423F
+:10C520005554455F4D4F4449464945442048525370
+:10C530005F4E4F54494649434154494F4E5F444929
+:10C540005341424C45440A004852535F496E697456
+:10C5500000000000486561727420526174652053C8
+:10C5600065727669636520284852532920697320D3
+:10C570006164646564205375636365737366756C89
+:10C580006C7920253034580A000000004641494C9F
+:10C59000454420746F206164642048656172742092
+:10C5A000526174652053657276696365202848522C
+:10C5B00053292C204572726F723A20253032582050
+:10C5C00021210A0048656172742052617465204D12
+:10C5D0006561737572656D656E7420436861726123
+:10C5E000637465726973746963204164646564206F
+:10C5F0005375636365737366756C6C7920202530A1
+:10C600003458200A000000004641494C454420743B
+:10C610006F206164642048656172742052617465A2
+:10C62000204D6561737572656D656E742043686138
+:10C6300072616374657269737469632C20457272E8
+:10C640006F723A20253032582021210A0000000064
+:10C6500053656E736F72204C6F636174696F6E20E7
+:10C6600043686172616374657269737469632041C0
+:10C6700064646564205375636365737366756C6C7D
+:10C6800079202025303458200A0000004641494CCA
+:10C69000454420746F206164642053656E736F722B
+:10C6A000204C6F636174696F6E20436861726163CF
+:10C6B00074657269737469632C204572726F723A83
+:10C6C00020253032582021210A000000436F6E746B
+:10C6D000726F6C20506F696E742043686172616381
+:10C6E000746572697374696320416464656420537E
+:10C6F00075636365737366756C6C792020253034BF
+:10C7000058200A004641494C454420746F2061641A
+:10C710006420436F6E74726F6C20506F696E74206A
+:10C7200043686172616374657269737469632C2014
+:10C730004572726F723A20253032582021210A004A
+:10C74000704700000278C9B28A421AB11CBF10F8C3
+:10C75000012FF9E718BF00207047000080B508B925
+:10C760000FF21C0005490B681BB1222200219847DB
+:10C7700001E002F07BF9222002BD00006C5C002089
+:10C78000636F6E73747261696E742068616E646C3D
+:10C7900065723A20626164206D657373616765003C
+:10C7A000C9B2830706D0521E22D310F8013B99422A
+:10C7B000F7D11FE0083A13D302F1040241EA012144
+:10C7C00041EA014150F8043B121F21BF4B40A3F145
+:10C7D000013C2CEA030C1CF0803FF3D0C9B2001FCF
+:10C7E000083210F8013B521E28BF91EA030FF8D817
+:10C7F00018BF0120401E7047B3BBD9B1B2F5803FCE
+:10C800007DD2022A1ED98C46B1FBF2F102FB11C384
+:10C810001B0443EA1043B3FBF2FC02FB1C3380B25F
+:10C8200040EA0343B3FBF2F002FB103240EA0C4053
+:10C8300000237047022A05D98446B0FBF2F002FBC0
+:10C8400010C270474AB105D100F0010249085FEA01
+:10C850003000704700220023704702F00BB90B0034
+:10C860000200002100207047904271EB030CF6D3C8
+:10C87000B3F5803F2FD2F0B5B3FA83F7B1FA81F464
+:10C88000A7F10F0E3D1B5340CEF1200602FA0EF227
+:10C89000F3415340B5F10F0746D80F3C2C444140BB
+:10C8A000C4F12006A040F1414140B1FBF3F603FB87
+:10C8B0001611A2FB0645001BA94102D2761E801864
+:10C8C000594180EA010221FA0EF362FA0EF20021C8
+:10C8D0005A403046F0BD30B4B1FBF3FC03FB1C11F1
+:10C8E000A2FB0C45001BA94103D2ACF1010C80183E
+:10C8F000594130BC02460B46604600217047B2F1F8
+:10C90000807F65D3F0B5B2FA82F7B1FA81F4C7F14E
+:10C910000F063D1B22FA06F307F1110EF2412035F6
+:10C920005A40B5F10F07B8D94140C4F12006A040E4
+:10C93000F1414140B1FBF3FC03FB1C11A2FB0C4590
+:10C94000001BA94103D2BCF1010C801859410F2FE3
+:10C9500012D30F3FC90341EA5041B1FBF3F603FB89
+:10C960001611A2FB0645D4EBC030A94102D2761EB7
+:10C970008018594146EACC3C07B34140C7F1200634
+:10C98000B840F1414140B1FBF3F603FB1611A2FBA5
+:10C990000645001BA94102D2761E8018594180EA43
+:10C9A000010221FA0EF3C7F1200462FA0EF20CFA2A
+:10C9B00007F05A402CFA04F13043F0BD80EA01023E
+:10C9C00021FA0EF3002162FA0EF260465A40F0BDE1
+:10C9D0008C46B1FBF2F102FB11C31B0243EA106368
+:10C9E000B3FBF2FC02FB1C331B024CEA002043EABF
+:10C9F0001063B3FBF2FC02FB1C331B024CEA002069
+:10CA000043EA1063B3FBF2FC02FB1C331B024CEA4B
+:10CA1000002043EA1063B3FBF2FC02FB1C324CEA39
+:10CA20000020002370470000B0B581EA030C0CF031
+:10CA3000004C40F2FF7515EA11541DBF15EA13575B
+:10CA4000AC42AF4239E0E41923EA455343F4801382
+:10CA5000C90241F0004141EA505EC7021100A7FB44
+:10CA6000020200284FF00000EEFB01204FF0000111
+:10CA7000E3FB072118BF42F00102401800214941A1
+:10CA8000E3FB0E01A4F580640F0302D25200404183
+:10CA9000494154F101046CDD470872F1004250F144
+:10CAA000000051EB0451A1F580115CBF41EA0C017B
+:10CAB000B0BD4CEA05510020B0BD05EA1357AC42A9
+:10CAC00014BFAF4241E050EA410E1CBF52EA430E90
+:10CAD00002E061460020B0BD24423C441BD15FEA25
+:10CAE000070EF6D0090302BF01460020AEF1140E76
+:10CAF000B1FA81F7AEEB070401FA07FE0C37C7F174
+:10CB0000200100FA07F7C8404EEA000E23EA455319
+:10CB100043F48013A2E733F00043B3FA83F704BF72
+:10CB2000B2FA82FE77440B3FE41BB7F1200E2FBF11
+:10CB300002FA0EF3BB40C7F1200E22FA0EFE38BFF8
+:10CB400043EA0E03BA40641C82E750EA410E14BF68
+:10CB500052EA430E6FF000014FF4001717EB430F3A
+:10CB60008ABF194617EB410FB5E74CEA0551002083
+:10CB7000B0BDD4F10104B4F120070FDAC4F12007ED
+:10CB8000520828BF42F0010210FA07F501FA07F730
+:10CB9000E1BF2A43E0403843E1400FE0352C98DC08
+:10CBA000C7F1200452EA400220FA07F218BF42F00F
+:10CBB000010231FA07F0A1400A43002172F100425C
+:10CBC00050F1000051EB0C01B0BD000010B514464F
+:10CBD00000F002F8226010BDC1F30A5343B14A00CD
+:10CBE00012F5001F28D2A3F2FE32A1EB02517047CA
+:10CBF00050EA410C20D001F0004C31EA0C01B1FAAE
+:10CC000081F204BFB0FA80F3D2180B3AB2F12003DC
+:10CC10002CBF00FA03F1914041EA0C013EBFC2F182
+:10CC2000200C20FA0CF319439040524240F2FD339D
+:10CC3000D21A01EB03517047002270474FF4001CD9
+:10CC40001CEB410F94BF1CEB430F09E041EA030CBE
+:10CC500050EA4C0C52EA0C0C03D2994208BF9042A5
+:10CC6000704714BF8B428242704700004FF4001C93
+:10CC70001CEB410F94BF1CEB430F09E041EA030C8E
+:10CC800050EA4C0C52EA0C0C03D28B4208BF824291
+:10CC9000704714BF9942904270470000124254D42A
+:10CCA00040F2FF7C1CEA11530FD0634531D09B1832
+:10CCB00063453CBF01EB0251704701F0004141EA7E
+:10CCC0000C510020AFF30080704750EA410320D0A0
+:10CCD00001F0004C91EA0C011CD0B1FA81F30B3B3E
+:10CCE0009A420DD9D21A994051EA0C01C3F1200C95
+:10CCF00020FA0CFC61449840531C40F2FF7CD7E7BB
+:10CD0000914041EA0C01C2F1200C20FA0CF31943C6
+:10CD100090407047B0FA80F31533202BE0D3202ADF
+:10CD2000EED3203A203B9A4209D9D21A00FA03F1F5
+:10CD300041EA0C010020531C40F2FF7CB8E700FAE6
+:10CD400002F141EA0C0100207047524240F2FF7CA0
+:10CD50001CEA11530DD06345DBD0B2EB030C3CBF92
+:10CD6000A1EB025170470CF1010221EA035141F499
+:10CD7000801150EA410CCCD001F0004C352A27DC60
+:10CD800030B481EA0C01B2F1200309DAC2F12003C8
+:10CD9000044601FA03F5D0402843D1409C400CE002
+:10CDA000C3F12002450020FA03F418BF44F0010447
+:10CDB00021FA03F091400C43002174F1004550F139
+:10CDC000000051EB0C01244230BC7FF47BAF704774
+:10CDD0006146002076E70000C1F30A5340F2FE32BC
+:10CDE0009B1A14DDD3F120034FEAE17208DDC9027A
+:10CDF00041EA505141F00040D840801850407047FF
+:10CE000003F2E13010B1D24382F0004070470020BD
+:10CE100070470000C11768B14840401AB0FA80F26C
+:10CE20009040D21CC907C2F5846241EA025202EB6B
+:10CE3000D02140057047000070B44FF0004591EAE2
+:10CE4000030F41F119866B40841A71EB030603D27C
+:10CE5000001BB141121973414FF4001C1CEB410F30
+:10CE600034BF7CEB430442E00C0DA4EB1356352E8B
+:10CE70004FDC45EAC323DB0A45EAC121C912B6F1FA
+:10CE800020050DDD63FA05F6EB4086EA0305124244
+:10CE900018BF45F00105C01851F100010CD213E094
+:10CEA00062FA06F5F2405540F3415A40B340F34070
+:10CEB0005A408018594107D349085FEA30005FEAB9
+:10CEC000350528BF45F0010501F58011420875F1CF
+:10CED000004250F1000041EB04514E0016F5001FD6
+:10CEE00070BC38BF70470020090D090570471CEB66
+:10CEF000410F10D252EA43060BD0BCEB410F05D8CC
+:10CF00000C0DAB43661E342EB6DD02E0AB43801839
+:10CF1000594170BC704770BC70470000F0B540F2DA
+:10CF2000FF7581EA030C0CF0004C15EA11541DBF8B
+:10CF300015EA1357AC42AF42E5E0BC41C1F313011F
+:10CF4000C3F31303801A994143F4801304D2641E7F
+:10CF50004000494180185941C90241EA5051B1FB92
+:10CF6000F3F603FB1611A2FB0675D7EBC020A9410F
+:10CF700002D2761E80185941C90241EA5051B1FBD4
+:10CF8000F3FE03FB1E11A2FB0E75D7EBC020A941D7
+:10CF900003D2AEF1010E80185941890241EA905145
+:10CFA000760546EA8E2EB1FBF3F603FB1611A2FBC3
+:10CFB0000675D7EB8020A94102D2761E8018594110
+:10CFC000C90241EA50514EEA060EB1FBF3F603FBEB
+:10CFD0001611A2FB0675D7EBC020A94102D2761E1E
+:10CFE00080185941C90241EA5051B1FBF3F703FBE4
+:10CFF0001711A2FB0735D3EBC020A94167F1000749
+:10D000000CBF004247F0010766F3D5274FEA1E31F7
+:10D01000B80814F5806412DDBD0775F1004250EBCD
+:10D020000E5051EB045111F5801F5CBF41EA0C0119
+:10D03000F0BD4CF07F6141F0E0410020F0BDBD0744
+:10D040006D0840EA0E5041F48011D4F10104B4F1AE
+:10D0500020060ADAC4F120060200E04001FA06F3D5
+:10D06000E1401843B24015430EE0342C13DCC6F106
+:10D07000200445EA40056D0820FA06F2154321FA1E
+:10D0800006F0A1400D43002175F1004250F100006F
+:10D0900051EB0C01F0BD00205FEA0C01F0BDCFB9EF
+:10D0A00092185B41B3FA83F704BFB2FA82F6BF1954
+:10D0B0000B3FB7F120062FBF02FA06F3BB40C7F1C2
+:10D0C000200622FA06F638BF3343BA401CB1E419F1
+:10D0D000641E33E77F4231F00041B1FA81F404BFAE
+:10D0E000B0FA80F6A4190B3CB4F120062FBF00FA69
+:10D0F00006F1A140C4F1200620FA06F638BF3143FC
+:10D10000A0403C1B1AE7AC421ABF05EA1357AF42D6
+:10D1100012E050EA41061CBF52EA4306BFE750EA5C
+:10D120004107304661461CBF41EA0551F0BD52EA55
+:10D13000430C08BFC143F0BD00204FF4001616EBAE
+:10D14000410F98BF16EB430F08BF16EB410F24BFEA
+:10D15000C14305E016EB430F0CBF61464CEA055195
+:10D16000F0BD0000400D491840EA81200CD2490D65
+:10D17000A1F58061491C40F0004005DBD1F11F01A1
+:10D1800054BFC840C017704700207047014648B1DF
+:10D19000B0FA80F18840C91CC1F58461090501EB32
+:10D1A000D021400570470000014870470000000092
+:10D1B000701100200249016002490161704700BFFF
+:10D1C00087D20008B1D20008006040607047EFF3DA
+:10D1D000108172B6026882420CBF012000201CE060
+:10D1E000EFF3108272B603680B6048600160086854
+:10D1F000416023E0EFF3108272B6086043684B6031
+:10D2000041604868016019E0EFF3108172B643682D
+:10D2100002681A6042680068426081F310887047B3
+:10D2200010B5EFF3108472B602680A600068FFE779
+:10D23000FFF7EAFF84F3108810BD086082F31088BE
+:10D240007047000001F040BD6E486F49016001F178
+:10D250002002426001F13002826001F13C02026270
+:10D2600001F14402426201F14C02C26001F1540238
+:10D27000026101F17002426101F174028261803148
+:10D28000C16101F033BD38B50446604D05F11000B1
+:10D29000FFF79AFF5B494868A1680160E168C160D7
+:10D2A000456005F11001816001F03CFD58482DE01A
+:10D2B00080B554494A6813680120187201F038FD9E
+:10D2C000002002BD38B5524C504D07E0694605F1CB
+:10D2D0001000FFF7A5FF00982168884705F11000AE
+:10D2E000FFF775FF0028F1D031BD49484168084774
+:10D2F00038B50446474D2846006040604148C06844
+:10D30000A1680160456001F018FD43482168016093
+:10D3100061684160002032BD80B53A49CA6813682F
+:10D320001020187201F00FFD002002BD3549CA68B7
+:10D33000394910680B68184738B5374C354D06E049
+:10D3400069462846FFF76CFF0098616888472846C1
+:10D35000FFF73DFF0028F3D031BD38B504462F4D0F
+:10D360002846006040602E48006040602548006903
+:10D37000A1688160E168C160056121680160616840
+:10D380004160216941616169816131BD80B50146BA
+:10D390002348FFF72FFFBDE802400FF2090001F01C
+:10D3A000E2BC000038B5174C1D4D08E06946284620
+:10D3B000FFF736FF009920690069FFF71BFF284639
+:10D3C000FFF705FF0028F1D031BD10B5154C204600
+:10D3D000006040600B4841690C60BDE8104001F0FE
+:10D3E000D6BC1CB50F4C06E069462046FFF718FF77
+:10D3F0000098C046C0462046FFF7E9FE0028F3D05B
+:10D4000013BD000000000320BC0903209008032086
+:10D41000305C0020A8080320385C0020480A032064
+:10D42000285C0020500A0320134810B5016841F41D
+:10D4300080710160032001F0D0FC002001F038FD74
+:10D440000024002814BF012401F079FD204610BDFE
+:10D450000A4880687047094800787047084805E026
+:10D460000748016841F0020101607047016841F01E
+:10D470000101016070470000004000585C1000206E
+:10D48000042004E0F8B500F10C026B4621214FF6B0
+:10D490006640FFE701F0A5FE9DF80E0005B000BD57
+:10D4A000F8B500F10C026B460F214FF66840F1E72A
+:10D4B0002DE9F84F4FF00009644A654B4FF00F0813
+:10D4C00005460E4633E0634FBD4214BF07270427CD
+:10D4D0008F4027434CF82E70C1431C6801EA040CAE
+:10D4E0007468E40348BF40EA0C0CC3F800C05C68F1
+:10D4F00001EA040C7468A40348BF40EA0C0CC3F8AA
+:10D5000004C0146801EA040C7468E40248BF40EAED
+:10D510000C0CC2F800C0546801EA040C716889025E
+:10D5200048BF40EA0C0CC2F804C009F10109316897
+:10D5300031FA09F077D0012404FA09F414EA010061
+:10D54000F3D04FEA490C032101FA0CF16FEA010E06
+:10D550007168012918BF022903D0112918BF1229A7
+:10D5600011D1A968F7680EEA010107FA0CF73943EF
+:10D57000A960696821EA04047168C1F3001101FA25
+:10D5800009F10C436C60E968B4680EEA010104FA21
+:10D590000CF42143E9604FEA89017468022C18BF3A
+:10D5A000122C12D14FEAD90405EB840401F01C07B8
+:10D5B000D4F820A008FA07FB2AEA0B0AD6F810B024
+:10D5C0000BFA07F747EA0A0727622C680EEA0407F6
+:10D5D000347904F0030404FA0CF43C432C607468BE
+:10D5E000E400A2D5DFF870C04FEA990E5CF82E7007
+:10D5F00001F00C0108FA01F427EA0404B5F1904F98
+:10D6000008BF00270ED0154FBD4208BF012709D023
+:10D61000134FBD4208BF022704D0124FBD427FF412
+:10D6200052AF032754E7BDE8F18F81B0002A14BF41
+:10D630008161816201B070470B4A136803421CBFCD
+:10D64000106001F02FBF7047000000000008005874
+:10D6500080080058001000480800014000040048FD
+:10D6600000080048000C00480C080058B44900E0CD
+:10D67000B44981B00A6802430A6009680840009012
+:10D68000009801B0704738B5FFF7CEFEAE4C606829
+:10D6900040010ED56068C0000BD401F0D1FF01F04D
+:10D6A000CFFF206840F480302060216821F4803171
+:10D6B000216000F0FAF8002001F074F940B180799F
+:10D6C000A249E160E16821F47C5141EA0021E16076
+:10D6D00000F050F89E489F4C01689F4D0022026068
+:10D6E000026902F0500202610420FFF7C1FF01202D
+:10D6F000FFF7BEFF0220FFF7BBFF0420FFF7B6FFD6
+:10D700000120FFF7B3FF0220FFF7B0FF00220F2137
+:10D710000E2001F06FFB0E2001F089FB00220F218B
+:10D720003A2001F067FB3A2001F081FB00206060A5
+:10D7300025600F20A06047F6FF70E060204601F0F2
+:10D7400087FFCA206862FF2153206862A868C0086A
+:10D75000C000A8606962F9F747FC0FF220220FF2BF
+:10D76000C1100021F9F77AFC606201F089FDF9F738
+:10D7700054FCFEE738B5AEB01CA84821F9F720FCF0
+:10D7800001A81C21F9F71CFC08A85021F9F718FC86
+:10D7900001F056FF6C48714C016821F018010160DE
+:10D7A0004FF48032206820F4C06040F400702060A4
+:10D7B0004FF48075216801F4C06100910721009841
+:10D7C0001C9101201E900021402020901D92279145
+:10D7D0001F951CA801F0E9FF6F2001900221002095
+:10D7E000029103900490059006900790012101A8F2
+:10D7F00002F092FA43F60300089000214FF48040B3
+:10D8000019900E910F91102002211B901A911895DA
+:10D8100008A802F079FCE06920F07000E06150484F
+:10D820000168C1F303200090009830B9E16909094B
+:10D83000090141F00401E16108E00098E169801EFE
+:10D8400080F30400090940EA0110E061E06940F456
+:10D850000040E0612FB030BD10B5424C424800F0AE
+:10D8600017F84FF40040E061002020626062A0627F
+:10D87000204602F0C7FD0021204603F040FD0021B4
+:10D88000204603F047FD2046BDE8104003F01ABDD6
+:10D8900020604FF4E13060600020A060E060206113
+:10D8A0000C2060610020A0617047304881B00168A1
+:10D8B00041F4801101603F21006800F48010009065
+:10D8C00000982B4841604161016841F47C1101607E
+:10D8D000026942F47C120261016841F03F0101607B
+:10D8E000026942F03F02026101B0704738B5044658
+:10D8F00003F070FD14F1010F054609D0FFF7ABFDF1
+:10D90000241805E01B48016821F00401016030BFC4
+:10D9100003F060FD401BA042F4D331BD00000000C5
+:10D9200080B54FF0FF3201210120F9F742FCF8E702
+:10D9300000681149884208BF03F052BD70470000DB
+:10D94000480000584C00005890000058FECAFECA1B
+:10D9500080080058405B0020002800400004005868
+:10D960005875FF1F2858002000380140500000580B
+:10D97000040C005810ED00E000480140343001086C
+:10D980000000000000000000000000000000000097
+:10D99000000400001800000000000000000000006B
+:10D9A00010B5002488B9114803600E480E4B03607F
+:10D9B00002F068FD012805D007D3032804D038BF42
+:10D9C000022402E0012400E00324204610BD006888
+:10D9D0000549884204D105490868002818BF004756
+:10D9E000704700002858002000380140645C002087
+:10D9F0002DE9F8430446FBF74FFE694FB8684FF036
+:10DA00000009002508BB07F1180307F1180113F0FE
+:10DA1000070F4FF440500A4605D0CA1DD208D20065
+:10DA2000C2F54050081880180838C008C0003A6095
+:10DA30007D60B86045600560811A51601060506873
+:10DA40003861F8604FF0004078614FF05008786915
+:10DA5000044233D194B3083414F0070F1FBF04F10C
+:10DA6000080004F00704041B14F0070F02D000F0B4
+:10DA700041F8FEE714B3F868A0421FD33E68394668
+:10DA80007068A04223D2306800281CBF3146064689
+:10DA9000F6D11CE0301D02517460084600F05BF8BE
+:10DAA0007168F8683A69401AF860904238BF386186
+:10DAB000786901437160356009F00705FBF707FEDF
+:10DAC00015B100F017F8FEE74846BDE8F283B868E4
+:10DAD0008642F3D0326808680A6000F1080972686B
+:10DAE000121B112ADCD3311911F00700D2D000F03B
+:10DAF00001F8FEE788F31188BFF34F8FBFF36F8FF4
+:10DB00007047002800D1704738B5A0F10804244DB3
+:10DB100061686A695023114202D100F015F8FEE7EE
+:10DB2000206810B100F010F8FEE791436160FBF748
+:10DB3000B3FDE96860684118E960204600F00BF821
+:10DB4000BDE83140FBF7C3BD83F31188BFF34F8FAE
+:10DB5000BFF36F8F704730B511490A4600E0224687
+:10DB600014688442FBD35368D418844203D14068BC
+:10DB7000C3185360104643681468C518A54208D1FD
+:10DB800089688C4204D06168CB184360246800E047
+:10DB90000C460460824218BF106030BD00000000D7
+:10DBA000A81100204908490010B5A0F120034FF04A
+:10DBB00080749961DC611A600FF2110159616FF094
+:10DBC000020140F8241D203810BD000063494A6856
+:10DBD000502012F1010F06D080F31188BFF34F8F50
+:10DBE000BFF36F8FFEE780F31188BFF34F8FBFF352
+:10DBF0006F8FFEE77CB55A495A4B0A6850209A420B
+:10DC000002D100F082F8FEE70B68574CA34202D124
+:10DC100000F07BF8FEE7554A14780194FF23137057
+:10DC2000072513784D4C8DF800309DF80030A56025
+:10DC300003F05003237006E05B1EA3609DF80030E4
+:10DC40005B008DF80030A3689DF800502E06F3D4D9
+:10DC5000C3F10705042D02D000F057F8FEE71B02C0
+:10DC600003F4E063A36001981070086A40F4700048
+:10DC70000862086A40F07040086200F07EFA0020F6
+:10DC8000606003F0FFFB3A48016841F040410160E9
+:10DC900003F0E8FB002076BD502080F31188BFF32D
+:10DCA0004F8FBFF36F8F2D494A68521C012A4A607B
+:10DCB0000AD130490A68130606D080F31188BFF3F1
+:10DCC0004F8FBFF36F8FFEE770472449486838B91C
+:10DCD000502080F31188BFF34F8FBFF36F8FFEE7A3
+:10DCE000401E486008BF80F31188704780B55020FF
+:10DCF00000F00BF8FBF743FD18B11E494FF08050C0
+:10DD00000860002181F3118801BD80F31188BFF301
+:10DD10004F8FBFF36F8F7047EFF3058050211028AE
+:10DD20000E4A0BD3144B185C1378984206D281F339
+:10DD30001188BFF34F8FBFF36F8FFEE790680F4AD4
+:10DD4000136803F4E063984206D281F31188BFF3AD
+:10DD50004F8FBFF36F8FFEE7704700005010002019
+:10DD600000ED00E071C20F4170C20F4100E400E01D
+:10DD700034EF00E004ED00E0F0E300E00CED00E043
+:10DD800000F1080141604FF0FF31816000F10801AE
+:10DD9000C160016100210160704742684A60936878
+:10DDA0008B6093685960916008610168491C01604B
+:10DDB000704730B50A6812F1010F08BF036907D038
+:10DDC00000F1080300E023465C682568AA42FAD205
+:10DDD0005A684A6091608B60596008610168491C0B
+:10DDE000016030BD4368016982689A608368426857
+:10DDF0005A604A68824204BF82684A600022026117
+:10DE00000868401E086008687047000010B586B0BA
+:10DE100000F07DF9DFF84843A068D0B100210591FA
+:10DE2000049103AA04A905A8F9F788FB05980499A9
+:10DE300002900222009201910023039A0FF22831EE
+:10DE40000FF27100FBF7E6FAE06010B1012006B0B6
+:10DE500010BD00F0CBF8FEE785F31188BFF34F8FBC
+:10DE6000BFF36F8F7047F8B5044684B01E4600209C
+:10DE700014B900F0BBF8FEE7DFF8E472BD68BDB18D
+:10DE800006290091019202940CDAFBF709FE0228A0
+:10DE9000B86807BF0A9A0023002300226946FCF7EE
+:10DEA00020F905E00023324669462846FCF7B1F91F
+:10DEB00005B0F0BD80B5DFF8A8120A681068002828
+:10DEC0001DBF0021D0680068012100F003F800F0B8
+:10DED000AFF8F0E7FEB506460C46FBF7DDFB01A800
+:10DEE00000F047F80546019800283FD19C4F4CBBF5
+:10DEF000B5422CD3FBF7EBFB3868C168CC68201D1A
+:10DF0000FFF770FF94F82800410713D5A169334645
+:10DF10002A468919204600F071F878B10020009057
+:10DF20000023324600212046FFF79DFF30B900F064
+:10DF30005DF8FEE700F0FE0084F828002046216A24
+:10DF40008847F7BD786801684C1EA441E40FB868A3
+:10DF50002246711BFCF714FCFBF7B9FB40B9814961
+:10DF60004FF080500860FFF779FFF7BDFBF7AFFB7C
+:10DF7000F7BD2DE9FC410446FBF7FDFB784E054655
+:10DF8000306985420BD30020206035612846BDE80A
+:10DF9000F68178603F61391D3068FFF70AFF31680C
+:10DFA0000868F0B1C868D0F80080C768381DFFF76E
+:10DFB00019FF396A3846884797F828004107EED597
+:10DFC000B86940448045E4D30020009000234246D5
+:10DFD00000213846FFF747FF0028E0D100F006F89F
+:10DFE000FEE77068306071600120CDE7502080F35B
+:10DFF0001188BFF34F8FBFF36F8F704738B5002480
+:10E000008A4241600061564D06D38169D21A8A4224
+:10E0100006D2011D686807E09A4203D2994201D3F3
+:10E02000012403E0011D2868FFF7C3FE204632BD2E
+:10E0300038B586B04A4C04E0134689182846FFF7E5
+:10E04000DDFFA068002202A9FCF76AF9002854D07D
+:10E050000298002803D505990498039A90470298DE
+:10E060000028EED4049D686910B1281DFFF7BAFEA0
+:10E0700001A8FFF77EFF024602980928E1D8DFE8F1
+:10E0800000F006060635252D06063525D9E700F0F1
+:10E0900036F8A8690B4641182846FFF7AFFF00285D
+:10E0A000CFD0296A2846884795F828004107C8D567
+:10E0B00000210091039AA869821800232846FFF7DF
+:10E0C000D2FE0028BDD1FFF791FFFEE700F017F860
+:10E0D000A9610029B0D1FFF789FFFEE795F8280074
+:10E0E000810703D42846FFF70CFDAAE795F828001E
+:10E0F00000F0FE0085F82800A3E707B030BD95F8D2
+:10E10000280040F0010085F82800039970471CB5ED
+:10E11000FFF7C2FD124CA068E8B904F11400FFF744
+:10E120002FFE04F12800FFF72BFE04F114002060FD
+:10E1300004F13C0304F12800606004F18C0200202B
+:10E14000009010210A20FBF7E2FEA06018B10FF248
+:10E150002001FCF7EEFABDE81340FFF7B6BD000062
+:10E16000A454002004ED00E0546D72205376630047
+:10E17000546D725100000000704780B50FF23503F6
+:10E1800009490022002000F04BFB084800210160F3
+:10E1900081604FF47A7306490A68B2FBF3F35B1EA1
+:10E1A00043600721016001BD1C5C002010E000E01D
+:10E1B00074100020704700000C480021016041608D
+:10E1C000704710B500F00CF85C6819B1012904D152
+:10E1D000204301E024EA0000586082F3108810BD5B
+:10E1E000EFF3108272B6014B70470000205C0020F4
+:10E1F000E0B505A0042100908DF8041042F6292016
+:10E200006946FDF7B2FE07BD53544D0038B500789E
+:10E21000404C414D18B1022810D004D331BDA0802C
+:10E220000120207331BD607B00F020FB607B40F655
+:10E23000010100F06AFB0120287031BD0020287028
+:10E24000607BBDE8324000F011BB10B50FF2C81280
+:10E250000FF26D00314C0021F8F700FF20600FF243
+:10E26000E400F8F73FFE0146A2230FF2B8020FF2D6
+:10E27000C000F8F74DFB2068264CF8F745FF014633
+:10E280000FF26010F8F744FB0020207321460420B1
+:10E29000207042F63820FEF7A7F81F20E07204F144
+:10E2A0000D010A20A0800120A0724FF48060E08060
+:10E2B0000122BDE810400FF25103002000F0B0BA77
+:10E2C00070B542F63724134D154E4FF0FF32002142
+:10E2D0000120F8F76EFF3068E97A00F0070041305E
+:10E2E00068800A07287B04D4012807D100202873FE
+:10E2F00004E00028F8D1A888401DA880A91C204669
+:10E30000FEF772F8E1E70000044800680121F8F721
+:10E3100013BF0000AC5B0020785C00205C5C002038
+:10E32000282800404852534150505F496E6974009C
+:10E330000D0A205B25735D5B25735D5B25645D20A5
+:10E3400000000000433A5C6465765C4749545F44D2
+:10E350006F72795F4C6974746C65446F72795F4E4B
+:10E360005C73746D333277625F4D345F4669726DF2
+:10E37000776172655C4669726D776172655C507237
+:10E380006F6A656374735C502D4E55434C454F2D39
+:10E39000574235352E4E75636C656F5C4170706CFD
+:10E3A00069636174696F6E735C424C455C424C45B5
+:10E3B0005F48656172745261746546726565525456
+:10E3C0004F535F414E43535C53544D33325F57506C
+:10E3D000414E5C4170705C6872735F6170702E6357
+:10E3E00000000000617661696C61626C6520737485
+:10E3F00061636B20737061636520206F66204872D3
+:10E400007350726F636573734964203A20307825C6
+:10E41000303878200A000000283001080000000091
+:10E42000000000000000000000000000800200006A
+:10E43000000000000000000000000000DFF83C15B4
+:10E440000A6892B200E00246086880B28242FAD1BD
+:10E4500070472DE9FC4104461825DFF82485DFF8D4
+:10E460002465684308EB00073078062808D1317826
+:10E470007170347078754FF0FF307060002039E0B3
+:10E4800000F077F8B9680918B96008F10803B968AD
+:10E4900032786A439A589142327813D308F11503BF
+:10E4A00015FB02FC13F80C30062B25D008F10806EA
+:10E4B0006B43F358994222BF08F115036A439A5CF3
+:10E4C000EED219E01146337869439A420BD008F135
+:10E4D000140308F1150C5B5C15FB03F50CF8054003
+:10E4E0007A753B7500E07A7508F11402545431785E
+:10E4F00071703470BDE8F6811146694308F1150367
+:10E500005B5C062B04D008F1140615FB03F574556B
+:10E510007B753A7508F115025454EBE7F8B5DFF84E
+:10E520006434DFF85C541E78182402466243B0421B
+:10E530002A4404D118785870507D18700FE0167D69
+:10E54000507D92F815C005F115076643062807F8B7
+:10E5500006C004D0167D143514FB00F42E5501209E
+:10E5600010731878062802BF00294FF0FF31596058
+:10E57000F1BD10B5DFF80C44606810F1010F0FD049
+:10E58000FFF75CFF6168DFF80024814261683CBFEF
+:10E590005388C918081A517848431178C84000E0D8
+:10E5A000002080B210BD2DE9F84FDFF8DC53DFF812
+:10E5B000DCB3D5F80880D8F80000DBF800104A0575
+:10E5C00000F090F9DFF8BC63DFF8B4A321F48061B8
+:10E5D00081604FF0180934780AF1080019FB04F142
+:10E5E0004758FFF7C6FF874217D200270121B170B5
+:10E5F000062C3DD019FB04F40AF108010AF10802C7
+:10E600000959814223BF0AF108010959091A002159
+:10E6100011510AEB04014C7DEAE7A9884118B9427F
+:10E6200002D2AF880021E2E73F1ADFE7022802DAD0
+:10E630002878012800D07F1ED8F80000C1684A075A
+:10E64000FAD500F055F9DBF80C00000CBFB247EA30
+:10E650000047CBF80C70FFF7F1FE7060A868006807
+:10E66000816841F480618160AFF30080BDE8F18F83
+:10E67000B8B20028DAD1FFF7E1FE70600320BDE8F0
+:10E68000F24F00F0EEBB2DE9F843EFF3108872B6BD
+:10E69000BD4DBB4BA8680168CA224A62532048623C
+:10E6A000B84A886820F48060886018201678374659
+:10E6B00047431F44387B022826D13C68D7F8109086
+:10E6C0009078F0B17A7B012A0AD101213046FFF718
+:10E6D00025FF88F310887968304600F016F904E0C9
+:10E6E00088F31088304600F0C1F8A8680068CA2195
+:10E6F00041622246532141624846314600F050F9BA
+:10E700000BE0FFF750FF06E0C8684207FCD500F0B9
+:10E710007EF89F49086088F31088FF21A868026886
+:10E720005162BDE8F183F8B5974CA160CA2209682F
+:10E730004A6253224A62954A136843F020031360E9
+:10E74000136803F00703C3F10403237095682D0CCD
+:10E7500005F07F056D1C6570EDB29268C2F30E0284
+:10E76000521C628092B2521E6A43A2F5A072DA4035
+:10E770004FF6FF739A422CBFA380A280854A13688C
+:10E7800043F400231360844B1D6845F400251D608D
+:10E7900048BB7C487A4E0123837018254FF0FF3325
+:10E7A000436000235FFA83FC06F10C0715FB0CFCA9
+:10E7B0004FF0000E07F80CE05B1CDFB2062FF1DB18
+:10E7C00006230370886820F48060886000F01FF8DA
+:10E7D000D060032000F050FBA1680868826842F412
+:10E7E0008042826005E0C868410544BF032000F014
+:10E7F00038FBA1680A68FF2050620022062103202E
+:10E8000000F0F8FABDE8F240032000F010BBC86841
+:10E8100000F0800060F49060C8604FF40020704702
+:10E82000F0B504460025EFF3108672B61827DFF81E
+:10E8300050C10CF10C0007FB05FE10F80E0010B1E2
+:10E840006D1C062DF5DB062D0CD06F430CEB07007D
+:10E850000127077386F310880461427303600D700B
+:10E860000020F0BD86F310880120F0BDF8B5074602
+:10E87000EFF3108472B6032000F0E4FA424DAE6864
+:10E880003068CA2141623A46532141621820434907
+:10E890004243895C02291BD100213846FFF73EFE26
+:10E8A0003848017806290ED1306838490A6853057E
+:10E8B00000F018F821F480618160C1684A07FCD536
+:10E8C00000F016F804E04078884218BFFFF76BFEAE
+:10E8D000A9680A68FF205062032000F0A8FA84F3B8
+:10E8E0001088F1BD02D5C1684A07FCD48168704721
+:10E8F000C16801F0800161F49061C1604FF40020B3
+:10E9000023490860032000F0B7BA2DE9F0418046A2
+:10E910000F46424618201A4942438C18207B022891
+:10E9200004BF4046FFF7A2FFEFF3108572B6032045
+:10E9300000F088FA144EB0680068CA214162532181
+:10E94000416202202073A76067604046FFF781FDA7
+:10E950000C490A784978914202D0FFF724FE02E080
+:10E96000A168081AA060FF20B1680A6850620320FD
+:10E9700000F05DFA85F31088BDE8F081282800409A
+:10E980000C570020505C0020045C00200828004048
+:10E990000C0800580008005880080058185700203C
+:10E9A0001047000001460648064AC3798B4218BF4B
+:10E9B000904218BF0838F8D18B4218BF002070472A
+:10E9C000F873FF1F0070FF1F18B50C46C7B0114643
+:10E9D00000228DF800208DF81C008DF81D40224685
+:10E9E0000DF11E00F8F7EFFA00F02AF83F200C2195
+:10E9F000ADF80400ADF8061007A8012103900691B8
+:10EA0000A41C049400F02CF800284CBFFF209DF8B3
+:10EA1000000048B010BD00B5C7B000F00AF80F20E4
+:10EA200000F013F800284CBFFF209DF8000047B00D
+:10EA300000BD00228DF800208DF81C008DF81D10FF
+:10EA40001822002101A8F8F7C4BAADF8060007A9FA
+:10EA5000022004903F22012003910690ADF804208B
+:10EA6000CDF814D0002101A8FAF7EBB8012002F08C
+:10EA700017BD000070470000841A71EB030604D232
+:10EA80006E40001BB141121973414FF4001C1CEB86
+:10EA9000410F34BF7CEB430682E00C0DA4EB135610
+:10EAA000362E7BDC012E45EAC32341DC43EA525378
+:10EAB00012BFD20292025B08240545EAC12141EA55
+:10EAC0005051D2EBC020994125D407D1B0FA80F63D
+:10EAD00010FA06F162D00020203608E0B1FA81F683
+:10EAE000B140C6F1200220FA02F21143B0404FEAD1
+:10EAF000F474B4EB465434F001064FEA74040AD8B7
+:10EB0000D6F50016760D04F00044F04061FA06F2E6
+:10EB10005040F1404840C00A40EA415021F00041D5
+:10EB200028BF5FEA500550F1000044EBD12135E0E9
+:10EB3000DB0A45EAC121C90AB6F120050EDD42EA29
+:10EB40000242120CC5F1200603FA06F6EB4042EA37
+:10EB500006056D42984161F100010DE062FA06F58B
+:10EB6000F240554063FA06FC82EA0C02F3405A4038
+:10EB70006D42904161EB030111F4801F05D1641EC9
+:10EB8000620502D06D004041494121F480114308E3
+:10EB900075F1004350F1000041EB045170BC704727
+:10EBA0001CEB410F15D223F0004352EA43060BD071
+:10EBB0004FEA4C0CBCEB410F04D80C0D661E342EF2
+:10EBC000B7DDEBE7801A994150EA410608BF002102
+:10EBD000E4E708BF1CEB430F28BF6FF00001DDE73F
+:10EBE000C0680840884201D101207047002070476A
+:10EBF000C0690840884201D1012070470020704759
+:10EC000010B5664C02212046FFF7F2FF38B160686C
+:10EC1000C043810703D5FEF78FFB022018E00121D6
+:10EC20002046FFF7E5FF38B16068C043C10703D550
+:10EC3000FEF748FB01200BE008212046FFF7D8FF34
+:10EC400038B16068C043010703D5FEF7CAFB08204E
+:10EC5000A06010BD10B5514C00F033F818B96068D1
+:10EC6000C043810306D400F02CF830B96068C0437B
+:10EC7000810302D5BDE810406EE0082100F022F8C3
+:10EC800070B96068C04301030AD56068444940F424
+:10EC900000206060086880474FF40020A06010BD2D
+:10ECA000202100F00FF858B96068C043810207D5F1
+:10ECB000606840F400106060BDE81040FEF715BBCE
+:10ECC00010BD022120468BE73648016841F40071EF
+:10ECD00001603548026842F40072026040BF20BF04
+:10ECE0003248016841F400410160704780B5304806
+:10ECF000016841F480110160006800F48010009008
+:10ED000000982648016841F001010160026842F460
+:10ED1000803202602C2000F08AF8BDE802402D20ED
+:10ED200000F085B823480168490849000160704730
+:10ED300021494FF48030086070471E48016821F077
+:10ED40000201016070471B484FF4003141600168C7
+:10ED500021F40031016070471648016841F4003128
+:10ED60000160FEF7E3BA38B504460C4D0821284689
+:10ED7000FFF736FF30B10A480460686820F40020CD
+:10ED8000686031BDA0474FF40021A96031BD09483A
+:10ED9000016821F00801016070470000000C005874
+:10EDA000605C0020D4080058200800580C0400586B
+:10EDB00050000058040C0058080C005809010200CB
+:10EDC00081B002D43248815405E0324802F00F028B
+:10EDD000104400F8041C01B070472F4A13684FF626
+:10EDE000FF0100020B4000F4E06018432B49084388
+:10EDF0001060704738B5284B1C68C4F30223C3F178
+:10EE00000704052C28BF04241D1D072D34BF002333
+:10EE1000DB1E012505FA04F4641E2140994005FA21
+:10EE200003F35B1E1A401143BDE83440C6E70100FE
+:10EE300007D4012200F01F01194B8A40400943F812
+:10EE40002020704701000BD4012200F01F01154B58
+:10EE50008A40400943F82020BFF34F8FBFF36F8FE4
+:10EE60007047010007D4012200F01F010E4B8A40B9
+:10EE7000400943F820207047010007D4012200F028
+:10EE80001F010A4B8A40400943F8202070470000C8
+:10EE900000E400E018ED00E00CED00E00000FA05F1
+:10EEA00000E100E080E100E000E200E080E200E05C
+:10EEB00018B5014689B000221A20FFF79BFF1A20DF
+:10EEC000FFF7B5FF1448154C016841F4802101603B
+:10EED00001A9006800F480200090009802A801F0C9
+:10EEE0005EF801F04BF80E492160002240F2E73154
+:10EEF000E1602261A2600B49B0FBF1F0401E60604E
+:10EF0000204602F0D7FA18B9204602F0E0FA00E0F5
+:10EF100001200AB010BD000060000058D45A002043
+:10EF20000048014040420F00774981B00A6802431F
+:10EF30000A60096808400090009801B0704780B5E9
+:10EF40007248016841F4002101600022006800F469
+:10EF5000002000900F2100986FF00100FFF74AFF9A
+:10EF6000002206212C20FFF745FFBDE808400022C3
+:10EF700006212D20FFF73EBF38B58AB0044668460B
+:10EF80001421F8F71DF82068614A624990423ED189
+:10EF90000868614D40F001000860096801F0010156
+:10EFA000059105980120FFF7BFFF0C20009002217A
+:10EFB00000200191029003210820039100F06AF8DB
+:10EFC000402000F060F8082000F064F85348286002
+:10EFD000112000F065F808B1C046C0464FF08850D7
+:10EFE0000690002101200791ADF82010099006A994
+:10EFF000284602F07DFB08B1C046C0466567AC629A
+:10F00000002205212520FFF7F5FE252037E0444AA0
+:10F01000904236D14868434D40F48040486048688B
+:10F0200000F48040059005980120FFF77DFF022045
+:10F03000FFF77AFF4FF4006000F025F8072000F09A
+:10F0400029F8C020009002210120019102900321A3
+:10F0500007200391049069463348FEF729FA3348A4
+:10F0600028600F2000F01CF808B1C046C046656754
+:10F07000AC62002205212420FFF7BCFE2420FFF70C
+:10F08000D6FE0BB030BD009002210020029003900C
+:10F0900001917047049069464FF09040FEF708BA1E
+:10F0A00068601020A8600020E860802028610020AF
+:10F0B0006861A861E8612862284602F03FBB1CB580
+:10F0C00004461B49206888421CD100F0B9FA00F0C0
+:10F0D000B7FA1848816B21F4407141F48071816363
+:10F0E000816B41F400418163026842F480620260F6
+:10F0F000006800F48060009000982046BDE816404B
+:10F1000002F0C2BC13BD00004C0000585000005873
+:10F11000008000405C000058345900204400024048
+:10F120000038014094590020000400484404024083
+:10F1300000280040580000587FB50C464D4D6168CE
+:10F140004D4EE8612962284602F0B6FC24687460DE
+:10F1500006F1080000604060012000F068F801201E
+:10F160003070296841B10FF2E9000FF2ED02009012
+:10F1700001920294684688477FBD1FB53E4C04F15A
+:10F180000800FEF724F800BB2178F1B1694604F1CC
+:10F190000800FEF745F83748C16949B10098029068
+:10F1A00001228DF8042001A888479DF8040000E0A2
+:10F1B00001202070207818B10098FEF7E7F804E0ED
+:10F1C000009904F10800FEF70BF804F10800FDF7C0
+:10F1D000FEFF28B9207818B104F1080000F04AF9C0
+:10F1E0001FBD2DE9F04105460E4690461C46002005
+:10F1F00000F01DF8204F7868A0F80950C67232461A
+:10F2000041460C30F7F798FB1A4A13690021002099
+:10F21000984748F2E80000F036F979688A78D21CFD
+:10F2200004F10800F7F788FBBDE8F04101201CB5A8
+:10F230001049124C096A20B901B18847002020709A
+:10F2400013BD0120207011B1BDE81C40084713BD5B
+:10F25000002000F014B9000010B50146064C04F17E
+:10F260000800FDF7C7FF04F10800BDE8104000F0FA
+:10F2700001B90000685B0020DC5B0020795C0020A5
+:10F28000F8B58448844C0FF25C250FF244260FF247
+:10F29000302788B0016841F400410160FEF78CFF1F
+:10F2A0007E490020FFF73FFAF9F735FF01210120E1
+:10F2B000FEF787FF0121002002F013FC012101204D
+:10F2C00002F00FFC0121022002F00BFCFDF7BCFF55
+:10F2D0000020F7F7D9FF2060002200210120F8F775
+:10F2E00065F8606000210FF234320FF20510F7F775
+:10F2F000B5FEA0602846F7F7F5FD0146B82300F0FB
+:10F30000B5F84FF460710FF27820F7F701FB28464B
+:10F31000F7F7E8FD0146B92300F0A8F8A068604CB3
+:10F32000F7F7F2FE01460FF29020F7F7F1FA04F238
+:10F330003C500FF235010090019169460FF24500F3
+:10F34000FFF7FAFE04F25470029004F5C96140F22E
+:10F350003C5005900391049402A8FDF7FEFFFDF7D1
+:10F3600071FF09B0F0BD00004B4A126810B10128CE
+:10F3700005D070474FF0FF311046F7F7C0BF104679
+:10F38000F7F7EDBF2DE9F041F9F7D4FE0FF2541471
+:10F390000FF23C150FF25C263F4F0FF21C2820465F
+:10F3A000F7F7A0FD0146ED2332462846F7F7B0FAFD
+:10F3B000B868F7F7A9FE01464046F7F7A9FAFBF748
+:10F3C00003FA2046F7F78EFD0146EF233246284622
+:10F3D000F7F79EFAB868F7F797FE01464046F7F749
+:10F3E00097FABDE8F04100210120FEF7EABE0000D7
+:10F3F0002DE9F0410FF2C014274D0FF2D4060FF2A1
+:10F4000008270FF2E0084046F7F76CFD0146FF239E
+:10F4100000F02CF8A868F7F777FE00F023F84FF01B
+:10F42000FF3200210120F7F7C4FE4046F7F75AFDEE
+:10F4300001464FF4817300F019F8A868F7F764FEED
+:10F4400000F010F8FFF799FE4046F7F74BFD014634
+:10F450004FF4827300F00AF8A868F7F755FE00F041
+:10F4600001F8D0E701462046F7F752BA3A4630464F
+:10F47000F7F74EBA084880680121F7F75DBE0648E5
+:10F480004068F8F719B8044840684FF0FF31F7F7C3
+:10F49000E4BF000008000058F85B0020405B00203B
+:10F4A00030000320012805D0022805D0102805D1FE
+:10F4B000FBF7BDBCFBF7BDBCFBF7BDBC7047000054
+:10F4C000617070655F546C5F496E69740000000084
+:10F4D0000D0A205B25735D5B25735D5B25645D20F4
+:10F4E00000000000433A5C6465765C4749545F4421
+:10F4F0006F72795F4C6974746C65446F72795F4E9A
+:10F500005C73746D333277625F4D345F4669726D40
+:10F51000776172655C4669726D776172655C507285
+:10F520006F6A656374735C502D4E55434C454F2D87
+:10F53000574235352E4E75636C656F5C4170706C4B
+:10F5400069636174696F6E735C424C455C424C4503
+:10F550005F486561727452617465467265655254A4
+:10F560004F535F414E43535C436F72655C5372630C
+:10F570005C6170705F656E7472792E6300000000CC
+:10F58000746F74616C20737461636B20737061635A
+:10F590006520206F662053686369557365724576F0
+:10F5A0007450726F636573734964203A2030782514
+:10F5B000303878200A000000617661696C61626C05
+:10F5C0006520737461636B20737061636520206FC5
+:10F5D0006620536863695573657245767450726F1F
+:10F5E000636573734964203A203078253038782079
+:10F5F0000A000000415050455F537973557365729E
+:10F6000045767452780000005368636955736572DB
+:10F6100045767450726F636573730000DC2F0108C8
+:10F6200000000000000000000000000000000000DA
+:10F630008003000000000000000000000000000047
+:10F640000248016841F4807101607047000400586D
+:10F6500038B5040044D094F8210028B9002184F87A
+:10F6600020102046FFF72BFD00F049F8FF2510B1D0
+:10F6700000F03FF834E02168DFF8B0008A6802400B
+:10F680008A6021688A68636820690343A06903432C
+:10F690001A438A602168E068086120680169A268ED
+:10F6A00041EA024101612068C16821F08001C16026
+:10F6B0002068C16C89088900C1642168CA6CE3694B
+:10F6C000606903431A43CA6420688168880609D4C4
+:10F6D00000F020F830B120684562042100F01FF8E6
+:10F6E000012032BD20684562012184F821100020EC
+:10F6F00032BD20684562042184F821107047022041
+:10F7000084F82100CA202168486253202268506290
+:10F71000204626E020460BE02068C0F8248084F8CC
+:10F720002110002084F8200070470000BFFF8FFFE9
+:10F7300070B5044640F2E9362068C16821F0A001A6
+:10F74000C16001F047FE05462068C168880606D4FE
+:10F7500001F040FE401BB042F6D3032070BD0020F4
+:10F7600070BD70B504462068C1684A0612D44FF0D7
+:10F77000FF32C26040F2E93601F02CFE05462068F7
+:10F78000C168480606D401F025FE401BB042F6D3FE
+:10F79000032070BD002070BD4FF0B040006800F045
+:10F7A000F000B02888BFB02070472DE9F041040078
+:10F7B00051D0207881064FF0B04535D5A868E9686A
+:10F7C00010F00C0001F0030103D00C2808BF012940
+:10F7D00043D12868800702D5E06900283BD0FFF7B5
+:10F7E000DBFF616A884207D2084600F0FBFB002875
+:10F7F00031D100F07AFA0FE0286820F0F0000143E0
+:10F8000029606968206A21F47F4141EA002169602A
+:10F81000606A00F0E7FBF0B902F0DAF9DFF85C08A3
+:10F820000068FFF745FBB0B92078C1070DD5A8687F
+:10F83000E96800F00C00082801F0030103D00C284F
+:10F8400008BF03292CD12868800340F141816068FA
+:10F85000002840F03D81012040E2E06980B1296844
+:10F8600041F0010100F02EFB06462868800700F1F8
+:10F870002C8101F0AFFD801B0328F6D303202DE27D
+:10F8800028684008400000F03EFA0646286800F06C
+:10F8900028FAC9D001F09EFD801B0328F6D3EDE7BE
+:10F8A0006068B0F5803F06D0B0F5A02F296807D179
+:10F8B00041F480212960286840F48030286006E007
+:10F8C00021F4803129602A6822F480222A6060684D
+:10F8D00060B101F07FFD06462868800300F1F880E2
+:10F8E00001F078FD801B6528F6D3C7E701F072FDB3
+:10F8F00006462868400C10F0010000F0E98001F095
+:10F9000069FD801B6528F4D3B8E701F063FDC01BD7
+:10F910000328C0F01181B1E7E06878B1296841F4AB
+:10F92000807100F0CFFA06462868400500F1178183
+:10F9300001F050FD801B0328F6D39FE7286820F4D0
+:10F94000807000F0E0F906462868800A10F0010097
+:10F9500000F0DC8001F03EFD801B0328F4D38DE72E
+:10F9600001F038FDC01B0328C0F00B8186E740F092
+:10F97000010000F0CEF907467068800700F11C8195
+:10F9800001F028FDC01B0328F6D377E7706820F04C
+:10F99000040000F0BEF907467068C00810F00100CE
+:10F9A00000F0198101F016FDC01B0428F4D365E7AF
+:10F9B0000528306806D140F004003060316841F01D
+:10F9C000010105E0400840003060316821F0040189
+:10F9D0003160A06841F2893768B101F0FBFC8046D4
+:10F9E0003068800700F10C8101F0F4FCA0EB080006
+:10F9F000B842F5D342E701F0EDFC8046306800F0F4
+:10FA000070F900F0FD8001F0E5FCA0EB0800B842C1
+:10FA1000F4D333E701F0DEFCC01B0328C0F0FE8006
+:10FA20002CE7B06840084000B06001F0D3FC074606
+:10FA3000B06800F056F900F0F58001F0CBFCC01B77
+:10FA40000328F5D31AE701F0C5FC801B0328C0F09A
+:10FA50001F8113E701F0BEFC001B0328C0F03981B1
+:10FA60000CE7286881010CD4296841F08071296075
+:10FA7000E86840F08050E86001F0ACFC044628687B
+:10FA8000810100F12A8101F0A5FC001B0328F6D3B7
+:10FA9000F4E60C2931D0286820F080702860E968ED
+:10FAA000DFF8DC0589088900E960E9680140E96060
+:10FAB00001F090FC04462868810140F10E8101F0BC
+:10FAC00089FC001B0328F6D3D8E600F00EF9ABE65C
+:10FAD000207881071AD5A868E96800F00C0004288E
+:10FAE00001F0030104D00C2808BF02297FF414AFF1
+:10FAF0002868400503D5E06800283FF4ACAE69688B
+:10FB0000206921F0FE4141EA006169602168DFF867
+:10FB1000746511F0180F38D0606900283FF436AFD3
+:10FB2000C90670687FF523AF800709D4706840F07C
+:10FB3000010000F0EEF80746706880077FF5E5AE3B
+:10FB4000706840F0040000F0E4F8074670680007B1
+:10FB50000DD401F03FFCC01B0428F7D38EE6686883
+:10FB6000216920F0FE4040EA01606860CEE77068DD
+:10FB7000A16920F4706040EA0120706000F0C6F8CE
+:10FB8000074600F0ADF87FF4EBAE2078410737D59B
+:10FB9000DFF8F4743868C10529D4FFF751FD01F08E
+:10FBA00019FC80463868C10521D401F013FCA0EB94
+:10FBB00008000328F6D361E6706820F00400706046
+:10FBC0007068C00810F00100DFD001F003FCC01B1A
+:10FBD0000428F5D352E600F099F8074600F080F8C3
+:10FBE000D3D001F0F7FBC01B0328F7D346E6A0688B
+:10FBF00001287FF4DDAE306840F001003060E8E6B7
+:10FC0000217848060ED5A06A00283FF40AAFB168F3
+:10FC100041F00101B16001F0DDFB0746B0688007EB
+:10FC20007FF5F8AEE06A002857D0A968EA68022894
+:10FC300001F00C017FF42DAF236B02F0030098421A
+:10FC400002BF02F07000636B984214D1A36BC2F341
+:10FC50000620984202BF02F47810E36B98420AD162
+:10FC6000236C02F06060984202BF02F06042606C58
+:10FC700082423FF4F6AE0C293FF4EDAD2868410115
+:10FC80003FF5E9AD296821F0807100F01BF90646C7
+:10FC9000286881013FF5D7AEE968DFF8F003A26B71
+:10FCA0000140206B0143606B0143E06B41EA02219C
+:10FCB0000143206C0143606C0143E960286840F017
+:10FCC00080702860E96841F08051E96001F082FBB2
+:10FCD0000446286881017FF5BDAE0020BDE8F081B3
+:10FCE0007068400810F0010070472968606A21F0D0
+:10FCF000F001014329606868216A20F47F4040EAEE
+:10FD0000012068607047286001F064BB706840089B
+:10FD10004000706001F05EBB2DE9F84304008846A6
+:10FD200044D0DFF86C6300F0C8F847D200F0CDF89B
+:10FD3000074600F0C2F841D001F04CFBC01B02287E
+:10FD4000F7D90320B7E001F045FB401B022843D957
+:10FD5000F7E701F03FFBA0EB090002284CD9F0E7E0
+:10FD600001F038FBA0EB0900022854D9E9E701F0C3
+:10FD700031FB401B02285DD9E3E701F02BFB401B60
+:10FD8000022867D9DDE701F025FB401B484577D302
+:10FD9000D7E7032802D13968890103E000283968D0
+:10FDA00002D1890762D401E049055FD4012082E0D5
+:10FDB00001F010FBC01B022872D9C2E7207881072E
+:10FDC0004FF0B0470BD5B968A06821F0F0010143AE
+:10FDD000B96001F0FFFA0546B868C003B3D52078D2
+:10FDE000DFF8945281060AD52968606921F0F00194
+:10FDF000014300F067F8814628688003A9D5207880
+:10FE000041060BD52968A0690909090141EA1011C9
+:10FE100000F058F881462868C003A1D52078410732
+:10FE20000BD5B968E06821F4E0610143B96001F0E5
+:10FE3000D1FA0546B868800399D5207801070CD51A
+:10FE4000B868216920F4605040EAC100B86001F050
+:10FE5000C1FA0546B86840038FD52078C10717D589
+:10FE60006068022895D1396889039FD5B9688908E7
+:10FE700040EA8100B86041F2893901F0ABFA0546E9
+:10FE8000B868616800F00C00B0EB810F7FF47BAFC5
+:10FE9000306800F00700804505D200F016F80746EC
+:10FEA00000F00BF884D101F093FEFDF7D1FABDE824
+:10FEB000F243FEF7FDBFBDE8F283306800F00700B3
+:10FEC00040457047296001F085BA3168C90848EAA1
+:10FED000C101316001F07EBA38B54FF0B0446E4DCB
+:10FEE000A16811F00C0106D1FFF756FCC0F3031016
+:10FEF00055F8200032BD0429684A05D00829684811
+:10FF000004D12168C90222D5104632BDE16801F052
+:10FF10000301022904D0032904D12168C90207D5AD
+:10FF2000104605E0FFF738FCC0F3031055F8200039
+:10FF3000E168E268E368C1F306214843C2F30211B5
+:10FF4000491C5B0FB0FBF1F05B1CB0FBF3F032BD62
+:10FF500080B5FFF7C1FF4F49FFE7524A0968C1F377
+:10FF6000031152F82110B0FBF1F002BD80B5FFF78C
+:10FF7000EFFF00F010F8C1F3022106E080B5FFF7B3
+:10FF8000E7FF00F008F8C1F3C22112F8211001F0D8
+:10FF90001F01C84002BD3F49434A096870476F22AC
+:10FFA00002603C4A136803F00C034360136803F0DB
+:10FFB000F0038360136803F4E063C360126802F423
+:10FFC000605202612C4A136803F0F0034361126827
+:10FFD000120102F0F00282612D48026802F007026D
+:10FFE0000A60704770B52C49B1282EBFCC6AC0F3A7
+:10FFF000031051F820402048056801F077FE294998
+:020000040801F1
+:100000002A4A05F00F0551F82510B4FBF1F1002440
+:10001000B1FBF2F1B0F5007F0FF2B002204609D13A
+:100020000FF28C0353F820508D4214D2401C032849
+:10003000F8D912E00FF2880353F820508D420AD20B
+:10004000401C0328F8D308E001F0C4F9801B032802
+:100050000BD3032070BD52F820400D4D2868C00816
+:1000600044EAC000FFF74FFE0646296801F0070189
+:10007000A142E9D1002070BD0801005864100020A1
+:10008000FFFFFEEE90000058000400588C80C11164
+:100090000040005808000058AC1C01080024F4007F
+:1000A0000048E8016C1C0108882F010840420F003D
+:1000B0001200000024000000360000004000000094
+:1000C000060000000C00000010000000000000000E
+:1000D000010000000200000003000000DFF8201310
+:1000E0000A68030903F47F2300019A4300F47F2088
+:1000F00000F082B9DFF808231368010C23EA0143FA
+:1001000043EA0043136070472DE9F8430546002495
+:100110002878DFF8EC624106A0464FF0B0472DD5B5
+:10012000286B70B1B0F5800F06D0B0F5000F18BF86
+:10013000B0F5400F17D01FE0F86840F48030F86049
+:10014000EDE0386820F08060386001F043F98146C6
+:100150003868000140F1D08001F03CF9A0EB0900C3
+:100160000228F5D90324D7E001F034F9A0EB090007
+:10017000022840F2C980F5E70124A046286801055D
+:1001800031D5B06800F44078286C80452AD0FFF75C
+:1001900057FAB8F1000FB16805D1286C21F440710D
+:1001A0000143B1601EE0B06840F48030B06021F4DB
+:1001B0004071B06820F48030B060286C0143B160B9
+:1001C000B068C0070ED501F005F9804641F28939C3
+:1001D000B068800706D401F0FDF8A0EB08004845A0
+:1001E000F6D30324A0462878C10705D53168A8694D
+:1001F000890840EA810131602878810705D5316896
+:10020000E86921F44061014331602878C10644BFA8
+:10021000A86AFFF76FFF2878810644BFE86AFFF7F6
+:1002200069FF2878410744BF286AFFF757FF2878FD
+:10023000010744BF686AFFF751FF2868C1051BD555
+:100240003168686B21F0406101433160686BB0F147
+:10025000006F00F0BDF8686BB0F1806F75D100F0F1
+:10026000BDF804463868000160D501F0B3F8001B02
+:100270000228F7D94FF0030867E001F0ABF8001B44
+:1002800002285BD9F6E7316821F04041316020F067
+:100290008050326822F0406210433060A86BB0F1A9
+:1002A000C05F00F095F8286841056DD53168E86BAE
+:1002B00021F0405101433160E86BB0F1005F03D1A0
+:1002C000F96841F48031F960E86BB0F1805F5BD18F
+:1002D00000F084F804463868000146D501F07AF849
+:1002E000001B0228F7D94FF003084DE001F072F827
+:1002F000001B022841D9F6E700F061F8A86821F454
+:10030000781100F071F88146386800017FF52CAF54
+:100310003969686901433961002C7FF42EAF316877
+:10032000286B21F440010143316027E700F047F8D2
+:10033000E86821F0606100F057F804463868000171
+:100340009BD5396968690143396128688105AAD557
+:10035000A86BB0F1804F1CBFB0F1004F002892D1C4
+:10036000316821F04041084397E700F028F82869F8
+:1003700021F0604100F038F8044638680001B5D536
+:1003800039696869014339612868C10405D5F16894
+:10039000686C21F440410143F160286881040BD569
+:1003A000796AE86C21F0300101437962796AA86CBE
+:1003B000890840EA810179624046BDE8F2833869E4
+:1003C000696820F4FE4040EA0120386139697047CD
+:1003D00003D1F96841F08071F9607047396821F004
+:1003E0008061396000F0F6BF01433961386840F040
+:1003F0008060386000F0EEBF104308607047000076
+:100400008800005838B5040009D004F17C056868FC
+:1004100008B900F01EF800F021F8012801D10120F0
+:1004200032BDA06A08B100F02AF800F00AF821F005
+:100430002A01FFE7816000F01BF8BDE8324000F0C0
+:100440002EBE2068416821F4904141602068816897
+:100450007047002129702046FEF78EBD2420686079
+:1004600020680168490849000160204600F040B951
+:100470002068016841F00101016020467047204674
+:1004800000F0AABD70B5044604F17C051346686807
+:10049000202836D149B3180027D02878012830D039
+:1004A00001222A7004F154062165338073800020F4
+:1004B000E86021206860306AC8B1DFF82012C162AC
+:1004C000DFF81C02316A0863316ADFF818024863FA
+:1004D0000020316A88632068216D00F12802306AAB
+:1004E00001F093F918B100F00EF8012070BD2168F9
+:1004F00040200862002028702068816841F0800157
+:1005000008E0022070BD1020E86000202870202044
+:10051000686070478160002070BD206881684A066D
+:100520007047F8B5044640F60F002568E9692A6867
+:10053000AB6808400DD1880602D5900602D4D800D9
+:1005400040F18980E16E00294FD02046BDE8F4409B
+:1005500008476548034204BF644E32427BD0CF0750
+:1005600009D5D60507D501262E62D4F8885045F066
+:100570000105C4F888508D070AD5DD0708D526681F
+:1005800002253562D4F8885045F00405C4F8885037
+:100590004D070AD5DD0708D5266804253562D4F84D
+:1005A000885045F00205C4F888500D070CD5950613
+:1005B00001D4034208D0256808202862D4F88800B6
+:1005C00040F00800C4F8880008050BD5500109D593
+:1005D00025684FF400602862D4F8880040F02000BD
+:1005E000C4F88800D4F88800002870D0890607D5A0
+:1005F000900601D4D80003D5E16E09B120468847A2
+:10060000D4F8880021688A68510602D410F0280FB7
+:100610001AD0204600F0BEFDFFF77FFF0FD500F097
+:1006200057F860B1DFF890198163A06F01F030F9DD
+:1006300000284CD0A06F816BBDE8F44008472046ED
+:10064000BDE8F24001F05ABB204601F057FB002004
+:10065000C4F88800F1BDC80209D5580207D54FF487
+:10066000801028622046BDE8F24000F0B1BE0806C6
+:1006700009D5100601D4180205D5216F39B32046DB
+:10068000BDE8F440084748060FD550060DD5286848
+:1006900020F0400028602021C4F88010002020674E
+:1006A0002046BDE8F240FDF792B9080206D5500099
+:1006B00004D52046BDE8F24001F021BBC80148BF87
+:1006C000002A04D52046BDE8F24001F019BBF1BD77
+:1006D000816821F040018160A06F7047E911010835
+:1006E000171201081D12010801000010200100046A
+:1006F0002DE9F84F0446DFF8C8082768DFF8C4B8CA
+:100700003968DFF8C4A80140A068014320690143AB
+:1007100060690143E0690143606E0143396000266E
+:100720007968E06821F4405101437960B046A169DD
+:10073000DFF8880887421CBF206A0143BA68DFF8E7
+:10074000780A02401143B9604FF48075F96A606A13
+:10075000090940EA0111F9625F454FF400404FF486
+:1007600000714FF480624FF400634FF4805C4FF4EB
+:10077000005E4FF4804929D1DAF800B00BF0030B8A
+:10078000BBF1030F3ED8DFE80BF00237343A4FF0ED
+:10079000010AD4F81CB05746BBF5004F4FF6F07A6B
+:1007A00040F01183012F09D0022F00F05482042F52
+:1007B00000F08D82082F00F0C282F5E2FFF7DEFB29
+:1007C0000146606A002840F01B8242E2DFF8ECB785
+:1007D0005F4517D1DAF800A01AF4406A27D0BAF5BD
+:1007E000806F09D0BAF5006F03D0BAF5406F06D01C
+:1007F00008E04FF0020A07E04FF0040A04E04FF06F
+:10080000080A01E04FF0100ADFF8B0B75F45C0D129
+:10081000BAF1000F0BD0BAF1020F49D0BAF1040FB0
+:1008200000F08280BAF1080F00F0B080B6E3FFF765
+:100830009DFB0146606A58B3012808BF022028D0FA
+:10084000022808BF042024D0032808BF062020D097
+:10085000042808BF08201CD0052808BF0A2018D08B
+:10086000062808BF0C2014D0072808BF102010D07D
+:10087000082808BF20200CD0092808BF402008D035
+:100880000A2808BF802004D00B2808BF284600D0C3
+:100890000120B1FBF0F0002800F08283626802EBD7
+:1008A0004201884203D31103814280F0A18075E3A5
+:1008B000606AB0B3012808BFDFF80009EED0022853
+:1008C00008BFDFF8FC08E9D0032808BFDFF8F40808
+:1008D000E4D0042808BFDFF8F008DFD0052808BFFF
+:1008E000DFF8E808DAD0062808BFDFF8E408D5D03A
+:1008F000072808BFDFF8DC08D0D0082808BFDFF8D9
+:10090000D808CBD0092808BFDFF8D008C6D00A28FD
+:1009100008BFDFF8CC08C1D00B2808BF4FF2244035
+:10092000BCD0DFF8C008B9E7FFF7D6FA0146606A25
+:1009300058B3012808BF0220ABD0022808BF04200A
+:10094000A7D0032808BF0620A3D0042808BF08208A
+:100950009FD0052808BF0A209BD0062808BF0C207E
+:1009600097D0072808BF102093D0082808BF202060
+:100970008FD0092808BF40208BD00A2808BF8020CC
+:1009800087D00B2808BF284683D081E7676A002FED
+:1009900084D0012F08BF4846FAD0022F08BF704606
+:1009A000F6D0032F08BF41F25550F1D0042F08BFF5
+:1009B0006046EDD0052F08BF40F6CC40E8D0062FAA
+:1009C00008BF40F6AA2012D0072F08BF18460ED045
+:1009D000082F08BF10460AD0092F08BF084606D0C6
+:1009E0000A2F08BF284602D00B2F00D1802055E7E0
+:1009F000BAF1000F0BD0BAF1020F38D0BAF1040FE0
+:100A000000F07280BAF1080F00F0A780ECE0FFF769
+:100A1000ADFA0146606A40B3012808BF02251ED026
+:100A2000022808BF04251AD0032808BF062516D0BF
+:100A3000042808BF082512D0052808BF0A250ED0B3
+:100A4000062808BF0C250AD0072808BF102506D0A5
+:100A5000082808BF202502D0092808BF402572D0E9
+:100A60000A280CBF80250B286DD001256BE0606A39
+:100A7000002836D0012808BFDFF800682BD00228F4
+:100A800008BFDFF8FC6726D0032808BFDFF8F4674B
+:100A900021D0042808BFDFF8F0671CD0052808BF64
+:100AA000DFF8E86717D0062808BFDFF8E46712D040
+:100AB000072808BFDFF8DC670DD0082808BFDFF87B
+:100AC000D86708D0092808BFDFF8D06703D00A2804
+:100AD00008BFDFF8CC677CD00B2808BFDFF80467BD
+:100AE00077D0DFF8C06774E0FFF7F6F90146606A77
+:100AF00040B3012808BF022525D0022808BF0425DD
+:100B000021D0032808BF06251DD0042808BF0825CA
+:100B100019D0052808BF0A2515D0062808BF0C25BE
+:100B200011D0072808BF10250DD0082808BF2025A0
+:100B300009D0092808BF402505D00A280CBF802508
+:100B40000B2800D001256268B1FBF5F650080021A2
+:100B500010EB062051EB166141E0606A002836D0A8
+:100B6000012808BF4FF4800633D0022808BF4FF495
+:100B700000162ED0032808BFDFF82C6729D00428E0
+:100B800008BF4FF4801624D0052808BFDFF81C6783
+:100B90001FD0062808BFDFF818671AD0072808BF3B
+:100BA0004FF4002615D0082808BF4FF4802610D037
+:100BB000092808BF4FF400360BD00A2808BF4FF4AD
+:100BC000803606D00B2808BF4FF4004601D04FF402
+:100BD0000006C246002116EB52004AEB0101002339
+:100BE000FBF70AFE064601E04FF00108A6F540704B
+:100BF000DFF8C016884280F0D1812168CE60CFE155
+:100C0000012808BF02251AD0022808BF042516D0E3
+:100C1000032808BF062512D0042808BF08250ED0D7
+:100C2000052808BF0A250AD0062808BF0C2506D0CB
+:100C3000072808BF102502D0082808BF202575D036
+:100C4000092808BF402571D00A280CBF80250B2831
+:100C50006CD001256AE0606AB0B3012808BFDFF8F4
+:100C6000840521D0022808BFDFF850051CD00328D6
+:100C700008BFDFF8440617D0042808BFDFF8400596
+:100C800012D0052808BFDFF834060DD0062808BFAB
+:100C9000DFF8300508D0072808BFDFF82C0503D09F
+:100CA000082808BFDFF82C057AD0092808BFDFF82C
+:100CB000280575D00A2808BFDFF8200570D00B285A
+:100CC00008BFDFF81C056BD0DFF8D40568E0FFF73C
+:100CD00003F90146606A40B3012808BF022525D008
+:100CE000022808BF042521D0032808BF06251DD0EF
+:100CF000042808BF082519D0052808BF0A2515D0E3
+:100D0000062808BF0C2511D0072808BF10250DD0D4
+:100D1000082808BF202509D0092808BF402505D08C
+:100D20000A280CBF80250B2800D001256068B1FB84
+:100D3000F5F1420802EB4102B2FBF0F632E0666ADE
+:100D400066B3012E2CD0022E08BF484628D0032EB1
+:100D500008BF42F6AA2023D0042E08BF70461FD039
+:100D6000052E08BF41F698101AD0062E08BF41F292
+:100D7000545015D0072E08BF604611D0082E08BF6A
+:100D800018460DD0092E08BF104609D00A2E08BFFC
+:100D9000084605D00B2E08BF284601D04FF48030FE
+:100DA00000F014F9B6B201E04FF00108A6F110000E
+:100DB000504580F0F3800AEA0601C6F34200014381
+:100DC0002068C160ECE0012F07D0022F35D0042F3E
+:100DD00070D0082F00F0A580D7E0FFF7CFF80146CC
+:100DE000606A40B3012808BF022516D0022808BF58
+:100DF000042512D0032808BF06250ED0042808BFFA
+:100E000008250AD0052808BF0A2506D0062808BFED
+:100E10000C2502D0072808BF10257AD0082808BF63
+:100E2000202576D0092808BF402572D00A280CBF9B
+:100E300080250B286DD001256BE0606AB0B30128D6
+:100E400008BFDFF8781333D0022808BFDFF870132B
+:100E50002ED0032808BFDFF86C1329D0042808BF60
+:100E6000DFF8641324D0052808BFDFF860131FD013
+:100E7000062808BFDFF858131AD0072808BFDFF884
+:100E8000541315D0082808BFDFF84C1310D00928D8
+:100E900008BFDFF848130BD00A2808BFDFF840135B
+:100EA00006D00B2808BF4FF2244101D0DFF83413DD
+:100EB000606831E0FFF710F80146606A40B301282E
+:100EC00008BF022525D0022808BF042521D0032809
+:100ED00008BF06251DD0042808BF082519D00528FD
+:100EE00008BF0A2515D0062808BF0C2511D00728F1
+:100EF00008BF10250DD0082808BF202509D00928D3
+:100F000008BF402505D00A280CBF80250B2800D03B
+:100F100001256068B1FBF5F101EB5001B1FBF0F682
+:100F200031E0666A6EB3012E08BF484629D0022E12
+:100F300008BF704625D0032E08BF41F2555020D07F
+:100F4000042E08BF60461CD0052E08BF40F6CC40DA
+:100F500017D0062E08BF40F6AA2012D0072E08BFD1
+:100F600018460ED0082E08BF10460AD0092E08BF1A
+:100F7000084606D00A2E08BF284602D00B2E08BF0E
+:100F8000802000F023F8B6B201E04FF00108A6F18E
+:100F90001000504502D22068C66001E04FF0010801
+:100FA00004F16800012141800180002141608160DD
+:100FB0004046BDE8F28F00006B120108008000403F
+:100FC000F369FFCF0038014088000058616800EBEA
+:100FD0005100B0FBF1F6704790F82810CA0706D50B
+:100FE00002685368C16A23F400330B43536090F8DE
+:100FF00028108A0706D502685368016B23F48033F2
+:101000000B43536090F828104A0706D502685368CE
+:10101000416B23F480230B43536090F828100A0798
+:1010200006D502685368816B23F400430B43536079
+:1010300090F82810CA0606D502689368C16B23F49D
+:1010400080530B43936090F828108A0606D50268F7
+:101050009368016C23F400530B43936090F82810BD
+:101060004A0610D502685368416C23F480130B4381
+:101070005360416CB1F5801F05D15368816C23F436
+:10108000C0030B43536090F828100A0606D5016888
+:101090004A68C06C22F4002202434A607047F8B5E7
+:1010A000044604F17C050020E8606FF07E4700F004
+:1010B00091F90646206801680A0708D5009733466B
+:1010C00000224FF40011204600F016F860B92068A5
+:1010D00001684A070AD50097334600224FF4800181
+:1010E000204600F009F808B10320F2BD2020686016
+:1010F000A86000202870F2BD2DE9F041069C05464D
+:101100000E4690461F462868C1693140B1420CBF67
+:101110000120002040451CD114F1010FF3D000F054
+:1011200059F9C01B844200D314B900F015F80CE043
+:10113000286801684A07E6D5C1690A05E3D54FF476
+:101140000062026200F008F8C16000210170032013
+:1011500000E00020BDE8F0812868016821F4D0712A
+:1011600001602868816849084900816005F17C00B8
+:10117000202141608160704701680A6822F0C00246
+:101180000A6001688A6822F400028A602021C0F89F
+:101190008010704701680A6822F490720A60DFF8D4
+:1011A0002011026893680B4093602021C0F88410DE
+:1011B0000021C16670470000FFF4FF1100127A00A1
+:1011C00000093D00AAB0280080841E00006A1800B3
+:1011D0005558140040420F0020A1070090D0030092
+:1011E00048E801000024F400816A00680268930660
+:1011F00044BF0846FCF7EBBB0020A1F85600086886
+:10120000826822F0800282600868FFE7016841F08E
+:10121000400101607047806A00F073BDF8B5846AD0
+:1012200004F1800504F1560728686E6821688A6811
+:10123000110606D5212804D1002038802046FFF76A
+:101240009BFF20688168480606D5222E04D1002025
+:1012500038812046FFF79EFFA86840F01000A86084
+:101260002046BDE8F24000F049BD806A00F1560119
+:1012700000220A810A8000F041BD00000000127ABD
+:101280000000093D00AAB0280080841E00006A18F2
+:10129000005558140040420F0020A1070090D003D1
+:1012A0000048E801000024F40055150000CC0C00B3
+:1012B00000AA0A0000FD0F005461510000D4300064
+:1012C000FEFFFFEF10B500F17C010A78012A01D181
+:1012D000022010BD01230B7024224A6002681368AB
+:1012E00014686408640014600022426623F000530E
+:1012F00000680360202048600020087010BD70B5B1
+:1013000000F01EF801D1022070BD00F01FF822F09D
+:10131000604209E070B500F013F801D1022070BD01
+:1013200000F014F822F0606211438160204600F062
+:101330001AF820680660202068600020287070BDC0
+:10134000044604F17C0528780128704701222A70A0
+:101350002420686020680668026852085200026013
+:10136000206882687047FFB50FF254020FF25806EA
+:10137000D2E9003402A9C1E90034D6E90071CDE90F
+:101380000071416E11B90121012213E001688A68E0
+:101390008968520E02F00702490F02AC655CA45C3A
+:1013A0001DF801101DF80220ED00E40095FBF1F19D
+:1013B00094FBF2F2683041800280FFBD0000000023
+:1013C00001010103070100000804020408010101F2
+:1013D0007047000001484068704700BF5C10002063
+:1013E0000248416802788918416070475C1000200B
+:1013F000EFF30980BFF36F8F264B1A681EF0100FB2
+:1014000008BF20ED108A20E9F04F106009B44FF0BA
+:10141000500080F31188BFF34F8FBFF36F8FF8F741
+:101420000CFA4FF0000080F3118809BC19680868B5
+:10143000B0E8F04F1EF0100F08BFB0EC108A80F338
+:101440000988BFF36F8F7047124B19680868B0E8BE
+:10145000F04F80F30988BFF36F8F4FF0000080F3E7
+:10146000118870470C480068006880F308884FF0C6
+:10147000000080F3148862B661B6BFF34F8FBFF3EC
+:101480006F8F00DFDFF81400016841F47001016024
+:10149000704700009856002008ED00E088ED00E05D
+:1014A00080B5AFF30080024A11001820ABBEFBE705
+:1014B0002600020038B5040001D1012032BD00F041
+:1014C00028F818B900F021F8C046C04613E00168BA
+:1014D000C86840F00100C8608A68DFF84000024038
+:1014E000062A18BFB2F5803F03D0086840F001001B
+:1014F00008600020704702206870211D206800F0FD
+:10150000C0F801206870002032BD002129702046FB
+:10151000704704F13C05687870470000070001003F
+:1015200010B50446206801698A0715D5C1688A0785
+:1015300012D56FF00202026101212177806910F05B
+:10154000030F204602D0C046C04603E0C046C04656
+:1015500000F094F800202077206801694A0715D52B
+:10156000C1684A0712D56FF0040202610221217797
+:10157000806910F4407F204602D0C046C04603E098
+:10158000C046C04600F07AF8002020772068016944
+:101590000A0715D5C1680A0712D56FF00802026163
+:1015A00004212177C06910F0030F204602D0C04605
+:1015B000C04603E0C046C04600F060F80020207737
+:1015C00020680169CA0615D5C168CA0612D56FF030
+:1015D0001002026108212177C06910F4407F204683
+:1015E00002D0C046C04603E0C046C04600F046F800
+:1015F0000020207720680169CA0708D5C168CA079A
+:1016000005D56FF0010202612046FCF791F92068D0
+:1016100001690A0608D5C1680A0605D56FF080027F
+:1016200002612046C046C04620680169CA0508D547
+:10163000C1680A0605D56FF4807202612046C04673
+:10164000C046206801694A0608D5C1684A0605D522
+:101650006FF0400202612046C046C0462068016922
+:101660008A060AD5C1688A0607D56FF02002026192
+:101670002046BDE8104000F045BB10BD204600F0FC
+:1016800042BB70B5DFF85C600368DFF85C40DFF8F0
+:101690005C50B04218BFB0F1804F01BF23F070031F
+:1016A0004A681343B04205D0B0F1804F1CBFA84236
+:1016B000A04203D1CA6823F4407313434A6923F05C
+:1016C000800313430360B0428A68C2621CBFA84211
+:1016D000A0420A68826201D1096901630121416166
+:1016E00070BD0000002C0140004801400044014052
+:1016F00018B500F12402507801281BD11378012B72
+:1017000001D1022012BD536A10701C680A480440BF
+:1017100008680443C868401E44EAC044486804435B
+:10172000087A497A44EA004444EA41241C600020D3
+:10173000107012BD012012BDFFFD00E038B504009D
+:1017400001D1012032BD2168DFF8FC02814204F1A1
+:10175000240500F042F8022068700A68A0686FF360
+:101760000E120243E06802432069024360690243AB
+:10177000A0690243E0690243206A02430A602046EE
+:1017800000F039F9A068B0F5804F04BF0021616016
+:10179000696A207900F014F838B1052805D220468E
+:1017A00000F043F900F012F803E0002028636863BA
+:1017B000A8630020A861012068700020287032BD55
+:1017C0000860A96AE86A486060687047296B002071
+:1017D0000860696BA86B486070470AD2DFF86C023A
+:1017E00042181423B2FBF3F292002A62DFF860027F
+:1017F00009E0DFF8600242181423B2FBF3F2920012
+:101800002A62DFF85402E8617047F8B5044604F133
+:10181000240600253078012801D10220F2BD0127DD
+:101820003770707801282FD102277770B561206852
+:1018300007687F087F000760204600F0C0F8216835
+:10184000F06820B10A6842F00E020A6008E00868F9
+:1018500020F0040008602068016841F00A0101607E
+:10186000706A0168CA0303D5026842F4807202609C
+:10187000306B18B1016841F4807101602068026822
+:1018800042F00102026001E0357002252846F2BDF7
+:1018900038B500F1240200245178022903D0042035
+:1018A0009061012428E001680B6823F00E030B60AF
+:1018B00001680D686D086D000D60516A0B6823F4B6
+:1018C00080730B60012192F82030D56903F01C036E
+:1018D00099406960936AD16A5960116B31B10B68A4
+:1018E00023F480730B60536B916B5960012151702D
+:1018F0001470516901B18847204632BDF8B500F136
+:1019000024010423CA6914680268156891F82060EC
+:1019100006F01C0603FA06F73C4210D06F070ED5FE
+:101920001468A50603D4156825F00405156000F0B9
+:101930003DF8C968002938D0BDE8F44008470223C3
+:1019400003FA06F73C4213D0AF0711D51468A50679
+:1019500005D4156825F00A05156001224A7000F0CB
+:1019600025F800220A708968F9B1BDE8F4400847FB
+:10197000082303FA06F6344217D02B0715D513684F
+:1019800023F00E031360012291F82030CC6903F09C
+:101990001C039A40626001228A614A7000220A7028
+:1019A000096911B1BDE8F4400847F1BD91F8202064
+:1019B000CC6902F01C02934063607047000078B568
+:1019C000C56C046D6C60446D14B1846DC56D65604B
+:1019D000012590F84440066C04F01C04A540756095
+:1019E000046863608068102802D1A260E16071BD64
+:1019F000A160E26071BD416C0268134B89089A4294
+:101A000034BF164B164B03EB8101816402F0FF02D9
+:101A1000083A1421B2FBF1F1124AC26401F01C0130
+:101A2000012202FA01F10165704701790E4A02EBC9
+:101A300081024265491E0D4A826501F003010122BF
+:101A40008A40C2657047000008040240F8FFFDBFED
+:101A500000000240F8FBFDBF000402400008024005
+:101A60001C08024080080240FC0802404009024075
+:101A70008A60FF2102685162012180F82110002153
+:101A800080F820100020704790F82010012901D123
+:101A900002207047012280F82020022180F82110C6
+:101AA000CA210268516253210368596201688A6839
+:101AB00042F02002FFF7DCBF0249016002490161E8
+:101AC000704700BFF1D2000819D30008264981B041
+:101AD0000A6802430A60096808400090009801B053
+:101AE0007047F0B585B005460C4668461421F5F7F9
+:101AF00067FA0DB9042004E0012D18BF022D02D1B0
+:101B00000820FFF7E3FF2000184E0FF268070DD101
+:101B100037F8150000900021019101200290022168
+:101B2000039100F01BF80120FBF7E0FE012C13D11C
+:101B300037F81500009001210D480190029100F046
+:101B40000DF80FF23800445D00220F2160B2FDF75E
+:101B500051F960B2FDF76BF905B0F0BD694656F872
+:101B60002500FBF7A5BC00004C00005868100020C1
+:101B70000000211010000100020000000A0607000A
+:101B80003249002008604FF4E0223148016841F4F6
+:101B9000700101604FF0B041086840F0010008603A
+:101BA0008A602C480A6802402B480A60036823F0C8
+:101BB0000503036042685208520042600022274831
+:101BC000C8600861086820F4802008608A61704756
+:101BD0004FF0B0410FF2D4000A68C2F3031250F87C
+:101BE00022008A6802F00C02042A04D0082A04D0D9
+:101BF0000C2A04D01CE01A481AE01A4818E0CA68F7
+:101C0000CB68C3F3021302F003025B1C022A08BF75
+:101C1000134802D0032A08BF1248B0FBF3F2C86889
+:101C2000CB68C0F306205B0F42435B1CB2FBF3F0B2
+:101C30000D4A0FF23803106088681168C0F3031072
+:101C400053F82000B1FBF0F01060704708ED00E0A1
+:101C500088ED00E0FBFEF6FA940000580010042224
+:101C60000024F4000048E801741000200100000086
+:101C7000030000000500000001000000010000005A
+:101C8000060000000A000000200000000200000022
+:101C900004000000080000001000000040000000E8
+:101CA000800000000001000000020000A08601008A
+:101CB000400D0300801A060000350C0040420F0062
+:101CC00080841E0000093D0000127A000024F40008
+:101CD00000366E010048E801006CDC0200000000E4
+:101CE000000000000000000000000000DFF8080015
+:101CF000006800F4C06070470004005870477047E7
+:101D00007047704770477047414E43535F50524F82
+:101D100043455353000000004761747450726F6371
+:101D200052657100414E43535F5345545F444154E3
+:101D3000415F4C454E47544820736574206461747C
+:101D400061206C656E677468202564202564206FAF
+:101D50006B203D3D3E6163695F676174745F6578C8
+:101D60006368616E67655F636F6E666967200A000E
+:101D70006163695F676174745F65786368616E67EA
+:101D8000655F636F6E66696720636D64206F6B20AB
+:101D90000A0D00006163695F676174745F65786351
+:101DA00068616E67655F636F6E66696720636D6407
+:101DB000204B4F20726573756C743D30782530323E
+:101DC00078200A0D00000000474154545F50524FE4
+:101DD000435F444953435F414E43535F534552561B
+:101DE000494345206163695F676174745F64697327
+:101DF000635F7072696D6172795F73657276696332
+:101E0000655F62795F7575696420636D64206F6BCF
+:101E10000A000000474154545F50524F435F444909
+:101E200053435F414E43535F534552564943452008
+:101E3000414E435320536572766963652069732070
+:101E40004E4F5420666F756E6420212121203D3D48
+:101E50003E20636F6E6E656374656420746F20410D
+:101E60006E64726F69642050686F6E652F50616494
+:101E7000200A0D00474154545F50524F435F44497C
+:101E800053435F414C4C5F5052494D4152595F534F
+:101E900045525649434553206163695F67617474D5
+:101EA0005F646973635F616C6C5F7072696D6172AE
+:101EB000795F736572766963657320636D64206F03
+:101EC0006B0A0000474154545F50524F435F4449EE
+:101ED00053435F414C4C5F5052494D4152595F53FF
+:101EE00045525649434553206163695F6761747485
+:101EF0005F646973635F616C6C5F7072696D61725E
+:101F0000795F736572766963657320636D64204ED3
+:101F10004F4B20737461747573203D3078253032D7
+:101F200058200A00474154545F50524F435F444980
+:101F300053435F414C4C5F5052494D4152595F539E
+:101F40004552564943455320414E435320536572F1
+:101F500076696365205B307825303458202D203039
+:101F600078253034585D20697320666F756E642063
+:101F7000212121200A0D0000474154545F50524F47
+:101F8000435F444953435F414C4C5F5052494D417C
+:101F900052595F5345525649434553204741545483
+:101FA0002053657276696365205B3078253034583C
+:101FB000202D203078253034585D20697320666FDD
+:101FC000756E6420212121200A0D0000414C4C2017
+:101FD00063686172616374657269737469637320A5
+:101FE000646973636F7665726564205375636365B6
+:101FF000737366756C6C79200A0D0000414C4C209F
+:102000006368617261637465726973746963732074
+:10201000646973636F76657279204661696C656483
+:10202000200A0D00474154545F50524F435F4449CA
+:1020300053435F414C4C5F434841525320414E4310
+:102040005344617461536F75726365436861725381
+:102050007461727448646C653D3078253034582062
+:1020600020414E435344617461536F7572636543FD
+:1020700068617256616C756548646C653D307825A1
+:10208000303458200A0D0000474154545F50524FDD
+:10209000435F444953435F414C4C5F434841525373
+:1020A00020536572766963654368616E6765644352
+:1020B000686172537461727448646C653D30782550
+:1020C0003034582020536572766963654368616EC9
+:1020D0006765644368617256616C756548646C65D8
+:1020E0003D307825303458200A0D0000414E4353CE
+:1020F0005F444953434F5645525F414C4C5F434800
+:1021000041525F4445534353205B25303458202DC2
+:1021100020253034585D0A00416C6C206368617280
+:102120006163746572697374696320646573637253
+:102130006970746F727320646973636F766572651A
+:1021400064205375636365737366756C6C79200ADC
+:102150000D000000474154545F50524F435F4449C3
+:1021600053435F414C4C5F444553435320414E43DE
+:102170005344617461536F7572636543686172445F
+:1021800065736348646C653D307825303458200AA7
+:102190000D000000536572766963654368616E6780
+:1021A0006564436861724465736348646C653D307F
+:1021B0007825303458206E6F74696669636174697C
+:1021C0006F6E20656E61626C6564204661696C6546
+:1021D0006420424C455F5354415455535F4E4F5415
+:1021E0005F414C4C4F5745443D3078253032782084
+:1021F000726573756C743D3078253032580A000072
+:10220000414E435344617461536F75726365436813
+:1022100061724465736348646C653D307825303481
+:1022200058206E6F74696669636174696F6E2065AA
+:102230006E61626C6564204661696C656420424C25
+:10224000455F5354415455535F4E4F545F414C4C7E
+:102250004F5745443D30782530327820726573758C
+:102260006C743D3078253032580A0000414E43539B
+:102270004E6F74696669636174696F6E536F7572CE
+:102280006365436861724465736348646C65206E7E
+:102290006F74696669636174696F6E20656E6162EF
+:1022A0006C6564205375636365737366756C6C79D4
+:1022B000200A0D00536572766963654368616E6735
+:1022C0006564436861724465736348646C653D305E
+:1022D0007825303458206E6F74696669636174695B
+:1022E0006F6E2064697361626C656420537563630B
+:1022F00065737366756C6C79200A0D00414E43530B
+:102300005F44495341424C455F4E4F54494649430F
+:102310004154494F4E5F444154415F534F555243DE
+:10232000455F444553432030782530345820307879
+:1023300025303458200A0000414E435344617461F3
+:10234000536F757263654368617244657363486473
+:102350006C65206E6F74696669636174696F6E2065
+:1023600064697361626C656420537563636573733C
+:1023700066756C6C79200A0D00000000414E4353D5
+:102380005F44495341424C455F4E4F54494649438F
+:102390004154494F4E5F4E4F544946494341544979
+:1023A0004F4E5F534F555243455F44455343203092
+:1023B000782530345820307825303458200A0000F1
+:1023C000414E43534E6F74696669636174696F6E01
+:1023D000536F7572636543686172446573634864E3
+:1023E0006C65206E6F74696669636174696F6E20D5
+:1023F00064697361626C65642053756363657373AC
+:1024000066756C6C79200A0D00000000414E435344
+:102410005F444953434F5645525F474154545F53BD
+:10242000455256494345206163695F676174745F33
+:10243000646973635F7072696D6172795F736572ED
+:10244000766963655F62795F7575696420636D6441
+:10245000206F6B0A00000000414E43535F44495314
+:10246000434F5645525F534552564943455F434893
+:10247000414E4745445F4348415220636F6E6E654D
+:102480006374696F6E5F68616E646C653D3078255A
+:102490003034582047415454536572766963654817
+:1024A000616E646C655B25303458202D20253034F6
+:1024B000585D0A0047415454206368617261637437
+:1024C000657269737469637320646973636F766599
+:1024D000726564205375636365737366756C6C799C
+:1024E000200A0D0053657276696365204368616E4A
+:1024F000676564206368617261637465726973748F
+:1025000069632064657363726970746F72732064A9
+:102510006973636F76657265642053756363657371
+:102520007366756C6C79200A0D0000005365727635
+:10253000696365204368616E6765642063686172E2
+:10254000616374657269737469632064657363722F
+:102550006970746F727320646973636F76657279E2
+:10256000204661696C6564200A0D00004144565F95
+:102570005550444154455F50524F4345535300001A
+:102580004843495F555345525F4556545F50524F3B
+:1025900043455353000000004150505F424C455F9B
+:1025A000496E697400000000746F74616C2073746C
+:1025B00061636B20737061636520206F66204863E0
+:1025C000695573657245767450726F6365737349AC
+:1025D000643D307825303878203A203078253038FE
+:1025E00078200A00617661696C61626C65207374A1
+:1025F00061636B20737061636520206F66204863A0
+:10260000695573657245767450726F63657373496B
+:1026100064203A20307825303878200A0000000005
+:10262000546F74616C207368632B6863692B6164F9
+:102630007620737461636B207370616365203A2048
+:10264000307825303878200A00000000546F74611B
+:102650006C207368632B6863692B6164762B6872E6
+:102660007320737461636B207370616365203A201B
+:10267000307825303878200A00000000546F7461EB
+:102680006C207368632B6863692B6164762B6872B6
+:10269000732B616E637320737461636B207370615D
+:1026A0006365203A20307825303878200A00000011
+:1026B000746F74616C20737461636B2073706163F9
+:1026C0006520206F662041647655706461746550A2
+:1026D000726F6365737349643D30782530387820B4
+:1026E0003A20307825303878200A0000535643438A
+:1026F000544C5F4170705F4E6F74696669636174BA
+:10270000696F6E000D0A0D2A2A20444953434F4E2B
+:102710004E454354494F4E204556454E5420574947
+:10272000544820434C49454E5420646973636F6E8E
+:102730006E656374696F6E20526561736F6E3D30B4
+:10274000782530325820737563657373200A0D0045
+:102750000D0A0D2A2A20444953434F4E4E454354F7
+:10276000494F4E204556454E542057495448204322
+:102770004C49454E5420646973636F6E6E65637493
+:10278000696F6E20526561736F6E3D30782530320F
+:102790005820436F6E6E656374696F6E2074657246
+:1027A0006D696E61746564206279206C6F63616C21
+:1027B00020686F7374200A0D0000000010B50446F5
+:1027C000AFF30080204600F005F80446AFF3008028
+:1027D000204610BD7CB500F10F06F608F600B042A9
+:1027E00040D2082E04D2082602E0083000F047F854
+:1027F000DFF804512C68210005D1002007E00268B1
+:10280000B24221D2011D08680028F8D12068291D94
+:102810000A68824222D01368B34238BF111DF7D331
+:1028200012E093190B60801B54685C600B681860A1
+:102830001660096800291DBF48680028081D00208F
+:10284000286002F1080076BD61B10A681068A0F145
+:102850000803B342E5D250680860EAE700F04EF89A
+:102860000028C2D1002076BD10B5040006D0AFF319
+:102870000080204600F003F8AFF3008010BD002870
+:1028800000D1704750B4A0F108021368072B2BD970
+:1028900013F0070F28D1184C616809B18A4202D29F
+:1028A0005160626013E0486800B3904238BF01464F
+:1028B000F9D31BE0964203D11B180B600A4606E0D1
+:1028C000486810B1134498420ED350604A60506873
+:1028D00050B11368D118814206D1002121600168EE
+:1028E000CB1813604068506050BC704708680E18E1
+:1028F000B242DFD250BC7047405C002007490868F4
+:1029000008B1002070470648C008C00008600549AB
+:10291000C908C900091A0160704700BF685C00203F
+:10292000876C0020807000202DE9F0410746884622
+:10293000387810F0030F16461D4633D0384600F0A5
+:1029400099F878BBB8F1000F1CBFD8E900018619CF
+:10295000012D2ED13888C10415D5396A07F14402FA
+:10296000384600F0A3F83A6B044602B93A69F968B0
+:10297000384600F09BF8361B341A7A69F9683846F5
+:1029800000F094F8261A1EB94DB916F1010F09D0BE
+:1029900097F903002A46314600F08EF8064616F1F4
+:1029A000010F09D12320AFF300804FF0FF30BDE8C5
+:1029B000F081022DE8D1EBE7388810F4405F0ED0AB
+:1029C0007868F86038617861B8617868F86107F113
+:1029D0004400386207F13000786200203863B8F1B3
+:1029E000000F05D0D8E9020107F13402C2E9000165
+:1029F00039884CF6FF60014039800020BDE8F08145
+:102A000070B50546AFF300802888810415D56E683F
+:102A10000024EA6895F903003146914212D2521A15
+:102A2000F4F79FFA10F1010F1CBF00283618F0D1FF
+:102A30000FE04DF6FF70014029802846AFF300807B
+:102A4000002070BD00220021F4F78BFA10F1010F75
+:102A500000D101246868E860A861E861002C298839
+:102A6000E7D041F4007129802846AFF300804FF091
+:102A7000FF3070BDF8B5A0B9AFF3008000250A4E55
+:102A800008244FF0FF37306820B1FFF7B9FF002866
+:102A900048BF3D46361D641EF5D1AFF30080284681
+:102AA000F2BDBDE8F240ABE750110020914234BFC7
+:102AB000511A0021084670473EB504000D00012A56
+:102AC00002D100F063F807E0022A07D10094002049
+:102AD000019069460C20ABBE2D1801E0002A0CD1F4
+:102AE0000094019569460A20ABBE002805D100225A
+:102AF0002100280000F027F801E00020C04303B0C7
+:102B000030BD000010B4314A002113461C688442D5
+:102B10001EBF491C9C6884421EBF491C1C6984421C
+:102B200009D09C69491C844205D0491C20331029D6
+:102B3000ECD310BC7047002342F8313002EBC101E6
+:102B40004B6010BC704778B4204C002325462E689B
+:102B50008E421EBF5B1CAE688E421EBF5B1C2E6980
+:102B60008E4209D0AE695B1C8E4205D05B1C2035BD
+:102B7000102BECD372BC7047054604EBC303012A4B
+:102B800004BF59684D195D6072BC704710B40F4A9C
+:102B9000002113461C6884421EBF491C9C68844265
+:102BA0001EBF491C1C6984420AD09C69491C84428E
+:102BB00006D0491C20331029ECD310BC00207047EC
+:102BC00002EBC100406810BC70470000B458002000
+:102BD00010B50446E068A169884251D3218849F2C2
+:102BE00002030B40022B08D008044CBF4FF40070C6
+:102BF0004FF48440014321803BE001F4C042B2F530
+:102C0000C04F06D1A168884203D32046FFF732FFA8
+:102C100078BB208810F4406F02BF606804F1440163
+:102C2000884217D14FF40070FFF7C8FD606030B9DB
+:102C300004F144006060E060401CA0600AE021886C
+:102C400041F040012180E060606100F50072606841
+:102C5000A260E06160682061A068A06120784107FF
+:102C60000AD502220021204600F00CF810F1010FD5
+:102C700002D14FF0FF3010BD208840F4C0402080CA
+:102C8000002010BD70B504460D461646AFF3008017
+:102C900033462A4600212046FFF746FE05462046D9
+:102CA000AFF30080284670BD38B504000ED0207800
+:102CB00010F0030F03D094F90300002809D5AFF3F7
+:102CC0000080204600F030F8AFF300804FF0FF3076
+:102CD00032BD2046FFF7CEFE0546AFF300802078D8
+:102CE000410644BF606800F05DF80020606094F920
+:102CF0000300022804D900F057F808B14FF0FF355F
+:102D0000E06B48B100F05CF808B14FF0FF35E06BC4
+:102D100000F048F80020E063204600F005F8AFF32B
+:102D20000080284632BD000001780A0626D51C4ADC
+:102D300013680021834203D1002342F821301BE0B5
+:102D40005368012183421EBF022193688342F3D05E
+:102D5000D368032183421EBF042113698342EBD051
+:102D60005369052183421EBF0621936983421EBF1A
+:102D70000721D3698342DFD000F014B8002101801D
+:102D80004FF0FF31C17000F144014160C160016149
+:102D900041618161C161016200F1300141627047AE
+:102DA00050110020FFF760BD1CB50200009269467B
+:102DB0000220ABBE04001000FFF7A4FE200016BDE9
+:102DC000E0B50090F4F768FC019069460E20ABBEB8
+:102DD00003B000BD7047FEE7FEE7FEE7FEE7704781
+:102DE0000748FEF78BBD0748FEF79ABB0648FDF77C
+:102DF00098BB0648FDF795BB0548FEF77FBD000070
+:102E000034590020D45A0020285800209C57002014
+:102E1000945900201020FAF70FBC0120FAF70CBCDF
+:102E20000220FAF709BCFBF72EBCFBF713BFFBF738
+:102E3000E7BE38B50C46C5B22046AFF30080E06867
+:102E4000A169884204D32046FFF7C2FE00280FD4B0
+:102E5000E068401CE06000F8015D2088010503D4B3
+:102E600040050BD50A2D09D12046FFF703FE28B1F6
+:102E70002046AFF300804FF0FF3032BD2046AFF365
+:102E80000080284632BD19E050F8042BD30744BF18
+:102E9000A9F101039A18091F0023042942F8043BF1
+:102EA000F9D25FEA817C134604D54FF0000CA2F8FA
+:102EB00000C09B1CC90744BF0021197050F8041BB7
+:102EC0000029E1D17047000038B50D4D082428686D
+:102ED00000281CBF017811F0030F05D090F90310F2
+:102EE000002958BFFFF7E0FE2D1D641EEFD1BDE89D
+:102EF0003840002200214FF0FF30F4F732B800BF15
+:102F00005011002010B5074979441831064C7C4413
+:102F1000163404E00A68081D114488470146A1429E
+:102F2000F8D110BD2C000000600000004EF6885162
+:102F3000CEF20001086840F470000860BFF34F8FC4
+:102F4000BFF36F8F4FF00070E1EE100A7047000082
+:102F500037FFFFFFD44A0000A811002080080000BE
+:102F60003000032000000000033FFFFFB401000019
+:102F70007201000004000020F33EFFFF5D0200002C
+:102F800006000000280003200000000000000000F0
+:102F9000000000000000000001000000020000002E
+:102FA00003000000040000000120C046002801D0FA
+:102FB000FFF7A8FFAFF300800020AFF30080FAF71F
+:102FC00062FB00F000F800F001B800000746FFF7D0
+:102FD0007BFF3846FEF764FAFBE70000534843499D
+:102FE0005F555345525F4556545F50524F434553CA
+:102FF0005300000038B504460D46284600F006F898
+:10300000A84218BF0024204632BD00000149FFF746
+:1030100010BF00BFC0100020014880470148004792
+:10302000811B0108413001084852535F50524F4301
+:103030004553530064656661756C745461736B002D
+:10304000AFF30080FFF772FFFFF7AEFF00002E0026
+:10305000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA4
+:10306000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF94
+:10307000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF84
+:10308000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF74
+:10309000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF64
+:1030A000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF54
+:1030B000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF44
+:1030C000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF34
+:1030D000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF24
+:1030E000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF14
+:1030F000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF04
+:10310000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF3
+:10311000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE3
+:10312000F002130DFF010001F3FF010001F1FF01A7
+:10313000F1FF01F1FF01F1FF01F1FF01F1FF01F1E9
+:10314000FF01F1FF01F1FF01F1FF01F1FF01F1FFCB
+:1031500001F1FF01F1FF01F1250112AA018F000029
+:1031600030102210085003080048000C04100A090F
+:103170003D0001040000BC100020BD0452BC04212D
+:1031800027A10852A80CF10B011007020401014409
+:103190005A0020940452440421346108F0031304BB
+:1031A000110020F0484003080202F4594021082190
+:1031B0000421346108124C48F31138114812786C1C
+:1031C00012C004F206082CF002074C300108045229
+:0C31D000FF01F2004E1403000052000149
+:04000005080130417D
+:00000001FF
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/FreeRTOSConfig.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/FreeRTOSConfig.h
new file mode 100644
index 000000000..0f6c52053
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/FreeRTOSConfig.h
@@ -0,0 +1,159 @@
+/* USER CODE BEGIN Header */
+/*
+ * FreeRTOS Kernel V10.0.1
+ * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * 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.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
+ */
+/* USER CODE END Header */
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+/* USER CODE BEGIN Includes */
+/* Section where include file can be added */
+/* USER CODE END Includes */
+
+/* Ensure definitions are only used by the compiler, and not by the assembler. */
+#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
+ #include <stdint.h>
+ extern uint32_t SystemCoreClock;
+#endif
+#define configENABLE_FPU 0
+#define configENABLE_MPU 0
+
+#define configUSE_PREEMPTION 1
+#define configSUPPORT_STATIC_ALLOCATION 1
+#define configSUPPORT_DYNAMIC_ALLOCATION 1
+#define configUSE_IDLE_HOOK 0
+#define configUSE_TICK_HOOK 0
+#define configCPU_CLOCK_HZ ( SystemCoreClock )
+#define configTICK_RATE_HZ ((TickType_t)1000)
+#define configMAX_PRIORITIES ( 56 )
+#define configMINIMAL_STACK_SIZE ((uint16_t)128)
+#define configTOTAL_HEAP_SIZE ((size_t)12*1024)
+#define configMAX_TASK_NAME_LEN ( 16 )
+#define configUSE_TRACE_FACILITY 1
+#define configUSE_16_BIT_TICKS 0
+#define configUSE_MUTEXES 1
+#define configQUEUE_REGISTRY_SIZE 8
+#define configUSE_RECURSIVE_MUTEXES 1
+#define configUSE_COUNTING_SEMAPHORES 1
+#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
+#define configUSE_TICKLESS_IDLE 2
+/* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */
+/* Defaults to size_t for backward compatibility, but can be changed
+ if lengths will always be less than the number of bytes in a size_t. */
+#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
+/* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */
+
+/* Co-routine definitions. */
+#define configUSE_CO_ROUTINES 0
+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
+
+/* Software timer definitions. */
+#define configUSE_TIMERS 1
+#define configTIMER_TASK_PRIORITY ( 2 )
+#define configTIMER_QUEUE_LENGTH 10
+#define configTIMER_TASK_STACK_DEPTH 256
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+#define INCLUDE_vTaskPrioritySet 1
+#define INCLUDE_uxTaskPriorityGet 1
+#define INCLUDE_vTaskDelete 1
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 1
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+#define INCLUDE_xTaskGetSchedulerState 1
+#define INCLUDE_xTimerPendFunctionCall 1
+#define INCLUDE_xQueueGetMutexHolder 1
+#define INCLUDE_uxTaskGetStackHighWaterMark 1
+#define INCLUDE_eTaskGetState 1
+
+/*
+ * The CMSIS-RTOS V2 FreeRTOS wrapper is dependent on the heap implementation used
+ * by the application thus the correct define need to be enabled below
+ */
+#define USE_FreeRTOS_HEAP_4
+
+/* Cortex-M specific definitions. */
+#ifdef __NVIC_PRIO_BITS
+ /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
+ #define configPRIO_BITS __NVIC_PRIO_BITS
+#else
+ #define configPRIO_BITS 4
+#endif
+
+/* The lowest interrupt priority that can be used in a call to a "set priority"
+function. */
+#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
+
+/* The highest interrupt priority that can be used by any interrupt service
+routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
+INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
+PRIORITY THAN THIS! (higher priorities are lower numeric values. */
+#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
+
+/* Interrupt priorities used by the kernel port layer itself. These are generic
+to all Cortex-M ports, and do not rely on any particular library functions. */
+#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
+See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+
+/* Normal assert() semantics without relying on the provision of an assert.h
+header file. */
+/* USER CODE BEGIN 1 */
+#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
+/* USER CODE END 1 */
+
+/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
+standard names. */
+#define vPortSVCHandler SVC_Handler
+#define xPortPendSVHandler PendSV_Handler
+
+/* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick,
+ to prevent overwriting SysTick_Handler defined within STM32Cube HAL */
+
+#define xPortSysTickHandler SysTick_Handler
+
+/* USER CODE BEGIN Defines */
+/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */
+#define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 1 /* required only for Keil but does not hurt otherwise */
+/* USER CODE END Defines */
+
+#endif /* FREERTOS_CONFIG_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_common.h
new file mode 100644
index 000000000..836f40dcf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_common.h
@@ -0,0 +1,115 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_conf.h
new file mode 100644
index 000000000..85961c5f7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_conf.h
@@ -0,0 +1,563 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+
+/**< generic parameters ******************************************************/
+
+/**
+ * Define Tx Power
+ */
+#define CFG_TX_POWER (0x18) /**< 0dbm */
+
+/**
+ * Define Advertising parameters
+ */
+#define CFG_ADV_BD_ADDRESS (0x7257acd87a6c)
+#define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */
+#define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xa0) /**< 100ms */
+#define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */
+#define CFG_LP_CONN_ADV_INTERVAL_MAX (0xfa0) /**< 2.5s */
+
+/**
+ * Define IO Authentication
+ */
+#define CFG_BONDING_MODE (BONDING) /* BONDING-1 NO_BONDING-0*/
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+
+/**
+ * Define IO capabilities
+ */
+#define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00)
+#define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01)
+#define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02)
+#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
+#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
+
+//#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_YES_NO /* for iOS Device */ /* need to press YES on iOS device side */
+//#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY /* for iOS Device */ /* need to input password (111111) on iOS device side */
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT /* compatible for Android Device */ /* nothing need to do on iOS device side */
+
+/**
+ * Define MITM modes
+ */
+#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
+#define CFG_MITM_PROTECTION_REQUIRED (0x01)
+
+
+//#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED /* for iOS Device */
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_NOT_REQUIRED /* compatible for Android Device */
+
+/**
+ * Define Secure Connections Support
+ */
+#define CFG_SECURE_NOT_SUPPORTED (0x00)
+#define CFG_SECURE_OPTIONAL (0x01)
+#define CFG_SECURE_MANDATORY (0x02)
+
+#define CFG_SC_SUPPORT CFG_SECURE_OPTIONAL
+
+/**
+ * Define Keypress Notification Support
+ */
+#define CFG_KEYPRESS_NOT_SUPPORTED (0x00)
+#define CFG_KEYPRESS_SUPPORTED (0x01)
+
+#define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED
+
+/**
+ * Numeric Comparison Answers
+ */
+#define YES (0x01)
+#define NO (0x00)
+
+/**
+ * Device name configuration for Generic Access Service
+ */
+#define CFG_GAP_DEVICE_NAME "TEMPLATE"
+#define CFG_GAP_DEVICE_NAME_LENGTH (8)
+
+/**
+ *Bluetooth address types
+ */
+#define CFG_IDENTITY_ADDRESS_TYPE PUBLIC_ADDR
+
+
+/* Out-Of-Band data
+ */
+#define CFG_OOB_DATA_PRESENT OOB_AUTH_DATA_ABSENT
+
+/**
+ * Define PHY
+ */
+#define ALL_PHYS_PREFERENCE 0x00
+#define RX_2M_PREFERRED 0x02
+#define TX_2M_PREFERRED 0x02
+#define TX_1M 0x01
+#define TX_2M 0x02
+#define RX_1M 0x01
+#define RX_2M 0x02
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_IRK {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_ERK {0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21,0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21}
+
+/* USER CODE BEGIN Generic_Parameters */
+/**
+ * SMPS supply
+ * SMPS not used when Set to 0
+ * SMPS used when Set to 1
+ */
+#define CFG_USE_SMPS 1
+/* USER CODE END Generic_Parameters */
+
+/**< specific parameters */
+/*****************************************************/
+
+/**
+* AD Element - Group B Feature
+*/
+/* LSB - Second Byte */
+#define CFG_FEATURE_OTA_REBOOT (0x20)
+
+/******************************************************************************
+ * BLE Stack
+ ******************************************************************************/
+/**
+ * Maximum number of simultaneous connections that the device will support.
+ * Valid values are from 1 to 8
+ */
+#define CFG_BLE_NUM_LINK 8
+
+/**
+ * Maximum number of Services that can be stored in the GATT database.
+ * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services
+ */
+#define CFG_BLE_NUM_GATT_SERVICES 8
+
+/**
+ * Maximum number of Attributes
+ * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services)
+ * that can be stored in the GATT database.
+ * Note that certain characteristics and relative descriptors are added automatically during device initialization
+ * so this parameters should be 9 plus the number of user Attributes
+ */
+#define CFG_BLE_NUM_GATT_ATTRIBUTES 68
+
+/**
+ * Maximum supported ATT_MTU size
+ */
+#define CFG_BLE_MAX_ATT_MTU (250)
+#define CFG_BLE_MAX_ATT_MTU_TX_TIME (2112)
+
+//#define CFG_BLE_MAX_ATT_MTU (251)
+//#define CFG_BLE_MAX_ATT_MTU_TX_TIME (2120)
+
+/**
+ * Size of the storage area for Attribute values
+ * This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute:
+ * - attribute value length
+ * - 5, if UUID is 16 bit; 19, if UUID is 128 bit
+ * - 2, if server configuration descriptor is used
+ * - 2*DTM_NUM_LINK, if client configuration descriptor is used
+ * - 2, if extended properties is used
+ * The total amount of memory needed is the sum of the above quantities for each attribute.
+ */
+#define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344)
+
+/**
+ * Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
+ */
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+
+/**
+ * Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
+ */
+#define CFG_BLE_DATA_LENGTH_EXTENSION 1
+
+/**
+ * Sleep clock accuracy in Slave mode (ppm value)
+ */
+#define CFG_BLE_SLAVE_SCA 500
+
+/**
+ * Sleep clock accuracy in Master mode
+ * 0 : 251 ppm to 500 ppm
+ * 1 : 151 ppm to 250 ppm
+ * 2 : 101 ppm to 150 ppm
+ * 3 : 76 ppm to 100 ppm
+ * 4 : 51 ppm to 75 ppm
+ * 5 : 31 ppm to 50 ppm
+ * 6 : 21 ppm to 30 ppm
+ * 7 : 0 ppm to 20 ppm
+ */
+#define CFG_BLE_MASTER_SCA 0
+
+/**
+ * Source for the 32 kHz slow speed clock
+ * 1 : internal RO
+ * 0 : external crystal ( no calibration )
+ */
+#define CFG_BLE_LSE_SOURCE 0
+
+/**
+ * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_HSE_STARTUP_TIME 0x148
+
+/**
+ * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_MAX_CONN_EVENT_LENGTH ( 0xFFFFFFFF )
+
+/**
+ * Viterbi Mode
+ * 1 : enabled
+ * 0 : disabled
+ */
+#define CFG_BLE_VITERBI_MODE 1
+
+/**
+ * LL Only Mode
+ * 1 : LL Only
+ * 0 : LL + Host
+ */
+#define CFG_BLE_LL_ONLY 0
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TLBLE_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_BLE_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU 0
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 0
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+/**
+ * When set to 1, the traces are enabled in the BLE services
+ */
+#define CFG_DEBUG_BLE_TRACE 0
+
+/**
+ * Enable or Disable traces in application
+ */
+#define CFG_DEBUG_APP_TRACE 1
+
+#if (CFG_DEBUG_APP_TRACE != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+#if ( (CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0) )
+#define CFG_DEBUG_TRACE 1
+#endif
+
+#if (CFG_DEBUG_TRACE != 0)
+#undef CFG_LPM_SUPPORTED
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+#define CFG_DEBUGGER_SUPPORTED 1
+#endif
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 1
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/* USER CODE BEGIN Defines */
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 1
+/* USER CODE END Defines */
+
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+/******************************************************************************
+ * FreeRTOS
+ ******************************************************************************/
+#define CFG_SHCI_USER_EVT_PROCESS_NAME "SHCI_USER_EVT_PROCESS"
+#define CFG_SHCI_USER_EVT_PROCESS_ATTR_BITS (0)
+#define CFG_SHCI_USER_EVT_PROCESS_CB_MEM (0)
+#define CFG_SHCI_USER_EVT_PROCESS_CB_SIZE (0)
+#define CFG_SHCI_USER_EVT_PROCESS_STACK_MEM (0)
+#define CFG_SHCI_USER_EVT_PROCESS_PRIORITY osPriorityNone
+#define CFG_SHCI_USER_EVT_PROCESS_STACK_SIZE (128 * 7)
+
+#define CFG_HCI_USER_EVT_PROCESS_NAME "HCI_USER_EVT_PROCESS"
+#define CFG_HCI_USER_EVT_PROCESS_ATTR_BITS (0)
+#define CFG_HCI_USER_EVT_PROCESS_CB_MEM (0)
+#define CFG_HCI_USER_EVT_PROCESS_CB_SIZE (0)
+#define CFG_HCI_USER_EVT_PROCESS_STACK_MEM (0)
+#define CFG_HCI_USER_EVT_PROCESS_PRIORITY osPriorityNone
+#define CFG_HCI_USER_EVT_PROCESS_STACK_SIZE (128 * 12)
+
+#define CFG_ADV_UPDATE_PROCESS_NAME "ADV_UPDATE_PROCESS"
+#define CFG_ADV_UPDATE_PROCESS_ATTR_BITS (0)
+#define CFG_ADV_UPDATE_PROCESS_CB_MEM (0)
+#define CFG_ADV_UPDATE_PROCESS_CB_SIZE (0)
+#define CFG_ADV_UPDATE_PROCESS_STACK_MEM (0)
+#define CFG_ADV_UPDATE_PROCESS_PRIORITY osPriorityNone
+#define CFG_ADV_UPDATE_PROCESS_STACK_SIZE (128 * 6)
+
+#define CFG_HRS_PROCESS_NAME "HRS_PROCESS"
+#define CFG_HRS_PROCESS_ATTR_BITS (0)
+#define CFG_HRS_PROCESS_CB_MEM (0)
+#define CFG_HRS_PROCESS_CB_SIZE (0)
+#define CFG_HRS_PROCESS_STACK_MEM (0)
+#define CFG_HRS_PROCESS_PRIORITY osPriorityNone
+#define CFG_HRS_PROCESS_STACK_SIZE (128 * 5)
+
+/* USER CODE BEGIN FreeRTOS_Defines */
+#define CFG_ANCS_PROCESS_NAME "ANCS_PROCESS"
+#define CFG_ANCS_PROCESS_ATTR_BITS (0)
+#define CFG_ANCS_PROCESS_CB_MEM (0)
+#define CFG_ANCS_PROCESS_CB_SIZE (0)
+#define CFG_ANCS_PROCESS_STACK_MEM (0)
+#define CFG_ANCS_PROCESS_PRIORITY osPriorityNone
+#define CFG_ANCS_PROCESS_STACk_SIZE (128 * 10)
+/* USER CODE END FreeRTOS_Defines */
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_BLE,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_debug.h
new file mode 100644
index 000000000..4224edbe0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_debug.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_debug.h
+ * Description : Header for app_debug.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_DEBUG_H
+#define __APP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPD_Init( void );
+ void APPD_EnableCPU2( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*__APP_DEBUG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_entry.h
new file mode 100644
index 000000000..77ead2384
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_entry.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief Interface to the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..097cedfd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_conf.h
@@ -0,0 +1,198 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for BLE
+ * middleWare.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+#include "FreeRTOSConfig.h"
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1) /* FreeRTOS requirement */
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_CHANNEL_4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_CHANNEL_4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_CHANNEL_4_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_if.h
index 271a222a9..271a222a9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_if.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/main.h
new file mode 100644
index 000000000..4b10d2beb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/main.h
@@ -0,0 +1,72 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.h
+ * @author MCD Application Team
+ * @brief Header for main.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "app_conf.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32wbxx_nucleo.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32_lpm_if.h
index d8e67947f..d8e67947f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32_lpm_if.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..b5b04b135
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,359 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..eaceee861
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,77 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void DebugMon_Handler(void);
+void DMA1_Channel4_IRQHandler(void);
+void TIM1_TRG_COM_TIM17_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/utilities_conf.h
index 4dde3509a..4dde3509a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/utilities_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..7280c33b9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/vcp_conf.h
@@ -0,0 +1,53 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA_ID)
+#define VCP_TASK_PRIO (CFG_SCH_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_debug.c
new file mode 100644
index 000000000..14ed65c22
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_debug.c
@@ -0,0 +1,399 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_debug.c
+ * Description : Debug capabilities source file for STM32WPAN Middleware
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+
+#include "app_debug.h"
+#include "utilities_common.h"
+#include "shci.h"
+#include "tl.h"
+#include "dbg_trace.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+typedef PACKED_STRUCT
+{
+ GPIO_TypeDef* port;
+ uint16_t pin;
+ uint8_t enable;
+ uint8_t reserved;
+} APPD_GpioConfig_t;
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+#define GPIO_NBR_OF_RF_SIGNALS 9
+#define GPIO_CFG_NBR_OF_FEATURES 34
+#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
+#define NBR_OF_GENERAL_CONFIG_PARAMETERS 4
+
+/**
+ * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
+ */
+#define BLE_DTB_CFG 0
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+
+#ifdef CFG_DEBUG_TRACE_UART
+#if(CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if(CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+#endif
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * It provides timing information on the CPU2 activity.
+ * All configuration of (port, pin) is supported for each features and can be selected by the user
+ * depending on the availability
+ */
+static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] =
+{
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */
+/* From v1.1.1 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */
+/* From v1.2.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */
+/* From v1.3.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */
+/* From v1.4.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */
+};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * This table is relevant only for BLE
+ * It provides timing information on BLE RF activity.
+ * New signals may be allocated at any location when requested by ST
+ * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed
+ */
+#if( BLE_DTB_CFG == 7)
+static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
+{
+ { GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */
+ { GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */
+ { GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */
+ { GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */
+ { GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */
+ { GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */
+ { GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */
+ { GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */
+ { GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
+};
+#endif
+/* USER CODE END PV */
+
+/* Global variables ----------------------------------------------------------*/
+/* USER CODE BEGIN GV */
+/* USER CODE END GV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+static void APPD_SetCPU2GpioConfig( void );
+static void APPD_BleDtbCfg( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPD_Init( void )
+{
+/* USER CODE BEGIN APPD_Init */
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+ HAL_DBGMCU_EnableDBGStopMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ APPD_SetCPU2GpioConfig( );
+ APPD_BleDtbCfg( );
+
+/* USER CODE END APPD_Init */
+ return;
+}
+
+void APPD_EnableCPU2( void )
+{
+/* USER CODE BEGIN APPD_EnableCPU2 */
+ SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
+ {
+ {{0,0,0}}, /**< Does not need to be initialized */
+ {(uint8_t *)aGpioConfigList,
+ (uint8_t *)&APPD_TracesConfig,
+ (uint8_t *)&APPD_GeneralConfig,
+ GPIO_CFG_NBR_OF_FEATURES,
+ NBR_OF_TRACES_CONFIG_PARAMETERS,
+ NBR_OF_GENERAL_CONFIG_PARAMETERS}
+ };
+
+ /**< Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /** GPIO DEBUG Initialization */
+ SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+
+/* USER CODE END APPD_EnableCPU2 */
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void APPD_SetCPU2GpioConfig( void )
+{
+/* USER CODE BEGIN APPD_SetCPU2GpioConfig */
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+ uint16_t gpioc_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+ gpioc_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++)
+ {
+ if( aGpioConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aGpioConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOC:
+ gpioc_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpioc_pin_list != 0)
+ {
+ gpio_config.Pin = gpioc_pin_list;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &gpio_config);
+ HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
+ }
+
+/* USER CODE END APPD_SetCPU2GpioConfig */
+ return;
+}
+
+static void APPD_BleDtbCfg( void )
+{
+/* USER CODE BEGIN APPD_BleDtbCfg */
+#if (BLE_DTB_CFG != 0)
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++)
+ {
+ if( aRfConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aRfConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_AF_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ gpio_config.Alternate = GPIO_AF6_RF_DTB7;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ }
+#endif
+
+/* USER CODE END APPD_BleDtbCfg */
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+*************************************************************/
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+/* USER CODE BEGIN DbgOutputInit */
+#ifdef CFG_DEBUG_TRACE_UART
+if (CFG_DEBUG_TRACE_UART == hw_lpuart1)
+{
+#if(CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+}
+else if (CFG_DEBUG_TRACE_UART == hw_uart1)
+{
+#if(CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+#endif
+}
+#endif
+
+/* USER CODE END DbgOutputInit */
+ return;
+}
+
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+/* USER CODE END DbgOutputTraces */
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+/* USER CODE END DbgOutputTraces */
+ return;
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_entry.c
new file mode 100644
index 000000000..f0f9946bb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_entry.c
@@ -0,0 +1,346 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_ble.h"
+#include "ble.h"
+#include "tl.h"
+#include "cmsis_os.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "app_debug.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Global variables ----------------------------------------------------------*/
+osMutexId_t MtxShciId;
+osSemaphoreId_t SemShciId;
+osThreadId_t ShciUserEvtProcessId;
+
+const osThreadAttr_t ShciUserEvtProcess_attr = {
+ .name = CFG_SHCI_USER_EVT_PROCESS_NAME,
+ .attr_bits = CFG_SHCI_USER_EVT_PROCESS_ATTR_BITS,
+ .cb_mem = CFG_SHCI_USER_EVT_PROCESS_CB_MEM,
+ .cb_size = CFG_SHCI_USER_EVT_PROCESS_CB_SIZE,
+ .stack_mem = CFG_SHCI_USER_EVT_PROCESS_STACK_MEM,
+ .priority = CFG_SHCI_USER_EVT_PROCESS_PRIORITY,
+ .stack_size = CFG_SHCI_USER_EVT_PROCESS_STACK_SIZE
+};
+
+/* Private functions prototypes-----------------------------------------------*/
+static void ShciUserEvtProcess(void *argument);
+static void SystemPower_Config( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+static void APPE_SysUserEvtRx( void * pPayload );
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ APPD_Init();
+
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ Led_Init();
+
+ Button_Init();
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ MtxShciId = osMutexNew( NULL );
+ SemShciId = osSemaphoreNew( 1, 0, NULL ); /*< Create the semaphore and make it busy at initialization */
+
+ /** FreeRTOS system task creation */
+ ShciUserEvtProcessId = osThreadNew(ShciUserEvtProcess, NULL, &ShciUserEvtProcess_attr);
+
+ /**< System channel initialization */
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ switch (status)
+ {
+ case SHCI_TL_CmdBusy:
+ osMutexAcquire( MtxShciId, osWaitForever );
+ break;
+
+ case SHCI_TL_CmdAvailable:
+ osMutexRelease( MtxShciId );
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ UNUSED(pPayload);
+ /* Traces channel initialization */
+ APPD_EnableCPU2( );
+
+ APP_BLE_Init( );
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/*************************************************************
+ *
+ * FREERTOS WRAPPER FUNCTIONS
+ *
+*************************************************************/
+static void ShciUserEvtProcess(void *argument)
+{
+ UNUSED(argument);
+ for(;;)
+ {
+ /* USER CODE BEGIN SHCI_USER_EVT_PROCESS_1 */
+
+ /* USER CODE END SHCI_USER_EVT_PROCESS_1 */
+ osThreadFlagsWait(1, osFlagsWaitAny, osWaitForever);
+ shci_user_evt_proc();
+ /* USER CODE BEGIN SHCI_USER_EVT_PROCESS_2 */
+
+ /* USER CODE END SHCI_USER_EVT_PROCESS_2 */
+ }
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+ BSP_LED_On(LED_GREEN);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ osThreadFlagsSet( ShciUserEvtProcessId, 1 );
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ osSemaphoreRelease( SemShciId );
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ osSemaphoreAcquire( SemShciId, osWaitForever );
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ APP_BLE_Key_Button1_Action();
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_BLE_Key_Button2_Action();
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_BLE_Key_Button3_Action();
+ break;
+
+ default:
+ break;
+
+}
+ return;
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_freertos.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_freertos.c
new file mode 100644
index 000000000..eec1ef82f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_freertos.c
@@ -0,0 +1,70 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_freertos.c
+ * Description : Code for freertos applications
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "FreeRTOS.h"
+#include "task.h"
+#include "main.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Variables */
+
+/* USER CODE END Variables */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN FunctionPrototypes */
+
+/* USER CODE END FunctionPrototypes */
+
+/* USER CODE BEGIN VPORT_SUPPORT_TICKS_AND_SLEEP */
+__weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+{
+ // Generated when configUSE_TICKLESS_IDLE == 2.
+ // Function called in tasks.c (in portTASK_FUNCTION).
+ // TO BE COMPLETED or TO BE REPLACED by a user one, overriding that weak one.
+}
+/* USER CODE END VPORT_SUPPORT_TICKS_AND_SLEEP */
+
+/* Private application code --------------------------------------------------*/
+/* USER CODE BEGIN Application */
+
+/* USER CODE END Application */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/freertos_port.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/freertos_port.c
new file mode 100644
index 000000000..fec7382b3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/freertos_port.c
@@ -0,0 +1,339 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : freertos_port.c
+ * Description : Custom porting of FreeRTOS functionalities
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "stm32_lpm.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ uint32_t LpTimeLeftOnEntry;
+ uint8_t LpTimerFreeRTOS_Id;
+} LpTimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#ifndef configSYSTICK_CLOCK_HZ
+#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
+/* Ensure the SysTick is clocked at the same frequency as the core. */
+#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
+#else
+/* The way the SysTick is clocked is not modified in case it is not the same
+ as the core. */
+#define portNVIC_SYSTICK_CLK_BIT ( 0 )
+#endif
+
+#define CPU_CLOCK_KHZ ( configCPU_CLOCK_HZ / 1000 )
+
+/* Constants required to manipulate the core. Registers first... */
+#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) )
+#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) )
+#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) )
+#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL )
+#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL )
+#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL )
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/*
+ * The number of SysTick increments that make up one tick period.
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+static uint32_t ulTimerCountsForOneTick;
+static LpTimerContext_t LpTimerContext;
+#endif
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+#if ( CFG_LPM_SUPPORTED != 0)
+static void LpTimerCb( void );
+static void LpTimerInit( void );
+static void LpTimerStart( uint32_t time_to_sleep );
+static void LpEnter( void );
+static uint32_t LpGetElapsedTime( void );
+void vPortSetupTimerInterrupt( void );
+#endif
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Implement the tickless feature
+ *
+ *
+ * @param: xExpectedIdleTime is given in number of FreeRTOS Ticks
+ * @retval: None
+ */
+void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
+{
+ /* If low power is not used, do not stop the SysTick and continue execution */
+#if ( CFG_LPM_SUPPORTED != 0)
+ /**
+ * Although this is not documented as such, when xExpectedIdleTime = 0xFFFFFFFF = (~0),
+ * it likely means the system may enter low power for ever ( from a FreeRTOS point of view ).
+ * Otherwise, for a FreeRTOS tick set to 1ms, that would mean it is requested to wakeup in 8 years from now.
+ * When the system may enter low power mode for ever, FreeRTOS is not really interested to maintain a
+ * systick count and when the system exits from low power mode, there is no need to update the count with
+ * the time spent in low power mode
+ */
+ uint32_t ulCompleteTickPeriods;
+
+ /* Stop the SysTick to avoid the interrupt to occur while in the critical section.
+ * Otherwise, this will prevent the device to enter low power mode
+ * At this time, an update of the systick will not be considered
+ *
+ */
+ portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;
+
+ /* Enter a critical section but don't use the taskENTER_CRITICAL()
+ method as that will mask interrupts that should exit sleep mode. */
+ __disable_irq();
+ __DSB();
+ __ISB();
+
+ /* If a context switch is pending or a task is waiting for the scheduler
+ to be unsuspended then abandon the low power entry. */
+ if( eTaskConfirmSleepModeStatus() == eAbortSleep )
+ {
+ /* Restart SysTick. */
+ portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
+
+ /* Re-enable interrupts - see comments above __disable_interrupt()
+ call above. */
+ __enable_irq();
+ }
+ else
+ {
+ if (xExpectedIdleTime != (~0))
+ {
+ /* Remove one tick to wake up before the event occurs */
+ xExpectedIdleTime--;
+ /* Start the low power timer */
+ LpTimerStart( xExpectedIdleTime );
+ }
+
+ /* Enter low power mode */
+ LpEnter( );
+
+ if (xExpectedIdleTime != (~0))
+ {
+ /**
+ * Get the number of FreeRTOS ticks that has been suppressed
+ * In the current implementation, this shall be kept in critical section
+ * so that the timer server return the correct elapsed time
+ */
+ ulCompleteTickPeriods = LpGetElapsedTime( );
+ vTaskStepTick( ulCompleteTickPeriods );
+ }
+
+ /* Restart SysTick */
+ portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+ portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;
+ portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
+
+ /* Exit with interrUpts enabled. */
+ __enable_irq();
+ }
+#endif
+}
+
+/*
+ * Setup the systick timer to generate the tick interrupts at the required
+ * frequency and initialize a low power timer
+ * The current implementation is kept as close as possible to the default tickless
+ * mode provided.
+ * The systick is still used when there is no need to go in low power mode.
+ * When the system needs to enter low power mode, the tick is suppressed and a low power timer
+ * is used over that time
+ * Note that in sleep mode, the system clock is still running and the default tickless implementation
+ * using systick could have been kept.
+ * However, as at that time, it is not yet known whereas the low power mode that will be used is stop mode or
+ * sleep mode, it is easier and simpler to go with a low power timer as soon as the tick need to be
+ * suppressed.
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+void vPortSetupTimerInterrupt( void )
+{
+ LpTimerInit( );
+
+ /* Calculate the constants required to configure the tick interrupt. */
+ ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
+
+ /* Stop and clear the SysTick. */
+ portNVIC_SYSTICK_CTRL_REG = 0UL;
+ portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
+
+ /* Configure SysTick to interrupt at the requested rate. */
+ portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
+ portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
+}
+#endif
+
+/**
+ * @brief The current implementation uses the hw_timerserver to provide a low power timer
+ * This may be replaced by another low power timer.
+ *
+ * @param None
+ * @retval None
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+static void LpTimerInit( void )
+{
+ ( void ) HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(LpTimerContext.LpTimerFreeRTOS_Id), hw_ts_SingleShot, LpTimerCb);
+
+ return;
+}
+#endif
+
+/**
+ * @brief Low power timer callback
+ *
+ * @param None
+ * @retval None
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+static void LpTimerCb( void )
+{
+ /**
+ * Nothing to be done
+ */
+
+ return;
+}
+#endif
+/**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : Number of FreeRTOS ticks
+ * @retval None
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+static void LpTimerStart( uint32_t time_to_sleep )
+{
+ /* Converts the number of FreeRTOS ticks into hw timer tick */
+ if(time_to_sleep <= 0x10C6)
+ {
+ /**
+ * ( time_to_sleep * 1000 * 1000 ) fit a 32bits word
+ */
+ time_to_sleep = (time_to_sleep * 1000 * 1000 );
+ time_to_sleep = time_to_sleep / ( CFG_TS_TICK_VAL * configTICK_RATE_HZ );
+ }
+ else if(time_to_sleep <= 0x418937)
+ {
+ /**
+ * ( time_to_sleep * 1000 ) fit a 32bits word
+ */
+ time_to_sleep = (time_to_sleep * 1000);
+ time_to_sleep = time_to_sleep / ( CFG_TS_TICK_VAL * configTICK_RATE_HZ );
+ if(time_to_sleep <= 0x418937)
+ {
+ /**
+ * ( time_to_sleep * 1000 ) fit a 32bits word
+ */
+ time_to_sleep = (time_to_sleep * 1000);
+ }
+ else
+ {
+ time_to_sleep = (~0); /* Max value */
+ }
+ }
+ else
+ {
+ time_to_sleep = time_to_sleep / ( CFG_TS_TICK_VAL * configTICK_RATE_HZ );
+ if(time_to_sleep <= 0x10C6)
+ {
+ /**
+ * ( time_to_sleep * 1000 * 1000 ) fit a 32bits word
+ */
+ time_to_sleep = (time_to_sleep * 1000 * 1000 );
+ }
+ else
+ {
+ time_to_sleep = (~0); /* Max value */
+ }
+ }
+
+ HW_TS_Start(LpTimerContext.LpTimerFreeRTOS_Id, time_to_sleep);
+
+ /**
+ * There might be other timers already running in the timer server that may elapse
+ * before this one.
+ * Store how long before the next event so that on wakeup, it will be possible to calculate
+ * how long the tick has been suppressed
+ */
+ LpTimerContext.LpTimeLeftOnEntry = HW_TS_RTC_ReadLeftTicksToCount( );
+
+ return;
+}
+#endif
+
+/**
+ * @brief Enter low power mode
+ *
+ * @param None
+ * @retval None
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+static void LpEnter( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower();
+#endif
+ return;
+}
+#endif
+
+/**
+ * @brief Read how long the tick has been suppressed
+ *
+ * @param None
+ * @retval The number of tick rate (FreeRTOS tick)
+ */
+#if ( CFG_LPM_SUPPORTED != 0)
+static uint32_t LpGetElapsedTime( void )
+{
+ uint64_t val_ticks, time_us;
+
+ time_us = (CFG_TS_TICK_VAL) * (uint64_t)(LpTimerContext.LpTimeLeftOnEntry - HW_TS_RTC_ReadLeftTicksToCount( ));
+
+ val_ticks = time_us * configTICK_RATE_HZ;
+ val_ticks = val_ticks / (1000 * 1000);
+
+ /* add a tick if the time elapsed is above 50 % of a tick */
+ if( (time_us % (portTICK_PERIOD_MS * 1000) > (portTICK_PERIOD_MS * 1000 / 2)) )
+ {
+ val_ticks++;
+ }
+
+ /**
+ * The system may have been out from another reason than the timer
+ * Stop the timer after the elapsed time is calculated other wise, HW_TS_RTC_ReadLeftTicksToCount()
+ * may return 0xFFFF ( TIMER LIST EMPTY )
+ * It does not hurt stopping a timer that exists but is not running.
+ */
+ HW_TS_Stop(LpTimerContext.LpTimerFreeRTOS_Id);
+
+ return (uint32_t)val_ticks;
+}
+#endif
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..e0e4fcb5d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_uart.c
new file mode 100644
index 000000000..ce910235c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c
new file mode 100644
index 000000000..1c06069e0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c
@@ -0,0 +1,713 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief BLE application with BLE core
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Stack_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "cmsis_os.h"
+#include "app_entry.h"
+#include "app_common.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+
+RTC_HandleTypeDef hrtc;
+
+/* Definitions for defaultTask */
+osThreadId_t defaultTaskHandle;
+const osThreadAttr_t defaultTask_attributes = {
+ .name = "defaultTask",
+ .priority = (osPriority_t) osPriorityNormal,
+ .stack_size = 256 * sizeof(StackType_t)
+};
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+void StartDefaultTask(void *argument);
+
+/* USER CODE BEGIN PFP */
+void PeriphClock_Config(void);
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Reset_BackupDomain( void );
+static void Init_Exti( void );
+static void Config_HSE(void);
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+ Reset_Device();
+ Config_HSE();
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Init scheduler */
+ osKernelInitialize();
+
+ /* USER CODE BEGIN RTOS_MUTEX */
+ /* add mutexes, ... */
+ /* USER CODE END RTOS_MUTEX */
+
+ /* USER CODE BEGIN RTOS_SEMAPHORES */
+ /* add semaphores, ... */
+ /* USER CODE END RTOS_SEMAPHORES */
+
+ /* USER CODE BEGIN RTOS_TIMERS */
+ /* start timers, add new ones, ... */
+ /* USER CODE END RTOS_TIMERS */
+
+ /* USER CODE BEGIN RTOS_QUEUES */
+ /* add queues, ... */
+ /* USER CODE END RTOS_QUEUES */
+
+ /* Create the thread(s) */
+ /* creation of defaultTask */
+ defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
+
+ /* USER CODE BEGIN RTOS_THREADS */
+ /* add threads, ... */
+ /* USER CODE END RTOS_THREADS */
+
+ /* Init code for STM32_WPAN */
+ APPE_Init();
+ /* Start scheduler */
+ osKernelStart();
+
+ /* We should never get here as control is now taken by the scheduler */
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ HAL_PWR_EnableBkUpAccess();
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+#if (CFG_USE_SMPS != 0)
+ /**
+ * Configure and enable SMPS
+ *
+ * The SMPS configuration is not yet supported by CubeMx
+ */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#endif
+
+ /* USER CODE END Smps */
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN LPUART1_Init 0 */
+
+ /* USER CODE END LPUART1_Init 0 */
+
+ /* USER CODE BEGIN LPUART1_Init 1 */
+
+ /* USER CODE END LPUART1_Init 1 */
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN LPUART1_Init 2 */
+
+ /* USER CODE END LPUART1_Init 2 */
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART1_Init 0 */
+
+ /* USER CODE END USART1_Init 0 */
+
+ /* USER CODE BEGIN USART1_Init 1 */
+
+ /* USER CODE END USART1_Init 1 */
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART1_Init 2 */
+
+ /* USER CODE END USART1_Init 2 */
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+ /* USER CODE BEGIN RF_Init 0 */
+
+ /* USER CODE END RF_Init 0 */
+
+ /* USER CODE BEGIN RF_Init 1 */
+
+ /* USER CODE END RF_Init 1 */
+ /* USER CODE BEGIN RF_Init 2 */
+
+ /* USER CODE END RF_Init 2 */
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+ /* USER CODE BEGIN RTC_Init 0 */
+
+ /* USER CODE END RTC_Init 0 */
+
+ /* USER CODE BEGIN RTC_Init 1 */
+
+ /* USER CODE END RTC_Init 1 */
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ __HAL_RCC_DMA2_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/* USER CODE END 4 */
+
+/* USER CODE BEGIN Header_StartDefaultTask */
+/**
+ * @brief Function implementing the defaultTask thread.
+ * @param argument: Not used
+ * @retval None
+ */
+/* USER CODE END Header_StartDefaultTask */
+void StartDefaultTask(void *argument)
+{
+ /* USER CODE BEGIN 5 */
+ /* Infinite loop */
+ for(;;)
+ {
+ osThreadFlagsWait(1,osFlagsWaitAll,osWaitForever);
+ }
+ /* USER CODE END 5 */
+}
+
+ /**
+ * @brief Period elapsed callback in non blocking mode
+ * @note This function is called when TIM17 interrupt took place, inside
+ * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
+ * a global variable "uwTick" used as application time base.
+ * @param htim : TIM handle
+ * @retval None
+ */
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ /* USER CODE BEGIN Callback 0 */
+
+ /* USER CODE END Callback 0 */
+ if (htim->Instance == TIM17) {
+ HAL_IncTick();
+ }
+ /* USER CODE BEGIN Callback 1 */
+
+ /* USER CODE END Callback 1 */
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..68153652a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,278 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+ /**
+ * When tickless FreeRTOS is used, the systick is fully managed in the file freertos_port.c
+ * It shall not be either started or stop in this API
+ */
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+ /**
+ * When tickless FreeRTOS is used, the systick is fully managed in the file freertos_port.c
+ * It shall not be either started or stop in this API
+ */
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..702eb8fdd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,336 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+ /* PendSV_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ HAL_NVIC_SetPriority(IPCC_C1_RX_IRQn , 6, 0);
+ HAL_NVIC_SetPriority(IPCC_C1_TX_IRQn , 6, 0);
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ PA6 ------> LPUART1_CTS
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_DMAMUX1_CH1_EVT;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_NO_EVENT;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = DISABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_lpuart1_tx, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 5, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ PA6 ------> LPUART1_CTS
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+ HAL_RTCEx_EnableBypassShadow(hrtc);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_timebase_tim.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_timebase_tim.c
new file mode 100644
index 000000000..2db479625
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_timebase_tim.c
@@ -0,0 +1,152 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32g0xx_hal_timebase_tim.c
+ * @author MCD Application Team
+ * @brief HAL time base based on the hardware TIM.
+ *
+ * This file overrides the native HAL time base functions (defined as weak)
+ * the TIM time base:
+ * + Intializes the TIM peripheral to generate a Period elapsed Event each 1ms
+ * + HAL_IncTick is called inside HAL_TIM_PeriodElapsedCallback ie each 1ms
+ *
+ @verbatim
+ ==============================================================================
+ ##### How to use this driver #####
+ ==============================================================================
+ [..]
+ This file must be copied to the application folder and modified as follows:
+ (#) Rename it to 'stm32g0xx_hal_timebase_tim.c'
+ (#) Add this file and the TIM HAL driver files to your project and make sure
+ HAL_TIM_MODULE_ENABLED is defined in stm32l4xx_hal_conf.h
+
+ [..]
+ (@) The application needs to ensure that the time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+ *
+ * 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 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 STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_tim.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+TIM_HandleTypeDef htim17;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief This function configures the TIM17 as a time base source.
+ * The time source is configured to have 1ms time base with a dedicated
+ * Tick interrupt priority.
+ * @note This function is called automatically at the beginning of program after
+ * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
+ * @param TickPriority: Tick interrupt priority.
+ * @retval HAL status
+ */
+HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
+{
+ RCC_ClkInitTypeDef clkconfig;
+ uint32_t uwTimclock = 0;
+ uint32_t uwPrescalerValue = 0;
+ uint32_t pFLatency;
+
+ /*Configure the TIM17 IRQ priority */
+ HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM17_IRQn, TickPriority ,0);
+
+ /* Enable the TIM17 global Interrupt */
+ HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM17_IRQn);
+
+ /* Enable TIM17 clock */
+ __HAL_RCC_TIM17_CLK_ENABLE();
+
+ /* Get clock configuration */
+ HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
+
+ /* Compute TIM17 clock */
+ uwTimclock = HAL_RCC_GetPCLK2Freq();
+
+ /* Compute the prescaler value to have TIM17 counter clock equal to 1MHz */
+ uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
+
+ /* Initialize TIM17 */
+ htim17.Instance = TIM17;
+
+ /* Initialize TIMx peripheral as follow:
+ + Period = [(TIM17CLK/1000) - 1]. to have a (1/1000) s time base.
+ + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+ htim17.Init.Period = (1000000 / 1000) - 1;
+ htim17.Init.Prescaler = uwPrescalerValue;
+ htim17.Init.ClockDivision = 0;
+ htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
+ if(HAL_TIM_Base_Init(&htim17) == HAL_OK)
+ {
+ /* Start the TIM time Base generation in interrupt mode */
+ return HAL_TIM_Base_Start_IT(&htim17);
+ }
+
+ /* Return function status */
+ return HAL_ERROR;
+}
+
+/**
+ * @brief Suspend Tick increment.
+ * @note Disable the tick increment by disabling TIM17 update interrupt.
+ * @param None
+ * @retval None
+ */
+void HAL_SuspendTick(void)
+{
+ /* Disable TIM17 update Interrupt */
+ __HAL_TIM_DISABLE_IT(&htim17, TIM_IT_UPDATE);
+}
+
+/**
+ * @brief Resume Tick increment.
+ * @note Enable the tick increment by Enabling TIM17 update interrupt.
+ * @param None
+ * @retval None
+ */
+void HAL_ResumeTick(void)
+{
+ /* Enable TIM17 Update interrupt */
+ __HAL_TIM_ENABLE_IT(&htim17, TIM_IT_UPDATE);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..4351c429d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+#include "FreeRTOS.h"
+#include "task.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+extern UART_HandleTypeDef hlpuart1;
+extern UART_HandleTypeDef huart1;
+extern TIM_HandleTypeDef htim17;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles DMA1 channel4 global interrupt.
+ */
+void DMA1_Channel4_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel4_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_IRQn 1 */
+}
+
+/**
+ * @brief This function handles TIM1 trigger and commutation interrupts and TIM17 global interrupt.
+ */
+void TIM1_TRG_COM_TIM17_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 0 */
+
+ /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim17);
+ /* USER CODE BEGIN TIM1_TRG_COM_TIM17_IRQn 1 */
+
+ /* USER CODE END TIM1_TRG_COM_TIM17_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA2 channel4 global interrupt.
+ */
+void DMA2_Channel4_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 0 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewd
index e6eb48213..3dab7e933 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewd
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewd
@@ -2,7 +2,7 @@
<project>
<fileVersion>3</fileVersion>
<configuration>
- <name>Lighting_Node</name>
+ <name>BLE_HeartRateFreeRTOS_ANCS</name>
<toolchain>
<name>ARM</name>
</toolchain>
@@ -36,7 +36,7 @@
</option>
<option>
<name>MacFile</name>
- <state></state>
+ <state>$PROJ_DIR$\enableCPU2.mac</state>
</option>
<option>
<name>MemOverride</name>
@@ -44,7 +44,7 @@
</option>
<option>
<name>MemFile</name>
- <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB55_CM4.ddf</state>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
</option>
<option>
<name>RunToEnable</name>
@@ -60,7 +60,7 @@
</option>
<option>
<name>CExtraOptions</name>
- <state></state>
+ <state>--stlink_use_server</state>
</option>
<option>
<name>CFpuProcessor</name>
@@ -76,11 +76,11 @@
</option>
<option>
<name>OCDownloadVerifyAll</name>
- <state>0</state>
+ <state>1</state>
</option>
<option>
<name>OCProductVersion</name>
- <state>7.80.3.12143</state>
+ <state>7.60.2.11347</state>
</option>
<option>
<name>OCDynDriverList</name>
@@ -278,6 +278,10 @@
<wantNonLocal>1</wantNonLocal>
<debug>0</debug>
<option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
<name>OCDriverInfo</name>
<state>1</state>
</option>
@@ -396,10 +400,6 @@
<state>1</state>
</option>
<option>
- <name>CatchSFERR</name>
- <state>1</state>
- </option>
- <option>
<name>CatchHARDERR</name>
<state>1</state>
</option>
@@ -494,6 +494,10 @@
<wantNonLocal>1</wantNonLocal>
<debug>0</debug>
<option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
<name>OCDriverInfo</name>
<state>1</state>
</option>
@@ -504,7 +508,7 @@
<option>
<name>IjetResetList</name>
<version>1</version>
- <state>10</state>
+ <state>9</state>
</option>
<option>
<name>IjetHWResetDuration</name>
@@ -532,7 +536,7 @@
</option>
<option>
<name>IjetInterfaceRadio</name>
- <state>0</state>
+ <state>1</state>
</option>
<option>
<name>IjetInterfaceCmdLine</name>
@@ -645,10 +649,6 @@
<state>1</state>
</option>
<option>
- <name>CatchSFERR</name>
- <state>1</state>
- </option>
- <option>
<name>CatchHARDERR</name>
<state>1</state>
</option>
@@ -678,7 +678,7 @@
</option>
<option>
<name>IjetSelectedCPUBehaviour</name>
- <state>0</state>
+ <state></state>
</option>
<option>
<name>ICpuName</name>
@@ -700,7 +700,7 @@
<option>
<name>IjetTraceSizeList</name>
<version>0</version>
- <state>4</state>
+ <state>2</state>
</option>
<option>
<name>FlashBoardPathSlave</name>
@@ -724,6 +724,10 @@
<wantNonLocal>1</wantNonLocal>
<debug>0</debug>
<option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
<name>JLinkSpeed</name>
<state>1000</state>
</option>
@@ -862,10 +866,6 @@
<state>0</state>
</option>
<option>
- <name>CCCatchSFERR</name>
- <state>0</state>
- </option>
- <option>
<name>CCCatchHARDERR</name>
<state>0</state>
</option>
@@ -1081,7 +1081,7 @@
</option>
<option>
<name>CCSTLinkDAPNumber</name>
- <state></state>
+ <state>0</state>
</option>
<option>
<name>CCSTLinkDebugAccessPortRadio</name>
@@ -1193,6 +1193,10 @@
<wantNonLocal>1</wantNonLocal>
<debug>0</debug>
<option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
<name>OCDriverInfo</name>
<state>1</state>
</option>
@@ -1285,10 +1289,6 @@
<state>0</state>
</option>
<option>
- <name>CCXds100CatchSFERR</name>
- <state>0</state>
- </option>
- <option>
<name>CCXds100CatchHARDERR</name>
<state>0</state>
</option>
@@ -1353,11 +1353,6 @@
</option>
</data>
</settings>
- <settings>
- <name>NULINK_ID</name>
- <archiveVersion>2</archiveVersion>
- <data />
- </settings>
<debuggerPlugins>
<plugin>
<file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewp
new file mode 100644
index 000000000..6ed6d807e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/BLE_HeartRateFreeRTOS_ANCS.ewp
@@ -0,0 +1,1342 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_HeartRateFreeRTOS_ANCS</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>BLE_HeartRateFreeRTOS_ANCS\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>BLE_HeartRateFreeRTOS_ANCS\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>BLE_HeartRateFreeRTOS_ANCS\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.60.2.11347</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>CORE_CM4</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\app</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\portable\IAR\ARM_CM4F</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>BLE_HeartRateFreeRTOS_ANCS.hex</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>BLE_HeartRateFreeRTOS_ANCS.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_debug.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\freertos_port.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_timebase_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ </group>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>app</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\ancs_client_app.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\dis_app.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\hrs_app.c</name>
+ </file>
+ </group>
+ <group>
+ <name>target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_adc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_adc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_spi.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_spi_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>ble</name>
+ <group>
+ <name>blesvc</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\dis.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\hrs.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
+ </file>
+ </group>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gatt_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hal_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hci_le.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_l2cap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template\osal.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Third_Party</name>
+ <group>
+ <name>FreeRTOS</name>
+ <group>
+ <name>Source</name>
+ <group>
+ <name>CMSIS_RTOS_V2</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS_V2\cmsis_os2.c</name>
+ </file>
+ </group>
+ <group>
+ <name>portable</name>
+ <group>
+ <name>IAR</name>
+ <group>
+ <name>ARM_CM4F</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\portable\IAR\ARM_CM4F\port.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\portable\IAR\ARM_CM4F\portasm.s</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>MemMang</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c</name>
+ </file>
+ </group>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\queue.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\tasks.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\Third_Party\FreeRTOS\Source\timers.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/Project.eww
new file mode 100644
index 000000000..f3d969f7e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_HeartRateFreeRTOS_ANCS.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/startup_stm32wb55xx_cm4.s
index 1f886ff59..1f886ff59 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/startup_stm32wb55xx_cm4.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/startup_stm32wb55xx_cm4.s
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/stm32wb55xx_flash_cm4.icf
index 5f36da686..5f36da686 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/stm32wb55xx_flash_cm4.icf
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/EWARM/stm32wb55xx_flash_cm4.icf
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.c
new file mode 100644
index 000000000..926730baf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.c
@@ -0,0 +1,2275 @@
+/**
+ ******************************************************************************
+ * @file ancs_client_app.c
+ * @author MCD Application Team
+ * @brief ANCS client Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+
+#include "ble.h"
+#include "app_ble.h"
+#include "ancs_client_app.h"
+
+#include "cmsis_os.h"
+
+/* Private defines -----------------------------------------------------------*/
+
+#define GET_ACTION_ID_FROM_UART 0
+
+/* MAX Number of entry in the context lists */
+#define MAX_NMB_NOTIFY 128
+#define MAX_DISPLAY_NAME_LEN 128
+#define MAX_DATA_LIST_LEN 0xFF
+#define MAX_DATA_LEN 0x0128
+
+/**
+ * The default GAP command timeout is set to 30s
+ */
+#define GAP_DEFAULT_TIMEOUT (30000)
+
+/**
+ * The default GATT command timeout is set to 30s
+ */
+#define GATT_DEFAULT_TIMEOUT (30000)
+
+
+/* Invalid Notify Entry */
+#define INVALID_NOTIFY_ENTRY 0xFFFF
+
+#define UNPACK_2_BYTE_PARAMETER(ptr) \
+ (uint16_t)((uint16_t)(*((uint8_t *)ptr))) | \
+ (uint16_t)((((uint16_t)(*((uint8_t *)ptr + 1))) << 8))
+
+/* copy UUID to tab */
+#define COPY_UUID_128(uuid_struct, uuid_15, uuid_14, uuid_13, uuid_12, uuid_11, uuid_10, uuid_9, uuid_8, uuid_7, uuid_6, uuid_5, uuid_4, uuid_3, uuid_2, uuid_1, uuid_0) \
+do {\
+ uuid_struct[0] = uuid_0; uuid_struct[1] = uuid_1; uuid_struct[2] = uuid_2; uuid_struct[3] = uuid_3; \
+ uuid_struct[4] = uuid_4; uuid_struct[5] = uuid_5; uuid_struct[6] = uuid_6; uuid_struct[7] = uuid_7; \
+ uuid_struct[8] = uuid_8; uuid_struct[9] = uuid_9; uuid_struct[10] = uuid_10; uuid_struct[11] = uuid_11; \
+ uuid_struct[12] = uuid_12; uuid_struct[13] = uuid_13; uuid_struct[14] = uuid_14; uuid_struct[15] = uuid_15; \
+}while(0)
+
+/* UUIDs list for ANCS service and characteristics*/
+#define COPY_ANCS_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x79, 0x05, 0xF4, 0x31, 0xB5, 0xCE, 0x4E, 0x99, 0xA4, 0x0F, 0x4B, 0x1E, 0x12, 0x2D, 0x00, 0xD0)
+#define COPY_ANCS_NOTIFICATION_SOURCE_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x9F, 0xBF, 0x12, 0x0D, 0x63, 0x01, 0x42, 0xD9, 0x8C, 0x58, 0x25, 0xE6, 0x99, 0xA2, 0x1D, 0xBD)
+#define COPY_ANCS_DATA_SOURCE_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x22, 0xEA, 0xC6, 0xE9, 0x24, 0xD6, 0x4B, 0xB5, 0xBE, 0x44, 0xB3, 0x6A, 0xCE, 0x7C, 0x7B, 0xFB)
+#define COPY_ANCS_CONTROL_POINT_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x69, 0xD1, 0xD8, 0xF3, 0x45, 0xE1, 0x49, 0xA8, 0x98, 0x21, 0x9B, 0xBD, 0xFD, 0xAA, 0xD9, 0xD9)
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ GAP_PROC_TERMINATE_CONNECTION,
+ GAP_PROC_SLAVE_SECURITY_REQ,
+ GAP_PROC_PASS_KEY_RESPONSE,
+ GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM,
+ GAP_PROC_ALLOW_REBOND,
+} GapProcId_t;
+
+typedef enum
+{
+ GATT_PROC_MTU_UPDATE,
+ GATT_PROC_DISC_ANCS_SERVICE,
+ GATT_PROC_DISC_ALL_PRIMARY_SERVICES,
+ GATT_PROC_DISC_ALL_CHARS,
+ GATT_PROC_DISC_ALL_DESCS,
+ GATT_PROC_ENABLE_ALL_NOTIFICATIONS,
+} GattProcId_t;
+
+typedef enum
+{
+ ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE,
+ ANCS_PROC_GET_APP_ATTRIBUTE,
+ ANCS_PROC_PERFORM_NOTIFICATION_ACTION,
+} AncsProcId_t;
+
+/**
+ * structure of fields for GATT notication source characteristic
+ */
+typedef struct notifyListS {
+ uint8_t used; /*flag to indicate notification processed or not*/
+ EventID evID;
+ EventFlags evFlag;
+ CategoryID catID;
+ uint8_t catCount;
+ uint32_t notifUID;
+} notifyList_type;
+
+/**
+ * structure of ANCS context (containing all needed settings: events state, handlers, inputs...)
+ */
+typedef struct ancs_contextS {
+
+ ANCS_ProfileState state;
+ uint16_t connection_handle;
+
+ uint8_t Peer_Bonded;
+ uint8_t Security_Mode;
+ uint8_t Security_Level;
+ uint8_t Peer_Address_Type;
+ uint8_t Peer_Address[6];
+
+ uint8_t appDisplayName_len;
+ uint8_t appDisplayName[MAX_DISPLAY_NAME_LEN];
+ uint8_t AppIdentifierLength;
+ uint8_t AppIdentifier[MAX_DISPLAY_NAME_LEN];
+ uint8_t list[MAX_DATA_LIST_LEN];
+
+ notifyList_type notifyList[MAX_NMB_NOTIFY];
+
+ uint16_t notifyEntry; /* index of input notification */
+ uint8_t notifyShowed; /* flag to indicate notification has already been displayed */
+ uint32_t startTime;
+ uint8_t genericFlag; /* action done after notification */
+
+ uint16_t ALLServiceStartHandle;
+ uint16_t ALLServiceEndHandle;
+
+ uint16_t GAPServiceStartHandle;
+ uint16_t GAPServiceEndHandle;
+
+ uint16_t GAPCentralAddressResolutionCharStartHdle;
+ uint16_t GAPCentralAddressResolutionCharValueHdle;
+ uint16_t GAPCentralAddressResolutionCharDescHdle;
+ uint16_t GAPCentralAddressResolutionCharEndHdle;
+
+ uint16_t GATTServiceStartHandle;
+ uint16_t GATTServiceEndHandle;
+
+ uint16_t ServiceChangedCharStartHdle;
+ uint16_t ServiceChangedCharValueHdle;
+ uint16_t ServiceChangedCharDescHdle;
+ uint16_t ServiceChangedCharEndHdle;
+
+ uint16_t ANCSServiceStartHandle;
+ uint16_t ANCSServiceEndHandle;
+
+ uint16_t ANCSNotificationSourceCharStartHdle;
+ uint16_t ANCSControlPointCharStartHdle;
+ uint16_t ANCSDataSourceCharStartHdle;
+
+ uint16_t ANCSNotificationSourceCharValueHdle;
+ uint16_t ANCSControlPointCharValueHdle;
+ uint16_t ANCSDataSourceCharValueHdle;
+
+ uint16_t ANCSNotificationSourceCharDescHdle;
+ uint16_t ANCSControlPointCharDescHdle;
+ uint16_t ANCSDataSourceCharDescHdle;
+
+} ancs_context_type;
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static ancs_context_type ancs_context;
+
+/* Global variables ----------------------------------------------------------*/
+uint16_t gCharUUID=0,gCharStartHandle=0,gCharValueHandle=0,gCharDescriptorHandle=0;
+
+#if (GET_ACTION_ID_FROM_UART == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+/* Private function prototypes -----------------------------------------------*/
+static void gap_cmd_resp_wait(uint32_t timeout);
+static void gap_cmd_resp_release(uint32_t flag);
+static void GapProcReq(GapProcId_t GapProcId);
+static void gatt_cmd_resp_wait(uint32_t timeout);
+static void gatt_cmd_resp_release(uint32_t flag);
+static void GattProcReq(GattProcId_t GattProcId);
+static void GattParseServicesByUUID(aci_att_find_by_type_value_resp_event_rp0 *pr);
+static void GattParseServices(aci_att_read_by_group_type_resp_event_rp0 *pr);
+static void GattParseChars(aci_att_read_by_type_resp_event_rp0 *pr);
+static void GattParseDescs(aci_att_find_info_resp_event_rp0 *pr);
+static void GattParseNotification(aci_gatt_notification_event_rp0 *pr);
+
+#if (GET_ACTION_ID_FROM_UART == 1)
+static uint8_t ANCS_App_Get_Char(void);
+static ActionID ANCS_App_Get_ActionID(void)
+#endif
+static void ANCS_App_Update_Service( void );
+static SVCCTL_EvtAckStatus_t ANCS_Client_Event_Handler( void *Event );
+
+void ANCS_Notification_Check(EventFlags EventFlagMask);
+void ANCS_Client_Reset( void );
+static void AncsProcReq(AncsProcId_t AncsProcId);
+
+
+/* Functions Definition ------------------------------------------------------*/
+/* Private functions ----------------------------------------------------------*/
+/**
+ * Display Event ID notified in ANCS notification source characteristic
+ */
+static void ANCS_Show_EventID(EventID evID)
+{
+ switch(evID) {
+ case EventIDNotificationAdded:
+ printf("** EventID: Added\r\n");
+ break;
+ case EventIDNotificationModified:
+ printf("** EventID: Modified\r\n");
+ break;
+ case EventIDNotificationRemoved:
+ printf("** EventID: Removed\r\n");
+ break;
+ }
+}
+
+/**
+ * Display Event Flag notified in ANCS notification source characteristic
+ */
+static void ANCS_Show_EventFlag(EventFlags evFlag)
+{
+ switch (evFlag) {
+ case EventFlagSilent:
+ printf("** EventFlag: Silent\r\n");
+ break;
+ case EventFlagImportant:
+ printf("** EventFlag: Important\r\n");
+ break;
+ case EventFlagPreExisting:
+ printf("** EventFlag: Pre Existing\r\n");
+ break;
+ case EventFlagPositiveAction:
+ printf("** EventFlag: Positive Action\r\n");
+ break;
+ case EventFlagNegativeAction:
+ printf("** EventFlag: Negative Action\r\n");
+ break;
+ }
+
+ printf("** EventFlags:");
+ if ((evFlag & EventFlagSilent) == EventFlagSilent) printf(" Silent");
+ if ((evFlag & EventFlagImportant) == EventFlagImportant) printf(" Important");
+ if ((evFlag & EventFlagPreExisting) == EventFlagPreExisting) printf(" PreExisting");
+ if ((evFlag & EventFlagPositiveAction) == EventFlagPositiveAction) printf(" PositiveAction");
+ if ((evFlag & EventFlagNegativeAction) == EventFlagNegativeAction) printf(" NegativeAction");
+ printf("\n\r");
+
+}
+
+/**
+ * Display CategoryID notified in ANCS notification source characteristic
+ */
+static void ANCS_Show_CategoryID(CategoryID catID)
+{
+ switch (catID) {
+ case CategoryIDOther:
+ printf("** CategoryID: Other\r\n");
+ break;
+ case CategoryIDIncomingCall:
+ printf("** CategoryID: Incoming Call\r\n");
+ break;
+ case CategoryIDMissedCall:
+ printf("** CategoryID: Missed Call\r\n");
+ break;
+ case CategoryIDVoicemail:
+ printf("** CategoryID: Voice Mail\r\n");
+ break;
+ case CategoryIDSocial:
+ printf("** CategoryID: Social\r\n");
+ break;
+ case CategoryIDSchedule:
+ printf("** CategoryID: Schedule\r\n");
+ break;
+ case CategoryIDEmail:
+ printf("** CategoryID: Email\r\n");
+ break;
+ case CategoryIDNews:
+ printf("** CategoryID: News\r\n");
+ break;
+ case CategoryIDHealthAndFitness:
+ printf("** CategoryID: Healt and Fitness\r\n");
+ break;
+ case CategoryIDBusinessAndFinance:
+ printf("** CategoryID: Business and Finance\r\n");
+ break;
+ case CategoryIDLocation:
+ printf("** CategoryID: Location\r\n");
+ break;
+ case CategoryIDEntertainment:
+ printf("** CategoryID: Entertainment\r\n");
+ break;
+ }
+}
+
+/**
+ * Display Notification AttributeID for Get Notification Attributes command from NC
+ */
+static void ANCS_Show_Attr(NotificationAttributeID attrID)
+{
+ switch (attrID) {
+ case NotificationAttributeIDAppIdentifier:
+ printf("** AppIdentifier: ");
+ break;
+ case NotificationAttributeIDTitle:
+ printf("** Title: ");
+ break;
+ case NotificationAttributeIDSubtitle:
+ printf("** SubTitle: ");
+ break;
+ case NotificationAttributeIDMessage:
+ printf("** Message: ");
+ break;
+ case NotificationAttributeIDMessageSize:
+ printf("** MessageSize: ");
+ break;
+ case NotificationAttributeIDDate:
+ printf("** Date: ");
+ break;
+ case NotificationAttributeIDPositiveActionLabel:
+ printf("** PositiveActionLabel: ");
+ break;
+ case NotificationAttributeIDNegativeActionLabel:
+ printf("** NegativeActionLabel: ");
+ break;
+ }
+}
+
+/**
+ * Display App AttributeID used in Get App Attributes command from NC
+ */
+static void ANCS_Show_AppAttr(AppAttributeID appAttrID)
+{
+ printf("\r\n*************** App Attribute Infomation Received **********************\r\n");
+ switch (appAttrID) {
+ case AppAttributeIDDisplayName:
+ printf("** DisplayName: ");
+ break;
+ }
+}
+
+/**
+ * Display different fields for GATT notication source characteristic received
+ */
+static void ANCS_Show_Notification(uint16_t index)
+{
+ printf("\r\n*************** Data Source Detail Infomation Received **********************\r\n");
+ ANCS_Show_EventID((EventID)ancs_context.notifyList[index].evID);
+ ANCS_Show_EventFlag((EventFlags)ancs_context.notifyList[index].evFlag);
+ ANCS_Show_CategoryID((CategoryID)ancs_context.notifyList[index].catID);
+ printf("** CategoryCount: %d\r\n", ancs_context.notifyList[index].catCount);
+ printf("** NotificationUID: 0x%08x\r\n", (int)ancs_context.notifyList[index].notifUID);
+}
+
+/**
+ * create Get Notification Attributes command to NP from UID notification and action flags inputs
+ */
+static void ANCS_Cmd_GetNotificationAttr(notificationAttr_type attr)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+ uint8_t CmdSize = 0;
+ uint8_t CmdGetNotificationAtt[19]={CommandIDGetNotificationAttributes,
+ 0x00,0x00,0x00,0x00,
+ NotificationAttributeIDAppIdentifier,
+ NotificationAttributeIDTitle,0xFF,0xFF,
+ NotificationAttributeIDSubtitle,0xFF,0xFF,
+ NotificationAttributeIDMessage,0xFF,0xFF,
+ NotificationAttributeIDMessageSize,
+ NotificationAttributeIDDate,
+ NotificationAttributeIDPositiveActionLabel,
+ NotificationAttributeIDNegativeActionLabel};
+
+ CmdGetNotificationAtt[CmdSize++] = CommandIDGetNotificationAttributes;
+
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 8) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 16) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 24) & 0xFF);
+
+ if (attr.appID_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDAppIdentifier;
+ }
+
+ if ( (attr.title_flag == TRUE) && (attr.title_max_size != 0x00) )
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDTitle;
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.title_max_size >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.title_max_size >> 8) & 0xFF);
+ }
+
+ if ( (attr.subtitle_flag == TRUE) && (attr.subtitle_max_size!= 0x00) )
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDSubtitle;
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.subtitle_max_size >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.subtitle_max_size >> 8) & 0xFF);
+ }
+
+ if ( (attr.message_flag == TRUE) && (attr.message_max_size != 0x00) )
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDMessage;
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.message_max_size >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.message_max_size >> 8) & 0xFF);
+ }
+
+ if (attr.messageSize_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDMessageSize;
+ }
+
+ if (attr.date_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDDate;
+ }
+
+ if (attr.positiveAction_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDPositiveActionLabel;
+ }
+
+ if (attr.negativeAction_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDNegativeActionLabel;
+ }
+
+ result = aci_gatt_write_char_value( ancs_context.connection_handle,
+ ancs_context.ANCSControlPointCharValueHdle,
+ CmdSize,
+ (uint8_t *)CmdGetNotificationAtt);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" aci_gatt_write_char_value cmd NOK status =0x%02X \n",result);
+ }
+
+}
+
+
+/**
+ * create Perform Notification Action command from UID notification received and desired action ID
+ */
+static void ANCS_Cmd_PerformNotificationAction(uint32_t notificationUID, ActionID actID)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+ uint8_t CmdSize = 0;
+ uint8_t CmdPerformNotificationAction[6]={CommandIDPerformNotificationAction,
+ 0x00,0x00,0x00,0x00,
+ ActionIDPositive };
+
+ CmdPerformNotificationAction[CmdSize++] = CommandIDPerformNotificationAction;
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 0) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 8) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 16) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 24) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = actID;
+
+ result = aci_gatt_write_char_value(ancs_context.connection_handle,
+ ancs_context.ANCSControlPointCharValueHdle,
+ CmdSize,
+ (uint8_t *)CmdPerformNotificationAction);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" aci_gatt_write_char_value cmd NOK status =0x%02X \n",result);
+ }
+}
+
+/**
+ * create Get App Attributes command to NP for number of wanted AppIdentifiers input
+ */
+static void ANCS_Cmd_GetAppAttr(uint8_t AppIdentifierLength, char *AppIdentifier/* NULL Terminated*/)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+ uint8_t CmdSize = 0;
+ uint8_t CmdGetAppAtt[128]={0};
+
+ CmdGetAppAtt[CmdSize++] = CommandIDGetAppAttributes;
+
+ /*Number of wanted App Identifiers*/
+ for (int idx=0;idx<AppIdentifierLength;idx++)
+ CmdGetAppAtt[CmdSize++] = AppIdentifier[idx];
+
+ CmdGetAppAtt[CmdSize++] = AppAttributeIDDisplayName;
+
+ result = aci_gatt_write_char_value( ancs_context.connection_handle,
+ ancs_context.ANCSControlPointCharValueHdle,
+ CmdSize,
+ (uint8_t *)CmdGetAppAtt);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" aci_gatt_write_char_value cmd NOK status =0x%02X \n",result);
+ }
+}
+
+/**
+* Parser of response for Get Notification Attributes command
+* number of received attributes and attributes list input
+*/
+static void ANCS_Parse_GetNotificationAttr_Resp(uint8_t commandID, uint16_t attrLen, uint8_t *attrList)
+{
+ uint8_t appId,PositiveActionLabel,NegativeActionLabel;
+ uint16_t len, index;
+
+ appId = FALSE;
+ PositiveActionLabel = FALSE;
+ NegativeActionLabel = FALSE;
+ index = 0;
+
+ if(commandID == CommandIDGetNotificationAttributes)
+ {
+ /* loop on number of attribute IDs */
+ while (index < attrLen)
+ {
+ /* attrList[index+0] corresponding to AttributeID x*/
+ Osal_MemCpy(&len, &attrList[index+1], 2); /* AttributeID x Value Length */
+ if (len == 0) /* Empty */
+ {
+ index += 3;
+ }
+ else
+ {
+ /* AttributeID x */
+ if (!ancs_context.notifyShowed) {
+ ANCS_Show_Notification(ancs_context.notifyEntry);
+ ancs_context.notifyShowed = TRUE;
+ }
+ ANCS_Show_Attr((NotificationAttributeID)attrList[index]); /* Notification AttributeID x*/
+
+ /* AttributeID for Application identifier */
+ if (attrList[index] == NotificationAttributeIDAppIdentifier)
+ {
+ appId = TRUE;
+ }
+ else if (attrList[index] == NotificationAttributeIDPositiveActionLabel)
+ {
+ PositiveActionLabel = TRUE;
+ }
+ else if (attrList[index] == NotificationAttributeIDNegativeActionLabel)
+ {
+ NegativeActionLabel = TRUE;
+ }
+
+ /* AttributeID x Value */
+ index++;
+ if (len <= sizeof(ancs_context.list))
+ {
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], len);
+ ancs_context.list[len] = '\0';
+ }
+ else
+ {
+ APP_DBG_MSG("cut the AttributeID x Value len=%d <= sizeof(ancs_context.list)=%d \n\r",len,sizeof(ancs_context.list));
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], sizeof(ancs_context.list)-1);
+ ancs_context.list[sizeof(ancs_context.list)-1] = '\0';
+ }
+
+ index += 2 + len; /* 2 Bytes Length of AttributeID x Value + Value Length*/
+ if (appId)
+ {
+ if ((len+1) <= MAX_DISPLAY_NAME_LEN)
+ {
+ Osal_MemCpy(ancs_context.AppIdentifier, ancs_context.list, len+1);
+ ancs_context.AppIdentifierLength = len + 1;
+ } else {
+ Osal_MemCpy(ancs_context.AppIdentifier, ancs_context.list, MAX_DISPLAY_NAME_LEN);
+ ancs_context.AppIdentifierLength = MAX_DISPLAY_NAME_LEN;
+ }
+
+ ancs_context.state = ANCS_GET_APP_ATTRIBUTE; /* 3.2 Get APP Attributes (Detail Infomation about the App, Now only support to Get Name of App) */
+ appId = FALSE;
+ }
+
+ if (len > 0)
+ printf(" %s\r\n", ancs_context.list);
+ }
+ }// while
+
+ if(ancs_context.state == ANCS_GET_APP_ATTRIBUTE)
+ {
+ APP_DBG_MSG(" 3.2 Get APP Attributes (Detail Infomation about the App, Now only support to Get Name of App) => ANCS_GET_APP_ATTRIBUTE \n\r");
+ }
+ else
+ {
+ /* Note, there is no AppIdentifier, so we only perform active action, but you also can perform negtive action */
+ if( (PositiveActionLabel == TRUE) || (NegativeActionLabel == TRUE) )
+ {
+ ancs_context.state = ANCS_PERFORM_NOTIFICATION_ACTION; /* 3.2 Perform Notification Action */
+ APP_DBG_MSG(" 3.2 Perform Notification Action => ANCS_PERFORM_NOTIFICATION_ACTION \n\r");
+ }
+ else
+ {
+ ancs_context.state = ANCS_IDLE; /* 3.2 Perform Notification Action */
+ APP_DBG_MSG(" No AppIdentifier & PositiveActionLabel & NegativeActionLabel ==> ANCS_IDLE \n\r");
+ }
+ }
+ }// commandID
+}
+
+/**
+* Parser of response for Get App Attributes command
+* number of received attributes and attributes list input
+*/
+static void ANCS_Parse_GetAppAttr_Resp(uint8_t commandID, uint16_t attrLen, uint8_t *attrList)
+{
+ uint8_t appId;
+ uint16_t len, index;
+
+ index = 0;
+ if(commandID == CommandIDGetAppAttributes)
+ {
+ /* loop on number of attribute IDs */
+ while (index < attrLen)
+ {
+ /* attrList[index+0] corresponding to AttributeID x*/
+ Osal_MemCpy(&len, &attrList[index+1], 2); /* AttributeID x Value Length */
+ if (len == 0) /* Empty */
+ {
+ index += 3;
+ }
+ else
+ {
+ /* AttributeID x */
+ ANCS_Show_AppAttr((AppAttributeID)attrList[index]); /* App AttributeID x */
+
+ /* AttributeID for Application identifier */
+ if (attrList[index] == AppAttributeIDDisplayName)
+ {
+ appId = TRUE;
+ } else {
+ appId = FALSE;
+ }
+
+ /* AttributeID x Value */
+ index++;
+ if (len <= sizeof(ancs_context.list))
+ {
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], len);
+ ancs_context.list[len] = '\0';
+ }
+ else
+ {
+ APP_DBG_MSG("cut the AttributeID x Value len=%d <= sizeof(ancs_context.list)=%d \n\r",len,sizeof(ancs_context.list));
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], sizeof(ancs_context.list)-1);
+ ancs_context.list[sizeof(ancs_context.list)-1] = '\0';
+ }
+
+ index += 2 + len; /* 2 Bytes Length of AttributeID x Value + Value Length*/
+ if (appId)
+ {
+ if ((len+1) <= MAX_DISPLAY_NAME_LEN)
+ {
+ Osal_MemCpy(ancs_context.appDisplayName, ancs_context.list, len+1);
+ ancs_context.appDisplayName_len = len + 1;
+ } else {
+ Osal_MemCpy(ancs_context.appDisplayName, ancs_context.list, MAX_DISPLAY_NAME_LEN);
+ ancs_context.appDisplayName_len = MAX_DISPLAY_NAME_LEN;
+ }
+ } // appId
+
+ if (len > 0)
+ printf(" %s\r\n", ancs_context.list);
+ }
+ }// while
+
+ if( (ancs_context.notifyList[ancs_context.notifyEntry].catID == CategoryIDIncomingCall) ||
+ (ancs_context.notifyList[ancs_context.notifyEntry].catID == CategoryIDSchedule) ) /* depends on different Category */
+ /* if( ((ancs_context.notifyList[ancs_context.notifyEntry].evFlag & EventFlagPositiveAction) == EventFlagPositiveAction) ||
+ ((ancs_context.notifyList[ancs_context.notifyEntry].evFlag & EventFlagNegativeAction) == EventFlagNegativeAction) )*//* depends on action type */
+ {
+ ancs_context.genericFlag = TRUE;
+ ancs_context.state = ANCS_PERFORM_NOTIFICATION_ACTION; /* 3.4 Perform Notification Action */
+ APP_DBG_MSG(" 3.4 Perform Notification Action => ANCS_PERFORM_NOTIFICATION_ACTION \n\r");
+ } else {
+ APP_DBG_MSG("CommandIDGetAppAttributes notifyEntry=%d Removed\n\r", ancs_context.notifyEntry);
+ ancs_context.notifyList[ancs_context.notifyEntry].used = FALSE;
+ ancs_context.state = ANCS_CHECK_NOTIFICATION;
+ }
+ }// commandID
+}
+/**
+* Parser of ANCS Notification Source characteristic received
+* to fill ancs_context.notifyList elements
+*/
+static void ANCS_Notification_Source_Received_event(
+ EventID evID,
+ EventFlags evFlag,
+ CategoryID catID,
+ uint8_t catCount,
+ uint32_t notifUID)
+{
+ uint16_t i;
+
+ printf("*************** Notification Source Basic Infomation Received **********************\r\n");
+ ANCS_Show_EventID(evID);
+ ANCS_Show_EventFlag(evFlag);
+ ANCS_Show_CategoryID(catID);
+ printf("** CategoryCount: %d \r\n", catCount);
+ printf("** NotificationUID: 0x%08x \r\n", notifUID);
+
+ //ancs_context.notifyEntry = INVALID_NOTIFY_ENTRY;
+
+ if (evID == EventIDNotificationRemoved)
+ {
+ for (i=0; i < MAX_NMB_NOTIFY; i++)
+ {
+ if (ancs_context.notifyList[i].notifUID == notifUID)
+ {
+ ancs_context.notifyList[i].used = FALSE;
+ printf("** notifyEntry: %d Removed\r\n", i);
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (i=0; i < MAX_NMB_NOTIFY; i++)
+ {
+ if (!ancs_context.notifyList[i].used)
+ {
+ ancs_context.notifyList[i].used = TRUE;
+ ancs_context.notifyList[i].evID = evID;
+ ancs_context.notifyList[i].evFlag = evFlag;
+ ancs_context.notifyList[i].catID = catID;
+ ancs_context.notifyList[i].catCount = catCount;
+ ancs_context.notifyList[i].notifUID = notifUID;
+ printf("** notifyEntry: %d Added\r\n", i);
+ break;
+ }
+ }
+ }
+}
+
+/**
+* check event flag from ANCS Notification Source characteristic received
+* to fill ancs_context and filter silent event flags
+*/
+void ANCS_Notification_Check(EventFlags EventFlagMask)
+{
+ ancs_context.notifyEntry = INVALID_NOTIFY_ENTRY;
+ for (uint8_t idx=0; idx<MAX_NMB_NOTIFY; idx++)
+ {
+ if (ancs_context.notifyList[idx].used)
+ {
+
+ if((ancs_context.notifyList[idx].evFlag & EventFlagMask) == EventFlagMask)
+ {
+ ancs_context.notifyEntry = idx;
+ ancs_context.notifyShowed = FALSE;
+ ancs_context.state = ANCS_GET_NOTIFICATION_ATTRIBUTE;
+ APP_DBG_MSG("2. Get More Detail Infomations notifyEntry=%d ==> ANCS_GET_NOTIFICATION_ATTRIBUTE \n\r",ancs_context.notifyEntry);
+ break;
+ }
+ }
+ }
+ if (ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY)
+ {
+ APP_DBG_MSG(" ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY => ANCS_IDLE \n\r");
+ ancs_context.state = ANCS_IDLE;
+ }
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/****************************************************************/
+/* */
+/* GATT CLIENT PART */
+/****************************************************************/
+/**
+* Reset all ancs_context fields to default values
+*/
+ void ANCS_Client_Reset( void )
+{
+ memset(&ancs_context, 0x00, sizeof(ancs_context));
+
+ for (uint8_t i=0; i < MAX_NMB_NOTIFY; i++)
+ {
+ ancs_context.notifyList[i].used = 0x00;
+ //ancs_context.notifyList[i].evID = 0x00;
+ //ancs_context.notifyList[i].evFlag = 0x00;
+ //ancs_context.notifyList[i].catID = 0x00;
+ //ancs_context.notifyList[i].catCount = 0x00;
+ //ancs_context.notifyList[i].notifUID = 0x00;
+ }
+
+ ancs_context.state = ANCS_UNINITIALIZED;
+ ancs_context.connection_handle = 0xFFFF;
+ ancs_context.notifyEntry = INVALID_NOTIFY_ENTRY;
+
+ APP_DBG_MSG("ANCS CLIENT RESET \n\r");
+
+ return;
+}
+
+osSemaphoreId_t SemGapId;
+osSemaphoreId_t SemGattId;
+
+osThreadId_t AncsProcessId;
+
+const osThreadAttr_t AncsProcess_attr = {
+ .name = CFG_ANCS_PROCESS_NAME,
+ .attr_bits = CFG_ANCS_PROCESS_ATTR_BITS,
+ .cb_mem = CFG_ANCS_PROCESS_CB_MEM,
+ .cb_size = CFG_ANCS_PROCESS_CB_SIZE,
+ .stack_mem = CFG_ANCS_PROCESS_STACK_MEM,
+ .priority = CFG_ANCS_PROCESS_PRIORITY,
+ .stack_size = CFG_ANCS_PROCESS_STACk_SIZE
+};
+
+static void AncsProcess(void *argument)
+{
+ UNUSED(argument);
+
+ for(;;)
+ {
+ osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
+
+ ANCS_App_Update_Service( );
+ }
+}
+
+/**
+* function used to set task ANCS_App_Update_Service when processed ANCS_Client_Event_Handler
+*/
+static void Ancs_Mgr( void )
+{
+
+ osThreadFlagsSet( AncsProcessId, 1 );
+ return;
+}
+
+/**
+* function of ANCS service and characteristics init
+*/
+void ANCS_Client_App_Init( void )
+{
+ /* register ANCS_Client_Event_Handler to BLE Controller initialization*/
+ SVCCTL_RegisterCltHandler(ANCS_Client_Event_Handler);
+
+ AncsProcessId = osThreadNew(AncsProcess, NULL, &AncsProcess_attr);
+
+ SemGapId = osSemaphoreNew( 1, 0, NULL ); /*< Create the semaphore and make it busy at initialization */
+ SemGattId = osSemaphoreNew( 1, 0, NULL ); /*< Create the semaphore and make it busy at initialization */
+
+
+ /* reset ANCS context */
+ ANCS_Client_Reset();
+
+ APP_DBG_MSG("-- ANCS CLIENT INITIALIZED \n\r");
+
+ return;
+}
+
+static void gap_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ osSemaphoreRelease( SemGapId );
+ return;
+}
+
+static void gap_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ osSemaphoreAcquire( SemGapId, osWaitForever );
+ return;
+}
+
+static void gatt_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ osSemaphoreRelease( SemGattId );
+ return;
+}
+
+static void gatt_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ osSemaphoreAcquire( SemGattId, osWaitForever );
+ return;
+}
+
+/**
+* function of GATT service parse by UUID
+*/
+static void GattParseServicesByUUID(aci_att_find_by_type_value_resp_event_rp0 *pr)
+{
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP - Connection_Handle=0x%04X,Num_of_Handle_Pair=%d\n\r",
+ pr->Connection_Handle,
+ pr->Num_of_Handle_Pair);
+ for(uint8_t NumPair=0;NumPair<pr->Num_of_Handle_Pair;NumPair++)
+ {
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP - NumPair=%d Found_Attribute_Handle=0x%04X,Group_End_Handle=0x%04X\n\r",
+ NumPair,
+ pr->Attribute_Group_Handle_Pair[NumPair].Found_Attribute_Handle,
+ pr->Attribute_Group_Handle_Pair[NumPair].Group_End_Handle);
+ }
+ /* complete ancs_context fields */
+ if(ancs_context.state == ANCS_DISCOVER_ANCS_SERVICE)
+ {
+ ancs_context.ANCSServiceStartHandle = pr->Attribute_Group_Handle_Pair[0].Found_Attribute_Handle;
+ ancs_context.ANCSServiceEndHandle = pr->Attribute_Group_Handle_Pair[0].Group_End_Handle;
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP - Found ANCSServiceStartHandle=0x%04X,ANCSServiceEndHandle=0x%04X\n\r",
+ ancs_context.ANCSServiceStartHandle,
+ ancs_context.ANCSServiceEndHandle);
+ }
+}
+
+
+/**
+* function of GATT service parse
+*/
+static void GattParseServices(aci_att_read_by_group_type_resp_event_rp0 *pr)
+{
+ uint16_t uuid,ServiceStartHandle,ServiceEndHandle;
+ uint8_t uuid_offset,uuid_size,uuid_short_offset;
+ uint8_t i,idx,numServ;
+
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP - Connection_Handle=0x%04X,Attribute_Data_Length=%d,Data_Length=%d !\n",
+ pr->Connection_Handle,
+ pr->Attribute_Data_Length,
+ pr->Data_Length);
+
+ /* check connection handle related to response before processing */
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ /* Number of attribute value tuples */
+ numServ = (pr->Data_Length) / pr->Attribute_Data_Length;
+
+ /* event data in Attribute_Data_List contains:
+ * 2 bytes for start handle
+ * 2 bytes for end handle
+ * 2 or 16 bytes data for UUID
+ */
+ if (pr->Attribute_Data_Length == 20) /* we are interested in the UUID is 128 bit.*/
+ {
+ idx = 16; /*UUID index of 2 bytes read part in Attribute_Data_List */
+ uuid_offset = 4; /*UUID offset in bytes in Attribute_Data_List */
+ uuid_size = 16; /*UUID size in bytes */
+ uuid_short_offset = 12; /*UUID offset of 2 bytes read part in UUID field*/
+ }
+ if (pr->Attribute_Data_Length == 6) /* we are interested in the UUID is 16 bit.*/
+ {
+ idx = 4;
+ uuid_offset = 4;
+ uuid_size = 2;
+ uuid_short_offset = 0;
+ }
+ UNUSED(idx);
+ UNUSED(uuid_size);
+
+ /* Loop on number of attribute value tuples */
+ for (i = 0; i < numServ; i++)
+ {
+ ServiceStartHandle = UNPACK_2_BYTE_PARAMETER(&pr->Attribute_Data_List[uuid_offset - 4]);
+ ServiceEndHandle = UNPACK_2_BYTE_PARAMETER(&pr->Attribute_Data_List[uuid_offset - 2]);
+ uuid = UNPACK_2_BYTE_PARAMETER(&pr->Attribute_Data_List[uuid_offset + uuid_short_offset]);
+ APP_DBG_MSG("numServ=%d/%d,short UUID=0x%04X ServiceHandle [0x%04X - 0x%04X] \n\r",
+ i, numServ, uuid, ServiceStartHandle,ServiceEndHandle);
+
+ /* complete ancs_context fields */
+ if ( (ancs_context.ALLServiceStartHandle == 0x0000) || (ServiceStartHandle < ancs_context.ALLServiceStartHandle) )
+ {
+ ancs_context.ALLServiceStartHandle = ServiceStartHandle;
+ }
+ if ( (ancs_context.ALLServiceEndHandle== 0x0000) || (ServiceEndHandle > ancs_context.ALLServiceEndHandle) )
+ {
+ ancs_context.ALLServiceEndHandle = ServiceEndHandle;
+ }
+
+
+ if(uuid == GAP_SERVICE_UUID) /* 0x1800 */ {
+
+ ancs_context.GAPServiceStartHandle = ServiceStartHandle;
+ ancs_context.GAPServiceEndHandle = ServiceEndHandle;
+
+ APP_DBG_MSG("GAP_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == GENERIC_ATTRIBUTE_SERVICE_UUID) /* 0x1801 */ {
+
+ ancs_context.GATTServiceStartHandle = ServiceStartHandle;
+ ancs_context.GATTServiceEndHandle = ServiceEndHandle;
+
+ APP_DBG_MSG("GENERIC_ATTRIBUTE_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == IMMEDIATE_ALERT_SERVICE_UUID) /* 0x1802 */ {
+ APP_DBG_MSG("AMS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == LINK_LOSS_SERVICE_UUID) /* 0x1803 */ {
+ APP_DBG_MSG("LINK_LOSS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == TX_POWER_SERVICE_UUID) /* 0x1804 */ {
+ APP_DBG_MSG("TX_POWER_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == CURRENT_TIME_SERVICE_UUID) /* 0x1805 */ {
+ APP_DBG_MSG("CURRENT_TIME_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == REFERENCE_UPDATE_TIME_SERVICE_UUID) /* 0x1806 */ {
+ APP_DBG_MSG("REFERENCE_UPDATE_TIME_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == NEXT_DST_CHANGE_SERVICE_UUID) /* 0x1807 */ {
+ APP_DBG_MSG("NEXT_DST_CHANGE_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == GLUCOSE_SERVICE_UUID) /* 0x1808 */ {
+ APP_DBG_MSG("GLUCOSE_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == HEALTH_THERMOMETER_SERVICE_UUID) /* 0x1809 */ {
+ APP_DBG_MSG("HEALTH_THERMOMETER_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == DEVICE_INFORMATION_SERVICE_UUID) /* 0x180A */ {
+ APP_DBG_MSG("DEVICE_INFORMATION_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == 0x180B) /* 0x180B */ {
+ APP_DBG_MSG("Unkown UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == 0x180C) /* 0x180C */ {
+ APP_DBG_MSG("Unkown UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == HEART_RATE_SERVICE_UUID) /* 0x180D */ {
+ APP_DBG_MSG("AMS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == PHONE_ALERT_SERVICE_UUID) /* 0x180E */ {
+ APP_DBG_MSG("PHONE_ALERT_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == BATTERY_SERVICE_UUID) /* 0x180F */ {
+ APP_DBG_MSG("BATTERY_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == ANCS_SERVICE_UUID) {
+
+ ancs_context.ANCSServiceStartHandle = ServiceStartHandle;
+ ancs_context.ANCSServiceEndHandle = ServiceEndHandle;
+
+ APP_DBG_MSG("ANCS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == AMS_SERVICE_UUID) {
+ APP_DBG_MSG("AMS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else {
+ APP_DBG_MSG("invalid UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ }
+
+ uuid_offset += pr->Attribute_Data_Length;
+ }//numServ
+ }
+ else
+ {
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP, failed no free index in connection table !\n\r");
+ }
+}
+
+/**
+* function of GATT characteristics parse
+*/
+static void GattParseChars(aci_att_read_by_type_resp_event_rp0 *pr)
+{
+ uint16_t uuid,CharStartHandle,CharValueHandle;
+ uint8_t uuid_offset,uuid_size,uuid_short_offset;
+ uint8_t i,idx,numHdleValuePair;
+ uint8_t CharProperties;
+
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_TYPE_RESP - Connection_Handle=0x%x,Handle_Value_Pair_Length=%d,Data_Length=%d\n\r",
+ pr->Connection_Handle,
+ pr->Handle_Value_Pair_Length,
+ pr->Data_Length);
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ /* event data in Attribute_Data_List contains:
+ * 2 bytes for start handle
+ * 1 byte char properties
+ * 2 bytes handle
+ * 2 or 16 bytes data for UUID
+ */
+
+ /* Number of attribute value tuples */
+ numHdleValuePair = pr->Data_Length / pr->Handle_Value_Pair_Length;
+
+ if (pr->Handle_Value_Pair_Length == 21) /* we are interested in 128 bit UUIDs */
+ {
+ idx = 17; /*UUID index of 2 bytes read part in Attribute_Data_List */
+ uuid_offset = 5; /*UUID offset in bytes in Attribute_Data_List */
+ uuid_size = 16; /*UUID size in bytes */
+ uuid_short_offset = 12; /*UUID offset of 2 bytes read part in UUID field*/
+ }
+ if (pr->Handle_Value_Pair_Length == 7) /* we are interested in 16 bit UUIDs */
+ {
+ idx = 5;
+ uuid_offset = 5;
+ uuid_size = 2;
+ uuid_short_offset = 0;
+ }
+ UNUSED(idx);
+ UNUSED(uuid_size);
+
+ pr->Data_Length -= 1;
+
+ /* Loop on number of attribute value tuples */
+ for (i = 0; i < numHdleValuePair; i++)
+ {
+ CharStartHandle = UNPACK_2_BYTE_PARAMETER(&pr->Handle_Value_Pair_Data[uuid_offset-5]);
+ CharProperties = pr->Handle_Value_Pair_Data[uuid_offset-3];
+ CharValueHandle = UNPACK_2_BYTE_PARAMETER(&pr->Handle_Value_Pair_Data[uuid_offset-2]);
+ uuid = UNPACK_2_BYTE_PARAMETER(&pr->Handle_Value_Pair_Data[uuid_offset+uuid_short_offset]);
+
+ if ( (uuid != 0x0) && (CharProperties != 0x0) && (CharStartHandle != 0x0) && (CharValueHandle !=0) )
+ {
+ APP_DBG_MSG("-- GATT : numHdleValuePair=%d,short UUID=0x%04X FOUND CharProperties=0x%04X CharHandle [0x%04X - 0x%04X]\n",
+ i, uuid, CharProperties, CharStartHandle,CharValueHandle);
+
+ /* complete ancs_context fields */
+ if (uuid == DEVICE_NAME_UUID) /* 0x2A00 */ {
+ APP_DBG_MSG("GAP DEVICE_NAME_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == APPEARANCE_UUID) /* 0x2A01 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == PERIPHERAL_PRIVACY_FLAG_UUID) /* 0x2A02 */ {
+ APP_DBG_MSG("GAP PERIPHERAL_PRIVACY_FLAG_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == RECONNECTION_ADDR_UUID) /* 0x2A03 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == PERIPHERAL_PREFERRED_CONN_PARAMS_UUID) /* 0x2A04 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ }else if (uuid == SERVICE_CHANGED_CHARACTERISTIC_UUID) /* 0x2A05 */ {
+
+ ancs_context.ServiceChangedCharStartHdle = CharStartHandle;
+ ancs_context.ServiceChangedCharValueHdle = CharValueHandle;
+ APP_DBG_MSG("GATT SERVICE_CHANGED_CHARACTERISTIC_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == BATTERY_LEVEL_CHAR_UUID) /* 0x2A19 */ {
+ APP_DBG_MSG("BATTERY_LEVEL_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == CURRENT_TIME_CHAR_UUID) /* 0x2A2B */ {
+ APP_DBG_MSG("CURRENT_TIME_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == LOCAL_TIME_INFORMATION_CHAR_UUID) /* 0x2A0F */ {
+ APP_DBG_MSG("LOCAL_TIME_INFORMATION_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == MANUFACTURER_NAME_UUID) /* 0x2A29 */ {
+ APP_DBG_MSG("DeviceInformationService MANUFACTURER_NAME_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == MODEL_NUMBER_UUID) /* 0x2A24 */ {
+ APP_DBG_MSG("DeviceInformationService MODEL_NUMBER_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == ANCS_NOTIFICATION_SOURCE_CHAR_UUID) {
+
+ ancs_context.ANCSNotificationSourceCharStartHdle = CharStartHandle;
+ ancs_context.ANCSNotificationSourceCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("ANCS_NOTIFICATION_SOURCE_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == ANCS_CONTROL_POINT_CHAR_UUID) {
+
+ ancs_context.ANCSControlPointCharStartHdle = CharStartHandle;
+ ancs_context.ANCSControlPointCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("ANCS_CONTROL_POINT_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == ANCS_DATA_SOURCE_CHAR_UUID) {
+
+ ancs_context.ANCSDataSourceCharStartHdle = CharStartHandle;
+ ancs_context.ANCSDataSourceCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("ANCS_DATA_SOURCE_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+
+ } else if (uuid == CENTRAL_ADDRESS_RESOLUTION_UUID) {
+
+ ancs_context.GAPCentralAddressResolutionCharStartHdle = CharStartHandle;
+ ancs_context.GAPCentralAddressResolutionCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("CENTRAL_ADDRESS_RESOLUTION_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else {
+ APP_DBG_MSG("Unknown_char UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ }
+
+ }
+ uuid_offset += pr->Handle_Value_Pair_Length;
+ }// numHdleValuePair
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_TYPE_RESP, failed handle not found in connection table !\n\r");
+}
+/**
+* function of GATT descriptor parse
+*/
+static void GattParseDescs(aci_att_find_info_resp_event_rp0 *pr)
+{
+ uint16_t uuid,handle;
+ uint8_t uuid_offset,uuid_size,uuid_short_offset;
+ uint8_t i,numDesc,handle_uuid_pair_size;
+
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_INFORMATION_RESP - Connection_Handle=0x%x,Format=%d,Event_Data_Length=%d\n\r",
+ pr->Connection_Handle,
+ pr->Format,
+ pr->Event_Data_Length);
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ /* event data in Attribute_Data_List contains:
+ * 2 bytes handle
+ * 2 or 16 bytes data for UUID
+ */
+ if (pr->Format == UUID_TYPE_16)
+ {
+ uuid_size = 2;
+ uuid_offset = 2;
+ uuid_short_offset = 0;
+ handle_uuid_pair_size = 4;
+ }
+ if (pr->Format == UUID_TYPE_128)
+ {
+ uuid_size = 16;
+ uuid_offset = 2;
+ uuid_short_offset = 12;
+ handle_uuid_pair_size = 18;
+ }
+ UNUSED(uuid_size);
+
+ /* Number of handle uuid pairs */
+ numDesc = (pr->Event_Data_Length) / handle_uuid_pair_size;
+
+ for (i = 0; i < numDesc; i++)
+ {
+ handle = UNPACK_2_BYTE_PARAMETER(&pr->Handle_UUID_Pair[uuid_offset-2]);
+ uuid = UNPACK_2_BYTE_PARAMETER(&pr->Handle_UUID_Pair[uuid_offset+uuid_short_offset]);
+
+ /* 1. primary serice handle + primary serice UUID */
+ if(uuid == PRIMARY_SERVICE_UUID)
+ {
+ APP_DBG_MSG("PRIMARY_SERVICE_UUID=0x%04X handle=0x%04X\n\r",uuid,handle);
+ }/* 1. primary serice handle + primary serice UUID */
+
+ /* 2. char handle + char UUID */
+ else if(uuid == CHARACTERISTIC_UUID)
+ {
+ /* reset UUID & handle */
+ gCharUUID = 0;
+ gCharStartHandle = 0;
+ gCharValueHandle = 0;
+ gCharDescriptorHandle = 0;
+
+ gCharStartHandle = handle;
+ APP_DBG_MSG("reset CHARACTERISTIC_UUID=0x%04X CharStartHandle=0x%04X\n\r",uuid,handle);
+ }/* 2. char handle + char UUID */
+
+ /* 3. char desc handle + char desc UUID */
+ else if( (uuid == CHAR_EXTENDED_PROPERTIES_DESCRIPTOR_UUID) /* 0x2900 */
+ || (uuid == CLIENT_CHAR_CONFIG_DESCRIPTOR_UUID) )/* 0x2902 */
+ {
+ gCharDescriptorHandle = handle;
+ if (gCharValueHandle == ancs_context.ServiceChangedCharValueHdle){
+
+ ancs_context.ServiceChangedCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else if (gCharValueHandle == ancs_context.ANCSNotificationSourceCharValueHdle){
+
+ ancs_context.ANCSNotificationSourceCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else if (gCharValueHandle == ancs_context.ANCSDataSourceCharValueHdle){
+
+ ancs_context.ANCSDataSourceCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else if (gCharValueHandle == ancs_context.ANCSControlPointCharValueHdle){
+
+ ancs_context.ANCSControlPointCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else {
+ APP_DBG_MSG(" unkown_char_desc UUID=0x%04X handle=0x%04X-0x%04X-0x%04X \n\r",uuid,gCharStartHandle,gCharValueHandle,handle);
+ }
+ }// 3. char desc handle + char desc UUID
+
+ /* 4. char value handle + char UUID */
+ else
+ {
+ gCharUUID = uuid;
+ gCharValueHandle = handle;
+ if (uuid == DEVICE_NAME_UUID) /* 0x2A00 */ {
+ APP_DBG_MSG("GAP DEVICE_NAME_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == APPEARANCE_UUID) /* 0x2A01 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == PERIPHERAL_PRIVACY_FLAG_UUID) /* 0x2A02 */ {
+ APP_DBG_MSG("GAP PERIPHERAL_PRIVACY_FLAG_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == RECONNECTION_ADDR_UUID) /* 0x2A03 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == PERIPHERAL_PREFERRED_CONN_PARAMS_UUID) /* 0x2A04 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == SERVICE_CHANGED_CHARACTERISTIC_UUID) /* 0x2A05 */ {
+ APP_DBG_MSG(" SERVICE_CHANGED_CHARACTERISTIC_UUID=0x%04X CharValueHandle [%04X]\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == BATTERY_LEVEL_CHAR_UUID) /* 0x2A19 */ {
+ APP_DBG_MSG("BATTERY_LEVEL_CHAR_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == CURRENT_TIME_CHAR_UUID) /* 0x2A2B */ {
+ APP_DBG_MSG("CURRENT_TIME_CHAR_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == LOCAL_TIME_INFORMATION_CHAR_UUID) /* 0x2A0F */ {
+ APP_DBG_MSG("LOCAL_TIME_INFORMATION_CHAR_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == MANUFACTURER_NAME_UUID) /* 0x2A29 */ {
+ APP_DBG_MSG("DeviceInformationService MANUFACTURER_NAME_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == MODEL_NUMBER_UUID) /* 0x2A24 */ {
+ APP_DBG_MSG("DeviceInformationService MODEL_NUMBER_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == ANCS_NOTIFICATION_SOURCE_CHAR_UUID) {
+ APP_DBG_MSG(" ANCS_NOTIFICATION_SOURCE_CHAR_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else if (uuid == ANCS_CONTROL_POINT_CHAR_UUID) {
+ APP_DBG_MSG(" ANCS_CONTROL_POINT_CHAR_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else if (uuid == ANCS_DATA_SOURCE_CHAR_UUID) {
+ APP_DBG_MSG(" ANCS_DATA_SOURCE_CHAR_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else if (uuid == CENTRAL_ADDRESS_RESOLUTION_UUID) {
+ APP_DBG_MSG(" CENTRAL_ADDRESS_RESOLUTION_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else {
+ APP_DBG_MSG(" invalid char value UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ }
+ }// 4. char value handle + char UUID
+
+ uuid_offset += handle_uuid_pair_size;
+ }
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_INFORMATION_RESP, failed handle not found in connection table !\n\r");
+}
+
+static void GattParseNotification(aci_gatt_notification_event_rp0 *pr)
+{
+ APP_DBG_MSG("EVT_BLUE_GATT_NOTIFICATION - Connection_Handle=0x%x,Attribute_Handle=0x%04X,Attribute_Value_Length=%d\n\r",
+ pr->Connection_Handle,
+ pr->Attribute_Handle,
+ pr->Attribute_Value_Length);
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ // 1. Incomming Nofification
+ if (pr->Attribute_Handle == ancs_context.ANCSNotificationSourceCharValueHdle)
+ {
+ APP_DBG_MSG("1. Incomming Nofification received BASIC information : \n\r");
+ EventID evID = (EventID)pr->Attribute_Value[0];
+ EventFlags evFlag = (EventFlags)pr->Attribute_Value[1];
+ CategoryID catID = (CategoryID)pr->Attribute_Value[2];
+ uint8_t catCount = pr->Attribute_Value[3];
+ uint32_t notifUID = (uint32_t)(*((uint32_t *)&pr->Attribute_Value[4]));
+ ANCS_Notification_Source_Received_event(evID, evFlag, catID, catCount, notifUID);
+
+ // 2. Get More Detail Infomations
+ if( (evID == EventIDNotificationAdded) )
+ {
+ if((evFlag & EventFlagSilent) != EventFlagSilent)
+ {
+ ANCS_Notification_Check(evFlag);
+ Ancs_Mgr();
+ }
+ }
+ }// ANCSNotificationSourceCharValueHdle
+
+ // 3. Parse Detail Infomations, Perform Notification Action or Get APP Attributes
+ if (pr->Attribute_Handle == ancs_context.ANCSDataSourceCharValueHdle)
+ {
+ CommandID cmdID = (CommandID)pr->Attribute_Value[0];
+ uint32_t notifUID = (uint32_t)0x00000000;
+
+ uint16_t AttributeLength;
+ uint8_t *AttributeList;
+
+ char AppIdentifier[128]={0};
+ uint16_t AppIdentifierLength;
+
+ /***********************************************************************************/
+ if (cmdID == CommandIDGetNotificationAttributes)
+ {
+ APP_DBG_MSG("3.1 Parse Detail Infomation of Notification Attribute, CommandIDGetNotificationAttributes Response: \n\r");
+ notifUID = (uint32_t)(*((uint32_t *)&pr->Attribute_Value[1]));
+ AttributeLength = pr->Attribute_Value_Length - (1+4);
+ AttributeList = (uint8_t *)&pr->Attribute_Value[1+4];
+
+ // 3.1 Parse Detail Infomation of Notification Attribute
+ ANCS_Parse_GetNotificationAttr_Resp(cmdID,AttributeLength,AttributeList);
+ }
+ UNUSED(notifUID);
+
+ if (cmdID == CommandIDGetAppAttributes)
+ {
+ APP_DBG_MSG("3.3 Parse Detail Infomation of APP Attribute, CommandIDGetAppAttributes Response: \n\r");
+ strcpy(AppIdentifier,(char *)&pr->Attribute_Value[1]);
+ AppIdentifierLength = strlen((char *)&pr->Attribute_Value[1]);
+ AttributeLength = pr->Attribute_Value_Length - (1+AppIdentifierLength+1);
+ AttributeList = (uint8_t *)&pr->Attribute_Value[1+AppIdentifierLength+1];
+
+ // 3.3 Parse Detail Infomation of App Attribute
+ ANCS_Parse_GetAppAttr_Resp(cmdID,AttributeLength,AttributeList);
+ }
+
+ Ancs_Mgr();
+ /***********************************************************************************/
+ }/* ANCSDataSourceCharValueHdle */
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_GATT_NOTIFICATION, failed handle not found in connection table !\n\r");
+}
+
+/**
+ * @brief ANCS Event handler
+ * @param Event: Address of the buffer holding the Event
+ * @retval Ack: Return whether the Event has been managed or not
+ */
+static SVCCTL_EvtAckStatus_t ANCS_Client_Event_Handler( void *Event )
+{
+ SVCCTL_EvtAckStatus_t return_value;
+ hci_event_pckt * event_pckt;
+ evt_blue_aci * blue_evt;
+ Connection_Context_t Notification;
+
+ return_value = SVCCTL_EvtAckFlowEnable;
+ event_pckt = (hci_event_pckt *) (((hci_uart_pckt*) Event)->data);
+
+ switch (event_pckt->evt)
+ {
+ case EVT_VENDOR:
+ {
+ blue_evt = (evt_blue_aci*) event_pckt->data;
+ switch (blue_evt->ecode)
+ {
+ case EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP:
+ {
+ aci_att_read_by_group_type_resp_event_rp0 *pr = (void*) blue_evt->data;
+
+ APP_DBG_MSG(" EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP\n");
+ GattParseServices((aci_att_read_by_group_type_resp_event_rp0 *)pr);
+ }
+ break;
+ case EVT_BLUE_ATT_READ_BY_TYPE_RESP:
+ {
+ aci_att_read_by_type_resp_event_rp0 *pr = (void*) blue_evt->data;
+ APP_DBG_MSG(" EVT_BLUE_ATT_READ_BY_TYPE_RESP\n");
+ GattParseChars((aci_att_read_by_type_resp_event_rp0 *)pr);
+ }
+ break;
+ case EVT_BLUE_ATT_FIND_INFORMATION_RESP:
+ {
+ aci_att_find_info_resp_event_rp0 *pr = (void*) blue_evt->data;
+ APP_DBG_MSG(" EVT_BLUE_ATT_FIND_INFORMATION_RESP\n");
+ GattParseDescs((aci_att_find_info_resp_event_rp0 *)pr);
+ }
+ break; /*EVT_BLUE_ATT_FIND_INFORMATION_RESP*/
+
+ case EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP:
+ {
+ APP_DBG_MSG(" EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP\n");
+ }
+ break;
+
+ case EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP:
+ {
+ aci_att_find_by_type_value_resp_event_rp0 *pr = (void*) blue_evt->data;
+ APP_DBG_MSG(" EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP\n");
+ GattParseServicesByUUID((aci_att_find_by_type_value_resp_event_rp0 *)pr);
+ }
+ break;
+
+ case EVT_BLUE_GATT_NOTIFICATION:
+ {
+ aci_gatt_notification_event_rp0 *pr = (void*) blue_evt->data;
+ GattParseNotification((aci_gatt_notification_event_rp0 *)pr);
+ }
+ break;/* end EVT_BLUE_GATT_NOTIFICATION */
+
+ case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED:
+ {
+ aci_gatt_attribute_modified_event_rp0 *attribute_modified = (aci_gatt_attribute_modified_event_rp0*) blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED Attr_Handle=0x%04X Offset=0x%04X Attr_Data_Length=0x%04X \n\r",
+ attribute_modified->Attr_Handle,
+ attribute_modified->Offset,
+ attribute_modified->Attr_Data_Length);
+ }/* end EVT_BLUE_GATT_ATTRIBUTE_MODIFIED */
+ break;
+
+ case EVT_BLUE_ATT_EXCHANGE_MTU_RESP:
+ {
+ aci_att_exchange_mtu_resp_event_rp0 * exchange_mtu_resp;
+ exchange_mtu_resp = (aci_att_exchange_mtu_resp_event_rp0 *)blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_ATT_EXCHANGE_MTU_RESP Connection_Handle=0x%04X Server_RX_MTU = %d ==> ANCS_MTU_EXCHANGE_COMPLETE \n",
+ exchange_mtu_resp->Connection_Handle,
+ exchange_mtu_resp->Server_RX_MTU );
+
+ Notification.Evt_Opcode = ANCS_MTU_EXCHANGE_COMPLETE;
+ Notification.connection_handle = exchange_mtu_resp->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+ break;
+
+ case EVT_BLUE_GATT_PROCEDURE_COMPLETE:
+ {
+ aci_gatt_proc_complete_event_rp0 *pr = (void*) blue_evt->data;
+ if(pr->Error_Code != ERR_CMD_SUCCESS)
+ {
+ APP_DBG_MSG("EVT_BLUE_GATT_PROCEDURE_COMPLETE - Connection_Handle=0x%04x,Error_Code=0x%02X (0x41: Failed)\n\r", pr->Connection_Handle,pr->Error_Code);
+ }
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ gatt_cmd_resp_release(0);
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_GATT_PROCEDURE_COMPLETE, failed handle not found in connection table !\n\r");
+ }/*EVT_BLUE_GATT_PROCEDURE_COMPLETE*/
+ break;
+ case EVT_BLUE_GATT_ERROR_RESP:
+ {
+ aci_gatt_error_resp_event_rp0 *error_resp= (void*) blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_GATT_ERROR_RESP Connection_Handle=0x%04X Req_Opcode=0x%02X Attribute_Handle=0x%04X Error_Code=0x%02X (0x05: Insufficient authentication,0x0A: Attribute not found)\n",
+ error_resp->Connection_Handle,error_resp->Req_Opcode,error_resp->Attribute_Handle,error_resp->Error_Code);
+ }/*EVT_BLUE_GATT_ERROR_RESP*/
+ break;
+
+ default:
+ APP_DBG_MSG("invalid ecode 0x%04X\n",blue_evt->ecode);
+ return_value = SVCCTL_EvtNotAck;
+ break;
+ }
+ }
+ break; /* EVT_VENDOR */
+
+ default:
+ return_value = SVCCTL_EvtNotAck;
+ break;
+ }
+
+ return (return_value);
+}/* end BLE_CTRL_Event_Acknowledged_Status_t */
+
+void ANCS_App_KeyButton1Action(void)
+{
+ APP_DBG_MSG("\n\r ** Term CONNECTION ** \n\r");
+ aci_gap_terminate(ancs_context.connection_handle, 0x13);
+}
+void ANCS_App_KeyButton2Action(void)
+{
+ APP_DBG_MSG("Review the PreExisted Notification \n\r");
+ Connection_Context_t Notification;
+ Notification.Evt_Opcode = ANCS_CHECK_NOTIFICATION;
+ Notification.connection_handle = ancs_context.connection_handle;
+ ANCS_App_Notification(&Notification);
+}
+void ANCS_App_KeyButton3Action(void)
+{
+ APP_DBG_MSG(" aci_gap_clear_security_db & aci_gap_remove_bonded_device & aci_gap_terminate \n\r");
+ aci_gap_remove_bonded_device(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ aci_gap_clear_security_db();
+ aci_gap_terminate(ancs_context.connection_handle, 0x13);
+}
+
+#if (GET_ACTION_ID_FROM_UART == 1)
+static uint8_t ANCS_App_Get_Char(void)
+{
+ uint8_t ch;
+ HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1,HAL_MAX_DELAY);
+
+ /* Echo character back to console */
+ HAL_UART_Transmit_DMA(&huart1, (uint8_t*)&ch, 1);
+
+ /* And cope with Windows */
+ if(ch == '\r'){
+ uint8_t ret = '\n';
+ HAL_UART_Transmit_DMA(&huart1, (uint8_t*)&ret, 1);
+ }
+
+ return ch;
+}
+#endif
+
+static ActionID ANCS_App_Get_ActionID(void)
+{
+ ActionID actID = ActionIDPositive;
+
+ #if (GET_ACTION_ID_FROM_UART == 1)
+ uint8_t performAction;
+ uint32_t StartTime = HAL_GetTick();
+ uint32_t ActionTimeout = 5000;
+
+ APP_DBG_MSG("** Notification Action. Press on the keyboard: A=Accept or R=Reject\r\n");
+ APP_DBG_MSG("** Waiting 5 sec....\r\n");
+
+ performAction = ANCS_App_Get_Char();
+
+ if ((HAL_GetTick() - StartTime) >= ActionTimeout) {
+ APP_DBG_MSG("** Action Timeout\r\n");
+ }
+ else
+ {
+ if ((performAction == 'A') || (performAction == 'a')) {
+ actID = ActionIDPositive;
+ APP_DBG_MSG("** Positive Action %c \n\r",performAction);
+ }else if ((performAction == 'R') || (performAction == 'r')) {
+ actID = ActionIDNegative;
+ APP_DBG_MSG("** Reject Action %c \n\r",performAction);
+ }
+ }
+ #endif
+
+ return actID;
+}
+void ANCS_App_Remove_Bonding_Info(void)
+{
+ APP_DBG_MSG(" aci_gap_clear_security_db & aci_gap_remove_bonded_device \n\r");
+ aci_gap_remove_bonded_device(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ aci_gap_clear_security_db();
+}
+
+void ANCS_App_Peer_Bonded_Check(uint16_t Connection_Handle, uint8_t Peer_Address_Type, uint8_t Peer_Address[6])
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+
+ ancs_context.connection_handle = Connection_Handle;
+
+ ancs_context.Peer_Address_Type = Peer_Address_Type;
+ ancs_context.Peer_Address[5] = Peer_Address[5];
+ ancs_context.Peer_Address[4] = Peer_Address[4];
+ ancs_context.Peer_Address[3] = Peer_Address[3];
+ ancs_context.Peer_Address[2] = Peer_Address[2];
+ ancs_context.Peer_Address[1] = Peer_Address[1];
+ ancs_context.Peer_Address[0] = Peer_Address[0];
+
+ result = aci_gap_is_device_bonded(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ ancs_context.Peer_Bonded = 0x01;
+ }
+ else
+ {
+ ancs_context.Peer_Bonded = 0x00;
+ }
+
+ uint8_t Security_Mode, Security_Level;
+
+ result = aci_gap_get_security_level(ancs_context.connection_handle,&Security_Mode,&Security_Level);
+ ancs_context.Security_Mode = Security_Mode;
+ ancs_context.Security_Level = Security_Level;
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Peer_Bonded=%d Security_Mode= %d, Security_Level= %d \n\r", ancs_context.Peer_Bonded, Security_Mode, Security_Level);
+ }
+
+}
+
+void ANCS_App_Update_Service( )
+{
+ switch(ancs_context.state)
+ {
+ case ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM:
+ {
+ GapProcReq(GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM);
+ }
+ break;
+
+ case ANCS_ALLOW_REBOND:
+ {
+ GapProcReq(GAP_PROC_ALLOW_REBOND);
+ }
+ break;
+
+ case ANCS_MTU_UPDATE:
+ {
+ GattProcReq(GATT_PROC_MTU_UPDATE);
+ }
+ break;
+
+ case ANCS_DISCOVER_ANCS_SERVICE:
+ {
+ /* GattProcReq(GATT_PROC_MTU_UPDATE); */ /* enable it if you want to set ATT_MTU */
+ GattProcReq(GATT_PROC_DISC_ANCS_SERVICE);
+ GattProcReq(GATT_PROC_DISC_ALL_PRIMARY_SERVICES);
+ GattProcReq(GATT_PROC_DISC_ALL_CHARS);
+ GattProcReq(GATT_PROC_DISC_ALL_DESCS);
+
+ APP_DBG_MSG("Peer_Bonded=%d Security_Mode= %d, Security_Level= %d \n\r", ancs_context.Peer_Bonded, ancs_context.Security_Mode,ancs_context.Security_Level);
+ if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ if( (ancs_context.Peer_Bonded == 0x00) ||
+ ( (ancs_context.Peer_Bonded == 0x01) && (ancs_context.Security_Mode == 0x01) && (ancs_context.Security_Level == 0x01) )
+ )
+ {
+ GapProcReq(GAP_PROC_SLAVE_SECURITY_REQ);
+
+ APP_DBG_MSG("waiting for EVT_BLUE_GAP_PAIRING_CMPLT \n\r");
+ gap_cmd_resp_wait(GAP_DEFAULT_TIMEOUT);/* waiting for EVT_BLUE_GAP_PAIRING_CMPLT */
+ APP_DBG_MSG("waited for EVT_BLUE_GAP_PAIRING_CMPLT \n\r");
+ }
+ }
+
+ GattProcReq(GATT_PROC_ENABLE_ALL_NOTIFICATIONS);
+ }
+ break;
+
+
+ case ANCS_GET_NOTIFICATION_ATTRIBUTE:
+ {
+ AncsProcReq(ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE);
+ }
+ break;
+
+ case ANCS_GET_APP_ATTRIBUTE:
+ {
+ AncsProcReq(ANCS_PROC_GET_APP_ATTRIBUTE);
+ }
+ break;
+
+ case ANCS_PERFORM_NOTIFICATION_ACTION:
+ {
+ AncsProcReq(ANCS_PROC_PERFORM_NOTIFICATION_ACTION);
+ }
+ break;
+
+ default:
+ {
+ APP_DBG_MSG("invalid ancs_context.state=%d \n\r",ancs_context.state);
+ }
+ break;
+ }
+}
+
+static void GapProcReq(GapProcId_t GapProcId)
+{
+ tBleStatus status;
+ uint8_t Security_Mode, Security_Level;
+
+ switch(GapProcId)
+ {
+ case GAP_PROC_SLAVE_SECURITY_REQ:
+ {
+ ancs_context.state = ANCS_SECURITY_REQUEST;
+ status = aci_gap_get_security_level(ancs_context.connection_handle,&Security_Mode,&Security_Level);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST Security_Mode= %d, Security_Level= %d \n", Security_Mode, Security_Level);
+ status = aci_gap_slave_security_req(ancs_context.connection_handle);
+ if (status != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST aci_gap_slave_security_req status=0x%02x \n\r",status);
+ }
+
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST waiting for EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \n\r");
+ gap_cmd_resp_wait(GAP_DEFAULT_TIMEOUT);/* waiting for EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST waited for EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \n\r");
+ }
+ }
+ break;
+
+ case GAP_PROC_PASS_KEY_RESPONSE:
+ {
+ ancs_context.state = ANCS_PASS_KEY_RESPONSE;
+ APP_DBG_MSG("ANCS_PASS_KEY_RESPONSE \n\r");
+ aci_gap_pass_key_resp(ancs_context.connection_handle, CFG_FIXED_PIN);/* response for EVT_BLUE_GAP_PASS_KEY_REQUEST */
+ }
+ break;
+
+ case GAP_PROC_ALLOW_REBOND:
+ {
+ ancs_context.state = ANCS_ALLOW_REBOND;
+ APP_DBG_MSG("ANCS_ALLOW_REBOND aci_gap_allow_rebond(0x%04X)\n\r",ancs_context.connection_handle);
+ aci_gap_allow_rebond(ancs_context.connection_handle);/* response for EVT_BLUE_GAP_BOND_LOST */
+ }
+ break;
+
+ case GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM:
+ {
+ ancs_context.state = ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM;
+ aci_gap_numeric_comparison_value_confirm_yesno(ancs_context.connection_handle, 1); /* CONFIRM_YES = 1 */
+
+ APP_DBG_MSG("GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM ** aci_gap_numeric_comparison_value_confirm_yesno-->YES \n");
+ }
+ break;
+
+ case GAP_PROC_TERMINATE_CONNECTION:
+ {
+ APP_DBG_MSG("terminate connection \n");
+ ancs_context.state = ANCS_DISCONNECTING;
+ status = aci_gap_terminate(ancs_context.connection_handle,0x13);
+ if (status != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Term Connection cmd failure: 0x%x\n", status);
+ }
+ gap_cmd_resp_wait(GAP_DEFAULT_TIMEOUT);
+
+ APP_DBG_MSG("GAP_PROC_TERMINATE_CONNECTION complete event received\n");
+ }
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+static void GattProcReq(GattProcId_t GattProcId)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+
+ switch (GattProcId)
+ {
+ case GATT_PROC_MTU_UPDATE:
+ {
+ ancs_context.state = ANCS_SET_DATA_LENGTH;
+ result = hci_le_set_data_length(ancs_context.connection_handle,CFG_BLE_MAX_ATT_MTU,CFG_BLE_MAX_ATT_MTU_TX_TIME);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_SET_DATA_LENGTH set data length %d %d ok ==>aci_gatt_exchange_config \n",CFG_BLE_MAX_ATT_MTU,CFG_BLE_MAX_ATT_MTU_TX_TIME);
+ ancs_context.state = ANCS_MTU_UPDATE;
+ result = aci_gatt_exchange_config(ancs_context.connection_handle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("aci_gatt_exchange_config cmd ok \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("aci_gatt_exchange_config cmd KO result=0x%02x \n\r",result);
+ }
+ }
+ }
+ break; /* GATT_PROC_MTU_UPDATE */
+
+ case GATT_PROC_DISC_ANCS_SERVICE:
+ {
+ ancs_context.state = ANCS_DISCOVER_ANCS_SERVICE;
+ /* discover ancs service for discover notification source / data source / control point characteristic */
+ UUID_t ancs_service_uuid;
+ COPY_ANCS_SERVICE_UUID(ancs_service_uuid.UUID_128);
+ result = aci_gatt_disc_primary_service_by_uuid(ancs_context.connection_handle,UUID_TYPE_128,(UUID_t *)&ancs_service_uuid);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE aci_gatt_disc_primary_service_by_uuid cmd ok\n");
+ }
+ else
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE aci_gatt_disc_primary_service_by_uuid cmd NOK status =0x%02X \n",result);
+ }
+
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if ( (ancs_context.ANCSServiceStartHandle == 0x0000) && (ancs_context.ANCSServiceEndHandle == 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE ANCS Service is NOT found !!! ==> connected to Android Phone/Pad \n\r");
+ }
+ else if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE ANCS Service [0x%04X - 0x%04X] is found !!! ==> connected to iOS Phone/Pad \n\r",ancs_context.ANCSServiceStartHandle,ancs_context.ANCSServiceEndHandle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ANCS_SERVICE */
+
+ case GATT_PROC_DISC_ALL_PRIMARY_SERVICES:
+ {
+ ancs_context.state = ANCS_DISCOVER_ALL_SERVICES;
+ /* discover all services */
+ result = aci_gatt_disc_all_primary_services(ancs_context.connection_handle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES ALL services discovered Successfully \n");
+ }
+ else
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES aci_gatt_disc_all_primary_services cmd NOK status =0x%02X \n",result);
+ }
+
+ if ( (ancs_context.ANCSServiceStartHandle == 0x0000) && (ancs_context.ANCSServiceEndHandle == 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES ANCS Service is NOT found !!! \n\r");
+ }
+ else if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES ANCS Service [0x%04X - 0x%04X] is found !!! \n\r",ancs_context.ANCSServiceStartHandle,ancs_context.ANCSServiceEndHandle);
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES GATT Service [0x%04X - 0x%04X] is found !!! \n\r",ancs_context.GATTServiceStartHandle,ancs_context.GATTServiceEndHandle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ALL_PRIMARY_SERVICES */
+
+ case GATT_PROC_DISC_ALL_CHARS:
+ {
+ ancs_context.state = ANCS_DISCOVER_ALL_CHARS;
+ APP_DBG_MSG("ANCS_DISCOVER_ALL_CHARS connection_handle=0x%04X ALLServiceHandle[%04X - %04X] ANCSServiceHandle[%04X - %04X]\n",
+ ancs_context.connection_handle,
+ ancs_context.ALLServiceStartHandle, ancs_context.ALLServiceEndHandle,
+ ancs_context.ANCSServiceStartHandle, ancs_context.ANCSServiceStartHandle);
+
+ result = aci_gatt_disc_all_char_of_service(
+ ancs_context.connection_handle,
+ ancs_context.ALLServiceStartHandle,
+ ancs_context.ALLServiceEndHandle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ALL characteristics discovered Successfully \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("ALL characteristics discovery Failed \n\r");
+ }
+
+ if( (ancs_context.ANCSNotificationSourceCharStartHdle != 0x0000) && (ancs_context.ANCSNotificationSourceCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ANCSNotificationSourceCharStartHdle=0x%04X ANCSNotificationSourceCharValueHdle=0x%04X \n\r",ancs_context.ANCSNotificationSourceCharStartHdle,ancs_context.ANCSNotificationSourceCharValueHdle);
+ }
+ if( (ancs_context.ANCSDataSourceCharStartHdle!= 0x0000) && (ancs_context.ANCSDataSourceCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ANCSDataSourceCharStartHdle=0x%04X ANCSDataSourceCharValueHdle=0x%04X \n\r",ancs_context.ANCSDataSourceCharStartHdle,ancs_context.ANCSDataSourceCharValueHdle);
+ }
+ if( (ancs_context.ANCSControlPointCharStartHdle!= 0x0000) && (ancs_context.ANCSControlPointCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ANCSControlPointCharStartHdle=0x%04X ANCSControlPointCharValueHdle=0x%04X \n\r",ancs_context.ANCSControlPointCharStartHdle,ancs_context.ANCSControlPointCharValueHdle);
+ }
+ if( (ancs_context.ServiceChangedCharStartHdle != 0x0000) && (ancs_context.ServiceChangedCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ServiceChangedCharStartHdle=0x%04X ServiceChangedCharValueHdle=0x%04X \n\r",ancs_context.ServiceChangedCharStartHdle,ancs_context.ServiceChangedCharValueHdle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ALL_CHARS */
+
+ case GATT_PROC_DISC_ALL_DESCS:
+ {
+ ancs_context.state = ANCS_DISCOVER_ALL_CHAR_DESCS;
+ APP_DBG_MSG("ANCS_DISCOVER_ALL_CHAR_DESCS [%04X - %04X]\n",
+ ancs_context.ALLServiceStartHandle,
+ ancs_context.ALLServiceEndHandle);
+ result = aci_gatt_disc_all_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ALLServiceStartHandle,
+ ancs_context.ALLServiceEndHandle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("All characteristic descriptors discovered Successfully \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("All characteristic descriptors discovery Failed \n\r");
+ }
+
+ if( (ancs_context.ANCSNotificationSourceCharDescHdle!= 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ANCSNotificationSourceCharDescHdle=0x%04X \n\r",ancs_context.ANCSNotificationSourceCharDescHdle);
+ }
+ if( (ancs_context.ANCSControlPointCharDescHdle!= 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ANCSControlPointCharDescHdle=0x%04X \n\r",ancs_context.ANCSControlPointCharDescHdle);
+ }
+ if( (ancs_context.ANCSDataSourceCharDescHdle!= 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ANCSDataSourceCharDescHdle=0x%04X \n\r",ancs_context.ANCSDataSourceCharDescHdle);
+ }
+ if( (ancs_context.ServiceChangedCharDescHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ServiceChangedCharDescHdle=0x%04X \n\r",ancs_context.ServiceChangedCharDescHdle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ALL_DESCS */
+
+ case GATT_PROC_ENABLE_ALL_NOTIFICATIONS:
+ {
+ uint16_t enable = 0x0001;
+
+ if(ancs_context.ServiceChangedCharDescHdle != 0x0000)
+ {
+ ancs_context.state = ANCS_ENABLE_NOTIFICATION_SERVICE_CHANGED_DESC;
+ result = aci_gatt_write_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ServiceChangedCharDescHdle,
+ 2,
+ (uint8_t *) &enable);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ServiceChangedCharDescHdle=0x%04X notification enabled Successfully \n\r",ancs_context.ServiceChangedCharDescHdle);
+ }
+ else
+ {
+ APP_DBG_MSG("ServiceChangedCharDescHdle=0x%04X notification enabled Failed BLE_STATUS_NOT_ALLOWED=0x%02x result=0x%02X\n",
+ ancs_context.ServiceChangedCharDescHdle,BLE_STATUS_NOT_ALLOWED,result);
+ }
+ }
+
+ if(ancs_context.ANCSDataSourceCharDescHdle != 0x0000)
+ {
+ ancs_context.state = ANCS_ENABLE_NOTIFICATION_DATA_SOURCE_DESC;
+ APP_DBG_MSG("ANCS_ENABLE_NOTIFICATION_DATA_SOURCE_DESC 0x%04X 0x%04X \n",
+ ancs_context.connection_handle,
+ ancs_context.ANCSDataSourceCharDescHdle);
+ result = aci_gatt_write_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ANCSDataSourceCharDescHdle,
+ 2,
+ (uint8_t *) &enable);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCSDataSourceCharDescHdle notification enabled Successfully \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("ANCSDataSourceCharDescHdle=0x%04X notification enabled Failed BLE_STATUS_NOT_ALLOWED=0x%02x result=0x%02X\n",
+ ancs_context.ANCSDataSourceCharDescHdle,BLE_STATUS_NOT_ALLOWED,result);
+ }
+ }
+
+ if(ancs_context.ANCSNotificationSourceCharDescHdle != 0x0000)
+ {
+ ancs_context.state = ANCS_ENABLE_NOTIFICATION_NOTIFICATION_SOURCE_DESC;
+ APP_DBG_MSG("ANCS_ENABLE_NOTIFICATION_NOTIFICATION_SOURCE_DESC 0x%04X 0x%04X \n",
+ ancs_context.connection_handle,
+ ancs_context.ANCSNotificationSourceCharDescHdle);
+ result = aci_gatt_write_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ANCSNotificationSourceCharDescHdle,
+ 2,
+ (uint8_t *) &enable);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCSNotificationSourceCharDescHdle notification enabled Successfully \n\r");
+ ancs_context.state = ANCS_INITIALIZED;
+ }
+ else
+ {
+ APP_DBG_MSG("ANCSNotificationSourceCharDescHdle notification enabled Failed result=0x%02X\n",result);
+ }
+ }
+ }
+ break; /* GATT_PROC_ENABLE_ALL_NOTIFICATIONS */
+
+ default:
+ break;
+ }
+}
+
+static void AncsProcReq(AncsProcId_t AncsProcId)
+{
+ switch (AncsProcId)
+ {
+
+ case ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE:
+ {
+ ancs_context.state = ANCS_GET_NOTIFICATION_ATTRIBUTE;
+ if ( (ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY) || (ancs_context.notifyEntry >= MAX_NMB_NOTIFY) )
+ {
+ APP_DBG_MSG("ANCS_GET_NOTIFICATION_ATTRIBUTE INVALID_NOTIFY_ENTRY %d \n\r",ancs_context.notifyEntry);
+ break;
+ }
+ else
+ {
+ APP_DBG_MSG("ANCS_GET_NOTIFICATION_ATTRIBUTE interact with iOS NotificationID 0x%08x, retrieve more information\n\r",
+ ancs_context.notifyList[ancs_context.notifyEntry].notifUID);
+ }
+
+ notificationAttr_type attr;
+ attr.UID = ancs_context.notifyList[ancs_context.notifyEntry].notifUID;
+ attr.appID_flag = TRUE;
+ attr.title_flag = TRUE;
+ attr.title_max_size = MAX_DATA_LEN;
+ attr.subtitle_flag = TRUE;
+ attr.subtitle_max_size = MAX_DATA_LEN;
+ attr.message_flag = TRUE;
+ attr.message_max_size = MAX_DATA_LEN;
+ attr.messageSize_flag = TRUE;
+ attr.date_flag = TRUE;
+ attr.positiveAction_flag = TRUE;
+ attr.negativeAction_flag = TRUE;
+
+ ANCS_Cmd_GetNotificationAttr(attr);
+ }
+ break; /* ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE */
+
+ case ANCS_PROC_GET_APP_ATTRIBUTE:
+ {
+ ancs_context.state = ANCS_GET_APP_ATTRIBUTE;
+ APP_DBG_MSG("ANCS_GET_APP_ATTRIBUTE AppIdentifierLength=%d AppIdentifier:%s \n\r",
+ ancs_context.AppIdentifierLength,ancs_context.AppIdentifier);
+ ANCS_Cmd_GetAppAttr(ancs_context.AppIdentifierLength, (char*)ancs_context.AppIdentifier);
+ }
+ break; /* ANCS_PROC_GET_APP_ATTRIBUTE */
+
+ case ANCS_PROC_PERFORM_NOTIFICATION_ACTION:
+ {
+ ancs_context.state = ANCS_PERFORM_NOTIFICATION_ACTION;
+ ActionID actID = ActionIDPositive;
+ if ( (ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY) || (ancs_context.notifyEntry >= MAX_NMB_NOTIFY) )
+ {
+ APP_DBG_MSG("ANCS_PERFORM_NOTIFICATION_ACTION INVALID_NOTIFY_ENTRY %d \n\r",ancs_context.notifyEntry);
+ break;
+ }
+ else
+ {
+ APP_DBG_MSG("ANCS_PERFORM_NOTIFICATION_ACTION notifyEntry=%d NotificationID 0x%08x actID=%d \n\r",
+ ancs_context.notifyEntry,ancs_context.notifyList[ancs_context.notifyEntry].notifUID,actID);
+ }
+
+ /*Here you can add interface to get actionID through UART input or button press */
+ actID = ANCS_App_Get_ActionID();
+ ANCS_Cmd_PerformNotificationAction(ancs_context.notifyList[ancs_context.notifyEntry].notifUID,actID);
+
+ APP_DBG_MSG("ANCS_PERFORM_NOTIFICATION_ACTION notifyEntry=%d Removed\n\r", ancs_context.notifyEntry);
+ ancs_context.notifyList[ancs_context.notifyEntry].used = FALSE;
+ }
+ break; /* ANCS_PROC_PERFORM_NOTIFICATION_ACTION */
+
+ default:
+ break;
+ }
+}
+
+void ANCS_App_Notification( Connection_Context_t *pNotification )
+{
+ uint8_t status = BLE_STATUS_SUCCESS;
+
+ switch (pNotification->Evt_Opcode)
+ {
+ case ANCS_CONNECTED:
+ {
+ ancs_context.connection_handle = pNotification->connection_handle; /* register */
+ ancs_context.state = ANCS_DISCOVER_ANCS_SERVICE;
+ APP_DBG_MSG("ANCS_CONNECTED ==> ANCS_DISCOVER_ANCS_SERVICE \n\r");
+
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_DISCONN_COMPLETE:
+ {
+ APP_DBG_MSG("ANCS_DISCONN_COMPLETE \n\r");
+ if(ancs_context.state == ANCS_DISCONNECTING)
+ gap_cmd_resp_release(0);
+
+ ancs_context.state = ANCS_DISCONN_COMPLETE;
+ ANCS_Client_Reset();
+ }
+ break;
+
+ case ANCS_PASS_KEY_REQUEST:
+ {
+ ancs_context.state = ANCS_PASS_KEY_RESPONSE;
+ APP_DBG_MSG("ANCS_PASS_KEY_REQUEST ==> ANCS_PASS_KEY_RESPONSE \n\r");
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM:
+ {
+ ancs_context.state = ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM;
+ APP_DBG_MSG("ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM \n\r");
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_SECURITY_INITIATED:
+ {
+ ancs_context.state = ANCS_SECURITY_INITIATED;
+ APP_DBG_MSG("ANCS_SECURITY_INITIATED \n\r");
+ gap_cmd_resp_release(0);
+ }
+ break;
+
+ case ANCS_PAIRING_COMPLETE:
+ {
+ uint8_t Security_Mode, Security_Level;
+
+ status = aci_gap_get_security_level(ancs_context.connection_handle,&Security_Mode,&Security_Level);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_PAIRING_COMPLETE Peer_Bonded=%d Security_Mode=%d Security_Level=%d \n",ancs_context.Peer_Bonded, Security_Mode, Security_Level);
+ }
+
+ if (ancs_context.Peer_Bonded == 0x00)/* only for the first paring complete*/
+ {
+ status = aci_gap_is_device_bonded(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ ancs_context.Peer_Bonded = 0x01;
+ }
+ else
+ {
+ ancs_context.Peer_Bonded = 0x00;
+ }
+
+ APP_DBG_MSG("ANCS_PAIRING_COMPLETE Peer_Bonded from 0x00 ==> %d Term Connection for the first pairing complete to save bonding infomation !!! \n\r",ancs_context.Peer_Bonded);
+
+ for (int loop=0;loop<10;loop++) /* */
+ {
+ /* hci_disconnection_complete_event event will be generated when the link is disconnected.
+ It is important to leave an 100 ms blank window before sending any new command (including system hardware reset),
+ since immediately after @ref hci_disconnection_complete_event event, system could save important information in non volatile memory. */
+ int cnt = 1000000;
+ while(cnt--);
+ printf(".\n\r");
+ }
+
+ status = aci_gap_terminate(ancs_context.connection_handle, 0x13);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ ANCS_Client_Reset();
+ gap_cmd_resp_release(0);
+ }
+ }
+ }
+ else if(ancs_context.Peer_Bonded == 0x01)
+ {
+ if( (ancs_context.Security_Mode == 0x01) && (ancs_context.Security_Level == 0x01) )
+ {
+ if( (Security_Mode == 0x01) && (Security_Level >= 0x02) )
+ {
+ APP_DBG_MSG("ANCS_PAIRING_COMPLETE Security_Level=%d ==> Security_Level=%d \n\r",ancs_context.Security_Level,Security_Level);
+ ancs_context.Security_Level = Security_Level;
+ ancs_context.Security_Mode = Security_Mode;
+ }
+ }
+
+ if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ gap_cmd_resp_release(0);
+ }
+ }
+ break; /* ANCS_PAIRING_COMPLETE */
+
+ case ANCS_ALLOW_REBOND:
+ {
+ ancs_context.state = ANCS_ALLOW_REBOND;
+ APP_DBG_MSG("ANCS_ALLOW_REBOND \n\r");
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_MTU_UPDATE:
+ {
+ APP_DBG_MSG("ANCS_MTU_UPDATE \n\r");
+ ancs_context.state = ANCS_MTU_UPDATE;
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_MTU_EXCHANGE_COMPLETE:
+ {
+ APP_DBG_MSG("ANCS_MTU_EXCHANGE_COMPLETE \n\r");
+ if(ancs_context.state == ANCS_MTU_UPDATE)
+ gatt_cmd_resp_release(0);
+
+ ancs_context.state = ANCS_MTU_EXCHANGE_COMPLETE;
+ }
+ break;
+
+ case ANCS_DISCOVER_ANCS_SERVICE:
+ {
+ APP_DBG_MSG("ANCS_DISCOVER_ANCS_SERVICE \n\r");
+ ancs_context.state = ANCS_DISCOVER_ANCS_SERVICE;
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_CHECK_NOTIFICATION:
+ {
+ ancs_context.state = ANCS_CHECK_NOTIFICATION;
+ APP_DBG_MSG(" ==> ANCS_CHECK_NOTIFICATION \n\r");
+
+ for (uint8_t idx=0; idx<MAX_NMB_NOTIFY; idx++)
+ {
+ if (ancs_context.notifyList[idx].used)
+ {
+ ANCS_Notification_Check(ancs_context.notifyList[idx].evFlag);
+ Ancs_Mgr();
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.h
new file mode 100644
index 000000000..3a079463b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.h
@@ -0,0 +1,288 @@
+
+/**
+ ******************************************************************************
+ * @file ancs_client_app.h
+ * @author MCD Application Team
+ * @brief Header for ancs_client_app.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __ANCS_APPLICATION_H
+#define __ANCS_APPLICATION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ *@addtogroup ANCS ANCS
+ *@brief ANCS Profile.
+ *@{
+ */
+
+/**
+ *@defgroup ANCS_defines ANCS defines
+ *@brief List of constant used in the ANCS.
+ *@{
+ */
+
+/**
+ * @anchor CategoryIDs
+ * @name Category ID values
+ * @{
+ */
+typedef enum {
+ CategoryIDOther = 0,
+ CategoryIDIncomingCall = 1,
+ CategoryIDMissedCall = 2,
+ CategoryIDVoicemail = 3,
+ CategoryIDSocial = 4,
+ CategoryIDSchedule = 5,
+ CategoryIDEmail = 6,
+ CategoryIDNews = 7,
+ CategoryIDHealthAndFitness = 8,
+ CategoryIDBusinessAndFinance = 9,
+ CategoryIDLocation = 10,
+ CategoryIDEntertainment = 11,
+} CategoryID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor EventIDs
+ * @name Event ID values
+ * @{
+ */
+typedef enum {
+ EventIDNotificationAdded = 0,
+ EventIDNotificationModified = 1,
+ EventIDNotificationRemoved = 2,
+} EventID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor EventFlags
+ * @name Event Flag values
+ * @{
+ */
+typedef enum {
+ EventFlagSilent = (1 << 0),
+ EventFlagImportant = (1 << 1),
+ EventFlagPreExisting = (1 << 2),
+ EventFlagPositiveAction = (1 << 3),
+ EventFlagNegativeAction = (1 << 4),
+} EventFlags;
+/**
+ * @}
+ */
+
+/**
+ * @anchor CommandIDs to control point characteristic commands
+ * @name Command ID values
+ * @{
+ */
+typedef enum {
+ CommandIDGetNotificationAttributes = 0,
+ CommandIDGetAppAttributes = 1,
+ CommandIDPerformNotificationAction = 2,
+} CommandID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor NotificationAttributeIDs for Get Notification Attribute command
+ * @name Notification Attribute ID values for Get notifications attributes command
+ * @{
+ */
+typedef enum {
+ NotificationAttributeIDAppIdentifier = 0,
+ NotificationAttributeIDTitle = 1,
+ NotificationAttributeIDSubtitle = 2,
+ NotificationAttributeIDMessage = 3,
+ NotificationAttributeIDMessageSize = 4,
+ NotificationAttributeIDDate = 5,
+ NotificationAttributeIDPositiveActionLabel = 6,
+ NotificationAttributeIDNegativeActionLabel = 7,
+} NotificationAttributeID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor ActionIDs
+ * @name Action ID values
+ * @{
+ */
+typedef enum {
+ ActionIDPositive = 0,
+ ActionIDNegative = 1,
+}ActionID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor AppAttributeIDs for Get App Attribute command
+ * @name App Attribute ID values
+ * @{
+ */
+typedef enum {
+ AppAttributeIDDisplayName = 0,
+} AppAttributeID;
+/**
+ * @}
+ */
+
+
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ *@defgroup ANCS_NotifType ANCS Notification Attribute Types
+ *@brief ANCS notification attributes types.
+ *@{
+ */
+
+/**
+ * @anchor notificationAttrS
+ * @name Notification Attributes typedef
+ * @{
+ */
+typedef struct notificationAttrS {
+ /** A 32-bit numerical value that is the unique identifier (UID) for the iOS notification. This
+ * value can be used as a handle in commands sent to the Control Point characteristic to interact with the
+ * iOS notification.
+ */
+ uint32_t UID;
+ /** App Identifer flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t appID_flag;
+ /** Title flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t title_flag;
+ /** Max title length parameter */
+ uint16_t title_max_size;
+ /** Subtitle flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t subtitle_flag;
+ /** Max Subtitle length paramter */
+ uint16_t subtitle_max_size;
+ /** Message flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t message_flag;
+ /** Max Message length parameter */
+ uint16_t message_max_size;
+ /** Message size flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t messageSize_flag;
+ /** Data flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t date_flag;
+ /** Positive Action flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t positiveAction_flag;
+ /** Negative Action flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t negativeAction_flag;
+} notificationAttr_type;
+/**
+ * @}
+ */
+
+/*-------------------------------------------------------------------------*/
+ /**
+ * Data Transfer structure (ie. Connection events state)
+ */
+
+ typedef enum
+{
+ ANCS_UNINITIALIZED = 0x00,
+ ANCS_INITIALIZED = 0x01,
+
+ ANCS_IDLE,
+ ANCS_CONNECTED, /* Connection_Evt: ANCS_CONNECTION_ESTABLISHED */
+ ANCS_DISCONNECTING, /* Connection_Evt */
+ ANCS_DISCONN_COMPLETE, /* Connection_Evt */
+
+ ANCS_SET_DATA_LENGTH, /* Connection_Evt */
+ ANCS_MTU_UPDATE, /* Connection_Evt */
+ ANCS_MTU_EXCHANGE_COMPLETE, /* Connection_Evt */
+
+ ANCS_SECURITY_REQUEST,
+ ANCS_SECURITY_INITIATED,
+ ANCS_ALLOW_REBOND,
+ ANCS_PAIRING_COMPLETE, /* Connection_Evt */
+
+ ANCS_PASS_KEY_REQUEST, /* Connection_Evt: ANCS_PASSKEY_REQ_EVT */
+ ANCS_PASS_KEY_RESPONSE,
+
+ ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM,
+
+ ANCS_DISCOVER_ALL_SERVICES,
+ ANCS_DISCOVER_ANCS_SERVICE,
+ ANCS_DISCOVER_ALL_CHARS,
+ ANCS_DISCOVER_ALL_CHAR_DESCS,
+ ANCS_ENABLE_NOTIFICATION_NOTIFICATION_SOURCE_DESC,
+ ANCS_ENABLE_NOTIFICATION_DATA_SOURCE_DESC,
+ ANCS_ENABLE_NOTIFICATION_SERVICE_CHANGED_DESC,
+
+ ANCS_GET_NOTIFICATION_ATTRIBUTE,
+ ANCS_GET_APP_ATTRIBUTE,
+ ANCS_PERFORM_NOTIFICATION_ACTION,
+ ANCS_CHECK_NOTIFICATION,
+
+} ANCS_ProfileState;
+
+typedef struct
+{
+ /**
+ * state of the Data Transfer (state machine)
+ */
+
+ ANCS_ProfileState Evt_Opcode;
+ /**
+ * connection handle
+ */
+ uint16_t connection_handle;
+
+} Connection_Context_t;
+
+/*-------------------------------------------------------------------------*/
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+
+void ANCS_Client_App_Init(void);
+void ANCS_App_KeyButton1Action(void);
+void ANCS_App_KeyButton2Action(void);
+void ANCS_App_KeyButton3Action(void);
+void ANCS_App_Peer_Bonded_Check(uint16_t Connection_Handle, uint8_t Peer_Address_Type, uint8_t Peer_Address[6]);
+void ANCS_App_Notification( Connection_Context_t *pNotification );
+void ANCS_App_Remove_Bonding_Info(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__ANCS_APPLICATION_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..aed2699f3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1183 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.c
+ * @author MCD Application Team
+ * @brief BLE Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+
+
+#include "cmsis_os.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+#include "dis_app.h"
+#include "hrs_app.h"
+#include "ancs_client_app.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+
+/**
+ * security parameters structure
+ */
+typedef struct _tSecurityParams
+{
+ /**
+ * IO capability of the device
+ */
+ uint8_t ioCapability;
+
+ /**
+ * Authentication requirement of the device
+ * Man In the Middle protection required?
+ */
+ uint8_t mitm_mode;
+
+ /**
+ * bonding mode of the device
+ */
+ uint8_t bonding_mode;
+
+ /**
+ * Flag to tell whether OOB data has
+ * to be used during the pairing process
+ */
+ uint8_t OOB_Data_Present;
+
+ /**
+ * OOB data to be used in the pairing process if
+ * OOB_Data_Present is set to TRUE
+ */
+ uint8_t OOB_Data[16];
+
+ /**
+ * this variable indicates whether to use a fixed pin
+ * during the pairing process or a passkey has to be
+ * requested to the application during the pairing process
+ * 0 implies use fixed pin and 1 implies request for passkey
+ */
+ uint8_t Use_Fixed_Pin;
+
+ /**
+ * minimum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMin;
+
+ /**
+ * maximum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMax;
+
+ /**
+ * fixed pin to be used in the pairing process if
+ * Use_Fixed_Pin is set to 1
+ */
+ uint32_t Fixed_Pin;
+
+ /**
+ * this flag indicates whether the host has to initiate
+ * the security, wait for pairing or does not have any security
+ * requirements.\n
+ * 0x00 : no security required
+ * 0x01 : host should initiate security by sending the slave security
+ * request command
+ * 0x02 : host need not send the clave security request but it
+ * has to wait for paiirng to complete before doing any other
+ * processing
+ */
+ uint8_t initiateSecurity;
+}tSecurityParams;
+
+/**
+ * global context
+ * contains the variables common to all
+ * services
+ */
+typedef struct _tBLEProfileGlobalContext
+{
+
+ /**
+ * security requirements of the host
+ */
+ tSecurityParams bleSecurityParam;
+
+ /**
+ * gap service handle
+ */
+ uint16_t gapServiceHandle;
+
+ /**
+ * device name characteristic handle
+ */
+ uint16_t devNameCharHandle;
+
+ /**
+ * appearance characteristic handle
+ */
+ uint16_t appearanceCharHandle;
+
+ /**
+ * connection handle of the current active connection
+ * When not in connection, the handle is set to 0xFFFF
+ */
+ uint16_t connectionHandle;
+
+ /**
+ * length of the UUID list to be used while advertising
+ */
+ uint8_t advtServUUIDlen;
+
+ /**
+ * the UUID list to be used while advertising
+ */
+ uint8_t advtServUUID[100];
+
+}BleGlobalContext_t;
+
+typedef struct
+{
+ BleGlobalContext_t BleApplicationContext_legacy;
+ APP_BLE_ConnStatus_t Device_Connection_Status;
+ uint16_t connection_handle;
+ uint8_t Peer_Bonded;
+ uint8_t Peer_Address_Type;
+ uint8_t Peer_Address[6];
+ /**
+ * ID of the Advertising Timeout
+ */
+ uint8_t Advertising_mgr_timer_Id;
+
+}BleApplicationContext_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define APPBLE_GAP_DEVICE_NAME_LENGTH 7
+#define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
+#define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
+
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* USER CODE BEGIN PD */
+#define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
+
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+ {
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+ };
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
+
+/**
+ * These are the two tags used to manage a power failure during OTA
+ * The MagicKeywordAdress shall be mapped @0x140 from start of the binary image
+ * The MagicKeywordvalue is checked in the ble_ota application
+ */
+PLACE_IN_SECTION("TAG_OTA_END") const uint32_t MagicKeywordValue = 0x94448A29 ;
+PLACE_IN_SECTION("TAG_OTA_START") const uint32_t MagicKeywordAddress = (uint32_t)&MagicKeywordValue;
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static uint16_t AdvIntervalMin, AdvIntervalMax;
+
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME ,'H','R','a','n','c'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ 0x00 /* Generic*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+
+};
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Global variables ----------------------------------------------------------*/
+osMutexId_t MtxHciId;
+osSemaphoreId_t SemHciId;
+osThreadId_t AdvUpdateProcessId;
+osThreadId_t HciUserEvtProcessId;
+
+const osThreadAttr_t AdvUpdateProcess_attr = {
+ .name = CFG_ADV_UPDATE_PROCESS_NAME,
+ .attr_bits = CFG_ADV_UPDATE_PROCESS_ATTR_BITS,
+ .cb_mem = CFG_ADV_UPDATE_PROCESS_CB_MEM,
+ .cb_size = CFG_ADV_UPDATE_PROCESS_CB_SIZE,
+ .stack_mem = CFG_ADV_UPDATE_PROCESS_STACK_MEM,
+ .priority = CFG_ADV_UPDATE_PROCESS_PRIORITY,
+ .stack_size = CFG_ADV_UPDATE_PROCESS_STACK_SIZE
+};
+
+const osThreadAttr_t HciUserEvtProcess_attr = {
+ .name = CFG_HCI_USER_EVT_PROCESS_NAME,
+ .attr_bits = CFG_HCI_USER_EVT_PROCESS_ATTR_BITS,
+ .cb_mem = CFG_HCI_USER_EVT_PROCESS_CB_MEM,
+ .cb_size = CFG_HCI_USER_EVT_PROCESS_CB_SIZE,
+ .stack_mem = CFG_HCI_USER_EVT_PROCESS_STACK_MEM,
+ .priority = CFG_HCI_USER_EVT_PROCESS_PRIORITY,
+ .stack_size = CFG_HCI_USER_EVT_PROCESS_STACK_SIZE
+};
+
+/* Private function prototypes -----------------------------------------------*/
+
+static void HciUserEvtProcess(void *argument);
+
+static void BLE_UserEvtRx( void * pPayload );
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
+static void Ble_Tl_Init( void );
+static void Ble_Hci_Gap_Gatt_Init(void);
+static const uint8_t* BleGetBdAddress( void );
+static void Adv_Request( APP_BLE_ConnStatus_t New_Status );
+static void Add_Advertisment_Service_UUID( uint16_t servUUID );
+static void Adv_Mgr( void );
+
+static void AdvUpdateProcess(void *argument);
+
+static void Adv_Update( void );
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init_1 */
+
+/* USER CODE END APP_BLE_Init_1 */
+ SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet =
+ {
+ {{0,0,0}}, /**< Header unused */
+ {0, /** pBleBufferAddress not used */
+ 0, /** BleBufferSize not used */
+ CFG_BLE_NUM_GATT_ATTRIBUTES,
+ CFG_BLE_NUM_GATT_SERVICES,
+ CFG_BLE_ATT_VALUE_ARRAY_SIZE,
+ CFG_BLE_NUM_LINK,
+ CFG_BLE_DATA_LENGTH_EXTENSION,
+ CFG_BLE_PREPARE_WRITE_LIST_SIZE,
+ CFG_BLE_MBLOCK_COUNT,
+ CFG_BLE_MAX_ATT_MTU,
+ CFG_BLE_SLAVE_SCA,
+ CFG_BLE_MASTER_SCA,
+ CFG_BLE_LSE_SOURCE,
+ CFG_BLE_MAX_CONN_EVENT_LENGTH,
+ CFG_BLE_HSE_STARTUP_TIME,
+ CFG_BLE_VITERBI_MODE,
+ CFG_BLE_LL_ONLY,
+ 0}
+ };
+
+ /**
+ * Initialize Ble Transport Layer
+ */
+ Ble_Tl_Init( );
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+
+ /**
+ * Register the hci transport layer to handle BLE User Asynchronous Events
+ */
+ HciUserEvtProcessId = osThreadNew(HciUserEvtProcess, NULL, &HciUserEvtProcess_attr);
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ /**
+ * Initialization of HCI & GATT & GAP layer
+ */
+ Ble_Hci_Gap_Gatt_Init();
+
+ /**
+ * Initialization of the BLE Services
+ */
+ SVCCTL_Init();
+
+ /**
+ * Initialization of the BLE App Context
+ */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
+ /**
+ * From here, all initialization are BLE application specific
+ */
+
+ AdvUpdateProcessId = osThreadNew(AdvUpdateProcess, NULL, &AdvUpdateProcess_attr);
+
+ /**
+ * Initialization of ADV - Ad Manufacturer Element - Support OTA Bit Mask
+ */
+#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
+ manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
+#endif
+ /**
+ * Initialize DIS Application
+ */
+ DISAPP_Init();
+
+ /**
+ * Initialize HRS Application
+ */
+ HRSAPP_Init();
+
+ /**
+ * Initialize ANCS Application
+ */
+ ANCS_Client_App_Init();
+
+ /**
+ * Create timer to handle the connection state machine
+ */
+
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(BleApplicationContext.Advertising_mgr_timer_Id), hw_ts_SingleShot, Adv_Mgr);
+
+ /**
+ * Make device discoverable
+ */
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[0] = AD_TYPE_16_BIT_SERV_UUID;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen = 1;
+ Add_Advertisment_Service_UUID(HEART_RATE_SERVICE_UUID);
+ /* Initialize intervals for reconnexion without intervals update */
+ AdvIntervalMin = CFG_FAST_CONN_ADV_INTERVAL_MIN;
+ AdvIntervalMax = CFG_FAST_CONN_ADV_INTERVAL_MAX;
+
+ /**
+ * Start to Advertise to be connected by Collector
+ */
+ Adv_Request(APP_BLE_FAST_ADV);
+
+/* USER CODE BEGIN APP_BLE_Init_2 */
+
+/* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
+{
+ hci_event_pckt *event_pckt;
+ evt_le_meta_event *meta_evt;
+ evt_blue_aci *blue_evt;
+ hci_le_phy_update_complete_event_rp0 *evt_le_phy_update_complete;
+ uint8_t TX_PHY, RX_PHY;
+ tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
+ Connection_Context_t Notification;
+
+ event_pckt = (hci_event_pckt*) ((hci_uart_pckt *) pckt)->data;
+
+ switch (event_pckt->evt)
+ {
+ case EVT_DISCONN_COMPLETE:
+ {
+ hci_disconnection_complete_event_rp0 *disconnection_complete_event;
+ disconnection_complete_event = (hci_disconnection_complete_event_rp0 *) event_pckt->data;
+
+ if (disconnection_complete_event->Connection_Handle == BleApplicationContext.BleApplicationContext_legacy.connectionHandle)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0;
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+
+ if(disconnection_complete_event->Reason == ERR_CMD_SUCCESS){
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X sucess \n\r",disconnection_complete_event->Reason);
+ }else if(disconnection_complete_event->Reason == HCI_CONNECTION_TERMINATED_BY_LOCAL_HOST_ERR_CODE){
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X Connection terminated by local host \n\r",disconnection_complete_event->Reason);
+ }else if(disconnection_complete_event->Reason == HCI_CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE_ERR_CODE){
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X Connection terminated due to MIC failure \n\r",disconnection_complete_event->Reason);
+ ANCS_App_Remove_Bonding_Info();
+ }else{
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X \n\r",disconnection_complete_event->Reason);
+ }
+
+ Notification.Evt_Opcode = ANCS_DISCONN_COMPLETE;
+ Notification.connection_handle = disconnection_complete_event->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+
+ /* restart advertising */
+ Adv_Request(APP_BLE_FAST_ADV);
+ /* USER CODE BEGIN EVT_DISCONN_COMPLETE */
+
+ /* USER CODE END EVT_DISCONN_COMPLETE */
+ }
+
+ break; /* EVT_DISCONN_COMPLETE */
+
+ case EVT_LE_META_EVENT:
+ {
+ meta_evt = (evt_le_meta_event*) event_pckt->data;
+ /* USER CODE BEGIN EVT_LE_META_EVENT */
+
+ /* USER CODE END EVT_LE_META_EVENT */
+ switch (meta_evt->subevent)
+ {
+ case EVT_LE_CONN_UPDATE_COMPLETE:
+ {
+ APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \n");
+
+ /* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
+ hci_le_connection_update_complete_event_rp0 *connection_update_complete = (hci_le_connection_update_complete_event_rp0 *) meta_evt->data;
+ APP_DBG_MSG("EVT_LE_CONN_UPDATE_COMPLETE Status=0x%02X Connection_Handle=0x%04X Conn_Interval=0x%04X Conn_Latency=0x%04X Supervision_Timeout=0x%04X \n\r",
+ connection_update_complete->Status,connection_update_complete->Connection_Handle,connection_update_complete->Conn_Interval,connection_update_complete->Conn_Latency,connection_update_complete->Supervision_Timeout);
+ /* USER CODE END EVT_LE_CONN_UPDATE_COMPLETE */
+ }
+ break;
+ case EVT_LE_PHY_UPDATE_COMPLETE:
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE \n");
+ evt_le_phy_update_complete = (hci_le_phy_update_complete_event_rp0*)meta_evt->data;
+ if (evt_le_phy_update_complete->Status == 0)
+ {
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status ok \n");
+ }
+ else
+ {
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \n");
+ }
+
+ ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Read_PHY success \n");
+
+ if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ else
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ }
+ else
+ {
+ APP_DBG_MSG("Read conf not succeess \n");
+ }
+ /* USER CODE BEGIN EVT_LE_PHY_UPDATE_COMPLETE */
+
+ /* USER CODE END EVT_LE_PHY_UPDATE_COMPLETE */
+ break;
+ case EVT_LE_CONN_COMPLETE:
+ {
+ hci_le_connection_complete_event_rp0 *connection_complete_event;
+
+ /**
+ * The connection is done, there is no need anymore to schedule the LP ADV
+ */
+ connection_complete_event = (hci_le_connection_complete_event_rp0 *) meta_evt->data;
+
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+
+ if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
+ {
+ /* Connection as client */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
+ }
+ else
+ {
+ /* Connection as server */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
+ }
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = connection_complete_event->Connection_Handle;
+ /* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */
+ APP_DBG_MSG("EVT_LE_CONN_COMPLETE Connection_Handle=0x%04X Role=%d Peer_Address_Type=%d Peer_Address:%02X %02X %02X %02X %02X %02X \n\r",
+ connection_complete_event->Connection_Handle,
+ connection_complete_event->Role,
+ connection_complete_event->Peer_Address_Type,
+ connection_complete_event->Peer_Address[5],
+ connection_complete_event->Peer_Address[4],
+ connection_complete_event->Peer_Address[3],
+ connection_complete_event->Peer_Address[2],
+ connection_complete_event->Peer_Address[1],
+ connection_complete_event->Peer_Address[0]);
+
+ BleApplicationContext.connection_handle = connection_complete_event->Connection_Handle;
+
+ BleApplicationContext.Peer_Address_Type = connection_complete_event->Peer_Address_Type;
+ BleApplicationContext.Peer_Address[5] = connection_complete_event->Peer_Address[5];
+ BleApplicationContext.Peer_Address[4] = connection_complete_event->Peer_Address[4];
+ BleApplicationContext.Peer_Address[3] = connection_complete_event->Peer_Address[3];
+ BleApplicationContext.Peer_Address[2] = connection_complete_event->Peer_Address[2];
+ BleApplicationContext.Peer_Address[1] = connection_complete_event->Peer_Address[1];
+ BleApplicationContext.Peer_Address[0] = connection_complete_event->Peer_Address[0];
+ ANCS_App_Peer_Bonded_Check(connection_complete_event->Connection_Handle, connection_complete_event->Peer_Address_Type, connection_complete_event->Peer_Address);
+
+ Notification.Evt_Opcode = ANCS_CONNECTED;
+ Notification.connection_handle = connection_complete_event->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ /* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
+ }
+ break; /* HCI_EVT_LE_CONN_COMPLETE */
+
+ default:
+ /* USER CODE BEGIN SUBEVENT_DEFAULT */
+
+ /* USER CODE END SUBEVENT_DEFAULT */
+ break;
+ }
+ }
+ break; /* HCI_EVT_LE_META_EVENT */
+
+ case EVT_VENDOR:
+ blue_evt = (evt_blue_aci*) event_pckt->data;
+ /* USER CODE BEGIN EVT_VENDOR */
+
+ /* USER CODE END EVT_VENDOR */
+ switch (blue_evt->ecode)
+ {
+ /* USER CODE BEGIN ecode */
+ aci_gap_pairing_complete_event_rp0 *pairing_complete;
+
+ case EVT_BLUE_GAP_LIMITED_DISCOVERABLE:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_LIMITED_DISCOVERABLE \n");
+ break; /* EVT_BLUE_GAP_LIMITED_DISCOVERABLE */
+
+ case EVT_BLUE_GAP_PASS_KEY_REQUEST:
+ {
+ aci_gap_pass_key_req_event_rp0 *gap_evt_pass_key_req = (aci_gap_pass_key_req_event_rp0*) blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_GAP_PASS_KEY_REQUEST ==> ANCS_PASS_KEY_REQUEST Connection_Handle=0x%04X \n\r",gap_evt_pass_key_req->Connection_Handle);
+ Notification.Evt_Opcode = ANCS_PASS_KEY_REQUEST;
+ Notification.connection_handle= gap_evt_pass_key_req->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+ break; /* EVT_BLUE_GAP_PASS_KEY_REQUEST */
+
+ case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_AUTHORIZATION_REQUEST \n");
+ break; /* EVT_BLUE_GAP_AUTHORIZATION_REQUEST */
+
+ case EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED:
+ {
+ APP_DBG_MSG("EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED slave security request is successfully sent to the master => ANCS_SECURITY_INITIATED \n");
+ Notification.Evt_Opcode = ANCS_SECURITY_INITIATED;
+ Notification.connection_handle= BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ ANCS_App_Notification(&Notification);
+ }
+ break; /* EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
+
+ case EVT_BLUE_GAP_BOND_LOST:
+ {
+ APP_DBG_MSG("EVT_BLUE_GAP_BOND_LOST ==> ANCS_ALLOW_REBOND \n\r");
+ Notification.Evt_Opcode = ANCS_ALLOW_REBOND;
+ Notification.connection_handle= BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ ANCS_App_Notification(&Notification);
+ }
+ break; /* EVT_BLUE_GAP_BOND_LOST */
+
+ case EVT_BLUE_GAP_DEVICE_FOUND:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
+ break; /* EVT_BLUE_GAP_DEVICE_FOUND */
+
+ case EVT_BLUE_GAP_ADDR_NOT_RESOLVED:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
+ break; /* EVT_BLUE_GAP_DEVICE_FOUND */
+
+ case (EVT_BLUE_GAP_KEYPRESS_NOTIFICATION):
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_KEYPRESS_NOTIFICATION \n");
+ break; /* EVT_BLUE_GAP_KEY_PRESS_NOTIFICATION */
+
+ case (EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE):
+ {
+ APP_DBG_MSG(" numeric_value = %d\n", ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
+ APP_DBG_MSG(" Hex_value = %x\n", ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
+
+ APP_DBG_MSG("EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE ==> ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM \n\r");
+ Notification.Evt_Opcode = ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM;
+ Notification.connection_handle= BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ ANCS_App_Notification(&Notification);
+ }
+ break;
+
+ case (EVT_BLUE_GAP_PAIRING_CMPLT):
+ {
+ pairing_complete = (aci_gap_pairing_complete_event_rp0*)blue_evt->data;
+
+ APP_DBG_MSG("EVT_BLUE_GAP_PAIRING_CMPLT, Connection_Handle=0x%04X Status=%d Reason=0x%02x \n",pairing_complete->Connection_Handle,pairing_complete->Status,pairing_complete->Reason);
+ if(pairing_complete->Status == SM_PAIRING_SUCCESS){
+ APP_DBG_MSG(" ** Pairing OK \n");
+ }else if(pairing_complete->Status == SM_PAIRING_TIMEOUT){
+ APP_DBG_MSG(" ** Pairing Timeout Status=%d Reason=0x%02x , \n\r !!! Please ignore this BLE Device on the iOS/Android Device Setting=>Bluetooth=>My Device or Paired Device !!! \n\r",pairing_complete->Status,pairing_complete->Reason);
+ ANCS_App_Remove_Bonding_Info();
+ }else if(pairing_complete->Status == SM_PAIRING_FAILED){
+ APP_DBG_MSG(" ** Pairing KO Status=%d Reason=0x%02x , \n\r !!! Please ignore this BLE Device on the iOS/Android Device Setting=>Bluetooth=>My Device or Paired Device !!! \n\r",pairing_complete->Status,pairing_complete->Reason);
+ ANCS_App_Remove_Bonding_Info();
+ }
+
+ APP_DBG_MSG("EVT_BLUE_GAP_PAIRING_CMPLT ==> ANCS_PAIRING_COMPLETE \n\r");
+ Notification.Evt_Opcode = ANCS_PAIRING_COMPLETE;
+ Notification.connection_handle= pairing_complete->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+ break;
+
+ case EVT_BLUE_GATT_PROCEDURE_COMPLETE:
+ APP_DBG_MSG(" ** EVT_BLUE_GATT_PROCEDURE_COMPLETE \n");
+ /* USER CODE BEGIN EVT_BLUE_GATT_PROCEDURE_COMPLETE */
+
+ /* USER CODE END EVT_BLUE_GATT_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GATT_PROCEDURE_COMPLETE */
+ /* USER CODE END ecode */
+ case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PROCEDURE_COMPLETE \n");
+ /* USER CODE BEGIN EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+
+ /* USER CODE END EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ }
+ break; /* EVT_VENDOR */
+
+ default:
+ /* USER CODE BEGIN ECODE_DEFAULT*/
+
+ /* USER CODE END ECODE_DEFAULT*/
+ break;
+ }
+
+ return (SVCCTL_UserEvtFlowEnable);
+}
+
+APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void)
+{
+ return BleApplicationContext.Device_Connection_Status;
+}
+
+/* USER CODE BEGIN FD*/
+void APP_BLE_Key_Button1_Action(void)
+{
+ ANCS_App_KeyButton1Action();
+}
+
+void APP_BLE_Key_Button2_Action(void)
+{
+ ANCS_App_KeyButton2Action();
+}
+
+void APP_BLE_Key_Button3_Action(void)
+{
+ ANCS_App_KeyButton3Action();
+}
+
+/* USER CODE END FD*/
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Ble_Tl_Init( void )
+{
+ HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
+
+ MtxHciId = osMutexNew( NULL );
+ SemHciId = osSemaphoreNew( 1, 0, NULL ); /*< Create the semaphore and make it busy at initialization */
+
+ Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
+ Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
+ hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
+
+ return;
+}
+
+static void Ble_Hci_Gap_Gatt_Init(void){
+
+ uint8_t role;
+ uint8_t index;
+ uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
+ const uint8_t *bd_addr;
+ uint32_t srd_bd_addr[2];
+ uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
+
+ /**
+ * Initialize HCI layer
+ */
+ /*HCI Reset to synchronise BLE Stack*/
+ hci_reset();
+
+ /**
+ * Write the BD Address
+ */
+
+ bd_addr = BleGetBdAddress();
+ aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
+ CONFIG_DATA_PUBADDR_LEN,
+ (uint8_t*) bd_addr);
+
+ /* BLE MAC in ADV Packet */
+ manuf_data[ sizeof(manuf_data)-6] = bd_addr[5];
+ manuf_data[ sizeof(manuf_data)-5] = bd_addr[4];
+ manuf_data[ sizeof(manuf_data)-4] = bd_addr[3];
+ manuf_data[ sizeof(manuf_data)-3] = bd_addr[2];
+ manuf_data[ sizeof(manuf_data)-2] = bd_addr[1];
+ manuf_data[ sizeof(manuf_data)-1] = bd_addr[0];
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data(CONFIG_DATA_IR_OFFSET,
+ CONFIG_DATA_IR_LEN,
+ (uint8_t*) BLE_CFG_IR_VALUE);
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data(CONFIG_DATA_ER_OFFSET,
+ CONFIG_DATA_ER_LEN,
+ (uint8_t*) BLE_CFG_ER_VALUE);
+
+ /**
+ * Write random bd_address
+ */
+ /* random_bd_address = R_bd_address;
+ aci_hal_write_config_data(CONFIG_DATA_RANDOM_ADDRESS_WR,
+ CONFIG_DATA_RANDOM_ADDRESS_LEN,
+ (uint8_t*) random_bd_address);
+ */
+
+ /**
+ * Static random Address
+ * The two upper bits shall be set to 1
+ * The lowest 32bits is read from the UDN to differentiate between devices
+ * The RNG may be used to provide a random number on each power on
+ */
+ srd_bd_addr[1] = 0x0000ED6E;
+ srd_bd_addr[0] = LL_FLASH_GetUDN( );
+ aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
+
+ /**
+ * Set TX Power to 0dBm.
+ */
+ aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+
+ /**
+ * Initialize GATT interface
+ */
+ aci_gatt_init();
+
+ /**
+ * Initialize GAP interface
+ */
+ role = 0;
+
+#if (BLE_CFG_PERIPHERAL == 1)
+ role |= GAP_PERIPHERAL_ROLE;
+#endif
+
+#if (BLE_CFG_CENTRAL == 1)
+ role |= GAP_CENTRAL_ROLE;
+#endif
+
+ if (role > 0)
+ {
+ const char *name = "HRanc";
+ aci_gap_init(role, 0,
+ APPBLE_GAP_DEVICE_NAME_LENGTH,
+ &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
+
+ if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
+ {
+ BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
+ }
+ }
+
+ if(aci_gatt_update_char_value(gap_service_handle,
+ gap_appearance_char_handle,
+ 0,
+ 2,
+ (uint8_t *)&appearance))
+ {
+ BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
+ }
+/**
+ * Initialize Default PHY
+ */
+ hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
+
+ /**
+ * Initialize IO capability
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
+ aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
+
+ /**
+ * Initialize authentication
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = CFG_OOB_DATA_PRESENT;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = CFG_ENCRYPTION_KEY_SIZE_MIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = CFG_ENCRYPTION_KEY_SIZE_MAX;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = CFG_USED_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = CFG_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = CFG_BONDING_MODE;
+ for (index = 0; index < 16; index++)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
+ }
+
+ aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
+ CFG_SC_SUPPORT,
+ CFG_KEYPRESS_NOTIFICATION_SUPPORT,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
+ CFG_IDENTITY_ADDRESS_TYPE
+ );
+
+ /**
+ * Initialize whitelist
+ */
+ if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
+ {
+ aci_gap_configure_whitelist();
+ }
+}
+
+static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
+{
+ tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
+ uint16_t Min_Inter, Max_Inter;
+
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ Min_Inter = AdvIntervalMin;
+ Max_Inter = AdvIntervalMax;
+ }
+ else
+ {
+ Min_Inter = CFG_LP_CONN_ADV_INTERVAL_MIN;
+ Max_Inter = CFG_LP_CONN_ADV_INTERVAL_MAX;
+ }
+
+ /**
+ * Stop the timer, it will be restarted for a new shot
+ * It does not hurt if the timer was not running
+ */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+
+ APP_DBG_MSG("First index in %d state \n", BleApplicationContext.Device_Connection_Status);
+
+ if ((New_Status == APP_BLE_LP_ADV)
+ && ((BleApplicationContext.Device_Connection_Status == APP_BLE_FAST_ADV)
+ || (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_ADV)))
+ {
+ /* Connection in ADVERTISE mode have to stop the current advertising */
+ ret = aci_gap_set_non_discoverable();
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Successfully Stopped Advertising \n");
+ }
+ else
+ {
+ APP_DBG_MSG("Stop Advertising Failed , result: %d \n", ret);
+ }
+ }
+
+
+ BleApplicationContext.Device_Connection_Status = New_Status;
+ /* Start Fast or Low Power Advertising */
+ ret = aci_gap_set_discoverable(
+ ADV_IND,
+ Min_Inter,
+ Max_Inter,
+ PUBLIC_ADDR,
+ NO_WHITE_LIST_USE, /* use white list */
+ sizeof(local_name),
+ (uint8_t*) &local_name,
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen,
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID,
+ 0,
+ 0);
+
+
+ /* Update Advertising data */
+ ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Successfully Start Fast Advertising \n" );
+ /* Start Timer to STOP ADV - TIMEOUT */
+ HW_TS_Start(BleApplicationContext.Advertising_mgr_timer_Id, INITIAL_ADV_TIMEOUT);
+ }
+ else
+ {
+ APP_DBG_MSG("Successfully Start Low Power Advertising \n");
+ }
+ }
+ else
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Start Fast Advertising Failed , result:0x%02x \n", ret);
+ }
+ else
+ {
+ APP_DBG_MSG("Start Low Power Advertising Failed , result: 0x%02x \n", ret);
+ }
+ }
+
+ return;
+}
+
+const uint8_t* BleGetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTION */
+
+/* USER CODE END FD_LOCAL_FUNCTION */
+
+/*************************************************************
+ *
+ *SPECIFIC FUNCTIONS
+ *
+ *************************************************************/
+static void Add_Advertisment_Service_UUID( uint16_t servUUID )
+{
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen] =
+ (uint8_t) (servUUID & 0xFF);
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen++;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen] =
+ (uint8_t) (servUUID >> 8) & 0xFF;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen++;
+
+ return;
+}
+
+static void Adv_Mgr( void )
+{
+ /**
+ * The code shall be executed in the background as an aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+
+ osThreadFlagsSet( AdvUpdateProcessId, 1 );
+
+
+
+ return;
+}
+
+
+static void AdvUpdateProcess(void *argument)
+{
+ UNUSED(argument);
+
+ for(;;)
+ {
+ osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
+ Adv_Update( );
+ }
+}
+
+static void Adv_Update( void )
+{
+ Adv_Request(APP_BLE_LP_ADV);
+
+ return;
+}
+
+static void HciUserEvtProcess(void *argument)
+{
+ UNUSED(argument);
+
+ for(;;)
+ {
+ osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
+ hci_user_evt_proc( );
+ }
+}
+
+/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
+
+/* USER CODE END FD_SPECIFIC_FUNCTIONS */
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void hci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ osThreadFlagsSet( HciUserEvtProcessId, 1 );
+ return;
+}
+
+void hci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ osSemaphoreRelease( SemHciId );
+ return;
+}
+
+void hci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ osSemaphoreAcquire( SemHciId, osWaitForever );
+
+ return;
+}
+
+static void BLE_UserEvtRx( void * pPayload )
+{
+ SVCCTL_UserEvtFlowStatus_t svctl_return_status;
+ tHCI_UserEvtRxParam *pParam;
+
+ pParam = (tHCI_UserEvtRxParam *)pPayload;
+ svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
+ if (svctl_return_status != SVCCTL_UserEvtFlowDisable)
+ {
+ pParam->status = HCI_TL_UserEventFlow_Enable;
+ }
+ else
+ {
+ pParam->status = HCI_TL_UserEventFlow_Disable;
+ }
+}
+
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status )
+{
+
+ switch (status)
+ {
+ case HCI_TL_CmdBusy:
+
+ osMutexAcquire( MtxHciId, osWaitForever );
+
+
+ break;
+
+ case HCI_TL_CmdAvailable:
+
+ osMutexRelease( MtxHciId );
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+void SVCCTL_ResumeUserEventFlow( void )
+{
+ hci_resume_flow();
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..657ba432b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,88 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.h
+ * @author MCD Application Team
+ * @brief Header for ble application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_BLE_H
+#define APP_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "hci_tl.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+ typedef enum
+ {
+ APP_BLE_IDLE,
+ APP_BLE_FAST_ADV,
+ APP_BLE_LP_ADV,
+ APP_BLE_SCAN,
+ APP_BLE_LP_CONNECTING,
+ APP_BLE_CONNECTED_SERVER,
+ APP_BLE_CONNECTED_CLIENT
+ } APP_BLE_ConnStatus_t;
+
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APP_BLE_Init( void );
+
+ APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void);
+
+/* USER CODE BEGIN EF */
+void APP_BLE_Key_Button1_Action(void);
+void APP_BLE_Key_Button2_Action(void);
+void APP_BLE_Key_Button3_Action(void);
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*APP_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..d042af896
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_conf.h
@@ -0,0 +1,104 @@
+/**
+ ******************************************************************************
+ * File Name : App/ble_conf.h
+ * Description : Configuration file for BLE Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef BLE_CONF_H
+#define BLE_CONF_H
+
+#include "app_conf.h"
+
+/******************************************************************************
+ *
+ * BLE SERVICES CONFIGURATION
+ * blesvc
+ *
+ ******************************************************************************/
+
+ /**
+ * This setting shall be set to '1' if the device needs to support the Peripheral Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_PERIPHERAL 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Central Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_CENTRAL 0
+
+/**
+ * There is one handler per service enabled
+ * Note: There is no handler for the Device Information Service
+ *
+ * This shall take into account all registered handlers
+ * (from either the provided services or the custom services)
+ */
+#define BLE_CFG_SVC_MAX_NBR_CB 7
+
+#define BLE_CFG_CLT_MAX_NBR_CB 3
+
+/******************************************************************************
+ * Device Information Service (DIS)
+ ******************************************************************************/
+/**< Options: Supported(1) or Not Supported(0) */
+#define BLE_CFG_DIS_MANUFACTURER_NAME_STRING 1
+#define BLE_CFG_DIS_MODEL_NUMBER_STRING 0
+#define BLE_CFG_DIS_SERIAL_NUMBER_STRING 0
+#define BLE_CFG_DIS_HARDWARE_REVISION_STRING 0
+#define BLE_CFG_DIS_FIRMWARE_REVISION_STRING 0
+#define BLE_CFG_DIS_SOFTWARE_REVISION_STRING 0
+#define BLE_CFG_DIS_SYSTEM_ID 0
+#define BLE_CFG_DIS_IEEE_CERTIFICATION 0
+#define BLE_CFG_DIS_PNP_ID 0
+
+/**
+ * device information service characteristic lengths
+ */
+#define BLE_CFG_DIS_SYSTEM_ID_LEN_MAX (8)
+#define BLE_CFG_DIS_MODEL_NUMBER_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_SERIAL_NUMBER_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_FIRMWARE_REVISION_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_HARDWARE_REVISION_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_SOFTWARE_REVISION_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_MANUFACTURER_NAME_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_IEEE_CERTIFICATION_LEN_MAX (32)
+#define BLE_CFG_DIS_PNP_ID_LEN_MAX (7)
+
+/******************************************************************************
+ * Heart Rate Service (HRS)
+ ******************************************************************************/
+#define BLE_CFG_HRS_BODY_SENSOR_LOCATION_CHAR 1/**< BODY SENSOR LOCATION CHARACTERISTIC */
+#define BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG 1/**< ENERGY EXTENDED INFO FLAG */
+#define BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG 1/**< Max number of RR interval values - Shall not be greater than 9 */
+
+/******************************************************************************
+ * GAP Service - Apprearance
+ ******************************************************************************/
+
+#define BLE_CFG_UNKNOWN_APPEARANCE (0)
+#define BLE_CFG_HR_SENSOR_APPEARANCE (832)
+#define BLE_CFG_GAP_APPEARANCE (BLE_CFG_HR_SENSOR_APPEARANCE)
+
+/******************************************************************************
+ * Over The Air Feature (OTA) - STM Proprietary
+ ******************************************************************************/
+#define BLE_CFG_OTA_REBOOT_CHAR 0/**< REBOOT OTA MODE CHARACTERISTIC */
+
+#endif /*BLE_CONF_H */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..803855d69
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_dbg_conf.h
@@ -0,0 +1,199 @@
+/**
+ ******************************************************************************
+ * File Name : App/ble_dbg_conf.h
+ * Description : Debug configuration file for BLE Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_DBG_CONF_H
+#define __BLE_DBG_CONF_H
+
+/**
+ * Enable or Disable traces from BLE
+ */
+
+#define BLE_DBG_APP_EN 0
+#define BLE_DBG_DIS_EN 1
+#define BLE_DBG_HRS_EN 1
+#define BLE_DBG_SVCCTL_EN 1
+#define BLE_DBG_BLS_EN 0
+#define BLE_DBG_HTS_EN 0
+#define BLE_DBG_P2P_STM_EN 0
+
+/**
+ * Macro definition
+ */
+#if ( BLE_DBG_APP_EN != 0 )
+#define BLE_DBG_APP_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_APP_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_DIS_EN != 0 )
+#define BLE_DBG_DIS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_DIS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_HRS_EN != 0 )
+#define BLE_DBG_HRS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HRS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_P2P_STM_EN != 0 )
+#define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_TEMPLATE_STM_EN != 0 )
+#define BLE_DBG_TEMPLATE_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TEMPLATE_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_EDS_STM_EN != 0 )
+#define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_LBS_STM_EN != 0 )
+#define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_SVCCTL_EN != 0 )
+#define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_CTS_EN != 0)
+#define BLE_DBG_CTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_CTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HIDS_EN != 0)
+#define BLE_DBG_HIDS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HIDS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_PASS_EN != 0)
+#define BLE_DBG_PASS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_PASS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BLS_EN != 0)
+#define BLE_DBG_BLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HTS_EN != 0)
+#define BLE_DBG_HTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ANS_EN != 0)
+#define BLE_DBG_ANS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ANS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ESS_EN != 0)
+#define BLE_DBG_ESS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ESS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_GLS_EN != 0)
+#define BLE_DBG_GLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_GLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BAS_EN != 0)
+#define BLE_DBG_BAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_RTUS_EN != 0)
+#define BLE_DBG_RTUS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_RTUS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HPS_EN != 0)
+#define BLE_DBG_HPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_TPS_EN != 0)
+#define BLE_DBG_TPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LLS_EN != 0)
+#define BLE_DBG_LLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_IAS_EN != 0)
+#define BLE_DBG_IAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_IAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_WSS_EN != 0)
+#define BLE_DBG_WSS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_WSS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LNS_EN != 0)
+#define BLE_DBG_LNS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LNS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_SCPS_EN != 0)
+#define BLE_DBG_SCPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SCPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_DTS_EN != 0)
+#define BLE_DBG_DTS_MSG PRINT_MESG_DBG
+#define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG
+#else
+#define BLE_DBG_DTS_MSG PRINT_NO_MESG
+#define BLE_DBG_DTS_BUF PRINT_NO_MESG
+#endif
+
+#endif /*__BLE_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.c
new file mode 100644
index 000000000..59c66fad3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.c
@@ -0,0 +1,221 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file dis_app.c
+ * @author MCD Application Team
+ * @brief Device Information Service Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "ble.h"
+#include "dis_app.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+#if ((BLE_CFG_DIS_SYSTEM_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+static const uint8_t system_id[BLE_CFG_DIS_SYSTEM_ID_LEN_MAX] =
+{
+ (uint8_t)((DISAPP_MANUFACTURER_ID & 0xFF0000) >> 16),
+ (uint8_t)((DISAPP_MANUFACTURER_ID & 0x00FF00) >> 8),
+ (uint8_t)(DISAPP_MANUFACTURER_ID & 0x0000FF),
+ 0xFE,
+ 0xFF,
+ (uint8_t)((DISAPP_OUI & 0xFF0000) >> 16),
+ (uint8_t)((DISAPP_OUI & 0x00FF00) >> 8),
+ (uint8_t)(DISAPP_OUI & 0x0000FF)
+};
+#endif
+
+#if ((BLE_CFG_DIS_IEEE_CERTIFICATION != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+static const uint8_t ieee_id[BLE_CFG_DIS_IEEE_CERTIFICATION_LEN_MAX] =
+{
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+};
+#endif
+#if ((BLE_CFG_DIS_PNP_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+static const uint8_t pnp_id[BLE_CFG_DIS_PNP_ID_LEN_MAX] =
+{
+ 0x1,
+ 0xAD, 0xDE,
+ 0xDE, 0xDA,
+ 0x01, 0x00
+};
+#endif
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void DISAPP_Init(void)
+{
+/* USER CODE BEGIN DISAPP_Init */
+ DIS_Data_t dis_information_data;
+
+#if ((BLE_CFG_DIS_MANUFACTURER_NAME_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update MANUFACTURER NAME Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_MANUFACTURER_NAME;
+ dis_information_data.Length = sizeof(DISAPP_MANUFACTURER_NAME);
+ DIS_UpdateChar(MANUFACTURER_NAME_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_MODEL_NUMBER_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update MODEL NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_MODEL_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_MODEL_NUMBER);
+ DIS_UpdateChar(MODEL_NUMBER_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_SERIAL_NUMBER_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update SERIAL NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_SERIAL_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_SERIAL_NUMBER);
+ DIS_UpdateChar(SERIAL_NUMBER_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_HARDWARE_REVISION_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update HARDWARE REVISION NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_HARDWARE_REVISION_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_HARDWARE_REVISION_NUMBER);
+ DIS_UpdateChar(HARDWARE_REVISION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_FIRMWARE_REVISION_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update FIRMWARE REVISION NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_FIRMWARE_REVISION_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_FIRMWARE_REVISION_NUMBER);
+ DIS_UpdateChar(FIRMWARE_REVISION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_SOFTWARE_REVISION_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update SOFTWARE REVISION NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_SOFTWARE_REVISION_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_SOFTWARE_REVISION_NUMBER);
+ DIS_UpdateChar(SOFTWARE_REVISION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_SYSTEM_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+
+ /**
+ * Update SYSTEM ID Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t *)system_id;
+ dis_information_data.Length = BLE_CFG_DIS_SYSTEM_ID_LEN_MAX;
+ DIS_UpdateChar(SYSTEM_ID_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_IEEE_CERTIFICATION != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+
+ /**
+ * Update IEEE CERTIFICATION ID Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t *)ieee_id;
+ dis_information_data.Length = BLE_CFG_DIS_IEEE_CERTIFICATION_LEN_MAX;
+ DIS_UpdateChar(IEEE_CERTIFICATION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_PNP_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+
+ /**
+ * Update PNP ID Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t *)pnp_id;
+ dis_information_data.Length = BLE_CFG_DIS_PNP_ID_LEN_MAX;
+ DIS_UpdateChar(PNP_ID_UUID, &dis_information_data);
+#endif
+/* USER CODE END DISAPP_Init */
+}
+
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.h
new file mode 100644
index 000000000..196ec9937
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.h
@@ -0,0 +1,77 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file dis_app.h
+ * @author MCD Application Team
+ * @brief Header for dis_application.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __DIS_APP_H
+#define __DIS_APP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros -----------------------------------------------------------*/
+#define DISAPP_MANUFACTURER_NAME "STM"
+#define DISAPP_MODEL_NUMBER "4502-1.0"
+#define DISAPP_SERIAL_NUMBER "1.0"
+#define DISAPP_HARDWARE_REVISION_NUMBER "1.0"
+#define DISAPP_FIRMWARE_REVISION_NUMBER "1.0"
+#define DISAPP_SOFTWARE_REVISION_NUMBER "1.0"
+#define DISAPP_OUI 0x123456
+#define DISAPP_MANUFACTURER_ID 0x9ABCDE
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ------------------------------------------------------- */
+void DISAPP_Init(void);
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__DIS_APP_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c
new file mode 100644
index 000000000..b4aca3c3c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c
@@ -0,0 +1,256 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hrs_app.c
+ * @author MCD Application Team
+ * @brief Heart Rate Service Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "ble.h"
+#include "hrs_app.h"
+#include "cmsis_os.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ HRS_BodySensorLocation_t BodySensorLocationChar;
+ HRS_MeasVal_t MeasurementvalueChar;
+ uint8_t ResetEnergyExpended;
+ uint8_t TimerMeasurement_Id;
+
+} HRSAPP_Context_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+#define HRSAPP_MEASUREMENT_INTERVAL (1000000/CFG_TS_TICK_VAL) /**< 1s */
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/**
+ * START of Section BLE_APP_CONTEXT
+ */
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static HRSAPP_Context_t HRSAPP_Context;
+
+/**
+ * END of Section BLE_APP_CONTEXT
+ */
+
+osThreadId_t HrsProcessId;
+
+const osThreadAttr_t HrsProcess_attr = {
+ .name = CFG_HRS_PROCESS_NAME,
+ .attr_bits = CFG_HRS_PROCESS_ATTR_BITS,
+ .cb_mem = CFG_HRS_PROCESS_CB_MEM,
+ .cb_size = CFG_HRS_PROCESS_CB_SIZE,
+ .stack_mem = CFG_HRS_PROCESS_STACK_MEM,
+ .priority = CFG_HRS_PROCESS_PRIORITY,
+ .stack_size = CFG_HRS_PROCESS_STACK_SIZE
+};
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void HrMeas( void );
+static void HrsProcess(void *argument);
+static void HRSAPP_Measurement(void);
+static uint32_t HRSAPP_Read_RTC_SSR_SS ( void );
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void HRS_Notification(HRS_App_Notification_evt_t *pNotification)
+{
+/* USER CODE BEGIN HRS_Notification_1 */
+
+/* USER CODE END HRS_Notification_1 */
+ switch(pNotification->HRS_Evt_Opcode)
+ {
+/* USER CODE BEGIN HRS_Notification_HRS_Evt_Opcode */
+
+/* USER CODE END HRS_Notification_HRS_Evt_Opcode */
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ case HRS_RESET_ENERGY_EXPENDED_EVT:
+/* USER CODE BEGIN HRS_RESET_ENERGY_EXPENDED_EVT */
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended = 0;
+ HRSAPP_Context.ResetEnergyExpended = 1;
+/* USER CODE END HRS_RESET_ENERGY_EXPENDED_EVT */
+ break;
+#endif
+
+ case HRS_NOTIFICATION_ENABLED:
+/* USER CODE BEGIN HRS_NOTIFICATION_ENABLED */
+ /**
+ * It could be the enable notification is received twice without the disable notification in between
+ */
+ HW_TS_Stop(HRSAPP_Context.TimerMeasurement_Id);
+ HW_TS_Start(HRSAPP_Context.TimerMeasurement_Id, HRSAPP_MEASUREMENT_INTERVAL);
+/* USER CODE END HRS_NOTIFICATION_ENABLED */
+ break;
+
+ case HRS_NOTIFICATION_DISABLED:
+/* USER CODE BEGIN HRS_NOTIFICATION_DISABLED */
+ HW_TS_Stop(HRSAPP_Context.TimerMeasurement_Id);
+/* USER CODE END HRS_NOTIFICATION_DISABLED */
+ break;
+
+#if (BLE_CFG_OTA_REBOOT_CHAR != 0)
+ case HRS_STM_BOOT_REQUEST_EVT:
+/* USER CODE BEGIN HRS_STM_BOOT_REQUEST_EVT */
+ *(uint32_t*)SRAM1_BASE = *(uint32_t*)pNotification->DataTransfered.pPayload;
+ NVIC_SystemReset();
+/* USER CODE END HRS_STM_BOOT_REQUEST_EVT */
+ break;
+#endif
+
+ default:
+/* USER CODE BEGIN HRS_Notification_Default */
+
+/* USER CODE END HRS_Notification_Default */
+ break;
+ }
+/* USER CODE BEGIN HRS_Notification_2 */
+
+/* USER CODE END HRS_Notification_2 */
+ return;
+}
+
+void HRSAPP_Init(void)
+{
+ HrsProcessId = osThreadNew(HrsProcess, NULL, &HrsProcess_attr);
+/* USER CODE BEGIN HRSAPP_Init */
+ /**
+ * Set Body Sensor Location
+ */
+ HRSAPP_Context.ResetEnergyExpended = 0;
+ HRSAPP_Context.BodySensorLocationChar = HRS_BODY_SENSOR_LOCATION_HAND;
+ HRS_UpdateChar(SENSOR_LOCATION_UUID, (uint8_t *)&HRSAPP_Context.BodySensorLocationChar);
+
+
+ /**
+ * Set Flags for measurement value
+ */
+
+ HRSAPP_Context.MeasurementvalueChar.Flags = ( HRS_HRM_VALUE_FORMAT_UINT16 |
+ HRS_HRM_SENSOR_CONTACTS_PRESENT |
+ HRS_HRM_SENSOR_CONTACTS_SUPPORTED |
+ HRS_HRM_ENERGY_EXPENDED_PRESENT |
+ HRS_HRM_RR_INTERVAL_PRESENT );
+
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ if(HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_ENERGY_EXPENDED_PRESENT)
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended = 10;
+#endif
+
+#if (BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG != 0)
+ if(HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_RR_INTERVAL_PRESENT)
+ {
+ uint8_t i;
+
+ HRSAPP_Context.MeasurementvalueChar.NbreOfValidRRIntervalValues = BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG;
+ for(i = 0; i < BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG; i++)
+ HRSAPP_Context.MeasurementvalueChar.aRRIntervalValues[i] = 1024;
+ }
+#endif
+
+ /**
+ * Create timer for Heart Rate Measurement
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(HRSAPP_Context.TimerMeasurement_Id), hw_ts_Repeated, HrMeas);
+
+/* USER CODE END HRSAPP_Init */
+ return;
+}
+
+static void HrsProcess(void *argument)
+{
+ UNUSED(argument);
+
+ for(;;)
+ {
+ osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
+ HRSAPP_Measurement( );
+ }
+}
+
+static void HRSAPP_Measurement(void)
+{
+/* USER CODE BEGIN HRSAPP_Measurement */
+ uint32_t measurement;
+
+ measurement = ((HRSAPP_Read_RTC_SSR_SS()) & 0x07) + 65;
+
+ HRSAPP_Context.MeasurementvalueChar.MeasurementValue = measurement;
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ if((HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_ENERGY_EXPENDED_PRESENT) &&
+ (HRSAPP_Context.ResetEnergyExpended == 0))
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended += 5;
+ else if(HRSAPP_Context.ResetEnergyExpended == 1)
+ HRSAPP_Context.ResetEnergyExpended = 0;
+#endif
+
+ HRS_UpdateChar(HEART_RATE_MEASURMENT_UUID, (uint8_t *)&HRSAPP_Context.MeasurementvalueChar);
+
+/* USER CODE END HRSAPP_Measurement */
+ return;
+}
+
+static void HrMeas( void )
+{
+ /**
+ * The code shall be executed in the background as aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ osThreadFlagsSet( HrsProcessId, 1 );
+
+/* USER CODE BEGIN HrMeas */
+
+/* USER CODE END HrMeas */
+
+ return;
+}
+
+static uint32_t HRSAPP_Read_RTC_SSR_SS ( void )
+{
+ return ((uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS)));
+}
+
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.h
new file mode 100644
index 000000000..0246d2811
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hrs_app.h
+ * @author MCD Application Team
+ * @brief Header for hrs_application.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HRS_APP_H
+#define __HRS_APP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+void HRSAPP_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__HRS_APP_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..c6e1ca97a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,523 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliCmdNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_CliEvtNotification();
+
+ return;
+}
+
+__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+#endif /* ZIGBEE_WB */
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/readme.txt
new file mode 100644
index 000000000..52ce294b2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/readme.txt
@@ -0,0 +1,140 @@
+/**
+ @page BLE_HeartRateFreeRTOSFreeRTOS_ANCS example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE/BLE_HeartRateFreeRTOS_ANCS/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE_HeartRateFreeRTOS_ANCS example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2020 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification at:
+https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/
+and also use the Heart Rate profile as specified by the BLE SIG.
+Note: this application use FreeRTOS to schedule SW tasks.
+
+The purpose of the Apple Notification Center Service (ANCS) is to give Bluetooth accessories (that connect to iOS devices
+through a Bluetooth Low Energy link) a simple and convenient way to access many kinds of notifications that are generated
+ on iOS devices. The publisher of the ANCS service (the iOS phone device) is referred to as Notification Provider (NP)
+ and the client of the ANCS service (ie. STM32 WB board) is referred to as a Notification Consumer (NC).
+
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@note This application is not supported by CubeMx but has been copied from the project BLE_HeartRate generated
+ by CubeMx with some modifications to replace the call to the scheduler by the use of the cmsis_os interface
+
+@par Directory contents
+
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_debug.h Debug and trace tools
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_if.h HW interface to BSP and HAL call
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32_lpm_if.h Low layer function to enter/exit low power modes
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/utilities_conf.h Configuration file of the utilities
+
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.h Header for app_ble.c module
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.h ANCS client Application
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.h Header for dis_app.c module
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.h Header for hrs_app.c module
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/FreeRTOSConfig.h Configuration file of FreeRTOS
+
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_debug.c
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c Main program
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_msp.c MSP Initialization and deinitialisation
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/ancs_client_app.c ANCS client Application
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.c Device Information Service application
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c Heart Rate Service application
+
+ - BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55VG-Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your toolchain
+ - Rebuild all files and flash the board with the executable file
+
+ On the android/ios device, enable the Bluetooth communications, and if not done before,
+ - Install the ST BLE Profile application on the android device
+ https://play.google.com/store/apps/details?id=com.stm.bluetoothlevalidation&hl=en
+ https://itunes.apple.com/fr/App/st-ble-profile/id1081331769?mt=8
+
+ - Install the ST BLE Sensor application on the ios/android device
+ https://play.google.com/store/apps/details?id=com.st.bluems
+ https://itunes.apple.com/us/App/st-bluems/id993670214?mt=8
+
+Considering connection with ios device:
+ - Power on the Nucleo board with the BLE_HeartRateFreeRTOS_ANCS application
+ - Then, click on the App icon, ST BLE Sensor (ios device)
+ - connect to a device
+ - select the HRanc in the device list
+ - call your ios device by using another smartphone, the call will be answered automatically. or, send message to your ios device,the message can be displayed on terminal.
+ Warning: if the HRanc has already been bonded or pairing timeout, you should erase it from bluetooth connected ios device list and press SW3 stored bonded infomation.
+ (in ios device settings: select bluetooth icon, then select my device and forget or ignore it).
+ The Heart Rate is displayed each second on the ios device.
+ Moreover to display ANCS notifications messages, please open an hyper-terminal on PC
+ connected to Nucleo board by serial STlink Virtual com port with following settings:
+ + baud rate: 115200
+ + data: 8 bits
+ + parity: none
+ + stop: 1 bits
+ + Flow control: none
+
+ - The User buttons are configured as ( SW1 terminates BLE connection, SW2 review ANCS notification
+ and SW3 is used to remove bonded devices, reset GAP security and terminate BLE connection).
+
+For more details refer to the Application Note:
+ AN5289 - Building a Wireless application
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Binary/BLE_HeartRate_ANCS_reference.hex b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Binary/BLE_HeartRate_ANCS_reference.hex
new file mode 100644
index 000000000..9ef41d427
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Binary/BLE_HeartRate_ANCS_reference.hex
@@ -0,0 +1,3854 @@
+:020000040800F2
+:10000000B02F0020E9EE0008B1EC0008B3EC0008C6
+:10001000B5EC0008B7EC0008B9EC000800000000DF
+:10002000000000000000000000000000BBEC000821
+:10003000BDEC000800000000BFEC0008C1EC0008A7
+:100040000BEF00080FEF000813EF0008FFEC0008AB
+:1000500017EF00081BEF0008F3EC0008F9EC0008AC
+:100060001FEF000823EF0008EDEC000827EF000861
+:100070002BEF00082FEF0008C5EC000833EF000855
+:1000800037EF00083BEF00083FEF000843EF0008A0
+:1000900047EF00084BEF00084FEF000853EF000850
+:1000A00057EF00085BEF00085FEF000863EF000800
+:1000B00067EF00086BEF00086FEF000873EF0008B0
+:1000C00077EF00087BEF00087FEF000883EF000860
+:1000D000CBEC0008D1EC000887EF00088BEF00089C
+:1000E0008FEF000893EF000897EF00089BEF0008E0
+:1000F00007ED000803ED00089FEF0008A3EF0008DC
+:10010000A7EF0008ABEF0008AFEF0008B3EF00085F
+:10011000B7EF0008BBEF0008BFEF0008C3EF00080F
+:10012000C7EF0008CBEF0008D7EC0008CFEF0008BE
+:10013000D3EF0008D7EF0008DBEF000818B1022862
+:1001400007D003D370470FF2140004E00FF2200031
+:1001500001E00FF2340005F06BBD00002A2A2045B3
+:1001600076656E7449443A2041646465640D0A0002
+:100170002A2A204576656E7449443A204D6F646999
+:10018000666965640D0A00002A2A204576656E744A
+:1001900049443A2052656D6F7665640D0A0000008F
+:1001A00010B50128044608D0022809D004280AD036
+:1001B00008280BD010280CD00FE00FF26C000AE0DA
+:1001C0000FF27C0007E00FF2940004E00FF2AC00A5
+:1001D00001E00FF2C80005F02BFD0FF2E00005F082
+:1001E00027FDE00744BF0FF2E40005F021FDA00762
+:1001F00044BF0FF2E00005F01BFD600744BF0FF2A3
+:10020000E00005F015FD200744BF0FF2E40005F003
+:100210000FFDE00644BF0FF2E80005F009FDBDE860
+:10022000104001F0DEBD00002A2A204576656E747C
+:10023000466C61673A2053696C656E740D0A000064
+:100240002A2A204576656E74466C61673A20496DAE
+:10025000706F7274616E740D0A0000002A2A2045C6
+:1002600076656E74466C61673A20507265204578F9
+:10027000697374696E670D0A000000002A2A204520
+:1002800076656E74466C61673A20506F7369746965
+:10029000766520416374696F6E0D0A002A2A204535
+:1002A00076656E74466C61673A204E656761746965
+:1002B000766520416374696F6E0D0A002A2A204515
+:1002C00076656E74466C6167733A00002053696C02
+:1002D000656E740020496D706F7274616E740000F9
+:1002E000205072654578697374696E67000000007C
+:1002F00020506F736974697665416374696F6E002D
+:10030000204E65676174697665416374696F6E003C
+:100310000B282CD8DFE800F006090C0F1215181B6B
+:100320001E2124270FF248001FE00FF25C001CE0A2
+:100330000FF2740019E00FF2900016E00FF2A40023
+:1003400013E00FF2B80010E00FF2CC000DE00FF256
+:10035000E0000AE00FF2F00007E00FF2101004E0F6
+:100360000FF2301001E00FF2481005F061BC704749
+:100370002A2A2043617465676F727949443A204F95
+:10038000746865720D0A00002A2A2043617465674B
+:100390006F727949443A20496E636F6D696E6720C8
+:1003A00043616C6C0D0A00002A2A20436174656762
+:1003B0006F727949443A204D6973736564204361D3
+:1003C0006C6C0D0A000000002A2A204361746567E6
+:1003D0006F727949443A20566F696365204D6169AF
+:1003E0006C0D0A002A2A2043617465676F7279498F
+:1003F000443A20536F6369616C0D0A002A2A204336
+:10040000617465676F727949443A20536368656423
+:10041000756C650D0A0000002A2A20436174656727
+:100420006F727949443A20456D61696C0D0A00008C
+:100430002A2A2043617465676F727949443A204ED5
+:100440006577730D0A0000002A2A204361746567EE
+:100450006F727949443A204865616C7420616E641A
+:10046000204669746E6573730D0A00002A2A2043C2
+:10047000617465676F727949443A20427573696E99
+:1004800065737320616E642046696E616E63650DED
+:100490000A0000002A2A2043617465676F72794957
+:1004A000443A204C6F636174696F6E0D0A0000005E
+:1004B0002A2A2043617465676F727949443A20455E
+:1004C0006E7465727461696E6D656E740D0A0000FC
+:1004D0000FB42DE9FC4585B068460FF25011142287
+:1004E00005F0CAFB0E988DF8010000240E988DF8D7
+:1004F0000040000A8DF8020005250E98000C8DF8CA
+:1005000003000E98000E8DF804009DF83C000128B1
+:1005100004BF8DF8054006259DF83D00012807D150
+:10052000BDF83E0020B101210DF8051000F0AEF835
+:100530009DF84000012806D1BDF8420018B1EAB28A
+:10054000022100F0A1F89DF84400012806D1BDF871
+:10055000460018B1EAB2032100F096F89DF8480071
+:10056000012803D1E8B2042100F08AF89DF849007F
+:10057000012803D1E8B2052100F082F89DF84A0075
+:10058000012803D1E8B2062100F07AF89DF84B006B
+:10059000012803D1E8B2072100F072F8DFF84C8D92
+:1005A000DFF84C6D0FF2980ADFF8484D02F08FFC2F
+:1005B00001464FF4D773524603F0A4FE0E990FF292
+:1005C000A000EAB205F034FB002705E01DF800109A
+:1005D000204605F02DFB7F1CF8B2E9B28842F5D326
+:1005E00001F0BAFB00F00CF9EAB205F001FD00F0F1
+:1005F00043F9002C40460AD105F0CCFD01464FF4EA
+:10060000DD73524603F07EFE00F020F909E005F0AC
+:10061000C1FD01464FF4DF73524603F073FE00F054
+:10062000F6F807B0BDE8F0055DF814FB0000000027
+:10063000000001FFFF02FFFF03FFFF0405060700A4
+:10064000414E43535F436D645F4765744E6F7469F9
+:100650006669636174696F6E4174747200000000B2
+:1006600020617474722E5549443D307825303878B5
+:1006700020436D6453697A653D2564200A0D0000AE
+:100680000DF800106D1C70470DF802106D1CE9B2DA
+:100690006D1C0DF80100E9B2000A0DF801006D1C97
+:1006A00070472DE9FC420D460FF2B401DFF83C9C87
+:1006B0000FF2B407D1E90023CDE900230446200A54
+:1006C0008DF80200210E200C8DF8030002268DF813
+:1006D00004108DF800608DF801408DF8055000F091
+:1006E000EDFBDFF80C6C014640F2D7133A4603F0FD
+:1006F00009FE06232A4621460FF29000DFF8F45B3C
+:1007000005F096FA0024E0B2641C1DF8001028469B
+:1007100005F08EFAE0B20528F5DD01F01DFB00F0D2
+:100720006FF8062205F064FC00F0A6F8002C48469D
+:100730000AD105F02FFD01464FF4F2733A4603F05B
+:10074000E1FD00F083F809E005F024FD01464FF4D7
+:10075000F4733A4603F0D6FD00F059F8BDE8F38291
+:100760000200000000000000414E43535F436D64EF
+:100770005F506572666F726D4E6F74696669636112
+:1007800074696F6E416374696F6E0000205065720A
+:10079000666F726D204E6F74696669636174696F0C
+:1007A0006E20416374696F6E207468726F7567683C
+:1007B00020414E4353436F6E74726F6C506F696E7D
+:1007C000744368617256616C756548646C65203A63
+:1007D000206E6F74696669636174696F6E55494410
+:1007E0003D3078253038582061637449443D256494
+:1007F00020436D6453697A65203D2564200A0D000D
+:10080000DFF83C0CB0F8C21740886B4670472146B1
+:100810000FF2040005F00CBA206163695F67617430
+:10082000745F77726974655F636861725F76616C2B
+:10083000756520636D64204E4F4B20737461747531
+:1008400073203D307825303258200A000FF2040022
+:1008500005F0EEB9206163695F676174745F777258
+:100860006974655F636861725F76616C756520634A
+:100870006D64206F6B0A0000044647F2305000F0B0
+:1008800089BD2DE9F843A0B005460C466846802195
+:1008900005F0EEFC01268DF800600120002104E047
+:1008A000635C0DF800303846491C471CA942C0B2B1
+:1008B000F6DB00210DF80010DFF8309ADFF8308AFF
+:1008C0000FF25C0600F0FAFA014640F2FD1300F068
+:1008D0005BF82B462246F9B20FF2580005F0A8F952
+:1008E000FFF78EFFFAB205F083FBFFF7C5FF002C80
+:1008F000484609D105F04EFC014640F2062300F0BF
+:1009000043F8FFF7A3FF08E005F044FC014640F27E
+:100910000A2300F039F8FFF77AFF21B0BDE8F08331
+:10092000414E43535F436D645F476574417070414E
+:1009300074747200436F6D6D616E644944476574F1
+:100940004170704174747269627574657320436D8F
+:100950006453697A653D2564203A2041707049648A
+:10096000656E7469666965723D25732041707049D2
+:1009700064656E7469666965724C656E6774683D1E
+:100980002564200A0D0000003246404605F050B9AB
+:100990002DE9FE4F0024030018BF012800F0068156
+:1009A000BDE8F78FE41CA4B2BDF808008442F7DA72
+:1009B00001982044411C0222684605F05CFCBDF809
+:1009C00000100029EED09DF80210002906F5F2650E
+:1009D0004FF00C0A65D1A878F8B92F880FF2E8100B
+:1009E0000AFB07FAB24405F023F90AF291173878A6
+:1009F000FFF7A4FB7878FFF7D3FBB878FFF788FC04
+:100A0000F9780FF2182005F013F9DAF898110FF2BF
+:100A1000242005F00DF90120A8700198005D072839
+:100A20001ED8DFE800F0191613100D0A07040FF2A4
+:100A3000242013E00FF2382010E00FF250200DE0D8
+:100A40000FF254200AE00FF2642007E00FF26C204E
+:100A500004E00FF2782001E00FF27C2005F0E8F8C6
+:100A60000198005D58B9182100F027FA014640F2BC
+:100A7000322300F01EFA0FF2742005F0D9F8307816
+:100A8000182846D00199085D062842D1192100F0A6
+:100A900014FA014640F2392300F00BFA0FF2C82095
+:100AA0001FE0012935D10199085D18B90FF2003016
+:100AB00005F0BEF8298806F293100AFB01F1405CAC
+:100AC000012818BF05280FD1012028721920307085
+:100AD00000F0F4F901464FF4127300F0EAF90FF256
+:100AE000E42005F0A5F814E000F0E8F9014640F232
+:100AF0004A2300F0DEF929880FF2103005F098F84B
+:100B000028880AFB00F17018002180F890111A2043
+:100B1000307006F18F0A0198005DBDF80020451E77
+:100B20000198AD41641CA4B2ED0F0719FF2A09D842
+:100B3000B91C504605F09FFBBDF8001000200AF8D4
+:100B4000010015E000F0BAF9014640F2612300F01F
+:100B5000B0F9BDF800100FF2E820FF2205F068F8A8
+:100B6000FE22B91C504605F086FB002086F88D0158
+:100B7000BDF800000419A41CA4B26DB1421C812A66
+:100B800005DA00F091F9BDF80000401C03E0802276
+:100B900000F08AF98020B073BDF80000002804D06E
+:100BA00051460FF2E42005F043F8FDE68DF802000F
+:100BB000ADF808100192DFF88868DFF834B70FF25B
+:100BC000D028DFF82897EFE60D0A2A2A2A2A2A2AAF
+:100BD0002A2A2A2A2A2A2A2A2A204461746120538E
+:100BE0006F757263652044657461696C20496E6637
+:100BF0006F6D6174696F6E205265636569766564B7
+:100C0000202A2A2A2A2A2A2A2A2A2A2A2A2A2A2A4E
+:100C10002A2A2A2A2A2A2A0D0A0000002A2A2043E0
+:100C2000617465676F7279436F756E743A202564DD
+:100C30000D0A00002A2A204E6F7469666963617488
+:100C4000696F6E5549443A203078253038780D0A5E
+:100C5000000000002A2A204E6567617469766541AC
+:100C60006374696F6E4C6162656C3A20000000002D
+:100C70002A2A20506F736974697665416374696FBD
+:100C80006E4C6162656C3A20000000002A2A204404
+:100C90006174653A200000002A2A204D6573736153
+:100CA000676553697A653A20000000002A2A204DC2
+:100CB0006573736167653A20000000002A2A20539B
+:100CC00075625469746C653A200000002A2A205429
+:100CD00069746C653A2000002A2A204170704964CA
+:100CE000656E7469666965723A20000020332E32A1
+:100CF00020476574204150502041747472696275B8
+:100D0000746573202844657461696C20496E666F50
+:100D10006D6174696F6E2061626F757420746865AF
+:100D2000204170702C204E6F77206F6E6C7920738D
+:100D30007570706F727420746F20476574204E61F7
+:100D40006D65206F662041707029203D3E20414E28
+:100D500043535F4745545F4150505F41545452499B
+:100D600042555445200A0D0020332E322050657222
+:100D7000666F726D204E6F74696669636174696F26
+:100D80006E20416374696F6E203D3E20414E435397
+:100D90005F504552464F524D5F4E4F54494649436E
+:100DA0004154494F4E5F414354494F4E200A0D0074
+:100DB0002A2A20446973706C61794E616D653A200E
+:100DC0000000000020332E3420506572666F726D73
+:100DD000204E6F74696669636174696F6E20416348
+:100DE00074696F6E203D3E20414E43535F50455223
+:100DF000464F524D5F4E4F54494649434154494F27
+:100E00004E5F414354494F4E200A0D00436F6D6DB4
+:100E1000616E6449444765744170704174747269CD
+:100E20006275746573206E6F74696679456E74724D
+:100E3000793D25642052656D6F7665640A0D00006A
+:100E40006375742074686520417474726962757486
+:100E500065494420782056616C7565206C656E3D4F
+:100E60002564203C3D2073697A656F6628616E6356
+:100E7000735F636F6E746578742E6C697374293D4B
+:100E80002564200A0D0000002025730D0A000000D3
+:100E9000414E43535F50617273655F47657441749F
+:100EA00074725F5265737000514606F10F0005F0D1
+:100EB000E2B94246584604F0BBBE3170484605F0E0
+:100EC00069B92DE9FC410546089CDFF820040E466F
+:100ED0001746984605F05EF9014640F285230FF269
+:100EE000AC0202F03FFD00F037FF0FF2C80004F043
+:100EF0009FFE2846FFF722F93046FFF751F93846A2
+:100F0000FFF706FA41460FF2041004F091FE214665
+:100F10000FF2101004F08CFE0C22022DDFF82035A9
+:100F200011D1002102FB01F0184400F5C87085685A
+:100F3000A54203D0491C8029F4DB24E00022027082
+:100F40000FF200101BE0002102FB01F0184400F535
+:100F5000C87C9CF8000018B1491C8029F4DB12E021
+:100F600001208CF800008CF801508CF802608CF89D
+:100F700003708CF80480CCF808400FF2E800BDE85C
+:100F8000FC4104F055BEBDE8F3810000414E4353DF
+:100F90005F4E6F74696669636174696F6E5F536FEA
+:100FA000757263655F52656365697665645F6576D2
+:100FB000656E74002A2A2A2A2A2A2A2A2A2A2A2AF2
+:100FC0002A2A2A204E6F74696669636174696F6E9C
+:100FD00020536F7572636520426173696320496EA7
+:100FE000666F6D6174696F6E2052656365697665C1
+:100FF00064202A2A2A2A2A2A2A2A2A2A2A2A2A2A21
+:101000002A2A2A2A2A2A2A2A0D0A00002A2A2043C2
+:10101000617465676F7279436F756E743A202564E9
+:10102000200D0A002A2A204E6F7469666963617474
+:10103000696F6E5549443A20307825303878200D54
+:101040000A0000002A2A206E6F74696679456E7462
+:1010500072793A2025642052656D6F7665640D0AB9
+:10106000000000002A2A206E6F74696679456E744C
+:1010700072793A2025642041646465640D0A000099
+:101080007CB5DFF8BC4304F5F2654FF6FF76014608
+:101090002E8000220C235343234403F5C873187891
+:1010A00018B19B780B408B4213D0521C802AF1DB85
+:1010B0002888B0420CD102F011FC01464FF4327383
+:1010C00002F04EFC0FF2300004F0B2FD022020705E
+:1010D00073BD0020A870D2B2172020702A8002F0C1
+:1010E000FDFB014640F2C12302F03AFC29880FF2D1
+:1010F0004C0004F09DFDDBE720616E63735F636F5E
+:101100006E746578742E6E6F74696679456E74724C
+:1011100079203D3D20494E56414C49445F4E4F5445
+:101120004946595F454E545259203D3E20414E4359
+:10113000535F49444C45200A0D000000322E2047E1
+:101140006574204D6F72652044657461696C204937
+:101150006E666F6D6174696F6E7320206E6F746957
+:101160006679456E7472793D2564203D3D3E20418F
+:101170004E43535F4745545F4E4F544946494341A0
+:1011800054494F4E5F415454524942555445200AE8
+:101190000D00000010B5AA4C40F2CC71204605F0BD
+:1011A00067F800200C210023C2B24A432244401CAD
+:1011B00082F89031C2B2802AF6DB4FF6FF70608071
+:1011C000A4F89007237002F089FB01464FF43A73AC
+:1011D0000FF2100202F0C6FBBDE810400FF218003B
+:1011E00004F026BD414E43535F436C69656E745FE6
+:1011F0005265736574000000414E435320434C49CF
+:10120000454E54205245534554200A0D000000001D
+:1012100080B502F063FB014640F2F1230FF21802A1
+:1012200002F0A0FB0FF21C0004F002FDBDE8044038
+:101230000021082005F0AEB8416E63735F4D677200
+:10124000000000005554494C5F5345515F5365748D
+:101250005461736B204346475F5441534B5F415089
+:10126000505F414E43535F444953434F5645525993
+:101270005F4944203D3D3E20414E43535F417070E5
+:101280005F5570646174655F53657276696365204C
+:101290000A0D000070B5DFF8540B144C144D0FF21A
+:1012A000580605F0F3F8204604F074FF014640F2BA
+:1012B000FE2300F065F80FF2580004F0B9FCDFF8E7
+:1012C000302B0021082005F058F8FFF763FF204677
+:1012D00004F060FF01464FF4417300F051F8BDE89F
+:1012E00070400FF27C0004F0A3BC0000DC56000844
+:1012F000C856000844310008414E43535F436C69AF
+:10130000656E745F4170705F496E69740000000023
+:101310002D2D205554494C5F5345515F52656754FC
+:1013200061736B20204346475F5441534B5F4150EC
+:10133000505F414E43535F444953434F56455259C2
+:101340005F494420414E43535F4170705F55706464
+:101350006174655F536572766963650A0000000019
+:101360002D2D20414E435320434C49454E54204996
+:101370004E495449414C495A4544200A0D00000049
+:101380003246284604F054BC042005F025B8042059
+:1013900005F02AB8082005F027B82DE9F0470746E0
+:1013A000DFF848AEDFF838450FF298080FF2AC05C9
+:1013B000504604F0EFFE01464FF44A73424602F0F5
+:1013C000B4FDBA7839880FF2F40004F031FC00263D
+:1013D00040F22D3912E0504604F0DCFE01464B4647
+:1013E000424602F0A2FD07EB8600B0F80520B0F8F7
+:1013F0000310284604F01CFC761CF6B2B87886422E
+:10140000E9DB0F480178112918D100F2B675B7F859
+:1014100003002880B7F805006880504604F0BAFE43
+:10142000014640F23633424602F07FFD6A88298841
+:101430000FF2E000BDE8F04704F0FABBBDE8F0872A
+:10144000FC110020476174745061727365536572BA
+:101450007669636573427955554944004556545F32
+:10146000424C55455F4154545F46494E445F425992
+:101470005F545950455F56414C5F52455350202DA3
+:1014800020466F756E645F4174747269627574652D
+:101490005F48616E646C653D3078253034582C4768
+:1014A000726F75705F456E645F48616E646C653D18
+:1014B0003078253034580A0D000000004556545F3E
+:1014C000424C55455F4154545F46494E445F425932
+:1014D0005F545950455F56414C5F52455350202D43
+:1014E00020436F6E6E656374696F6E5F48616E64F2
+:1014F0006C653D3078253034582C4E756D5F6F66C5
+:101500005F48616E646C655F506169723D25640A75
+:101510000D0000004556545F424C55455F41545400
+:101520005F46494E445F42595F545950455F5641AA
+:101530004C5F52455350202D20466F756E642041FC
+:101540004E43535365727669636553746172744890
+:10155000616E646C653D3078253034582C414E43C3
+:101560005353657276696365456E6448616E646C59
+:10157000653D3078253034580A0D00002DE9F14FD3
+:10158000DFF8688C8AB001F0A2FCDFF854930FF208
+:10159000543B014640F2473300F0DAFB0A98C37827
+:1015A000827801880FF2503004F042FB0A980188DB
+:1015B000DFF83C0C428808918A4240F07F810A990A
+:1015C0000A9A8978D37893FBF1F2D2B21429069261
+:1015D00003D10C22042410250592062903D10021F1
+:1015E00004240225059100228DF80C206D1E07951C
+:1015F00000F29A70049028E004F0CCFD014640F21D
+:10160000B13300F0A5FB0FF25C3033462A46514659
+:101610000FE045F22B0082454046EDD104F0BAFDC3
+:1016200040F2AF33014600F093FB33462A46514661
+:10163000204604F0FDFA0A99009C887804199DF868
+:101640000C00401CE4B28DF80C009DF80C7006985C
+:10165000874280F241810A98204486780578417853
+:10166000C07845EA012546EA002605980A9900F067
+:10167000FDFF42EA002A01F02AFC014640F26D33E8
+:1016800000F066FB0296019553460899069A0FF200
+:10169000FC200091394604F0CBFA0FF2483004F0F8
+:1016A000C7FA079F02E00A9900F0E6FF002FFAD57B
+:1016B000009400F051FB0498008808B1854201DADB
+:1016C000049805800498408808B1B04201DA049873
+:1016D0004680BAF5C05F0ED10498858040460499D3
+:1016E000CE8004F057FD014640F2833300F030FB1A
+:1016F0000FF2F82089E741F6010082450ED10498E7
+:101700000582404604994E8204F044FD014640F2B1
+:10171000893300F01DFB0FF2003076E741F602003E
+:1017200082450FF2303404D101F0D1FB4FF46373E2
+:1017300078E741F60300824509D101F0C8FB014674
+:1017400040F28E3300F004FB0FF234305DE741F6D7
+:101750000400824509D101F0BAFB01464FF46473DD
+:1017600000F0F6FA0FF24C304FE741F605008245E3
+:1017700009D101F0ACFB014640F2923300F0E8FAE7
+:101780000FF2643041E741F60600824509D101F0CD
+:101790009EFB01464FF4657300F0DAFA0FF28030D9
+:1017A00033E741F60700824509D101F090FB01467D
+:1017B00040F2963300F0CCFA0FF2A43025E741F660
+:1017C0000800824509D101F082FB01464FF466739F
+:1017D00000F0BEFA0FF2C03017E741F6090082456B
+:1017E00009D101F074FB014640F29A3300F0B0FADF
+:1017F0000FF2D43009E741F60A00824509D101F021
+:1018000066FB01464FF4677300F0A2FA0FF2F43062
+:10181000FBE641F60B0082450FF224470BD101F0A5
+:1018200056FB014640F29E3300F092FA33462A46B8
+:1018300051463846FDE641F60C00824505D101F0DF
+:1018400046FB01464FF46873EEE741F60D00824512
+:1018500004D101F03CFB40F2A233E3E641F60E0076
+:10186000824509D101F033FB01464FF4697300F062
+:101870006FFA0FF2F430C8E641F60F00824509D145
+:1018800001F025FB014640F2A63300F061FA0FF2A9
+:101890000C40BAE64FF2314082457FF4BAAE04986C
+:1018A000858340460499CE8304F074FC014640F2DF
+:1018B000AD3300F04DFA0FF21440A6E601F007FB3D
+:1018C000014640F2B93300F043FA0BB0BDE8F04FE7
+:1018D0000FF2284004F0ACB90BB0BDE8F08F000067
+:1018E000C85600084761747450617273655365721D
+:1018F00076696365730000004556545F424C554558
+:101900005F4154545F524541445F42595F47524FD3
+:1019100055505F545950455F52455350202D204338
+:101920006F6E6E656374696F6E5F48616E646C653F
+:101930003D3078253034582C417474726962757466
+:10194000655F446174615F4C656E6774683D2564D2
+:101950002C446174615F4C656E6774683D2564203A
+:10196000210A0000696E76616C696420555549440E
+:101970003D30782530345820666F756E64205B25C5
+:1019800030345820253034585D210A006E756D536F
+:101990006572763D25642F25642C73686F72742000
+:1019A000555549443D30782530345820464F554EE2
+:1019B000442048616E646C653D3078253034582091
+:1019C0005365727669636548616E646C65205B304F
+:1019D0007825303458202D203078253034585D203B
+:1019E0000A0D000055554944203A00004741505F18
+:1019F000534552564943455F555549443D30782536
+:101A000030345820666F756E64205B253034582062
+:101A1000253034585D210A0047454E455249435F01
+:101A20004154545249425554455F534552564943D7
+:101A3000455F555549443D30782530345820666F10
+:101A4000756E64205B2530345820253034585D2174
+:101A50000A000000414D535F534552564943455FCC
+:101A6000555549443D30782530345820666F756EA1
+:101A700064205B2530345820253034585D210A001D
+:101A80004C494E4B5F4C4F53535F5345525649435D
+:101A9000455F555549443D30782530345820666FB0
+:101AA000756E64205B2530345820253034585D2114
+:101AB0000A00000054585F504F5745525F5345523B
+:101AC000564943455F555549443D30782530345893
+:101AD00020666F756E64205B2530345820253034C5
+:101AE000585D210A0000000043555252454E545F94
+:101AF00054494D455F534552564943455F555549F5
+:101B0000443D30782530345820666F756E64205B14
+:101B10002530345820253034585D210A000000005B
+:101B20005245464552454E43455F55504441544504
+:101B30005F54494D455F534552564943455F55559E
+:101B400049443D30782530345820666F756E6420E6
+:101B50005B2530345820253034585D210A000000C0
+:101B60004E4558545F4453545F4348414E47455F88
+:101B7000534552564943455F555549443D307825B4
+:101B800030345820666F756E64205B2530345820E1
+:101B9000253034585D210A00474C55434F53455F6B
+:101BA000534552564943455F555549443D30782584
+:101BB00030345820666F756E64205B2530345820B1
+:101BC000253034585D210A004845414C54485F5443
+:101BD0004845524D4F4D455445525F534552564925
+:101BE00043455F555549443D30782530345820668B
+:101BF0006F756E64205B2530345820253034585D75
+:101C0000210A00004445564943455F494E464F521C
+:101C10004D4154494F4E5F534552564943455F55D8
+:101C20005549443D30782530345820666F756E64D0
+:101C3000205B2530345820253034585D210A0000BF
+:101C4000556E6B6F776E20555549443D3078253081
+:101C5000345820666F756E64205B2530345820251B
+:101C60003034585D210A000050484F4E455F414CCA
+:101C70004552545F534552564943455F5555494473
+:101C80003D30782530345820666F756E64205B25B2
+:101C900030345820253034585D210A0042415454D4
+:101CA0004552595F534552564943455F555549443E
+:101CB0003D30782530345820666F756E64205B2582
+:101CC00030345820253034585D210A00414E4353AA
+:101CD0005F534552564943455F555549443D307819
+:101CE0002530345820666F756E64205B253034587B
+:101CF00020253034585D210A000000004556545F0D
+:101D0000424C55455F4154545F524541445F4259EE
+:101D10005F47524F55505F545950455F524553509D
+:101D20002C206661696C6564206E6F206672656543
+:101D300020696E64657820696E20636F6E6E6563DE
+:101D400074696F6E207461626C6520210A0D000059
+:101D50005A46484603F06CBF23A003F069BF2DE943
+:101D6000F0470446DFF88484224D0FF28C0901F01D
+:101D7000AEF8014640F2C9334A46FFF702FB237929
+:101D8000628821880FF2880003F052FF207967886B
+:101D9000132814BF05280326A0198678C178007976
+:101DA00041EA002A01F093F8014640F2E1334A4645
+:101DB000FFF7E7FA53463A4631460FF2D000DFF814
+:101DC0002C6C03F035FF002505E020446D1C4179A3
+:101DD000304603F02DFF2179E8B28842F5D3BDE803
+:101DE000F04701A003F024BF0A0D0000953200085F
+:101DF000ED3B0008C8560008476174745061727367
+:101E0000654368617273427955554944000000008A
+:101E10004556545F424C55455F474154545F4449D1
+:101E200053435F524541445F434841525F42595FCB
+:101E3000555549445F52455350202D20436F6E6ED7
+:101E4000656374696F6E5F48616E646C653D307880
+:101E5000253034582C4174747269627574655F481A
+:101E6000616E646C653D307825303458204174745F
+:101E70007269627574655F56616C75655F4C656EFD
+:101E80006774683D25640A0D0000000043686172B4
+:101E900050726F706572746965733D3078253032A9
+:101EA000582043686172537461727448616E646C47
+:101EB000653D307825303458204368617256616C36
+:101EC000756548616E646C653D3078253034582006
+:101ED0000A0D00002DE9F14FDFF8108388B000F003
+:101EE000F6FFDFF80C9B0FF20C3A014640F2F93393
+:101EF00001F0CCF90898C378827801880FF2043099
+:101F000003F096FE089ABA4813884188994240F037
+:101F10005B8111468A78C9780B4693FBF2F3DBB2FA
+:101F2000152A079303D10C23052410250493072AAF
+:101F300003D10022052402250492491E089AD1707B
+:101F400000216D1E00F2A2708DF808100695039016
+:101F500028E000F0BCFF014640F2624301F096F930
+:101F60000FF2083010E042F6A6208345F1D1039825
+:101F700006800398458000F0AAFF01464FF48C6369
+:101F800001F084F90FF214302B463246594603F023
+:101F90004FFE0899887804199DF80800401CE4B2A7
+:101FA0008DF808009DF808700798874280F21A8122
+:101FB0000898204410F8016C017846EA012641781F
+:101FC00005918578C078089945EA0025049800F0C5
+:101FD0004DFB52EA002B1CBF05980028D9D0002EDB
+:101FE00018BF002DD5D000F072FF014640F2234308
+:101FF00001F04CF9059B0FF2E020019500965A463E
+:10200000394603F015FE0FF23C3003F011FE069F37
+:1020100002E0089900F030FB002FFAD5FFF79CFE94
+:10202000BBF5285F09D100F052FF014640F22B4377
+:1020300001F02CF90FF21C30A6E742F6012083458F
+:102040000FF240370BD100F042FF014640F22D4322
+:1020500001F01CF92B4632465946384697E742F6BE
+:102060000220834509D100F032FF014640F22F43A0
+:1020700001F00CF90FF23C3086E742F6032083456D
+:1020800005D100F024FF014640F23143E0E742F67B
+:102090000420834505D100F01AFF014640F2334386
+:1020A000D6E742F6052083450ED103988681404647
+:1020B0000399CD8104F06EF8014640F2394301F0F6
+:1020C000E5F80FF22C305FE742F61920834509D17D
+:1020D00000F0FDFE014640F23C4301F0D7F80FF25C
+:1020E000543051E742F62B20834509D100F0EFFE32
+:1020F000014640F23F4301F0C9F80FF26C3043E76C
+:1021000042F60F20834509D100F0E1FE014640F27E
+:10211000414301F0BBF80FF2843035E742F6292045
+:10212000834509D100F0D3FE014640F2444301F05B
+:10213000ADF80FF2A43027E742F62420834509D1F9
+:1021400000F0C5FE014640F2464301F09FF80FF251
+:10215000D43019E741F20D2083450ED10398068350
+:1021600040460399CD8304F015F8014640F24D43F3
+:1021700001F08CF80FF2F43006E74DF6F3008345DA
+:102180000ED103984683404603990D8404F002F86B
+:10219000014640F2534301F079F80FF21040F3E6A4
+:1021A0004CF2E96083457FF4DEAE039886834046B7
+:1021B00003994D8403F0EEFF014640F2594301F0CC
+:1021C00065F80FF22040DFE600F081FE014640F2A4
+:1021D0006A4301F05BF809B0BDE8F04F0FF23C40F4
+:1021E00003F026BD09B0BDE8F08F0000DC56000802
+:1021F000FC1100204761747450617273654368611B
+:10220000727300004556545F424C55455F4154542B
+:102210005F524541445F42595F545950455F5245B2
+:102220005350202D20436F6E6E656374696F6E5F2F
+:1022300048616E646C653D307825782C48616E6429
+:102240006C655F56616C75655F506169725F4C6566
+:102250006E6774683D25642C446174615F4C656EE3
+:102260006774683D25640A0D00000000556E6B6EB2
+:102270006F776E5F6368617220555549443D3078D1
+:102280002530345820666F756E64205B25303458D5
+:1022900020253034585D210A0000000043454E548B
+:1022A00052414C5F414444524553535F5245534F52
+:1022B0004C5554494F4E5F555549443D3078253073
+:1022C000345820666F756E64205B253034582025A5
+:1022D0003034585D210A00002D2D204741545420F0
+:1022E0003A206E756D48646C6556616C7565506119
+:1022F00069723D25642C73686F727420555549448A
+:102300003D30782530345820464F554E44204368A0
+:10231000617250726F706572746965733D307825B3
+:10232000303458204368617248616E646C65205B8C
+:10233000307825303458202D203078253034585DC1
+:102340000A0000000A0D2046756C6C205555494462
+:10235000203A0000474150204445564943455F4ECE
+:10236000414D455F555549443D307825303458201E
+:10237000666F756E64205B253034582025303458E4
+:102380005D210A0047415020415050454152414E85
+:1023900043455F555549443D3078253034582066D3
+:1023A0006F756E64205B2530345820253034585DBD
+:1023B000210A00004741502050455249504845529B
+:1023C000414C5F505249564143595F464C41475F2B
+:1023D000555549443D30782530345820666F756E28
+:1023E00064205B2530345820253034585D210A00A4
+:1023F0004741545420534552564943455F43484151
+:102400004E4745445F434841524143544552495326
+:102410005449435F555549443D3078253034582060
+:10242000666F756E64205B25303458202530345833
+:102430005D210A00424154544552595F4C4556456E
+:102440004C5F434841525F555549443D30782530F3
+:10245000345820666F756E64205B25303458202513
+:102460003034585D210A000043555252454E545FA6
+:1024700054494D455F434841525F555549443D30AD
+:10248000782530345820666F756E64205B253034B3
+:102490005820253034585D210A0000004C4F43413C
+:1024A0004C5F54494D455F494E464F524D4154494A
+:1024B0004F4E5F434841525F555549443D30782562
+:1024C00030345820666F756E64205B253034582098
+:1024D000253034585D210A00446576696365496E8C
+:1024E000666F726D6174696F6E536572766963654C
+:1024F000204D414E5546414354555245525F4E4141
+:102500004D455F555549443D307825303458206657
+:102510006F756E64205B2530345820253034585D4B
+:10252000210A0000446576696365496E666F726DC5
+:102530006174696F6E53657276696365204D4F44AF
+:10254000454C5F4E554D4245525F555549443D30CF
+:10255000782530345820666F756E64205B253034E2
+:102560005820253034585D210A000000414E435365
+:102570005F4E4F54494649434154494F4E5F534F74
+:10258000555243455F434841525F555549443D309C
+:10259000782530345820666F756E64205B253034A2
+:1025A0005820253034585D210A000000414E435325
+:1025B0005F434F4E54524F4C5F504F494E545F4310
+:1025C0004841525F555549443D30782530345820B4
+:1025D000666F756E64205B25303458202530345882
+:1025E0005D210A00414E43535F444154415F534FC4
+:1025F000555243455F434841525F555549443D302C
+:10260000782530345820666F756E64205B25303431
+:102610005820253034585D210A0000004556545F8B
+:10262000424C55455F4154545F524541445F4259C5
+:102630005F545950455F524553502C206661696C78
+:1026400065642068616E646C65206E6F7420666FCF
+:10265000756E6420696E20636F6E6E656374696F5A
+:102660006E207461626C6520210A0D0000190A1D3C
+:10267000125C0844407970470FF6C8200A1D3919CA
+:102680007F1E515C03F0D4BA2DE9F04F0646DFF807
+:10269000208E87B000F01BFCDFF854A30FF2543BF0
+:1026A00001464FF48F6300F00DFCF378B278318867
+:1026B0000FF2503003F0BCFADFF8F82D3188508863
+:1026C000884240F08181B078012803D102244FF084
+:1026D00000090425022803D102244FF00C09122519
+:1026E00002F5F662F078DFF8D07D0292E9B2039647
+:1026F00090FBF1F1CDF81890C9B205950020049136
+:1027000021E003F047FD014640F2EE4300F0DAFB22
+:102710000FF250300DE042F6A62086424046F0D13E
+:1027200003F038FD014640F2EC4300F0CBFB0FF222
+:1027300070302A46314603F07BFA059804199DF85B
+:102740000400E4B2401C8DF804009DF804100498C5
+:10275000814280F247810398811C00190D5DC07889
+:10276000039945EA0025069800190A1D165C0844DD
+:10277000407946EA0026B6F5205F09D100F0A7FBB4
+:10278000014640F29B4300F09DFB0FF25830D0E72A
+:1027900042F6030086420ED100203880B880F880CF
+:1027A0007D8000F094FB01464FF4956300F08AFBB6
+:1027B0000FF25C30BDE7B6F5245F1CBF42F6021095
+:1027C000864240D1FD800299B8880A880FF27C3990
+:1027D00090420FD14D8000F07AFB40F2B3430146A6
+:1027E00000F070FB0095BB887A883146484603F0BC
+:1027F0001FFAA2E70A8A904205D1CD8200F067FB5A
+:1028000040F2B743EBE78A8A904205D14D8300F04E
+:102810005EFB40F2BB43E2E74A8A904205D10D835A
+:1028200000F055FB40F2BF43D9E700F050FB0146F2
+:1028300040F2C14300F046FB0095BB887A880FF256
+:1028400038303146D3E73E80B6F5285FBD8009D1E8
+:1028500000F03DFB014640F2CB4300F033FB0FF2AA
+:10286000583066E742F6012086420FF278390AD1E5
+:1028700000F02DFB014640F2CD4300F023FB2A4639
+:102880003146484657E742F60220864209D100F019
+:102890001EFB014640F2CF4300F014FB0FF27030F4
+:1028A00047E742F60320864205D100F010FB0146BF
+:1028B00040F2D143E1E742F60420864205D100F020
+:1028C00006FB014640F2D343D7E742F60520864295
+:1028D00009D100F0FCFA014640F2D64300F0F2FACA
+:1028E0000FF2643025E742F61920864209D100F044
+:1028F000EEFA014640F2D94300F0E4FA0FF28C30D0
+:1029000017E742F62B20864209D100F0E0FA014693
+:1029100040F2DC4300F0D6FA0FF2A03009E742F6AD
+:102920000F20864209D100F0D2FA014640F2DE4380
+:1029300000F0C8FA0FF2B430FBE642F629208642D6
+:1029400009D100F0C4FA014640F2E14300F0BAFABE
+:102950000FF2D030EDE642F62420864209D100F095
+:10296000B6FA014640F2E34300F0ACFA0FF2FC3055
+:10297000DFE641F20D20864209D100F0A8FA0146B7
+:1029800040F2E64300F09EFA0FF22440D1E64DF605
+:10299000F300864209D100F09AFA01464FF49D6394
+:1029A00000F090FA0FF24C40C3E64CF2E960864228
+:1029B0007FF4B1AE00F08BFA014640F2EA4300F03A
+:1029C00081FA0FF27040B4E600F081FA014640F25D
+:1029D000F64300F077FA07B0BDE8F04F0FF29040F1
+:1029E00003F026B907B0BDE8F08F000044310008BD
+:1029F000C85600084761747450617273654465730A
+:102A0000637300004556545F424C55455F41545432
+:102A10005F46494E445F494E464F524D4154494FDF
+:102A20004E5F52455350202D20436F6E6E65637488
+:102A3000696F6E5F48616E646C653D307825782CF7
+:102A4000466F726D61743D25642C4576656E745FCA
+:102A5000446174615F4C656E6774683D25640A0D5E
+:102A60000000000020696E76616C69642063686113
+:102A7000722076616C756520555549443D30782546
+:102A8000303458204368617256616C756548616ED8
+:102A9000646C65205B253034585D210A000000001D
+:102AA000202043454E5452414C5F414444524553CB
+:102AB000535F5245534F4C5554494F4E5F555549FE
+:102AC000443D307825303458204368617256616C3B
+:102AD000756548616E646C65205B253034585D21F6
+:102AE0000A0000005052494D4152595F5345525619
+:102AF0004943455F555549443D3078253034582089
+:102B000068616E646C653D3078253034580A0D007C
+:102B1000726573657420434841524143544552499C
+:102B2000535449435F555549443D30782530345816
+:102B30002043686172537461727448616E646C659D
+:102B40003D3078253034580A0D00000075756964F1
+:102B50003D3078253034582068616E646C653D30B6
+:102B600078253034582D3078253034582D3078255C
+:102B70003034580A0D0A0D0020756E6B6F776E5F4A
+:102B8000636861725F6465736320555549443D30E5
+:102B900078253034582068616E646C653D30782546
+:102BA0003034582D3078253034582D307825303455
+:102BB00058200A0D00000000474150204445564966
+:102BC00043455F4E414D455F555549443D3078255D
+:102BD00030345820666F756E64205B253034585D44
+:102BE000210A000047415020415050454152414E7A
+:102BF00043455F555549443D30782530345820666B
+:102C00006F756E64205B253034585D210A0000002A
+:102C1000474150205045524950484552414C5F5021
+:102C20005249564143595F464C41475F55554944C7
+:102C30003D30782530345820666F756E64205B25F2
+:102C40003034585D210A000020534552564943450F
+:102C50005F4348414E4745445F43484152414354D6
+:102C6000455249535449435F555549443D307825B1
+:102C7000303458204368617256616C756548616EE6
+:102C8000646C65205B253034585D0A004241545421
+:102C90004552595F4C4556454C5F434841525F553C
+:102CA0005549443D30782530345820666F756E6440
+:102CB000205B253034585D210A00000043555252F4
+:102CC000454E545F54494D455F434841525F555509
+:102CD00049443D30782530345820666F756E642045
+:102CE0005B253034585D210A000000004C4F434101
+:102CF0004C5F54494D455F494E464F524D415449F2
+:102D00004F4E5F434841525F555549443D30782509
+:102D100030345820666F756E64205B253034585D02
+:102D2000210A0000446576696365496E666F726DBD
+:102D30006174696F6E53657276696365204D414EAB
+:102D40005546414354555245525F4E414D455F559E
+:102D50005549443D30782530345820666F756E648F
+:102D6000205B253034585D210A00000044657669F7
+:102D70006365496E666F726D6174696F6E536572DB
+:102D800076696365204D4F44454C5F4E554D424535
+:102D9000525F555549443D30782530345820666F90
+:102DA000756E64205B253034585D210A00000000F8
+:102DB00020414E43535F4E4F544946494341544985
+:102DC0004F4E5F534F555243455F434841525F5505
+:102DD0005549443D30782530345820436861725657
+:102DE000616C756548616E646C65205B2530345894
+:102DF0005D210A002020414E43535F434F4E545201
+:102E00004F4C5F504F494E545F434841525F5555B8
+:102E100049443D307825303458204368617256610A
+:102E20006C756548616E646C65205B253034585D57
+:102E3000210A000020414E43535F444154415F53F7
+:102E40004F555243455F434841525F555549443DB4
+:102E5000307825303458204368617256616C75654E
+:102E600048616E646C65205B253034585D210A0032
+:102E70004556545F424C55455F4154545F46494E58
+:102E8000445F494E464F524D4154494F4E5F524563
+:102E900053502C206661696C65642068616E646CB7
+:102EA00065206E6F7420666F756E6420696E206396
+:102EB0006F6E6E656374696F6E207461626C6520FD
+:102EC000210A0D005A46504602F0B2BE2870404614
+:102ED00003F060B92DE9FC470446DFF8D485DFF83C
+:102EE000849E0FF2881AFFF7F2FF014640F2FE437C
+:102EF00000F0CCF92379628821880FF2881002F063
+:102F000097FEDFF8B00522884188914240F09E800C
+:102F100000F5F86561882888814209D1FFF7D7FF5D
+:102F2000014640F2045300F0B1F90FF2C01016E070
+:102F3000A8888142404609D103F02CF9014640F2AD
+:102F4000065300F0A3F90FF2C81008E003F022F9CD
+:102F500001464FF4A16300F099F90FF2D0100FF27F
+:102F6000E41602F065FE002706E0601DF9B27F1C42
+:102F7000415C304602F05CFE2179F8B28842F4D31D
+:102F8000FEF7EAFE6088298888421DD1FFF79FFF7F
+:102F9000014640F2125300F079F90FF2B01002F03E
+:102FA00047FE6779A679D4F809000090237AE27980
+:102FB00031463846FDF785FF37B9F00704D430466F
+:102FC000FEF75EF8FEF724F96088A98888424AD1A6
+:102FD0006579FFF77CFF014640F2325300F056F965
+:102FE0000FF2A41002F024FE95B9FFF770FF01461E
+:102FF00040F2375300F04AF90FF2A81002F018FE21
+:103000002079411F04F10A0289B20020FDF7C0FCBB
+:10301000012D17D1FFF75BFF014640F2435300F04B
+:1030200035F90FF2E81002F003FEA01D03F096FA46
+:10303000E11D82B20A442179081A811E89B2012059
+:10304000FDF7A6FCBDE8F347FEF7E2B8FFF73FFF48
+:10305000014640F2525300F019F9BDE8F6470FF26D
+:10306000E01002F0E5BDBDE8F3870000476174742D
+:1030700050617273654E6F74696669636174696FDC
+:103080006E0000004556545F424C55455F47415421
+:10309000545F4E4F54494649434154494F4E202DA9
+:1030A00020436F6E6E656374696F6E5F48616E6416
+:1030B0006C653D307825782C417474726962757442
+:1030C000655F48616E646C653D3078253034582CFE
+:1030D0004174747269627574655F56616C75655F81
+:1030E0004C656E6774683D25640A0D00414E43537C
+:1030F0004E6F74696669636174696F6E536F757240
+:1031000063654368617256616C7565203A20000002
+:10311000414E435344617461536F757263654368F4
+:10312000617256616C7565203A200000414E435330
+:103130004E6F74696669636174696F6E203A0A0D37
+:10314000000000002530325820000000312E2049B8
+:103150006E636F6D6D696E67204E6F666966696339
+:103160006174696F6E20726563656976656420427B
+:103170004153494320696E666F726D6174696F6E69
+:10318000203A200A0D0000005061727365204465EA
+:103190007461696C20496E666F6D6174696F6E73DE
+:1031A000200A0D00332E3120506172736520436F69
+:1031B0006D6D616E6449444765744E6F74696669EC
+:1031C000636174696F6E417474726962757465735A
+:1031D00020526573706F6E7365203A204465746188
+:1031E000696C20496E666F6D6174696F6E206F66E1
+:1031F000204E6F74696669636174696F6E204174F3
+:1032000074726962757465200A0D0000332E3320D4
+:10321000506172736520436F6D6D616E6449444700
+:10322000657441707041747472696275746573205D
+:10323000526573706F6E7365203A200A0D000000AE
+:103240004556545F424C55455F474154545F4E4F7D
+:1032500054494649434154494F4E2C206661696C9C
+:1032600065642068616E646C65206E6F7420666FA3
+:10327000756E6420696E20636F6E6E656374696F2E
+:103280006E207461626C6520210A0D00524648462A
+:1032900002F0CEBCFEB504466078FF282ED1B4F80B
+:1032A0000300DFF8C05A0FF21426814F40F60141A7
+:1032B000401A6FD0801E00F07F80401E2ED0401E2E
+:1032C0004AD0401E1BD0001F0AD0401F53D0401EC2
+:1032D00000F09780401E00F0CA80401E2DD0D8E03C
+:1032E00000F081FC014640F26F53FEF749F80FF2FF
+:1032F000E81002F09DFC601DFEF740F9D6E000F0FA
+:1033000072FC014640F27653FEF73AF80FF2F010E5
+:1033100002F08EFC601DFEF7DDFDC7E000F063FCEF
+:10332000014640F27D53FEF72BF80FF2F81002F041
+:103330007FFC601DFFF7A8F9B8E000F054FC0146DF
+:1033400040F28553FEF71CF80FF2002002F070FCEB
+:10335000601DFEF704FDA9E000F045FC014640F2C7
+:103360008D53FEF70DF80FF2102002F061FC601D86
+:10337000FEF713F89AE000F036FC014640F2955350
+:10338000FDF7FEFF0FF2182002F052FC601DFFF760
+:10339000A1FD8BE000F027FC01464FF4B463FDF77C
+:1033A000EFFFB4F80B30B4F80920B4F807100FF2AF
+:1033B000102002F03DFC79E000F015FC014640F2DF
+:1033C000AA53FDF7DDFFB4F80720B4F805100FF29B
+:1033D000502002F02DFC00F006FC014640F2AC53F8
+:1033E000FDF7CEFF0FF2882002F022FC08208DF8B6
+:1033F000040001A8B4F80510ADF8061002F018F8A2
+:1034000054E0E079002838460DD102F0C3FE0146B1
+:103410004FF4B763FDF7B4FFB4F805100FF2942032
+:1034200002F006FC0DE002F0B5FE014640F2BC538E
+:10343000FDF7A6FFE279B4F805100FF2C02002F004
+:10344000F7FB1C484188B4F80500814203D10820ED
+:1034500002F0C2FF2AE000F0C6FB014640F2C4536E
+:10346000FDF78EFF0FF2F42002F0E2FB1EE000F009
+:10347000BAFB014640F2CB53FDF782FFA07A0090E1
+:103480002389E279B4F805100FF2243002F0D0FB62
+:103490000CE000F0A8FB01464FF4BA63FDF770FFA3
+:1034A000B4F803100FF2B83002F0C2FB0020FEBDEA
+:1034B000DC560008FC110020501F0020414E4353F1
+:1034C0005F436C69656E745F4576656E745F4861D5
+:1034D0006E646C6572000000204556545F424C5586
+:1034E000455F4154545F524541445F42595F4752E2
+:1034F0004F55505F545950455F524553500A000094
+:10350000204556545F424C55455F4154545F5245E7
+:1035100041445F42595F545950455F524553500AE8
+:1035200000000000204556545F424C55455F415411
+:10353000545F46494E445F494E464F524D415449AF
+:103540004F4E5F524553500A00000000204556542C
+:103550005F424C55455F474154545F444953435F74
+:10356000524541445F434841525F42595F55554976
+:10357000445F524553500A00204556545F424C5513
+:10358000455F4154545F46494E445F42595F545928
+:1035900050455F56414C5F524553500A00000000B1
+:1035A000204556545F424C55455F474154545F4E49
+:1035B0004F54494649434154494F4E0A00000000C8
+:1035C0004556545F424C55455F474154545F415402
+:1035D000545249425554455F4D4F4449464945442C
+:1035E00020417474725F48616E646C653D3078256B
+:1035F000303458204F66667365743D30782530341A
+:103600005820417474725F446174615F4C656E67E9
+:1036100074683D307825303458200A0D00000000D1
+:103620004556545F424C55455F4154545F4558439D
+:1036300048414E47455F4D54555F524553502043D6
+:103640006F6E6E656374696F6E5F48616E646C6502
+:103650003D307825303458205365727665725F525C
+:10366000585F4D5455203D202564200A000000007D
+:103670004556545F424C55455F4154545F4558434D
+:1036800048414E47455F4D54555F52455350203D8C
+:103690003D3E20414E43535F4D54555F455843488E
+:1036A000414E47455F434F4D504C455445200A0D10
+:1036B000000000004556545F424C55455F47415459
+:1036C000545F50524F4345445552455F434F4D5010
+:1036D0004C455445202D20436F6E6E656374696FB1
+:1036E0006E5F48616E646C653D3078253034782CAF
+:1036F0002073756363657373200A0D004556545F2C
+:10370000424C55455F474154545F50524F434544E6
+:103710005552455F434F4D504C455445202D204355
+:103720006F6E6E656374696F6E5F48616E646C6521
+:103730003D3078253034782C4572726F725F436F5C
+:1037400064653D3078253032582028307834313A5D
+:10375000204661696C6564290A0D00004556545F76
+:10376000424C55455F474154545F50524F43454486
+:103770005552455F434F4D504C4554452C20666192
+:10378000696C65642068616E646C65206E6F74207E
+:10379000666F756E6420696E20636F6E6E6563740C
+:1037A000696F6E207461626C6520210A0D00000053
+:1037B0004556545F424C55455F474154545F45520E
+:1037C000524F525F5245535020436F6E6E65637483
+:1037D000696F6E5F48616E646C653D30782530348A
+:1037E00058205265715F4F70636F64653D30782576
+:1037F000303258204174747269627574655F486133
+:103800006E646C653D307825303458204572726F97
+:10381000725F436F64653D30782530325820283020
+:103820007830353A20496E73756666696369656EEE
+:10383000742061757468656E7469636174696F6E14
+:103840002C307830413A2041747472696275746525
+:10385000206E6F7420666F756E64290A0000000088
+:10386000696E76616C69642065636F646520307889
+:10387000253034580A00000080B500F02FF80146CA
+:1038800040F2DE530FF2180200F06CF80FF22C0039
+:1038900002F0CEF9DFF818084088BDE804408DE05A
+:1038A000414E43535F4170705F4B6579427574744C
+:1038B0006F6E31416374696F6E0000000A0D202A3B
+:1038C0002A205465726D20434F4E4E454354494F54
+:1038D0004E202A2A20200A0D00000000DFF8D4071D
+:1038E00002F058BC80B5FFF7F9FF014640F2E35300
+:1038F0000FF2280200F036F80FF23C0002F098F9BF
+:103900001A208DF80000DFF8A8174888ADF80200EB
+:10391000684601F08DFDFDF77BFC01BD414E435330
+:103920005F4170705F4B6579427574746F6E3241A0
+:103930006374696F6E000000526576696577207464
+:1039400068652050726545786973746564204E6FB0
+:1039500074696669636174696F6E200A0D00000006
+:103960000FF20802DFF8FC0302F062B9414E435344
+:103970005F4E6F74696669636174696F6E5F4368F7
+:1039800065636B0010B5DFF82C07DFF8244702F001
+:1039900001FC014640F2EC530FF22802FFF7E2FF70
+:1039A0000FF23C0002F044F9E07904F1080103F061
+:1039B00018F802F07AFF6088BDE81040132102F089
+:1039C00062BF0000414E43535F4170705F4B6579A9
+:1039D000427574746F6E33416374696F6E000000DA
+:1039E000206163695F6761705F636C6561725F73BB
+:1039F000656375726974795F64622026206163690A
+:103A00005F6761705F72656D6F76655F626F6E6430
+:103A100065645F6465766963652026206163695F1C
+:103A20006761705F7465726D696E617465200A0DFF
+:103A30000000000080B5FFF751FF014640F2F4534B
+:103A40000FF22402FFF78EFF0FF23C0002F0F0F8B5
+:103A5000DFF8CC0D00F10801C07902F0C2FFBDE82B
+:103A6000014002F022BF0000414E43535F4170709D
+:103A70005F52656D6F76655F426F6E64696E675FFA
+:103A8000496E666F00000000206163695F676170C6
+:103A90005F636C6561725F73656375726974795F8A
+:103AA00064622026206163695F6761705F72656D83
+:103AB0006F76655F626F6E6465645F646576696387
+:103AC00065200A0D00000000F8B5DFF8E445DFF8D6
+:103AD000E475DFF8505D0FF278066080E17104F163
+:103AE00008015079607310792073D078E072907873
+:103AF000A0725078607210782072E07902F03BFF7B
+:103B0000401E8041C00F207100F06DF801464FF457
+:103B1000C263FDF735FC21790FF2500002F088F8FE
+:103B2000608800F05BF89DF8011061719DF800104D
+:103B3000A17160B900F057F8014640F21963FDF732
+:103B40001FFC00F0D9FB0FF2500002F071F8F1BD3C
+:103B5000414E43535F4170705F506565725F426FC5
+:103B60006E6465645F436865636B00006163695FF1
+:103B70006761705F69735F6465766963655F626FD3
+:103B80006E64656420506565725F426F6E64656443
+:103B90003D25640A000000006163695F6761705F32
+:103BA0006765745F73656375726974795F6C657658
+:103BB000656C2053656375726974795F4D6F6465D8
+:103BC0003D2025642C2053656375726974795F4CC0
+:103BD0006576656C3D202564200A0D006A460DF16E
+:103BE000010102F003BE384602F0D4BAF8B5DFF89E
+:103BF000C0745C4C38780FF27015DFF8B864072891
+:103C000015D00B280FD00F280BD0112811D0172852
+:103C10006CD0182878D0192800F084801A2857D042
+:103C200091E0032000E00420BDE8F24084E10020A0
+:103C30004BE0012000F06AFB022000F067FB03204C
+:103C400000F064FB042000F061FB00F071F9014614
+:103C500040F23C632A4600F068F9BB797A793979F9
+:103C60000FF21C1001F0E4FF07F2B6700188002982
+:103C70001CBF4088002827D0387930B1012801BF07
+:103C800078790128B97901291ED1012000F054F971
+:103C900000F04EF9014640F245632A4600F045F92E
+:103CA0000FF2141001F0C4FF47F23050FDF76FFB24
+:103CB00000F03EF9014640F247632A4600F035F92C
+:103CC0000FF2201001F0B4FF0520BDE8F2401DE323
+:103CD00000F02EF9014640F251632A4600F025F922
+:103CE0000FF22C1001F0A4FF002028E000F020F9D2
+:103CF00001464FF4CB632A4600F017F90FF22C105F
+:103D000001F096FF01201AE000F012F9014640F29E
+:103D10005F632A4600F009F90FF25C1001F088FF9A
+:103D200002200CE000F004F9014640F266632A46E6
+:103D300000F0FBF80FF27C1001F07AFF0320BDE8E1
+:103D4000F24001F0A7BA00F0F3F8014640F26D63CB
+:103D50002A4600F0EAF839780FF2A810BDE8F440DE
+:103D600001F066BFC8560008414E43535F41707072
+:103D70005F5570646174655F536572766963650051
+:103D8000506565725F426F6E6465643D25642053C3
+:103D9000656375726974795F4D6F64653D20256454
+:103DA0002C2053656375726974795F4C6576656C18
+:103DB0003D202564200A0D0077616974696E6720D3
+:103DC000666F7220204556545F424C55455F47410F
+:103DD000505F50414952494E475F434D504C54202B
+:103DE0000A0D000077616974656420666F72202097
+:103DF0004556545F424C55455F4741505F504149DD
+:103E000052494E475F434D504C54200A0D0000006C
+:103E1000414E43535F434845434B5F4E4F544946E1
+:103E200049434154494F4E200A0D000020414E4362
+:103E3000535F4745545F4E4F5449464943415449A7
+:103E40004F4E5F415454524942555445203D3E2007
+:103E5000414E43535F50524F435F4745545F4E4F6F
+:103E600054494649434154494F4E5F415454524985
+:103E700042555445200A0D00414E43535F47455477
+:103E80005F4150505F415454524942555445203D82
+:103E90003E20414E43535F50524F435F4745545F6E
+:103EA0004150505F415454524942555445200A0DE7
+:103EB00000000000414E43535F504552464F524D63
+:103EC0005F4E4F54494649434154494F4E5F414329
+:103ED00054494F4E203D3E20414E43535F50524F78
+:103EE000435F504552464F524D5F4E4F54494649ED
+:103EF000434154494F4E5F414354494F4E200A0DB0
+:103F000000000000696E76616C696420616E637305
+:103F10005F636F6E746578742E73746174653D258C
+:103F200064200A0D000000003A46204601F080BEE1
+:103F3000304602F02FB900002DE9FC41042847F279
+:103F400030555B4CDFF8DC680FF26C17DFF86481EA
+:103F500057D8DFE800F07B03436A57000920207040
+:103F60006A466088FFF73BFE00284AD1FEF7AFFFA4
+:103F700001464FF4D0633A4600F0C4F900F0BCF9B2
+:103F80000FF2401001F054FE608802F0F6FB58B9C1
+:103F9000FEF79DFF014640F284633A4600F0B2F915
+:103FA0000FF2601001F044FEFEF791FF014640F26F
+:103FB00087633A4600F0A6F90FF27C1001F038FE54
+:103FC0002846FDF7E4F9FEF782FF014640F28963D7
+:103FD0003A4600F097F90FF2AC1065E00E20207021
+:103FE000FEF775FF014640F291633A4600F08AF908
+:103FF0000FF2DC1001F01CFE6088DFF82C1802F0D4
+:104000006FFB53E00B202070FEF761FF014640F28A
+:1040100099633A4600F076F961880FF2D01001F00A
+:1040200007FE608802F053FC40E00F202070012161
+:10403000608802F0BCFCFEF74AFF014640F2A36331
+:104040003A4600F05FF90FF2D8102DE0FEF73FFF7F
+:10405000014640F2A9633A4600F054F90FF22420D9
+:1040600001F0E6FD042020701321608802F00BFCB3
+:1040700004000CD0FEF72BFF014640F2AE633A4637
+:1040800000F040F921460FF2142001F0D1FD28463E
+:10409000FDF77DF9FEF71BFF014640F2B2633A4699
+:1040A00000F030F90FF2182001F0C2FDBDE8F381F5
+:1040B000FC110020DC56000847617050726F63529B
+:1040C00065710000414E43535F5345435552495477
+:1040D000595F524551455354205365637572697455
+:1040E000795F4D6F64653D2025642C2053656375B1
+:1040F000726974795F4C6576656C3D202564200A91
+:1041000000000000414E43535F534543555249540C
+:10411000595F524551455354206163695F6761702F
+:104120005F736C6176655F73656375726974795FDF
+:1041300072657120200A0D00414E43535F53454381
+:1041400055524954595F524551455354207761693E
+:1041500074696E6720666F72204556545F424C55F5
+:10416000455F4741505F534C4156455F534543556A
+:10417000524954595F494E49544941544544200AD3
+:104180000D000000414E43535F534543555249547F
+:10419000595F5245514553542077616974656420D5
+:1041A000666F72204556545F424C55455F474150FB
+:1041B0005F534C4156455F53454355524954595FEF
+:1041C000494E4954494154454420200A0D000000FD
+:1041D000414E43535F504153535F4B45595F5245E6
+:1041E00053504F4E5345200A0D000000414E43539B
+:1041F0005F414C4C4F575F5245424F4E44206163E4
+:10420000695F6761705F616C6C6F775F7265626F29
+:104210006E6428307825303458290A0D00000000DB
+:104220004741505F50524F435F4E554D45524943B1
+:104230005F434F4D50415249534F4E5F56414C558D
+:10424000455F434F4E4649524D202A2A20616369FB
+:104250005F6761705F6E756D657269635F636F6DD7
+:1042600070617269736F6E5F76616C75655F636FA5
+:104270006E6669726D5F7965736E6F2D2D3E59455F
+:1042800053200A007465726D696E61746520636FF6
+:104290006E6E656374696F6E200A00005465726DFE
+:1042A00020436F6E6E656374696F6E20636D64206A
+:1042B0006661696C7572653A20307825780A00006D
+:1042C0004741505F50524F435F5445524D494E4114
+:1042D00054455F434F4E4E454354494F4E20636F04
+:1042E0006D706C657465206576656E7420726563AB
+:1042F00065697665640A00009DF800209DF801104C
+:1043000070474A46304601F093BC00002DE9FF4754
+:10431000DFF80C75DFF80C650FF21459DFF80C8527
+:10432000052807F29A7547F2305A10D8DFE810F0E6
+:1043300006003E00AF00FD007C01E201062038705F
+:104340004FF404627888FA2102F089FB002840F0DB
+:104350006582FEF7BCFD01464FF4D963FFF7D1FF3C
+:104360004FF40462FA210FF2D44001F061FC0720FF
+:104370003870788801F0A6FD00F088FF002C4046D8
+:1043800009D101F007FF014640F2CE63FFF7B9FF04
+:104390000FF2F440ABE001F0FDFE014640F2D263C3
+:1043A000FFF7AFFF21460FF2045035E211203870BD
+:1043B0000021D0208DF800008DF801102D208DF8FF
+:1043C000020012218DF803101E208DF804004B21ED
+:1043D0008DF805100F208DF80600A4218DF8071028
+:1043E00099208DF808004E218DF80910CE208DF807
+:1043F0000A00B5218DF80B1031208DF80C00F42146
+:104400008DF80D1005208DF80E0079218DF80F1014
+:104410006A467888022101F098FD040040460BD1DD
+:1044200001F0B8FE014640F2E163FFF76AFF0FF2C8
+:10443000B04001F0FDFB0BE001F0ACFE014640F2A4
+:10444000E563FFF75EFF21460FF2E04001F0F0FB6D
+:1044500000F019FFE88BA98B59B9002849D1FEF764
+:1044600036FD014640F2EB63FFF74BFF0FF21850A9
+:104470003DE000283DD0FEF72AFD014640F2EF6303
+:10448000FFF73FFFEA8BA98B0FF25C50C9E01020C9
+:104490003870788801F03FFD040040460BD101F0F0
+:1044A00079FE014640F2FB63FFF72BFF0FF2A450A9
+:1044B00001F0BEFB0BE001F06DFE014640F2FF6330
+:1044C000FFF71FFF21460FF2DC5001F0B1FB00F0B7
+:1044D000DAFEE88BA98B69B900280AD1FEF7F7FC50
+:1044E000014640F20573FFF70CFF0FF2186001F070
+:1044F0009FFB93E10028FCD0FEF7E9FC014640F267
+:104500000973FFF7FEFEEA8BA98B0FF2406001F002
+:104510008FFBFEF7DCFC014640F20A73FFF7F1FE69
+:104520006A8A298A0FF278607BE012203870FEF7E1
+:10453000CEFC014640F21573FFF7E3FEA88B019015
+:1045400000906B882A8879880FF2A86001F070FBD0
+:104550006A882988788801F01BFD0028404609D127
+:1045600001F018FE014640F21D73FFF7CAFE0FF27C
+:10457000F46008E001F00EFE014640F22173FFF7FF
+:10458000C0FE0FF2107001F053FB00F07CFE298C8E
+:1045900000291CBFE88C00280CD0FEF798FC0146CF
+:1045A00040F22773FFF7ADFEEA8C298C0FF20C70F6
+:1045B00001F03EFBA98C00291CBF688D00280CD09F
+:1045C000FEF785FC014640F22B73FFF79AFE6A8DD9
+:1045D000A98C0FF25C7001F02BFB698C00291CBFC9
+:1045E000288D00280CD0FEF772FC014640F22F7394
+:1045F000FFF787FE2A8D698C0FF2987001F018FB87
+:10460000A98A00291CBFE88A00280CD0FEF75FFCAD
+:10461000014640F23373FFF774FEEA8AA98A0FF26B
+:10462000DC7001F005FBF9E013203870FEF74FFC59
+:10463000014640F23D73FFF764FE6A8829880FF651
+:10464000200001F0F5FA6A882988788801F0B1FC29
+:104650000028404609D101F09DFD014640F2447317
+:10466000FFF74FFE0FF6240008E001F093FD01462E
+:104670004FF4E963FFF745FE0FF64C0001F0D8FA5E
+:1046800000F001FEA88D58B1FEF721FC014640F272
+:104690004E73FFF736FEA98D0FF6600001F0C8FAE1
+:1046A000E88D58B1FEF713FC014640F25273FFF754
+:1046B00028FEE98D0FF68C0001F0BAFA288E58B169
+:1046C000FEF705FC014640F25673FFF71AFE298EED
+:1046D0000FF6B00001F0ACFA288B0028A3D0FEF74B
+:1046E000F6FB014640F25A73FFF70BFE298B0FF6DB
+:1046F000D40091E00120298BADF8000031B31620E1
+:1047000038706B467888022201F08CFC00F0BEFD08
+:10471000002C40460CD101F03DFD014640F26E7385
+:10472000FFF7EFFD298B0FF6DC0001F081FA0DE0B9
+:1047300001F030FD014640F27373FFF7E2FD298B73
+:104740000FF608102346462201F072FA288E002840
+:1047500030D015213970FEF7BAFB014640F27C7368
+:10476000FFF7CFFD2A8E79880FF64C1001F060FA22
+:10477000298E00F083FD00F089FD002C40460BD10E
+:1047800001F008FD014640F28573FFF7BAFD0FF610
+:10479000641001F04DFA0DE001F0FCFC014640F21E
+:1047A0008A73FFF7AEFD298E0FF688102346462246
+:1047B00001F03EFAA88D002830D014213970FEF7A0
+:1047C00086FB014640F29373FFF79BFDAA8D798823
+:1047D0000FF6CC1001F02CFAA98D00F04FFD00F07F
+:1047E00055FD002C40460DD101F0D4FC014640F2AD
+:1047F0009C73FFF786FD0FF6EC1001F019FA01200B
+:1048000038700BE001F0C6FC014640F2A173FFF7DF
+:1048100078FD21460FF6142001F00AFABDE8FF8763
+:10482000FC110020C856000807B20100DC56000841
+:104830004761747450726F6352657100414E435307
+:104840005F5345545F444154415F4C454E47544883
+:10485000207365742064617461206C656E67746890
+:10486000202564202564206F6B203D3D3E616369F7
+:104870005F676174745F65786368616E67655F63C5
+:104880006F6E666967200A006163695F67617474AF
+:104890005F65786368616E67655F636F6E666967A1
+:1048A00020636D64206F6B200A0D00006163695FF7
+:1048B000676174745F65786368616E67655F636F75
+:1048C0006E66696720636D64204B4F207265737557
+:1048D0006C743D307825303278200A0D00000000DD
+:1048E000474154545F50524F435F444953435F41E3
+:1048F0004E43535F53455256494345206163695FB8
+:10490000676174745F646973635F7072696D61720B
+:10491000795F736572766963655F62795F757569E2
+:104920006420636D64206F6B0A000000474154549B
+:104930005F50524F435F444953435F414E43535F7F
+:1049400053455256494345206163695F67617474FA
+:104950005F646973635F7072696D6172795F7365BB
+:1049600072766963655F62795F7575696420636DEE
+:1049700064204E4F4B20737461747573203D307802
+:1049800025303258200A0000474154545F50524F9E
+:10499000435F444953435F414E43535F534552562F
+:1049A00049434520414E4353205365727669636500
+:1049B000206973204E4F5420666F756E642021214C
+:1049C00021203D3D3E20636F6E6E656374656420FB
+:1049D000746F20416E64726F69642050686F6E65F9
+:1049E0002F506164200A0D00474154545F50524FCC
+:1049F000435F444953435F414E43535F53455256CF
+:104A000049434520414E435320536572766963659F
+:104A1000205B307825303458202D203078253034F4
+:104A2000585D20697320666F756E642021212120F6
+:104A30003D3D3E20636F6E6E656374656420746FE8
+:104A400020694F532050686F6E652F506164200AB3
+:104A50000D000000474154545F50524F435F44499A
+:104A600053435F414C4C5F5052494D4152595F5343
+:104A700045525649434553206163695F67617474C9
+:104A80005F646973635F616C6C5F7072696D6172A2
+:104A9000795F736572766963657320636D64206FF7
+:104AA0006B0A0000474154545F50524F435F4449E2
+:104AB00053435F414C4C5F5052494D4152595F53F3
+:104AC00045525649434553206163695F6761747479
+:104AD0005F646973635F616C6C5F7072696D617252
+:104AE000795F736572766963657320636D64204EC8
+:104AF0004F4B20737461747573203D3078253032CC
+:104B000058200A00474154545F50524F435F444974
+:104B100053435F414C4C5F5052494D4152595F5392
+:104B20004552564943455320414E435320536572E5
+:104B300076696365206973204E4F5420666F756EE9
+:104B40006420212121200A0D000000004741545417
+:104B50005F50524F435F444953435F414C4C5F5059
+:104B600052494D4152595F5345525649434553208E
+:104B7000414E43532053657276696365205B3078FC
+:104B800025303458202D203078253034585D206968
+:104B90007320666F756E6420212121200A0D0000AC
+:104BA000474154545F50524F435F444953435F4120
+:104BB0004C4C5F5052494D4152595F5345525649F2
+:104BC00043455320474154542053657276696365C9
+:104BD000205B307825303458202D20307825303433
+:104BE000585D20697320666F756E64202121212035
+:104BF0000A0D0000414E43535F444953434F56450D
+:104C0000525F414C4C5F434841525320636F6E6E7C
+:104C1000656374696F6E5F68616E646C653D307862
+:104C20002530345820414C4C536572766963654891
+:104C3000616E646C655B25303458202D202530343E
+:104C4000585D20414E4353536572766963654861F0
+:104C50006E646C655B25303458202D202530345827
+:104C60005D0A0000414C4C206368617261637465A9
+:104C70007269737469637320646973636F766572B4
+:104C80006564205375636365737366756C6C792016
+:104C90000A0D0000414C4C206368617261637465C9
+:104CA0007269737469637320646973636F76657284
+:104CB00079204661696C6564200A0D0047415454AF
+:104CC0005F50524F435F444953435F414C4C5F43F5
+:104CD0004841525320414E43534E6F746966696395
+:104CE0006174696F6E536F75726365436861725367
+:104CF0007461727448646C653D3078253034582096
+:104D000020414E43534E6F74696669636174696FE5
+:104D10006E536F757263654368617256616C756539
+:104D200048646C653D307825303458200A0D000009
+:104D3000474154545F50524F435F444953435F418E
+:104D40004C4C5F434841525320414E43534461749D
+:104D500061536F75726365436861725374617274F5
+:104D600048646C653D3078253034582020414E43EE
+:104D70005344617461536F75726365436861725621
+:104D8000616C756548646C653D3078253034582019
+:104D90000A0D0000474154545F50524F435F44494D
+:104DA00053435F414C4C5F434841525320414E4373
+:104DB00053436F6E74726F6C506F696E74436861A9
+:104DC00072537461727448646C653D307825303478
+:104DD000582020414E4353436F6E74726F6C506F76
+:104DE000696E744368617256616C756548646C6580
+:104DF0003D307825303458200A0D00004741545486
+:104E00005F50524F435F444953435F414C4C5F43B3
+:104E10004841525320536572766963654368616EF9
+:104E200067656443686172537461727448646C6549
+:104E30003D3078253034582020536572766963659B
+:104E40004368616E6765644368617256616C75653D
+:104E500048646C653D307825303458200A0D0000D8
+:104E6000414E43535F444953434F5645525F414C73
+:104E70004C5F434841525F4445534353205B2530C8
+:104E80003458202D20253034585D0A00416C6C20A8
+:104E900063686172616374657269737469632064C5
+:104EA000657363726970746F727320646973636F82
+:104EB0007665726564205375636365737366756C9C
+:104EC0006C79200A0D000000416C6C2063686172EF
+:104ED0006163746572697374696320646573637276
+:104EE0006970746F727320646973636F7665727929
+:104EF000204661696C6564200A0D000047415454E6
+:104F00005F50524F435F444953435F414C4C5F44B1
+:104F10004553435320414E43534E6F746966696352
+:104F20006174696F6E536F75726365436861724433
+:104F300065736348646C653D307825303458200AC9
+:104F40000D000000474154545F50524F435F4449A5
+:104F500053435F414C4C5F444553435320414E43C0
+:104F600053436F6E74726F6C506F696E74436861F7
+:104F7000724465736348646C653D307825303458FD
+:104F8000200A0D00474154545F50524F435F44493B
+:104F900053435F414C4C5F444553435320414E4380
+:104FA0005344617461536F75726365436861724401
+:104FB00065736348646C653D307825303458200A49
+:104FC0000D000000474154545F50524F435F444925
+:104FD00053435F414C4C5F444553435320536572E8
+:104FE000766963654368616E6765644368617244AE
+:104FF00065736348646C653D307825303458200A09
+:105000000D000000536572766963654368616E67E1
+:105010006564436861724465736348646C653D30E0
+:105020007825303458206E6F7469666963617469DD
+:105030006F6E20656E61626C656420537563636595
+:10504000737366756C6C79200A0D00005365727677
+:105050006963654368616E6765644368617244654E
+:10506000736348646C653D307825303458206E6F2A
+:1050700074696669636174696F6E20656E61626CE4
+:105080006564204661696C656420424C455F5354F9
+:10509000415455535F4E4F545F414C4C4F5745441C
+:1050A0003D30782530327820726573756C743D30F0
+:1050B00078253032580A0000414E43535F454E4137
+:1050C000424C455F4E4F54494649434154494F4E27
+:1050D0005F444154415F534F555243455F444553EC
+:1050E000432030782530345820307825303458200B
+:1050F0000A000000414E435344617461536F75725E
+:105100006365436861724465736348646C65206ECF
+:105110006F74696669636174696F6E20656E616240
+:105120006C6564205375636365737366756C6C7925
+:10513000200A0D00414E435344617461536F7572F0
+:105140006365436861724465736348646C653D30B0
+:105150007825303458206E6F7469666963617469AC
+:105160006F6E20656E61626C6564204661696C6576
+:105170006420424C455F5354415455535F4E4F5445
+:105180005F414C4C4F5745443D30782530327820B4
+:10519000726573756C743D3078253032580A0000A2
+:1051A000414E43535F454E41424C455F4E4F54493B
+:1051B0004649434154494F4E5F4E4F544946494337
+:1051C0004154494F4E5F534F555243455F444553F9
+:1051D000432030782530345820307825303458201A
+:1051E0000A000000414E43534E6F74696669636163
+:1051F00074696F6E536F757263654368617244655D
+:10520000736348646C65206E6F746966696361746A
+:10521000696F6E20656E61626C65642053756363AF
+:1052200065737366756C6C79200A0D00414E4353AB
+:105230004E6F74696669636174696F6E536F7572DE
+:105240006365436861724465736348646C65206E8E
+:105250006F74696669636174696F6E20656E6162FF
+:105260006C6564204661696C656420726573756C59
+:10527000743D3078253032580A00000078886B463B
+:10528000022200F0CFBE5046FCF784B804465046D8
+:10529000FCF780B82DE9F8430C27DFF824440FF21F
+:1052A00028450FF2D8480FF23449032886B004F598
+:1052B000CC764FF6FF7157D8DFE800F0020A57703E
+:1052C00007B01A2020701F20BDE8F043FBF7D8BEBE
+:1052D000B4F8900717228842227001D080280CDB96
+:1052E000FBF7ECFD014640F2BD734246FCF749F87E
+:1052F000B4F890170FF2904064E0FBF7DFFD014631
+:1053000040F2C3734246FCF73CF8B4F89007784388
+:1053100031580FF2B04000F08BFCB4F890074743CF
+:105320000121F05901908DF808108DF809108DF8C1
+:105330000C108DF810108DF814108DF815108DF8D4
+:1053400016108DF817104FF49470ADF80A00ADF8F0
+:105350000E00ADF8120001A984B06846142200F0D6
+:105360008BFC0FBCFBF7B4F85FE018272770FBF746
+:10537000A5FD014640F2DC734246FCF702F8A17B32
+:105380000FF2A84004F10F0200F052FCA07B04F1E0
+:105390000F0107B0BDE8F043FBF773BA1920207086
+:1053A000B4F89007884201D0802810DBFBF786FD17
+:1053B000014640F2E7734246FBF7E3FFB4F890176B
+:1053C0000FF2AC4007B0BDE8F04300F031BCFBF792
+:1053D00075FD014640F2ED734246FBF7D2FFB4F88B
+:1053E000901707FB01F0002332580FF2C04000F085
+:1053F0001FFCB4F89007784300213058FBF751F9AF
+:10540000FBF75CFD014640F2F2734246FBF7B9FF41
+:10541000B4F890170FF2E84000F00AFCB4F89007D7
+:105420004743E019002180F8901107B0BDE8F083F0
+:105430002DE9FC4101780FF290240FF200570FF292
+:105440009C289F4D032919D0052924D0072900F055
+:10545000F280082900F0FC800A2948D00B2900F0CE
+:10546000DF800C2950D00D292BD00F2934D01129E1
+:1054700000F002811A2900F00D811DE1408868804A
+:105480001120FDF723FD014640F60603FEF74CFD13
+:105490000FF2C0400CE1FDF71AFD014640F60E0385
+:1054A000FEF742FD0FF2E04000F0C2FB287804282E
+:1054B00004BF0020FBF768FF05202870FBF76AFE99
+:1054C000FAE00E20FDF702FD014640F61A03FEF752
+:1054D0002BFD0FF2D040EBE00F20FDF7F7FC01466B
+:1054E00040F62203FEF720FD0FF2EC40E0E00A2038
+:1054F000FDF7ECFC014640F62A03FEF715FD0FF21E
+:10550000045000F095FB87E0FDF7E1FC014640F612
+:105510003303FEF709FD29790FF2045000F088FBF0
+:105520006888FEF75BFB60B9FDF7D1FC014640F6E9
+:105530003703FEF7F9FCFEF7DFFE0FF2105000F024
+:1055400077FB2879002805F2B6763CD1E87905F199
+:10555000080101F010FA401E8041C00F2871FDF7CC
+:10556000B6FC014640F64503FEF7DEFC29790FF252
+:10557000345000F05DFBFDF7AAFC014640F64703FE
+:10558000FEF7D2FC0FF25450DFF8388100F050FBE8
+:105590000A244AA741460846411E0028FBD1384646
+:1055A00000F046FB641EF5D16888132101F06BF909
+:1055B000002809D1308800281CBF718800297BD0C1
+:1055C000FBF7E8FD28E0012876D16879012801BFC2
+:1055D000A97901299DF80100012817D19DF8001033
+:1055E000022913DBFDF773FC014640F66303FEF767
+:1055F0009BFC9DF80020A9790FF2485000F018FBA1
+:105600009DF80000A8719DF801006871308800289D
+:105610001CBF718800294FD00020FBF7B5FE4BE07E
+:105620000B20FDF753FC014640F67203FEF77CFCAD
+:105630000FF254503CE0FDF74AFC014640F6790376
+:10564000FEF772FC0FF2585000F0F2FA07201FE04C
+:10565000FDF73DFC014640F68103FEF765FC0FF2C5
+:10566000545000F0E5FA2878072804BF0020FBF723
+:105670008BFE082028701FE0FDF729FC014640F64C
+:105680008B03FEF751FC0FF24C5000F0D1FA1120C1
+:1056900028700FE01A2028701F20FBF7F1FCFDF79F
+:1056A00016FC014640F69503FEF73EFC0FF244500F
+:1056B00000F0BEFAFBF7ACFDBDE8F3812E0A0D0049
+:1056C000FC11002040420F000D0A205B25735D5B3A
+:1056D00025735D5B25645D2000000000433A5C6437
+:1056E00065765C4749545F446F72795F4C697474A6
+:1056F0006C65446F72795F4E5C73746D33327762A0
+:105700005F4D345F4669726D776172655C466972A0
+:105710006D776172655C50726F6A656374735C501B
+:105720002D4E55434C454F2D574235352E4E756302
+:105730006C656F5C4170706C69636174696F6E73E6
+:105740005C424C455C424C455F48656172745261F5
+:1057500074655F414E43535C53544D33325F575031
+:10576000414E5C4170705C616E63735F636C696530
+:105770006E745F6170702E6300000000416E637391
+:1057800050726F6352657100414E43535F474554F9
+:105790005F4E4F54494649434154494F4E5F41542F
+:1057A0005452494255544520494E56414C49445F54
+:1057B0004E4F544946595F454E5452592025642056
+:1057C0000A0D0000414E43535F4745545F4E4F540E
+:1057D000494649434154494F4E5F4154545249420E
+:1057E00055544520696E74657261637420776974DD
+:1057F0006820694F53204E6F7469666963617469EC
+:105800006F6E4944203078253038782C20726574CA
+:105810007269657665206D6F726520696E666F725C
+:105820006D6174696F6E0A0D00000000414E4353B4
+:105830005F4745545F4150505F415454524942556F
+:105840005445204170704964656E7469666965727B
+:105850004C656E6774683D256420417070496465CD
+:105860006E7469666965723A2573200A0D0000003E
+:10587000414E43535F504552464F524D5F4E4F5439
+:10588000494649434154494F4E5F414354494F4E65
+:1058900020494E56414C49445F4E4F544946595F4A
+:1058A000454E545259202564200A0D00414E435361
+:1058B0005F504552464F524D5F4E4F544946494303
+:1058C0004154494F4E5F414354494F4E206E6F74CF
+:1058D000696679456E7472793D2564204E6F7469EE
+:1058E0006669636174696F6E494420307825303889
+:1058F000782061637449443D2564200A0D0000004E
+:10590000414E43535F504552464F524D5F4E4F54A8
+:10591000494649434154494F4E5F414354494F4ED4
+:10592000206E6F74696679456E7472793D256420C6
+:1059300052656D6F7665640A0D000000414E435359
+:105940005F4170705F4E6F74696669636174696FFF
+:105950006E000000414E43535F434F4E4E4543544B
+:105960004544203D3D3E20414E43535F444953430F
+:105970004F5645525F414E43535F5345525649433C
+:1059800045200A0D00000000414E43535F44495337
+:10599000434F4E4E5F434F4D504C455445200A0DEA
+:1059A00000000000414E43535F504153535F4B454D
+:1059B000595F52455155455354203D3D3E20414E7F
+:1059C00043535F504153535F4B45595F52455350CA
+:1059D0004F4E5345200A0D00414E43535F4E554DE7
+:1059E000455249435F434F4D50415249534F4E5FDB
+:1059F00056414C55455F434F4E4649524D200A0D86
+:105A000000000000414E43535F53454355524954F3
+:105A1000595F494E49544941544544200A0D0000FC
+:105A2000414E43535F50414952494E475F434F4DAA
+:105A3000504C45544520506565725F426F6E6465F9
+:105A4000643D25642020200A0D000000414E435390
+:105A50005F50414952494E475F434F4D504C45546A
+:105A600045206163695F6761705F6765745F736537
+:105A70006375726974795F6C6576656C20536563D4
+:105A800075726974795F4D6F64653D256420536557
+:105A90006375726974795F4C6576656C3D25642029
+:105AA0000A0000006163695F6761705F69735F642A
+:105AB00065766963655F626F6E64656420506565D5
+:105AC000725F426F6E6465642066726F6D2030781D
+:105AD0003030203D3D3E2025640A0000414E4353B6
+:105AE0005F50414952494E475F434F4D504C4554DA
+:105AF0004520205465726D20436F6E6E6563746936
+:105B00006F6E20666F7220746865206669727374A8
+:105B10002070616972696E6720636F6D706C657467
+:105B20006520746F207361766520626F6E64696EA4
+:105B30006720696E666F6D6174696F6E2021212127
+:105B4000200A0D00414E43535F50414952494E4790
+:105B50005F434F4D504C455445202053656375724B
+:105B60006974795F4C6576656C3D2564203D3D3EEA
+:105B70002053656375726974795F4C6576656C3D19
+:105B80002564200A0D000000414E43535F414C4CF8
+:105B90004F575F5245424F4E44200A0D000000000F
+:105BA000414E43535F4D54555F5550444154452039
+:105BB0000A0D0000414E43535F4D54555F45584315
+:105BC00048414E47455F434F4D504C455445200A90
+:105BD0000D000000414E43535F444953434F564527
+:105BE000525F414E43535F53455256494345200A45
+:105BF0000D000000414E43535F434845434B5F4E09
+:105C00004F54494649434154494F4E5F45565420ED
+:105C10003D3D3E20414E43535F434845434B5F4E1D
+:105C20004F54494649434154494F4E200A0D000004
+:105C30000EB4C0B5024603A800210190009101AB4B
+:105C40000121044878440C3000F0A0FF06BC5DF848
+:105C500010FB00BF7392000062B38B0708D0521E86
+:105C600011F8013B00F8013B00F024808B07F6D1CE
+:105C7000830740F0208000BF103A07D330B4B1E86A
+:105C80003810103AA0E83810F9D230BC530724BFBE
+:105C9000B1E80810A0E8081044BF51F8043B40F8F0
+:105CA000043BD20724BF31F8022B20F8022B44BF5B
+:105CB0000B7803707047121F17D35B0009D151F89E
+:105CC000043B20F8023B1B0C121F20F8023BF6D2CB
+:105CD0000BE051F8043B00F8013B1B0A20F8023BA3
+:105CE0001B0C121F00F8013BF3D238BF121D521ECD
+:105CF00024BF11F8013B00F8013BF8D8704700B50C
+:105D000087B000208DF8000000F087F940F2011004
+:105D1000ADF806003F220120069000F0F6F90028B9
+:105D20004CBFFF209DF8000007B000BD2DE9F841F1
+:105D300007460128C7B0884615461E4608BF022000
+:105D400003D002280CBF102000200DF11D010C18FB
+:105D500000F036F8012F8DF81C7002D0022F18D0F9
+:105D600019E002273A4641460DF11D0000F083FA82
+:105D70002570667000F051F93F204FF4817100F0FA
+:105D800016F8FF1C049700F0C2F9002805D5FF2083
+:105D900009E01027E6E7472005E09DF8000010B96C
+:105DA0004E9800F067F8FFE748B0BDE8F081ADF825
+:105DB0000400ADF8061007A8032103900691704770
+:105DC00003220021684600F05CBA2DE9F64F0C462C
+:105DD0000546012CC7B09B4608BF022003D0022C09
+:105DE0000CBF102000200DF11F010E18FFF7E8FF77
+:105DF000012CADF81C508DF81E4002D0022C2CD086
+:105E00002DE00227569C559DDDF85091DDF84CA100
+:105E1000DDF8488148993A4600F0B6F8A6F800B097
+:105E200086F8028086F803A086F804907571B47134
+:105E300000F0F3F83F20ADF804004FF4827107A89A
+:105E4000ADF80610039003210A370497069100F07D
+:105E50005EF9002805D5FF2009E01027D2E747208A
+:105E600005E09DF8000010B9579800F003F849B01C
+:105E7000BDE8F08FBDF8011001800020704730B5FB
+:105E8000C7B01C464A9B00F023F900258DF800504E
+:105E90008DF82140224619460DF1220000F0EBF961
+:105EA00000F0BBF83F204FF4837100F01CF9A41DF3
+:105EB000049400F02CF900284CBFFF209DF800004E
+:105EC00047B030BD00B5C7B000F039F800F017F8A2
+:105ED0000F21029140F20B10022100F00EF9002870
+:105EE0004CBFFF209DF8000047B000BD0023ADF877
+:105EF0001C008DF8003007A8418082800021182204
+:105F000001A800F0BEB900228DF80020ADF81C00F9
+:105F10008DF81E10704700B5C7B000F010F8FFF7FD
+:105F2000EEFF0F2102914FF48970022100F0E5F895
+:105F300000284CBFFF209DF8000047B000BD0021A5
+:105F4000ADF81C008DF80010704718B5C7B01346A7
+:105F500000228DF800200229FFF7D8FF0CBF102483
+:105F600002242246194600F00FF800F056F840F2DD
+:105F7000131100F02FF800F0CAF800284CBFFF20E2
+:105F80009DF8000048B010BD0DF11F0000F073B97E
+:105F900000B5C7B0FFF7AAFF0F21029140F215101C
+:105FA00000F0AAF800284CBFFF209DF8000047B081
+:105FB00000BD00B5C7B0FFF799FF0F21029140F275
+:105FC000171000F099F800284CBFFF209DF8000042
+:105FD00047B000BDADF806103F2007A9ADF804009A
+:105FE00003910F20012102900691E41C0494704754
+:105FF00018B5C7B000F02BF800F041F800F00DF82C
+:106000004FF48E7100F02DF800F081F800284CBF9D
+:10601000FF209DF8000048B010BD1822002101A803
+:1060200000F02FB918B5C7B000F011F800F027F84C
+:10603000FFF7F3FF40F2211100F013F800F067F8CA
+:1060400000284CBFFF209DF8000048B010BD14464A
+:10605000ADF81C00002207A88DF8002041800471D3
+:106060007047ADF806103F2007A9ADF80400039172
+:106070000F20012102900691641D0494704722466E
+:1060800019460DF1210000F0F6B878B5C7B04C9C68
+:106090004D9D00F01DF800268DF821308DF8006030
+:1060A0008DF822402246294600F019F8FFF7B5FF87
+:1060B0003F204FF4937100F016F8E41D049400F0B3
+:1060C00026F800284CBFFF209DF8000048B070BDA6
+:1060D000ADF81C00ADF81E108DF8202070470DF1B2
+:1060E000230000F0C8B8ADF80400ADF8061007A80A
+:1060F00001210390069170470621ADF80600049136
+:1061000007A801213F2203900691ADF80420CDF8A5
+:1061100014D0002101A801F058BDF0B40246106867
+:1061200095681318506803EB5004C00721D54D44FF
+:106130001FE0F0BC02F10C00704713F8017B05F87A
+:10614000017B491EF9D1A0B1B60813F8011B06F076
+:106150000306032E08BF13F8016B01EB0621494229
+:10616000801C294405D011F8016B05F8016B401E15
+:10617000F9D1A342DDD013F8016B16F0030104BF7F
+:1061800013F8011BC91C30090F28DAD113F8010BD1
+:106190000F30D6E738B55C21044601F0A7FD25464F
+:1061A00008B15C2105E02F21204601F09FFD20B1C0
+:1061B0002F21204601F09AFD451C284632BD38B5F6
+:1061C000EFF3108472B6284D6946281D01F0B3FE26
+:1061D0006946281D01F00CFF38B184F31088BDF822
+:1061E0000010224A01F0ECFF31BD0120287084F339
+:1061F000108831BD80B501F0E1FF0221009100233C
+:10620000194800F124014FF48052001D01F07AFD7D
+:1062100001BD00BFF8B514460026EFF3108510F15C
+:10622000010F1ED001281CBF02284FF0FF3618D1E5
+:10623000BCB1264672B60C4F012392B2381D01F054
+:1062400075FD00281CBF3978002908D000223A705B
+:1062500085F31088A1B2054A01F0B2FF01E085F391
+:1062600010883046F2BD00001C000020BF6100080D
+:10627000002202F041B810B50446FFF7EDFC2046BD
+:1062800010BD10B5044610460A460146204602F0ED
+:106290004DF8204610BDB1F5807F02D34FF0FF309E
+:1062A00070470170012070470078401E8041C04354
+:1062B000C00F70472DE9FC47594CDFF86891A5697C
+:1062C0002840A0614FF0010A4FF0FF3830E0491C30
+:1062D00054F831000642FAD004EBC107184079683F
+:1062E0001040014208BFC7F804807E68304000F0CB
+:1062F0009BF860620AFA00F086437E60EFF310813B
+:1063000072B6626A20690AFA02F2D2431040206132
+:10631000022004EBC00353F8086C1640401E43F8FB
+:10632000086CF6D181F31088606A59F8201088470C
+:1063300063692069A2691840104207D0E069216AA8
+:10634000084203D1002103EA0206C1E702F021F866
+:10635000EFF3108972B6216960690140A0690142BA
+:1063600001BFE169206A014202F06DF889F31088EB
+:1063700002F085F8A561BDE8F38738B51446EFF360
+:10638000108572B600F050F8264941F8204085F398
+:10639000108831BD10B5EFF3108272B6204B1C6926
+:1063A00004431C6153F83140204343F8310082F329
+:1063B000108810BDEFF3108172B6194A536923EAB1
+:1063C000000005E0EFF3108172B6154A53691843D7
+:1063D000506181F310887047EFF3108172B6104A54
+:1063E000D3691843D061F4E72DE9F0410C4C626A9F
+:1063F000266A2062012101FA02F803E0394640468C
+:1064000002F022F8276AE5693D42F7D0404600F0E5
+:106410000BF825EA0707E76126626062BDE8F081B4
+:1064200040100020101C002002460020110C09041E
+:1064300004BF1020120412F07F4F04BF0830120274
+:106440000FF2180112F0704F04BF001D1201120F5D
+:10645000C0F11F00895C401A70470000040302026B
+:106460000101010100000000000000002749002098
+:10647000087700222648027300F04CB823490A7FAF
+:1064800041F82200087F401C0877704720490A7BAA
+:1064900041F82200087B401C0873704770B5044621
+:1064A0006078FF2802BFB4F8031001F47F41B1F512
+:1064B000406F1FD10025154E317FE8B2884222D2AD
+:1064C000E9B256F8211020468847002808BF6D1C05
+:1064D000F2D018E0761C297BF0B288420AD2F1B2E1
+:1064E00055F82110204688470100F3D002D0022839
+:1064F00005D006E02046BDE8704002F033B8002029
+:1065000070BD012070BD0026014DE4E7E41E0020AF
+:10651000241F002080B503F0A3F903F0A2F903F0D3
+:10652000A1F903F0D7FA03F0D6FA03F07DFB03F0EC
+:10653000E9FD03F0E8FD03F0E7FD03F0E6FD03F0FD
+:10654000E5FD03F0E4FD03F0E3FD03F0E2FD03F0FD
+:10655000E1FDBDE8014003F0DEBD000000F10103F4
+:10656000810704D010F8011B89B18107FAD10268B4
+:10657000B2F10131914311F0803F04BF50F8042F74
+:10658000F6E710F8011B11B110F8011BFBE7C01A68
+:10659000704700B587B000F072F900F0B2F98120C1
+:1065A00000F068F900F0C4F900284CBFFF209DF806
+:1065B000000007B000BD2DE9F84DC7B09446DDF8E6
+:1065C00040E1519A559D569EDDF84CA1ADF81D1045
+:1065D0008DF81C004FF0000BADF81FC08DF8213076
+:1065E0008DF822E000F024F800F017F824F8095F95
+:1065F000668000F086F93F20832100F0B4F957440B
+:1066000006910D37049700F096F900284CBFFF2043
+:106610009DF8000048B0BDE8F08D88F800A007ACF8
+:106620005499E419524608F101005444FFF723BE7F
+:106630008DF82320174652998DF800B00DF12408EB
+:1066400009A8B844FFF717BE00B5C7B000F00CF8B2
+:10665000852000F0C3F800F06BF900284CBFFF2044
+:106660009DF8000047B000BD00218DF81C008DF89A
+:106670000010182201A8FFF704BE2DE9F841C7B0A9
+:106680004FF0000800F026F80DF12300DDF844E19A
+:106690004E9F4F9E509D529C8DF81F30C0F800E0D9
+:1066A0008DF800808DF820708DF821608DF82250D3
+:1066B0008DF8274000F025F98620ADF8060007A9DF
+:1066C0000C2000F031F900284CBFFF209DF800009D
+:1066D00000F07BB98DF81C0007A8417082707047EC
+:1066E00000B5C7B00022ADF81C008DF800200DF1F8
+:1066F0001E001822016001A80021FFF7C2FD8820BA
+:10670000ADF8060007A9062000F00EF900284CBFDE
+:10671000FF209DF8000047B000BDF8B5C8B00546A1
+:106720000E4617461C4600F023F808A846708770EE
+:106730008DF8205000F012F98A21ADF80A103F20A0
+:10674000032100F0FEF8002848BFFF200ED49DF87A
+:10675000000058B94F994E98BDF801202280BDF82D
+:1067600003200280BDF805000880002049B0F0BD7C
+:10677000072200216846FFF784BD00B5C7B000219D
+:10678000ADF81C00FFF773FF0F2102918D2002214D
+:1067900000F0BDF800F0CDF800284CBFFF209DF8B8
+:1067A000000047B000BD18B5C7B0044600F067F858
+:1067B0008DF81C40224600F0F6F800F0A2F83F20C9
+:1067C0008E2100F005F9641C049400F0B4F8002850
+:1067D0004CBFFF209DF8000048B010BDADF806008A
+:1067E00007A901203F2203910490704778B5C7B0F4
+:1067F00006460C4615460322FFF7BBFFADF81C60AA
+:1068000000F07FF8902100F01AF80221ADF80400A2
+:10681000049107A803210390069100F08CF800284A
+:1068200048BFFF2009D49DF8000030B99DF8010051
+:1068300020709DF802002870002048B070BDADF8AF
+:1068400006103F207047ADF8060007A902207047E8
+:1068500000B587B000F013F800F053F8922000F074
+:1068600009F800F065F800284CBFFF209DF80000F3
+:1068700007B000BDADF806003F22012070470020A0
+:106880008DF80000704700B5C7B000F033F80F2155
+:106890000291932000F03AF800F04BF800284CBF2A
+:1068A000FF209DF8000047B000BD00B587B0FFF79E
+:1068B000E6FF00F026F89420FFF7DCFF00F038F840
+:1068C00000284CBFFF209DF8000007B000BD00B5B8
+:1068D000C7B00021ADF81C00FFF7C9FE9520FFF7F7
+:1068E000B2FF00F021F800284CBFFF209DF8000007
+:1068F00047B000BD00228DF80020ADF81C008DF8D7
+:106900001E101822002101A8FFF7BBBC0321ADF81F
+:106910000600049107A801213F22039006917047C9
+:10692000ADF8060007A9032004903F22012003913F
+:106930000690ADF80420CDF814D0002101A801F094
+:1069400044B9ADF80800059108A807210490079103
+:10695000CDF818D0002102A801F037B91822002183
+:1069600002A8FFF78EBCADF80400ADF8061007A82A
+:1069700001210390704700B5C7B000F00EF8FFF793
+:10698000C0FFA42100F03FF8FFF7D5FF00284CBF5F
+:10699000FF209DF8000047B000BD00228DF80020C8
+:1069A0008DF81C0006220DF11D00FFF764BC00B538
+:1069B000C7B0FFF79FFFA520FFF7B2FF00284CBF2D
+:1069C000FF209DF8000047B000BD48B0BDE8F08151
+:1069D000ADF80400ADF8061007A801210390069158
+:1069E000704700B5C7B0FFF7D8FFFFF78AFFAA21AD
+:1069F00000F009F8FFF79FFF00284CBFFF209DF82B
+:106A0000000047B000BDADF806103F200721ADF8EB
+:106A10000400049107A8012103900691704700B576
+:106A200087B000F014F8012003220690ADF804208E
+:106A3000ADF8062000F0A3F800284CBFFF209DF819
+:106A4000000007B000BDADF8061008207047002018
+:106A50008DF800001822002101A8FFF712BC78B5BC
+:106A6000C7B004460D461646032200F01EF8ADF8E6
+:106A70001C40ADF81E50ADF82060FFF7EBFF22215F
+:106A8000FFF7E1FF062100F009F800F076F8002892
+:106A90004CBFFF209DF8000048B070BDADF8040069
+:106AA000049107A803217047092200216846FFF7D7
+:106AB000E8BB1822002102A8FFF7E3BB182201A8B7
+:106AC000FFF7DFBB70B5C8B006460C461546052279
+:106AD000FFF7EBFFADF82060FFF7EBFF302100F090
+:106AE00014F80521049000F019F8002848BFFF2091
+:106AF00009D49DF8000030B99DF8030020709DF87E
+:106B000004002870002048B070BDADF80A100820BD
+:106B10000221ADF80800059108A870470791CDF84B
+:106B200018D0002102A801F050B800B5C7B000F09D
+:106B30000EF8FFF7C3FF312000F013F800F01FF844
+:106B400000284CBFFF209DF8000047B000BD002387
+:106B50008DF81C008DF8003007A84170827000216C
+:106B60007047ADF8060007A9032004900822012011
+:106B700003910690ADF80420704703900691CDF87C
+:106B800014D0002101A801F020B800002DE9F84F31
+:106B90000FF2D017A2B0D7E90045CDE900452C9EF1
+:106BA000DFF82C7C04918DF8436000210FF2BC14B7
+:106BB0000D9112944FF0FF368246904699460FE0B1
+:106BC000C3462C461BF8011B0498D04700280490AC
+:106BD00000F0B2800D98401C641E0D90F2D1A844C4
+:106BE00098F80000252807D1002107910891099104
+:106BF0000A910B910C910DE06A463146404603F034
+:106C0000BBFA050001D10D98B4E0D9D50125E6E71E
+:106C100041F0010118F8010F2028F9D023280CD0E9
+:106C20002B2804D02D2805D0302809D086E041F04B
+:106C30000201EFE741F00401ECE741F00801E9E768
+:106C400041F01001E6E700200F900AE00F98B842EB
+:106C500005DA00EB800302EB4302303A0F9208F1B1
+:106C6000010898F80020A2F130000A28EED398F825
+:106C700000002E2818BF0E9629D118F8010F2A28D7
+:106C80000BD1D9F80000C9F8000008F1010850F84C
+:106C9000042BC9F800000E9219E02D280CBF18F83B
+:106CA000010B002000220E920BE040B90E9ABA426E
+:106CB00005DA02EB820403EB4403303B0E9308F148
+:106CC000010898F80030A3F130020A2AEDD3ADF89C
+:106CD0004010129898F8001003F05AFA08B118F80A
+:106CE000010B8DF842009DF84200682804BF98F817
+:106CF0000010682903D162208DF8420008E06C285A
+:106D000004BF98F800006C2804D171218DF842105E
+:106D100008F1010813A806904A4618F8013B02A999
+:106D2000504600F067F838B913AA02A9504600F09F
+:106D3000C9F900287FF554AF30461BE02A2882D1DC
+:106D4000D9F80020C9F8002052F8040BC9F8002037
+:106D500000280F9003D540420F9041F0040108F144
+:106D6000010884E70000000000000000686A6C74FD
+:106D70007A4C000023B0BDE8F08F622820D068284C
+:106D800011D06A2803D06C2827D0712825D1086833
+:106D9000C01D20F007000860D0E90023083008601B
+:106DA000194610467047002A0A680A60106803D026
+:106DB000121D0A6000B217E0121D0A6080B217E0CF
+:106DC000002A0A680A60106803D0121D0A6040B2E7
+:106DD0000AE0121D0A60C0B20AE0002A0A680A60CE
+:106DE000106803D0121D0A60C1177047121D0A6097
+:106DF000002170477CB50D4611461C462E69B4F142
+:106E0000250200F04D811C3A00F08680121F022AF4
+:106E100040F282800E3A00F00781521F5AD0093AA0
+:106E20007AD0921E16D0521E35D0521E022A73D925
+:106E3000121F30D0521F00F09A80521E4AD0521EAC
+:106E400000F0E480D21E00F0FD80921E42D0D21EDF
+:106E500040D02BE195F83A206C2A09D06869421C91
+:106E60006A610A680A6052F8043B0A60335427E1F9
+:106E70000A680A6052F8043B0A60002100930191FD
+:106E80004FF0FF322A6329466A4600F096F900283F
+:106E900040F1168101E195F83A000122FFF76DFFFC
+:106EA000C5E900010023994204DA6869411C69615F
+:106EB0002D210DE0288F810704D56869411C696187
+:106EC0002B2105E0C00722D56869411C696120219A
+:106ED00031541CE095F83A000022FFF74EFFC5E957
+:106EE000000195F83800010711D5D5E900230020ED
+:106EF000834208BF82420AD044F02000782806D19D
+:106F0000686930213154401C411C69613454214668
+:106F100068693044E86083E00868C01D20F007001D
+:106F20000860D0E9002308300860C5E90023D5E9EE
+:106F30000001C80F04D06869411C69612D210DE072
+:106F4000288F810704D56869411C69612B2105E000
+:106F5000C00704D56869411C696120213154686902
+:106F60003044E8602146284600F032FAA8E005F1F6
+:106F70003A02507820B14FF0FF340FF6243070E021
+:106F80001078622808D0682824D06A2812D06C288B
+:106F90002ED071280ED02BE00A680A6052F8040B3C
+:106FA0000A6020B94FF0FF340FF60C3059E0E96A5F
+:106FB000017085E00A680A6052F8040B0A6020B983
+:106FC0004FF0FF340FF6F0204BE0EA6AD317C0E928
+:106FD000002375E00A680A6052F8040B0A6020B9C1
+:106FE0004FF0FF340FF6D0203BE0E96A018067E004
+:106FF0000A680A6052F8040B0A6020B94FF0FF34A7
+:107000000FF6B4202DE0E96A016059E00A680A60D1
+:1070100052F8040B0A600021C5E90001EE607821F6
+:10702000284600F029F94BE06C2285F83A200B68DD
+:107030000B6053F8042B0B6052BB4FF0FF340FF67C
+:10704000AC200EE095F83A206C2AF0D00868086071
+:1070500050F8044B0860EC603CB94FF0FF340FF679
+:10706000702003F0A1F8201A76BD2E6B002E04D5F7
+:107070002046FFF773FA044608E032460021204616
+:1070800003F0B4F8002814BF041B3446AC6117E0C9
+:10709000294600F092F8002812D54FF0FF3076BD57
+:1070A0006869411C69612521315409E06969481CFE
+:1070B000686125227254210002D0411C6961345458
+:1070C000002076BD2DE9F0410E460546716B7069D2
+:1070D000B46A091A306A091AB069091A706A091A79
+:1070E000F069091A96F838000C1B410790460DD438
+:1070F000002C0BDD2746B0682021A8470028B0608F
+:1071000057D0F06A401C7F1EF062F4D1736942468A
+:107110003146284600F0ACFC00284AD1376A002FDF
+:107120000ADDB0683021A8470028B06041D0F06A7D
+:10713000401C7F1EF062F4D1B369F26831462846E4
+:1071400000F096FCA8BB776A002F09DDB0683021FB
+:10715000A847B06068B3F06A401C7F1EF062F5D1AA
+:10716000F068B169F36942183146284600F080FCA6
+:10717000F8B9B76A002F09DDB0683021A847B060C0
+:10718000B8B1F06A401C7F1EF062F5D196F8380065
+:1071900041070BD5002C09DDB0682021A847B0605D
+:1071A00038B1F06A401C641EF062F5D10020BDE8E1
+:1071B000F0814FF0FF30BDE8F0812DE9F8470D4632
+:1071C000A3B02F6B002F8146904648BF6FF0004759
+:1071D00003F038F8696B40180FF62C118128D1E9BB
+:1071E0000023CDE9012328BF4FF0FF303ED2002419
+:1071F000002F2FDDD8F8001001AA684602F0BEFF6C
+:107200000646002E35D4D8F8000008B9761E30D4D2
+:10721000B7421FDB6869301881280AD300206863F1
+:1072200003AA29464846FFF74DFF040012D4002068
+:10723000686103A8D5F814A0324669465044FEF7A9
+:107240000BFDB244C5F814A058F8040B002818BF71
+:10725000BF1BCDD12CB903AA29464846FFF732FF00
+:10726000044614B9002068616863204624B0BDE874
+:10727000F0874FF0FF34F8E72DE9FC4707468A46D0
+:107280003E69BAF16F0F08BF082405D04AF020010B
+:10729000782914BF0A2410243C25D7E90023BAF129
+:1072A000640F18BFBAF1690F9046994606D10021C4
+:1072B0008B4203DAD8F1000869EB490900208145C7
+:1072C00008BF80451FD1386BE8B9082C4CD197F81E
+:1072D0003800010748D530203B2586F83B0043E0C5
+:1072E00000280ED597F8380000F01400102808D1B7
+:1072F0007A6B7869121A386A121A511A0029C8BFB3
+:107300003962BDE8F3878DF800A040464946224621
+:10731000E31702F09DFF3032D0B26D1E3A2801957E
+:1073200004DB9DF80000A0F151018A187255404617
+:1073300049462246E31702F08BFF8046894600202B
+:10734000814508BF804503D0F86871198842DCD3B5
+:10735000082C09D197F83800010705D5715D30294F
+:1073600002D06D1E30207055C5F13C01B961701915
+:10737000F860386B8142B3DA411A39624FF6EF7028
+:10738000398F01403987BDE8F3872DE9D0430646A0
+:107390000F4614464FF00008DFF8389412E0E0077B
+:1073A00007D542464B463046394603F069F8064653
+:1073B0000F464046494642464B4603F061F864108A
+:1073C00080468946002CEAD130463946BDE8D08354
+:1073D0002DE9F34F054641F020048DB0D5E9008931
+:1073E000612C02AE09D0286B002848BF062003D4C8
+:1073F00008BF672C01D101202863D5E9002358007C
+:107400004015401C0ED119030CD00320A8619DF833
+:10741000380061381A2802D20FF2F46111E00FF23D
+:10742000F4610EE058004015401C0FD119030DD136
+:107430000320A8619DF8380061381A2814D30FF290
+:10744000DC61E8680322FEF707FCD3E1194621F06E
+:107450000043B3F5801F10460DD20027BB4208BF82
+:10746000BA42019703D111E00FF2AC61E9E701AA3A
+:1074700003F0D8F80AE0DFF8607307EB1352DFF887
+:107480005C3301921940DFF858331943C5E9000114
+:10749000612C0ED1E86830210170811CE9609DF8F3
+:1074A000381061290CBF7821582141706869801C0F
+:1074B0006861D5E900AB2BF0004300202AF0000200
+:1074C000834204BF8242002300F05A81612C40F0C5
+:1074D000A980286B00284CBF2120401C009040460A
+:1074E000009F7F1C49460022002303F0D3F8D946B1
+:1074F00001988DF8082038BF89F00049001F0190DD
+:10750000002FD0460DF1090040F3498140F2FF7190
+:10751000DFF8D0B20C9106464046494600220023CF
+:1075200003F0D0F880F03A814800400D00F11C02D1
+:1075300010D0002A0EDD0C98824205DB09F00040D5
+:1075400040EA0B01002013E0A448084040EA025141
+:1075500040460DE029F00043002028F0000283425D
+:1075600008BF82420FBF40461C22404603F0C2F8CB
+:107570008046894603F05CF9FF1F002F044609DDB1
+:1075800003F074F902460B464046494603F080F981
+:1075900080468946F01D072104E004F00F0200F840
+:1075A000012D2411002C01DD491EF6D5491E5CBFBA
+:1075B000002200F8012DF9D5ECE00020194602AABE
+:1075C0000A4400E05B1E12F80149491E8442F9D0CA
+:1075D0000F2804D10DF10900425C521C42540029CD
+:1075E00004D50198001D02AE5B1C0190591E12D4F7
+:1075F0009DF838007218147804F130085FFA88F4A6
+:10760000392CC4BFA0F13A04A044491E02F80189F4
+:10761000F1D58DF83800286B002840F1B080591E54
+:107620002963ACE0404649460022002303F032F8CB
+:10763000019938BF89F0004947F2975041436A4A9F
+:1076400091FBF2F20192D2F1070204DD4046494675
+:10765000FFF79BFE0AE0524200206449FFF795FEC7
+:1076600002460B464046494603F084F98046662CA4
+:10767000286BDFF87CB106BF019F0A3706273F1849
+:10768000142FC8BF142730208DF8080089460DF14B
+:10769000090000E03046002F34DD064640464946EA
+:1076A00003F08CFA01460A4606F1080304200A2674
+:1076B000B2FBF6F606EB860EA2EB4E02303203F872
+:1076C000012C0A22B6FBF2F202EB820EA6EB4E066A
+:1076D0003036401E03F8026DE9D1083F002F03F158
+:1076E0000806D7DD084603F07DFA02460B46404601
+:1076F000494603F0CDF800225B4602F0C1FE804609
+:107700008946CBE70DF10901401A0DF1090604E0A5
+:107710000199491E401E0191761C31783029F7D01D
+:10772000662C02D10199491C03E0652C0CBF012194
+:1077300000212B6BCB189842B8BF431E002B1ED4E0
+:10774000834204DAF05C3528A8BF392000DA302003
+:107750001946721E02EB010800E05B1E18F8019941
+:10776000491E8145F9D0392802D1705C401C705403
+:10777000002904D50198401C16465B1C0190019815
+:1077800000B200901BB29DF838103246284600F037
+:1077900034F82FE0C61D002F3FF7BEAE30460DF186
+:1077A0000901401A009903468842C8BF0B46002BC6
+:1077B0000DF109063FF52FAF8342BFF6FEAE0DF186
+:1077C0000900C05C07287FF7F8AE0F20F6E600003E
+:1077D000CBCCCC0C0000244002FCFFFFFFFF0F804D
+:1077E0000000E03F0000F07FA08601000000F03FB5
+:1077F00084D797410FB0BDE8F08F2DE9F84783B0EB
+:1078000006468A461746984602F0BAFCB8F1000FC1
+:10781000406A356B90F8009003DC4FF001080FF2DE
+:107820000037BDF930404AF02000662808BF641CCC
+:1078300015D0672840F0848014F1040FC0F28680D0
+:10784000AC4280F2838096F83800641C010702D4B1
+:10785000A845B8BF454620B22D1A48BF00250FFAEB
+:1078600084FAF068B169BAF1000F25DC4A1C3023B4
+:107870004354002D03DC96F83800010703D5F06867
+:1078800000F80290521C15EB0A0FB8BF6C4220B2F0
+:10789000441941424445B8BFA046B26171620FFA33
+:1078A00088F5F561F068B3692A4639461844FEF751
+:1078B000D3F9641BB462C4E022B29045084417DADD
+:1078C00042463946FEF7C8F9B0694044B061AAEBB8
+:1078D0000801002D716203DC96F838100A0705D5FF
+:1078E000F16801F80090F069401CF061B562A8E011
+:1078F0003946FEF7B1F9B069002D5044A8EB0408F1
+:1079000003DC96F838100A0703D5F16801F80090F7
+:10791000401CB0610FFA88F08542F068B369B8BFC7
+:10792000A8460FFA88F207EB0A011844FEF794F90B
+:10793000B0690FFA88F10844B061681A706280E09B
+:10794000BAF1610F14D14FF0700A16E0A84504DABD
+:1079500096F838100A0758BF45466D1E48BF0025E7
+:10796000BAF1670F14BF4FF0450A4FF0650A04E003
+:10797000BAF1410F08BF4FF0500AB169F368481CD3
+:10798000B061002D17F8012B5A5403DC96F838101B
+:107990000A071BD5F168431CB36101F80090002D64
+:1079A00014DDA8F101080FFA88F08542F068B8BF2D
+:1079B000A8460FFA88F239461844FEF74DF9B06927
+:1079C0000FFA88F108446D1AB0617562F068B16908
+:1079D0000844002C80F800A003D42B214170811CA6
+:1079E00003E02D2141706442811C00206A460AE0B8
+:1079F00023460A2493FBF4F404EB8405A3EB45032C
+:107A000002F8013B401C24B2002CF1DC012806DC0A
+:107A10004AF02002652A04BF302201F8012B48B940
+:107A2000302001F8010B07E0401E1DF80020303225
+:107A300001F8012B0028F7DCF068B2691044091A3C
+:107A4000F16196F8380000F0140010280DD171692A
+:107A5000B0694118706A4118F0694118B06A41185C
+:107A6000706B8142BCBF411A316204B0BDE8F0873F
+:107A7000F8B505460E4617461C46002074B117F8A7
+:107A8000011BB068A847B06030B1F06A401CF062DA
+:107A90000020641EF3D1F2BD4FF0FF30F2BD0000B4
+:107AA0007072696E74665F733A20256E2064697324
+:107AB000616C6C6F776564007072696E74663A20F1
+:107AC00062616420256E20617267756D656E740059
+:107AD0007072696E74665F733A2062616420257308
+:107AE00020617267756D656E740000007072696E5A
+:107AF00074665F733A2062616420256C7320617242
+:107B000067756D656E7400000000000000000000E5
+:107B10006E616E004E414E00696E6600494E460031
+:107B2000300000007FB50C466D4D61686D4EE86118
+:107B30002962284603F064F8246805F1240003F064
+:107B400069F8746006F1080003F064F801203070F1
+:107B5000296829B10FF255100090029468468847B1
+:107B60007FBD1FB55F4C04F1080003F056F800BB61
+:107B70002178F1B1694604F1080003F077F858481C
+:107B8000C16949B10098029001228DF8042001A832
+:107B900088479DF8040000E001202070207818B18B
+:107BA000009803F019F904E0009904F1080003F0CB
+:107BB0003DF804F1080003F030F828B9207818B136
+:107BC00004F1080001F0F4F81FBD2DE9F843064662
+:107BD000002000F05FF874883088B268DFF8008118
+:107BE000C4F3090444EA8024F068A4B2C1B2204678
+:107BF00000F03CF8002748F2E809484601F0DFF8B9
+:107C000008E06888A04202D1316928780870687855
+:107C100000B1012708F1240002F0FFFFF0B9694626
+:107C200008F1240003F022F8009800F10B05407AD7
+:107C30000F28E6D0B5F80110A1420DD10098817A45
+:107C4000C81E7169C0B28842C8BF0846706102464A
+:107C50003069E91CFEF700F82878D9E73800CCD065
+:107C6000012000F017F80020BDE8F28310B513469C
+:107C70001C4A5468A4F80900E1720A46194604F146
+:107C80000C00FDF7E9FF164A1369BDE8104000211A
+:107C9000002018471249096A82B008B921B101E0F1
+:107CA00011B1012002B0084702B0704710B501467B
+:107CB000487A0F2818BF0E2807D10B4802F0C0FFE2
+:107CC000BDE81040002001F077B8064C04F1080030
+:107CD00002F0B6FF04F10800BDE8104001F068B8FA
+:107CE000701E0020141F0020941E00200246C9B2FE
+:107CF000002013788B4208BF104612F8013B002B7E
+:107D0000F7D1704710B5029C016042600021C1604C
+:107D10000161416181610381A107047704D5008974
+:107D200010B14FF0FF3010BD002010BD2DE9F04F15
+:107D3000064685B030890C460027BB46002871698D
+:107D4000DC460CBF4FF00208D84681B168B93069F3
+:107D50007768451CBD4228BFED1B3768385C7D5DE8
+:107D600000EB0527BF1CBFB203E0074600E000B1EF
+:107D700002463069F568A84223BF7568281AC01BFF
+:107D80000020154608EB050903FB09FE864532BFB6
+:107D90000020B0FBF9FA09FB1A00C0B2804509DAED
+:107DA00096F81C905FEAC97A48BF84465FEA8970FA
+:107DB00048BFC446100000F0B4807068714461444C
+:107DC0008842C0F0AE8008EB020080B20390D94632
+:107DD000100AADF802000294ADF80020049359E0B7
+:107DE000800740D53089002840F09B803268D01849
+:107DF000A34600F8024C200A32681A4402F8010C2B
+:107E0000224630681844FDF727FF7069201870611A
+:107E1000B069019C401CB061200A31680C70316867
+:107E200048701CE08CB3307FC207D9D5308940B987
+:107E300031681944FF2001F8020C3168194401F837
+:107E4000010C4FF0000B7069241874612C463089C6
+:107E5000002340B931680C70210A30684170022358
+:107E60007069801C706108EB04070021BFB23161AA
+:107E70005CB1DA44029800EB0A01306822461844EB
+:107E8000FDF7EAFE70692418746109F10109B0690F
+:107E9000401CB061049A70683169914545D27918E7
+:107EA00081422CBF081A0846306103463089A0B9C8
+:107EB0003068BDF80010C1545B1C706831688342A3
+:107EC00028BF1B1ABDF80200C8545B1C70688342AF
+:107ED00028BF1B1A7069801C706105FB09FA746861
+:107EE000BDF80000E41A844288BF0446029800EB03
+:107EF0000A01281BAC42019003D093D2307F0028A6
+:107F000090D137682246F818FDF7A6FE7069201850
+:107F10007061A346019C039F0023A9E73068404499
+:107F200000E0002005B0BDE8F08F88448045F5D31F
+:107F3000A8EB0008F2E778B5028900230B80002A3D
+:107F400044690CBF02250025002C4FD0028952B98C
+:107F5000C2684668531CB34228BF9B1B0668B25CCC
+:107F6000F35C02EB03220A80027F02F00302012A83
+:107F700025D10B884FF6FF72934204BF0289002A75
+:107F800009D0C36802699A4219D20289BAB1466817
+:107F9000F31A934213D24368C268E41A14190022F8
+:107FA000C260446102894AB902681478012B94BF07
+:107FB000C3F101030123D25C04EB02220A80C468EE
+:107FC000426806682B19934228BF9B1A33440E88D7
+:107FD0004169891B491B416105D034192D1995420E
+:107FE00028BFAD1AC5608169491E8161184672BDFE
+:107FF000F8B5028900230B80002A42690CBF0224D5
+:108000000024002A3BD0C56802892B464AB946683D
+:108010006A1CB24228BF921B0668775DB25C07EB10
+:1080200002220A80067F06F00306012E20D10F8867
+:108030004FF6FF72974204BF0289002A07D14268B7
+:108040000023012A94BFC2F1010201220AE0026961
+:10805000AA420DD202895AB14668751B954207D2D1
+:10806000002304E005682E78AA5C06EB02220A8051
+:1080700041680068E4188C4228BF641A0319184646
+:10808000F2BD0000484900E0484981B00A68024357
+:108090000A60096808400090009801B0704780B5F8
+:1080A00002F004FF02F004FF4148016841F480310E
+:1080B0000160FEF79FF8BDE801400EE000B587B013
+:1080C00068460FF218211C22FDF7D6FD02F0A3FE30
+:1080D000684602F00DFF07B000BDF0B585B06846F8
+:1080E0001421FEF7C5F800260025002400210FF218
+:1080F000DC0000EBC102907988B11368B3F1904FB6
+:1081000008D02C4FBB4208D02B4FBB4204BF9088F5
+:10811000044304E09088064301E090880543491C2D
+:108120002229E4DB00200290012103200390019129
+:10813000B0B288B100900120FFF7A4FF0120FFF743
+:10814000A3FF69464FF0904002F0DAFE0022B1B280
+:108150004FF0904002F091FFA8B280B10090022051
+:10816000FFF790FF0220FFF78FFF124E694630465F
+:1081700002F0C6FE0022A9B2304602F07EFFA0B295
+:1081800080B100900420FFF77DFF0420FFF77CFF03
+:10819000094D6946284602F0B3FE0022A1B22846E6
+:1081A00002F06BFF05B0F0BD4C0000584C010058C8
+:1081B00090080058000400480008004803F06BB81D
+:1081C00013460A460146002003F0E6B800000048C6
+:1081D000010000000000004801000000000000480D
+:1081E00001000000000000480100000000000048FD
+:1081F00001000000000000480100000000000048ED
+:1082000001000000000000480100000000000048DC
+:1082100001000000000000480100000000000048CC
+:1082200001000000000000480100000000000048BC
+:1082300001000000000000480100000000000048AC
+:10824000010000000000004801000000000000489C
+:10825000010000000000004801000000000000488C
+:10826000010000000000004801000000000000487C
+:10827000010000000000004801000000000000486C
+:10828000010000000000004801000000000000485C
+:10829000010000000000004801000000000000484C
+:1082A000010000000000004801000000000000483C
+:1082B000010000000000004801000000000000482C
+:1082C000010000000000004801000000000000481C
+:1082D0000100000000000048010000000000000054
+:1082E0000000000000000000CC81000828000320EE
+:1082F0002C0003202204040000B500BF13009646A2
+:108300009446103928BFA0E80C50FAD85FEA417CA7
+:1083100028BF0CC048BF40F8042BC90728BF20F86D
+:10832000022B48BF00F8012B00BD000062F30F22B2
+:1083300062F31F42401810F0030308D0C91A1FD37C
+:10834000DB0748BF00F8012D28BF20F8022D1300DD
+:1083500030B414461546103928BF20E93C00FAD83D
+:10836000490728BF20E90C0048BF40F8042D8900C8
+:1083700028BF20F8022D48BF00F8012D30BC7047FF
+:10838000C91818BF00F8012DCB0728BF00F8012D30
+:108390007047704710B52148214C88B0016841F4FE
+:1083A0000041016003F020F81E49002003F0ADF900
+:1083B000FFF775FE0121012003F01BF801210020C9
+:1083C00003F0EDFA0121012003F0E9FA0121022076
+:1083D00003F0E5FA02F05EFC134A00211020FDF7DD
+:1083E000CCFF04F23C500FF2450100900191694628
+:1083F0000FF23D0003F022FB04F25470029004F5EA
+:10840000C96140F23C5005900391049402A802F027
+:10841000CAFC02F03DFC08B010BD00000800005886
+:10842000300003209C1E00207FBA00087047000027
+:1084300080B5FFF743FE00F023F8BDE804400021BB
+:10844000012002F0D6BF70474FF0FF30FDF732BF7A
+:1084500000211020FDF79EBF0220FDF7BDBF0220C6
+:10846000FDF7C2BF012805D0022805D0102805D18C
+:1084700000F0C8BA00F0C8BA00F0C8BA7047704738
+:1084800038B58EB002A80FF2AC01DFF8F048DFF883
+:10849000F0583022FDF7F0FB0FF6411001900094E8
+:1084A00069460FF62110FFF73DFB0121022002F083
+:1084B000A0FFDFF8D02800210420FDF75EFF02A80E
+:1084C00002F008FD00F0A4FAFDF7D0FF002085F8C7
+:1084D000900005F126044FF6FF70208000210FF672
+:1084E000CD020120FDF749FF03F04CFB03F073FBC5
+:1084F000F8F7D0FE0FF6AD03002205F19C01002035
+:1085000003F080F90220E07080210120A0700D208E
+:1085100020710220A070182060710320A070DFF885
+:1085200068080180A0214180012000F079FB0FB094
+:1085300030BD00000000000000000000000000004E
+:108540000000000000000000440008004005080191
+:108550003A79FA00F4010000FFFFFFFF4801010033
+:10856000000000002DE9F843044688B06078DFF889
+:1085700010580FF694060FF678090FF6A008052894
+:1085800005F1900705D03E284FD0FF2800F0268146
+:108590002DE2A088E98C884243D10020E88438701D
+:1085A000A07950B900F02BFA01464FF4CF7300F0D8
+:1085B00022FAA1790FF6FC0028E016280AD100F073
+:1085C0001EFA01464FF4D07300F015FAA1790FF6A8
+:1085D00030101BE03D2840460ED1FDF7DBFD014683
+:1085E0004FF4D17300F007FAA1790FF68010FDF770
+:1085F0001FFBFBF71FFA0BE0FDF7CCFD014640F235
+:10860000A51300F0F8F9A1790FF6D010FDF710FBD3
+:1086100005208DF8180006A8A188ADF81A10FCF7FF
+:1086200007FF012000F0FCFAE1E1E078012800F00A
+:108630008780032802D00C2822D0D8E100F0DFF98F
+:10864000014640F2BF1300F0D6F90FF6D810FDF73F
+:10865000EFFA00F0D4F901464FF4E27300F0CBF9E1
+:10866000B4F80B000190B4F809000090B4F807309A
+:10867000B4F8052021790FF6D810FDF7D9FAB6E144
+:1086800000F0BDF901464FF4E47300F0B4F90FF6C1
+:108690004C20FDF7CDFA20790028404609D1FDF79E
+:1086A00079FD01464FF4E67300F0A5F90FF6482076
+:1086B00008E0FDF76FFD01464FF4E87300F09BF909
+:1086C0000FF65C20FDF7B4FAE88C07AA0DF11D0146
+:1086D000FEF7F8F90028404628D1FDF75BFD01467A
+:1086E0004FF4EB7300F087F90FF65C200FF66C2463
+:1086F000FDF79EFA9DF81D00022804BF9DF81C108E
+:10870000022904D100F07BF94FF4ED7303E000F08F
+:1087100076F94FF4EF73014600F06DF99DF81C20D7
+:108720009DF81D102046FDF783FA60E1FDF732FD4C
+:10873000014640F2E31300F05EF90FF63C2054E1ED
+:10874000387B03F085F800F05AF901464FF4FA73CC
+:1087500000F051F9B4F805100FF63820FDF768FA6B
+:10876000387804280CBF062005203870B4F80500BE
+:10877000E88400F044F9014640F20A2300F03BF996
+:10878000607A0590A07A0490E07A0390207B0290B2
+:10879000607B0190A07B0090237AE279B4F8051009
+:1087A0000FF62420FDF744FAB4F80500788004F1B0
+:1087B0000902207A7871A07BF872607BB872207B06
+:1087C0007872E07A3872A07AF871607AB871217A9A
+:1087D000B4F80500FBF778F90320E9E0B4F80300EA
+:1087E0000FF6BC374FF48061401A1BD0401E00F0DA
+:1087F0009980401E20D0401E2DD0401E35D0401EF6
+:1088000040D0401E4BD0401E00F0E680401E4CD0B1
+:10881000401E5DD0401E51D040F60601401A00F0C7
+:10882000D180E4E000F0EBF8014640F2322300F0A2
+:10883000E2F80FF61020D8E000F0E1F801464FF41E
+:108840000E7300F0D8F8B4F805100FF62420FDF7E9
+:10885000EFF90D20ACE000F0D2F801464FF41073B0
+:1088600000F0C9F80FF65C20BFE000F0C8F8014640
+:1088700040F2452300F0BFF80FF67420FDF7D8F959
+:108880000A204BE000F0BBF8014640F24F2300F015
+:10889000B2F80FF6DC20FDF7CBF90B203EE000F03C
+:1088A000AEF8014640F2572304E000F0A8F8014674
+:1088B00040F25B2300F09FF8384696E000F09FF806
+:1088C000014640F25F2300F096F80FF6F8208CE0A6
+:1088D00000F095F801464FF4197300F08CF8D4F8C5
+:1088E00007100FF60C30FDF7A3F900F088F80146E9
+:1088F00040F2652300F07FF8D4F807100FF6083037
+:10890000FDF796F900F07BF8014640F2672300F08E
+:1089100072F80FF60830FDF78BF90F20E98C8DF80F
+:10892000180049E000F06BF8014640F2722300F0B5
+:1089300062F8237AE279B4F805100FF63430FDF7C7
+:1089400077F9E07948B900F05AF801464FF41D7301
+:1089500000F051F80FF668300AE001280BD100F062
+:108960004EF8014640F2762300F045F80FF66430E9
+:10897000FDF75EF910E002280ED100F040F8014644
+:108980004FF41E7300F037F8227AE1790FF65C306D
+:10899000FDF74EF9FBF74EF800F031F801464FF4C1
+:1089A0001F7300F028F80FF6E430FDF741F90C20B2
+:1089B0008DF81800B4F80510ADF81A1006A8FCF7E9
+:1089C00037FD14E000F01BF801464FF4217300F06E
+:1089D00012F80FF6F03008E000F011F8014640F20E
+:1089E0008B2300F008F80FF60440FDF721F9012071
+:1089F00009B0BDE8F0834A463046FDF719B9404654
+:108A0000FDF7C8BBFAF738BFFAF76CBFFAF7BABF81
+:108A10002DE9F8470FF61440DC4D0088DC4E89B094
+:108A2000ADF81A00FDF7FBFF286810F1010F0ED01A
+:108A300069683074090A020A000CB074727406F195
+:108A4000100468683175F074090A717507E0002038
+:108A500003F008F9002814BF04460FF6D454224648
+:108A60000621002003F010F960790FF6CC580FF6BC
+:108A7000D8590FF6A03A3072424620797072102110
+:108A8000E078B07207AFA078F07260783073207829
+:108A90007073182003F0F8F800F0B6F84EF66E5038
+:108AA000786007AA28680FF274350FF25C360790D9
+:108AB00006212E2003F0E8F800F0AFF801464FF44D
+:108AC000417300F0A6F82078029060780190A078B9
+:108AD0000090E378227961790FF65430FDF7A8F819
+:108AE00000F09BF8014640F2053300F092F8079A37
+:108AF00079680FF66830FDF79BF842461021182080
+:108B000003F0C2F800F080F81821012003F0E3F828
+:108B1000FDF7F5F800F081F8014640F2213300F04E
+:108B200078F80FF65430FDF783F80DF1160006A91A
+:108B30000190009105AB072200210120FDF7EDFD1A
+:108B40000FF65430BDF8181000900523BDF814003E
+:108B50000022FDF794F950B100F05FF8014640F2B1
+:108B6000323300F056F80FF63830FDF761F80DF1AA
+:108B70001A0000900223BDF81610BDF81400002260
+:108B8000FDF77DF950B100F048F801464FF44F73FE
+:108B900000F03FF80FF63830FDF74AF802220221C4
+:108BA0000020FDF7C2FF764C03202070FDF74CFD3E
+:108BB00000206070E070082060751020A075002013
+:108BC00020757448A0610120A0700020211DC2B250
+:108BD0008854401CC1B21029F8DB00200490002307
+:108BE000A069617803900122207D0290A07D019010
+:108BF000607D0090A078FDF740FDA07808B1FDF7FA
+:108C000027FE0AB0BDE8F0874A461021082003F08D
+:108C10003BB852463046FDF70BB82846FDF7BABAC6
+:108C20002DE9F84F04462546012D88B003D156485A
+:108C30000688408803E04FF4C8664FF47A60DFF896
+:108C40004081ADF81C0008F190070FF2D019387B75
+:108C50000FF2B41A0FF6A82B02F0FAFD4846FDF702
+:108C600099FA014640F2823300F098F839780FF60D
+:108C70009C20FCF7DDFF022D22D13878012818BF97
+:108C800002281DD1FDF785FC0090002848460BD135
+:108C9000FDF780FA01464FF4637300F07FF80FF69A
+:108CA0008820FCF7C5FF0BE0FDF774FA01464FF48E
+:108CB000647300F073F800990FF69020FCF7B8FF8A
+:108CC0003C7000200690059008F1290104910622CD
+:108CD00098F828000FF6803101920390029100234A
+:108CE00000933146BDF81C200020FDF764FC2849A4
+:108CF0000E20FDF758FD040022D1012D484611D168
+:108D0000FDF748FA014640F2A93300F047F80FF6A4
+:108D10006420FCF78DFF387B1F4909B0BDE8F04F98
+:108D200002F0E5BDFDF736FA014640F2AF3300F040
+:108D300035F809B0BDE8F04F0FF66020FCF778BFBA
+:108D4000012D48460AD1FDF725FA014640F2B63317
+:108D500000F024F821460FF6702009E0FDF71AFA1A
+:108D6000014640F2BA3300F019F821460FF6882088
+:108D700009B0BDE8F04FFCF75BBF0000B00803206E
+:108D8000C8190020637B0008A01F00208075FF1F0A
+:108D90000400002007B2010046E001005A46504698
+:108DA000FCF746BF00210120FDF7F4BA022037E7A7
+:108DB00000210420FDF7EEBA0120FDF70DBB0120D4
+:108DC000FDF712BB10B50446616801F10800FDF71C
+:108DD00065FB00B10120207010BD000010B101281A
+:108DE00003D070470F20FDF7E5BA0F20FDF7EABA70
+:108DF00053564343544C5F4170705F4E6F746966C5
+:108E000069636174696F6E000D0A205B25735D5B99
+:108E100025735D5B25645D2000000000433A5C64BF
+:108E200065765C4749545F446F72795F4C6974742E
+:108E30006C65446F72795F4E5C73746D3332776228
+:108E40005F4D345F4669726D776172655C46697229
+:108E50006D776172655C50726F6A656374735C50A4
+:108E60002D4E55434C454F2D574235352E4E75638B
+:108E70006C656F5C4170706C69636174696F6E736F
+:108E80005C424C455C424C455F486561727452617E
+:108E900074655F414E43535C53544D33325F5750BA
+:108EA000414E5C4170705C6170705F626C652E63F6
+:108EB000000000000D0A0D2A2A20444953434F4E5A
+:108EC0004E454354494F4E204556454E5420574930
+:108ED000544820434C49454E5420646973636F6E77
+:108EE0006E656374696F6E20526561736F6E3D309D
+:108EF000782530325820737563657373200A0D002E
+:108F00000D0A0D2A2A20444953434F4E4E454354DF
+:108F1000494F4E204556454E54205749544820430A
+:108F20004C49454E5420646973636F6E6E6563747B
+:108F3000696F6E20526561736F6E3D3078253032F7
+:108F40005820436F6E6E656374696F6E207465722E
+:108F50006D696E61746564206279206C6F63616C09
+:108F600020686F7374200A0D000000000D0A0D2A9E
+:108F70002A20444953434F4E4E454354494F4E20B7
+:108F80004556454E54205749544820434C49454E78
+:108F90005420646973636F6E6E656374696F6E20CD
+:108FA000526561736F6E3D30782530325820436FC3
+:108FB0006E6E656374696F6E207465726D696E6143
+:108FC0007465642064756520746F204D4943206684
+:108FD00061696C757265200A0D0000000D0A0D2A8A
+:108FE0002A20444953434F4E4E454354494F4E2047
+:108FF0004556454E54205749544820434C49454E08
+:109000005420646973636F6E6E656374696F6E205C
+:10901000526561736F6E3D307825303258200A0DED
+:10902000000000000D0A0D2A2A20434F4E4E4543F2
+:1090300054494F4E20555044415445204556454EC5
+:1090400054205749544820434C49454E54200A0067
+:109050004556545F4C455F434F4E4E5F555044411B
+:1090600054455F434F4D504C4554452053746174F3
+:1090700075733D30782530325820436F6E6E6563CE
+:1090800074696F6E5F48616E646C653D3078253041
+:10909000345820436F6E6E5F496E74657276616CF2
+:1090A0003D30782530345820436F6E6E5F4C6174CC
+:1090B000656E63793D30782530345820537570657E
+:1090C00072766973696F6E5F54696D656F75743D13
+:1090D000307825303458200A0D0000004556545F82
+:1090E0005550444154455F5048595F434F4D504C93
+:1090F000455445200A0000004556545F55504441F0
+:1091000054455F5048595F434F4D504C4554452C92
+:1091100020737461747573206F6B200A0000000067
+:109120004556545F5550444154455F5048595F433C
+:109130004F4D504C4554452C207374617475732009
+:109140006E6F6B200A000000526561645F504859E1
+:109150002073756363657373200A000050485920BB
+:10916000506172616D202054583D2025642C20529E
+:10917000583D202564200A005265616420636F6EAB
+:1091800066206E6F74207375636365657373200A60
+:10919000000000004556545F4C455F434F4E4E5F04
+:1091A000434F4D504C45544520666F7220636F6E9F
+:1091B0006E656374696F6E2068616E646C652030E3
+:1091C0007825780A000000004556545F4C455F43FF
+:1091D0004F4E4E5F434F4D504C45544520436F6EAC
+:1091E0006E656374696F6E5F48616E646C653D3077
+:1091F000782530345820526F6C653D2564205065C9
+:1092000065725F416464726573735F547970653D24
+:10921000256420506565725F416464726573733ABA
+:10922000253032582025303258202530325820251C
+:1092300030325820253032582025303258200A0D3F
+:10924000000000000D0A0D2A2A204556545F424CAA
+:1092500055455F4741505F4C494D495445445F4433
+:109260004953434F56455241424C45200A000000A5
+:109270004556545F424C55455F4741505F504153FE
+:10928000535F4B45595F52455155455354203D3D21
+:109290003E20414E43535F504153535F4B45595F0E
+:1092A0005245515545535420436F6E6E6563746942
+:1092B0006F6E5F48616E646C653D30782530345860
+:1092C000200A0D000D0A0D2A2A204556545F424CF3
+:1092D00055455F4741505F415554484F52495A41A7
+:1092E00054494F4E5F52455155455354200A000092
+:1092F0004556545F424C55455F4741505F534C4182
+:1093000056455F53454355524954595F494E495458
+:10931000494154454420736C6176652073656375DB
+:109320007269747920726571756573742069732030
+:109330007375636365737366756C6C792073656EA2
+:109340007420746F20746865206D61737465722079
+:109350003D3E20414E43535F534543555249545976
+:109360005F494E49544941544544200A00000000D9
+:109370004556545F424C55455F4741505F424F4E02
+:10938000445F4C4F5354203D3D3E20414E43535F7C
+:10939000414C4C4F575F5245424F4E44200A0D00FE
+:1093A0000D0A0D2A2A204556545F424C55455F4709
+:1093B00041505F4445564943455F464F554E442012
+:1093C0000A0000000D0A0D2A2A204556545F424C1F
+:1093D00055455F4741505F4B455950524553535F88
+:1093E0004E4F54494649434154494F4E200A0000CC
+:1093F000206E756D657269635F76616C7565203D81
+:109400002025640A00000000204865785F76616CC2
+:109410007565203D2025780A000000004556545F00
+:10942000424C55455F4741505F4E554D455249436B
+:109430005F434F4D50415249534F4E5F56414C553B
+:1094400045203D3D3E20414E43535F4E554D4552D4
+:1094500049435F434F4D50415249534F4E5F564130
+:109460004C55455F434F4E4649524D200A0D000072
+:109470004556545F424C55455F4741505F50414906
+:1094800052494E475F434D504C542C20436F6E6EF3
+:10949000656374696F6E5F48616E646C653D3078BA
+:1094A00025303458205374617475733D25642052FF
+:1094B0006561736F6E3D307825303278200A000088
+:1094C000202A2A2050616972696E67204F4B200A5A
+:1094D00000000000202A2A2050616972696E67200E
+:1094E00054696D656F7574200A000000202A2A20D7
+:1094F00050616972696E67204B4F205374617475B7
+:10950000733D256420526561736F6E3D3078253060
+:109510003278202C200A0D2021212120506C6561F9
+:1095200073652069676E6F72652074686973204285
+:109530004C4520446576696365206F6E20746865CC
+:1095400020694F532F416E64726F696420446576C1
+:109550006963652053657474696E673D3E426C753E
+:1095600065746F6F74683D3E4D792044657669631C
+:1095700065206F7220506169726564204465766968
+:10958000636520212121200A0D0000004556545F0B
+:10959000424C55455F4741505F50414952494E4703
+:1095A0005F434D504C54203D3D3E20414E43535F60
+:1095B00050414952494E475F434F4D504C455445E9
+:1095C000200A0D00202A2A204556545F424C55455A
+:1095D0005F474154545F50524F4345445552455F95
+:1095E000434F4D504C455445200A00000D0A0D2AAA
+:1095F0002A204556545F424C55455F4741505F50C5
+:10960000524F4345445552455F434F4D504C45548E
+:1096100045200A00426C655F4863695F4761705F7F
+:10962000476174745F496E69740000004003000074
+:1096300062645F616464723A2025303258202530BC
+:1096400032582025303258202530325820253032EB
+:10965000582025303258200A0D0000007372645FD4
+:1096600062645F616464723A202530385820253086
+:109670003858200A0D00000047415020726F6C6579
+:10968000202B204741505F50455249504845524198
+:109690004C5F524F4C450A004852616E6300000017
+:1096A000446576696365204E616D65206163695F1D
+:1096B000676174745F7570646174655F636861721B
+:1096C0005F76616C7565206661696C65642E0A0061
+:1096D000417070656172616E6365206163695F6787
+:1096E0006174745F7570646174655F636861725FF3
+:1096F00076616C7565206661696C65642E0A000090
+:109700004164765F52657175657374004669727362
+:109710007420696E64657820696E202564207374F6
+:10972000617465200A000000537563636573736696
+:10973000756C6C792053746F707065642041647629
+:109740006572746973696E67200A000053746F70E4
+:10975000204164766572746973696E672046616939
+:109760006C6564202C20726573756C743A202564D6
+:10977000200A00005375636365737366756C6C79BA
+:10978000205374617274204661737420416476655D
+:1097900072746973696E67200A0000005375636311
+:1097A00065737366756C6C79205374617274204CA8
+:1097B0006F7720506F7765722041647665727469A7
+:1097C00073696E67200A00005374617274204661E9
+:1097D0007374204164766572746973696E6720469C
+:1097E00061696C6564202C20726573756C743A3005
+:1097F0007825303278200A005374617274204C6FDF
+:109800007720506F77657220416476657274697352
+:10981000696E67204661696C6564202C20726573EF
+:10982000756C743A20307825303278200A000000B8
+:109830006C7AD8AC57720000123456789ABCDEF0BD
+:10984000123456789ABCDEF0FEDCBA0987654321F3
+:10985000FEDCBA0987654321094852414E430000A6
+:10986000704770472DE9F841384D0FF204180FF298
+:10987000EC060FF2DC070020286087B041F60A00F2
+:10988000ADF8180000950323012206A90120FCF77A
+:109890004DFA0400404609D1FCF77CFC01468723C1
+:1098A00000F03FF829880FF2301008E0FCF772FC56
+:1098B00001468C2300F035F821460FF25C10FCF7CE
+:1098C000B7F942F62920ADF81800012204920A20C7
+:1098D000A91C039000230222059102930193009298
+:1098E0002023288806AA0121FCF76FFA04004046CD
+:1098F00009D1FCF74FFC0146A22300F012F8698859
+:109900000FF2541008E0FCF745FC0146A72300F0D5
+:1099100008F821460FF27C10FCF78AF908B0BDE880
+:10992000F0813A463046FCF783B980B542F62922E9
+:10993000904209D10A680548009200220B794188BB
+:109940000088FCF79CFA02BD002002BDA41F002085
+:109950004449535F496E6974000000000D0A205BA2
+:1099600025735D5B25735D5B25645D200000000051
+:10997000433A5C6465765C4749545F446F72795F33
+:109980004C6974746C65446F72795F4E5C73746D6E
+:10999000333277625F4D345F4669726D776172650D
+:1099A0005C4669726D776172655C4D6964646C6573
+:1099B00077617265735C53545C53544D33325F5717
+:1099C00050414E5C626C655C7376635C5372635CA1
+:1099D0006469732E630000004465766963652049FD
+:1099E0006E666F726D6174696F6E20536572766911
+:1099F00063652028444953292069732061646465A4
+:109A000064205375636365737366756C6C79202588
+:109A10003034580A000000004641494C4544207447
+:109A20006F206164642044657669636520496E66D1
+:109A30006F726D6174696F6E2053657276696365CC
+:109A40002028444953292C204572726F723A2025F0
+:109A50003032582021210A004D616E7566616374B1
+:109A600075726572204E616D652043686172616335
+:109A7000746572697374696320416464656420531A
+:109A800075636365737366756C6C7920202530345B
+:109A900058200A004641494C454420746F206164B7
+:109AA00064204D616E756661637475726572204ED7
+:109AB000616D652043686172616374657269737476
+:109AC00069632C204572726F723A2025303258201B
+:109AD00021210A00704770472DE9F041054686B004
+:109AE00068780024FF2861D1B5F803100FF208361A
+:109AF0000FF2EC280FF21430B74F40F60142891AEA
+:109B00002BD0123952D1FCF745FB01467123424656
+:109B100000F049F90FF25C30FCF78AF8FA88B5F8E2
+:109B20000710521C914241D1AB7AB5F805006A7A10
+:109B30000124012B08D100920A350195002300224F
+:109B4000FCF7A3FA00202CE005F10A030193009230
+:109B500080230122FCF799FA28E07A88B5F80710EB
+:109B6000921C914222D1697B0124CA070DD5FCF7D2
+:109B700011FB0146A323424600F015F90FF2143001
+:109B8000FCF756F88DF808400DE0FCF703FB0146A2
+:109B9000A923424600F007F90FF23430FCF748F8E9
+:109BA00002208DF8080002A801F0FAFF204606B056
+:109BB000BDE8F081FEB5014601AA487A8DF804009F
+:109BC0004B7A08885070DC0704D50888000A90702A
+:109BD000032300E00223487A040707D54888D054BD
+:109BE0005B1C4888DCB2000A10555B1C4C7AE0060E
+:109BF00010D50D7A00200BE001EB4004DFB2A688FF
+:109C0000D6555B1CA488DEB2240A94555B1C401C0C
+:109C1000A842F1DB01A970480091DBB241880088BD
+:109C20000022FCF72CF9FEBD2DE9F84187B06B4806
+:109C3000694D0FF2D8180FF2C0160FF2D027FCF7BB
+:109C40001DFC41F60D01ADF8181000950823012206
+:109C500006A90120FCF76AF8040040460AD1FCF787
+:109C600099FA014640F2B31300F09CF829880FF2EC
+:109C7000A82009E0FCF78EFA01464FF4DC7300F0EF
+:109C800091F821460FF2C820FBF7D2FF42F63720A9
+:109C9000ADF81800012204920A20A91C03900023A9
+:109CA000102205910293019300920723288806AAA7
+:109CB0000121FCF78AF8040040460AD1FCF76AFA51
+:109CC00001464FF4EA7300F06DF869880FF2B8208E
+:109CD00009E0FCF75FFA014640F2D91300F062F8A0
+:109CE00021460FF2E820FBF7A3FF42F63820ADF83B
+:109CF000180000220492029201920A20291D03906A
+:109D00000222059100F047F8040040460AD1FCF712
+:109D100041FA014640F2EF1300F044F8A9880FF22F
+:109D2000F42009E0FCF736FA01464FF4FA7300F02C
+:109D300039F821460FF21830FBF77AFF42F6392046
+:109D4000ADF818000022049201920A20A91D039088
+:109D5000022308220591029300F01DF804004046FA
+:109D60000AD1FCF717FA014640F2092300F01AF86D
+:109D7000E9880FF21C3009E0FCF70CFA014640F2CA
+:109D80000E2300F00FF821460FF23C30FBF750FF96
+:109D900008B0BDE8F08100920123288806AA0121BD
+:109DA000FCF713B83A463046FBF742BF80B50022B5
+:109DB00042F63723C01A09D0401E0BD10648009145
+:109DC000012381880088FCF75AF802E00846FFF773
+:109DD000F1FE0246104602BD801F0020D99A0008FD
+:109DE00048656172526174655F4576656E745F485F
+:109DF000616E646C657200000D0A205B25735D5B0B
+:109E000025735D5B25645D2000000000433A5C64BF
+:109E100065765C4749545F446F72795F4C6974742E
+:109E20006C65446F72795F4E5C73746D3332776228
+:109E30005F4D345F4669726D776172655C46697229
+:109E40006D776172655C4D6964646C65776172659C
+:109E5000735C53545C53544D33325F5750414E5CE6
+:109E6000626C655C7376635C5372635C6872732EBC
+:109E7000630000004556545F424C55455F474154CE
+:109E8000545F57524954455F5045524D49545F52B3
+:109E900045510A004556545F424C55455F47415471
+:109EA000545F4154545249425554455F4D4F4449C3
+:109EB00046494544204852535F4E4F544946494312
+:109EC0004154494F4E5F454E41424C45440A0000C3
+:109ED0004556545F424C55455F474154545F415489
+:109EE000545249425554455F4D4F444946494544B3
+:109EF000204852535F4E4F54494649434154494FBD
+:109F00004E5F44495341424C45440A004852535F16
+:109F1000496E6974000000004865617274205261E6
+:109F20007465205365727669636520284852532909
+:109F3000206973206164646564205375636365738D
+:109F40007366756C6C7920253034580A0000000067
+:109F50004641494C454420746F2061646420486543
+:109F6000617274205261746520536572766963650D
+:109F70002028485253292C204572726F723A2025AE
+:109F80003032582021210A004865617274205261E4
+:109F90007465204D6561737572656D656E742043DF
+:109FA0006861726163746572697374696320416486
+:109FB000646564205375636365737366756C6C794F
+:109FC000202025303458200A000000004641494C2A
+:109FD000454420746F206164642048656172742078
+:109FE00052617465204D6561737572656D656E743F
+:109FF0002043686172616374657269737469632C6C
+:10A00000204572726F723A20253032582021210A81
+:10A010000000000053656E736F72204C6F636174B3
+:10A02000696F6E20436861726163746572697374ED
+:10A030006963204164646564205375636365737369
+:10A0400066756C6C79202025303458200A00000099
+:10A050004641494C454420746F2061646420536537
+:10A060006E736F72204C6F636174696F6E2043680A
+:10A070006172616374657269737469632C204572DF
+:10A08000726F723A20253032582021210A000000D8
+:10A09000436F6E74726F6C20506F696E74204368EA
+:10A0A0006172616374657269737469632041646489
+:10A0B0006564205375636365737366756C6C792092
+:10A0C0002025303458200A004641494C454420742C
+:10A0D0006F2061646420436F6E74726F6C20506FE8
+:10A0E000696E742043686172616374657269737428
+:10A0F00069632C204572726F723A202530325820E5
+:10A1000021210A00704770477047704770477047B9
+:10A1100070477047704770471B48704730B45368AA
+:10A12000D418042B09DA41B1057804F8015B10F862
+:10A13000015B15B15B1C491EF3E7536030BC7047EF
+:10A1400038B514461D4661B1FFF7E8FF61686A6BD8
+:10A15000204690476FF00102811A02D0491E03D0B9
+:10A1600005E06FF0010032BD4FF0FF3032BD00213D
+:10A17000616032BDDA6B1047034BE1E7024BF9E750
+:10A180000248704700000000BC100020841000202E
+:10A190000278C9B28A421AB11CBF10F8012FF9E740
+:10A1A00018BF00207047000080B508B90FF21C00EE
+:10A1B00005490B681BB122220021984701E001F0FC
+:10A1C000B5FD222002BD0000981F0020636F6E7352
+:10A1D000747261696E742068616E646C65723A2095
+:10A1E000626164206D65737361676500C9B283073E
+:10A1F00006D0521E22D310F8013B9942F7D11FE03E
+:10A20000083A13D302F1040241EA012141EA014173
+:10A2100050F8043B121F21BF4B40A3F1013C2CEA34
+:10A22000030C1CF0803FF3D0C9B2001F083210F8B5
+:10A23000013B521E28BF91EA030FF8D818BF012036
+:10A24000401E704780B5FFF767FF006C02BD00003D
+:10A25000B3BBD9B1B2F5803F7DD2022A1ED98C465C
+:10A26000B1FBF2F102FB11C31B0443EA1043B3FB41
+:10A27000F2FC02FB1C3380B240EA0343B3FBF2F072
+:10A2800002FB103240EA0C4000237047022A05D935
+:10A290008446B0FBF2F002FB10C270474AB105D110
+:10A2A00000F0010249085FEA3000704700220023F5
+:10A2B000704701F03FBD0B000200002100207047F5
+:10A2C000904271EB030CF6D3B3F5803F2FD2F0B57B
+:10A2D000B3FA83F7B1FA81F4A7F10F0E3D1B534097
+:10A2E000CEF1200602FA0EF2F3415340B5F10F070A
+:10A2F00046D80F3C2C444140C4F12006A040F14117
+:10A300004140B1FBF3F603FB1611A2FB0645001B0F
+:10A31000A94102D2761E8018594180EA010221FA31
+:10A320000EF362FA0EF200215A403046F0BD30B40E
+:10A33000B1FBF3FC03FB1C11A2FB0C45001BA94164
+:10A3400003D2ACF1010C8018594130BC02460B46D7
+:10A35000604600217047B2F1807F65D3F0B5B2FA54
+:10A3600082F7B1FA81F4C7F10F063D1B22FA06F31A
+:10A3700007F1110EF24120355A40B5F10F07B8D957
+:10A380004140C4F12006A040F1414140B1FBF3FC43
+:10A3900003FB1C11A2FB0C45001BA94103D2BCF11D
+:10A3A000010C801859410F2F12D30F3FC90341EA06
+:10A3B0005041B1FBF3F603FB1611A2FB0645D4EBAB
+:10A3C000C030A94102D2761E8018594146EACC3CE1
+:10A3D00007B34140C7F12006B840F1414140B1FB0D
+:10A3E000F3F603FB1611A2FB0645001BA94102D29E
+:10A3F000761E8018594180EA010221FA0EF3C7F156
+:10A40000200462FA0EF20CFA07F05A402CFA04F11A
+:10A410003043F0BD80EA010221FA0EF3002162FA16
+:10A420000EF260465A40F0BD8C46B1FBF2F102FBE1
+:10A4300011C31B0243EA1063B3FBF2FC02FB1C33A3
+:10A440001B024CEA002043EA1063B3FBF2FC02FB60
+:10A450001C331B024CEA002043EA1063B3FBF2FCFE
+:10A4600002FB1C331B024CEA002043EA1063B3FBDF
+:10A47000F2FC02FB1C324CEA002000237047000073
+:10A48000B0B581EA030C0CF0004C40F2FF7515EA00
+:10A4900011541DBF15EA1357AC42AF4239E0E4191D
+:10A4A00023EA455343F48013C90241F0004141EAD5
+:10A4B000505EC7021100A7FB020200284FF0000007
+:10A4C000EEFB01204FF00001E3FB072118BF42F033
+:10A4D0000102401800214941E3FB0E01A4F580640C
+:10A4E0000F0302D252004041494154F101046CDD96
+:10A4F000470872F1004250F1000051EB0451A1F500
+:10A5000080115CBF41EA0C01B0BD4CEA055100204E
+:10A51000B0BD05EA1357AC4214BFAF4241E050EA68
+:10A52000410E1CBF52EA430E02E061460020B0BD5E
+:10A5300024423C441BD15FEA070EF6D0090302BF58
+:10A5400001460020AEF1140EB1FA81F7AEEB07041C
+:10A5500001FA07FE0C37C7F1200100FA07F7C840DF
+:10A560004EEA000E23EA455343F48013A2E733F08A
+:10A570000043B3FA83F704BFB2FA82FE77440B3F7D
+:10A58000E41BB7F1200E2FBF02FA0EF3BB40C7F158
+:10A59000200E22FA0EFE38BF43EA0E03BA40641CB6
+:10A5A00082E750EA410E14BF52EA430E6FF00001F9
+:10A5B0004FF4001717EB430F8ABF194617EB410FF3
+:10A5C000B5E74CEA05510020B0BDD4F10104B4F167
+:10A5D00020070FDAC4F12007520828BF42F0010219
+:10A5E00010FA07F501FA07F7E1BF2A43E0403843C4
+:10A5F000E1400FE0352C98DCC7F1200452EA40021C
+:10A6000020FA07F218BF42F0010231FA07F0A14028
+:10A610000A43002172F1004250F1000051EB0C019D
+:10A62000B0BD000010B5144600F002F8226010BD65
+:10A63000C1F30A5343B14A0012F5001F28D2A3F216
+:10A64000FE32A1EB0251704750EA410C20D001F0DC
+:10A65000004C31EA0C01B1FA81F204BFB0FA80F388
+:10A66000D2180B3AB2F120032CBF00FA03F191404B
+:10A6700041EA0C013EBFC2F1200C20FA0CF3194351
+:10A680009040524240F2FD33D21A01EB0351704721
+:10A69000002270474FF4001C1CEB410F94BF1CEBD1
+:10A6A000430F09E041EA030C50EA4C0C52EA0C0C4F
+:10A6B00003D2994208BF9042704714BF8B42824236
+:10A6C000704700004FF4001C1CEB410F94BF1CEBC3
+:10A6D000430F09E041EA030C50EA4C0C52EA0C0C1F
+:10A6E00003D28B4208BF8242704714BF9942904206
+:10A6F00070470000124254D440F2FF7C1CEA115310
+:10A700000FD0634531D09B1863453CBF01EB02512C
+:10A71000704701F0004141EA0C510020AFF3008086
+:10A72000704750EA410320D001F0004C91EA0C013F
+:10A730001CD0B1FA81F30B3B9A420DD9D21A994041
+:10A7400051EA0C01C3F1200C20FA0CFC6144984042
+:10A75000531C40F2FF7CD7E7914041EA0C01C2F163
+:10A76000200C20FA0CF3194390407047B0FA80F3A4
+:10A770001533202BE0D3202AEED3203A203B9A42F7
+:10A7800009D9D21A00FA03F141EA0C010020531C46
+:10A7900040F2FF7CB8E700FA02F141EA0C01002028
+:10A7A0007047524240F2FF7C1CEA11530DD06345C2
+:10A7B000DBD0B2EB030C3CBFA1EB025170470CF1B4
+:10A7C000010221EA035141F4801150EA410CCCD03E
+:10A7D00001F0004C352A27DC30B481EA0C01B2F1DB
+:10A7E000200309DAC2F12003044601FA03F5D04040
+:10A7F0002843D1409C400CE0C3F12002450020FAE0
+:10A8000003F418BF44F0010421FA03F091400C4313
+:10A81000002174F1004550F1000051EB0C0124427D
+:10A8200030BC7FF47BAF70476146002076E70000C4
+:10A83000C1F30A5340F2FE329B1A14DDD3F1200318
+:10A840004FEAE17208DDC90241EA505141F000408F
+:10A85000D84080185040704703F2E13010B1D24325
+:10A8600082F000407047002070470000C11768B1B7
+:10A870004840401AB0FA80F29040D21CC907C2F595
+:10A88000846241EA025202EBD02140057047000089
+:10A8900070B44FF0004591EA030F41F14D826B40D7
+:10A8A000841A71EB030603D2001BB14112197341E4
+:10A8B0004FF4001C1CEB410F34BF7CEB430442E01F
+:10A8C0000C0DA4EB1356352E4FDC45EAC323DB0AEF
+:10A8D00045EAC121C912B6F120050DDD63FA05F67E
+:10A8E000EB4086EA0305124218BF45F00105C01887
+:10A8F00051F100010CD213E062FA06F5F240554026
+:10A90000F3415A40B340F3405A408018594107D3AD
+:10A9100049085FEA30005FEA350528BF45F00105C8
+:10A9200001F58011420875F1004250F1000041EB41
+:10A9300004514E0016F5001F70BC38BF7047002050
+:10A94000090D090570471CEB410F10D252EA43066E
+:10A950000BD0BCEB410F05D80C0DAB43661E342E5B
+:10A96000B6DD02E0AB438018594170BC704770BC43
+:10A9700070470000F0B540F2FF7581EA030C0CF05F
+:10A98000004C15EA11541DBF15EA1357AC42AF42F3
+:10A99000E5E0BC41C1F31301C3F31303801A9941ED
+:10A9A00043F4801304D2641E400049418018594189
+:10A9B000C90241EA5051B1FBF3F603FB1611A2FBA9
+:10A9C0000675D7EBC020A94102D2761E80185941E6
+:10A9D000C90241EA5051B1FBF3FE03FB1E11A2FB79
+:10A9E0000E75D7EBC020A94103D2AEF1010E80183D
+:10A9F0005941890241EA9051760546EA8E2EB1FB13
+:10AA0000F3F603FB1611A2FB0675D7EB8020A941D4
+:10AA100002D2761E80185941C90241EA50514EEACD
+:10AA2000060EB1FBF3F603FB1611A2FB0675D7EB7E
+:10AA3000C020A94102D2761E80185941C90241EABC
+:10AA40005051B1FBF3F703FB1711A2FB0735D3EB12
+:10AA5000C020A94167F100070CBF004247F0010781
+:10AA600066F3D5274FEA1E31B80814F5806412DD6D
+:10AA7000BD0775F1004250EB0E5051EB045111F53A
+:10AA8000801F5CBF41EA0C01F0BD4CF07F6141F0DA
+:10AA9000E0410020F0BDBD076D0840EA0E5041F4D2
+:10AAA0008011D4F10104B4F120060ADAC4F12006C1
+:10AAB0000200E04001FA06F3E1401843B2401543BA
+:10AAC0000EE0342C13DCC6F1200445EA40056D0885
+:10AAD00020FA06F2154321FA06F0A1400D430021A9
+:10AAE00075F1004250F1000051EB0C01F0BD002067
+:10AAF0005FEA0C01F0BDCFB992185B41B3FA83F75E
+:10AB000004BFB2FA82F6BF190B3FB7F120062FBF80
+:10AB100002FA06F3BB40C7F1200622FA06F638BF58
+:10AB20003343BA401CB1E419641E33E77F4231F06D
+:10AB30000041B1FA81F404BFB0FA80F6A4190B3CCD
+:10AB4000B4F120062FBF00FA06F1A140C4F120069F
+:10AB500020FA06F638BF3143A0403C1B1AE7AC424E
+:10AB60001ABF05EA1357AF4212E050EA41061CBF74
+:10AB700052EA4306BFE750EA4107304661461CBF30
+:10AB800041EA0551F0BD52EA430C08BFC143F0BD94
+:10AB900000204FF4001616EB410F98BF16EB430F41
+:10ABA00008BF16EB410F24BFC14305E016EB430F6E
+:10ABB0000CBF61464CEA0551F0BD0000400D49183C
+:10ABC00040EA81200CD2490DA1F58061491C40F07A
+:10ABD000004005DBD1F11F0154BFC840C0177047CA
+:10ABE00000207047014648B1B0FA80F18840C91C86
+:10ABF000C1F58461090501EBD021400570470000D3
+:10AC00000249016002490161704700BFD3AC0008EE
+:10AC1000FDAC0008006040607047EFF3108172B631
+:10AC2000026882420CBF012000201CE0EFF310827A
+:10AC300072B603680B60486001600868416023E0F9
+:10AC4000EFF3108272B6086043684B604160486859
+:10AC5000016019E0EFF3108172B6436802681A6070
+:10AC600042680068426081F31088704710B5EFF3C6
+:10AC7000108472B602680A600068FFE7FFF7EAFF17
+:10AC800084F3108810BD086082F3108870470000BC
+:10AC900001F07AB96E486F49016001F1200242600B
+:10ACA00001F13002826001F13C02026201F14402D2
+:10ACB000426201F14C02C26001F15402026101F1F1
+:10ACC0007002426101F1740282618031C16101F060
+:10ACD0006DB938B50446604D05F11000FFF79AFFD5
+:10ACE0005B494868A1680160E168C160456005F1A1
+:10ACF0001001816001F076F958482DE080B5544983
+:10AD00004A6813680120187201F072F9002002BD30
+:10AD100038B5524C504D07E0694605F11000FFF779
+:10AD2000A5FF00982168884705F11000FFF775FF1F
+:10AD30000028F1D031BD49484168084738B504467C
+:10AD4000474D2846FFF766FF4148C068A16801608B
+:10AD5000456001F052F94348216801606168416033
+:10AD6000002032BD80B53A49CA68136810201872B5
+:10AD700001F049F9002002BD3549CA683949106817
+:10AD80000B68184738B5374C354D06E069462846FC
+:10AD9000FFF76CFF0098616888472846FFF73DFF82
+:10ADA0000028F3D031BD38B504462F4D2846FFF7B3
+:10ADB00031FF2E48FFF72EFF25480069A16881600A
+:10ADC000E168C160056121680160616841602169D5
+:10ADD00041616169816131BD80B501462348FFF75A
+:10ADE0002FFFBDE802400FF2090001F01CB900007E
+:10ADF00038B5174C1D4D08E069462846FFF736FF69
+:10AE0000009920690069FFF71BFF2846FFF705FF3F
+:10AE10000028F1D031BD10B5154C2046FFF7FAFEE1
+:10AE20000B4841690C60BDE8104001F010B91CB539
+:10AE30000F4C06E069462046FFF718FF009800F027
+:10AE400019F82046FFF7E9FE0028F3D013BD0000F3
+:10AE500000000320BC09032090080320681F002085
+:10AE6000A8080320701F0020480A0320601F00204C
+:10AE7000500A032070470000134810B5016841F4E0
+:10AE800080710160032001F008F9002001F086F9CB
+:10AE90000024002814BF012401F0AAF9204610BDA7
+:10AEA0000A4880687047094800787047084805E0FC
+:10AEB0000748016841F0020101607047016841F0F4
+:10AEC0000101016070470000004000586810002038
+:10AED000042004E0F8B500F10C026B4621214FF686
+:10AEE0006640FFE700F0FFFD9DF80E0005B000BDD5
+:10AEF000F8B500F10C026B460F214FF66840F1E700
+:10AF00002DE9F84F4FF00009644A654B4FF00F08E8
+:10AF100005460E4633E0634FBD4214BF07270427A2
+:10AF20008F4027434CF82E70C1431C6801EA040C83
+:10AF30007468E40348BF40EA0C0CC3F800C05C68C6
+:10AF400001EA040C7468A40348BF40EA0C0CC3F87F
+:10AF500004C0146801EA040C7468E40248BF40EAC3
+:10AF60000C0CC2F800C0546801EA040C7168890234
+:10AF700048BF40EA0C0CC2F804C009F1010931686D
+:10AF800031FA09F077D0012404FA09F414EA010037
+:10AF9000F3D04FEA490C032101FA0CF16FEA010EDC
+:10AFA0007168012918BF022903D0112918BF12297D
+:10AFB00011D1A968F7680EEA010107FA0CF73943C5
+:10AFC000A960696821EA04047168C1F3001101FAFB
+:10AFD00009F10C436C60E968B4680EEA010104FAF7
+:10AFE0000CF42143E9604FEA89017468022C18BF10
+:10AFF000122C12D14FEAD90405EB840401F01C078E
+:10B00000D4F820A008FA07FB2AEA0B0AD6F810B0F9
+:10B010000BFA07F747EA0A0727622C680EEA0407CB
+:10B02000347904F0030404FA0CF43C432C60746893
+:10B03000E400A2D5DFF870C04FEA990E5CF82E70DC
+:10B0400001F00C0108FA01F427EA0404B5F1904F6D
+:10B0500008BF00270ED0154FBD4208BF012709D0F9
+:10B06000134FBD4208BF022704D0124FBD427FF4E8
+:10B0700052AF032754E7BDE8F18F81B0002A14BF17
+:10B080008161816201B070470B4A136803421CBFA3
+:10B090001060FDF7E7B97047000000000008005895
+:10B0A00080080058001000480800014000040048D3
+:10B0B00000080048000C00480C080058A74900E0B0
+:10B0C000A74981B00A6802430A60096808400090F5
+:10B0D000009801B0704710B5FFF7CEFEA14C606834
+:10B0E00040010ED56068C0000BD401F06DF901F08D
+:10B0F0006BF9206840F480302060216821F48031B1
+:10B10000216000F0F1F8002000F0ACFD40B1807942
+:10B110009549E160E16821F47C5141EA0021E16058
+:10B1200000F047F89148924C0168002202600269E1
+:10B1300002F0500202610420FFF7C2FF0120FFF776
+:10B14000BFFF0220FFF7BCFF0420FFF7B7FF01207D
+:10B15000FFF7B4FF0220FFF7B1FF00220F210E20FE
+:10B1600000F0A8FF0E2000F0C2FF00220F213A20BD
+:10B1700000F0A0FF3A2000F0BAFF00217D484160B6
+:10B180000F218160046047F6FF71C16001F024F96E
+:10B19000CA206062FF2153206062A068C008C0001E
+:10B1A000A0606162FDF7F6F84FF0FF30FBF782F820
+:10B1B000FAE738B5AEB01CA84821FBF759F801A84A
+:10B1C0001C21FBF755F808A85021FBF751F801F0B6
+:10B1D000FBF86448684C016821F0180101604FF4E5
+:10B1E0008032206820F4C06040F4007020604FF48A
+:10B1F0008075216801F4C0610091072100981C91BD
+:10B2000001201E900021402020901D9227911F9523
+:10B210001CA801F08EF96F200190022100200291FC
+:10B2200003900490059006900790012101A801F079
+:10B2300037FC43F60300089000214FF4804019903A
+:10B240000E910F91102002211B901A91189508A8B9
+:10B2500001F0FCFDE06920F07000E0614748016802
+:10B26000C1F303200090009830B9E1690909090190
+:10B2700041F00401E16108E00098E169801E80F37B
+:10B280000400090940EA0110E061E06940F400406F
+:10B29000E0612FB030BD10B5394C3A4800F017F8D6
+:10B2A0004FF40040E061002020626062A06220460E
+:10B2B00001F04AFF0021204602F0C3FE0021204693
+:10B2C00002F0CAFE2046BDE8104002F09DBE20609C
+:10B2D0004FF4E13060600020A060E06020610C204D
+:10B2E00060610020A0617047274881B0016841F487
+:10B2F000801101603F21006800F4801000900098E8
+:10B30000224841604161016841F47C110160026999
+:10B3100042F47C120261016841F03F010160026960
+:10B3200042F03F02026101B0704738B5044602F0B6
+:10B33000F3FE14F1010F054609D0FFF7B4FD241800
+:10B3400005E01348016821F00401016030BF02F0FC
+:10B35000E3FE401BA042F4D331BD0000480000587A
+:10B360004C00005890000058FECAFECA80080058E1
+:10B37000002800409C1E0020000400585875FF1F44
+:10B38000841B00200038014050000058040C005875
+:10B3900010ED00E07047000010B5002488B9114896
+:10B3A00003600E480E4B036001F00EFF012805D02C
+:10B3B00007D3032804D038BF022402E0012400E0B0
+:10B3C0000324204610BD00680549884204D1054980
+:10B3D0000868002818BF004770470000841B002041
+:10B3E00000380140941F00200C480021016041609A
+:10B3F000704710B500F00CF85C6819B1012904D150
+:10B40000204301E024EA0000586082F3108810BD58
+:10B41000EFF3108272B6014B70470000581F0020F6
+:10B42000DFF83C150A6892B200E00246086880B274
+:10B430008242FAD170472DE9FC4104461825DFF815
+:10B440002485DFF82465684308EB00073078062878
+:10B4500008D131787170347078754FF0FF307060BA
+:10B46000002039E000F077F8B9680918B96008F1F0
+:10B470000803B96832786A439A589142327813D3F4
+:10B4800008F1150315FB02FC13F80C30062B25D030
+:10B4900008F108066B43F358994222BF08F11503DF
+:10B4A0006A439A5CEED219E01146337869439A42B6
+:10B4B0000BD008F1140308F1150C5B5C15FB03F5C8
+:10B4C0000CF805407A753B7500E07A7508F11402B6
+:10B4D0005454317871703470BDE8F6811146694377
+:10B4E00008F115035B5C062B04D008F1140615FB6C
+:10B4F00003F574557B753A7508F115025454EBE762
+:10B50000F8B5DFF86434DFF85C541E78182402467E
+:10B510006243B0422A4404D118785870507D1870A4
+:10B520000FE0167D507D92F815C005F115076643B2
+:10B53000062807F806C004D0167D143514FB00F465
+:10B540002E55012010731878062802BF00294FF0ED
+:10B55000FF315960F1BD10B5DFF80C44606810F19F
+:10B56000010F0FD0FFF75CFF6168DFF80024814214
+:10B5700061683CBF5388C918081A5178484311784C
+:10B58000C84000E0002080B210BD2DE9F84FDFF880
+:10B59000DC53DFF8DCB3D5F80880D8F80000DBF81E
+:10B5A00000104A0500F090F9DFF8BC63DFF8B4A39F
+:10B5B00021F4806181604FF0180934780AF10800A5
+:10B5C00019FB04F14758FFF7C6FF874217D200273F
+:10B5D0000121B170062C3DD019FB04F40AF10801D9
+:10B5E0000AF108020959814223BF0AF108010959E9
+:10B5F000091A002111510AEB04014C7DEAE7A988E0
+:10B600004118B94202D2AF880021E2E73F1ADFE7D2
+:10B61000022802DA2878012800D07F1ED8F800001E
+:10B62000C1684A07FAD500F055F9DBF80C00000CA8
+:10B63000BFB247EA0047CBF80C70FFF7F1FE70602D
+:10B64000A8680068816841F480618160AFF3008080
+:10B65000BDE8F18FB8B20028DAD1FFF7E1FE7060E3
+:10B660000320BDE8F24F00F070BD2DE9F843EFF381
+:10B67000108872B6BD4DBB4BA8680168CA224A62E9
+:10B6800053204862B84A886820F480608860182097
+:10B690001678374647431F44387B022826D13C683A
+:10B6A000D7F810909078F0B17A7B012A0AD1012165
+:10B6B0003046FFF725FF88F310887968304600F0A0
+:10B6C00016F904E088F31088304600F0C1F8A86845
+:10B6D0000068CA21416222465321416248463146F0
+:10B6E00000F050F90BE0FFF750FF06E0C868420792
+:10B6F000FCD500F07EF89F49086088F31088FF2190
+:10B70000A86802685162BDE8F183F8B5974CA16062
+:10B71000CA2209684A6253224A62954A136843F072
+:10B7200020031360136803F00703C3F104032370BD
+:10B7300095682D0C05F07F056D1C6570EDB2926863
+:10B74000C2F30E02521C628092B2521E6A43A2F5EC
+:10B75000A072DA404FF6FF739A422CBFA380A280FA
+:10B76000854A136843F400231360844B1D6845F435
+:10B7700000251D6048BB7C487A4E01238370182544
+:10B780004FF0FF33436000235FFA83FC06F10C07A0
+:10B7900015FB0CFC4FF0000E07F80CE05B1CDFB251
+:10B7A000062FF1DB06230370886820F48060886030
+:10B7B00000F01FF8D060032000F0D2FCA1680868F8
+:10B7C000826842F48042826005E0C868410544BF57
+:10B7D000032000F0BAFCA1680A68FF205062002232
+:10B7E0000321032000F066FCBDE8F240032000F0D6
+:10B7F0007EBCC86800F0800060F49060C8604FF4C0
+:10B8000000207047F0B504460025EFF3108672B6AD
+:10B810001827DFF850C10CF10C0007FB05FE10F8EB
+:10B820000E0010B16D1C062DF5DB062D0CD06F43FC
+:10B830000CEB07000127077386F31088046142733D
+:10B8400003600D700020F0BD86F310880120F0BD6C
+:10B85000F8B50746EFF3108472B6032000F052FCEF
+:10B86000424DAE683068CA2141623A465321416276
+:10B87000182043494243895C02291BD100213846E4
+:10B88000FFF73EFE3848017806290ED13068384966
+:10B890000A68530500F018F821F480618160C168DE
+:10B8A0004A07FCD500F016F804E04078884218BF3B
+:10B8B000FFF76BFEA9680A68FF205062032000F0C2
+:10B8C00016FC84F31088F1BD02D5C1684A07FCD488
+:10B8D00081687047C16801F0800161F49061C160C6
+:10B8E0004FF4002023490860032000F039BC2DE903
+:10B8F000F04180460F46424618201A4942438C18B0
+:10B90000207B022804BF4046FFF7A2FFEFF310851B
+:10B9100072B6032000F0F6FB144EB0680068CA212E
+:10B9200041625321416202202073A7606760404654
+:10B93000FFF781FD0C490A784978914202D0FFF760
+:10B9400024FE02E0A168081AA060FF20B1680A681E
+:10B950005062032000F0CBFB85F31088BDE8F08136
+:10B9600028280040681A0020881F0020441F00205B
+:10B97000082800400C0800580008005880080058AB
+:10B98000741A002010470000264981B00A6802435B
+:10B990000A60096808400090009801B07047F0B54F
+:10B9A00085B005460C4668461421FAF761FC0DB9CE
+:10B9B000042004E0012D18BF022D02D10820FFF75A
+:10B9C000E3FF2000184E0FF268070DD137F815007D
+:10B9D000009000210191012002900221039100F0CA
+:10B9E0001BF80120FFF7A1FC012C13D137F815003B
+:10B9F000009001210D480190029100F00DF80FF226
+:10BA00003800445D00220F2160B200F053FB60B2A9
+:10BA100000F06DFB05B0F0BD694656F82500FFF754
+:10BA20006FBA00004C000058741000200000211074
+:10BA300010000100020000000A0607007FB50C4656
+:10BA40004D4D61684D4EE8612962284602F06AFB5F
+:10BA50002468746006F10800FFF7DCF8012000F0AC
+:10BA600068F801203070296841B10FF2E9000FF247
+:10BA7000ED02009001920294684688477FBD1FB591
+:10BA80003E4C04F10800FFF7C8F800BB2178F1B183
+:10BA9000694604F10800FFF7E9F83748C16949B180
+:10BAA0000098029001228DF8042001A888479DF893
+:10BAB000040000E001202070207818B10098FFF702
+:10BAC0008BF904E0009904F10800FFF7AFF804F1E6
+:10BAD0000800FFF7A2F828B9207818B104F108008F
+:10BAE000FCF7B6FC1FBD2DE9F04105460E46904619
+:10BAF0001C46002000F01DF8204F7868A0F809507F
+:10BB0000C672324641460C30FAF7A6F81A4A136953
+:10BB100000210020984748F2E800FCF7A0FC796873
+:10BB20008A78D21C04F10800FAF796F8BDE8F041D3
+:10BB300001201CB51049124C096A20B901B188478F
+:10BB40000020207013BD0120207011B1BDE81C4001
+:10BB5000084713BD0020FCF77FBC000010B501466C
+:10BB6000064C04F10800FFF76BF804F10800BDE88B
+:10BB70001040FCF76DBC0000C01E0020341F0020E8
+:10BB8000A81F0020E0B505A0042100908DF8041046
+:10BB900042F629206946FDF7C8FE07BD53544D0003
+:10BBA00010B500782B4C18B102280FD004D310BD6B
+:10BBB000A0800120207310BD607BFFF749FE607BF1
+:10BBC000BDE8104040F60101FFF791BE607BBDE883
+:10BBD0001040FFF73DBE10B50FF2450200210220D4
+:10BBE000FAF7CBFB1B4C0021042021732070214667
+:10BBF00042F63820FEF7DAF81F20E07204F10D015A
+:10BC00000A20A0800120A0724FF48060E080012211
+:10BC1000BDE810400FF245030020FFF7F3BD000020
+:10BC20000D480C490068CA7A00F00700413048808E
+:10BC30001307087B04D518B98888401D888003E065
+:10BC4000012804BF00200873891C42F63720FEF744
+:10BC5000ADB80000041F0020282800400021022069
+:10BC6000FAF798BB01460648064AC3798B4218BFCB
+:10BC7000904218BF0838F8D18B4218BF0020704797
+:10BC8000F873FF1F0070FF1F18B50C46C7B01146B0
+:10BC900000228DF800208DF81C008DF81D402246F2
+:10BCA0000DF11E00FAF7E7FA00F02AF83F200C2108
+:10BCB000ADF80400ADF8061007A801210390069125
+:10BCC000A41C049400F02CF800284CBFFF209DF821
+:10BCD000000048B010BD00B5C7B000F00AF80F2052
+:10BCE00000F013F800284CBFFF209DF8000047B07B
+:10BCF00000BD00228DF800208DF81C008DF81D106D
+:10BD00001822002101A8FAF7BCBAADF8060007A96D
+:10BD1000022004903F22012003910690ADF80420F8
+:10BD2000CDF814D0002101A8FBF74FBF012002F08D
+:10BD300003BA000070470000841A71EB030604D2B6
+:10BD40006E40001BB141121973414FF4001C1CEBF3
+:10BD5000410F34BF7CEB430682E00C0DA4EB13567D
+:10BD6000362E7BDC012E45EAC32341DC43EA5253E5
+:10BD700012BFD20292025B08240545EAC12141EAC2
+:10BD80005051D2EBC020994125D407D1B0FA80F6AA
+:10BD900010FA06F162D00020203608E0B1FA81F6F0
+:10BDA000B140C6F1200220FA02F21143B0404FEA3E
+:10BDB000F474B4EB465434F001064FEA74040AD824
+:10BDC000D6F50016760D04F00044F04061FA06F254
+:10BDD0005040F1404840C00A40EA415021F0004143
+:10BDE00028BF5FEA500550F1000044EBD12135E057
+:10BDF000DB0A45EAC121C90AB6F120050EDD42EA97
+:10BE00000242120CC5F1200603FA06F6EB4042EAA4
+:10BE100006056D42984161F100010DE062FA06F5F8
+:10BE2000F240554063FA06FC82EA0C02F3405A40A5
+:10BE30006D42904161EB030111F4801F05D1641E36
+:10BE4000620502D06D004041494121F48011430850
+:10BE500075F1004350F1000041EB045170BC704794
+:10BE60001CEB410F15D223F0004352EA43060BD0DE
+:10BE70004FEA4C0CBCEB410F04D80C0D661E342E5F
+:10BE8000B7DDEBE7801A994150EA410608BF00216F
+:10BE9000E4E708BF1CEB430F28BF6FF00001DDE7AC
+:10BEA000C0680840884201D10120704700207047D7
+:10BEB000C0690840884201D10120704700207047C6
+:10BEC00010B5664C02212046FFF7F2FF38B16068DA
+:10BED000C043810703D5FEF755FF022018E001217A
+:10BEE0002046FFF7E5FF38B16068C043C10703D5BE
+:10BEF000FEF70EFF01200BE008212046FFF7D8FFD8
+:10BF000038B16068C043010703D5FEF790FF0820F1
+:10BF1000A06010BD10B5514C00F033F818B960683E
+:10BF2000C043810306D400F02CF830B96068C043E8
+:10BF3000810302D5BDE810406EE0082100F022F830
+:10BF400070B96068C04301030AD56068444940F491
+:10BF500000206060086880474FF40020A06010BD9A
+:10BF6000202100F00FF858B96068C043810207D55E
+:10BF7000606840F400106060BDE81040FEF7DBBE72
+:10BF800010BD022120468BE73648016841F400715C
+:10BF900001603548026842F40072026040BF20BF71
+:10BFA0003248016841F400410160704780B5304873
+:10BFB000016841F480110160006800F48010009075
+:10BFC00000982648016841F001010160026842F4CE
+:10BFD000803202602C2000F08AF8BDE802402D205B
+:10BFE00000F085B82348016849084900016070479E
+:10BFF00021494FF48030086070471E48016821F0E5
+:10C000000201016070471B484FF400314160016834
+:10C0100021F40031016070471648016841F4003195
+:10C020000160FEF7A9BE38B504460C4D082128462C
+:10C03000FFF736FF30B10A480460686820F400203A
+:10C04000686031BDA0474FF40021A96031BD0948A7
+:10C05000016821F00801016070470000000C0058E1
+:10C06000901F0020D4080058200800580C040058E5
+:10C0700050000058040C0058080C00580901020038
+:10C0800081B002D43C48815405E03C4802F00F02E4
+:10C09000104400F8041C01B07047394A13684FF689
+:10C0A000FF0100020B4000F4E060184335490843EB
+:10C0B0001060704738B5324B1C68C4F30223C3F1DB
+:10C0C0000704052C28BF04241D1D072D34BF0023A1
+:10C0D000DB1E012505FA04F4641E2140994005FA8F
+:10C0E00003F35B1E1A401143BDE83440C6E701006C
+:10C0F00007D4012200F01F01234B8A40400943F876
+:10C100002020704701000BD4012200F01F011F4BBB
+:10C110008A40400943F82020BFF34F8FBFF36F8F51
+:10C12000704710B5401EB0F1807F01D3012010BDD3
+:10C13000174C60600F214FF0FF30FFF79FFF002288
+:10C14000A26007202060002010BD010007D401225A
+:10C1500000F01F010F4B8A40400943F82020704730
+:10C16000010007D4012200F01F010B4B8A40400957
+:10C1700043F820207047000000E400E018ED00E0E4
+:10C180000CED00E00000FA0500E100E080E100E0D5
+:10C1900010E000E000E200E080E200E070B50F4E49
+:10C1A000044630780025A8B100F096FD32784FF4AF
+:10C1B0007A71B1FBF2F1B0FBF1F0FFF7B2FF48B9D1
+:10C1C000102C07D2002221464FF0FF30FFF772FFFC
+:10C1D000B46000E00125284670BD00BF6810002053
+:10C1E0006D4981B00A6802430A600968084008E0A6
+:10C1F0006A4881B0016841F400210160006800F4E0
+:10C2000000200090009801B0704738B58AB004460D
+:10C2100068461421FAF72CF82068614A6149904277
+:10C220003ED10868604D40F001000860096801F0E7
+:10C230000101059105980120FFF7D2FF0C20009025
+:10C24000022100200191029003210820039100F0B7
+:10C250006AF8402000F060F8082000F064F85348C5
+:10C260002860112000F065F808B1FFF793F84FF04F
+:10C2700088500690002101200791ADF82010099008
+:10C2800006A9284601F062FF08B1FFF783F8656749
+:10C29000AC62002200212520FFF70CFF252037E0AB
+:10C2A000434A904236D14868424D40F4804048604D
+:10C2B000486800F48040059005980120FFF790FF42
+:10C2C0000220FFF78DFF4FF4006000F025F80720F3
+:10C2D00000F029F8C0200090022101200191029075
+:10C2E000032107200391049069463348FEF708FEB6
+:10C2F000324828600F2000F01CF808B1FFF74AF818
+:10C300006567AC62002200212420FFF7D3FE2420C1
+:10C31000FFF7EDFE0BB030BD00900221002002902F
+:10C32000039001917047049069464FF09040FEF7EA
+:10C33000E7BD68601020A8600020E86080202861C8
+:10C3400000206861A861E8612862284601F024BFE6
+:10C350001CB504461A49206888421CD100F034F804
+:10C3600000F032F81748816B21F4407141F480717C
+:10C370008163816B41F400418163026842F4806211
+:10C380000260006800F48060009000982046BDE8DC
+:10C39000164002F0A7B813BD4C00005850000058DA
+:10C3A000008000405C000058101D00204400024046
+:10C3B00000380140701D0020000400484404024081
+:10C3C00000280040580000580248016841F480717C
+:10C3D000016070470004005838B5040044D094F858
+:10C3E000210028B9002184F820102046FFF7B0FF73
+:10C3F00000F049F8FF2510B100F03FF834E0216863
+:10C40000DFF8B0008A6802408A6021688A68636841
+:10C4100020690343A06903431A438A602168E068E6
+:10C42000086120680169A26841EA0241016120684F
+:10C43000C16821F08001C1602068C16C8908890051
+:10C44000C1642168CA6CE369606903431A43CA6422
+:10C4500020688168880609D400F020F830B120688F
+:10C460004562042100F01FF8012032BD20684562BA
+:10C47000012184F82110002032BD2068456204218A
+:10C4800084F821107047022084F82100CA20216816
+:10C490004862532022685062204626E020460BE086
+:10C4A0002068C0F8248084F82110002084F820003F
+:10C4B00070470000BFFF8FFF70B5044640F2E936B9
+:10C4C0002068C16821F0A001C16001F025FE054689
+:10C4D0002068C168880606D401F01EFE401BB042E9
+:10C4E000F6D3032070BD002070BD70B504462068EF
+:10C4F000C1684A0612D44FF0FF32C26040F2E936FA
+:10C5000001F00AFE05462068C168480606D401F01D
+:10C5100003FE401BB042F6D3032070BD002070BD67
+:10C520004FF0B040006800F0F000B02888BFB020A5
+:10C5300070472DE9F041040051D0207881064FF07A
+:10C54000B04535D5A868E96810F00C0001F003018A
+:10C5500003D00C2808BF012943D12868800702D5E1
+:10C56000E06900283BD0FFF7DBFF616A884207D211
+:10C57000084600F0D8FB002831D100F07AFA0FE02D
+:10C58000286820F0F000014329606968206A21F4DE
+:10C590007F4141EA00216960606A00F0C4FBF0B9A4
+:10C5A00001F0E0FFDFF818080068FFF7F7FDB0B909
+:10C5B0002078C1070DD5A868E96800F00C000828AC
+:10C5C00001F0030103D00C2808BF03292CD12868EF
+:10C5D000800340F141816068002840F03D810120E6
+:10C5E00040E2E06980B1296841F0010100F02EFBD2
+:10C5F00006462868800700F12C8101F08DFD801B24
+:10C600000328F6D303202DE228684008400000F0FC
+:10C610003EFA0646286800F028FAC9D001F07CFDF1
+:10C62000801B0328F6D3EDE76068B0F5803F06D0A5
+:10C63000B0F5A02F296807D141F48021296028682E
+:10C6400040F48030286006E021F4803129602A68B7
+:10C6500022F480222A60606860B101F05DFD064628
+:10C660002868800300F1F88001F056FD801B6528E2
+:10C67000F6D3C7E701F050FD06462868400C10F0DD
+:10C68000010000F0E98001F047FD801B6528F4D32C
+:10C69000B8E701F041FDC01B0328C0F01181B1E7EC
+:10C6A000E06878B1296841F4807100F0CFFA06465D
+:10C6B0002868400500F1178101F02EFD801B03283A
+:10C6C000F6D39FE7286820F4807000F0E0F9064672
+:10C6D0002868800A10F0010000F0DC8001F01CFDE9
+:10C6E000801B0328F4D38DE701F016FDC01B03283F
+:10C6F000C0F00B8186E740F0010000F0CEF907465C
+:10C700007068800700F11C8101F006FDC01B032842
+:10C71000F6D377E7706820F0040000F0BEF9074612
+:10C720007068C00810F0010000F0198101F0F4FCFD
+:10C73000C01B0428F4D365E70528306806D140F013
+:10C7400004003060316841F0010105E0400840001C
+:10C750003060316821F004013160A06841F289370E
+:10C7600068B101F0D9FC80463068800700F10C8187
+:10C7700001F0D2FCA0EB0800B842F5D342E701F08B
+:10C78000CBFC8046306800F070F900F0FD8001F0CD
+:10C79000C3FCA0EB0800B842F4D333E701F0BCFCC3
+:10C7A000C01B0328C0F0FE802CE7B06840084000A2
+:10C7B000B06001F0B1FC0746B06800F056F900F037
+:10C7C000F58001F0A9FCC01B0328F5D31AE701F09E
+:10C7D000A3FC801B0328C0F01F8113E701F09CFC21
+:10C7E000001B0328C0F039810CE7286881010CD4B4
+:10C7F000296841F080712960E86840F08050E86065
+:10C8000001F08AFC04462868810100F12A8101F0C8
+:10C8100083FC001B0328F6D3F4E60C2931D02868EA
+:10C8200020F080702860E968DFF8980589088900A1
+:10C83000E960E9680140E96001F06EFC044628689F
+:10C84000810140F10E8101F067FC001B0328F6D343
+:10C85000D8E600F00EF9ABE6207881071AD5A86873
+:10C86000E96800F00C00042801F0030104D00C2852
+:10C8700008BF02297FF414AF2868400503D5E0689B
+:10C8800000283FF4ACAE6968206921F0FE4141EA1E
+:10C89000006169602168DFF8306511F0180F38D049
+:10C8A000606900283FF436AFC90670687FF523AF92
+:10C8B000800709D4706840F0010000F0EEF80746E8
+:10C8C000706880077FF5E5AE706840F0040000F006
+:10C8D000E4F80746706800070DD401F01DFCC01B8A
+:10C8E0000428F7D38EE66868216920F0FE4040EA0C
+:10C8F00001606860CEE77068A16920F4706040EA6A
+:10C900000120706000F0C6F8074600F0ADF87FF433
+:10C91000EBAE2078410737D5DFF8B0743868C10531
+:10C9200029D4FFF751FD01F0F7FB80463868C105B7
+:10C9300021D401F0F1FBA0EB08000328F6D361E657
+:10C94000706820F0040070607068C00810F001008A
+:10C95000DFD001F0E1FBC01B0428F5D352E600F064
+:10C9600099F8074600F080F8D3D001F0D5FBC01B42
+:10C970000328F7D346E6A06801287FF4DDAE3068CF
+:10C9800040F001003060E8E6217848060ED5A06A44
+:10C9900000283FF40AAFB16841F00101B16001F035
+:10C9A000BBFB0746B06880077FF5F8AEE06A002859
+:10C9B00057D0A968EA68022801F00C017FF42DAF76
+:10C9C000236B02F00300984202BF02F07000636B19
+:10C9D000984214D1A36BC2F30620984202BF02F41E
+:10C9E0007810E36B98420AD1236C02F060609842A1
+:10C9F00002BF02F06042606C82423FF4F6AE0C2946
+:10CA00003FF4EDAD286841013FF5E9AD296821F01B
+:10CA1000807100F01BF90646286881013FF5D7AE0A
+:10CA2000E968DFF8AC03A26B0140206B0143606B47
+:10CA30000143E06B41EA02210143206C0143606C39
+:10CA40000143E960286840F080702860E96841F09F
+:10CA50008051E96001F060FB0446286881017FF5A0
+:10CA6000BDAE0020BDE8F0817068400810F0010004
+:10CA700070472968606A21F0F00101432960686805
+:10CA8000216A20F47F4040EA0120686070472860F6
+:10CA900001F042BB706840084000706001F03CBB90
+:10CAA0002DE9F8430400884644D0DFF8286300F0FD
+:10CAB000C8F847D200F0CDF8074600F0C2F841D0E0
+:10CAC00001F02AFBC01B0228F7D90320B7E001F0D0
+:10CAD00023FB401B022843D9F7E701F01DFBA0EB25
+:10CAE000090002284CD9F0E701F016FBA0EB090081
+:10CAF000022854D9E9E701F00FFB401B02285DD959
+:10CB0000E3E701F009FB401B022867D9DDE701F0EC
+:10CB100003FB401B484577D3D7E7032802D1396888
+:10CB2000890103E00028396802D1890762D401E055
+:10CB300049055FD4012082E001F0EEFAC01B022813
+:10CB400072D9C2E7207881074FF0B0470BD5B9689A
+:10CB5000A06821F0F0010143B96001F0DDFA05465B
+:10CB6000B868C003B3D52078DFF8505281060AD5E3
+:10CB70002968606921F0F001014300F067F88146FF
+:10CB800028688003A9D5207841060BD52968A069BB
+:10CB90000909090141EA101100F058F88146286896
+:10CBA000C003A1D5207841070BD5B968E06821F40E
+:10CBB000E0610143B96001F0AFFA0546B86880034F
+:10CBC00099D5207801070CD5B868216920F4605008
+:10CBD00040EAC100B86001F09FFA0546B86840031A
+:10CBE0008FD52078C10717D56068022895D139689C
+:10CBF00089039FD5B968890840EA8100B86041F28D
+:10CC0000893901F089FA0546B868616800F00C00BE
+:10CC1000B0EB810F7FF47BAF306800F007008045F8
+:10CC200005D200F016F8074600F00BF884D101F0A9
+:10CC300099FCFEF735F9BDE8F243FFF7AFBABDE85E
+:10CC4000F283306800F0070040457047296001F02A
+:10CC500063BA3168C90848EAC101316001F05CBAC1
+:10CC600038B54FF0B0445D4DA16811F00C0106D10C
+:10CC7000FFF756FCC0F3031055F8200032BD04291D
+:10CC8000574A05D00829574804D12168C90222D53E
+:10CC9000104632BDE16801F00301022904D00329E6
+:10CCA00004D12168C90207D5104605E0FFF738FC1A
+:10CCB000C0F3031055F82000E168E268E368C1F3AF
+:10CCC00006214843C2F30211491C5B0FB0FBF1F08F
+:10CCD0005B1CB0FBF3F032BD80B5FFF7C1FF3E49EE
+:10CCE000FFE7414A0968C1F3031152F82110B0FB74
+:10CCF000F1F002BD80B5FFF7EFFF00F010F8C1F3CF
+:10CD0000022106E080B5FFF7E7FF00F008F8C1F365
+:10CD1000C22112F8211001F01F01C84002BD2E49A6
+:10CD2000324A0968704770B52C49B1282EBFCC6AC9
+:10CD3000C0F3031051F820402048056801F0A0FC22
+:10CD400029492B4A05F00F0551F82510B4FBF1F1E4
+:10CD50000024B1FBF2F1B0F5007F0FF2B4022046DF
+:10CD600009D10FF2900353F820508D4214D2401C89
+:10CD70000328F8D912E00FF28C0353F820508D42AB
+:10CD80000AD2401C0328F8D308E001F0C5F9801B43
+:10CD900003280BD3032070BD52F820400D4D2868A6
+:10CDA000C00844EAC000FFF772FE0646296801F099
+:10CDB0000701A142E9D1002070BD00000801005820
+:10CDC00070100020FFFFFEEE900000580004005895
+:10CDD0008C80C111004000580800005840E600084F
+:10CDE0000024F4000048E80100E6000870EE0008A6
+:10CDF00040420F0012000000240000003600000036
+:10CE000040000000060000000C00000010000000C0
+:10CE1000000000000100000002000000030000000C
+:10CE2000DFF820130A68030903F47F2300019A4303
+:10CE300000F47F2000F082B9DFF808231368010CAA
+:10CE400023EA014343EA0043136070472DE9F843A6
+:10CE5000054600242878DFF8EC624106A0464FF032
+:10CE6000B0472DD5286B70B1B0F5800F06D0B0F566
+:10CE7000000F18BFB0F5400F17D01FE0F86840F45E
+:10CE80008030F860EDE0386820F08060386001F0B4
+:10CE900043F981463868000140F1D08001F03CF947
+:10CEA000A0EB09000228F5D90324D7E001F034F9FA
+:10CEB000A0EB0900022840F2C980F5E70124A04652
+:10CEC0002868010531D5B06800F44078286C8045A9
+:10CED0002AD0FFF779FAB8F1000FB16805D1286CB4
+:10CEE00021F440710143B1601EE0B06840F480302D
+:10CEF000B06021F44071B06820F48030B060286CDC
+:10CF00000143B160B068C0070ED501F005F9804655
+:10CF100041F28939B068800706D401F0FDF8A0EB32
+:10CF200008004845F6D30324A0462878C10705D554
+:10CF30003168A869890840EA810131602878810751
+:10CF400005D53168E86921F44061014331602878F2
+:10CF5000C10644BFA86AFFF76FFF2878810644BF67
+:10CF6000E86AFFF769FF2878410744BF286AFFF79E
+:10CF700057FF2878010744BF686AFFF751FF286808
+:10CF8000C1051BD53168686B21F0406101433160F8
+:10CF9000686BB0F1006F00F0BDF8686BB0F1806FA6
+:10CFA00075D100F0BDF804463868000160D501F085
+:10CFB000B3F8001B0228F7D94FF0030867E001F02F
+:10CFC000ABF8001B02285BD9F6E7316821F040413D
+:10CFD000316020F08050326822F0406210433060AF
+:10CFE000A86BB0F1C05F00F095F8286841056DD5D9
+:10CFF0003168E86B21F0405101433160E86BB0F1DA
+:10D00000005F03D1F96841F48031F960E86BB0F159
+:10D01000805F5BD100F084F804463868000146D593
+:10D0200001F07AF8001B0228F7D94FF003084DE011
+:10D0300001F072F8001B022841D9F6E700F061F810
+:10D04000A86821F4781100F071F881463868000171
+:10D050007FF52CAF3969686901433961002C7FF491
+:10D060002EAF3168286B21F440010143316027E77E
+:10D0700000F047F8E86821F0606100F057F80446D6
+:10D08000386800019BD539696869014339612868AE
+:10D090008105AAD5A86BB0F1804F1CBFB0F1004F3D
+:10D0A000002892D1316821F04041084397E700F011
+:10D0B00028F8286921F0604100F038F80446386803
+:10D0C0000001B5D539696869014339612868C1042F
+:10D0D00005D5F168686C21F440410143F16028688E
+:10D0E00081040BD5796AE86C21F030010143796243
+:10D0F000796AA86C890840EA810179624046BDE8F6
+:10D10000F2833869696820F4FE4040EA0120386102
+:10D110003969704703D1F96841F08071F96070474F
+:10D12000396821F08061396000F0F6BF0143396150
+:10D13000386840F08060386000F0EEBF104308604F
+:10D14000704700008800005838B5040009D004F189
+:10D150007C05686808B900F01EF800F021F8012885
+:10D1600001D1012032BDA06A08B100F02AF800F018
+:10D170000AF821F02A01FFE7816000F01BF8BDE802
+:10D18000324000F02EBE2068416821F49041416099
+:10D19000206881687047002129702046FFF735B864
+:10D1A0002420686020680168490849000160204621
+:10D1B00000F040B92068016841F00101016020469B
+:10D1C0007047204600F0AABD70B5044604F17C0506
+:10D1D00013466868202836D149B3180027D028782C
+:10D1E000012830D001222A7004F1540621653380D1
+:10D1F00073800020E86021206860306AC8B1DFF8E1
+:10D200002012C162DFF81C02316A0863316ADFF85C
+:10D21000180248630020316A88632068216D00F19C
+:10D220002802306A01F01FF818B100F00EF8012052
+:10D2300070BD216840200862002028702068816845
+:10D2400041F0800108E0022070BD1020E86000205D
+:10D2500028702020686070478160002070BD2068C1
+:10D2600081684A067047F8B5044640F60F00256805
+:10D27000E9692A68AB6808400DD1880602D5900696
+:10D2800002D4D80040F18980E16E00294FD02046B9
+:10D29000BDE8F44008476548034204BF644E32428B
+:10D2A0007BD0CF0709D5D60507D501262E62D4F845
+:10D2B000885045F00105C4F888508D070AD5DD0770
+:10D2C00008D5266802253562D4F8885045F0040553
+:10D2D000C4F888504D070AD5DD0708D5266804250F
+:10D2E0003562D4F8885045F00205C4F888500D071F
+:10D2F0000CD5950601D4034208D025680820286281
+:10D30000D4F8880040F00800C4F8880008050BD560
+:10D31000500109D525684FF400602862D4F88800D0
+:10D3200040F02000C4F88800D4F88800002870D0AD
+:10D33000890607D5900601D4D80003D5E16E09B15E
+:10D3400020468847D4F8880021688A68510602D4AC
+:10D3500010F0280F1AD0204600F0BEFDFFF77FFF27
+:10D360000FD500F057F860B1DFF890198163A06F16
+:10D3700000F0BCFF00284CD0A06F816BBDE8F440EA
+:10D3800008472046BDE8F24001F082B9204601F08E
+:10D390007FF90020C4F88800F1BDC80209D5580201
+:10D3A00007D54FF4801028622046BDE8F24000F017
+:10D3B000B1BE080609D5100601D4180205D5216FA3
+:10D3C00039B32046BDE8F440084748060FD550065B
+:10D3D0000DD5286820F0400028602021C4F8801076
+:10D3E000002020672046BDE8F240FDF7ECBF0802B0
+:10D3F00006D5500004D52046BDE8F24001F049B9F9
+:10D40000C80148BF002A04D52046BDE8F24001F01B
+:10D4100041B9F1BD816821F040018160A06F704782
+:10D420002DDF00085BDF000861DF0008010000104D
+:10D43000200100042DE9F84F0446DFF8C8082768EA
+:10D44000DFF8C4B83968DFF8C4A80140A068014318
+:10D450002069014360690143E0690143606E014353
+:10D46000396000267968E06821F440510143796011
+:10D47000B046A169DFF8880887421CBF206A0143D3
+:10D48000BA68DFF8780A02401143B9604FF480753A
+:10D49000F96A606A090940EA0111F9625F454FF4CF
+:10D4A00000404FF400714FF480624FF400634FF47A
+:10D4B000805C4FF4005E4FF4804929D1DAF800B067
+:10D4C0000BF0030BBBF1030F3ED8DFE80BF0023784
+:10D4D000343A4FF0010AD4F81CB05746BBF5004F60
+:10D4E0004FF6F07A40F01183012F09D0022F00F09F
+:10D4F0005482042F00F08D82082F00F0C282F5E2E2
+:10D50000FFF700FC0146606A002840F01B8242E2FF
+:10D51000DFF8ECB75F4517D1DAF800A01AF4406ADB
+:10D5200027D0BAF5806F09D0BAF5006F03D0BAF5ED
+:10D53000406F06D008E04FF0020A07E04FF0040AFF
+:10D5400004E04FF0080A01E04FF0100ADFF8B0B72E
+:10D550005F45C0D1BAF1000F0BD0BAF1020F49D02C
+:10D56000BAF1040F00F08280BAF1080F00F0B08029
+:10D57000B6E3FFF7BFFB0146606A58B3012808BF56
+:10D58000022028D0022808BF042024D0032808BF86
+:10D59000062020D0042808BF08201CD0052808BF7A
+:10D5A0000A2018D0062808BF0C2014D0072808BF6E
+:10D5B000102010D0082808BF20200CD0092808BF50
+:10D5C000402008D00A2808BF802004D00B2808BFBC
+:10D5D000284600D00120B1FBF0F0002800F0828343
+:10D5E000626802EB4201884203D31103814280F05A
+:10D5F000A18075E3606AB0B3012808BFDFF80009B5
+:10D60000EED0022808BFDFF8FC08E9D0032808BFE5
+:10D61000DFF8F408E4D0042808BFDFF8F008DFD012
+:10D62000052808BFDFF8E808DAD0062808BFDFF8C9
+:10D63000E408D5D0072808BFDFF8DC08D0D00828D8
+:10D6400008BFDFF8D808CBD0092808BFDFF8D0081A
+:10D65000C6D00A2808BFDFF8CC08C1D00B2808BF05
+:10D660004FF22440BCD0DFF8C008B9E7FFF7F8FA62
+:10D670000146606A58B3012808BF0220ABD00228D7
+:10D6800008BF0420A7D0032808BF0620A3D0042881
+:10D6900008BF08209FD0052808BF0A209BD0062875
+:10D6A00008BF0C2097D0072808BF102093D0082867
+:10D6B00008BF20208FD0092808BF40208BD00A281F
+:10D6C00008BF802087D00B2808BF284683D081E779
+:10D6D000676A002F84D0012F08BF4846FAD0022F76
+:10D6E00008BF7046F6D0032F08BF41F25550F1D065
+:10D6F000042F08BF6046EDD0052F08BF40F6CC4090
+:10D70000E8D0062F08BF40F6AA2012D0072F08BF86
+:10D7100018460ED0082F08BF10460AD0092F08BFA0
+:10D72000084606D00A2F08BF284602D00B2F00D18A
+:10D73000802055E7BAF1000F0BD0BAF1020F38D0B4
+:10D74000BAF1040F00F07280BAF1080F00F0A78060
+:10D75000ECE0FFF7CFFA0146606A40B3012808BF4A
+:10D7600002251ED0022808BF04251AD0032808BFAE
+:10D77000062516D0042808BF082512D0052808BFA2
+:10D780000A250ED0062808BF0C250AD0072808BF96
+:10D79000102506D0082808BF202502D0092808BF78
+:10D7A000402572D00A280CBF80250B286DD001259A
+:10D7B0006BE0606A002836D0012808BFDFF80068F7
+:10D7C0002BD0022808BFDFF8FC6726D0032808BF4B
+:10D7D000DFF8F46721D0042808BFDFF8F0671CD019
+:10D7E000052808BFDFF8E86717D0062808BFDFF86C
+:10D7F000E46712D0072808BFDFF8DC670DD00828DF
+:10D8000008BFDFF8D86708D0092808BFDFF8D0675D
+:10D8100003D00A2808BFDFF8CC677CD00B2808BFEC
+:10D82000DFF8046777D0DFF8C06774E0FFF718FA15
+:10D830000146606A40B3012808BF022525D00228AE
+:10D8400008BF042521D0032808BF06251DD00428C1
+:10D8500008BF082519D0052808BF0A2515D00628B5
+:10D8600008BF0C2511D0072808BF10250DD00828A7
+:10D8700008BF202509D0092808BF402505D00A285F
+:10D880000CBF80250B2800D001256268B1FBF5F69E
+:10D890005008002110EB062051EB166141E0606A50
+:10D8A000002836D0012808BF4FF4800633D0022864
+:10D8B00008BF4FF400162ED0032808BFDFF82C67EE
+:10D8C00029D0042808BF4FF4801624D0052808BFAB
+:10D8D000DFF81C671FD0062808BFDFF818671AD0CA
+:10D8E000072808BF4FF4002615D0082808BF4FF4BA
+:10D8F000802610D0092808BF4FF400360BD00A2824
+:10D9000008BF4FF4803606D00B2808BF4FF40046FE
+:10D9100001D04FF40006C246002116EB52004AEB3C
+:10D9200001010023FCF794FC064601E04FF00108DA
+:10D93000A6F54070DFF8C016884280F0D1812168DA
+:10D94000CE60CFE1012808BF02251AD0022808BF07
+:10D95000042516D0032808BF062512D0042808BFC6
+:10D9600008250ED0052808BF0A250AD0062808BFBA
+:10D970000C2506D0072808BF102502D0082808BFAC
+:10D98000202575D0092808BF402571D00A280CBF72
+:10D9900080250B286CD001256AE0606AB0B30128AD
+:10D9A00008BFDFF8840521D0022808BFDFF8500542
+:10D9B0001CD0032808BFDFF8440617D0042808BF8E
+:10D9C000DFF8400512D0052808BFDFF834060DD077
+:10D9D000062808BFDFF8300508D0072808BFDFF8A1
+:10D9E0002C0503D0082808BFDFF82C057AD00928B9
+:10D9F00008BFDFF8280575D00A2808BFDFF8200522
+:10DA000070D00B2808BFDFF81C056BD0DFF8D405F9
+:10DA100068E0FFF725F90146606A40B3012808BFB6
+:10DA2000022525D0022808BF042521D0032808BFDD
+:10DA300006251DD0042808BF082519D0052808BFD1
+:10DA40000A2515D0062808BF0C2511D0072808BFC5
+:10DA500010250DD0082808BF202509D0092808BFA7
+:10DA6000402505D00A280CBF80250B2800D00125B1
+:10DA70006068B1FBF5F1420802EB4102B2FBF0F63F
+:10DA800032E0666A66B3012E2CD0022E08BF4846EB
+:10DA900028D0032E08BF42F6AA2023D0042E08BFA8
+:10DAA00070461FD0052E08BF41F698101AD0062EDA
+:10DAB00008BF41F2545015D0072E08BF604611D060
+:10DAC000082E08BF18460DD0092E08BF104609D0F1
+:10DAD0000A2E08BF084605D00B2E08BF284601D0E5
+:10DAE0004FF4803000F014F9B6B201E04FF00108B5
+:10DAF000A6F11000504580F0F3800AEA0601C6F353
+:10DB0000420001432068C160ECE0012F07D0022FE2
+:10DB100035D0042F70D0082F00F0A580D7E0FFF794
+:10DB2000F1F80146606A40B3012808BF022516D00B
+:10DB3000022808BF042512D0032808BF06250ED0EE
+:10DB4000042808BF08250AD0052808BF0A2506D0E2
+:10DB5000062808BF0C2502D0072808BF10257AD058
+:10DB6000082808BF202576D0092808BF402572D094
+:10DB70000A280CBF80250B286DD001256BE0606A58
+:10DB8000B0B3012808BFDFF8781333D0022808BFEC
+:10DB9000DFF870132ED0032808BFDFF86C1329D0EC
+:10DBA000042808BFDFF8641324D0052808BFDFF875
+:10DBB00060131FD0062808BFDFF858131AD00728B3
+:10DBC00008BFDFF8541315D0082808BFDFF84C133E
+:10DBD00010D0092808BFDFF848130BD00A2808BF67
+:10DBE000DFF8401306D00B2808BF4FF2244101D0C4
+:10DBF000DFF83413606831E0FFF732F80146606AFD
+:10DC000040B3012808BF022525D0022808BF0425FB
+:10DC100021D0032808BF06251DD0042808BF0825E9
+:10DC200019D0052808BF0A2515D0062808BF0C25DD
+:10DC300011D0072808BF10250DD0082808BF2025BF
+:10DC400009D0092808BF402505D00A280CBF802527
+:10DC50000B2800D001256068B1FBF5F101EB500104
+:10DC6000B1FBF0F631E0666A6EB3012E08BF48469C
+:10DC700029D0022E08BF704625D0032E08BF41F2DE
+:10DC8000555020D0042E08BF60461CD0052E08BF7A
+:10DC900040F6CC4017D0062E08BF40F6AA2012D07E
+:10DCA000072E08BF18460ED0082E08BF10460AD00F
+:10DCB000092E08BF084606D00A2E08BF284602D003
+:10DCC0000B2E08BF802000F023F8B6B201E04FF021
+:10DCD0000108A6F11000504502D22068C66001E09C
+:10DCE0004FF0010804F1680001214180018000210A
+:10DCF000416081604046BDE8F28F0000AFDF000860
+:10DD000000800040F369FFCF0038014088000058D0
+:10DD1000616800EB5100B0FBF1F6704790F82810F5
+:10DD2000CA0706D502685368C16A23F400330B435F
+:10DD3000536090F828108A0706D502685368016B73
+:10DD400023F480330B43536090F828104A0706D51C
+:10DD500002685368416B23F480230B43536090F8AF
+:10DD600028100A0706D502685368816B23F4004324
+:10DD70000B43536090F82810CA0606D502689368D2
+:10DD8000C16B23F480530B43936090F828108A06EC
+:10DD900006D502689368016C23F400530B4393602B
+:10DDA00090F828104A0610D502685368416C23F495
+:10DDB00080130B435360416CB1F5801F05D153684C
+:10DDC000816C23F4C0030B43536090F828100A06BB
+:10DDD00006D501684A68C06C22F4002202434A60FA
+:10DDE0007047F8B5044604F17C050020E8606FF048
+:10DDF0007E4700F091F90646206801680A0708D5B9
+:10DE00000097334600224FF40011204600F016F828
+:10DE100060B9206801684A070AD500973346002296
+:10DE20004FF48001204600F009F808B10320F2BD4C
+:10DE300020206860A86000202870F2BD2DE9F04124
+:10DE4000069C05460E4690461F462868C16931402B
+:10DE5000B1420CBF0120002040451CD114F1010F3C
+:10DE6000F3D000F059F9C01B844200D314B900F07C
+:10DE700015F80CE0286801684A07E6D5C1690A056B
+:10DE8000E3D54FF40062026200F008F8C16000219F
+:10DE90000170032000E00020BDE8F08128680168DF
+:10DEA00021F4D071016028688168490849008160C7
+:10DEB00005F17C00202141608160704701680A689B
+:10DEC00022F0C0020A6001688A6822F400028A60B7
+:10DED0002021C0F88010704701680A6822F490720F
+:10DEE0000A60DFF82011026893680B4093602021DC
+:10DEF000C0F884100021C16670470000FFF4FF11D4
+:10DF000000127A0000093D00AAB0280080841E009B
+:10DF1000006A18005558140040420F0020A1070065
+:10DF200090D0030048E801000024F400816A0068F2
+:10DF30000268930644BF0846FDF745BA0020A1F8E1
+:10DF400056000868826822F0800282600868FFE755
+:10DF5000016841F0400101607047806A00F09BBB9E
+:10DF6000F8B5846A04F1800504F1560728686E68E4
+:10DF700021688A68110606D5212804D1002038803E
+:10DF80002046FFF79BFF20688168480606D5222EB1
+:10DF900004D1002038812046FFF79EFFA86840F09A
+:10DFA0001000A8602046BDE8F24000F071BB806A16
+:10DFB00000F1560100220A810A8000F069BB0000CE
+:10DFC0000000127A0000093D00AAB0280080841EDB
+:10DFD00000006A18005558140040420F0020A107A5
+:10DFE0000090D0030048E801000024F4005515001B
+:10DFF00000CC0C0000AA0A0000FD0F005461510083
+:10E0000000D43000FEFFFFEF10B500F17C010A786C
+:10E01000012A01D1022010BD01230B7024224A6085
+:10E020000268136814686408640014600022426681
+:10E0300023F000530068036020204860002008702F
+:10E0400010BD70B500F01EF801D1022070BD00F0C7
+:10E050001FF822F0604209E070B500F013F801D11A
+:10E06000022070BD00F014F822F06062114381605C
+:10E07000204600F01AF82068066020206860002022
+:10E08000287070BD044604F17C052878012870478B
+:10E0900001222A70242068602068066802685208FD
+:10E0A00052000260206882687047FFB50FF2540288
+:10E0B0000FF25806D2E9003402A9C1E90034D6E9CA
+:10E0C0000071CDE90071416E11B90121012213E007
+:10E0D00001688A688968520E02F00702490F02AC93
+:10E0E000655CA45C1DF801101DF80220ED00E40041
+:10E0F00095FBF1F194FBF2F2683041800280FFBDA4
+:10E1000000000000010101030701000008040204EF
+:10E11000080101017047000001484068704700BFD6
+:10E12000681000200249016002490161704700BF88
+:10E130003DAD000865AD000880B5AFF30080024A30
+:10E1400011001820ABBEFBE72600020018B500F155
+:10E150002402507801281BD11378012B01D1022011
+:10E1600012BD536A10701C680A48044008680443D2
+:10E17000C868401E44EAC04448680443087A497AA3
+:10E1800044EA004444EA41241C600020107012BD9F
+:10E19000012012BDFFFD00E038B5040001D10120CF
+:10E1A00032BD2168DFF8FC02814204F1240500F051
+:10E1B00042F8022068700A68A0686FF30E120243EA
+:10E1C000E06802432069024360690243A069024398
+:10E1D000E0690243206A02430A60204600F039F9F0
+:10E1E000A068B0F5804F04BF00216160696A2079A2
+:10E1F00000F014F838B1052805D2204600F043F9A4
+:10E2000000F012F803E0002028636863A863002090
+:10E21000A861012068700020287032BD0860A96ADA
+:10E22000E86A486060687047296B00200860696B85
+:10E23000A86B486070470AD2DFF86C0242181423BA
+:10E24000B2FBF3F292002A62DFF8600209E0DFF825
+:10E25000600242181423B2FBF3F292002A62DFF844
+:10E260005402E8617047F8B5044604F1240600251D
+:10E270003078012801D10220F2BD01273770707873
+:10E2800001282FD102277770B561206807687F08C1
+:10E290007F000760204600F0C0F82168F06820B1D8
+:10E2A0000A6842F00E020A6008E0086820F00400E4
+:10E2B00008602068016841F00A010160706A016825
+:10E2C000CA0303D5026842F480720260306B18B151
+:10E2D000016841F4807101602068026842F0010227
+:10E2E000026001E0357002252846F2BD38B500F124
+:10E2F000240200245178022903D0042090610124D3
+:10E3000028E001680B6823F00E030B6001680D68BC
+:10E310006D086D000D60516A0B6823F480730B600B
+:10E32000012192F82030D56903F01C0399406960FF
+:10E33000936AD16A5960116B31B10B6823F4807311
+:10E340000B60536B916B59600121517014705169CE
+:10E3500001B18847204632BDF8B500F124010423FD
+:10E36000CA6914680268156891F8206006F01C06F6
+:10E3700003FA06F73C4210D06F070ED51468A506C5
+:10E3800003D4156825F00405156000F03DF8C96850
+:10E39000002938D0BDE8F4400847022303FA06F705
+:10E3A0003C4213D0AF0711D51468A50605D41568F3
+:10E3B00025F00A05156001224A7000F025F80022B8
+:10E3C0000A708968F9B1BDE8F4400847082303FAE8
+:10E3D00006F6344217D02B0715D5136823F00E0329
+:10E3E0001360012291F82030CC6903F01C039A409D
+:10E3F000626001228A614A7000220A70096911B1C3
+:10E40000BDE8F4400847F1BD91F82020CC6902F046
+:10E410001C02934063607047000078B5C56C046DC2
+:10E420006C60446D14B1846DC56D6560012590F814
+:10E430004440066C04F01C04A540756004686360E9
+:10E440008068102802D1A260E16071BDA160E26025
+:10E4500071BD416C0268134B89089A4234BF164B58
+:10E46000164B03EB8101816402F0FF02083A14218C
+:10E47000B2FBF1F1124AC26401F01C01012202FA5E
+:10E4800001F10165704701790E4A02EB8102426594
+:10E49000491E0D4A826501F0030101228A40C265CE
+:10E4A0007047000008040240F8FFFDBF0000024072
+:10E4B000F8FBFDBF00040240000802401C080240B7
+:10E4C00080080240FC080240400902408A60FF21A7
+:10E4D00002685162012180F82110002180F820108B
+:10E4E0000020704790F82010012901D102207047C8
+:10E4F000012280F82020022180F82110CA21026820
+:10E50000516253210368596201688A6842F020020F
+:10E51000FFF7DCBF3249002008604FF4E0223148A9
+:10E52000016841F4700101604FF0B041086840F0AB
+:10E53000010008608A602C480A6802402B480A6083
+:10E54000036823F0050303604268520852004260EA
+:10E5500000222748C8600861086820F4802008600D
+:10E560008A6170474FF0B0410FF2D4000A68C2F3DD
+:10E57000031250F822008A6802F00C02042A04D028
+:10E58000082A04D00C2A04D01CE01A481AE01A48C1
+:10E5900018E0CA68CB68C3F3021302F003025B1CE5
+:10E5A000022A08BF134802D0032A08BF1248B0FB52
+:10E5B000F3F2C868CB68C0F306205B0F42435B1CD4
+:10E5C000B2FBF3F00D4A0FF238031060886811684F
+:10E5D000C0F3031053F82000B1FBF0F01060704757
+:10E5E00008ED00E088ED00E0FBFEF6FA940000582C
+:10E5F000001004220024F4000048E80180100020EC
+:10E600000100000003000000050000000100000000
+:10E6100001000000060000000A00000020000000C9
+:10E6200002000000040000000800000010000000CC
+:10E630004000000080000000000100000002000017
+:10E64000A0860100400D0300801A060000350C0072
+:10E6500040420F0080841E0000093D0000127A0035
+:10E660000024F40000366E010048E801006CDC0272
+:10E67000000000000000000000000000000000009A
+:10E68000DFF80800006800F4C0607047000400581C
+:10E69000704770477047704710B50446AFF300806D
+:10E6A000204600F005F80446AFF30080204610BD78
+:10E6B0007CB500F10F06F608F600B04240D2082EF5
+:10E6C00004D2082602E0083000F047F8DFF80451D1
+:10E6D0002C68210005D1002007E00268B24221D257
+:10E6E000011D08680028F8D12068291D0A688242A7
+:10E6F00022D01368B34238BF111DF7D312E093192B
+:10E700000B60801B54685C600B68186016600968B9
+:10E7100000291DBF48680028081D0020286002F15C
+:10E72000080076BD61B10A681068A0F10803B34221
+:10E73000E5D250680860EAE700F04EF80028C2D140
+:10E74000002076BD10B5040006D0AFF3008020464F
+:10E7500000F003F8AFF3008010BD002800D170472F
+:10E7600050B4A0F108021368072B2BD913F0070F40
+:10E7700028D1184C616809B18A4202D251606260A6
+:10E7800013E0486800B3904238BF0146F9D31BE05C
+:10E79000964203D11B180B600A4606E0486810B188
+:10E7A000134498420ED350604A60506850B11368C9
+:10E7B000D118814206D1002121600168CB18136075
+:10E7C0004068506050BC704708680E18B242DFD2F3
+:10E7D00050BC7047781F00200749086808B1002026
+:10E7E00070470648C008C00008600549C908C9004C
+:10E7F000091A0160704700BF9C1F0020B72F00203E
+:10E80000B03300202DE9F04107468846387810F0F3
+:10E81000030F16461D4633D0384600F099F878BBF2
+:10E82000B8F1000F1CBFD8E900018619012D2ED1C7
+:10E830003888C10415D5396A07F14402384600F01A
+:10E84000A3F83A6B044602B93A69F968384600F011
+:10E850009BF8361B341A7A69F968384600F094F848
+:10E86000261A1EB94DB916F1010F09D097F9030008
+:10E870002A46314600F08EF8064616F1010F09D1FE
+:10E880002320AFF300804FF0FF30BDE8F081022D70
+:10E89000E8D1EBE7388810F4405F0ED07868F86074
+:10E8A00038617861B8617868F86107F144003862CE
+:10E8B00007F13000786200203863B8F1000F05D00E
+:10E8C000D8E9020107F13402C2E9000139884CF6A7
+:10E8D000FF60014039800020BDE8F08170B5054639
+:10E8E000AFF300802888810415D56E680024EA689B
+:10E8F00095F903003146914212D2521AF7F789FC7A
+:10E9000010F1010F1CBF00283618F0D10FE04DF6B2
+:10E91000FF70014029802846AFF30080002070BDC1
+:10E9200000220021F7F775FC10F1010F00D101243E
+:10E930006868E860A861E861002C2988E7D041F4A4
+:10E94000007129802846AFF300804FF0FF3070BD82
+:10E95000F8B5A0B9AFF3008000250A4E08244FF0A7
+:10E96000FF37306820B1FFF7B9FF002848BF3D46A8
+:10E97000361D641EF5D1AFF300802846F2BDBDE818
+:10E98000F240ABE7DC110020914234BF511A002164
+:10E99000084670473EB504000D00012A02D100F080
+:10E9A00063F807E0022A07D100940020019069462D
+:10E9B0000C20ABBE2D1801E0002A0CD1009401956B
+:10E9C00069460A20ABBE002805D10022210028009C
+:10E9D00000F027F801E00020C04303B030BD000084
+:10E9E00010B4314A002113461C6884421EBF491CE2
+:10E9F0009C6884421EBF491C1C69844209D09C69E2
+:10EA0000491C844205D0491C20331029ECD310BC8A
+:10EA10007047002342F8313002EBC1014B6010BC5B
+:10EA2000704778B4204C002325462E688E421EBFC6
+:10EA30005B1CAE688E421EBF5B1C2E698E4209D0E5
+:10EA4000AE695B1C8E4205D05B1C2035102BECD3CD
+:10EA500072BC7047054604EBC303012A04BF596822
+:10EA60004D195D6072BC704710B40F4A0021134607
+:10EA70001C6884421EBF491C9C6884421EBF491CFE
+:10EA80001C6984420AD09C69491C844206D0491CF6
+:10EA900020331029ECD310BC0020704702EBC100DA
+:10EAA000406810BC70470000901C002010B5044660
+:10EAB000E068A169884251D3218849F202030B40E2
+:10EAC000022B08D008044CBF4FF400704FF4844070
+:10EAD000014321803BE001F4C042B2F5C04F06D1B2
+:10EAE000A168884203D32046FFF732FF78BB208815
+:10EAF00010F4406F02BF606804F14401884217D1EE
+:10EB00004FF40070FFF7C8FD606030B904F14400B5
+:10EB10006060E060401CA0600AE0218841F0400194
+:10EB20002180E060606100F500726068A260E061D1
+:10EB300060682061A068A061207841070AD50222A0
+:10EB40000021204600F00CF810F1010F02D14FF027
+:10EB5000FF3010BD208840F4C0402080002010BD50
+:10EB600070B504460D461646AFF3008033462A467C
+:10EB700000212046FFF746FE05462046AFF3008001
+:10EB8000284670BD38B504000ED0207810F0030F71
+:10EB900003D094F90300002809D5AFF30080204684
+:10EBA00000F030F8AFF300804FF0FF3032BD204668
+:10EBB000FFF7CEFE0546AFF300802078410644BF44
+:10EBC000606800F05DF80020606094F9030002289E
+:10EBD00004D900F057F808B14FF0FF35E06B48B1A9
+:10EBE00000F05CF808B14FF0FF35E06B00F048F83A
+:10EBF0000020E063204600F005F8AFF300802846CF
+:10EC000032BD000001780A0626D51C4A136800218F
+:10EC1000834203D1002342F821301BE053680121D5
+:10EC200083421EBF022193688342F3D0D36803213D
+:10EC300083421EBF042113698342EBD0536905212F
+:10EC400083421EBF0621936983421EBF0721D369F9
+:10EC50008342DFD000F014B8002101804FF0FF3173
+:10EC6000C17000F144014160C16001614161816195
+:10EC7000C161016200F1300141627047DC11002086
+:10EC8000FFF760BD1CB50200009269460220ABBED2
+:10EC900004001000FFF7A4FE200016BDE0B50090B0
+:10ECA000F7F75CFC019069460E20ABBE03B000BDD7
+:10ECB0007047FEE7FEE7FEE7FEE7704770477047E4
+:10ECC00000F024B80548FFF747BB0548FEF7CBBA6C
+:10ECD0000448FEF7C8BA0448FFF73EBB101D0020E9
+:10ECE000841B0020F81A0020701D00201020FCF763
+:10ECF000CBB90120FCF7C8B90220FCF7C5B9FCF775
+:10ED0000B4BCFDF707B9FDF7DBB800000248416865
+:10ED100002788918416070476810002038B50C46A9
+:10ED2000C5B22046AFF30080E068A169884204D3F1
+:10ED30002046FFF7BBFE00280FD4E068401CE060CF
+:10ED400000F8015D2088010503D440050BD50A2D8C
+:10ED500009D12046FFF7FCFD28B12046AFF3008023
+:10ED60004FF0FF3032BD2046AFF30080284632BD61
+:10ED700019E050F8042BD30744BFA9F101039A18F6
+:10ED8000091F0023042942F8043BF9D25FEA817C81
+:10ED9000134604D54FF0000CA2F800C09B1CC90715
+:10EDA00044BF0021197050F8041B0029E1D17047BD
+:10EDB00038B50D4D0824286800281CBF017811F0D3
+:10EDC000030F05D090F90310002958BFFFF7DAFEB2
+:10EDD0002D1D641EEFD1BDE83840002200214FF008
+:10EDE000FF30F7F716BA00BFDC11002010B5074955
+:10EDF00079441831064C7C44163404E00A68081D36
+:10EE0000114488470146A142F8D110BD2C000000F2
+:10EE1000600000004EF68851CEF20001086840F410
+:10EE200070000860BFF34F8FBFF36F8F4FF000701B
+:10EE3000E1EE100A7047000039FFFFFFB00D00003F
+:10EE4000FC110020800800003000032000000000BA
+:10EE5000CB72FFFF8C0100009A010000040000202B
+:10EE6000BB72FFFF490200000600000028000320DB
+:10EE70000000000000000000000000000000000092
+:10EE80000100000002000000030000000400000078
+:10EE900000F00DF8002801D0FFF7A8FFAFF30080C5
+:10EEA0000020AFF30080FCF716F900F002F8012013
+:10EEB000704700F001B800000746FFF779FF3846B9
+:10EEC000FFF73AF9FBE738B504460D46284600F04F
+:10EED00005F8A84218BF0024204632BD0149FFF7BB
+:10EEE0001DBF00BF4C11002001488047014800476A
+:10EEF00015E50008F9EE0008AFF30080FFF78AFF80
+:10EF0000FFF7C6FF00002E004300FFF7FEBFFFF72C
+:10EF1000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF725
+:10EF2000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF715
+:10EF3000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF705
+:10EF4000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7F5
+:10EF5000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7E5
+:10EF6000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7D5
+:10EF7000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7C5
+:10EF8000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7B5
+:10EF9000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7A5
+:10EFA000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF795
+:10EFB000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF785
+:10EFC000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF775
+:10EFD000FEBFFFF7FEBFFFF7FEBFFFF7FEBF00005B
+:10EFE000F002030DFF010001F3FF010001F1FF0139
+:10EFF000F1FF01F1FF01F1FF01F1FF01F1FF01F16B
+:10F00000FF01F1FF01F1FF01F1FF01F1FF01F1FF4C
+:10F0100001F1FF01F1FF01F1350152FF01AD3F1098
+:10F020006D4C102210085003080048000C04F00535
+:10F0300007093D0004EF000804614CF200061411BA
+:10F0400047110C2158FC021784100020AB1013A9A3
+:10F05000627E11014397623C210110070104000008
+:10F06000481100204904524804211BA108F311341F
+:10F070001164100702040101201E002070045220B8
+:10F080000421346108129044F2137C4840030802C2
+:10F0900002D01D40210821042134610812D844F215
+:10F0A00012C448120424124C04F206942C5200019B
+:040000050800EEF908
+:00000001FF
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_common.h
new file mode 100644
index 000000000..836f40dcf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_common.h
@@ -0,0 +1,115 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_conf.h
new file mode 100644
index 000000000..5cc29aa8f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_conf.h
@@ -0,0 +1,575 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+
+/**< generic parameters ******************************************************/
+
+/**
+ * Define Tx Power
+ */
+#define CFG_TX_POWER (0x18) /**< 0dbm */
+
+/**
+ * Define Advertising parameters
+ */
+#define CFG_ADV_BD_ADDRESS (0x7257acd87a6c)
+#define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */
+#define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xa0) /**< 100ms */
+#define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */
+#define CFG_LP_CONN_ADV_INTERVAL_MAX (0xfa0) /**< 2.5s */
+
+/**
+ * Define IO Authentication
+ */
+#define CFG_BONDING_MODE (BONDING) /* BONDING-1 NO_BONDING-0*/
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+
+/**
+ * Define IO capabilities
+ */
+#define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00)
+#define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01)
+#define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02)
+#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
+#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
+
+//#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_YES_NO /* for iOS Device */ /* need to press YES on iOS device side */
+//#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY /* for iOS Device */ /* need to input password (111111) on iOS device side */
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT /* compatible for Android Device *//* need to press Pairing on iOS device side */
+
+/**
+ * Define MITM modes
+ */
+#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
+#define CFG_MITM_PROTECTION_REQUIRED (0x01)
+
+
+//#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED /* for iOS Device */
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_NOT_REQUIRED /* compatible for Android Device */
+
+/**
+ * Define Secure Connections Support
+ */
+#define CFG_SECURE_NOT_SUPPORTED (0x00)
+#define CFG_SECURE_OPTIONAL (0x01)
+#define CFG_SECURE_MANDATORY (0x02)
+
+#define CFG_SC_SUPPORT CFG_SECURE_OPTIONAL
+
+/**
+ * Define Keypress Notification Support
+ */
+#define CFG_KEYPRESS_NOT_SUPPORTED (0x00)
+#define CFG_KEYPRESS_SUPPORTED (0x01)
+
+#define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED
+
+/**
+ * Numeric Comparison Answers
+ */
+#define YES (0x01)
+#define NO (0x00)
+
+/**
+ * Device name configuration for Generic Access Service
+ */
+#define CFG_GAP_DEVICE_NAME "TEMPLATE"
+#define CFG_GAP_DEVICE_NAME_LENGTH (8)
+
+/**
+ *Bluetooth address types
+ */
+#define CFG_IDENTITY_ADDRESS_TYPE PUBLIC_ADDR
+
+
+/* Out-Of-Band data
+ */
+#define CFG_OOB_DATA_PRESENT OOB_AUTH_DATA_ABSENT
+
+/**
+ * Define PHY
+ */
+#define ALL_PHYS_PREFERENCE 0x00
+#define RX_2M_PREFERRED 0x02
+#define TX_2M_PREFERRED 0x02
+#define TX_1M 0x01
+#define TX_2M 0x02
+#define RX_1M 0x01
+#define RX_2M 0x02
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_IRK {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_ERK {0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21,0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21}
+
+/* USER CODE BEGIN Generic_Parameters */
+/**
+ * SMPS supply
+ * SMPS not used when Set to 0
+ * SMPS used when Set to 1
+ */
+#define CFG_USE_SMPS 1
+/* USER CODE END Generic_Parameters */
+
+/**< specific parameters */
+/*****************************************************/
+
+/**
+* AD Element - Group B Feature
+*/
+/* LSB - Second Byte */
+#define CFG_FEATURE_OTA_REBOOT (0x20)
+
+/******************************************************************************
+ * BLE Stack
+ ******************************************************************************/
+/**
+ * Maximum number of simultaneous connections that the device will support.
+ * Valid values are from 1 to 8
+ */
+#define CFG_BLE_NUM_LINK 8
+
+/**
+ * Maximum number of Services that can be stored in the GATT database.
+ * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services
+ */
+#define CFG_BLE_NUM_GATT_SERVICES 8
+
+/**
+ * Maximum number of Attributes
+ * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services)
+ * that can be stored in the GATT database.
+ * Note that certain characteristics and relative descriptors are added automatically during device initialization
+ * so this parameters should be 9 plus the number of user Attributes
+ */
+#define CFG_BLE_NUM_GATT_ATTRIBUTES 68
+
+/**
+ * Maximum supported ATT_MTU size
+ */
+#define CFG_BLE_MAX_ATT_MTU (250)
+#define CFG_BLE_MAX_ATT_MTU_TX_TIME (2112)
+
+//#define CFG_BLE_MAX_ATT_MTU (251)
+//#define CFG_BLE_MAX_ATT_MTU_TX_TIME (2120)
+
+/**
+ * Size of the storage area for Attribute values
+ * This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute:
+ * - attribute value length
+ * - 5, if UUID is 16 bit; 19, if UUID is 128 bit
+ * - 2, if server configuration descriptor is used
+ * - 2*DTM_NUM_LINK, if client configuration descriptor is used
+ * - 2, if extended properties is used
+ * The total amount of memory needed is the sum of the above quantities for each attribute.
+ */
+#define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344)
+
+/**
+ * Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
+ */
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+
+/**
+ * Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
+ */
+#define CFG_BLE_DATA_LENGTH_EXTENSION 1
+
+/**
+ * Sleep clock accuracy in Slave mode (ppm value)
+ */
+#define CFG_BLE_SLAVE_SCA 500
+
+/**
+ * Sleep clock accuracy in Master mode
+ * 0 : 251 ppm to 500 ppm
+ * 1 : 151 ppm to 250 ppm
+ * 2 : 101 ppm to 150 ppm
+ * 3 : 76 ppm to 100 ppm
+ * 4 : 51 ppm to 75 ppm
+ * 5 : 31 ppm to 50 ppm
+ * 6 : 21 ppm to 30 ppm
+ * 7 : 0 ppm to 20 ppm
+ */
+#define CFG_BLE_MASTER_SCA 0
+
+/**
+ * Source for the 32 kHz slow speed clock
+ * 1 : internal RO
+ * 0 : external crystal ( no calibration )
+ */
+#define CFG_BLE_LSE_SOURCE 0
+
+/**
+ * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_HSE_STARTUP_TIME 0x148
+
+/**
+ * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_MAX_CONN_EVENT_LENGTH ( 0xFFFFFFFF )
+
+/**
+ * Viterbi Mode
+ * 1 : enabled
+ * 0 : disabled
+ */
+#define CFG_BLE_VITERBI_MODE 1
+
+/**
+ * LL Only Mode
+ * 1 : LL Only
+ * 0 : LL + Host
+ */
+#define CFG_BLE_LL_ONLY 0
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TLBLE_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_BLE_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU 0
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 0
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+/**
+ * When set to 1, the traces are enabled in the BLE services
+ */
+#define CFG_DEBUG_BLE_TRACE 0
+
+/**
+ * Enable or Disable traces in application
+ */
+#define CFG_DEBUG_APP_TRACE 1
+
+#if (CFG_DEBUG_APP_TRACE != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+#if ( (CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0) )
+#define CFG_DEBUG_TRACE 1
+#endif
+
+#if (CFG_DEBUG_TRACE != 0)
+#undef CFG_LPM_SUPPORTED
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+#define CFG_DEBUGGER_SUPPORTED 1
+#endif
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 1
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/* USER CODE BEGIN Defines */
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 1
+
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+
+/**
+ * These are the lists of task id registered to the scheduler
+ * Each task id shall be in the range [0:31]
+ * This mechanism allows to implement a generic code in the API TL_BLE_HCI_StatusNot() to comply with
+ * the requirement that a HCI/ACI command shall never be sent if there is already one pending
+ */
+
+/**< Add in that list all tasks that may send a ACI/HCI command */
+typedef enum
+{
+ CFG_TASK_ADV_UPDATE_ID,
+ CFG_TASK_MEAS_REQ_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+/* USER CODE BEGIN CFG_Task_Id_With_HCI_Cmd_t */
+ CFG_TASK_APP_ANCS_DISCOVERY_ID,
+/* USER CODE END CFG_Task_Id_With_HCI_Cmd_t */
+ CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
+} CFG_Task_Id_With_HCI_Cmd_t;
+
+/**< Add in that list all tasks that never send a ACI/HCI command */
+typedef enum
+{
+ CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
+/* USER CODE BEGIN CFG_Task_Id_With_NO_HCI_Cmd_t */
+
+/* USER CODE END CFG_Task_Id_With_NO_HCI_Cmd_t */
+ CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
+} CFG_Task_Id_With_NO_HCI_Cmd_t;
+#define CFG_TASK_NBR CFG_LAST_TASK_ID_WITHO_NO_HCICMD
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_GAP_PROC_COMPLETE,
+ CFG_IDLEEVT_GATT_PROC_COMPLETE,
+} CFG_IdleEvt_Id_t;
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_BLE,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_debug.h
new file mode 100644
index 000000000..4224edbe0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_debug.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_debug.h
+ * Description : Header for app_debug.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_DEBUG_H
+#define __APP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPD_Init( void );
+ void APPD_EnableCPU2( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*__APP_DEBUG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_entry.h
new file mode 100644
index 000000000..77ead2384
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_entry.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief Interface to the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..5492cbb08
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_conf.h
@@ -0,0 +1,196 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for BLE
+ * middleWare.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_CHANNEL_4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_CHANNEL_4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_CHANNEL_4_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_if.h
new file mode 100644
index 000000000..385f4ea4d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_if.h
@@ -0,0 +1,251 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ uint8_t GETCHAR_UART(void);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/main.h
new file mode 100644
index 000000000..4b10d2beb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/main.h
@@ -0,0 +1,72 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.h
+ * @author MCD Application Team
+ * @brief Header for main.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "app_conf.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32wbxx_nucleo.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32_lpm_if.h
index d8e67947f..d8e67947f 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32_lpm_if.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..d5db0e33f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,359 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..12466d5e3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,79 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void DMA1_Channel4_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/utilities_conf.h
index 4dde3509a..4dde3509a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/utilities_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_debug.c
new file mode 100644
index 000000000..14ed65c22
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_debug.c
@@ -0,0 +1,399 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_debug.c
+ * Description : Debug capabilities source file for STM32WPAN Middleware
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+
+#include "app_debug.h"
+#include "utilities_common.h"
+#include "shci.h"
+#include "tl.h"
+#include "dbg_trace.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+typedef PACKED_STRUCT
+{
+ GPIO_TypeDef* port;
+ uint16_t pin;
+ uint8_t enable;
+ uint8_t reserved;
+} APPD_GpioConfig_t;
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+#define GPIO_NBR_OF_RF_SIGNALS 9
+#define GPIO_CFG_NBR_OF_FEATURES 34
+#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
+#define NBR_OF_GENERAL_CONFIG_PARAMETERS 4
+
+/**
+ * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
+ */
+#define BLE_DTB_CFG 0
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+
+#ifdef CFG_DEBUG_TRACE_UART
+#if(CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if(CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+#endif
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * It provides timing information on the CPU2 activity.
+ * All configuration of (port, pin) is supported for each features and can be selected by the user
+ * depending on the availability
+ */
+static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] =
+{
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */
+/* From v1.1.1 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */
+/* From v1.2.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */
+/* From v1.3.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */
+/* From v1.4.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */
+};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * This table is relevant only for BLE
+ * It provides timing information on BLE RF activity.
+ * New signals may be allocated at any location when requested by ST
+ * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed
+ */
+#if( BLE_DTB_CFG == 7)
+static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
+{
+ { GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */
+ { GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */
+ { GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */
+ { GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */
+ { GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */
+ { GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */
+ { GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */
+ { GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */
+ { GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
+};
+#endif
+/* USER CODE END PV */
+
+/* Global variables ----------------------------------------------------------*/
+/* USER CODE BEGIN GV */
+/* USER CODE END GV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+static void APPD_SetCPU2GpioConfig( void );
+static void APPD_BleDtbCfg( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPD_Init( void )
+{
+/* USER CODE BEGIN APPD_Init */
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+ HAL_DBGMCU_EnableDBGStopMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ APPD_SetCPU2GpioConfig( );
+ APPD_BleDtbCfg( );
+
+/* USER CODE END APPD_Init */
+ return;
+}
+
+void APPD_EnableCPU2( void )
+{
+/* USER CODE BEGIN APPD_EnableCPU2 */
+ SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
+ {
+ {{0,0,0}}, /**< Does not need to be initialized */
+ {(uint8_t *)aGpioConfigList,
+ (uint8_t *)&APPD_TracesConfig,
+ (uint8_t *)&APPD_GeneralConfig,
+ GPIO_CFG_NBR_OF_FEATURES,
+ NBR_OF_TRACES_CONFIG_PARAMETERS,
+ NBR_OF_GENERAL_CONFIG_PARAMETERS}
+ };
+
+ /**< Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /** GPIO DEBUG Initialization */
+ SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+
+/* USER CODE END APPD_EnableCPU2 */
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void APPD_SetCPU2GpioConfig( void )
+{
+/* USER CODE BEGIN APPD_SetCPU2GpioConfig */
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+ uint16_t gpioc_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+ gpioc_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++)
+ {
+ if( aGpioConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aGpioConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOC:
+ gpioc_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpioc_pin_list != 0)
+ {
+ gpio_config.Pin = gpioc_pin_list;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &gpio_config);
+ HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
+ }
+
+/* USER CODE END APPD_SetCPU2GpioConfig */
+ return;
+}
+
+static void APPD_BleDtbCfg( void )
+{
+/* USER CODE BEGIN APPD_BleDtbCfg */
+#if (BLE_DTB_CFG != 0)
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++)
+ {
+ if( aRfConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aRfConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_AF_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ gpio_config.Alternate = GPIO_AF6_RF_DTB7;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ }
+#endif
+
+/* USER CODE END APPD_BleDtbCfg */
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+*************************************************************/
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+/* USER CODE BEGIN DbgOutputInit */
+#ifdef CFG_DEBUG_TRACE_UART
+if (CFG_DEBUG_TRACE_UART == hw_lpuart1)
+{
+#if(CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+}
+else if (CFG_DEBUG_TRACE_UART == hw_uart1)
+{
+#if(CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+#endif
+}
+#endif
+
+/* USER CODE END DbgOutputInit */
+ return;
+}
+
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+/* USER CODE END DbgOutputTraces */
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+/* USER CODE END DbgOutputTraces */
+ return;
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_entry.c
new file mode 100644
index 000000000..a70641314
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_entry.c
@@ -0,0 +1,309 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.c
+ * @author MCD Application Team
+ * @brief Entry point of the Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_ble.h"
+#include "ble.h"
+#include "tl.h"
+#include "stm32_seq.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "app_debug.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+static void APPE_SysUserEvtRx( void * pPayload );
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ APPD_Init();
+
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ Led_Init();
+
+ Button_Init();
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ UNUSED(pPayload);
+ /* Traces channel initialization */
+ APPD_EnableCPU2( );
+
+ APP_BLE_Init( );
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+ BSP_LED_On(LED_GREEN);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ APP_BLE_Key_Button1_Action();
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_BLE_Key_Button2_Action();
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_BLE_Key_Button3_Action();
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..e0e4fcb5d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_uart.c
new file mode 100644
index 000000000..ce910235c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/main.c
new file mode 100644
index 000000000..cea2fdfb2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/main.c
@@ -0,0 +1,634 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief BLE application with BLE core
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Stack_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+#include "app_common.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+
+RTC_HandleTypeDef hrtc;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+/* USER CODE BEGIN PFP */
+void PeriphClock_Config(void);
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Reset_BackupDomain( void );
+static void Init_Exti( void );
+static void Config_HSE(void);
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+ Reset_Device();
+ Config_HSE();
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Init code for STM32_WPAN */
+ APPE_Init();
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while(1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ HAL_PWR_EnableBkUpAccess();
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+#if (CFG_USE_SMPS != 0)
+ /**
+ * Configure and enable SMPS
+ *
+ * The SMPS configuration is not yet supported by CubeMx
+ */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#endif
+
+ /* USER CODE END Smps */
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN LPUART1_Init 0 */
+
+ /* USER CODE END LPUART1_Init 0 */
+
+ /* USER CODE BEGIN LPUART1_Init 1 */
+
+ /* USER CODE END LPUART1_Init 1 */
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN LPUART1_Init 2 */
+
+ /* USER CODE END LPUART1_Init 2 */
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART1_Init 0 */
+
+ /* USER CODE END USART1_Init 0 */
+
+ /* USER CODE BEGIN USART1_Init 1 */
+
+ /* USER CODE END USART1_Init 1 */
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART1_Init 2 */
+
+ /* USER CODE END USART1_Init 2 */
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+ /* USER CODE BEGIN RF_Init 0 */
+
+ /* USER CODE END RF_Init 0 */
+
+ /* USER CODE BEGIN RF_Init 1 */
+
+ /* USER CODE END RF_Init 1 */
+ /* USER CODE BEGIN RF_Init 2 */
+
+ /* USER CODE END RF_Init 2 */
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+ /* USER CODE BEGIN RTC_Init 0 */
+
+ /* USER CODE END RTC_Init 0 */
+
+ /* USER CODE BEGIN RTC_Init 1 */
+
+ /* USER CODE END RTC_Init 1 */
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ __HAL_RCC_DMA2_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+/* USER CODE END 4 */
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32_lpm_if.c
index 1418e0a36..1418e0a36 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32_lpm_if.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..fc4e64f31
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,331 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ PA6 ------> LPUART1_CTS
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_DMAMUX1_CH1_EVT;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_NO_EVENT;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = DISABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_lpuart1_tx, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ PA6 ------> LPUART1_CTS
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+ HAL_RTCEx_EnableBypassShadow(hrtc);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..d469f29ab
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,315 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+extern UART_HandleTypeDef hlpuart1;
+extern UART_HandleTypeDef huart1;
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles DMA1 channel4 global interrupt.
+ */
+void DMA1_Channel4_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel4_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA2 channel4 global interrupt.
+ */
+void DMA2_Channel4_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 0 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewd
new file mode 100644
index 000000000..c286722c0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_HeartRate_ANCS</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state />
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state />
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state />
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state />
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>7.10.3.6927</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.1.14181</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state />
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state />
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state />
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state />
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state />
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state />
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state />
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state />
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state />
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state>72.0</state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state />
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state />
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>7</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>72.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state />
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state />
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewp
new file mode 100644
index 000000000..aa5d7a3ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/BLE_HeartRate_ANCS.ewp
@@ -0,0 +1,1260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_HeartRate_ANCS</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>BLE_HeartRate_ANCS/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>BLE_HeartRate_ANCS/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>BLE_HeartRate_ANCS/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/ble</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/ble/core</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>BLE_HeartRate_ANCS.hex</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data></data>
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>BLE_HeartRate_ANCS.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data></data>
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_debug.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\ancs_client_app.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\dis_app.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\hrs_app.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_ipcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template\osal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\dis.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\hrs.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gatt_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hal_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hci_le.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_l2cap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+</project>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/Project.eww
new file mode 100644
index 000000000..549515db9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_HeartRate_ANCS.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/startup_stm32wb55xx_cm4.s
index 1f886ff59..1f886ff59 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/startup_stm32wb55xx_cm4.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/startup_stm32wb55xx_cm4.s
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..f1f2de416
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2}; \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.c
new file mode 100644
index 000000000..fe9127b34
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.c
@@ -0,0 +1,2236 @@
+/**
+ ******************************************************************************
+ * @file ancs_client_app.c
+ * @author MCD Application Team
+ * @brief ANCS client Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "dbg_trace.h"
+
+#include "ble.h"
+#include "app_ble.h"
+#include "ancs_client_app.h"
+
+#include "stm32_seq.h"
+
+/* Private defines -----------------------------------------------------------*/
+
+#define GET_ACTION_ID_FROM_UART 0
+
+/* MAX Number of entry in the context lists */
+#define MAX_NMB_NOTIFY 128
+#define MAX_DISPLAY_NAME_LEN 128
+#define MAX_DATA_LIST_LEN 0xFF
+#define MAX_DATA_LEN 0x0128
+
+/**
+ * The default GAP command timeout is set to 30s
+ */
+#define GAP_DEFAULT_TIMEOUT (30000)
+
+/**
+ * The default GATT command timeout is set to 30s
+ */
+#define GATT_DEFAULT_TIMEOUT (30000)
+
+
+/* Invalid Notify Entry */
+#define INVALID_NOTIFY_ENTRY 0xFFFF
+
+#define UNPACK_2_BYTE_PARAMETER(ptr) \
+ (uint16_t)((uint16_t)(*((uint8_t *)ptr))) | \
+ (uint16_t)((((uint16_t)(*((uint8_t *)ptr + 1))) << 8))
+
+/* copy UUID to tab */
+#define COPY_UUID_128(uuid_struct, uuid_15, uuid_14, uuid_13, uuid_12, uuid_11, uuid_10, uuid_9, uuid_8, uuid_7, uuid_6, uuid_5, uuid_4, uuid_3, uuid_2, uuid_1, uuid_0) \
+do {\
+ uuid_struct[0] = uuid_0; uuid_struct[1] = uuid_1; uuid_struct[2] = uuid_2; uuid_struct[3] = uuid_3; \
+ uuid_struct[4] = uuid_4; uuid_struct[5] = uuid_5; uuid_struct[6] = uuid_6; uuid_struct[7] = uuid_7; \
+ uuid_struct[8] = uuid_8; uuid_struct[9] = uuid_9; uuid_struct[10] = uuid_10; uuid_struct[11] = uuid_11; \
+ uuid_struct[12] = uuid_12; uuid_struct[13] = uuid_13; uuid_struct[14] = uuid_14; uuid_struct[15] = uuid_15; \
+}while(0)
+
+/* UUIDs list for ANCS service and characteristics*/
+#define COPY_ANCS_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x79, 0x05, 0xF4, 0x31, 0xB5, 0xCE, 0x4E, 0x99, 0xA4, 0x0F, 0x4B, 0x1E, 0x12, 0x2D, 0x00, 0xD0)
+#define COPY_ANCS_NOTIFICATION_SOURCE_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x9F, 0xBF, 0x12, 0x0D, 0x63, 0x01, 0x42, 0xD9, 0x8C, 0x58, 0x25, 0xE6, 0x99, 0xA2, 0x1D, 0xBD)
+#define COPY_ANCS_DATA_SOURCE_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x22, 0xEA, 0xC6, 0xE9, 0x24, 0xD6, 0x4B, 0xB5, 0xBE, 0x44, 0xB3, 0x6A, 0xCE, 0x7C, 0x7B, 0xFB)
+#define COPY_ANCS_CONTROL_POINT_UUID(uuid_struct) COPY_UUID_128(uuid_struct, 0x69, 0xD1, 0xD8, 0xF3, 0x45, 0xE1, 0x49, 0xA8, 0x98, 0x21, 0x9B, 0xBD, 0xFD, 0xAA, 0xD9, 0xD9)
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ GAP_PROC_TERMINATE_CONNECTION,
+ GAP_PROC_SLAVE_SECURITY_REQ,
+ GAP_PROC_PASS_KEY_RESPONSE,
+ GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM,
+ GAP_PROC_ALLOW_REBOND,
+} GapProcId_t;
+
+typedef enum
+{
+ GATT_PROC_MTU_UPDATE,
+ GATT_PROC_DISC_ANCS_SERVICE,
+ GATT_PROC_DISC_ALL_PRIMARY_SERVICES,
+ GATT_PROC_DISC_ALL_CHARS,
+ GATT_PROC_DISC_ALL_DESCS,
+ GATT_PROC_ENABLE_ALL_NOTIFICATIONS,
+} GattProcId_t;
+
+typedef enum
+{
+ ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE,
+ ANCS_PROC_GET_APP_ATTRIBUTE,
+ ANCS_PROC_PERFORM_NOTIFICATION_ACTION,
+} AncsProcId_t;
+
+/**
+ * structure of fields for GATT notication source characteristic
+ */
+typedef struct notifyListS {
+ uint8_t used; /*flag to indicate notification processed or not*/
+ EventID evID;
+ EventFlags evFlag;
+ CategoryID catID;
+ uint8_t catCount;
+ uint32_t notifUID;
+} notifyList_type;
+
+/**
+ * structure of ANCS context (containing all needed settings: events state, handlers, inputs...)
+ */
+typedef struct ancs_contextS {
+
+ ANCS_ProfileState state;
+ uint16_t connection_handle;
+
+ uint8_t Peer_Bonded;
+ uint8_t Security_Mode;
+ uint8_t Security_Level;
+ uint8_t Peer_Address_Type;
+ uint8_t Peer_Address[6];
+
+ uint8_t appDisplayName_len;
+ uint8_t appDisplayName[MAX_DISPLAY_NAME_LEN];
+ uint8_t AppIdentifierLength;
+ uint8_t AppIdentifier[MAX_DISPLAY_NAME_LEN];
+ uint8_t list[MAX_DATA_LIST_LEN];
+
+ notifyList_type notifyList[MAX_NMB_NOTIFY];
+
+ uint16_t notifyEntry; /* index of input notification */
+ uint8_t notifyShowed; /* flag to indicate notification has already been displayed */
+ uint32_t startTime;
+ uint8_t genericFlag; /* action done after notification */
+
+ uint16_t ALLServiceStartHandle;
+ uint16_t ALLServiceEndHandle;
+
+ uint16_t GAPServiceStartHandle;
+ uint16_t GAPServiceEndHandle;
+
+ uint16_t GAPCentralAddressResolutionCharStartHdle;
+ uint16_t GAPCentralAddressResolutionCharValueHdle;
+ uint16_t GAPCentralAddressResolutionCharDescHdle;
+ uint16_t GAPCentralAddressResolutionCharEndHdle;
+
+ uint16_t GATTServiceStartHandle;
+ uint16_t GATTServiceEndHandle;
+
+ uint16_t ServiceChangedCharStartHdle;
+ uint16_t ServiceChangedCharValueHdle;
+ uint16_t ServiceChangedCharDescHdle;
+ uint16_t ServiceChangedCharEndHdle;
+
+ uint16_t ANCSServiceStartHandle;
+ uint16_t ANCSServiceEndHandle;
+
+ uint16_t ANCSNotificationSourceCharStartHdle;
+ uint16_t ANCSControlPointCharStartHdle;
+ uint16_t ANCSDataSourceCharStartHdle;
+
+ uint16_t ANCSNotificationSourceCharValueHdle;
+ uint16_t ANCSControlPointCharValueHdle;
+ uint16_t ANCSDataSourceCharValueHdle;
+
+ uint16_t ANCSNotificationSourceCharDescHdle;
+ uint16_t ANCSControlPointCharDescHdle;
+ uint16_t ANCSDataSourceCharDescHdle;
+
+} ancs_context_type;
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static ancs_context_type ancs_context;
+
+/* Global variables ----------------------------------------------------------*/
+uint16_t gCharUUID=0,gCharStartHandle=0,gCharValueHandle=0,gCharDescriptorHandle=0;
+
+#if (GET_ACTION_ID_FROM_UART == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+/* Private function prototypes -----------------------------------------------*/
+static void gap_cmd_resp_wait(uint32_t timeout);
+static void gap_cmd_resp_release(uint32_t flag);
+static void GapProcReq(GapProcId_t GapProcId);
+static void gatt_cmd_resp_wait(uint32_t timeout);
+static void gatt_cmd_resp_release(uint32_t flag);
+static void GattProcReq(GattProcId_t GattProcId);
+static void GattParseServicesByUUID(aci_att_find_by_type_value_resp_event_rp0 *pr);
+static void GattParseServices(aci_att_read_by_group_type_resp_event_rp0 *pr);
+static void GattParseChars(aci_att_read_by_type_resp_event_rp0 *pr);
+static void GattParseDescs(aci_att_find_info_resp_event_rp0 *pr);
+static void GattParseNotification(aci_gatt_notification_event_rp0 *pr);
+
+#if (GET_ACTION_ID_FROM_UART == 1)
+static uint8_t ANCS_App_Get_Char(void);
+static ActionID ANCS_App_Get_ActionID(void)
+#endif
+static void ANCS_App_Update_Service( void );
+static SVCCTL_EvtAckStatus_t ANCS_Client_Event_Handler( void *Event );
+
+void ANCS_Notification_Check(EventFlags EventFlagMask);
+void ANCS_Client_Reset( void );
+static void AncsProcReq(AncsProcId_t AncsProcId);
+
+
+/* Functions Definition ------------------------------------------------------*/
+/* Private functions ----------------------------------------------------------*/
+/**
+ * Display Event ID notified in ANCS notification source characteristic
+ */
+static void ANCS_Show_EventID(EventID evID)
+{
+ switch(evID) {
+ case EventIDNotificationAdded:
+ printf("** EventID: Added\r\n");
+ break;
+ case EventIDNotificationModified:
+ printf("** EventID: Modified\r\n");
+ break;
+ case EventIDNotificationRemoved:
+ printf("** EventID: Removed\r\n");
+ break;
+ }
+}
+
+/**
+ * Display Event Flag notified in ANCS notification source characteristic
+ */
+static void ANCS_Show_EventFlag(EventFlags evFlag)
+{
+ switch (evFlag) {
+ case EventFlagSilent:
+ printf("** EventFlag: Silent\r\n");
+ break;
+ case EventFlagImportant:
+ printf("** EventFlag: Important\r\n");
+ break;
+ case EventFlagPreExisting:
+ printf("** EventFlag: Pre Existing\r\n");
+ break;
+ case EventFlagPositiveAction:
+ printf("** EventFlag: Positive Action\r\n");
+ break;
+ case EventFlagNegativeAction:
+ printf("** EventFlag: Negative Action\r\n");
+ break;
+ }
+
+ printf("** EventFlags:");
+ if ((evFlag & EventFlagSilent) == EventFlagSilent) printf(" Silent");
+ if ((evFlag & EventFlagImportant) == EventFlagImportant) printf(" Important");
+ if ((evFlag & EventFlagPreExisting) == EventFlagPreExisting) printf(" PreExisting");
+ if ((evFlag & EventFlagPositiveAction) == EventFlagPositiveAction) printf(" PositiveAction");
+ if ((evFlag & EventFlagNegativeAction) == EventFlagNegativeAction) printf(" NegativeAction");
+ printf("\n\r");
+
+}
+
+/**
+ * Display CategoryID notified in ANCS notification source characteristic
+ */
+static void ANCS_Show_CategoryID(CategoryID catID)
+{
+ switch (catID) {
+ case CategoryIDOther:
+ printf("** CategoryID: Other\r\n");
+ break;
+ case CategoryIDIncomingCall:
+ printf("** CategoryID: Incoming Call\r\n");
+ break;
+ case CategoryIDMissedCall:
+ printf("** CategoryID: Missed Call\r\n");
+ break;
+ case CategoryIDVoicemail:
+ printf("** CategoryID: Voice Mail\r\n");
+ break;
+ case CategoryIDSocial:
+ printf("** CategoryID: Social\r\n");
+ break;
+ case CategoryIDSchedule:
+ printf("** CategoryID: Schedule\r\n");
+ break;
+ case CategoryIDEmail:
+ printf("** CategoryID: Email\r\n");
+ break;
+ case CategoryIDNews:
+ printf("** CategoryID: News\r\n");
+ break;
+ case CategoryIDHealthAndFitness:
+ printf("** CategoryID: Healt and Fitness\r\n");
+ break;
+ case CategoryIDBusinessAndFinance:
+ printf("** CategoryID: Business and Finance\r\n");
+ break;
+ case CategoryIDLocation:
+ printf("** CategoryID: Location\r\n");
+ break;
+ case CategoryIDEntertainment:
+ printf("** CategoryID: Entertainment\r\n");
+ break;
+ }
+}
+
+/**
+ * Display Notification AttributeID for Get Notification Attributes command from NC
+ */
+static void ANCS_Show_Attr(NotificationAttributeID attrID)
+{
+ switch (attrID) {
+ case NotificationAttributeIDAppIdentifier:
+ printf("** AppIdentifier: ");
+ break;
+ case NotificationAttributeIDTitle:
+ printf("** Title: ");
+ break;
+ case NotificationAttributeIDSubtitle:
+ printf("** SubTitle: ");
+ break;
+ case NotificationAttributeIDMessage:
+ printf("** Message: ");
+ break;
+ case NotificationAttributeIDMessageSize:
+ printf("** MessageSize: ");
+ break;
+ case NotificationAttributeIDDate:
+ printf("** Date: ");
+ break;
+ case NotificationAttributeIDPositiveActionLabel:
+ printf("** PositiveActionLabel: ");
+ break;
+ case NotificationAttributeIDNegativeActionLabel:
+ printf("** NegativeActionLabel: ");
+ break;
+ }
+}
+
+/**
+ * Display App AttributeID used in Get App Attributes command from NC
+ */
+static void ANCS_Show_AppAttr(AppAttributeID appAttrID)
+{
+ printf("\r\n*************** App Attribute Infomation Received **********************\r\n");
+ switch (appAttrID) {
+ case AppAttributeIDDisplayName:
+ printf("** DisplayName: ");
+ break;
+ }
+}
+
+/**
+ * Display different fields for GATT notication source characteristic received
+ */
+static void ANCS_Show_Notification(uint16_t index)
+{
+ printf("\r\n*************** Data Source Detail Infomation Received **********************\r\n");
+ ANCS_Show_EventID((EventID)ancs_context.notifyList[index].evID);
+ ANCS_Show_EventFlag((EventFlags)ancs_context.notifyList[index].evFlag);
+ ANCS_Show_CategoryID((CategoryID)ancs_context.notifyList[index].catID);
+ printf("** CategoryCount: %d\r\n", ancs_context.notifyList[index].catCount);
+ printf("** NotificationUID: 0x%08x\r\n", (int)ancs_context.notifyList[index].notifUID);
+}
+
+/**
+ * create Get Notification Attributes command to NP from UID notification and action flags inputs
+ */
+static void ANCS_Cmd_GetNotificationAttr(notificationAttr_type attr)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+ uint8_t CmdSize = 0;
+ uint8_t CmdGetNotificationAtt[19]={CommandIDGetNotificationAttributes,
+ 0x00,0x00,0x00,0x00,
+ NotificationAttributeIDAppIdentifier,
+ NotificationAttributeIDTitle,0xFF,0xFF,
+ NotificationAttributeIDSubtitle,0xFF,0xFF,
+ NotificationAttributeIDMessage,0xFF,0xFF,
+ NotificationAttributeIDMessageSize,
+ NotificationAttributeIDDate,
+ NotificationAttributeIDPositiveActionLabel,
+ NotificationAttributeIDNegativeActionLabel};
+
+ CmdGetNotificationAtt[CmdSize++] = CommandIDGetNotificationAttributes;
+
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 8) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 16) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.UID >> 24) & 0xFF);
+
+ if (attr.appID_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDAppIdentifier;
+ }
+
+ if ( (attr.title_flag == TRUE) && (attr.title_max_size != 0x00) )
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDTitle;
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.title_max_size >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.title_max_size >> 8) & 0xFF);
+ }
+
+ if ( (attr.subtitle_flag == TRUE) && (attr.subtitle_max_size!= 0x00) )
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDSubtitle;
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.subtitle_max_size >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.subtitle_max_size >> 8) & 0xFF);
+ }
+
+ if ( (attr.message_flag == TRUE) && (attr.message_max_size != 0x00) )
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDMessage;
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.message_max_size >> 0) & 0xFF);
+ CmdGetNotificationAtt[CmdSize++] = (uint8_t)((attr.message_max_size >> 8) & 0xFF);
+ }
+
+ if (attr.messageSize_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDMessageSize;
+ }
+
+ if (attr.date_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDDate;
+ }
+
+ if (attr.positiveAction_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDPositiveActionLabel;
+ }
+
+ if (attr.negativeAction_flag == TRUE)
+ {
+ CmdGetNotificationAtt[CmdSize++] = NotificationAttributeIDNegativeActionLabel;
+ }
+
+ result = aci_gatt_write_char_value( ancs_context.connection_handle,
+ ancs_context.ANCSControlPointCharValueHdle,
+ CmdSize,
+ (uint8_t *)CmdGetNotificationAtt);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" aci_gatt_write_char_value cmd NOK status =0x%02X \n",result);
+ }
+
+}
+
+
+/**
+ * create Perform Notification Action command from UID notification received and desired action ID
+ */
+static void ANCS_Cmd_PerformNotificationAction(uint32_t notificationUID, ActionID actID)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+ uint8_t CmdSize = 0;
+ uint8_t CmdPerformNotificationAction[6]={CommandIDPerformNotificationAction,
+ 0x00,0x00,0x00,0x00,
+ ActionIDPositive };
+
+ CmdPerformNotificationAction[CmdSize++] = CommandIDPerformNotificationAction;
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 0) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 8) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 16) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = (uint8_t)((notificationUID >> 24) & 0xFF);
+ CmdPerformNotificationAction[CmdSize++] = actID;
+
+ result = aci_gatt_write_char_value(ancs_context.connection_handle,
+ ancs_context.ANCSControlPointCharValueHdle,
+ CmdSize,
+ (uint8_t *)CmdPerformNotificationAction);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" aci_gatt_write_char_value cmd NOK status =0x%02X \n",result);
+ }
+}
+
+/**
+ * create Get App Attributes command to NP for number of wanted AppIdentifiers input
+ */
+static void ANCS_Cmd_GetAppAttr(uint8_t AppIdentifierLength, char *AppIdentifier/* NULL Terminated*/)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+ uint8_t CmdSize = 0;
+ uint8_t CmdGetAppAtt[128]={0};
+
+ CmdGetAppAtt[CmdSize++] = CommandIDGetAppAttributes;
+
+ /*Number of wanted App Identifiers*/
+ for (int idx=0;idx<AppIdentifierLength;idx++)
+ CmdGetAppAtt[CmdSize++] = AppIdentifier[idx];
+
+ CmdGetAppAtt[CmdSize++] = AppAttributeIDDisplayName;
+
+ result = aci_gatt_write_char_value( ancs_context.connection_handle,
+ ancs_context.ANCSControlPointCharValueHdle,
+ CmdSize,
+ (uint8_t *)CmdGetAppAtt);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" aci_gatt_write_char_value cmd NOK status =0x%02X \n",result);
+ }
+}
+
+/**
+* Parser of response for Get Notification Attributes command
+* number of received attributes and attributes list input
+*/
+static void ANCS_Parse_GetNotificationAttr_Resp(uint8_t commandID, uint16_t attrLen, uint8_t *attrList)
+{
+ uint8_t appId,PositiveActionLabel,NegativeActionLabel;
+ uint16_t len, index;
+
+ appId = FALSE;
+ PositiveActionLabel = FALSE;
+ NegativeActionLabel = FALSE;
+ index = 0;
+
+ if(commandID == CommandIDGetNotificationAttributes)
+ {
+ /* loop on number of attribute IDs */
+ while (index < attrLen)
+ {
+ /* attrList[index+0] corresponding to AttributeID x*/
+ Osal_MemCpy(&len, &attrList[index+1], 2); /* AttributeID x Value Length */
+ if (len == 0) /* Empty */
+ {
+ index += 3;
+ }
+ else
+ {
+ /* AttributeID x */
+ if (!ancs_context.notifyShowed) {
+ ANCS_Show_Notification(ancs_context.notifyEntry);
+ ancs_context.notifyShowed = TRUE;
+ }
+ ANCS_Show_Attr((NotificationAttributeID)attrList[index]); /* Notification AttributeID x*/
+
+ /* AttributeID for Application identifier */
+ if (attrList[index] == NotificationAttributeIDAppIdentifier)
+ {
+ appId = TRUE;
+ }
+ else if (attrList[index] == NotificationAttributeIDPositiveActionLabel)
+ {
+ PositiveActionLabel = TRUE;
+ }
+ else if (attrList[index] == NotificationAttributeIDNegativeActionLabel)
+ {
+ NegativeActionLabel = TRUE;
+ }
+
+ /* AttributeID x Value */
+ index++;
+ if (len <= sizeof(ancs_context.list))
+ {
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], len);
+ ancs_context.list[len] = '\0';
+ }
+ else
+ {
+ APP_DBG_MSG("cut the AttributeID x Value len=%d <= sizeof(ancs_context.list)=%d \n\r",len,sizeof(ancs_context.list));
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], sizeof(ancs_context.list)-1);
+ ancs_context.list[sizeof(ancs_context.list)-1] = '\0';
+ }
+
+ index += 2 + len; /* 2 Bytes Length of AttributeID x Value + Value Length*/
+ if (appId)
+ {
+ if ((len+1) <= MAX_DISPLAY_NAME_LEN)
+ {
+ Osal_MemCpy(ancs_context.AppIdentifier, ancs_context.list, len+1);
+ ancs_context.AppIdentifierLength = len + 1;
+ } else {
+ Osal_MemCpy(ancs_context.AppIdentifier, ancs_context.list, MAX_DISPLAY_NAME_LEN);
+ ancs_context.AppIdentifierLength = MAX_DISPLAY_NAME_LEN;
+ }
+
+ ancs_context.state = ANCS_GET_APP_ATTRIBUTE; /* 3.2 Get APP Attributes (Detail Infomation about the App, Now only support to Get Name of App) */
+ appId = FALSE;
+ }
+
+ if (len > 0)
+ printf(" %s\r\n", ancs_context.list);
+ }
+ }// while
+
+ if(ancs_context.state == ANCS_GET_APP_ATTRIBUTE)
+ {
+ APP_DBG_MSG(" 3.2 Get APP Attributes (Detail Infomation about the App, Now only support to Get Name of App) => ANCS_GET_APP_ATTRIBUTE \n\r");
+ }
+ else
+ {
+ /* Note, there is no AppIdentifier, so we only perform active action, but you also can perform negtive action */
+ if( (PositiveActionLabel == TRUE) || (NegativeActionLabel == TRUE) )
+ {
+ ancs_context.state = ANCS_PERFORM_NOTIFICATION_ACTION; /* 3.2 Perform Notification Action */
+ APP_DBG_MSG(" 3.2 Perform Notification Action => ANCS_PERFORM_NOTIFICATION_ACTION \n\r");
+ }
+ else
+ {
+ ancs_context.state = ANCS_IDLE; /* 3.2 Perform Notification Action */
+ APP_DBG_MSG(" No AppIdentifier & PositiveActionLabel & NegativeActionLabel ==> ANCS_IDLE \n\r");
+ }
+ }
+ }// commandID
+}
+
+/**
+* Parser of response for Get App Attributes command
+* number of received attributes and attributes list input
+*/
+static void ANCS_Parse_GetAppAttr_Resp(uint8_t commandID, uint16_t attrLen, uint8_t *attrList)
+{
+ uint8_t appId;
+ uint16_t len, index;
+
+ index = 0;
+ if(commandID == CommandIDGetAppAttributes)
+ {
+ /* loop on number of attribute IDs */
+ while (index < attrLen)
+ {
+ /* attrList[index+0] corresponding to AttributeID x*/
+ Osal_MemCpy(&len, &attrList[index+1], 2); /* AttributeID x Value Length */
+ if (len == 0) /* Empty */
+ {
+ index += 3;
+ }
+ else
+ {
+ /* AttributeID x */
+ ANCS_Show_AppAttr((AppAttributeID)attrList[index]); /* App AttributeID x */
+
+ /* AttributeID for Application identifier */
+ if (attrList[index] == AppAttributeIDDisplayName)
+ {
+ appId = TRUE;
+ } else {
+ appId = FALSE;
+ }
+
+ /* AttributeID x Value */
+ index++;
+ if (len <= sizeof(ancs_context.list))
+ {
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], len);
+ ancs_context.list[len] = '\0';
+ }
+ else
+ {
+ APP_DBG_MSG("cut the AttributeID x Value len=%d <= sizeof(ancs_context.list)=%d \n\r",len,sizeof(ancs_context.list));
+ Osal_MemCpy(ancs_context.list, &attrList[index+2], sizeof(ancs_context.list)-1);
+ ancs_context.list[sizeof(ancs_context.list)-1] = '\0';
+ }
+
+ index += 2 + len; /* 2 Bytes Length of AttributeID x Value + Value Length*/
+ if (appId)
+ {
+ if ((len+1) <= MAX_DISPLAY_NAME_LEN)
+ {
+ Osal_MemCpy(ancs_context.appDisplayName, ancs_context.list, len+1);
+ ancs_context.appDisplayName_len = len + 1;
+ } else {
+ Osal_MemCpy(ancs_context.appDisplayName, ancs_context.list, MAX_DISPLAY_NAME_LEN);
+ ancs_context.appDisplayName_len = MAX_DISPLAY_NAME_LEN;
+ }
+ } // appId
+
+ if (len > 0)
+ printf(" %s\r\n", ancs_context.list);
+ }
+ }// while
+
+ if( (ancs_context.notifyList[ancs_context.notifyEntry].catID == CategoryIDIncomingCall) ||
+ (ancs_context.notifyList[ancs_context.notifyEntry].catID == CategoryIDSchedule) ) /* depends on different Category */
+ /* if( ((ancs_context.notifyList[ancs_context.notifyEntry].evFlag & EventFlagPositiveAction) == EventFlagPositiveAction) ||
+ ((ancs_context.notifyList[ancs_context.notifyEntry].evFlag & EventFlagNegativeAction) == EventFlagNegativeAction) )*//* depends on action type */
+ {
+ ancs_context.genericFlag = TRUE;
+ ancs_context.state = ANCS_PERFORM_NOTIFICATION_ACTION; /* 3.4 Perform Notification Action */
+ APP_DBG_MSG(" 3.4 Perform Notification Action => ANCS_PERFORM_NOTIFICATION_ACTION \n\r");
+ } else {
+ APP_DBG_MSG("CommandIDGetAppAttributes notifyEntry=%d Removed\n\r", ancs_context.notifyEntry);
+ ancs_context.notifyList[ancs_context.notifyEntry].used = FALSE;
+ ancs_context.state = ANCS_CHECK_NOTIFICATION;
+ }
+ }// commandID
+}
+/**
+* Parser of ANCS Notification Source characteristic received
+* to fill ancs_context.notifyList elements
+*/
+static void ANCS_Notification_Source_Received_event(
+ EventID evID,
+ EventFlags evFlag,
+ CategoryID catID,
+ uint8_t catCount,
+ uint32_t notifUID)
+{
+ uint16_t i;
+
+ printf("*************** Notification Source Basic Infomation Received **********************\r\n");
+ ANCS_Show_EventID(evID);
+ ANCS_Show_EventFlag(evFlag);
+ ANCS_Show_CategoryID(catID);
+ printf("** CategoryCount: %d \r\n", catCount);
+ printf("** NotificationUID: 0x%08x \r\n", notifUID);
+
+ //ancs_context.notifyEntry = INVALID_NOTIFY_ENTRY;
+
+ if (evID == EventIDNotificationRemoved)
+ {
+ for (i=0; i < MAX_NMB_NOTIFY; i++)
+ {
+ if (ancs_context.notifyList[i].notifUID == notifUID)
+ {
+ ancs_context.notifyList[i].used = FALSE;
+ printf("** notifyEntry: %d Removed\r\n", i);
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (i=0; i < MAX_NMB_NOTIFY; i++)
+ {
+ if (!ancs_context.notifyList[i].used)
+ {
+ ancs_context.notifyList[i].used = TRUE;
+ ancs_context.notifyList[i].evID = evID;
+ ancs_context.notifyList[i].evFlag = evFlag;
+ ancs_context.notifyList[i].catID = catID;
+ ancs_context.notifyList[i].catCount = catCount;
+ ancs_context.notifyList[i].notifUID = notifUID;
+ printf("** notifyEntry: %d Added\r\n", i);
+ break;
+ }
+ }
+ }
+}
+
+/**
+* check event flag from ANCS Notification Source characteristic received
+* to fill ancs_context and filter silent event flags
+*/
+void ANCS_Notification_Check(EventFlags EventFlagMask)
+{
+ ancs_context.notifyEntry = INVALID_NOTIFY_ENTRY;
+ for (uint8_t idx=0; idx<MAX_NMB_NOTIFY; idx++)
+ {
+ if (ancs_context.notifyList[idx].used)
+ {
+
+ if((ancs_context.notifyList[idx].evFlag & EventFlagMask) == EventFlagMask)
+ {
+ ancs_context.notifyEntry = idx;
+ ancs_context.notifyShowed = FALSE;
+ ancs_context.state = ANCS_GET_NOTIFICATION_ATTRIBUTE;
+ APP_DBG_MSG("2. Get More Detail Infomations notifyEntry=%d ==> ANCS_GET_NOTIFICATION_ATTRIBUTE \n\r",ancs_context.notifyEntry);
+ break;
+ }
+ }
+ }
+ if (ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY)
+ {
+ APP_DBG_MSG(" ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY => ANCS_IDLE \n\r");
+ ancs_context.state = ANCS_IDLE;
+ }
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/****************************************************************/
+/* */
+/* GATT CLIENT PART */
+/****************************************************************/
+/**
+* Reset all ancs_context fields to default values
+*/
+ void ANCS_Client_Reset( void )
+{
+ memset(&ancs_context, 0x00, sizeof(ancs_context));
+
+ for (uint8_t i=0; i < MAX_NMB_NOTIFY; i++)
+ {
+ ancs_context.notifyList[i].used = 0x00;
+ //ancs_context.notifyList[i].evID = 0x00;
+ //ancs_context.notifyList[i].evFlag = 0x00;
+ //ancs_context.notifyList[i].catID = 0x00;
+ //ancs_context.notifyList[i].catCount = 0x00;
+ //ancs_context.notifyList[i].notifUID = 0x00;
+ }
+
+ ancs_context.state = ANCS_UNINITIALIZED;
+ ancs_context.connection_handle = 0xFFFF;
+ ancs_context.notifyEntry = INVALID_NOTIFY_ENTRY;
+
+ APP_DBG_MSG("ANCS CLIENT RESET \n\r");
+
+ return;
+}
+/**
+* function used to set task ANCS_App_Update_Service when processed ANCS_Client_Event_Handler
+*/
+static void Ancs_Mgr( void )
+{
+ UTIL_SEQ_SetTask(1 << CFG_TASK_APP_ANCS_DISCOVERY_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+/**
+* function of ANCS service and characteristics init
+*/
+void ANCS_Client_App_Init( void )
+{
+ /* register ANCS_Client_Event_Handler to BLE Controller initialization*/
+ SVCCTL_RegisterCltHandler(ANCS_Client_Event_Handler);
+
+ UTIL_SEQ_RegTask(1<<CFG_TASK_APP_ANCS_DISCOVERY_ID, UTIL_SEQ_RFU, ANCS_App_Update_Service);
+
+ /* reset ANCS context */
+ ANCS_Client_Reset();
+
+ APP_DBG_MSG("-- ANCS CLIENT INITIALIZED \n\r");
+
+ return;
+}
+
+static void gap_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_GAP_PROC_COMPLETE);
+ return;
+}
+
+static void gap_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_GAP_PROC_COMPLETE);
+ return;
+}
+
+static void gatt_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_GATT_PROC_COMPLETE);
+ return;
+}
+
+static void gatt_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_GATT_PROC_COMPLETE);
+ return;
+}
+
+/**
+* function of GATT service parse by UUID
+*/
+static void GattParseServicesByUUID(aci_att_find_by_type_value_resp_event_rp0 *pr)
+{
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP - Connection_Handle=0x%04X,Num_of_Handle_Pair=%d\n\r",
+ pr->Connection_Handle,
+ pr->Num_of_Handle_Pair);
+ for(uint8_t NumPair=0;NumPair<pr->Num_of_Handle_Pair;NumPair++)
+ {
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP - NumPair=%d Found_Attribute_Handle=0x%04X,Group_End_Handle=0x%04X\n\r",
+ NumPair,
+ pr->Attribute_Group_Handle_Pair[NumPair].Found_Attribute_Handle,
+ pr->Attribute_Group_Handle_Pair[NumPair].Group_End_Handle);
+ }
+ /* complete ancs_context fields */
+ if(ancs_context.state == ANCS_DISCOVER_ANCS_SERVICE)
+ {
+ ancs_context.ANCSServiceStartHandle = pr->Attribute_Group_Handle_Pair[0].Found_Attribute_Handle;
+ ancs_context.ANCSServiceEndHandle = pr->Attribute_Group_Handle_Pair[0].Group_End_Handle;
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP - Found ANCSServiceStartHandle=0x%04X,ANCSServiceEndHandle=0x%04X\n\r",
+ ancs_context.ANCSServiceStartHandle,
+ ancs_context.ANCSServiceEndHandle);
+ }
+}
+
+
+/**
+* function of GATT service parse
+*/
+static void GattParseServices(aci_att_read_by_group_type_resp_event_rp0 *pr)
+{
+ uint16_t uuid,ServiceStartHandle,ServiceEndHandle;
+ uint8_t uuid_offset,uuid_size,uuid_short_offset;
+ uint8_t i,idx,numServ;
+
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP - Connection_Handle=0x%04X,Attribute_Data_Length=%d,Data_Length=%d !\n",
+ pr->Connection_Handle,
+ pr->Attribute_Data_Length,
+ pr->Data_Length);
+
+ /* check connection handle related to response before processing */
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ /* Number of attribute value tuples */
+ numServ = (pr->Data_Length) / pr->Attribute_Data_Length;
+
+ /* event data in Attribute_Data_List contains:
+ * 2 bytes for start handle
+ * 2 bytes for end handle
+ * 2 or 16 bytes data for UUID
+ */
+ if (pr->Attribute_Data_Length == 20) /* we are interested in the UUID is 128 bit.*/
+ {
+ idx = 16; /*UUID index of 2 bytes read part in Attribute_Data_List */
+ uuid_offset = 4; /*UUID offset in bytes in Attribute_Data_List */
+ uuid_size = 16; /*UUID size in bytes */
+ uuid_short_offset = 12; /*UUID offset of 2 bytes read part in UUID field*/
+ }
+ if (pr->Attribute_Data_Length == 6) /* we are interested in the UUID is 16 bit.*/
+ {
+ idx = 4;
+ uuid_offset = 4;
+ uuid_size = 2;
+ uuid_short_offset = 0;
+ }
+ UNUSED(idx);
+ UNUSED(uuid_size);
+
+ /* Loop on number of attribute value tuples */
+ for (i = 0; i < numServ; i++)
+ {
+ ServiceStartHandle = UNPACK_2_BYTE_PARAMETER(&pr->Attribute_Data_List[uuid_offset - 4]);
+ ServiceEndHandle = UNPACK_2_BYTE_PARAMETER(&pr->Attribute_Data_List[uuid_offset - 2]);
+ uuid = UNPACK_2_BYTE_PARAMETER(&pr->Attribute_Data_List[uuid_offset + uuid_short_offset]);
+ APP_DBG_MSG("numServ=%d/%d,short UUID=0x%04X ServiceHandle [0x%04X - 0x%04X] \n\r",
+ i, numServ, uuid, ServiceStartHandle,ServiceEndHandle);
+
+ /* complete ancs_context fields */
+ if ( (ancs_context.ALLServiceStartHandle == 0x0000) || (ServiceStartHandle < ancs_context.ALLServiceStartHandle) )
+ {
+ ancs_context.ALLServiceStartHandle = ServiceStartHandle;
+ }
+ if ( (ancs_context.ALLServiceEndHandle== 0x0000) || (ServiceEndHandle > ancs_context.ALLServiceEndHandle) )
+ {
+ ancs_context.ALLServiceEndHandle = ServiceEndHandle;
+ }
+
+
+ if(uuid == GAP_SERVICE_UUID) /* 0x1800 */ {
+
+ ancs_context.GAPServiceStartHandle = ServiceStartHandle;
+ ancs_context.GAPServiceEndHandle = ServiceEndHandle;
+
+ APP_DBG_MSG("GAP_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == GENERIC_ATTRIBUTE_SERVICE_UUID) /* 0x1801 */ {
+
+ ancs_context.GATTServiceStartHandle = ServiceStartHandle;
+ ancs_context.GATTServiceEndHandle = ServiceEndHandle;
+
+ APP_DBG_MSG("GENERIC_ATTRIBUTE_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == IMMEDIATE_ALERT_SERVICE_UUID) /* 0x1802 */ {
+ APP_DBG_MSG("AMS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == LINK_LOSS_SERVICE_UUID) /* 0x1803 */ {
+ APP_DBG_MSG("LINK_LOSS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == TX_POWER_SERVICE_UUID) /* 0x1804 */ {
+ APP_DBG_MSG("TX_POWER_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == CURRENT_TIME_SERVICE_UUID) /* 0x1805 */ {
+ APP_DBG_MSG("CURRENT_TIME_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == REFERENCE_UPDATE_TIME_SERVICE_UUID) /* 0x1806 */ {
+ APP_DBG_MSG("REFERENCE_UPDATE_TIME_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == NEXT_DST_CHANGE_SERVICE_UUID) /* 0x1807 */ {
+ APP_DBG_MSG("NEXT_DST_CHANGE_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == GLUCOSE_SERVICE_UUID) /* 0x1808 */ {
+ APP_DBG_MSG("GLUCOSE_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == HEALTH_THERMOMETER_SERVICE_UUID) /* 0x1809 */ {
+ APP_DBG_MSG("HEALTH_THERMOMETER_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == DEVICE_INFORMATION_SERVICE_UUID) /* 0x180A */ {
+ APP_DBG_MSG("DEVICE_INFORMATION_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == 0x180B) /* 0x180B */ {
+ APP_DBG_MSG("Unkown UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == 0x180C) /* 0x180C */ {
+ APP_DBG_MSG("Unkown UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == HEART_RATE_SERVICE_UUID) /* 0x180D */ {
+ APP_DBG_MSG("AMS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == PHONE_ALERT_SERVICE_UUID) /* 0x180E */ {
+ APP_DBG_MSG("PHONE_ALERT_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == BATTERY_SERVICE_UUID) /* 0x180F */ {
+ APP_DBG_MSG("BATTERY_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == ANCS_SERVICE_UUID) {
+
+ ancs_context.ANCSServiceStartHandle = ServiceStartHandle;
+ ancs_context.ANCSServiceEndHandle = ServiceEndHandle;
+
+ APP_DBG_MSG("ANCS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else if (uuid == AMS_SERVICE_UUID) {
+ APP_DBG_MSG("AMS_SERVICE_UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ } else {
+ APP_DBG_MSG("invalid UUID=0x%04X found [%04X %04X]!\n",uuid,ServiceStartHandle,ServiceEndHandle);
+ }
+
+ uuid_offset += pr->Attribute_Data_Length;
+ }//numServ
+ }
+ else
+ {
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP, failed no free index in connection table !\n\r");
+ }
+}
+
+/**
+* function of GATT characteristics parse
+*/
+static void GattParseChars(aci_att_read_by_type_resp_event_rp0 *pr)
+{
+ uint16_t uuid,CharStartHandle,CharValueHandle;
+ uint8_t uuid_offset,uuid_size,uuid_short_offset;
+ uint8_t i,idx,numHdleValuePair;
+ uint8_t CharProperties;
+
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_TYPE_RESP - Connection_Handle=0x%x,Handle_Value_Pair_Length=%d,Data_Length=%d\n\r",
+ pr->Connection_Handle,
+ pr->Handle_Value_Pair_Length,
+ pr->Data_Length);
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ /* event data in Attribute_Data_List contains:
+ * 2 bytes for start handle
+ * 1 byte char properties
+ * 2 bytes handle
+ * 2 or 16 bytes data for UUID
+ */
+
+ /* Number of attribute value tuples */
+ numHdleValuePair = pr->Data_Length / pr->Handle_Value_Pair_Length;
+
+ if (pr->Handle_Value_Pair_Length == 21) /* we are interested in 128 bit UUIDs */
+ {
+ idx = 17; /*UUID index of 2 bytes read part in Attribute_Data_List */
+ uuid_offset = 5; /*UUID offset in bytes in Attribute_Data_List */
+ uuid_size = 16; /*UUID size in bytes */
+ uuid_short_offset = 12; /*UUID offset of 2 bytes read part in UUID field*/
+ }
+ if (pr->Handle_Value_Pair_Length == 7) /* we are interested in 16 bit UUIDs */
+ {
+ idx = 5;
+ uuid_offset = 5;
+ uuid_size = 2;
+ uuid_short_offset = 0;
+ }
+ UNUSED(idx);
+ UNUSED(uuid_size);
+
+ pr->Data_Length -= 1;
+
+ /* Loop on number of attribute value tuples */
+ for (i = 0; i < numHdleValuePair; i++)
+ {
+ CharStartHandle = UNPACK_2_BYTE_PARAMETER(&pr->Handle_Value_Pair_Data[uuid_offset-5]);
+ CharProperties = pr->Handle_Value_Pair_Data[uuid_offset-3];
+ CharValueHandle = UNPACK_2_BYTE_PARAMETER(&pr->Handle_Value_Pair_Data[uuid_offset-2]);
+ uuid = UNPACK_2_BYTE_PARAMETER(&pr->Handle_Value_Pair_Data[uuid_offset+uuid_short_offset]);
+
+ if ( (uuid != 0x0) && (CharProperties != 0x0) && (CharStartHandle != 0x0) && (CharValueHandle !=0) )
+ {
+ APP_DBG_MSG("-- GATT : numHdleValuePair=%d,short UUID=0x%04X FOUND CharProperties=0x%04X CharHandle [0x%04X - 0x%04X]\n",
+ i, uuid, CharProperties, CharStartHandle,CharValueHandle);
+
+ /* complete ancs_context fields */
+ if (uuid == DEVICE_NAME_UUID) /* 0x2A00 */ {
+ APP_DBG_MSG("GAP DEVICE_NAME_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == APPEARANCE_UUID) /* 0x2A01 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == PERIPHERAL_PRIVACY_FLAG_UUID) /* 0x2A02 */ {
+ APP_DBG_MSG("GAP PERIPHERAL_PRIVACY_FLAG_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == RECONNECTION_ADDR_UUID) /* 0x2A03 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == PERIPHERAL_PREFERRED_CONN_PARAMS_UUID) /* 0x2A04 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ }else if (uuid == SERVICE_CHANGED_CHARACTERISTIC_UUID) /* 0x2A05 */ {
+
+ ancs_context.ServiceChangedCharStartHdle = CharStartHandle;
+ ancs_context.ServiceChangedCharValueHdle = CharValueHandle;
+ APP_DBG_MSG("GATT SERVICE_CHANGED_CHARACTERISTIC_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == BATTERY_LEVEL_CHAR_UUID) /* 0x2A19 */ {
+ APP_DBG_MSG("BATTERY_LEVEL_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == CURRENT_TIME_CHAR_UUID) /* 0x2A2B */ {
+ APP_DBG_MSG("CURRENT_TIME_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == LOCAL_TIME_INFORMATION_CHAR_UUID) /* 0x2A0F */ {
+ APP_DBG_MSG("LOCAL_TIME_INFORMATION_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == MANUFACTURER_NAME_UUID) /* 0x2A29 */ {
+ APP_DBG_MSG("DeviceInformationService MANUFACTURER_NAME_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == MODEL_NUMBER_UUID) /* 0x2A24 */ {
+ APP_DBG_MSG("DeviceInformationService MODEL_NUMBER_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ /*******************************************************************************************************************/
+ } else if (uuid == ANCS_NOTIFICATION_SOURCE_CHAR_UUID) {
+
+ ancs_context.ANCSNotificationSourceCharStartHdle = CharStartHandle;
+ ancs_context.ANCSNotificationSourceCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("ANCS_NOTIFICATION_SOURCE_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == ANCS_CONTROL_POINT_CHAR_UUID) {
+
+ ancs_context.ANCSControlPointCharStartHdle = CharStartHandle;
+ ancs_context.ANCSControlPointCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("ANCS_CONTROL_POINT_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else if (uuid == ANCS_DATA_SOURCE_CHAR_UUID) {
+
+ ancs_context.ANCSDataSourceCharStartHdle = CharStartHandle;
+ ancs_context.ANCSDataSourceCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("ANCS_DATA_SOURCE_CHAR_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+
+ } else if (uuid == CENTRAL_ADDRESS_RESOLUTION_UUID) {
+
+ ancs_context.GAPCentralAddressResolutionCharStartHdle = CharStartHandle;
+ ancs_context.GAPCentralAddressResolutionCharValueHdle = CharValueHandle;
+
+ APP_DBG_MSG("CENTRAL_ADDRESS_RESOLUTION_UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ } else {
+ APP_DBG_MSG("Unknown_char UUID=0x%04X found [%04X %04X]!\n",uuid,CharStartHandle,CharValueHandle);
+ }
+
+ }
+ uuid_offset += pr->Handle_Value_Pair_Length;
+ }// numHdleValuePair
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_ATT_READ_BY_TYPE_RESP, failed handle not found in connection table !\n\r");
+}
+/**
+* function of GATT descriptor parse
+*/
+static void GattParseDescs(aci_att_find_info_resp_event_rp0 *pr)
+{
+ uint16_t uuid,handle;
+ uint8_t uuid_offset,uuid_size,uuid_short_offset;
+ uint8_t i,numDesc,handle_uuid_pair_size;
+
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_INFORMATION_RESP - Connection_Handle=0x%x,Format=%d,Event_Data_Length=%d\n\r",
+ pr->Connection_Handle,
+ pr->Format,
+ pr->Event_Data_Length);
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ /* event data in Attribute_Data_List contains:
+ * 2 bytes handle
+ * 2 or 16 bytes data for UUID
+ */
+ if (pr->Format == UUID_TYPE_16)
+ {
+ uuid_size = 2;
+ uuid_offset = 2;
+ uuid_short_offset = 0;
+ handle_uuid_pair_size = 4;
+ }
+ if (pr->Format == UUID_TYPE_128)
+ {
+ uuid_size = 16;
+ uuid_offset = 2;
+ uuid_short_offset = 12;
+ handle_uuid_pair_size = 18;
+ }
+ UNUSED(uuid_size);
+
+ /* Number of handle uuid pairs */
+ numDesc = (pr->Event_Data_Length) / handle_uuid_pair_size;
+
+ for (i = 0; i < numDesc; i++)
+ {
+ handle = UNPACK_2_BYTE_PARAMETER(&pr->Handle_UUID_Pair[uuid_offset-2]);
+ uuid = UNPACK_2_BYTE_PARAMETER(&pr->Handle_UUID_Pair[uuid_offset+uuid_short_offset]);
+
+ /* 1. primary serice handle + primary serice UUID */
+ if(uuid == PRIMARY_SERVICE_UUID)
+ {
+ APP_DBG_MSG("PRIMARY_SERVICE_UUID=0x%04X handle=0x%04X\n\r",uuid,handle);
+ }/* 1. primary serice handle + primary serice UUID */
+
+ /* 2. char handle + char UUID */
+ else if(uuid == CHARACTERISTIC_UUID)
+ {
+ /* reset UUID & handle */
+ gCharUUID = 0;
+ gCharStartHandle = 0;
+ gCharValueHandle = 0;
+ gCharDescriptorHandle = 0;
+
+ gCharStartHandle = handle;
+ APP_DBG_MSG("reset CHARACTERISTIC_UUID=0x%04X CharStartHandle=0x%04X\n\r",uuid,handle);
+ }/* 2. char handle + char UUID */
+
+ /* 3. char desc handle + char desc UUID */
+ else if( (uuid == CHAR_EXTENDED_PROPERTIES_DESCRIPTOR_UUID) /* 0x2900 */
+ || (uuid == CLIENT_CHAR_CONFIG_DESCRIPTOR_UUID) )/* 0x2902 */
+ {
+ gCharDescriptorHandle = handle;
+ if (gCharValueHandle == ancs_context.ServiceChangedCharValueHdle){
+
+ ancs_context.ServiceChangedCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else if (gCharValueHandle == ancs_context.ANCSNotificationSourceCharValueHdle){
+
+ ancs_context.ANCSNotificationSourceCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else if (gCharValueHandle == ancs_context.ANCSDataSourceCharValueHdle){
+
+ ancs_context.ANCSDataSourceCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else if (gCharValueHandle == ancs_context.ANCSControlPointCharValueHdle){
+
+ ancs_context.ANCSControlPointCharDescHdle = handle;
+ APP_DBG_MSG("uuid=0x%04X handle=0x%04X-0x%04X-0x%04X\n\r\n\r", uuid,gCharStartHandle,gCharValueHandle,handle);
+ } else {
+ APP_DBG_MSG(" unkown_char_desc UUID=0x%04X handle=0x%04X-0x%04X-0x%04X \n\r",uuid,gCharStartHandle,gCharValueHandle,handle);
+ }
+ }// 3. char desc handle + char desc UUID
+
+ /* 4. char value handle + char UUID */
+ else
+ {
+ gCharUUID = uuid;
+ gCharValueHandle = handle;
+ if (uuid == DEVICE_NAME_UUID) /* 0x2A00 */ {
+ APP_DBG_MSG("GAP DEVICE_NAME_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == APPEARANCE_UUID) /* 0x2A01 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == PERIPHERAL_PRIVACY_FLAG_UUID) /* 0x2A02 */ {
+ APP_DBG_MSG("GAP PERIPHERAL_PRIVACY_FLAG_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == RECONNECTION_ADDR_UUID) /* 0x2A03 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == PERIPHERAL_PREFERRED_CONN_PARAMS_UUID) /* 0x2A04 */ {
+ APP_DBG_MSG("GAP APPEARANCE_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == SERVICE_CHANGED_CHARACTERISTIC_UUID) /* 0x2A05 */ {
+ APP_DBG_MSG(" SERVICE_CHANGED_CHARACTERISTIC_UUID=0x%04X CharValueHandle [%04X]\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == BATTERY_LEVEL_CHAR_UUID) /* 0x2A19 */ {
+ APP_DBG_MSG("BATTERY_LEVEL_CHAR_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == CURRENT_TIME_CHAR_UUID) /* 0x2A2B */ {
+ APP_DBG_MSG("CURRENT_TIME_CHAR_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == LOCAL_TIME_INFORMATION_CHAR_UUID) /* 0x2A0F */ {
+ APP_DBG_MSG("LOCAL_TIME_INFORMATION_CHAR_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == MANUFACTURER_NAME_UUID) /* 0x2A29 */ {
+ APP_DBG_MSG("DeviceInformationService MANUFACTURER_NAME_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ } else if (uuid == MODEL_NUMBER_UUID) /* 0x2A24 */ {
+ APP_DBG_MSG("DeviceInformationService MODEL_NUMBER_UUID=0x%04X found [%04X]!\n",uuid,handle);
+ /*******************************************************************************************************************/
+ } else if (uuid == ANCS_NOTIFICATION_SOURCE_CHAR_UUID) {
+ APP_DBG_MSG(" ANCS_NOTIFICATION_SOURCE_CHAR_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else if (uuid == ANCS_CONTROL_POINT_CHAR_UUID) {
+ APP_DBG_MSG(" ANCS_CONTROL_POINT_CHAR_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else if (uuid == ANCS_DATA_SOURCE_CHAR_UUID) {
+ APP_DBG_MSG(" ANCS_DATA_SOURCE_CHAR_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else if (uuid == CENTRAL_ADDRESS_RESOLUTION_UUID) {
+ APP_DBG_MSG(" CENTRAL_ADDRESS_RESOLUTION_UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ } else {
+ APP_DBG_MSG(" invalid char value UUID=0x%04X CharValueHandle [%04X]!\n",uuid,handle);
+ }
+ }// 4. char value handle + char UUID
+
+ uuid_offset += handle_uuid_pair_size;
+ }
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_ATT_FIND_INFORMATION_RESP, failed handle not found in connection table !\n\r");
+}
+
+static void GattParseNotification(aci_gatt_notification_event_rp0 *pr)
+{
+ APP_DBG_MSG("EVT_BLUE_GATT_NOTIFICATION - Connection_Handle=0x%x,Attribute_Handle=0x%04X,Attribute_Value_Length=%d\n\r",
+ pr->Connection_Handle,
+ pr->Attribute_Handle,
+ pr->Attribute_Value_Length);
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ // 1. Incomming Nofification
+ if (pr->Attribute_Handle == ancs_context.ANCSNotificationSourceCharValueHdle)
+ {
+ APP_DBG_MSG("1. Incomming Nofification received BASIC information : \n\r");
+ EventID evID = (EventID)pr->Attribute_Value[0];
+ EventFlags evFlag = (EventFlags)pr->Attribute_Value[1];
+ CategoryID catID = (CategoryID)pr->Attribute_Value[2];
+ uint8_t catCount = pr->Attribute_Value[3];
+ uint32_t notifUID = (uint32_t)(*((uint32_t *)&pr->Attribute_Value[4]));
+ ANCS_Notification_Source_Received_event(evID, evFlag, catID, catCount, notifUID);
+
+ // 2. Get More Detail Infomations
+ if( (evID == EventIDNotificationAdded) )
+ {
+ if((evFlag & EventFlagSilent) != EventFlagSilent)
+ {
+ ANCS_Notification_Check(evFlag);
+ Ancs_Mgr();
+ }
+ }
+ }// ANCSNotificationSourceCharValueHdle
+
+ // 3. Parse Detail Infomations, Perform Notification Action or Get APP Attributes
+ if (pr->Attribute_Handle == ancs_context.ANCSDataSourceCharValueHdle)
+ {
+ CommandID cmdID = (CommandID)pr->Attribute_Value[0];
+ uint32_t notifUID = (uint32_t)0x00000000;
+
+ uint16_t AttributeLength;
+ uint8_t *AttributeList;
+
+ char AppIdentifier[128]={0};
+ uint16_t AppIdentifierLength;
+
+ /***********************************************************************************/
+ if (cmdID == CommandIDGetNotificationAttributes)
+ {
+ APP_DBG_MSG("3.1 Parse Detail Infomation of Notification Attribute, CommandIDGetNotificationAttributes Response: \n\r");
+ notifUID = (uint32_t)(*((uint32_t *)&pr->Attribute_Value[1]));
+ AttributeLength = pr->Attribute_Value_Length - (1+4);
+ AttributeList = (uint8_t *)&pr->Attribute_Value[1+4];
+
+ // 3.1 Parse Detail Infomation of Notification Attribute
+ ANCS_Parse_GetNotificationAttr_Resp(cmdID,AttributeLength,AttributeList);
+ }
+ UNUSED(notifUID);
+
+ if (cmdID == CommandIDGetAppAttributes)
+ {
+ APP_DBG_MSG("3.3 Parse Detail Infomation of APP Attribute, CommandIDGetAppAttributes Response: \n\r");
+ strcpy(AppIdentifier,(char *)&pr->Attribute_Value[1]);
+ AppIdentifierLength = strlen((char *)&pr->Attribute_Value[1]);
+ AttributeLength = pr->Attribute_Value_Length - (1+AppIdentifierLength+1);
+ AttributeList = (uint8_t *)&pr->Attribute_Value[1+AppIdentifierLength+1];
+
+ // 3.3 Parse Detail Infomation of App Attribute
+ ANCS_Parse_GetAppAttr_Resp(cmdID,AttributeLength,AttributeList);
+ }
+
+ Ancs_Mgr();
+ /***********************************************************************************/
+ }/* ANCSDataSourceCharValueHdle */
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_GATT_NOTIFICATION, failed handle not found in connection table !\n\r");
+}
+
+/**
+ * @brief ANCS Event handler
+ * @param Event: Address of the buffer holding the Event
+ * @retval Ack: Return whether the Event has been managed or not
+ */
+static SVCCTL_EvtAckStatus_t ANCS_Client_Event_Handler( void *Event )
+{
+ SVCCTL_EvtAckStatus_t return_value;
+ hci_event_pckt * event_pckt;
+ evt_blue_aci * blue_evt;
+ Connection_Context_t Notification;
+
+ return_value = SVCCTL_EvtAckFlowEnable;
+ event_pckt = (hci_event_pckt *) (((hci_uart_pckt*) Event)->data);
+
+ switch (event_pckt->evt)
+ {
+ case EVT_VENDOR:
+ {
+ blue_evt = (evt_blue_aci*) event_pckt->data;
+ switch (blue_evt->ecode)
+ {
+ case EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP:
+ {
+ aci_att_read_by_group_type_resp_event_rp0 *pr = (void*) blue_evt->data;
+
+ APP_DBG_MSG(" EVT_BLUE_ATT_READ_BY_GROUP_TYPE_RESP\n");
+ GattParseServices((aci_att_read_by_group_type_resp_event_rp0 *)pr);
+ }
+ break;
+ case EVT_BLUE_ATT_READ_BY_TYPE_RESP:
+ {
+ aci_att_read_by_type_resp_event_rp0 *pr = (void*) blue_evt->data;
+ APP_DBG_MSG(" EVT_BLUE_ATT_READ_BY_TYPE_RESP\n");
+ GattParseChars((aci_att_read_by_type_resp_event_rp0 *)pr);
+ }
+ break;
+ case EVT_BLUE_ATT_FIND_INFORMATION_RESP:
+ {
+ aci_att_find_info_resp_event_rp0 *pr = (void*) blue_evt->data;
+ APP_DBG_MSG(" EVT_BLUE_ATT_FIND_INFORMATION_RESP\n");
+ GattParseDescs((aci_att_find_info_resp_event_rp0 *)pr);
+ }
+ break; /*EVT_BLUE_ATT_FIND_INFORMATION_RESP*/
+
+ case EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP:
+ {
+ APP_DBG_MSG(" EVT_BLUE_GATT_DISC_READ_CHAR_BY_UUID_RESP\n");
+ }
+ break;
+
+ case EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP:
+ {
+ aci_att_find_by_type_value_resp_event_rp0 *pr = (void*) blue_evt->data;
+ APP_DBG_MSG(" EVT_BLUE_ATT_FIND_BY_TYPE_VAL_RESP\n");
+ GattParseServicesByUUID((aci_att_find_by_type_value_resp_event_rp0 *)pr);
+ }
+ break;
+
+ case EVT_BLUE_GATT_NOTIFICATION:
+ {
+ aci_gatt_notification_event_rp0 *pr = (void*) blue_evt->data;
+ GattParseNotification((aci_gatt_notification_event_rp0 *)pr);
+ }
+ break;/* end EVT_BLUE_GATT_NOTIFICATION */
+
+ case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED:
+ {
+ aci_gatt_attribute_modified_event_rp0 *attribute_modified = (aci_gatt_attribute_modified_event_rp0*) blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED Attr_Handle=0x%04X Offset=0x%04X Attr_Data_Length=0x%04X \n\r",
+ attribute_modified->Attr_Handle,
+ attribute_modified->Offset,
+ attribute_modified->Attr_Data_Length);
+ }/* end EVT_BLUE_GATT_ATTRIBUTE_MODIFIED */
+ break;
+
+ case EVT_BLUE_ATT_EXCHANGE_MTU_RESP:
+ {
+ aci_att_exchange_mtu_resp_event_rp0 * exchange_mtu_resp;
+ exchange_mtu_resp = (aci_att_exchange_mtu_resp_event_rp0 *)blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_ATT_EXCHANGE_MTU_RESP Connection_Handle=0x%04X Server_RX_MTU = %d ==> ANCS_MTU_EXCHANGE_COMPLETE \n",
+ exchange_mtu_resp->Connection_Handle,
+ exchange_mtu_resp->Server_RX_MTU );
+
+ Notification.Evt_Opcode = ANCS_MTU_EXCHANGE_COMPLETE;
+ Notification.connection_handle = exchange_mtu_resp->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+ break;
+
+ case EVT_BLUE_GATT_PROCEDURE_COMPLETE:
+ {
+ aci_gatt_proc_complete_event_rp0 *pr = (void*) blue_evt->data;
+ if(pr->Error_Code != ERR_CMD_SUCCESS)
+ {
+ APP_DBG_MSG("EVT_BLUE_GATT_PROCEDURE_COMPLETE - Connection_Handle=0x%04x,Error_Code=0x%02X (0x41: Failed)\n\r", pr->Connection_Handle,pr->Error_Code);
+ }
+
+ if (ancs_context.connection_handle == pr->Connection_Handle)
+ {
+ gatt_cmd_resp_release(0);
+ }
+ else
+ APP_DBG_MSG("EVT_BLUE_GATT_PROCEDURE_COMPLETE, failed handle not found in connection table !\n\r");
+ }/*EVT_BLUE_GATT_PROCEDURE_COMPLETE*/
+ break;
+ case EVT_BLUE_GATT_ERROR_RESP:
+ {
+ aci_gatt_error_resp_event_rp0 *error_resp= (void*) blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_GATT_ERROR_RESP Connection_Handle=0x%04X Req_Opcode=0x%02X Attribute_Handle=0x%04X Error_Code=0x%02X (0x05: Insufficient authentication,0x0A: Attribute not found)\n",
+ error_resp->Connection_Handle,error_resp->Req_Opcode,error_resp->Attribute_Handle,error_resp->Error_Code);
+ }/*EVT_BLUE_GATT_ERROR_RESP*/
+ break;
+
+ default:
+ APP_DBG_MSG("invalid ecode 0x%04X\n",blue_evt->ecode);
+ return_value = SVCCTL_EvtNotAck;
+ break;
+ }
+ }
+ break; /* EVT_VENDOR */
+
+ default:
+ return_value = SVCCTL_EvtNotAck;
+ break;
+ }
+
+ return (return_value);
+}/* end BLE_CTRL_Event_Acknowledged_Status_t */
+
+void ANCS_App_KeyButton1Action(void)
+{
+ APP_DBG_MSG("\n\r ** Term CONNECTION ** \n\r");
+ aci_gap_terminate(ancs_context.connection_handle, 0x13);
+}
+void ANCS_App_KeyButton2Action(void)
+{
+ APP_DBG_MSG("Review the PreExisted Notification \n\r");
+ Connection_Context_t Notification;
+ Notification.Evt_Opcode = ANCS_CHECK_NOTIFICATION;
+ Notification.connection_handle = ancs_context.connection_handle;
+ ANCS_App_Notification(&Notification);
+}
+void ANCS_App_KeyButton3Action(void)
+{
+ APP_DBG_MSG(" aci_gap_clear_security_db & aci_gap_remove_bonded_device & aci_gap_terminate \n\r");
+ aci_gap_remove_bonded_device(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ aci_gap_clear_security_db();
+ aci_gap_terminate(ancs_context.connection_handle, 0x13);
+}
+
+#if (GET_ACTION_ID_FROM_UART == 1)
+static uint8_t ANCS_App_Get_Char(void)
+{
+ uint8_t ch;
+ HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1,HAL_MAX_DELAY);
+
+ /* Echo character back to console */
+ HAL_UART_Transmit_DMA(&huart1, (uint8_t*)&ch, 1);
+
+ /* And cope with Windows */
+ if(ch == '\r'){
+ uint8_t ret = '\n';
+ HAL_UART_Transmit_DMA(&huart1, (uint8_t*)&ret, 1);
+ }
+
+ return ch;
+}
+#endif
+
+static ActionID ANCS_App_Get_ActionID(void)
+{
+ ActionID actID = ActionIDPositive;
+
+ #if (GET_ACTION_ID_FROM_UART == 1)
+ uint8_t performAction;
+ uint32_t StartTime = HAL_GetTick();
+ uint32_t ActionTimeout = 5000;
+
+ APP_DBG_MSG("** Notification Action. Press on the keyboard: A=Accept or R=Reject\r\n");
+ APP_DBG_MSG("** Waiting 5 sec....\r\n");
+
+ performAction = ANCS_App_Get_Char();
+
+ if ((HAL_GetTick() - StartTime) >= ActionTimeout) {
+ APP_DBG_MSG("** Action Timeout\r\n");
+ }
+ else
+ {
+ if ((performAction == 'A') || (performAction == 'a')) {
+ actID = ActionIDPositive;
+ APP_DBG_MSG("** Positive Action %c \n\r",performAction);
+ }else if ((performAction == 'R') || (performAction == 'r')) {
+ actID = ActionIDNegative;
+ APP_DBG_MSG("** Reject Action %c \n\r",performAction);
+ }
+ }
+ #endif
+
+ return actID;
+}
+void ANCS_App_Remove_Bonding_Info(void)
+{
+ APP_DBG_MSG(" aci_gap_clear_security_db & aci_gap_remove_bonded_device \n\r");
+ aci_gap_remove_bonded_device(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ aci_gap_clear_security_db();
+}
+
+void ANCS_App_Peer_Bonded_Check(uint16_t Connection_Handle, uint8_t Peer_Address_Type, uint8_t Peer_Address[6])
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+
+ ancs_context.connection_handle = Connection_Handle;
+
+ ancs_context.Peer_Address_Type = Peer_Address_Type;
+ ancs_context.Peer_Address[5] = Peer_Address[5];
+ ancs_context.Peer_Address[4] = Peer_Address[4];
+ ancs_context.Peer_Address[3] = Peer_Address[3];
+ ancs_context.Peer_Address[2] = Peer_Address[2];
+ ancs_context.Peer_Address[1] = Peer_Address[1];
+ ancs_context.Peer_Address[0] = Peer_Address[0];
+
+ result = aci_gap_is_device_bonded(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ ancs_context.Peer_Bonded = 0x01;
+ }
+ else
+ {
+ ancs_context.Peer_Bonded = 0x00;
+ }
+
+ uint8_t Security_Mode, Security_Level;
+
+ result = aci_gap_get_security_level(ancs_context.connection_handle,&Security_Mode,&Security_Level);
+ ancs_context.Security_Mode = Security_Mode;
+ ancs_context.Security_Level = Security_Level;
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Peer_Bonded=%d Security_Mode= %d, Security_Level= %d \n\r", ancs_context.Peer_Bonded, Security_Mode, Security_Level);
+ }
+
+}
+
+void ANCS_App_Update_Service( )
+{
+ switch(ancs_context.state)
+ {
+ case ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM:
+ {
+ GapProcReq(GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM);
+ }
+ break;
+
+ case ANCS_ALLOW_REBOND:
+ {
+ GapProcReq(GAP_PROC_ALLOW_REBOND);
+ }
+ break;
+
+ case ANCS_MTU_UPDATE:
+ {
+ GattProcReq(GATT_PROC_MTU_UPDATE);
+ }
+ break;
+
+ case ANCS_DISCOVER_ANCS_SERVICE:
+ {
+ /* GattProcReq(GATT_PROC_MTU_UPDATE); */ /* enable it if you want to set ATT_MTU */
+ GattProcReq(GATT_PROC_DISC_ANCS_SERVICE);
+ GattProcReq(GATT_PROC_DISC_ALL_PRIMARY_SERVICES);
+ GattProcReq(GATT_PROC_DISC_ALL_CHARS);
+ GattProcReq(GATT_PROC_DISC_ALL_DESCS);
+
+ APP_DBG_MSG("Peer_Bonded=%d Security_Mode= %d, Security_Level= %d \n\r", ancs_context.Peer_Bonded, ancs_context.Security_Mode,ancs_context.Security_Level);
+ if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ if( (ancs_context.Peer_Bonded == 0x00) ||
+ ( (ancs_context.Peer_Bonded == 0x01) && (ancs_context.Security_Mode == 0x01) && (ancs_context.Security_Level == 0x01) )
+ )
+ {
+ GapProcReq(GAP_PROC_SLAVE_SECURITY_REQ);
+
+ APP_DBG_MSG("waiting for EVT_BLUE_GAP_PAIRING_CMPLT \n\r");
+ gap_cmd_resp_wait(GAP_DEFAULT_TIMEOUT);/* waiting for EVT_BLUE_GAP_PAIRING_CMPLT */
+ APP_DBG_MSG("waited for EVT_BLUE_GAP_PAIRING_CMPLT \n\r");
+ }
+ }
+
+ GattProcReq(GATT_PROC_ENABLE_ALL_NOTIFICATIONS);
+ }
+ break;
+
+
+ case ANCS_GET_NOTIFICATION_ATTRIBUTE:
+ {
+ AncsProcReq(ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE);
+ }
+ break;
+
+ case ANCS_GET_APP_ATTRIBUTE:
+ {
+ AncsProcReq(ANCS_PROC_GET_APP_ATTRIBUTE);
+ }
+ break;
+
+ case ANCS_PERFORM_NOTIFICATION_ACTION:
+ {
+ AncsProcReq(ANCS_PROC_PERFORM_NOTIFICATION_ACTION);
+ }
+ break;
+
+ default:
+ {
+ APP_DBG_MSG("invalid ancs_context.state=%d \n\r",ancs_context.state);
+ }
+ break;
+ }
+}
+
+static void GapProcReq(GapProcId_t GapProcId)
+{
+ tBleStatus status;
+ uint8_t Security_Mode, Security_Level;
+
+ switch(GapProcId)
+ {
+ case GAP_PROC_SLAVE_SECURITY_REQ:
+ {
+ ancs_context.state = ANCS_SECURITY_REQUEST;
+ status = aci_gap_get_security_level(ancs_context.connection_handle,&Security_Mode,&Security_Level);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST Security_Mode= %d, Security_Level= %d \n", Security_Mode, Security_Level);
+ status = aci_gap_slave_security_req(ancs_context.connection_handle);
+ if (status != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST aci_gap_slave_security_req status=0x%02x \n\r",status);
+ }
+
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST waiting for EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \n\r");
+ gap_cmd_resp_wait(GAP_DEFAULT_TIMEOUT);/* waiting for EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
+ APP_DBG_MSG("ANCS_SECURITY_REQUEST waited for EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \n\r");
+ }
+ }
+ break;
+
+ case GAP_PROC_PASS_KEY_RESPONSE:
+ {
+ ancs_context.state = ANCS_PASS_KEY_RESPONSE;
+ APP_DBG_MSG("ANCS_PASS_KEY_RESPONSE \n\r");
+ aci_gap_pass_key_resp(ancs_context.connection_handle, CFG_FIXED_PIN);/* response for EVT_BLUE_GAP_PASS_KEY_REQUEST */
+ }
+ break;
+
+ case GAP_PROC_ALLOW_REBOND:
+ {
+ ancs_context.state = ANCS_ALLOW_REBOND;
+ APP_DBG_MSG("ANCS_ALLOW_REBOND aci_gap_allow_rebond(0x%04X)\n\r",ancs_context.connection_handle);
+ aci_gap_allow_rebond(ancs_context.connection_handle);/* response for EVT_BLUE_GAP_BOND_LOST */
+ }
+ break;
+
+ case GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM:
+ {
+ ancs_context.state = ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM;
+ aci_gap_numeric_comparison_value_confirm_yesno(ancs_context.connection_handle, 1); /* CONFIRM_YES = 1 */
+
+ APP_DBG_MSG("GAP_PROC_NUMERIC_COMPARISON_VALUE_CONFIRM ** aci_gap_numeric_comparison_value_confirm_yesno-->YES \n");
+ }
+ break;
+
+ case GAP_PROC_TERMINATE_CONNECTION:
+ {
+ APP_DBG_MSG("terminate connection \n");
+ ancs_context.state = ANCS_DISCONNECTING;
+ status = aci_gap_terminate(ancs_context.connection_handle,0x13);
+ if (status != BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Term Connection cmd failure: 0x%x\n", status);
+ }
+ gap_cmd_resp_wait(GAP_DEFAULT_TIMEOUT);
+
+ APP_DBG_MSG("GAP_PROC_TERMINATE_CONNECTION complete event received\n");
+ }
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+static void GattProcReq(GattProcId_t GattProcId)
+{
+ tBleStatus result = BLE_STATUS_SUCCESS;
+
+ switch (GattProcId)
+ {
+ case GATT_PROC_MTU_UPDATE:
+ {
+ ancs_context.state = ANCS_SET_DATA_LENGTH;
+ result = hci_le_set_data_length(ancs_context.connection_handle,CFG_BLE_MAX_ATT_MTU,CFG_BLE_MAX_ATT_MTU_TX_TIME);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_SET_DATA_LENGTH set data length %d %d ok ==>aci_gatt_exchange_config \n",CFG_BLE_MAX_ATT_MTU,CFG_BLE_MAX_ATT_MTU_TX_TIME);
+ ancs_context.state = ANCS_MTU_UPDATE;
+ result = aci_gatt_exchange_config(ancs_context.connection_handle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("aci_gatt_exchange_config cmd ok \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("aci_gatt_exchange_config cmd KO result=0x%02x \n\r",result);
+ }
+ }
+ }
+ break; /* GATT_PROC_MTU_UPDATE */
+
+ case GATT_PROC_DISC_ANCS_SERVICE:
+ {
+ ancs_context.state = ANCS_DISCOVER_ANCS_SERVICE;
+ /* discover ancs service for discover notification source / data source / control point characteristic */
+ UUID_t ancs_service_uuid;
+ COPY_ANCS_SERVICE_UUID(ancs_service_uuid.UUID_128);
+ result = aci_gatt_disc_primary_service_by_uuid(ancs_context.connection_handle,UUID_TYPE_128,(UUID_t *)&ancs_service_uuid);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE aci_gatt_disc_primary_service_by_uuid cmd ok\n");
+ }
+ else
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE aci_gatt_disc_primary_service_by_uuid cmd NOK status =0x%02X \n",result);
+ }
+
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if ( (ancs_context.ANCSServiceStartHandle == 0x0000) && (ancs_context.ANCSServiceEndHandle == 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE ANCS Service is NOT found !!! ==> connected to Android Phone/Pad \n\r");
+ }
+ else if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ANCS_SERVICE ANCS Service [0x%04X - 0x%04X] is found !!! ==> connected to iOS Phone/Pad \n\r",ancs_context.ANCSServiceStartHandle,ancs_context.ANCSServiceEndHandle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ANCS_SERVICE */
+
+ case GATT_PROC_DISC_ALL_PRIMARY_SERVICES:
+ {
+ ancs_context.state = ANCS_DISCOVER_ALL_SERVICES;
+ /* discover all services */
+ result = aci_gatt_disc_all_primary_services(ancs_context.connection_handle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES ALL services discovered Successfully \n");
+ }
+ else
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES aci_gatt_disc_all_primary_services cmd NOK status =0x%02X \n",result);
+ }
+
+ if ( (ancs_context.ANCSServiceStartHandle == 0x0000) && (ancs_context.ANCSServiceEndHandle == 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES ANCS Service is NOT found !!! \n\r");
+ }
+ else if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES ANCS Service [0x%04X - 0x%04X] is found !!! \n\r",ancs_context.ANCSServiceStartHandle,ancs_context.ANCSServiceEndHandle);
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_PRIMARY_SERVICES GATT Service [0x%04X - 0x%04X] is found !!! \n\r",ancs_context.GATTServiceStartHandle,ancs_context.GATTServiceEndHandle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ALL_PRIMARY_SERVICES */
+
+ case GATT_PROC_DISC_ALL_CHARS:
+ {
+ ancs_context.state = ANCS_DISCOVER_ALL_CHARS;
+ APP_DBG_MSG("ANCS_DISCOVER_ALL_CHARS connection_handle=0x%04X ALLServiceHandle[%04X - %04X] ANCSServiceHandle[%04X - %04X]\n",
+ ancs_context.connection_handle,
+ ancs_context.ALLServiceStartHandle, ancs_context.ALLServiceEndHandle,
+ ancs_context.ANCSServiceStartHandle, ancs_context.ANCSServiceStartHandle);
+
+ result = aci_gatt_disc_all_char_of_service(
+ ancs_context.connection_handle,
+ ancs_context.ALLServiceStartHandle,
+ ancs_context.ALLServiceEndHandle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ALL characteristics discovered Successfully \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("ALL characteristics discovery Failed \n\r");
+ }
+
+ if( (ancs_context.ANCSNotificationSourceCharStartHdle != 0x0000) && (ancs_context.ANCSNotificationSourceCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ANCSNotificationSourceCharStartHdle=0x%04X ANCSNotificationSourceCharValueHdle=0x%04X \n\r",ancs_context.ANCSNotificationSourceCharStartHdle,ancs_context.ANCSNotificationSourceCharValueHdle);
+ }
+ if( (ancs_context.ANCSDataSourceCharStartHdle!= 0x0000) && (ancs_context.ANCSDataSourceCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ANCSDataSourceCharStartHdle=0x%04X ANCSDataSourceCharValueHdle=0x%04X \n\r",ancs_context.ANCSDataSourceCharStartHdle,ancs_context.ANCSDataSourceCharValueHdle);
+ }
+ if( (ancs_context.ANCSControlPointCharStartHdle!= 0x0000) && (ancs_context.ANCSControlPointCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ANCSControlPointCharStartHdle=0x%04X ANCSControlPointCharValueHdle=0x%04X \n\r",ancs_context.ANCSControlPointCharStartHdle,ancs_context.ANCSControlPointCharValueHdle);
+ }
+ if( (ancs_context.ServiceChangedCharStartHdle != 0x0000) && (ancs_context.ServiceChangedCharValueHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_CHARS ServiceChangedCharStartHdle=0x%04X ServiceChangedCharValueHdle=0x%04X \n\r",ancs_context.ServiceChangedCharStartHdle,ancs_context.ServiceChangedCharValueHdle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ALL_CHARS */
+
+ case GATT_PROC_DISC_ALL_DESCS:
+ {
+ ancs_context.state = ANCS_DISCOVER_ALL_CHAR_DESCS;
+ APP_DBG_MSG("ANCS_DISCOVER_ALL_CHAR_DESCS [%04X - %04X]\n",
+ ancs_context.ALLServiceStartHandle,
+ ancs_context.ALLServiceEndHandle);
+ result = aci_gatt_disc_all_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ALLServiceStartHandle,
+ ancs_context.ALLServiceEndHandle);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("All characteristic descriptors discovered Successfully \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("All characteristic descriptors discovery Failed \n\r");
+ }
+
+ if( (ancs_context.ANCSNotificationSourceCharDescHdle!= 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ANCSNotificationSourceCharDescHdle=0x%04X \n\r",ancs_context.ANCSNotificationSourceCharDescHdle);
+ }
+ if( (ancs_context.ANCSControlPointCharDescHdle!= 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ANCSControlPointCharDescHdle=0x%04X \n\r",ancs_context.ANCSControlPointCharDescHdle);
+ }
+ if( (ancs_context.ANCSDataSourceCharDescHdle!= 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ANCSDataSourceCharDescHdle=0x%04X \n\r",ancs_context.ANCSDataSourceCharDescHdle);
+ }
+ if( (ancs_context.ServiceChangedCharDescHdle != 0x0000) )
+ {
+ APP_DBG_MSG("GATT_PROC_DISC_ALL_DESCS ServiceChangedCharDescHdle=0x%04X \n\r",ancs_context.ServiceChangedCharDescHdle);
+ }
+ }
+ break; /* GATT_PROC_DISC_ALL_DESCS */
+
+ case GATT_PROC_ENABLE_ALL_NOTIFICATIONS:
+ {
+ uint16_t enable = 0x0001;
+
+ if(ancs_context.ServiceChangedCharDescHdle != 0x0000)
+ {
+ ancs_context.state = ANCS_ENABLE_NOTIFICATION_SERVICE_CHANGED_DESC;
+ result = aci_gatt_write_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ServiceChangedCharDescHdle,
+ 2,
+ (uint8_t *) &enable);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ServiceChangedCharDescHdle=0x%04X notification enabled Successfully \n\r",ancs_context.ServiceChangedCharDescHdle);
+ }
+ else
+ {
+ APP_DBG_MSG("ServiceChangedCharDescHdle=0x%04X notification enabled Failed BLE_STATUS_NOT_ALLOWED=0x%02x result=0x%02X\n",
+ ancs_context.ServiceChangedCharDescHdle,BLE_STATUS_NOT_ALLOWED,result);
+ }
+ }
+
+ if(ancs_context.ANCSDataSourceCharDescHdle != 0x0000)
+ {
+ ancs_context.state = ANCS_ENABLE_NOTIFICATION_DATA_SOURCE_DESC;
+ APP_DBG_MSG("ANCS_ENABLE_NOTIFICATION_DATA_SOURCE_DESC 0x%04X 0x%04X \n",
+ ancs_context.connection_handle,
+ ancs_context.ANCSDataSourceCharDescHdle);
+ result = aci_gatt_write_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ANCSDataSourceCharDescHdle,
+ 2,
+ (uint8_t *) &enable);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCSDataSourceCharDescHdle notification enabled Successfully \n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("ANCSDataSourceCharDescHdle=0x%04X notification enabled Failed BLE_STATUS_NOT_ALLOWED=0x%02x result=0x%02X\n",
+ ancs_context.ANCSDataSourceCharDescHdle,BLE_STATUS_NOT_ALLOWED,result);
+ }
+ }
+
+ if(ancs_context.ANCSNotificationSourceCharDescHdle != 0x0000)
+ {
+ ancs_context.state = ANCS_ENABLE_NOTIFICATION_NOTIFICATION_SOURCE_DESC;
+ APP_DBG_MSG("ANCS_ENABLE_NOTIFICATION_NOTIFICATION_SOURCE_DESC 0x%04X 0x%04X \n",
+ ancs_context.connection_handle,
+ ancs_context.ANCSNotificationSourceCharDescHdle);
+ result = aci_gatt_write_char_desc(
+ ancs_context.connection_handle,
+ ancs_context.ANCSNotificationSourceCharDescHdle,
+ 2,
+ (uint8_t *) &enable);
+ gatt_cmd_resp_wait(GATT_DEFAULT_TIMEOUT);
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCSNotificationSourceCharDescHdle notification enabled Successfully \n\r");
+ ancs_context.state = ANCS_INITIALIZED;
+ }
+ else
+ {
+ APP_DBG_MSG("ANCSNotificationSourceCharDescHdle notification enabled Failed result=0x%02X\n",result);
+ }
+ }
+ }
+ break; /* GATT_PROC_ENABLE_ALL_NOTIFICATIONS */
+
+ default:
+ break;
+ }
+}
+
+static void AncsProcReq(AncsProcId_t AncsProcId)
+{
+ switch (AncsProcId)
+ {
+
+ case ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE:
+ {
+ ancs_context.state = ANCS_GET_NOTIFICATION_ATTRIBUTE;
+ if ( (ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY) || (ancs_context.notifyEntry >= MAX_NMB_NOTIFY) )
+ {
+ APP_DBG_MSG("ANCS_GET_NOTIFICATION_ATTRIBUTE INVALID_NOTIFY_ENTRY %d \n\r",ancs_context.notifyEntry);
+ break;
+ }
+ else
+ {
+ APP_DBG_MSG("ANCS_GET_NOTIFICATION_ATTRIBUTE interact with iOS NotificationID 0x%08x, retrieve more information\n\r",
+ ancs_context.notifyList[ancs_context.notifyEntry].notifUID);
+ }
+
+ notificationAttr_type attr;
+ attr.UID = ancs_context.notifyList[ancs_context.notifyEntry].notifUID;
+ attr.appID_flag = TRUE;
+ attr.title_flag = TRUE;
+ attr.title_max_size = MAX_DATA_LEN;
+ attr.subtitle_flag = TRUE;
+ attr.subtitle_max_size = MAX_DATA_LEN;
+ attr.message_flag = TRUE;
+ attr.message_max_size = MAX_DATA_LEN;
+ attr.messageSize_flag = TRUE;
+ attr.date_flag = TRUE;
+ attr.positiveAction_flag = TRUE;
+ attr.negativeAction_flag = TRUE;
+
+ ANCS_Cmd_GetNotificationAttr(attr);
+ }
+ break; /* ANCS_PROC_GET_NOTIFICATION_ATTRIBUTE */
+
+ case ANCS_PROC_GET_APP_ATTRIBUTE:
+ {
+ ancs_context.state = ANCS_GET_APP_ATTRIBUTE;
+ APP_DBG_MSG("ANCS_GET_APP_ATTRIBUTE AppIdentifierLength=%d AppIdentifier:%s \n\r",
+ ancs_context.AppIdentifierLength,ancs_context.AppIdentifier);
+ ANCS_Cmd_GetAppAttr(ancs_context.AppIdentifierLength, (char*)ancs_context.AppIdentifier);
+ }
+ break; /* ANCS_PROC_GET_APP_ATTRIBUTE */
+
+ case ANCS_PROC_PERFORM_NOTIFICATION_ACTION:
+ {
+ ancs_context.state = ANCS_PERFORM_NOTIFICATION_ACTION;
+ ActionID actID = ActionIDPositive;
+ if ( (ancs_context.notifyEntry == INVALID_NOTIFY_ENTRY) || (ancs_context.notifyEntry >= MAX_NMB_NOTIFY) )
+ {
+ APP_DBG_MSG("ANCS_PERFORM_NOTIFICATION_ACTION INVALID_NOTIFY_ENTRY %d \n\r",ancs_context.notifyEntry);
+ break;
+ }
+ else
+ {
+ APP_DBG_MSG("ANCS_PERFORM_NOTIFICATION_ACTION notifyEntry=%d NotificationID 0x%08x actID=%d \n\r",
+ ancs_context.notifyEntry,ancs_context.notifyList[ancs_context.notifyEntry].notifUID,actID);
+ }
+
+ /*Here you can add interface to get actionID through UART input or button press */
+ actID = ANCS_App_Get_ActionID();
+ ANCS_Cmd_PerformNotificationAction(ancs_context.notifyList[ancs_context.notifyEntry].notifUID,actID);
+
+ APP_DBG_MSG("ANCS_PERFORM_NOTIFICATION_ACTION notifyEntry=%d Removed\n\r", ancs_context.notifyEntry);
+ ancs_context.notifyList[ancs_context.notifyEntry].used = FALSE;
+ }
+ break; /* ANCS_PROC_PERFORM_NOTIFICATION_ACTION */
+
+ default:
+ break;
+ }
+}
+
+void ANCS_App_Notification( Connection_Context_t *pNotification )
+{
+ uint8_t status = BLE_STATUS_SUCCESS;
+
+ switch (pNotification->Evt_Opcode)
+ {
+ case ANCS_CONNECTED:
+ {
+ ancs_context.connection_handle = pNotification->connection_handle; /* register */
+ ancs_context.state = ANCS_DISCOVER_ANCS_SERVICE;
+ APP_DBG_MSG("ANCS_CONNECTED ==> ANCS_DISCOVER_ANCS_SERVICE \n\r");
+
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_DISCONN_COMPLETE:
+ {
+ APP_DBG_MSG("ANCS_DISCONN_COMPLETE \n\r");
+ if(ancs_context.state == ANCS_DISCONNECTING)
+ gap_cmd_resp_release(0);
+
+ ancs_context.state = ANCS_DISCONN_COMPLETE;
+ ANCS_Client_Reset();
+ }
+ break;
+
+ case ANCS_PASS_KEY_REQUEST:
+ {
+ ancs_context.state = ANCS_PASS_KEY_RESPONSE;
+ APP_DBG_MSG("ANCS_PASS_KEY_REQUEST ==> ANCS_PASS_KEY_RESPONSE \n\r");
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM:
+ {
+ ancs_context.state = ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM;
+ APP_DBG_MSG("ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM \n\r");
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_SECURITY_INITIATED:
+ {
+ ancs_context.state = ANCS_SECURITY_INITIATED;
+ APP_DBG_MSG("ANCS_SECURITY_INITIATED \n\r");
+ gap_cmd_resp_release(0);
+ }
+ break;
+
+ case ANCS_PAIRING_COMPLETE:
+ {
+ uint8_t Security_Mode, Security_Level;
+
+ status = aci_gap_get_security_level(ancs_context.connection_handle,&Security_Mode,&Security_Level);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("ANCS_PAIRING_COMPLETE Peer_Bonded=%d Security_Mode=%d Security_Level=%d \n",ancs_context.Peer_Bonded, Security_Mode, Security_Level);
+ }
+
+ if (ancs_context.Peer_Bonded == 0x00)/* only for the first paring complete*/
+ {
+ status = aci_gap_is_device_bonded(ancs_context.Peer_Address_Type,ancs_context.Peer_Address);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ ancs_context.Peer_Bonded = 0x01;
+ }
+ else
+ {
+ ancs_context.Peer_Bonded = 0x00;
+ }
+
+ APP_DBG_MSG("ANCS_PAIRING_COMPLETE Peer_Bonded from 0x00 ==> %d Term Connection for the first pairing complete to save bonding infomation !!! \n\r",ancs_context.Peer_Bonded);
+
+ for (int loop=0;loop<10;loop++) /* */
+ {
+ /* hci_disconnection_complete_event event will be generated when the link is disconnected.
+ It is important to leave an 100 ms blank window before sending any new command (including system hardware reset),
+ since immediately after @ref hci_disconnection_complete_event event, system could save important information in non volatile memory. */
+ int cnt = 1000000;
+ while(cnt--);
+ printf(".\n\r");
+ }
+
+ status = aci_gap_terminate(ancs_context.connection_handle, 0x13);
+ if (status == BLE_STATUS_SUCCESS)
+ {
+ if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ {
+ ANCS_Client_Reset();
+ gap_cmd_resp_release(0);
+ }
+ }
+ }
+ else if(ancs_context.Peer_Bonded == 0x01)
+ {
+ if( (ancs_context.Security_Mode == 0x01) && (ancs_context.Security_Level == 0x01) )
+ {
+ if( (Security_Mode == 0x01) && (Security_Level >= 0x02) )
+ {
+ APP_DBG_MSG("ANCS_PAIRING_COMPLETE Security_Level=%d ==> Security_Level=%d \n\r",ancs_context.Security_Level,Security_Level);
+ ancs_context.Security_Level = Security_Level;
+ ancs_context.Security_Mode = Security_Mode;
+ }
+ }
+
+ if ( (ancs_context.ANCSServiceStartHandle != 0x0000) && (ancs_context.ANCSServiceEndHandle != 0x0000) )
+ gap_cmd_resp_release(0);
+ }
+ }
+ break; /* ANCS_PAIRING_COMPLETE */
+
+ case ANCS_ALLOW_REBOND:
+ {
+ ancs_context.state = ANCS_ALLOW_REBOND;
+ APP_DBG_MSG("ANCS_ALLOW_REBOND \n\r");
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_MTU_UPDATE:
+ {
+ APP_DBG_MSG("ANCS_MTU_UPDATE \n\r");
+ ancs_context.state = ANCS_MTU_UPDATE;
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_MTU_EXCHANGE_COMPLETE:
+ {
+ APP_DBG_MSG("ANCS_MTU_EXCHANGE_COMPLETE \n\r");
+ if(ancs_context.state == ANCS_MTU_UPDATE)
+ gatt_cmd_resp_release(0);
+
+ ancs_context.state = ANCS_MTU_EXCHANGE_COMPLETE;
+ }
+ break;
+
+ case ANCS_DISCOVER_ANCS_SERVICE:
+ {
+ APP_DBG_MSG("ANCS_DISCOVER_ANCS_SERVICE \n\r");
+ ancs_context.state = ANCS_DISCOVER_ANCS_SERVICE;
+ Ancs_Mgr();
+ }
+ break;
+
+ case ANCS_CHECK_NOTIFICATION:
+ {
+ ancs_context.state = ANCS_CHECK_NOTIFICATION;
+ APP_DBG_MSG(" ==> ANCS_CHECK_NOTIFICATION \n\r");
+
+ for (uint8_t idx=0; idx<MAX_NMB_NOTIFY; idx++)
+ {
+ if (ancs_context.notifyList[idx].used)
+ {
+ ANCS_Notification_Check(ancs_context.notifyList[idx].evFlag);
+ Ancs_Mgr();
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.h
new file mode 100644
index 000000000..3a079463b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.h
@@ -0,0 +1,288 @@
+
+/**
+ ******************************************************************************
+ * @file ancs_client_app.h
+ * @author MCD Application Team
+ * @brief Header for ancs_client_app.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __ANCS_APPLICATION_H
+#define __ANCS_APPLICATION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ *@addtogroup ANCS ANCS
+ *@brief ANCS Profile.
+ *@{
+ */
+
+/**
+ *@defgroup ANCS_defines ANCS defines
+ *@brief List of constant used in the ANCS.
+ *@{
+ */
+
+/**
+ * @anchor CategoryIDs
+ * @name Category ID values
+ * @{
+ */
+typedef enum {
+ CategoryIDOther = 0,
+ CategoryIDIncomingCall = 1,
+ CategoryIDMissedCall = 2,
+ CategoryIDVoicemail = 3,
+ CategoryIDSocial = 4,
+ CategoryIDSchedule = 5,
+ CategoryIDEmail = 6,
+ CategoryIDNews = 7,
+ CategoryIDHealthAndFitness = 8,
+ CategoryIDBusinessAndFinance = 9,
+ CategoryIDLocation = 10,
+ CategoryIDEntertainment = 11,
+} CategoryID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor EventIDs
+ * @name Event ID values
+ * @{
+ */
+typedef enum {
+ EventIDNotificationAdded = 0,
+ EventIDNotificationModified = 1,
+ EventIDNotificationRemoved = 2,
+} EventID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor EventFlags
+ * @name Event Flag values
+ * @{
+ */
+typedef enum {
+ EventFlagSilent = (1 << 0),
+ EventFlagImportant = (1 << 1),
+ EventFlagPreExisting = (1 << 2),
+ EventFlagPositiveAction = (1 << 3),
+ EventFlagNegativeAction = (1 << 4),
+} EventFlags;
+/**
+ * @}
+ */
+
+/**
+ * @anchor CommandIDs to control point characteristic commands
+ * @name Command ID values
+ * @{
+ */
+typedef enum {
+ CommandIDGetNotificationAttributes = 0,
+ CommandIDGetAppAttributes = 1,
+ CommandIDPerformNotificationAction = 2,
+} CommandID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor NotificationAttributeIDs for Get Notification Attribute command
+ * @name Notification Attribute ID values for Get notifications attributes command
+ * @{
+ */
+typedef enum {
+ NotificationAttributeIDAppIdentifier = 0,
+ NotificationAttributeIDTitle = 1,
+ NotificationAttributeIDSubtitle = 2,
+ NotificationAttributeIDMessage = 3,
+ NotificationAttributeIDMessageSize = 4,
+ NotificationAttributeIDDate = 5,
+ NotificationAttributeIDPositiveActionLabel = 6,
+ NotificationAttributeIDNegativeActionLabel = 7,
+} NotificationAttributeID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor ActionIDs
+ * @name Action ID values
+ * @{
+ */
+typedef enum {
+ ActionIDPositive = 0,
+ ActionIDNegative = 1,
+}ActionID;
+/**
+ * @}
+ */
+
+/**
+ * @anchor AppAttributeIDs for Get App Attribute command
+ * @name App Attribute ID values
+ * @{
+ */
+typedef enum {
+ AppAttributeIDDisplayName = 0,
+} AppAttributeID;
+/**
+ * @}
+ */
+
+
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ *@defgroup ANCS_NotifType ANCS Notification Attribute Types
+ *@brief ANCS notification attributes types.
+ *@{
+ */
+
+/**
+ * @anchor notificationAttrS
+ * @name Notification Attributes typedef
+ * @{
+ */
+typedef struct notificationAttrS {
+ /** A 32-bit numerical value that is the unique identifier (UID) for the iOS notification. This
+ * value can be used as a handle in commands sent to the Control Point characteristic to interact with the
+ * iOS notification.
+ */
+ uint32_t UID;
+ /** App Identifer flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t appID_flag;
+ /** Title flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t title_flag;
+ /** Max title length parameter */
+ uint16_t title_max_size;
+ /** Subtitle flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t subtitle_flag;
+ /** Max Subtitle length paramter */
+ uint16_t subtitle_max_size;
+ /** Message flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t message_flag;
+ /** Max Message length parameter */
+ uint16_t message_max_size;
+ /** Message size flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t messageSize_flag;
+ /** Data flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t date_flag;
+ /** Positive Action flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t positiveAction_flag;
+ /** Negative Action flag, if TRUE this attribute is requested from the Get Notification Attributes command */
+ uint8_t negativeAction_flag;
+} notificationAttr_type;
+/**
+ * @}
+ */
+
+/*-------------------------------------------------------------------------*/
+ /**
+ * Data Transfer structure (ie. Connection events state)
+ */
+
+ typedef enum
+{
+ ANCS_UNINITIALIZED = 0x00,
+ ANCS_INITIALIZED = 0x01,
+
+ ANCS_IDLE,
+ ANCS_CONNECTED, /* Connection_Evt: ANCS_CONNECTION_ESTABLISHED */
+ ANCS_DISCONNECTING, /* Connection_Evt */
+ ANCS_DISCONN_COMPLETE, /* Connection_Evt */
+
+ ANCS_SET_DATA_LENGTH, /* Connection_Evt */
+ ANCS_MTU_UPDATE, /* Connection_Evt */
+ ANCS_MTU_EXCHANGE_COMPLETE, /* Connection_Evt */
+
+ ANCS_SECURITY_REQUEST,
+ ANCS_SECURITY_INITIATED,
+ ANCS_ALLOW_REBOND,
+ ANCS_PAIRING_COMPLETE, /* Connection_Evt */
+
+ ANCS_PASS_KEY_REQUEST, /* Connection_Evt: ANCS_PASSKEY_REQ_EVT */
+ ANCS_PASS_KEY_RESPONSE,
+
+ ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM,
+
+ ANCS_DISCOVER_ALL_SERVICES,
+ ANCS_DISCOVER_ANCS_SERVICE,
+ ANCS_DISCOVER_ALL_CHARS,
+ ANCS_DISCOVER_ALL_CHAR_DESCS,
+ ANCS_ENABLE_NOTIFICATION_NOTIFICATION_SOURCE_DESC,
+ ANCS_ENABLE_NOTIFICATION_DATA_SOURCE_DESC,
+ ANCS_ENABLE_NOTIFICATION_SERVICE_CHANGED_DESC,
+
+ ANCS_GET_NOTIFICATION_ATTRIBUTE,
+ ANCS_GET_APP_ATTRIBUTE,
+ ANCS_PERFORM_NOTIFICATION_ACTION,
+ ANCS_CHECK_NOTIFICATION,
+
+} ANCS_ProfileState;
+
+typedef struct
+{
+ /**
+ * state of the Data Transfer (state machine)
+ */
+
+ ANCS_ProfileState Evt_Opcode;
+ /**
+ * connection handle
+ */
+ uint16_t connection_handle;
+
+} Connection_Context_t;
+
+/*-------------------------------------------------------------------------*/
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+
+void ANCS_Client_App_Init(void);
+void ANCS_App_KeyButton1Action(void);
+void ANCS_App_KeyButton2Action(void);
+void ANCS_App_KeyButton3Action(void);
+void ANCS_App_Peer_Bonded_Check(uint16_t Connection_Handle, uint8_t Peer_Address_Type, uint8_t Peer_Address[6]);
+void ANCS_App_Notification( Connection_Context_t *pNotification );
+void ANCS_App_Remove_Bonding_Info(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__ANCS_APPLICATION_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..a5fe3f7b9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1125 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.c
+ * @author MCD Application Team
+ * @brief BLE Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+
+#include "stm32_seq.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+#include "dis_app.h"
+#include "hrs_app.h"
+#include "ancs_client_app.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+
+/**
+ * security parameters structure
+ */
+typedef struct _tSecurityParams
+{
+ /**
+ * IO capability of the device
+ */
+ uint8_t ioCapability;
+
+ /**
+ * Authentication requirement of the device
+ * Man In the Middle protection required?
+ */
+ uint8_t mitm_mode;
+
+ /**
+ * bonding mode of the device
+ */
+ uint8_t bonding_mode;
+
+ /**
+ * Flag to tell whether OOB data has
+ * to be used during the pairing process
+ */
+ uint8_t OOB_Data_Present;
+
+ /**
+ * OOB data to be used in the pairing process if
+ * OOB_Data_Present is set to TRUE
+ */
+ uint8_t OOB_Data[16];
+
+ /**
+ * this variable indicates whether to use a fixed pin
+ * during the pairing process or a passkey has to be
+ * requested to the application during the pairing process
+ * 0 implies use fixed pin and 1 implies request for passkey
+ */
+ uint8_t Use_Fixed_Pin;
+
+ /**
+ * minimum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMin;
+
+ /**
+ * maximum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMax;
+
+ /**
+ * fixed pin to be used in the pairing process if
+ * Use_Fixed_Pin is set to 1
+ */
+ uint32_t Fixed_Pin;
+
+ /**
+ * this flag indicates whether the host has to initiate
+ * the security, wait for pairing or does not have any security
+ * requirements.\n
+ * 0x00 : no security required
+ * 0x01 : host should initiate security by sending the slave security
+ * request command
+ * 0x02 : host need not send the clave security request but it
+ * has to wait for paiirng to complete before doing any other
+ * processing
+ */
+ uint8_t initiateSecurity;
+}tSecurityParams;
+
+/**
+ * global context
+ * contains the variables common to all
+ * services
+ */
+typedef struct _tBLEProfileGlobalContext
+{
+
+ /**
+ * security requirements of the host
+ */
+ tSecurityParams bleSecurityParam;
+
+ /**
+ * gap service handle
+ */
+ uint16_t gapServiceHandle;
+
+ /**
+ * device name characteristic handle
+ */
+ uint16_t devNameCharHandle;
+
+ /**
+ * appearance characteristic handle
+ */
+ uint16_t appearanceCharHandle;
+
+ /**
+ * connection handle of the current active connection
+ * When not in connection, the handle is set to 0xFFFF
+ */
+ uint16_t connectionHandle;
+
+ /**
+ * length of the UUID list to be used while advertising
+ */
+ uint8_t advtServUUIDlen;
+
+ /**
+ * the UUID list to be used while advertising
+ */
+ uint8_t advtServUUID[100];
+
+}BleGlobalContext_t;
+
+typedef struct
+{
+ BleGlobalContext_t BleApplicationContext_legacy;
+ APP_BLE_ConnStatus_t Device_Connection_Status;
+ uint16_t connection_handle;
+ uint8_t Peer_Bonded;
+ uint8_t Peer_Address_Type;
+ uint8_t Peer_Address[6];
+ /**
+ * ID of the Advertising Timeout
+ */
+ uint8_t Advertising_mgr_timer_Id;
+
+}BleApplicationContext_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define APPBLE_GAP_DEVICE_NAME_LENGTH 7
+#define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
+#define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
+
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* USER CODE BEGIN PD */
+#define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
+
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+ {
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+ };
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
+
+/**
+ * These are the two tags used to manage a power failure during OTA
+ * The MagicKeywordAdress shall be mapped @0x140 from start of the binary image
+ * The MagicKeywordvalue is checked in the ble_ota application
+ */
+PLACE_IN_SECTION("TAG_OTA_END") const uint32_t MagicKeywordValue = 0x94448A29 ;
+PLACE_IN_SECTION("TAG_OTA_START") const uint32_t MagicKeywordAddress = (uint32_t)&MagicKeywordValue;
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static uint16_t AdvIntervalMin, AdvIntervalMax;
+
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME ,'H','R','a','n','c'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ 0x00 /* Generic*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+
+};
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+static void BLE_UserEvtRx( void * pPayload );
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
+static void Ble_Tl_Init( void );
+static void Ble_Hci_Gap_Gatt_Init(void);
+static const uint8_t* BleGetBdAddress( void );
+static void Adv_Request( APP_BLE_ConnStatus_t New_Status );
+static void Add_Advertisment_Service_UUID( uint16_t servUUID );
+static void Adv_Mgr( void );
+static void Adv_Update( void );
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init_1 */
+
+/* USER CODE END APP_BLE_Init_1 */
+ SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet =
+ {
+ {{0,0,0}}, /**< Header unused */
+ {0, /** pBleBufferAddress not used */
+ 0, /** BleBufferSize not used */
+ CFG_BLE_NUM_GATT_ATTRIBUTES,
+ CFG_BLE_NUM_GATT_SERVICES,
+ CFG_BLE_ATT_VALUE_ARRAY_SIZE,
+ CFG_BLE_NUM_LINK,
+ CFG_BLE_DATA_LENGTH_EXTENSION,
+ CFG_BLE_PREPARE_WRITE_LIST_SIZE,
+ CFG_BLE_MBLOCK_COUNT,
+ CFG_BLE_MAX_ATT_MTU,
+ CFG_BLE_SLAVE_SCA,
+ CFG_BLE_MASTER_SCA,
+ CFG_BLE_LSE_SOURCE,
+ CFG_BLE_MAX_CONN_EVENT_LENGTH,
+ CFG_BLE_HSE_STARTUP_TIME,
+ CFG_BLE_VITERBI_MODE,
+ CFG_BLE_LL_ONLY,
+ 0}
+ };
+
+ /**
+ * Initialize Ble Transport Layer
+ */
+ Ble_Tl_Init( );
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+
+ /**
+ * Register the hci transport layer to handle BLE User Asynchronous Events
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, hci_user_evt_proc);
+
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ /**
+ * Initialization of HCI & GATT & GAP layer
+ */
+ Ble_Hci_Gap_Gatt_Init();
+
+ /**
+ * Initialization of the BLE Services
+ */
+ SVCCTL_Init();
+
+ /**
+ * Initialization of the BLE App Context
+ */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
+ /**
+ * From here, all initialization are BLE application specific
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_UPDATE_ID, UTIL_SEQ_RFU, Adv_Update);
+
+ /**
+ * Initialization of ADV - Ad Manufacturer Element - Support OTA Bit Mask
+ */
+#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
+ manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
+#endif
+ /**
+ * Initialize DIS Application
+ */
+ DISAPP_Init();
+
+ /**
+ * Initialize HRS Application
+ */
+ HRSAPP_Init();
+
+ /**
+ * Initialize ANCS Application
+ */
+ ANCS_Client_App_Init();
+
+ /**
+ * Create timer to handle the connection state machine
+ */
+
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(BleApplicationContext.Advertising_mgr_timer_Id), hw_ts_SingleShot, Adv_Mgr);
+
+ /**
+ * Make device discoverable
+ */
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[0] = AD_TYPE_16_BIT_SERV_UUID;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen = 1;
+ Add_Advertisment_Service_UUID(HEART_RATE_SERVICE_UUID);
+ /* Initialize intervals for reconnexion without intervals update */
+ AdvIntervalMin = CFG_FAST_CONN_ADV_INTERVAL_MIN;
+ AdvIntervalMax = CFG_FAST_CONN_ADV_INTERVAL_MAX;
+
+ /**
+ * Start to Advertise to be connected by Collector
+ */
+ Adv_Request(APP_BLE_FAST_ADV);
+
+/* USER CODE BEGIN APP_BLE_Init_2 */
+
+/* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
+{
+ hci_event_pckt *event_pckt;
+ evt_le_meta_event *meta_evt;
+ evt_blue_aci *blue_evt;
+ hci_le_phy_update_complete_event_rp0 *evt_le_phy_update_complete;
+ uint8_t TX_PHY, RX_PHY;
+ tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
+ Connection_Context_t Notification;
+
+ event_pckt = (hci_event_pckt*) ((hci_uart_pckt *) pckt)->data;
+
+ switch (event_pckt->evt)
+ {
+ case EVT_DISCONN_COMPLETE:
+ {
+ hci_disconnection_complete_event_rp0 *disconnection_complete_event;
+ disconnection_complete_event = (hci_disconnection_complete_event_rp0 *) event_pckt->data;
+
+ if (disconnection_complete_event->Connection_Handle == BleApplicationContext.BleApplicationContext_legacy.connectionHandle)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0;
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+
+ if(disconnection_complete_event->Reason == ERR_CMD_SUCCESS){
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X sucess \n\r",disconnection_complete_event->Reason);
+ }else if(disconnection_complete_event->Reason == HCI_CONNECTION_TERMINATED_BY_LOCAL_HOST_ERR_CODE){
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X Connection terminated by local host \n\r",disconnection_complete_event->Reason);
+ }else if(disconnection_complete_event->Reason == HCI_CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE_ERR_CODE){
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X Connection terminated due to MIC failure \n\r",disconnection_complete_event->Reason);
+ ANCS_App_Remove_Bonding_Info();
+ }else{
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT disconnection Reason=0x%02X \n\r",disconnection_complete_event->Reason);
+ }
+
+ Notification.Evt_Opcode = ANCS_DISCONN_COMPLETE;
+ Notification.connection_handle = disconnection_complete_event->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+
+ /* restart advertising */
+ Adv_Request(APP_BLE_FAST_ADV);
+ /* USER CODE BEGIN EVT_DISCONN_COMPLETE */
+
+ /* USER CODE END EVT_DISCONN_COMPLETE */
+ }
+
+ break; /* EVT_DISCONN_COMPLETE */
+
+ case EVT_LE_META_EVENT:
+ {
+ meta_evt = (evt_le_meta_event*) event_pckt->data;
+ /* USER CODE BEGIN EVT_LE_META_EVENT */
+
+ /* USER CODE END EVT_LE_META_EVENT */
+ switch (meta_evt->subevent)
+ {
+ case EVT_LE_CONN_UPDATE_COMPLETE:
+ {
+ APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \n");
+
+ /* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
+ hci_le_connection_update_complete_event_rp0 *connection_update_complete = (hci_le_connection_update_complete_event_rp0 *) meta_evt->data;
+ APP_DBG_MSG("EVT_LE_CONN_UPDATE_COMPLETE Status=0x%02X Connection_Handle=0x%04X Conn_Interval=0x%04X Conn_Latency=0x%04X Supervision_Timeout=0x%04X \n\r",
+ connection_update_complete->Status,connection_update_complete->Connection_Handle,connection_update_complete->Conn_Interval,connection_update_complete->Conn_Latency,connection_update_complete->Supervision_Timeout);
+ /* USER CODE END EVT_LE_CONN_UPDATE_COMPLETE */
+ }
+ break;
+ case EVT_LE_PHY_UPDATE_COMPLETE:
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE \n");
+ evt_le_phy_update_complete = (hci_le_phy_update_complete_event_rp0*)meta_evt->data;
+ if (evt_le_phy_update_complete->Status == 0)
+ {
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status ok \n");
+ }
+ else
+ {
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \n");
+ }
+
+ ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Read_PHY success \n");
+
+ if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ else
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ }
+ else
+ {
+ APP_DBG_MSG("Read conf not succeess \n");
+ }
+ /* USER CODE BEGIN EVT_LE_PHY_UPDATE_COMPLETE */
+
+ /* USER CODE END EVT_LE_PHY_UPDATE_COMPLETE */
+ break;
+ case EVT_LE_CONN_COMPLETE:
+ {
+ hci_le_connection_complete_event_rp0 *connection_complete_event;
+
+ /**
+ * The connection is done, there is no need anymore to schedule the LP ADV
+ */
+ connection_complete_event = (hci_le_connection_complete_event_rp0 *) meta_evt->data;
+
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+
+ if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
+ {
+ /* Connection as client */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
+ }
+ else
+ {
+ /* Connection as server */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
+ }
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = connection_complete_event->Connection_Handle;
+ /* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */
+ APP_DBG_MSG("EVT_LE_CONN_COMPLETE Connection_Handle=0x%04X Role=%d Peer_Address_Type=%d Peer_Address:%02X %02X %02X %02X %02X %02X \n\r",
+ connection_complete_event->Connection_Handle,
+ connection_complete_event->Role,
+ connection_complete_event->Peer_Address_Type,
+ connection_complete_event->Peer_Address[5],
+ connection_complete_event->Peer_Address[4],
+ connection_complete_event->Peer_Address[3],
+ connection_complete_event->Peer_Address[2],
+ connection_complete_event->Peer_Address[1],
+ connection_complete_event->Peer_Address[0]);
+
+ BleApplicationContext.connection_handle = connection_complete_event->Connection_Handle;
+
+ BleApplicationContext.Peer_Address_Type = connection_complete_event->Peer_Address_Type;
+ BleApplicationContext.Peer_Address[5] = connection_complete_event->Peer_Address[5];
+ BleApplicationContext.Peer_Address[4] = connection_complete_event->Peer_Address[4];
+ BleApplicationContext.Peer_Address[3] = connection_complete_event->Peer_Address[3];
+ BleApplicationContext.Peer_Address[2] = connection_complete_event->Peer_Address[2];
+ BleApplicationContext.Peer_Address[1] = connection_complete_event->Peer_Address[1];
+ BleApplicationContext.Peer_Address[0] = connection_complete_event->Peer_Address[0];
+ ANCS_App_Peer_Bonded_Check(connection_complete_event->Connection_Handle, connection_complete_event->Peer_Address_Type, connection_complete_event->Peer_Address);
+
+ Notification.Evt_Opcode = ANCS_CONNECTED;
+ Notification.connection_handle = connection_complete_event->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ /* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
+ }
+ break; /* HCI_EVT_LE_CONN_COMPLETE */
+
+ default:
+ /* USER CODE BEGIN SUBEVENT_DEFAULT */
+
+ /* USER CODE END SUBEVENT_DEFAULT */
+ break;
+ }
+ }
+ break; /* HCI_EVT_LE_META_EVENT */
+
+ case EVT_VENDOR:
+ blue_evt = (evt_blue_aci*) event_pckt->data;
+ /* USER CODE BEGIN EVT_VENDOR */
+
+ /* USER CODE END EVT_VENDOR */
+ switch (blue_evt->ecode)
+ {
+ /* USER CODE BEGIN ecode */
+ aci_gap_pairing_complete_event_rp0 *pairing_complete;
+
+ case EVT_BLUE_GAP_LIMITED_DISCOVERABLE:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_LIMITED_DISCOVERABLE \n");
+ break; /* EVT_BLUE_GAP_LIMITED_DISCOVERABLE */
+
+ case EVT_BLUE_GAP_PASS_KEY_REQUEST:
+ {
+ aci_gap_pass_key_req_event_rp0 *gap_evt_pass_key_req = (aci_gap_pass_key_req_event_rp0*) blue_evt->data;
+ APP_DBG_MSG("EVT_BLUE_GAP_PASS_KEY_REQUEST ==> ANCS_PASS_KEY_REQUEST Connection_Handle=0x%04X \n\r",gap_evt_pass_key_req->Connection_Handle);
+ Notification.Evt_Opcode = ANCS_PASS_KEY_REQUEST;
+ Notification.connection_handle= gap_evt_pass_key_req->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+ break; /* EVT_BLUE_GAP_PASS_KEY_REQUEST */
+
+ case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_AUTHORIZATION_REQUEST \n");
+ break; /* EVT_BLUE_GAP_AUTHORIZATION_REQUEST */
+
+ case EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED:
+ {
+ APP_DBG_MSG("EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED slave security request is successfully sent to the master => ANCS_SECURITY_INITIATED \n");
+ Notification.Evt_Opcode = ANCS_SECURITY_INITIATED;
+ Notification.connection_handle= BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ ANCS_App_Notification(&Notification);
+ }
+ break; /* EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
+
+ case EVT_BLUE_GAP_BOND_LOST:
+ {
+ APP_DBG_MSG("EVT_BLUE_GAP_BOND_LOST ==> ANCS_ALLOW_REBOND \n\r");
+ Notification.Evt_Opcode = ANCS_ALLOW_REBOND;
+ Notification.connection_handle= BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ ANCS_App_Notification(&Notification);
+ }
+ break; /* EVT_BLUE_GAP_BOND_LOST */
+
+ case EVT_BLUE_GAP_DEVICE_FOUND:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
+ break; /* EVT_BLUE_GAP_DEVICE_FOUND */
+
+ case EVT_BLUE_GAP_ADDR_NOT_RESOLVED:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
+ break; /* EVT_BLUE_GAP_DEVICE_FOUND */
+
+ case (EVT_BLUE_GAP_KEYPRESS_NOTIFICATION):
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_KEYPRESS_NOTIFICATION \n");
+ break; /* EVT_BLUE_GAP_KEY_PRESS_NOTIFICATION */
+
+ case (EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE):
+ {
+ APP_DBG_MSG(" numeric_value = %d\n", ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
+ APP_DBG_MSG(" Hex_value = %x\n", ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
+
+ APP_DBG_MSG("EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE ==> ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM \n\r");
+ Notification.Evt_Opcode = ANCS_NUMERIC_COMPARISON_VALUE_CONFIRM;
+ Notification.connection_handle= BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ ANCS_App_Notification(&Notification);
+ }
+ break;
+
+ case (EVT_BLUE_GAP_PAIRING_CMPLT):
+ {
+ pairing_complete = (aci_gap_pairing_complete_event_rp0*)blue_evt->data;
+
+ APP_DBG_MSG("EVT_BLUE_GAP_PAIRING_CMPLT, Connection_Handle=0x%04X Status=%d Reason=0x%02x \n",pairing_complete->Connection_Handle,pairing_complete->Status,pairing_complete->Reason);
+ if(pairing_complete->Status == SM_PAIRING_SUCCESS){
+ APP_DBG_MSG(" ** Pairing OK \n");
+ }else if(pairing_complete->Status == SM_PAIRING_TIMEOUT){
+ APP_DBG_MSG(" ** Pairing Timeout Status=%d Reason=0x%02x , \n\r !!! Please ignore this BLE Device on the iOS/Android Device Setting=>Bluetooth=>My Device or Paired Device !!! \n\r",pairing_complete->Status,pairing_complete->Reason);
+ ANCS_App_Remove_Bonding_Info();
+ }else if(pairing_complete->Status == SM_PAIRING_FAILED){
+ APP_DBG_MSG(" ** Pairing KO Status=%d Reason=0x%02x , \n\r !!! Please ignore this BLE Device on the iOS/Android Device Setting=>Bluetooth=>My Device or Paired Device !!! \n\r",pairing_complete->Status,pairing_complete->Reason);
+ ANCS_App_Remove_Bonding_Info();
+ }
+
+ APP_DBG_MSG("EVT_BLUE_GAP_PAIRING_CMPLT ==> ANCS_PAIRING_COMPLETE \n\r");
+ Notification.Evt_Opcode = ANCS_PAIRING_COMPLETE;
+ Notification.connection_handle= pairing_complete->Connection_Handle;
+ ANCS_App_Notification(&Notification);
+ }
+ break;
+
+ case EVT_BLUE_GATT_PROCEDURE_COMPLETE:
+ APP_DBG_MSG(" ** EVT_BLUE_GATT_PROCEDURE_COMPLETE \n");
+ /* USER CODE BEGIN EVT_BLUE_GATT_PROCEDURE_COMPLETE */
+
+ /* USER CODE END EVT_BLUE_GATT_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GATT_PROCEDURE_COMPLETE */
+ /* USER CODE END ecode */
+ case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PROCEDURE_COMPLETE \n");
+ /* USER CODE BEGIN EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+
+ /* USER CODE END EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ }
+ break; /* EVT_VENDOR */
+
+ default:
+ /* USER CODE BEGIN ECODE_DEFAULT*/
+
+ /* USER CODE END ECODE_DEFAULT*/
+ break;
+ }
+
+ return (SVCCTL_UserEvtFlowEnable);
+}
+
+APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void)
+{
+ return BleApplicationContext.Device_Connection_Status;
+}
+
+/* USER CODE BEGIN FD*/
+void APP_BLE_Key_Button1_Action(void)
+{
+ ANCS_App_KeyButton1Action();
+}
+
+void APP_BLE_Key_Button2_Action(void)
+{
+ ANCS_App_KeyButton2Action();
+}
+
+void APP_BLE_Key_Button3_Action(void)
+{
+ ANCS_App_KeyButton3Action();
+}
+
+/* USER CODE END FD*/
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Ble_Tl_Init( void )
+{
+ HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
+
+ Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
+ Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
+ hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
+
+ return;
+}
+
+static void Ble_Hci_Gap_Gatt_Init(void){
+
+ uint8_t role;
+ uint8_t index;
+ uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
+ const uint8_t *bd_addr;
+ uint32_t srd_bd_addr[2];
+ uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
+
+ /**
+ * Initialize HCI layer
+ */
+ /*HCI Reset to synchronise BLE Stack*/
+ hci_reset();
+
+ /**
+ * Write the BD Address
+ */
+
+ bd_addr = BleGetBdAddress();
+ aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
+ CONFIG_DATA_PUBADDR_LEN,
+ (uint8_t*) bd_addr);
+
+ /* BLE MAC in ADV Packet */
+ manuf_data[ sizeof(manuf_data)-6] = bd_addr[5];
+ manuf_data[ sizeof(manuf_data)-5] = bd_addr[4];
+ manuf_data[ sizeof(manuf_data)-4] = bd_addr[3];
+ manuf_data[ sizeof(manuf_data)-3] = bd_addr[2];
+ manuf_data[ sizeof(manuf_data)-2] = bd_addr[1];
+ manuf_data[ sizeof(manuf_data)-1] = bd_addr[0];
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data(CONFIG_DATA_IR_OFFSET,
+ CONFIG_DATA_IR_LEN,
+ (uint8_t*) BLE_CFG_IR_VALUE);
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data(CONFIG_DATA_ER_OFFSET,
+ CONFIG_DATA_ER_LEN,
+ (uint8_t*) BLE_CFG_ER_VALUE);
+
+ /**
+ * Write random bd_address
+ */
+ /* random_bd_address = R_bd_address;
+ aci_hal_write_config_data(CONFIG_DATA_RANDOM_ADDRESS_WR,
+ CONFIG_DATA_RANDOM_ADDRESS_LEN,
+ (uint8_t*) random_bd_address);
+ */
+
+ /**
+ * Static random Address
+ * The two upper bits shall be set to 1
+ * The lowest 32bits is read from the UDN to differentiate between devices
+ * The RNG may be used to provide a random number on each power on
+ */
+ srd_bd_addr[1] = 0x0000ED6E;
+ srd_bd_addr[0] = LL_FLASH_GetUDN( );
+ aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
+
+ /**
+ * Set TX Power to 0dBm.
+ */
+ aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+
+ /**
+ * Initialize GATT interface
+ */
+ aci_gatt_init();
+
+ /**
+ * Initialize GAP interface
+ */
+ role = 0;
+
+#if (BLE_CFG_PERIPHERAL == 1)
+ role |= GAP_PERIPHERAL_ROLE;
+#endif
+
+#if (BLE_CFG_CENTRAL == 1)
+ role |= GAP_CENTRAL_ROLE;
+#endif
+
+ if (role > 0)
+ {
+ const char *name = "HRanc";
+ aci_gap_init(role, 0,
+ APPBLE_GAP_DEVICE_NAME_LENGTH,
+ &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
+
+ if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
+ {
+ BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
+ }
+ }
+
+ if(aci_gatt_update_char_value(gap_service_handle,
+ gap_appearance_char_handle,
+ 0,
+ 2,
+ (uint8_t *)&appearance))
+ {
+ BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
+ }
+/**
+ * Initialize Default PHY
+ */
+ hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
+
+ /**
+ * Initialize IO capability
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
+ aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
+
+ /**
+ * Initialize authentication
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = CFG_OOB_DATA_PRESENT;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = CFG_ENCRYPTION_KEY_SIZE_MIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = CFG_ENCRYPTION_KEY_SIZE_MAX;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = CFG_USED_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = CFG_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = CFG_BONDING_MODE;
+ for (index = 0; index < 16; index++)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
+ }
+
+ aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
+ CFG_SC_SUPPORT,
+ CFG_KEYPRESS_NOTIFICATION_SUPPORT,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
+ CFG_IDENTITY_ADDRESS_TYPE
+ );
+
+ /**
+ * Initialize whitelist
+ */
+ if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
+ {
+ aci_gap_configure_whitelist();
+ }
+}
+
+static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
+{
+ tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
+ uint16_t Min_Inter, Max_Inter;
+
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ Min_Inter = AdvIntervalMin;
+ Max_Inter = AdvIntervalMax;
+ }
+ else
+ {
+ Min_Inter = CFG_LP_CONN_ADV_INTERVAL_MIN;
+ Max_Inter = CFG_LP_CONN_ADV_INTERVAL_MAX;
+ }
+
+ /**
+ * Stop the timer, it will be restarted for a new shot
+ * It does not hurt if the timer was not running
+ */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+
+ APP_DBG_MSG("First index in %d state \n", BleApplicationContext.Device_Connection_Status);
+
+ if ((New_Status == APP_BLE_LP_ADV)
+ && ((BleApplicationContext.Device_Connection_Status == APP_BLE_FAST_ADV)
+ || (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_ADV)))
+ {
+ /* Connection in ADVERTISE mode have to stop the current advertising */
+ ret = aci_gap_set_non_discoverable();
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Successfully Stopped Advertising \n");
+ }
+ else
+ {
+ APP_DBG_MSG("Stop Advertising Failed , result: %d \n", ret);
+ }
+ }
+
+
+ BleApplicationContext.Device_Connection_Status = New_Status;
+ /* Start Fast or Low Power Advertising */
+ ret = aci_gap_set_discoverable(
+ ADV_IND,
+ Min_Inter,
+ Max_Inter,
+ PUBLIC_ADDR,
+ NO_WHITE_LIST_USE, /* use white list */
+ sizeof(local_name),
+ (uint8_t*) &local_name,
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen,
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID,
+ 0,
+ 0);
+
+
+ /* Update Advertising data */
+ ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Successfully Start Fast Advertising \n" );
+ /* Start Timer to STOP ADV - TIMEOUT */
+ HW_TS_Start(BleApplicationContext.Advertising_mgr_timer_Id, INITIAL_ADV_TIMEOUT);
+ }
+ else
+ {
+ APP_DBG_MSG("Successfully Start Low Power Advertising \n");
+ }
+ }
+ else
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Start Fast Advertising Failed , result:0x%02x \n", ret);
+ }
+ else
+ {
+ APP_DBG_MSG("Start Low Power Advertising Failed , result: 0x%02x \n", ret);
+ }
+ }
+
+ return;
+}
+
+const uint8_t* BleGetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTION */
+
+/* USER CODE END FD_LOCAL_FUNCTION */
+
+/*************************************************************
+ *
+ *SPECIFIC FUNCTIONS
+ *
+ *************************************************************/
+static void Add_Advertisment_Service_UUID( uint16_t servUUID )
+{
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen] =
+ (uint8_t) (servUUID & 0xFF);
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen++;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen] =
+ (uint8_t) (servUUID >> 8) & 0xFF;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen++;
+
+ return;
+}
+
+static void Adv_Mgr( void )
+{
+ /**
+ * The code shall be executed in the background as an aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_UPDATE_ID, CFG_SCH_PRIO_0);
+
+
+ return;
+}
+
+static void Adv_Update( void )
+{
+ Adv_Request(APP_BLE_LP_ADV);
+
+ return;
+}
+
+/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
+
+/* USER CODE END FD_SPECIFIC_FUNCTIONS */
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void hci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask(1 << CFG_TASK_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void hci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void hci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+static void BLE_UserEvtRx( void * pPayload )
+{
+ SVCCTL_UserEvtFlowStatus_t svctl_return_status;
+ tHCI_UserEvtRxParam *pParam;
+
+ pParam = (tHCI_UserEvtRxParam *)pPayload;
+ svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
+ if (svctl_return_status != SVCCTL_UserEvtFlowDisable)
+ {
+ pParam->status = HCI_TL_UserEventFlow_Enable;
+ }
+ else
+ {
+ pParam->status = HCI_TL_UserEventFlow_Disable;
+ }
+}
+
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status )
+{
+ uint32_t task_id_list;
+ switch (status)
+ {
+ case HCI_TL_CmdBusy:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_PauseTask(task_id_list);
+
+ break;
+
+ case HCI_TL_CmdAvailable:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_ResumeTask(task_id_list);
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+void SVCCTL_ResumeUserEventFlow( void )
+{
+ hci_resume_flow();
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..657ba432b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,88 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.h
+ * @author MCD Application Team
+ * @brief Header for ble application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_BLE_H
+#define APP_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "hci_tl.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+ typedef enum
+ {
+ APP_BLE_IDLE,
+ APP_BLE_FAST_ADV,
+ APP_BLE_LP_ADV,
+ APP_BLE_SCAN,
+ APP_BLE_LP_CONNECTING,
+ APP_BLE_CONNECTED_SERVER,
+ APP_BLE_CONNECTED_CLIENT
+ } APP_BLE_ConnStatus_t;
+
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APP_BLE_Init( void );
+
+ APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void);
+
+/* USER CODE BEGIN EF */
+void APP_BLE_Key_Button1_Action(void);
+void APP_BLE_Key_Button2_Action(void);
+void APP_BLE_Key_Button3_Action(void);
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*APP_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..d042af896
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_conf.h
@@ -0,0 +1,104 @@
+/**
+ ******************************************************************************
+ * File Name : App/ble_conf.h
+ * Description : Configuration file for BLE Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef BLE_CONF_H
+#define BLE_CONF_H
+
+#include "app_conf.h"
+
+/******************************************************************************
+ *
+ * BLE SERVICES CONFIGURATION
+ * blesvc
+ *
+ ******************************************************************************/
+
+ /**
+ * This setting shall be set to '1' if the device needs to support the Peripheral Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_PERIPHERAL 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Central Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_CENTRAL 0
+
+/**
+ * There is one handler per service enabled
+ * Note: There is no handler for the Device Information Service
+ *
+ * This shall take into account all registered handlers
+ * (from either the provided services or the custom services)
+ */
+#define BLE_CFG_SVC_MAX_NBR_CB 7
+
+#define BLE_CFG_CLT_MAX_NBR_CB 3
+
+/******************************************************************************
+ * Device Information Service (DIS)
+ ******************************************************************************/
+/**< Options: Supported(1) or Not Supported(0) */
+#define BLE_CFG_DIS_MANUFACTURER_NAME_STRING 1
+#define BLE_CFG_DIS_MODEL_NUMBER_STRING 0
+#define BLE_CFG_DIS_SERIAL_NUMBER_STRING 0
+#define BLE_CFG_DIS_HARDWARE_REVISION_STRING 0
+#define BLE_CFG_DIS_FIRMWARE_REVISION_STRING 0
+#define BLE_CFG_DIS_SOFTWARE_REVISION_STRING 0
+#define BLE_CFG_DIS_SYSTEM_ID 0
+#define BLE_CFG_DIS_IEEE_CERTIFICATION 0
+#define BLE_CFG_DIS_PNP_ID 0
+
+/**
+ * device information service characteristic lengths
+ */
+#define BLE_CFG_DIS_SYSTEM_ID_LEN_MAX (8)
+#define BLE_CFG_DIS_MODEL_NUMBER_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_SERIAL_NUMBER_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_FIRMWARE_REVISION_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_HARDWARE_REVISION_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_SOFTWARE_REVISION_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_MANUFACTURER_NAME_STRING_LEN_MAX (32)
+#define BLE_CFG_DIS_IEEE_CERTIFICATION_LEN_MAX (32)
+#define BLE_CFG_DIS_PNP_ID_LEN_MAX (7)
+
+/******************************************************************************
+ * Heart Rate Service (HRS)
+ ******************************************************************************/
+#define BLE_CFG_HRS_BODY_SENSOR_LOCATION_CHAR 1/**< BODY SENSOR LOCATION CHARACTERISTIC */
+#define BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG 1/**< ENERGY EXTENDED INFO FLAG */
+#define BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG 1/**< Max number of RR interval values - Shall not be greater than 9 */
+
+/******************************************************************************
+ * GAP Service - Apprearance
+ ******************************************************************************/
+
+#define BLE_CFG_UNKNOWN_APPEARANCE (0)
+#define BLE_CFG_HR_SENSOR_APPEARANCE (832)
+#define BLE_CFG_GAP_APPEARANCE (BLE_CFG_HR_SENSOR_APPEARANCE)
+
+/******************************************************************************
+ * Over The Air Feature (OTA) - STM Proprietary
+ ******************************************************************************/
+#define BLE_CFG_OTA_REBOOT_CHAR 0/**< REBOOT OTA MODE CHARACTERISTIC */
+
+#endif /*BLE_CONF_H */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..803855d69
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_dbg_conf.h
@@ -0,0 +1,199 @@
+/**
+ ******************************************************************************
+ * File Name : App/ble_dbg_conf.h
+ * Description : Debug configuration file for BLE Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_DBG_CONF_H
+#define __BLE_DBG_CONF_H
+
+/**
+ * Enable or Disable traces from BLE
+ */
+
+#define BLE_DBG_APP_EN 0
+#define BLE_DBG_DIS_EN 1
+#define BLE_DBG_HRS_EN 1
+#define BLE_DBG_SVCCTL_EN 1
+#define BLE_DBG_BLS_EN 0
+#define BLE_DBG_HTS_EN 0
+#define BLE_DBG_P2P_STM_EN 0
+
+/**
+ * Macro definition
+ */
+#if ( BLE_DBG_APP_EN != 0 )
+#define BLE_DBG_APP_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_APP_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_DIS_EN != 0 )
+#define BLE_DBG_DIS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_DIS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_HRS_EN != 0 )
+#define BLE_DBG_HRS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HRS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_P2P_STM_EN != 0 )
+#define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_TEMPLATE_STM_EN != 0 )
+#define BLE_DBG_TEMPLATE_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TEMPLATE_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_EDS_STM_EN != 0 )
+#define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_LBS_STM_EN != 0 )
+#define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_SVCCTL_EN != 0 )
+#define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_CTS_EN != 0)
+#define BLE_DBG_CTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_CTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HIDS_EN != 0)
+#define BLE_DBG_HIDS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HIDS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_PASS_EN != 0)
+#define BLE_DBG_PASS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_PASS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BLS_EN != 0)
+#define BLE_DBG_BLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HTS_EN != 0)
+#define BLE_DBG_HTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ANS_EN != 0)
+#define BLE_DBG_ANS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ANS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ESS_EN != 0)
+#define BLE_DBG_ESS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ESS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_GLS_EN != 0)
+#define BLE_DBG_GLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_GLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BAS_EN != 0)
+#define BLE_DBG_BAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_RTUS_EN != 0)
+#define BLE_DBG_RTUS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_RTUS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HPS_EN != 0)
+#define BLE_DBG_HPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_TPS_EN != 0)
+#define BLE_DBG_TPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LLS_EN != 0)
+#define BLE_DBG_LLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_IAS_EN != 0)
+#define BLE_DBG_IAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_IAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_WSS_EN != 0)
+#define BLE_DBG_WSS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_WSS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LNS_EN != 0)
+#define BLE_DBG_LNS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LNS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_SCPS_EN != 0)
+#define BLE_DBG_SCPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SCPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_DTS_EN != 0)
+#define BLE_DBG_DTS_MSG PRINT_MESG_DBG
+#define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG
+#else
+#define BLE_DBG_DTS_MSG PRINT_NO_MESG
+#define BLE_DBG_DTS_BUF PRINT_NO_MESG
+#endif
+
+#endif /*__BLE_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.c
new file mode 100644
index 000000000..59c66fad3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.c
@@ -0,0 +1,221 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file dis_app.c
+ * @author MCD Application Team
+ * @brief Device Information Service Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "ble.h"
+#include "dis_app.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+#if ((BLE_CFG_DIS_SYSTEM_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+static const uint8_t system_id[BLE_CFG_DIS_SYSTEM_ID_LEN_MAX] =
+{
+ (uint8_t)((DISAPP_MANUFACTURER_ID & 0xFF0000) >> 16),
+ (uint8_t)((DISAPP_MANUFACTURER_ID & 0x00FF00) >> 8),
+ (uint8_t)(DISAPP_MANUFACTURER_ID & 0x0000FF),
+ 0xFE,
+ 0xFF,
+ (uint8_t)((DISAPP_OUI & 0xFF0000) >> 16),
+ (uint8_t)((DISAPP_OUI & 0x00FF00) >> 8),
+ (uint8_t)(DISAPP_OUI & 0x0000FF)
+};
+#endif
+
+#if ((BLE_CFG_DIS_IEEE_CERTIFICATION != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+static const uint8_t ieee_id[BLE_CFG_DIS_IEEE_CERTIFICATION_LEN_MAX] =
+{
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+ 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA, 0xFE, 0xCA,
+};
+#endif
+#if ((BLE_CFG_DIS_PNP_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+static const uint8_t pnp_id[BLE_CFG_DIS_PNP_ID_LEN_MAX] =
+{
+ 0x1,
+ 0xAD, 0xDE,
+ 0xDE, 0xDA,
+ 0x01, 0x00
+};
+#endif
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void DISAPP_Init(void)
+{
+/* USER CODE BEGIN DISAPP_Init */
+ DIS_Data_t dis_information_data;
+
+#if ((BLE_CFG_DIS_MANUFACTURER_NAME_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update MANUFACTURER NAME Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_MANUFACTURER_NAME;
+ dis_information_data.Length = sizeof(DISAPP_MANUFACTURER_NAME);
+ DIS_UpdateChar(MANUFACTURER_NAME_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_MODEL_NUMBER_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update MODEL NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_MODEL_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_MODEL_NUMBER);
+ DIS_UpdateChar(MODEL_NUMBER_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_SERIAL_NUMBER_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update SERIAL NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_SERIAL_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_SERIAL_NUMBER);
+ DIS_UpdateChar(SERIAL_NUMBER_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_HARDWARE_REVISION_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update HARDWARE REVISION NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_HARDWARE_REVISION_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_HARDWARE_REVISION_NUMBER);
+ DIS_UpdateChar(HARDWARE_REVISION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_FIRMWARE_REVISION_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update FIRMWARE REVISION NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_FIRMWARE_REVISION_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_FIRMWARE_REVISION_NUMBER);
+ DIS_UpdateChar(FIRMWARE_REVISION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_SOFTWARE_REVISION_STRING != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+ /**
+ * Update SOFTWARE REVISION NUMBERInformation
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t*)DISAPP_SOFTWARE_REVISION_NUMBER;
+ dis_information_data.Length = sizeof(DISAPP_SOFTWARE_REVISION_NUMBER);
+ DIS_UpdateChar(SOFTWARE_REVISION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_SYSTEM_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+
+ /**
+ * Update SYSTEM ID Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t *)system_id;
+ dis_information_data.Length = BLE_CFG_DIS_SYSTEM_ID_LEN_MAX;
+ DIS_UpdateChar(SYSTEM_ID_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_IEEE_CERTIFICATION != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+
+ /**
+ * Update IEEE CERTIFICATION ID Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t *)ieee_id;
+ dis_information_data.Length = BLE_CFG_DIS_IEEE_CERTIFICATION_LEN_MAX;
+ DIS_UpdateChar(IEEE_CERTIFICATION_UUID, &dis_information_data);
+#endif
+
+#if ((BLE_CFG_DIS_PNP_ID != 0) || (CFG_MENU_DEVICE_INFORMATION != 0))
+
+ /**
+ * Update PNP ID Information
+ *
+ * @param UUID
+ * @param pPData
+ * @return
+ */
+ dis_information_data.pPayload = (uint8_t *)pnp_id;
+ dis_information_data.Length = BLE_CFG_DIS_PNP_ID_LEN_MAX;
+ DIS_UpdateChar(PNP_ID_UUID, &dis_information_data);
+#endif
+/* USER CODE END DISAPP_Init */
+}
+
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.h
new file mode 100644
index 000000000..196ec9937
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.h
@@ -0,0 +1,77 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file dis_app.h
+ * @author MCD Application Team
+ * @brief Header for dis_application.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __DIS_APP_H
+#define __DIS_APP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros -----------------------------------------------------------*/
+#define DISAPP_MANUFACTURER_NAME "STM"
+#define DISAPP_MODEL_NUMBER "4502-1.0"
+#define DISAPP_SERIAL_NUMBER "1.0"
+#define DISAPP_HARDWARE_REVISION_NUMBER "1.0"
+#define DISAPP_FIRMWARE_REVISION_NUMBER "1.0"
+#define DISAPP_SOFTWARE_REVISION_NUMBER "1.0"
+#define DISAPP_OUI 0x123456
+#define DISAPP_MANUFACTURER_ID 0x9ABCDE
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ------------------------------------------------------- */
+void DISAPP_Init(void);
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__DIS_APP_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.c
new file mode 100644
index 000000000..081905ee3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.c
@@ -0,0 +1,231 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hrs_app.c
+ * @author MCD Application Team
+ * @brief Heart Rate Service Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "ble.h"
+#include "hrs_app.h"
+#include "stm32_seq.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ HRS_BodySensorLocation_t BodySensorLocationChar;
+ HRS_MeasVal_t MeasurementvalueChar;
+ uint8_t ResetEnergyExpended;
+ uint8_t TimerMeasurement_Id;
+
+} HRSAPP_Context_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+#define HRSAPP_MEASUREMENT_INTERVAL (1000000/CFG_TS_TICK_VAL) /**< 1s */
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/**
+ * START of Section BLE_APP_CONTEXT
+ */
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static HRSAPP_Context_t HRSAPP_Context;
+
+/**
+ * END of Section BLE_APP_CONTEXT
+ */
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void HrMeas( void );
+static void HRSAPP_Measurement(void);
+static uint32_t HRSAPP_Read_RTC_SSR_SS ( void );
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void HRS_Notification(HRS_App_Notification_evt_t *pNotification)
+{
+/* USER CODE BEGIN HRS_Notification_1 */
+
+/* USER CODE END HRS_Notification_1 */
+ switch(pNotification->HRS_Evt_Opcode)
+ {
+/* USER CODE BEGIN HRS_Notification_HRS_Evt_Opcode */
+
+/* USER CODE END HRS_Notification_HRS_Evt_Opcode */
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ case HRS_RESET_ENERGY_EXPENDED_EVT:
+/* USER CODE BEGIN HRS_RESET_ENERGY_EXPENDED_EVT */
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended = 0;
+ HRSAPP_Context.ResetEnergyExpended = 1;
+/* USER CODE END HRS_RESET_ENERGY_EXPENDED_EVT */
+ break;
+#endif
+
+ case HRS_NOTIFICATION_ENABLED:
+/* USER CODE BEGIN HRS_NOTIFICATION_ENABLED */
+ /**
+ * It could be the enable notification is received twice without the disable notification in between
+ */
+ HW_TS_Stop(HRSAPP_Context.TimerMeasurement_Id);
+ HW_TS_Start(HRSAPP_Context.TimerMeasurement_Id, HRSAPP_MEASUREMENT_INTERVAL);
+/* USER CODE END HRS_NOTIFICATION_ENABLED */
+ break;
+
+ case HRS_NOTIFICATION_DISABLED:
+/* USER CODE BEGIN HRS_NOTIFICATION_DISABLED */
+ HW_TS_Stop(HRSAPP_Context.TimerMeasurement_Id);
+/* USER CODE END HRS_NOTIFICATION_DISABLED */
+ break;
+
+#if (BLE_CFG_OTA_REBOOT_CHAR != 0)
+ case HRS_STM_BOOT_REQUEST_EVT:
+/* USER CODE BEGIN HRS_STM_BOOT_REQUEST_EVT */
+ *(uint32_t*)SRAM1_BASE = *(uint32_t*)pNotification->DataTransfered.pPayload;
+ NVIC_SystemReset();
+/* USER CODE END HRS_STM_BOOT_REQUEST_EVT */
+ break;
+#endif
+
+ default:
+/* USER CODE BEGIN HRS_Notification_Default */
+
+/* USER CODE END HRS_Notification_Default */
+ break;
+ }
+/* USER CODE BEGIN HRS_Notification_2 */
+
+/* USER CODE END HRS_Notification_2 */
+ return;
+}
+
+void HRSAPP_Init(void)
+{
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MEAS_REQ_ID, UTIL_SEQ_RFU, HRSAPP_Measurement );
+/* USER CODE BEGIN HRSAPP_Init */
+ /**
+ * Set Body Sensor Location
+ */
+ HRSAPP_Context.ResetEnergyExpended = 0;
+ HRSAPP_Context.BodySensorLocationChar = HRS_BODY_SENSOR_LOCATION_HAND;
+ HRS_UpdateChar(SENSOR_LOCATION_UUID, (uint8_t *)&HRSAPP_Context.BodySensorLocationChar);
+
+
+ /**
+ * Set Flags for measurement value
+ */
+
+ HRSAPP_Context.MeasurementvalueChar.Flags = ( HRS_HRM_VALUE_FORMAT_UINT16 |
+ HRS_HRM_SENSOR_CONTACTS_PRESENT |
+ HRS_HRM_SENSOR_CONTACTS_SUPPORTED |
+ HRS_HRM_ENERGY_EXPENDED_PRESENT |
+ HRS_HRM_RR_INTERVAL_PRESENT );
+
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ if(HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_ENERGY_EXPENDED_PRESENT)
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended = 10;
+#endif
+
+#if (BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG != 0)
+ if(HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_RR_INTERVAL_PRESENT)
+ {
+ uint8_t i;
+
+ HRSAPP_Context.MeasurementvalueChar.NbreOfValidRRIntervalValues = BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG;
+ for(i = 0; i < BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG; i++)
+ HRSAPP_Context.MeasurementvalueChar.aRRIntervalValues[i] = 1024;
+ }
+#endif
+
+ /**
+ * Create timer for Heart Rate Measurement
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(HRSAPP_Context.TimerMeasurement_Id), hw_ts_Repeated, HrMeas);
+
+/* USER CODE END HRSAPP_Init */
+ return;
+}
+
+static void HRSAPP_Measurement(void)
+{
+/* USER CODE BEGIN HRSAPP_Measurement */
+ uint32_t measurement;
+
+ measurement = ((HRSAPP_Read_RTC_SSR_SS()) & 0x07) + 65;
+
+ HRSAPP_Context.MeasurementvalueChar.MeasurementValue = measurement;
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ if((HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_ENERGY_EXPENDED_PRESENT) &&
+ (HRSAPP_Context.ResetEnergyExpended == 0))
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended += 5;
+ else if(HRSAPP_Context.ResetEnergyExpended == 1)
+ HRSAPP_Context.ResetEnergyExpended = 0;
+#endif
+
+ HRS_UpdateChar(HEART_RATE_MEASURMENT_UUID, (uint8_t *)&HRSAPP_Context.MeasurementvalueChar);
+
+/* USER CODE END HRSAPP_Measurement */
+ return;
+}
+
+static void HrMeas( void )
+{
+ /**
+ * The code shall be executed in the background as aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MEAS_REQ_ID, CFG_SCH_PRIO_0);
+/* USER CODE BEGIN HrMeas */
+
+/* USER CODE END HrMeas */
+
+ return;
+}
+
+static uint32_t HRSAPP_Read_RTC_SSR_SS ( void )
+{
+ return ((uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS)));
+}
+
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.h
new file mode 100644
index 000000000..0246d2811
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hrs_app.h
+ * @author MCD Application Team
+ * @brief Header for hrs_application.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HRS_APP_H
+#define __HRS_APP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+void HRSAPP_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__HRS_APP_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..c6e1ca97a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,523 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliCmdNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_CliEvtNotification();
+
+ return;
+}
+
+__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+#endif /* ZIGBEE_WB */
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/readme.txt
new file mode 100644
index 000000000..ea709c9eb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/readme.txt
@@ -0,0 +1,142 @@
+/**
+ @page BLE_HeartRate example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE/BLE_HeartRate_ANCS/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE_HeartRate_ANCS example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2020 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification at:
+https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/
+and also use the Heart Rate profile as specified by the BLE SIG.
+Note: this application use STM32 sequencer API to schedule SW tasks.
+
+The purpose of the Apple Notification Center Service (ANCS) is to give Bluetooth accessories (that connect to iOS devices
+through a Bluetooth Low Energy link) a simple and convenient way to access many kinds of notifications that are generated
+ on iOS devices. The publisher of the ANCS service (the iOS phone device) is referred to asĀ Notification ProviderĀ (NP)
+ and the client of the ANCS service (ie. STM32 WB board) is referred to as aĀ Notification ConsumerĀ (NC).
+
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@par Directory contents
+
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/app_debug.h Debug and trace tools
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/hw_if.h HW interface to BSP and HAL call
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/stm32_lpm_if.h Low layer function to enter/exit low power modes
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_HeartRate_ANCS/Core/Inc/utilities_conf.h Configuration file of the utilities
+
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.h Header for app_ble.c module
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.h ANCS client Application
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.h Header for dis_app.c module
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.h Header for hrs_app.c module
+
+ - BLE/BLE_HeartRate_ANCS/Core/Src/app_debug.c
+ - BLE/BLE_HeartRate_ANCS/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_HeartRate_ANCS/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_HeartRate_ANCS/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_HeartRate_ANCS/Core/Src/main.c Main program
+ - BLE/BLE_HeartRate_ANCS/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_hal_msp.c MSP Initialization and deinitialisation
+ - BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_HeartRate_ANCS/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/ancs_client_app.c ANCS client Application
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.c Device Information Service application
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.c Heart Rate Service application
+
+ - BLE/BLE_HeartRate_ANCS/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55VG-Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - This example is by default configured to support low power mode ( No traces - No debugger )
+ This can be modified in app_conf.h
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your toolchain
+ - Rebuild all files and flash the board with the executable file
+ - OR use the BLE_HeartRate_ANCS_reference.hex from Binary directory
+
+ On the android/ios device, enable the Bluetooth communications, and if not done before,
+ - Install the ST BLE Profile application on the android device
+ https://play.google.com/store/apps/details?id=com.stm.bluetoothlevalidation&hl=en
+ https://itunes.apple.com/fr/App/st-ble-profile/id1081331769?mt=8
+
+ - Install the ST BLE Sensor application on the ios/android device
+ https://play.google.com/store/apps/details?id=com.st.bluems
+ https://itunes.apple.com/us/App/st-bluems/id993670214?mt=8
+
+Considering connection with ios device:
+ - Power on the Nucleo board with the BLE_HeartRate_ANCS application
+ - Then, click on the App icon, ST BLE Sensor (ios device)
+ - connect to a device
+ - select the HRanc in the device list
+ - call your ios device by using another smartphone, the call will be answered automatically. or, send message to your ios device,the message can be displayed on terminal.
+ Warning: if the HRanc has already been bonded or pairing timeout, you should erase it from bluetooth connected ios device list and press SW3 stored bonded infomation.
+ (in ios device settings: select bluetooth icon, then select my device and forget or ignore it).
+ The Heart Rate is displayed each second on the ios device.
+ Moreover to display ANCS notifications messages, please open an hyper-terminal on PC
+ connected to Nucleo board by serial STlink Virtual com port with following settings:
+ + baud rate: 115200
+ + data: 8 bits
+ + parity: none
+ + stop: 1 bits
+ + Flow control: none
+
+ - The User buttons are configured as ( SW1 terminates BLE connection, SW2 review ANCS notification
+ and SW3 is used to remove bonded devices, reset GAP security and terminate BLE connection).
+
+For more details refer to the Application Note:
+ AN5289 - Building a Wireless application
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Binary/BLE_HeartRate_ota_reference.bin b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Binary/BLE_HeartRate_ota_reference.bin
index e892b7207..c45a55bcb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Binary/BLE_HeartRate_ota_reference.bin
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Binary/BLE_HeartRate_ota_reference.bin
Binary files differ
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_common.h
index 4defc5d7a..836f40dcf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_common.h
@@ -1,12 +1,13 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_common.h
* Description : App Common application configuration file for STM32WPAN Middleware.
*
- ******************************************************************************
+ ******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -16,7 +17,7 @@
*
******************************************************************************
*/
-
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_COMMON_H
#define APP_COMMON_H
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_conf.h
index e56dcf80d..fb847cd88 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_conf.h
@@ -1,12 +1,12 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_conf.h
* Description : Application configuration file for STM32WPAN Middleware.
- *
- ******************************************************************************
+ ******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -16,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_CONF_H
@@ -48,11 +49,11 @@
/**
* Define IO Authentication
*/
-#define CFG_BONDING_MODE (1)
-#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
-#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
-#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+#define CFG_BONDING_MODE (0)
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
/**
* Define IO capabilities
@@ -63,7 +64,7 @@
#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
-#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_YES_NO
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_YES_NO
/**
* Define MITM modes
@@ -74,6 +75,35 @@
#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
/**
+ * Define Secure Connections Support
+ */
+#define CFG_SECURE_NOT_SUPPORTED (0x00)
+#define CFG_SECURE_OPTIONAL (0x01)
+#define CFG_SECURE_MANDATORY (0x02)
+
+#define CFG_SC_SUPPORT CFG_SECURE_OPTIONAL
+
+/**
+ * Define Keypress Notification Support
+ */
+#define CFG_KEYPRESS_NOT_SUPPORTED (0x00)
+#define CFG_KEYPRESS_SUPPORTED (0x01)
+
+#define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED
+
+/**
+ * Numeric Comparison Answers
+ */
+#define YES (0x01)
+#define NO (0x00)
+
+/**
+ * Device name configuration for Generic Access Service
+ */
+#define CFG_GAP_DEVICE_NAME "TEMPLATE"
+#define CFG_GAP_DEVICE_NAME_LENGTH (8)
+
+/**
* Define PHY
*/
#define ALL_PHYS_PREFERENCE 0x00
@@ -105,16 +135,6 @@
/**< specific parameters */
/*****************************************************/
-#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
-#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
-#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
-
-/**
- * SMPS supply
- * SMPS not used when Set to 0
- * SMPS used when Set to 1
- */
-#define CFG_USE_SMPS 1
/**
* AD Element - Group B Feature
@@ -264,7 +284,7 @@
* Select UART interfaces
*/
#define CFG_DEBUG_TRACE_UART hw_uart1
-#define CFG_CONSOLE_MENU
+#define CFG_CONSOLE_MENU 0
/******************************************************************************
* USB interface
******************************************************************************/
@@ -360,7 +380,7 @@
typedef enum
{
- CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_PROC_ID_ISR,
} CFG_TimProcID_t;
/******************************************************************************
@@ -444,6 +464,15 @@ typedef enum
#define DBG_TRACE_MSG_QUEUE_SIZE 4096
#define MAX_DBG_TRACE_MSG_SIZE 1024
+/* USER CODE BEGIN Defines */
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 1
+
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+/* USER CODE END Defines */
+
/******************************************************************************
* Scheduler
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_debug.h
index 13485c16b..4224edbe0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_debug.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_debug.h
@@ -1,23 +1,22 @@
-
+/* USER CODE BEGIN Header */
/**
- ******************************************************************************
- * @file app_debug.h
- * @author MCD Application Team
- * @brief Interface to support debug in the application
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
******************************************************************************
- */
-
+ * File Name : app_debug.h
+ * Description : Header for app_debug.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __APP_DEBUG_H
@@ -27,17 +26,42 @@
extern "C" {
#endif
- /* Includes ------------------------------------------------------------------*/
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
/* Exported types ------------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* External variables --------------------------------------------------------*/
- /* Exported macros -----------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
void APPD_Init( void );
void APPD_EnableCPU2( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
#ifdef __cplusplus
-}
+} /* extern "C" */
#endif
#endif /*__APP_DEBUG_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/hw_conf.h
index f4f55affa..5492cbb08 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/hw_conf.h
@@ -24,9 +24,9 @@
#define HW_CONF_H
/******************************************************************************
-* Semaphores
-* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
-*****************************************************************************/
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
/**
* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/main.h
index 55097bac8..4b10d2beb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/main.h
@@ -29,6 +29,7 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
+#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_hal_conf.h
index 31d63e37a..d5db0e33f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_hal_conf.h
@@ -39,6 +39,7 @@
/*#define HAL_CRC_MODULE_ENABLED */
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
@@ -70,6 +71,7 @@
#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
@@ -243,6 +245,10 @@
#include "stm32wbxx_hal_i2c.h"
#endif /* HAL_I2C_MODULE_ENABLED */
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
#ifdef HAL_IPCC_MODULE_ENABLED
#include "stm32wbxx_hal_ipcc.h"
#endif /* HAL_IPCC_MODULE_ENABLED */
@@ -276,7 +282,6 @@
#endif /* HAL_PWR_MODULE_ENABLED */
#ifdef HAL_QSPI_MODULE_ENABLED
- #define USE_HAL_QSPI_REGISTER_CALLBACKS 0U
#include "stm32wbxx_hal_qspi.h"
#endif /* HAL_QSPI_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_debug.c
index 246173ae6..14ed65c22 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_debug.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_debug.c
@@ -1,24 +1,25 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
- * @file app_debug.c
- * @author MCD Application Team
- * @brief Debug capabilities
+ * File Name : app_debug.c
+ * Description : Debug capabilities source file for STM32WPAN Middleware
******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
******************************************************************************
*/
-
+/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
#include "app_common.h"
#include "app_debug.h"
@@ -26,8 +27,10 @@
#include "shci.h"
#include "tl.h"
#include "dbg_trace.h"
+/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
typedef PACKED_STRUCT
{
GPIO_TypeDef* port;
@@ -35,8 +38,10 @@ typedef PACKED_STRUCT
uint8_t enable;
uint8_t reserved;
} APPD_GpioConfig_t;
+/* USER CODE END PTD */
/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
#define GPIO_NBR_OF_RF_SIGNALS 9
#define GPIO_CFG_NBR_OF_FEATURES 34
#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
@@ -46,12 +51,26 @@ typedef PACKED_STRUCT
* THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
*/
#define BLE_DTB_CFG 0
+/* USER CODE END PD */
/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+#ifdef CFG_DEBUG_TRACE_UART
+#if(CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if(CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+#endif
+
/**
* THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
* It provides timing information on the CPU2 activity.
@@ -121,15 +140,22 @@ static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
{ GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
};
#endif
+/* USER CODE END PV */
/* Global variables ----------------------------------------------------------*/
+/* USER CODE BEGIN GV */
+/* USER CODE END GV */
+
/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
static void APPD_SetCPU2GpioConfig( void );
static void APPD_BleDtbCfg( void );
+/* USER CODE END PFP */
/* Functions Definition ------------------------------------------------------*/
void APPD_Init( void )
{
+/* USER CODE BEGIN APPD_Init */
#if (CFG_DEBUGGER_SUPPORTED == 1)
/**
* Keep debugger enabled while in any low power mode
@@ -169,11 +195,13 @@ void APPD_Init( void )
APPD_SetCPU2GpioConfig( );
APPD_BleDtbCfg( );
+/* USER CODE END APPD_Init */
return;
}
void APPD_EnableCPU2( void )
{
+/* USER CODE BEGIN APPD_EnableCPU2 */
SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
{
{{0,0,0}}, /**< Does not need to be initialized */
@@ -191,6 +219,7 @@ void APPD_EnableCPU2( void )
/** GPIO DEBUG Initialization */
SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+/* USER CODE END APPD_EnableCPU2 */
return;
}
@@ -201,6 +230,7 @@ void APPD_EnableCPU2( void )
*************************************************************/
static void APPD_SetCPU2GpioConfig( void )
{
+/* USER CODE BEGIN APPD_SetCPU2GpioConfig */
GPIO_InitTypeDef gpio_config = {0};
uint8_t local_loop;
uint16_t gpioa_pin_list;
@@ -266,11 +296,13 @@ static void APPD_SetCPU2GpioConfig( void )
HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
}
+/* USER CODE END APPD_SetCPU2GpioConfig */
return;
}
static void APPD_BleDtbCfg( void )
{
+/* USER CODE BEGIN APPD_BleDtbCfg */
#if (BLE_DTB_CFG != 0)
GPIO_InitTypeDef gpio_config = {0};
uint8_t local_loop;
@@ -322,6 +354,7 @@ static void APPD_BleDtbCfg( void )
}
#endif
+/* USER CODE END APPD_BleDtbCfg */
return;
}
@@ -333,15 +366,32 @@ static void APPD_BleDtbCfg( void )
#if(CFG_DEBUG_TRACE != 0)
void DbgOutputInit( void )
{
- HW_UART_Init(CFG_DEBUG_TRACE_UART);
- return;
+/* USER CODE BEGIN DbgOutputInit */
+#ifdef CFG_DEBUG_TRACE_UART
+if (CFG_DEBUG_TRACE_UART == hw_lpuart1)
+{
+#if(CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
}
+else if (CFG_DEBUG_TRACE_UART == hw_uart1)
+{
+#if(CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+#endif
+}
+#endif
+/* USER CODE END DbgOutputInit */
+ return;
+}
void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
{
+/* USER CODE END DbgOutputTraces */
HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+/* USER CODE END DbgOutputTraces */
return;
}
#endif
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_entry.c
index eab85057d..a70641314 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_entry.c
@@ -123,6 +123,7 @@ void APPE_Init( void )
* LOCAL FUNCTIONS
*
*************************************************************/
+
/**
* @brief Configure the system for power optimization
*
@@ -196,7 +197,7 @@ static void APPE_SysUserEvtRx( void * pPayload )
{
UNUSED(pPayload);
/* Traces channel initialization */
- APPD_EnableCPU2();
+ APPD_EnableCPU2( );
APP_BLE_Init( );
UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/main.c
index eaf5c9992..143bc0312 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/main.c
@@ -110,7 +110,6 @@ int main(void)
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
-
/* MCU Configuration--------------------------------------------------------*/
@@ -139,9 +138,8 @@ int main(void)
/* USER CODE END 2 */
- /* Init code for STM32_WPAN */
+ /* Init code for STM32_WPAN */
APPE_Init();
-
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while(1)
@@ -166,6 +164,7 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
+ HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
/** Configure the main internal regulator output voltage
*/
@@ -210,12 +209,10 @@ void SystemClock_Config(void)
PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
-
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
-
/* USER CODE BEGIN Smps */
#if (CFG_USE_SMPS != 0)
@@ -230,8 +227,6 @@ void SystemClock_Config(void)
#endif
/* USER CODE END Smps */
-
-
}
/**
@@ -375,6 +370,7 @@ static void MX_RTC_Init(void)
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
@@ -421,6 +417,7 @@ static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_hal_msp.c
index 87614ca60..fc4e64f31 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_hal_msp.c
@@ -88,6 +88,7 @@ void HAL_MspInit(void)
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
if(huart->Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspInit 0 */
@@ -132,6 +133,16 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
Error_Handler();
}
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_DMAMUX1_CH1_EVT;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_NO_EVENT;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = DISABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_lpuart1_tx, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
__HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
/* LPUART1 interrupt Init */
@@ -282,6 +293,7 @@ void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
/* USER CODE END RTC_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
/* USER CODE BEGIN RTC_MspInit 1 */
HAL_RTCEx_EnableBypassShadow(hrtc);
/* USER CODE END RTC_MspInit 1 */
@@ -304,6 +316,7 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
/* USER CODE END RTC_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
/* USER CODE BEGIN RTC_MspDeInit 1 */
/* USER CODE END RTC_MspDeInit 1 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/system_stm32wbxx.c
index fe8bf4976..79f9bbb64 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/system_stm32wbxx.c
@@ -281,7 +281,6 @@ void SystemCoreClockUpdate(void)
/*MSI frequency range in Hz*/
msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
- /*SystemCoreClock=HAL_RCC_GetSysClockFreq();*/
/* Get SYSCLK source -------------------------------------------------------*/
switch (RCC->CFGR & RCC_CFGR_SWS)
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/app_ble.c
index c4f2c88fa..f54d69a22 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/app_ble.c
@@ -243,6 +243,7 @@ uint8_t manuf_data[14] = {
0x00, /* BLE MAC stop */
};
+
/* USER CODE BEGIN PV */
/* USER CODE END PV */
@@ -330,11 +331,12 @@ void APP_BLE_Init( void )
* From here, all initialization are BLE application specific
*/
UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_UPDATE_ID, UTIL_SEQ_RFU, Adv_Update);
+
/**
* Initialization of ADV - Ad Manufacturer Element - Support OTA Bit Mask
*/
-#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
- manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
+#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
+ manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
#endif
/**
* Initialize DIS Application
@@ -401,7 +403,10 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
/* restart advertising */
Adv_Request(APP_BLE_FAST_ADV);
-}
+ /* USER CODE BEGIN EVT_DISCONN_COMPLETE */
+
+ /* USER CODE END EVT_DISCONN_COMPLETE */
+ }
break; /* EVT_DISCONN_COMPLETE */
@@ -413,8 +418,9 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
/* USER CODE END EVT_LE_META_EVENT */
switch (meta_evt->subevent)
{
- case EVT_LE_CONN_UPDATE_COMPLETE:
+ case EVT_LE_CONN_UPDATE_COMPLETE:
APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \n");
+
/* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
/* USER CODE END EVT_LE_CONN_UPDATE_COMPLETE */
@@ -430,57 +436,56 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \n");
}
-
- ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
- if (ret == BLE_STATUS_SUCCESS)
- {
- APP_DBG_MSG("Read_PHY success \n");
-
- if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
- {
- APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
- }
- else
- {
- APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
- }
- }
- else
- {
- APP_DBG_MSG("Read conf not succeess \n");
- }
-
- break;
-
- case EVT_LE_CONN_COMPLETE:
+
+ ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Read_PHY success \n");
+
+ if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ else
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ }
+ else
{
+ APP_DBG_MSG("Read conf not succeess \n");
+ }
+ /* USER CODE BEGIN EVT_LE_PHY_UPDATE_COMPLETE */
+
+ /* USER CODE END EVT_LE_PHY_UPDATE_COMPLETE */
+ break;
+ case EVT_LE_CONN_COMPLETE:
+ {
hci_le_connection_complete_event_rp0 *connection_complete_event;
/**
* The connection is done, there is no need anymore to schedule the LP ADV
*/
connection_complete_event = (hci_le_connection_complete_event_rp0 *) meta_evt->data;
-
+
HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
- APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\n",
- connection_complete_event->Connection_Handle);
- if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
- {
- /* Connection as client */
- BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
- }
- else
- {
- /* Connection as server */
- BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
- }
- BleApplicationContext.BleApplicationContext_legacy.connectionHandle =
- connection_complete_event->Connection_Handle;
+ APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\n", connection_complete_event->Connection_Handle);
+ if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
+ {
+ /* Connection as client */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
+ }
+ else
+ {
+ /* Connection as server */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
+ }
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = connection_complete_event->Connection_Handle;
/* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */
/* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
- }
+ }
break; /* HCI_EVT_LE_CONN_COMPLETE */
default:
@@ -574,15 +579,15 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
/* USER CODE BEGIN EVT_BLUE_GAP_PROCEDURE_COMPLETE */
/* USER CODE END EVT_BLUE_GAP_PROCEDURE_COMPLETE */
- break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
}
break; /* EVT_VENDOR */
- default:
- /* USER CODE BEGIN ECODE_DEFAULT*/
+ default:
+ /* USER CODE BEGIN ECODE_DEFAULT*/
- /* USER CODE END ECODE_DEFAULT*/
- break;
+ /* USER CODE END ECODE_DEFAULT*/
+ break;
}
return (SVCCTL_UserEvtFlowEnable);
@@ -674,7 +679,7 @@ static void Ble_Tl_Init( void )
return;
}
- static void Ble_Hci_Gap_Gatt_Init(void){
+static void Ble_Hci_Gap_Gatt_Init(void){
uint8_t role;
uint8_t index;
@@ -705,7 +710,7 @@ static void Ble_Tl_Init( void )
manuf_data[ sizeof(manuf_data)-3] = bd_addr[2];
manuf_data[ sizeof(manuf_data)-2] = bd_addr[1];
manuf_data[ sizeof(manuf_data)-1] = bd_addr[0];
-
+
/**
* Write Identity root key used to derive LTK and CSRK
*/
@@ -774,7 +779,7 @@ static void Ble_Tl_Init( void )
if (role > 0)
{
- const char *name = "STM32WB";
+ const char *name = "HRSTM";
aci_gap_init(role, 0,
APPBLE_GAP_DEVICE_NAME_LENGTH,
&gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
@@ -809,11 +814,11 @@ static void Ble_Tl_Init( void )
*/
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = 0;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = 8;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = 16;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = 1;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = 111111;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 1;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = CFG_ENCRYPTION_KEY_SIZE_MIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = CFG_ENCRYPTION_KEY_SIZE_MAX;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = CFG_USED_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = CFG_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = CFG_BONDING_MODE;
for (index = 0; index < 16; index++)
{
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
@@ -821,14 +826,14 @@ static void Ble_Tl_Init( void )
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 1,
- 0,
+ CFG_SC_SUPPORT,
+ CFG_KEYPRESS_NOTIFICATION_SUPPORT,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
-0
- );
+ PUBLIC_ADDR
+ );
/**
* Initialize whitelist
@@ -843,7 +848,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
{
tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
uint16_t Min_Inter, Max_Inter;
-
+
if (New_Status == APP_BLE_FAST_ADV)
{
Min_Inter = AdvIntervalMin;
@@ -872,11 +877,11 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
if (ret == BLE_STATUS_SUCCESS)
{
APP_DBG_MSG("Successfully Stopped Advertising \n");
- }
+ }
else
{
APP_DBG_MSG("Stop Advertising Failed , result: %d \n", ret);
- }
+ }
}
BleApplicationContext.Device_Connection_Status = New_Status;
@@ -893,10 +898,10 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
BleApplicationContext.BleApplicationContext_legacy.advtServUUID,
0,
0);
+
/* Update Advertising data */
ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
-
- if (ret == BLE_STATUS_SUCCESS)
+ if (ret == BLE_STATUS_SUCCESS)
{
if (New_Status == APP_BLE_FAST_ADV)
{
@@ -907,7 +912,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
else
{
APP_DBG_MSG("Successfully Start Low Power Advertising \n");
- }
+ }
}
else
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/hrs_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/hrs_app.c
index e84751eaa..081905ee3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/hrs_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/hrs_app.c
@@ -65,6 +65,7 @@ PLACE_IN_SECTION("BLE_APP_CONTEXT") static HRSAPP_Context_t HRSAPP_Context;
/**
* END of Section BLE_APP_CONTEXT
*/
+
/* USER CODE BEGIN PV */
/* USER CODE END PV */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/SW4STM32/syscalls.c
index 9b7c4071a..e266506b6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/SW4STM32/syscalls.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/SW4STM32/syscalls.c
@@ -3,23 +3,20 @@
**
** File : syscalls.c
**
-** Author : Auto-generated by System workbench for STM32
-**
** Abstract : System Workbench Minimal System calls file
**
** For more information about which c-functions
** need which of these lowlevel functions
** please consult the Newlib libc-manual
**
-** Target : STMicroelectronics STM32
+** Environment : System Workbench for MCU
**
** Distribution: The file is distributed “as is,” without any warranty
** of any kind.
**
*****************************************************************************
-** @attention
**
-** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
@@ -28,7 +25,7 @@
** 2. Redistributions in binary form 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 STMicroelectronics nor the names of its contributors
+** 3. Neither the name of Ac6 nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..10c61f9ac 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h
deleted file mode 100644
index 96479cedc..000000000
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
-******************************************************************************
-* @file appli_nvm.h
-* @author BLE Mesh Team
-* @version V1.11.000
-* @date 25-07-2019
-* @brief Header file for the user application file
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-*
-* 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 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 STMicroelectronics nor the names of its contributors
-* may be used to endorse or promote products derived from this software
-* without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
-*
-* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
-* (MoBLE) technology. The present solution is developed and maintained for both
-* Mesh library and Applications solely by STMicroelectronics.
-*
-******************************************************************************
-*/
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __APPLI_NVM_H
-#define __APPLI_NVM_H
-
-/* Includes ------------------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported variables ------------------------------------------------------- */
-#define APP_NVM_BASE ((unsigned int)appNvmBase)
-#define APP_NVM_SIZE 4096U
-#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
-#define PRVN_NVM_PAGE_SIZE 4096U
-
-/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
-MOBLE_RESULT AppliNvm_FactorySettingReset(void);
-//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
-MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
-void AppliNvm_Process(void);
-void AppliNvm_SaveMessageParam (void);
-MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 SubPageSize,
- MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset);
-MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
-MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data, uint8_t size);
-MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
-void AppliPrvnNvm_Process(void);
-
-MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
-
-MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
-void AppliNvm_saveProvisionerDevKey(MOBLEUINT8 *data , MOBLEUINT8 size
- , MOBLEUINT8 *prvnFlag);
-#endif /* __APPLI_NVM_H */
-
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
-
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/readme.txt
deleted file mode 100644
index 861e91274..000000000
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/readme.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- @page BLE_MeshLightingDemo example
-
- @verbatim
- ******************** (C) COPYRIGHT 2019 STMicroelectronics *******************
- * @file BLE/BLE_MeshLightingDemo/readme.txt
- * @author MCD Application Team
- * @brief Description of the BLE Mesh Lighting demo example.
- ******************************************************************************
- *
- * Copyright (c) 2019 STMicroelectronics. All rights reserved.
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- @endverbatim
-
-@par Example Description
-This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
-
-@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
- based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
- a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
- than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
- To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
-
-@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
- to have correct HAL operation.
-
-@par Directory contents
- mesh_lighting_demo
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h Header for all modules with common definition
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h Parameters configuration file of the application
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h Interface to support debug in the application
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h Parameters configuration file of the application
- - BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h Configuration file of the HW
- - BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
- - BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
- - BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
- - BLE/BLE_MeshLightingDemo/Core/Inc/main.h Header for main.c module
- - BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
- - BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
- - BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
- - BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h Configuration file of the utilities
- - BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
- - BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c Interface to support debug in the application
- - BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c Initialization of the application
- - BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c FLASH driver needed by EE module
- - BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c Timer Server based on RTC
- - BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c UART Driver
- - BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
- - BLE/BLE_MeshLightingDemo/Core/Src/main.c Main program
- - BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c Low Power Manager Interface
- - BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c Interrupt handlers
- - BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c stm32wbxx system source file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/app_ble.c BLE Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_config_client.c Application interface for Config CLient Mesh Model
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_config_client.h Header of Application interface for Config CLient Mesh Model
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic_client.c Application interface for Client Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic_client.h Header of Application interface for Client Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_client.c Application interface for Client Light Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_client.h Header of Application interface for Client Light Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/ble_conf.h BLE Services configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/hal_common.h Header for common function of HAL file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/tl_if.c Transport Layer interface
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/user_if.h Header file for User interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/user_if.c User interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
-
-
-@par Hardware and Software environment
-
- - This example runs on STM32WB55xx devices.
-
- - This example has been tested with an STMicroelectronics STM32WB55VG-Nucleo
- board and can be easily tailored to any other supported device
- and development board.
-
-@par How to use it ?
-
-This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
-If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
-All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
-Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
-Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
-Wireless Coprocessor binary.
-
-In order to make the program work, you must do the following:
- - Open your preferred toolchain
- - Rebuild all files and load your image into target memory
- - Run the example
-
-For more details refer to the Application Note:
- AN5292_STM32WB_How_to_build_BLE_Mesh_Application
-
-* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
- */
- \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
index 9dbfbba05..9dbfbba05 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
index 4b654f07b..4b3385bcf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
@@ -116,7 +116,7 @@
#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
-#define POWEROFF_EXTI_IRQHandler EXTI2_IRQHandler
+#define POWEROFF_EXTI_IRQHandler EXTI15_10_IRQHandler
#define CFG_MAX_CONNECTION 1
@@ -299,7 +299,7 @@
* When set to 1, the low power mode is enable
* When set to 0, the device stays in RUN mode
*/
-#define CFG_LPM_SUPPORTED 0
+#define CFG_LPM_SUPPORTED 1
/******************************************************************************
* Timer Server
@@ -423,14 +423,12 @@ typedef enum
#define CFG_DEBUG_TRACE 1
#endif
-#if 1
#if (CFG_DEBUG_TRACE != 0)
#undef CFG_LPM_SUPPORTED
#undef CFG_DEBUGGER_SUPPORTED
#define CFG_LPM_SUPPORTED 0
#define CFG_DEBUGGER_SUPPORTED 1
#endif
-#endif
/**
* When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h
index 13485c16b..13485c16b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h
index 5d85cd90c..5d85cd90c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
index 1e2d7a616..1e2d7a616 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h
index 18c088d3e..18c088d3e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h
index 271a222a9..271a222a9 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h
index 41f226faf..41f226faf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
index 3de57ae3e..3de57ae3e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h
index 0270583e8..0270583e8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h
index 06d41fa17..06d41fa17 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h
index 4b9e79dde..4b9e79dde 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c
index 246173ae6..246173ae6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
index db8838a8f..db8838a8f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c
index 882181c8c..882181c8c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c
index c842ba55e..c842ba55e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c
index cb97bd718..cb97bd718 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c
index 404bb2e3b..404bb2e3b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
index 95537ac98..95537ac98 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c
index 1418e0a36..1418e0a36 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c
index 8120bda4a..8120bda4a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c
index 9e9b79832..9e9b79832 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd
new file mode 100644
index 000000000..82cefa409
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd
@@ -0,0 +1,2834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_LPN</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+ <configuration>
+ <name>Lighting_Provisioner</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
new file mode 100644
index 000000000..1891566e8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
@@ -0,0 +1,1339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_LPN</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Lighting_LPN\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Lighting_LPN\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Lighting_LPN\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.80.2.11970</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>CORE_CM4</state>
+ <state>STM32</state>
+ <state>ENABLE_USART</state>
+ <state>TRACE_ENABLE_NO_FUNCTION</state>
+ <state>SERVER</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Inc</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\app</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\Inc</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>BLE_MeshLightingLPN.hex</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>BLE_MeshLightingLPN.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_IAR.a</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_IARv8.a</state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>Coder</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_debug.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\lp_timer.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ </group>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>app</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\app_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_lc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_mesh.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_nvm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\models_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\pal_nvm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\PWM_config.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\PWM_handlers.c</name>
+ </file>
+ </group>
+ <group>
+ <name>target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_i2c.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_i2c_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>ble</name>
+ <group>
+ <name>blesvc</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\common.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_lc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\mesh.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Src\mesh_cfg.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\time_scene.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\vendor.c</name>
+ </file>
+ </group>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gatt_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hal_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hci_le.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_l2cap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template\osal.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/Project.eww
index 72bdfe1c3..d692bd89f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/Project.eww
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/Project.eww
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<workspace>
<project>
- <path>$WS_DIR$\BLE_MeshLightingDemo.ewp</path>
+ <path>$WS_DIR$\BLE_MeshLightingLPN.ewp</path>
</project>
<batchBuild />
</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf
index 5f36da686..5f36da686 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/stm32wb55xx_flash_cm4.icf
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx
new file mode 100644
index 000000000..a0a5dde69
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx
@@ -0,0 +1,1188 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>Lighting_LPN</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>18</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>0</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>1</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>0</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>BIN\UL2CM3.DLL</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint/>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>0</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Application/Core</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_debug.c</PathWithFileName>
+ <FilenameWithoutPath>app_debug.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_entry.c</PathWithFileName>
+ <FilenameWithoutPath>app_entry.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_flash.c</PathWithFileName>
+ <FilenameWithoutPath>hw_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_timerserver.c</PathWithFileName>
+ <FilenameWithoutPath>hw_timerserver.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_uart.c</PathWithFileName>
+ <FilenameWithoutPath>hw_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/lp_timer.c</PathWithFileName>
+ <FilenameWithoutPath>lp_timer.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/main.c</PathWithFileName>
+ <FilenameWithoutPath>main.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32_lpm_if.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_it.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_it.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>startup_stm32wb55xx_cm4.s</PathWithFileName>
+ <FilenameWithoutPath>startup_stm32wb55xx_cm4.s</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/STM32_WPAN/app</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/app_ble.c</PathWithFileName>
+ <FilenameWithoutPath>app_ble.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_generic.c</PathWithFileName>
+ <FilenameWithoutPath>appli_generic.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_light.c</PathWithFileName>
+ <FilenameWithoutPath>appli_light.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_light_lc.c</PathWithFileName>
+ <FilenameWithoutPath>appli_light_lc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_mesh.c</PathWithFileName>
+ <FilenameWithoutPath>appli_mesh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_nvm.c</PathWithFileName>
+ <FilenameWithoutPath>appli_nvm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_sensor.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_vendor.c</PathWithFileName>
+ <FilenameWithoutPath>appli_vendor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/models_if.c</PathWithFileName>
+ <FilenameWithoutPath>models_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/pal_nvm.c</PathWithFileName>
+ <FilenameWithoutPath>pal_nvm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/PWM_config.c</PathWithFileName>
+ <FilenameWithoutPath>PWM_config.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/PWM_handlers.c</PathWithFileName>
+ <FilenameWithoutPath>PWM_handlers.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/STM32_WPAN/target</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/target/hw_ipcc.c</PathWithFileName>
+ <FilenameWithoutPath>hw_ipcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Doc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>5</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../readme.txt</PathWithFileName>
+ <FilenameWithoutPath>readme.txt</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_nucleo.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/system_stm32wbxx.c</PathWithFileName>
+ <FilenameWithoutPath>system_stm32wbxx.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_cortex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_i2c.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_i2c_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>38</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>39</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>40</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>41</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>42</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>43</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>44</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>45</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</PathWithFileName>
+ <FilenameWithoutPath>common.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>46</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</PathWithFileName>
+ <FilenameWithoutPath>generic.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>47</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</PathWithFileName>
+ <FilenameWithoutPath>light.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>48</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</PathWithFileName>
+ <FilenameWithoutPath>light_lc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>49</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</PathWithFileName>
+ <FilenameWithoutPath>mesh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>50</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</PathWithFileName>
+ <FilenameWithoutPath>mesh_cfg.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>51</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</PathWithFileName>
+ <FilenameWithoutPath>sensors.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>52</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</PathWithFileName>
+ <FilenameWithoutPath>svc_ctl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>53</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</PathWithFileName>
+ <FilenameWithoutPath>time_scene.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>54</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</PathWithFileName>
+ <FilenameWithoutPath>vendor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/core</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>55</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_gap_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>56</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_gatt_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>57</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_hal_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>58</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</PathWithFileName>
+ <FilenameWithoutPath>ble_hci_le.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>59</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_l2cap_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>60</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</PathWithFileName>
+ <FilenameWithoutPath>osal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>61</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</PathWithFileName>
+ <FilenameWithoutPath>shci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>62</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>63</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>64</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>65</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>66</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</PathWithFileName>
+ <FilenameWithoutPath>tl_mbox.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</PathWithFileName>
+ <FilenameWithoutPath>dbg_trace.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>68</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</PathWithFileName>
+ <FilenameWithoutPath>otp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>69</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>70</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/sequencer/stm32_seq.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_seq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>71</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</PathWithFileName>
+ <FilenameWithoutPath>stm_list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>72</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</PathWithFileName>
+ <FilenameWithoutPath>stm_queue.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>14</GroupNumber>
+ <FileNumber>73</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</PathWithFileName>
+ <FilenameWithoutPath>libBle_Mesh_CM4_Keil.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>74</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</PathWithFileName>
+ <FilenameWithoutPath>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>1</RteFlg>
+ </Group>
+
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
new file mode 100644
index 000000000..b5ec1758c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>Lighting_LPN</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
+ <PackURL>http://www.keil.com/pack</PackURL>
+ <Cpu>IRAM(0x20000000,0x000040000) IROM(0x08000000,0x001000000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</FlashDriverDll>
+ <DeviceId>0</DeviceId>
+ <RegisterFile>$$Device:STM32WB55RGVx$Drivers\CMSIS\Device\ST\STM32WBxx\Include\stm32wbxx.h</RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32WB55RGVx$CMSIS\SVD\STM32WBxx_CM4.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>Lighting_LPN\Exe\</OutputDirectory>
+ <OutputName>BLE_MeshLightingLPNDemo</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>1</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>0</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments> -REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments> -MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4096</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>BIN\UL2CM3.DLL</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>1</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0x40000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x1000000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define>USE_STM32WBXX_NUCLEO,STM32WB55xx,USE_HAL_DRIVER,CORE_CM4,STM32,ENABLE_USART,TRACE_ENABLE_NO_FUNCTION,SERVER</Define>
+ <Undefine></Undefine>
+ <IncludePath>../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc;../Core/Inc;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../STM32_WPAN/app;../../../../../../Middlewares/ST/STM32_WPAN/ble;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <uClangAs>0</uClangAs>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Application/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>app_debug.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_debug.c</FilePath>
+ </File>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>lp_timer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/lp_timer.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/STM32_WPAN/app</GroupName>
+ <Files>
+ <File>
+ <FileName>app_ble.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/app_ble.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_generic.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_generic.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_light.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light_lc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_light_lc.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_mesh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_mesh.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_nvm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_nvm.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_sensor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_sensor.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_vendor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_vendor.c</FilePath>
+ </File>
+ <File>
+ <FileName>models_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/models_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>pal_nvm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/pal_nvm.c</FilePath>
+ </File>
+ <File>
+ <FileName>PWM_config.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/PWM_config.c</FilePath>
+ </File>
+ <File>
+ <FileName>PWM_handlers.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/PWM_handlers.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/STM32_WPAN/target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_nucleo.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <Files>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_i2c.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_i2c_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
+ <Files>
+ <File>
+ <FileName>common.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</FilePath>
+ </File>
+ <File>
+ <FileName>generic.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</FilePath>
+ </File>
+ <File>
+ <FileName>light.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</FilePath>
+ </File>
+ <File>
+ <FileName>light_lc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</FilePath>
+ </File>
+ <File>
+ <FileName>mesh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</FilePath>
+ </File>
+ <File>
+ <FileName>mesh_cfg.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</FilePath>
+ </File>
+ <File>
+ <FileName>sensors.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</FilePath>
+ </File>
+ <File>
+ <FileName>svc_ctl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</FilePath>
+ </File>
+ <File>
+ <FileName>time_scene.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</FilePath>
+ </File>
+ <File>
+ <FileName>vendor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/core</GroupName>
+ <Files>
+ <File>
+ <FileName>ble_gap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_gatt_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hal_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hci_le.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_l2cap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>osal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>hci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>hci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
+ <Files>
+ <File>
+ <FileName>libBle_Mesh_CM4_Keil.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
+ <Files>
+ <File>
+ <FileName>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.1.2" condition="ARMv6_7_8-M Device">
+ <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.4.0"/>
+ <targetInfos>
+ <targetInfo name="Lighting_LPN"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s
index e05e3c5ca..e05e3c5ca 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/startup_stm32wb55xx_cm4.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct
index 63845c07b..63845c07b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/stm32wb55xx_flash_cm4.sct
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c
index e9b50f44e..e9b50f44e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h
index a229ec666..a229ec666 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c
index 698bdced8..698bdced8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h
index a27fa757b..a27fa757b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
index c96144dff..c96144dff 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h
index d87d3e466..d87d3e466 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c
index 553bc0a86..578a6f4bf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c
@@ -76,6 +76,7 @@ const MOBLEUINT8 aConfigAppKeyDeleteDefault[3]=
(MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
(MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff)};
+
const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
{ /* NetKeyIndex : 2B
Index of the NetKey */
@@ -84,11 +85,10 @@ const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
const MOBLEUINT8 aNoParamDefaultConfig;
-#define MAX_CONFIG_PARAM_SIZE 22
const MOBLEUINT8 aNoInitParamDefault[MAX_CONFIG_PARAM_SIZE]= {0};
/* Private macro -------------------------------------------------------------*/
-MOBLEUINT16 aSigModelsToBind[] =
+MOBLEUINT16 aSigModelsToBind[][MAX_ELEMENTS_PER_NODE] = {
{
GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
@@ -96,8 +96,26 @@ MOBLEUINT16 aSigModelsToBind[] =
// SENSOR_SERVER_MODEL_ID,
// LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
// LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ }
};
+
MOBLEUINT16 aPublishModels[] =
{
GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
@@ -714,13 +732,11 @@ eClientSendMsgState_t eClientSendMsgState; /* Keeps the state of Sent Message */
eServerRespRecdState_t eServerRespRecdState; /* Keeps the state of Received Message */
/* Private function prototypes -----------------------------------------------*/
-MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx);
-
/* Private functions ---------------------------------------------------------*/
/**
* @brief This function is callback from library after the Provisioning is
- completed by embedded Provisioner.
+ completed by embedded Provisioner
* @param prvState: Provisioning State of the Node. Expecting "1" when the
provisioning is completed
* @retval None
@@ -735,6 +751,7 @@ void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState)
}
}
+
/**
* @brief This function is Init function for the state machine of the
Configuration Client. The Function shall be called everytime a new
@@ -751,6 +768,7 @@ MOBLE_RESULT Appli_ConfigClient_Init(void)
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief Appli_ConfigClient_Process: This function is Process function and
shall be called from while(1) loop
@@ -821,7 +839,6 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
else if (eClientSendMsgState == CompositionGet_State)
{
-
nowClockTime = Clock_Time();
if( (nowClockTime - NodeInfo.Initial_time) < CONFIGURATION_START_DELAY)
{
@@ -833,7 +850,6 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
{
eClientSendMsgState = AppKeyAdd_State; /* Change the state to Next */
eServerRespRecdState = NodeIdle_State;
-
}
else
{
@@ -903,10 +919,8 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
}
-
-
/**
-* @brief This function is called to Get The Composition data from the
+* @brief This function is called to Get the Composition data from the
* a node under configuration
* @param None
* @retval MOBLE_RESULT
@@ -915,14 +929,18 @@ MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT8 retry;
+ MOBLEUINT16 dst_peer;
switch(eServerRespRecdState)
{
case NodeIdle_State:
ConfigClient_SaveMsgSendingTime();
+
+ dst_peer = GetAddressToConfigure();
+
/* Start the Get Composition Message */
- ConfigClient_CompositionDataGet();
+ ConfigClient_CompositionDataGet(dst_peer);
/* Switch to InProgress_State */
eServerRespRecdState = InProgress_State;
@@ -946,7 +964,7 @@ MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
}
else if (retry == CLIENT_TX_TIMEOUT)
{
- eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */;
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
}
break;
@@ -962,7 +980,7 @@ MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
/**
* @brief Appli_ConfigClient_DefaultAppKeyAdd: This function is called to
- add the default AppKeys and net keys to a node under configuration
+ add the default AppKeys and NetKeys to a node under configuration
* @param None
* @retval MOBLE_RESULT
*/
@@ -973,6 +991,7 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
MOBLEUINT8 *pAppKey;
MOBLEUINT16 netKeyIndex = DEFAULT_NETKEY_INDEX;
MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLE_ADDRESS dst_addr;
pAppKey = GetNewProvNodeAppKey();
@@ -980,10 +999,15 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
{
case NodeIdle_State:
ConfigClient_SaveMsgSendingTime();
+
+ dst_addr = GetAddressToConfigure();
+
/* Start the Set Appkey message */
- ConfigClient_AppKeyAdd (netKeyIndex,
+ ConfigClient_AppKeyAdd ( dst_addr,
+ netKeyIndex,
appKeyIndex,
pAppKey);
+
/* Switch to InProgress_State */
eServerRespRecdState = InProgress_State;
break;
@@ -1005,7 +1029,7 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
}
else if (retry == CLIENT_TX_TIMEOUT)
{
- eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */;
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
}
break;
@@ -1018,21 +1042,15 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
return result;
}
+
/**
* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
function to Bind the element(node) with AppKeyIndex and Models
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
{
-
- /*
- ElementAddress : 2B : Address of the element
- AppKeyIndex : 2B : Index of the AppKey
- ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID
- */
static MOBLEUINT32 modelIdentifier;
static MOBLEUINT8 elementIndex;
static MOBLEUINT8 indexSIGmodels;
@@ -1053,18 +1071,32 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
elementIndex = 0; /* Initialize it for the complete loop */
indexSIGmodels = 0; /* Initialize it for the complete loop */
indexVendormodels = 0;
- modelIdentifier = GetSIGModelToBindApp(elementIndex,indexSIGmodels );
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ modelIdentifier = GetSIGModelToBindApp(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
/* Switch to NodeSendMessage_State */
eServerRespRecdState = NodeSendMessage_State;
break;
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
case NodeSendMessage_State:
/* Start the AppBindModel_State message */
elementAddress = GetServerElementAddress(elementIndex);
- ConfigClient_SaveMsgSendingTime();
/* Switch to InProgress_State */
eServerRespRecdState = InProgress_State;
+
+ ConfigClient_SaveMsgSendingTime();
+
/* Send the Message to the server */
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
break;
@@ -1091,16 +1123,13 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
if (indexSIGmodels < numSIGmodels )
{/* if index is still less, then we have scope of reading 1 more index */
- /* Get the Next Model and Bind it again till all SIG Models are binded */
- modelIdentifier = GetSIGModelToBindApp(elementIndex,indexSIGmodels );
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeNextSigModel_State;
/* Switch to InProgress_State */
}
else if (indexVendormodels < numVendorModels)
{
/*Now, do binding for Vendor Model */
- modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeNextVendorModel_State;
}
else
{
@@ -1116,8 +1145,10 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
else if (elementIndex < numofElements)
{ /* When the Element Index is still less than the total number of
elements in the Node: So, Restart the cycle */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
- eServerRespRecdState = NodeIdle_State;
+ eServerRespRecdState = NodeNextSigModel_State;
}
}
break;
@@ -1149,8 +1180,7 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
/**
* @brief AppliConfigClient_SubscriptionAddDefault: This function is application
used for adding subscription to the element(node) for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
@@ -1175,11 +1205,23 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
elementIndex = 0; /* Initialize it for the complete loop */
indexSIGmodels = 0; /* Initialize it for the complete loop */
indexVendormodels = 0;
- modelIdentifier = GetSIGModelToSubscribe(elementIndex,indexSIGmodels );
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ modelIdentifier = GetSIGModelToSubscribe(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
/* Switch to NodeSendMessage_State */
eServerRespRecdState = NodeSendMessage_State;
break;
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
case NodeSendMessage_State:
elementAddress = GetServerElementAddress(elementIndex);
ConfigClient_SaveMsgSendingTime();
@@ -1214,15 +1256,12 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
{/* if index is still less, then we have scope of reading 1 more index */
/* Get the Next Model and Bind it again till all SIG Models are binded */
- modelIdentifier = GetSIGModelToSubscribe(elementIndex,indexSIGmodels);
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeNextSigModel_State;
}
else if (indexVendormodels < numVendorModels)
{
- modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
- eServerRespRecdState = NodeSendMessage_State;
-
+ eServerRespRecdState = NodeNextVendorModel_State;
}
else
{
@@ -1238,7 +1277,7 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
{ /* When the Element Index is still less than the total number of
elements in the Node: So, Restart the cycle */
- eServerRespRecdState = NodeIdle_State;
+ eServerRespRecdState = NodeNextSigModel_State;
indexSIGmodels =0; /* Reset the variable again for the next element */
indexVendormodels = 0;
}
@@ -1268,12 +1307,12 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
return result;
}
+
/**
* @brief AppliConfigClient_PublicationSetDefault: This function is application
used for adding publication settings to the element(node)
for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
@@ -1305,12 +1344,24 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
elementIndex = 0; /* Initialize it for the complete loop */
indexSIGmodels = 0; /* Initialize it for the complete loop */
indexVendormodels = 0;
- modelIdentifier = GetSIGModelToPublish(elementIndex,indexSIGmodels );
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ modelIdentifier = GetSIGModelToPublish(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
/* Switch to NodeSendMessage_State */
eServerRespRecdState = NodeSendMessage_State;
+ break;
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels);
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
break;
+
case NodeSendMessage_State:
elementAddress = GetServerElementAddress(elementIndex);
@@ -1353,23 +1404,18 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
if (indexSIGmodels < numSIGmodels )
{/* if index is still less, then we have scope of reading 1 more index */
-
- /* Get the Next Model and Bind it again till all SIG Models are binded */
- modelIdentifier = GetSIGModelToPublish(elementIndex,indexSIGmodels);
- eServerRespRecdState = NodeSendMessage_State;
-
+ eServerRespRecdState = NodeNextSigModel_State;
}
else if (indexVendormodels < numVendorModels)
{
- modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels );
- eServerRespRecdState = NodeSendMessage_State;
-
+ eServerRespRecdState = NodeNextVendorModel_State;
}
else
{
/* Now, the element index is handled, change the element index */
elementIndex++;
numofElements = ConfigClient_GetNodeElements();
+
if (elementIndex == numofElements)
{/* we are comparing Index whose counting started from 0, becomes equal,
then exit the loop */
@@ -1379,7 +1425,7 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
{ /* When the Element Index is still less than the total number of
elements in the Node: So, Restart the cycle */
- eServerRespRecdState = NodeIdle_State;
+ eServerRespRecdState = NodeNextSigModel_State;
indexSIGmodels =0; /* Reset the variable again for the next element */
indexVendormodels = 0;
}
@@ -1409,12 +1455,12 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
return result;
}
+
/**
-* @brief AppliConfigClient_PublicationSetDefault: This function is application
+* @brief AppliConfigClient_SelfPublicationSetDefault: This function is application
used for adding publication settings to the element(node)
for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
@@ -1428,20 +1474,52 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
MOBLEUINT16 elementAddress;
- MOBLEUINT32 modelIdentifier;
- MOBLEUINT8 numSIGmodels;
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- numSIGmodels = sizeof(aPublishModels)/sizeof(MOBLEUINT16);
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
- for (MOBLEUINT8 index=0; index < numSIGmodels; index++)
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
{
- /* Start the Publication Add message */
- elementAddress = BLEMesh_GetAddress();
- modelIdentifier = 0;
- modelIdentifier = (MOBLEUINT16) aPublishModels[index];
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
- /* Switch to InProgress_State */
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
ConfigClient_PublicationSet(elementAddress,
publishAddress,
appKeyIndex,
@@ -1452,74 +1530,125 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
publishRetransmitIntervalSteps,
modelIdentifier);
}
-
+ }
+ }
return result;
}
/**
-* @brief AppliConfigClient_PublicationSetDefault: This function is application
- used for adding publication settings to the element(node)
+* @brief AppliConfigClient_SelfSubscriptionSetDefault: This function is application
+ used for adding Subscription settings to the element(node)
for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
- MOBLEUINT32 modelIdentifier;
+ MOBLEUINT32 modelIdentifier=0;
MOBLEUINT16 elementAddress;
- MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 elementIndex;
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- numSIGmodels = sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ /*If limit is reaching to no models*/
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
- for (MOBLEUINT8 index=0; index < numSIGmodels; index++)
+ /*Checking for Vendor Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
{
- /* Start the Publication Add message */
- elementAddress = BLEMesh_GetAddress();
- modelIdentifier = 0;
- modelIdentifier = (MOBLEUINT16) aSubscribeModels[index];
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
}
+ }
+ }
return result;
}
+
/**
* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
function to Bind the element(node) with AppKeyIndex and Models
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
- /*
- ElementAddress : 2B : Address of the element
- AppKeyIndex : 2B : Index of the AppKey
- ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID
- */
- MOBLEUINT32 modelIdentifier;
+ MOBLEUINT32 modelIdentifier=0;
MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
MOBLEUINT16 elementAddress;
- MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- numSIGmodels = sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
- for (MOBLEUINT8 index=0; index < numSIGmodels; index++)
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
{
- elementAddress = BLEMesh_GetAddress();
- modelIdentifier = 0;
- modelIdentifier = (MOBLEUINT16) aSigModelsToBind[index];
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
}
-
+ }
+
+ }
return result;
}
@@ -1534,6 +1663,7 @@ void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
eServerRespRecdState = CompositionRecd_State;
}
+
/**
* @brief Appli_AppKeyStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1546,6 +1676,7 @@ void Appli_AppKeyStatusCb(MOBLEUINT8 status)
eServerRespRecdState = AppkeyAck_State;
}
+
/**
* @brief Appli_AppBindModelStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1558,6 +1689,7 @@ void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
eServerRespRecdState = AppBindModelAck_State;
}
+
/**
* @brief Appli_SubscriptionAddStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1570,6 +1702,7 @@ void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
eServerRespRecdState = SubscriptionAck_State;
}
+
/**
* @brief Appli_PublicationStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1582,6 +1715,7 @@ void Appli_PublicationStatusCb(MOBLEUINT8 status)
eServerRespRecdState = PublicationStatus_State;
}
+
/**
* @brief Appli_NodeResetStatusCb: This function is callback from config
client middleware on reception of the Node Reset response
@@ -1594,52 +1728,87 @@ void Appli_NodeResetStatusCb(void)
eServerRespRecdState = NodeResetStatus_State;
}
+
/**
* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
{
+
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ MOBLEUINT16 model_id;
+ MOBLEUINT8 index;
+ MOBLEUINT8 idxSIG = *pModelIndex;
+
+ for (index = idxSIG; index < numberOfModels ; index++ )
+ {
+ model_id = aNodeElements[elementIndex].aSIGModels[index];
+ if (MODEL_IS_FOUNDATION_MODEL(model_id))
+ {
+ /* Do nothing, let the next model_if be scanned */
+ model_id = 0xffff; /* Invalid Model ID */
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *pModelIndex = index;
+ return model_id;
#else
- return aSigModelsToBind[idxSIG] ;
+ return aSigModelsToBind[idxSIG][elementIdx] ;
#endif
}
+
/**
* @brief GetVendorModelToBindApp: This function gets the Vendor Model to Bind
-* @param None
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[indexModels];
#else
return VENDORMODEL_STMICRO_ID1 ;
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountSIGModelToBindApp: This function gets the NUMBER of SIG Model
+ to Bind
+* @param elementIndex Index of the Element for which the Count is needed
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
#else
return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element for which the Count is needed
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
#else
return NUM_VENDOR_MODELS_TO_BIND_APP;
#endif
@@ -1647,111 +1816,147 @@ MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx)
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetSIGModelToPublish: This function gets the SIG Model to Publish
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
#else
return aPublishModels[idxSIG] ;
#endif
}
+
/**
-* @brief GetVendorModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @param idxSIG Pointer to Index of the Model
* @retval MOBLE_RESULT
*/
-MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
#else
return VENDORMODEL_STMICRO_ID1 ;
#endif
}
+
/**
* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
#else
return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
#endif
}
+
/**
-* @brief GetCountVendorModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
#else
return NUM_VENDOR_MODELS_TO_PUBLISH;
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetSIGModelToSubscribe: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
#else
return aSubscribeModels[idxSIG] ;
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetVendorModelToSubscribe: This function Gets the Vendor Model ID for
+ Subscription
+* @param elementIndex Index of the Element
+* @param idxSIG Index to the Model ID to Subscribe
* @retval MOBLE_RESULT
*/
-MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 idxSIG)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
#else
return VENDORMODEL_STMICRO_ID1 ;
#endif
}
+
/**
-* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountSIGModelToSubscribe: This function gets the SIG Model to Subscribe
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
#else
return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
#endif
}
+
/**
-* @brief GetCountVendorModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountVendorModelToPublish: This function gets the Count of the
+ Vendor Model to Subscribe
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
#else
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
#endif
}
+
/**
-* @brief AppliConfigClient_SendMessageDefault: This function gets the SIG Model to Bind
+* @brief AppliConfigClient_SendMessageDefault: This function is used for sending
+ a message.
+ ** The Function is not yet written fully
* @param None
* @retval MOBLE_RESULT
*/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h
index d9465958b..34169448c 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h
@@ -29,6 +29,9 @@
/* Exported macro ------------------------------------------------------------*/
+#define MAX_CONFIG_PARAM_SIZE 22
+#define CONFIGURE_AS_PER_COMPOSITION_DATA
+
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
@@ -53,19 +56,30 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void);
MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void);
Composition_Data_Page0_t* Appli_GetNodeCompositionBuff (void);
-MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx);
-MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8);
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8);
-MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
+
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c
index 082e7d11f..57c1bc7cf 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c
@@ -56,6 +56,10 @@ Appli_Generic_PowerOnOffSet AppliPowerOnSet;
Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet;
/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid);
/* Private functions ---------------------------------------------------------*/
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
@@ -80,6 +84,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
{
Appli_LightPwmValue.IntensityValue = AppliOnOffSet.Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
+ if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+ {
+ AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ }
+ else
+ {
+ AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ }
+
if(AppliOnOffSet.Present_OnOffValue > 16000)
{
BSP_LED_On(LED_BLUE);
@@ -118,7 +131,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* @brief Appli_Generic_OnOff_Status: This function is callback for Application
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
@@ -126,9 +139,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
*/
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
{
+ MOBLEUINT8 i;
+
TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Present OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Target OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", pOnOff_status[i]);
+ }
return MOBLE_RESULT_SUCCESS;
}
@@ -168,7 +192,11 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0);
+ if(AppliLevelSet.Present_Level16 < 0x00)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+ duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
Appli_LightPwmValue.IntensityValue = duty;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -193,13 +221,13 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
/**
-* @brief Appli_Generic_LevelDelta_Set: This function is callback for Application
+* @brief Appli_Generic_Delta_Set: This function is callback for Application
* when Generic Level Delta message is received
* @param pdeltalevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
MOBLEUINT8 OptionalValid)
{
@@ -223,13 +251,13 @@ MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelPara
/**
-* @brief Appli_Generic_LevelMove_Set: This function is callback for Application
+* @brief Appli_Generic_Move_Set: This function is callback for Application
* when Generic Level Move message is received
* @param pdeltaMoveParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
MOBLEUINT8 OptionalValid)
{
@@ -277,7 +305,7 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
/* set the flag value for NVM store */
- RestoreFlag = No_NVM_FLAG;
+ //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
AppliNvm_SaveMessageParam();
@@ -365,6 +393,8 @@ MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
*pOnOff_Value = AppliOnOffSet.Present_OnOffValue;
*(pOnOff_Value+1) = AppliOnOffSet.Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet.TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet.TargetValue >> 8;
TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Value: Value %d!\n\r",
AppliOnOffSet.Present_OnOffValue);
return MOBLE_RESULT_SUCCESS;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h
index a68c231f3..41228825e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h
@@ -53,6 +53,7 @@ typedef struct
{
MOBLEUINT8 Present_OnOff;
MOBLEUINT16 Present_OnOffValue;
+ MOBLEUINT16 TargetValue;
}Appli_Generic_OnOffSet;
typedef struct
@@ -67,7 +68,7 @@ typedef struct
typedef struct
{
- MOBLEINT16 DefaultTransitionTime;
+ MOBLEUINT8 DefaultTransitionTime;
}Appli_Generic_DefaultTransitionSet;
typedef struct
@@ -84,8 +85,8 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
MOBLEUINT32 plength);
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*, MOBLEUINT8);
-MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
-MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
MOBLEUINT8 OptionalValid);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
MOBLEUINT32 plength);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c
index 0c36b2294..0c36b2294 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h
index 8726f76e8..eb1c7dcf2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h
@@ -36,7 +36,6 @@
MOBLE_RESULT Appli_ConfigClient_Set(void);
MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void);
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
#endif /* __APPLI_GENERIC_CLIENT_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c
index 24cd49583..02c6cb8c2 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c
@@ -41,6 +41,7 @@
* @{
*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -52,7 +53,7 @@ Following Variables are used for the LIGHTING Lightness MODEL
*******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
-Appli_Light_lightnessSet ApplilightnessSet;
+Appli_Light_lightnessSet ApplilightnessSet = {1,0,0,0,0,0};
Appli_Light_lightnessLinearSet ApplilightnessLinearSet;
/******************************************************************************/
@@ -92,7 +93,6 @@ Following Variables are used for the RGB board.
*******************************************************************************/
Appli_LightPwmValue_t Appli_LightPwmValue;
-
extern MOBLEUINT8 RestoreFlag;
extern MOBLEUINT8 PowerOnOff_flag;
extern MOBLEUINT8 IntensityFlag;
@@ -114,8 +114,14 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->PresentValue16;
-
+ ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+
+ if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
+ {
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ }
+
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
{
@@ -127,22 +133,8 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
- if(pLight_LightnessParam->PresentValue16 != 0x00)
- {
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->PresentValue16;
- }
-
- if(pLight_LightnessParam->PresentValue16 != 0x00)
- {
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->PresentValue16;
- }
-
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
- Appli_LightPwmValue.IntensityValue = duty;
- Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
-
/* For demo, if Level is more than 100, switch ON the LED */
- if(pLight_LightnessParam->PresentValue16 >= 0x8000)
+ if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
BSP_LED_On(LED_BLUE);
}
@@ -152,6 +144,10 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+ duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
/* set the flag value for NVM store */
RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
@@ -192,7 +188,7 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
MOBLEUINT8 OptionalValid)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->PresentValue16;
+ ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
@@ -240,7 +236,12 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
}
ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+ TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
return MOBLE_RESULT_SUCCESS;
}
@@ -338,6 +339,7 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
AppliCtlSet.PresentLightness16,
AppliCtlSet.PresentTemperature16,
AppliCtlSet.PresentCtlDelta16);
+
/* set the flag value for NVM store */
RestoreFlag = LIGHT_CTL_NVM_FLAG;
@@ -453,6 +455,10 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
return MOBLE_RESULT_SUCCESS;
}
@@ -812,6 +818,23 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
/**
+* @brief Appli_Light_GetLightnessLastStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLastState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+{
+ *(lLastState) = ApplilightnessSet.LastLightness16;
+ *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
+
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
* @brief Appli_Light_GetLightnessRangeStatus: This function is callback for Application
* to get the application values in middleware used for transition change.
* @param lRangeState: Pointer to the status message
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h
index f99a48f74..aaa600146 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h
@@ -172,6 +172,7 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState);
MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState);
MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState);
MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState);
MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c
index 96626b19a..96626b19a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h
index f216e5175..f216e5175 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c
index 6cfe8bc27..cd419fe7a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c
@@ -57,6 +57,8 @@ MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
MOBLEUINT8 OptionalValid)
{
Appli_LightLC_set.LC_mode = pLight_LC_Param->LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Mode Set: %d\n\r",
+ pLight_LC_Param->LC_mode);
return MOBLE_RESULT_SUCCESS;
}
@@ -71,6 +73,8 @@ MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
MOBLEUINT8 OptionalValid)
{
Appli_LightLC_set.LC_OM = pLight_LC_Param->LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"OM Set: %d\n\r",
+ pLight_LC_Param->LC_OM);
return MOBLE_RESULT_SUCCESS;
}
@@ -84,7 +88,9 @@ MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
MOBLEUINT8 OptionalValid)
{
- Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Light_OnOff;
+ Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Present_Light_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"OnOff Set: %d\n\r",
+ pLight_LC_Param->Present_Light_OnOff);
return MOBLE_RESULT_SUCCESS;
}
@@ -158,10 +164,11 @@ MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState)
MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
{
*(plcOnOffState) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+1) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+2) = Appli_LightLC_set.Light_OnOffState;
TRACE_M(TF_SERIAL_CTRL,"Get On Off Status: %d\n\r",
Appli_LightLC_set.Light_OnOffState);
-
return MOBLE_RESULT_SUCCESS;
}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h
index 049d95308..049d95308 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c
index 2402d0d7f..2b2f07087 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c
@@ -39,9 +39,6 @@
#include "stm32_seq.h"
#include "PWM_config.h"
-#ifdef ENABLE_PROVISIONER_FEATURE
-#include "serial_prvn.h"
-#endif
#include "mesh_cfg_usr.h"
/** @addtogroup ST_BLE_Mesh
@@ -70,10 +67,11 @@
#define USER_OUTPUT_OOB_APPLI_PROCESS 0U
#define INPUT_OOB_TIMEOUT 300U /* input Oob30 Sec timeout*/
#define PBADV_UNPROV_DEV_BEACON_INTERVAL 100U /* 100 ms */
+
#define DEVICE_KEY_SIZE 16U
#define APP_KEY_SIZE 16U
#if (LOW_POWER_FEATURE == 1)
-#define LPN_API_TIMER_INTERVAL 15*(1000000/CFG_TS_TICK_VAL) /* 15 secondes */
+#define LPN_API_TIMER_INTERVAL 30*(1000000/CFG_TS_TICK_VAL) /* 30 secondes */
#endif
/* Private macro -------------------------------------------------------------*/
#define MAX_APPLI_BUFF_SIZE 8
@@ -120,11 +118,6 @@ MOBLEUINT8 InputOobData[8] = {0};
MOBLEUINT8 inputOOBDataReady = 0;
#endif
-#ifdef ENABLE_PROVISIONER_FEATURE
-static MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE] = {0};
-static MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE] = {0};
-#endif
-MOBLEUINT16 nodeAddressOffset = 1;
/*Number Of Elements selected per Node. Maximum Elements supported = 3*/
MOBLEUINT8 NumberOfElements = APPLICATION_NUMBER_OF_ELEMENTS;
@@ -212,15 +205,10 @@ void Appli_OobAuthenticationProcess(void);
#endif
void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason);
void Appli_LowPowerProcess(void);
-#if (PROVISIONER_FEATURE == 1)
-MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey, MOBLEUINT8* appKey);
-#endif
#if (APPLI_OPTIM == 1)
static void AppliMeshTask(void);
#endif
-#if (PROVISIONER_FEATURE == 1)
-void Appli_SelfConfigurationProcess(void);
-#endif
+
/* Private functions ---------------------------------------------------------*/
/************************* Button Control functions ********************/
@@ -544,6 +532,8 @@ MOBLE_RESULT Appli_BleAttentionTimerCb(void)
#endif /* LOW_POWER_FEATURE == 0 */
return MOBLE_RESULT_SUCCESS;
}
+
+
/**
* @brief Call back function to give Output OOB information
* @param MOBLEUINT8* output_oob
@@ -563,6 +553,7 @@ void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size)
#endif
}
+
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
/**
* @brief Process for both output and Input OOB handling
@@ -587,12 +578,13 @@ void Appli_OobAuthenticationProcess(void)
}
}
#endif
+
+
/**
* @brief Call back function to provide Input OOB information
* @param MOBLEUINT8 size
* @retval MOBLEUINT8*
*/
-
MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
{
#if defined (ENABLE_AUTH_TYPE_INPUT_OOB) && (ENABLE_SERIAL_INTERFACE)
@@ -615,6 +607,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
return NULL;
#endif
}
+
+
/**
* @brief Call back function to provide Input OOB information
* @param rcvdStringBuff: buffer to store input string
@@ -631,10 +625,11 @@ void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize)
#endif
}
+
/**
-* @brief Enable Node as Sniffer to Capture all the packets
+* @brief Application BLE Disable Filter
* @param none
-* @retval Sending the value to BLE Mesh Library
+* @retval Status is replied
*/
MOBLEUINT8 Appli_BleDisableFilterCb(void)
{
@@ -674,6 +669,7 @@ void Appli_CheckForUnprovision(void)
MoblePalNvmErase(NVM_BASE, 0x1000);
MoblePalNvmErase(APP_NVM_BASE, 0);
MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -715,6 +711,28 @@ void Appli_CheckForUnprovision(void)
#endif
}
+void Appli_Unprovision(void)
+{
+ if(!ProxyFlag)
+ {
+ /* No GATT connection */
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+}
+
/**
* @brief Checks and updates Mac address to generate MAC Address
* @param void
@@ -851,168 +869,6 @@ void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason)
AppliNvm_ClearModelState();
}
-#if (PROVISIONER_FEATURE == 1)
-void SaveProvisionedNodeAddress(void)
-{
- nodeAddressOffset += 1; /* Increment the last known address by 1
- after success */
-
- Appli_ConfigClientStartNodeConfiguration(1);
-}
-
-MOBLEUINT8* GetNewProvNodeDevKey(void)
-{
- return &NewProvNodeDevKey[0];
-}
-
-MOBLEUINT8* GetNewProvNodeAppKey(void)
-{
- return &NewProvNodeAppKey[0];
-}
-
-/**
-* @brief Function to Get the Node Address for provisioning
-* @param void
-* @retval void
-*/
-MOBLE_ADDRESS GetAddressToConfigure(void)
-{
- return nodeAddressOffset; /* Take last address provisioned */
-}
-
-/**
-* @brief Function to Get the Node Address for provisioning
-* @param void
-* @retval void
-*/
-MOBLE_ADDRESS GetNewAddressToProvision(void)
-{
- return nodeAddressOffset+1; /* Take last address and increment by 1 before to
- give to provisioner FSM */
-}
-#endif
-
-/**
-* @brief callback for provision the node by provisioner.
-* @param void
-* @retval void
-*/
-void BLEMesh_ProvisionCallback(void)
-{
- ProvisionFlag = 1;
-#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
- PrvngInProcess = 0;
-#endif
- TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
-
-//#if (PROVISIONER_FEATURE == 1)
-// //nodeAddressOffset = nodeAddressOffset + 1;
-// SaveProvisionedNodeAddress();
-//#endif
-#if (LOW_POWER_FEATURE == 1)
- /* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
- HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
-#endif
-}
-
-#if (PROVISIONER_FEATURE == 1)
-/**
-* @brief callback for getting the Node Address by provisioner & giving device key.
-* @param void
-* @retval void
-*/
-MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey, MOBLEUINT8* appKey)
-{
- MOBLE_ADDRESS newNodeAddressToProvision;
- memcpy(NewProvNodeDevKey,devKey,sizeof(NewProvNodeDevKey));
- memcpy(NewProvNodeAppKey,appKey,sizeof(NewProvNodeAppKey));
-
- TRACE_M(TF_PROVISION,"Device Key: ");
- for (MOBLEUINT8 count=0 ; count<DEVICE_KEY_SIZE; count++)
- {
- TRACE_I(TF_PROVISION,"%.2x ", NewProvNodeDevKey[count]);
- }
-
- TRACE_M(TF_PROVISION,"\r\n");
- TRACE_M(TF_PROVISION,"App Key: ");
- for (MOBLEUINT8 count=0 ; count<DEVICE_KEY_SIZE; count++)
- {
- TRACE_I(TF_PROVISION,"%.2x ", NewProvNodeAppKey[count]);
- }
-
- TRACE_M(TF_PROVISION,"\r\n");
-
- AppliPrvnNvm_SaveData(NewProvNodeDevKey ,sizeof(NewProvNodeDevKey));
- newNodeAddressToProvision = GetNewAddressToProvision();
-
- TRACE_M(TF_PROVISION,"Node Address Assigning = %d \r\n",newNodeAddressToProvision);
-
- return newNodeAddressToProvision;
-}
-
-
-#define SELF_CONFIG_IDLE_STATE 0
-#define SELF_CONFIG_INIT_STATE 1
-#define SELF_CONFIG_START_STATE 2
-#define SELF_APPKEY_BIND_STATE 3
-#define SELF_SUBSCRIBE_DEFAULT_STATE 4
-#define SELF_PUBLISH_DEFAULT_STATE 5
-uint8_t self_config_state= SELF_CONFIG_IDLE_STATE;
-
-void Start_SelfConfiguration (void)
-{
- self_config_state = SELF_CONFIG_INIT_STATE;
-}
-
-/**
-* @brief callback for getting the Node Address by provisioner & giving device key.
-* @param void
-* @retval void
-*/
-void Appli_SelfConfigurationProcess(void)
-{
- /* Following functions help to Configure the Provisioner to default settings*/
-
- switch (self_config_state)
- {
- case SELF_CONFIG_IDLE_STATE:
- /* Nothing to do, just wait*/
- return;
-
- case SELF_CONFIG_INIT_STATE:
- /* This state is just to make a "NVM Process" to run once, because the
- function will exit after changing the state*/
- self_config_state = SELF_CONFIG_START_STATE;
- break;
-
- case SELF_CONFIG_START_STATE:
- ApplicationSetNodeSigModelList();
- self_config_state = SELF_APPKEY_BIND_STATE;
- break;
-
- case SELF_APPKEY_BIND_STATE:
- Appli_ConfigClient_SelfDefaultAppKeyBind();
- self_config_state = SELF_SUBSCRIBE_DEFAULT_STATE;
- break;
-
- case SELF_SUBSCRIBE_DEFAULT_STATE:
- AppliConfigClient_SelfSubscriptionSetDefault();
- self_config_state = SELF_PUBLISH_DEFAULT_STATE;
- break;
-
- case SELF_PUBLISH_DEFAULT_STATE:
- AppliConfigClient_SelfPublicationSetDefault();
- self_config_state = SELF_CONFIG_IDLE_STATE;
- break;
-
-
- default:
- break;
- }
-}
-#endif
-
-
/**
* @brief This function scans and prints unprovisioned devices
* @param unprovDeviceArray: Pointer of an array for filling unprovisioned device UUIDs
@@ -1067,9 +923,6 @@ void BLEMesh_PbAdvLinkOpenCb(void)
{
ProvisionFlag = 0;
TRACE_M(TF_PROVISION,"PB-ADV Link opened successfully \n\r");
-#ifdef ENABLE_PROVISIONER_FEATURE
- SerialPrvn_ProvisioningStatusUpdateCb(MOBLE_TRUE, 0);
-#endif
/* Turn ON Red LED*/
#if LOW_POWER_FEATURE
/* do nothing */
@@ -1078,6 +931,7 @@ void BLEMesh_PbAdvLinkOpenCb(void)
#endif
}
+
/**
* @brief Call back function called when PB-ADV link Closed
* @param none
@@ -1091,18 +945,30 @@ void BLEMesh_PbAdvLinkCloseCb(void)
/* do nothing */
#else
BSP_LED_Off(LED_RED);
-#ifdef ENABLE_PROVISIONER_FEATURE
- SerialPrvn_ProvisioningStatusUpdateCb(MOBLE_FALSE, nodeAddressOffset);
#endif
+}
+
+
+/**
+* @brief callback for provision the node by provisioner.
+* @param void
+* @retval void
+*/
+void BLEMesh_ProvisionCallback(void)
+{
+ ProvisionFlag = 1;
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 0;
#endif
- #if (PROVISIONER_FEATURE == 1)
- if (ProvisionFlag == 1)
- {
- SaveProvisionedNodeAddress();
- ProvisionFlag = 0;
- }
+ TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
+
+#if (LOW_POWER_FEATURE == 1)
+ /* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
+ HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
#endif
}
+
+
/**
* @brief callback for friendship established by friend node
* @param address of corresponding low power node
@@ -1471,6 +1337,7 @@ void Appli_IntensityControlPublishing(MOBLEUINT8* value)
}
}
+
/**
* @brief Publish the intensity value for generic level or light lightness
* This function should be called in main loop
@@ -1501,10 +1368,6 @@ void Appli_Process(void)
AppliNvm_Process();
#endif
-#if (SAVE_EMBD_PROVISION_DATA == 1)
- AppliPrvnNvm_Process();
-#endif
-
Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
@@ -1515,10 +1378,16 @@ void Appli_Process(void)
}
#endif
-#if PROVISIONER_FEATURE
- Appli_ConfigClient_Process();
- Appli_SelfConfigurationProcess();
-#endif
+#ifdef TPT_LAYER_BUSY_TEST
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ //SdkEvalLedOn(LED1);
+ }
+ else
+ {
+ //SdkEvalLedOff(LED1);
+ }
+#endif
}
#if PB_ADV_SUPPORTED
@@ -1611,11 +1480,6 @@ void Appli_Init(MOBLEUINT8 *flag)
AppliNvm_FactorySettingReset();
#endif
-#ifdef ENABLE_PROVISIONER_FEATURE
- /* Hardware Factory Provisioner data Restore implementation */
- AppliPrvnNvm_FactorySettingReset(flag);
-#endif
-
#if PB_ADV_SUPPORTED
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_BEACON_REQ_ID, UTIL_SEQ_RFU, UnprovisionedDeviceBeaconApp );
/**
@@ -1634,7 +1498,7 @@ void Appli_Init(MOBLEUINT8 *flag)
GPIO_InitNVICPowerOff();
#endif
-#if ( CFG_LPM_SUPPORTED == 0)
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h
index f4858e296..ad831f2cd 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h
@@ -24,6 +24,7 @@
/* Includes ------------------------------------------------------------------*/
#include "types.h"
#include "mesh_cfg_usr.h"
+#include "mesh_cfg.h"
/* Exported macro ------------------------------------------------------------*/
/* MACROS for Power Level definitions */
@@ -46,18 +47,40 @@
#define TX_POWER_LEVEL_PLUS_8DBM 7 /* = 8 dBm */
#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
-#define POWEROFF_PIN GPIO_PIN_4
+#define POWEROFF_PIN GPIO_PIN_12
#define POWEROFF_GPIO_PORT GPIOB
#define POWEROFF_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define POWEROFF_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
-#define POWEROFF_EXTI_LINE GPIO_PIN_4
-#define POWEROFF_EXTI_IRQn EXTI2_IRQn
+#define POWEROFF_EXTI_LINE GPIO_PIN_12
+#define POWEROFF_EXTI_IRQn EXTI15_10_IRQn
#endif
+typedef enum _prvn_nvm_state
+{
+ NVM_INIT = 0,
+ NVM_SAVE_PENDING,
+} prvn_nvm_state;
+
/* Exported variables ------------------------------------------------------- */
extern MOBLEUINT8 bdaddr[];
+typedef struct
+{
+ MOBLEUINT16 nodeAddress;
+ MOBLEUINT8 numOfElements;
+ MOBLEUINT8 Reserved1; /* For Alignment by 4*/
+ MOBLEUINT16 newNodeAddress;
+ MOBLEUINT8 newNodeElements;
+ prvn_nvm_state saveToNVM;
+ MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeUUID[UUID_SIZE];
+} NodeUnderProvisionParam_t;
+
+extern NodeUnderProvisionParam_t NodeUnderProvisionParam;
+extern MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+extern MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
/* Exported Functions Prototypes ---------------------------------------------*/
MOBLE_RESULT Appli_BleStackInitCb(void);
MOBLE_RESULT Appli_BleSetTxPowerCb(void);
@@ -80,6 +103,7 @@ MOBLE_RESULT Appli_LedBlink(void);
MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl);
void Appli_CheckForUnprovision(void);
+void Appli_Unprovision(void);
void Appli_Process(void);
void Appli_LedCtrl(void);
void Appli_Init(MOBLEUINT8 *flag);
@@ -93,6 +117,8 @@ void IntensityPublish(void);
MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
void Start_SelfConfiguration (void);
+void Appli_ProvisionerInit(void);
+
#endif /* __APPLI_MESH_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c
new file mode 100644
index 000000000..788180389
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c
@@ -0,0 +1,621 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.c
+ * @author BLE Mesh Team
+ * @brief User Application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include <string.h>
+#include "hal_common.h"
+#include "ble_mesh.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "mesh_cfg.h"
+#include "pal_nvm.h"
+#include "appli_mesh.h"
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+#include "common.h"
+#endif
+#if (LOW_POWER_FEATURE == 1)
+#include "app_conf.h"
+#include "stm32_seq.h"
+#endif
+#include "config_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+/* Private define ------------------------------------------------------------*/
+
+extern const MOBLEUINT8* _bdaddr[];
+
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+extern MOBLEUINT8 PowerOnOff_flag;
+#endif
+
+extern const void* appNvmBase;
+
+
+/*
+* Page of size 4k, STM32WB, reserved for application is divided into 16 subpages of each 256 bytes
+* First subpage is reserved (for e.g. External MAC is present in this area)
+* Rest 15 subpages are used on rolling basis for application states.
+* First byte of each subpage indicates if page is valid or not
+*/
+
+#define APP_NVM_RESERVED_SIZE 256U
+#define APP_NVM_SUBPAGE_SIZE 256U
+#define APP_NVM_MAX_SUBPAGE 15U
+#define APP_NVM_SUBPAGE_OFFSET(i) (unsigned int)(APP_NVM_SUBPAGE_SIZE + APP_NVM_SUBPAGE_SIZE*(i))
+
+/* offsets defined wrt start of subpage */
+#define APP_NVM_VALID_FLAG_OFFSET 0U
+#define APP_NVM_VALID_FLAG_SIZE 4U
+#define APP_NVM_RESET_COUNT_OFFSET (unsigned int)APP_NVM_VALID_FLAG_SIZE
+#define APP_NVM_RESET_COUNT_SIZE 12U /* 12 bytes reserved for write cycle optimization */
+#define APP_NVM_GENERIC_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE)
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE+APP_NVM_GENERIC_MODEL_SIZE)
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+
+#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+
+/* Private variables ---------------------------------------------------------*/
+
+typedef struct
+{
+ MOBLEUINT8 modelData[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE];
+ MOBLEBOOL erasePageReq;
+ MOBLEBOOL writeReq;
+} APPLI_NVM_REQS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+
+MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+
+#if 0
+/**
+* @brief This function erases a specified flash page
+* @param Page Number
+* @retval MOBLE_RESULT_INVALIDARG if PageNumber overflow
+* MOBLE_RESULT_FALSE if flash operation is very close to next radio event
+* MOBLE_RESULT_FAIL if flash command error is set
+* MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
+{
+ MOBLE_RESULT result;
+
+ if (PageNumber < N_PAGES)
+ {
+ BLEMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ result = MoblePalNvmErase(APP_NVM_BASE, 0);
+ ATOMIC_SECTION_END();
+ }
+ else /* Invalid page no */
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+
+ return result;
+}
+#endif
+
+/**
+* @brief Program word (32-bit) at a APP_NVM_BASE + APP_NVM_RESERVED_SIZE
+* @param TypeProgram Indicate the way to program at a specified address
+* @param Address: address to write
+* @param Data: word to write
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (offset > PAGE_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > (APP_NVM_BASE + PAGE_SIZE))
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ result = MoblePalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Mark first valid subpage as invalid.
+* @param void
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
+{
+ MOBLEUINT32 valid = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEINT16 currSubPageIdx;
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+
+ /* find valid subpage */
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+
+ if (result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ }
+ else
+ {
+ /* mark valid subpage as invalid */
+ memcpy((void*)subPageTemp,
+ (void*)(PRVN_NVM_BASE_OFFSET + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else if (result == MOBLE_RESULT_FALSE)
+ {
+ /* radio busy, try again later */
+ }
+ else
+ {
+ /* do nothing */
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief This function writes Reset count value in flash at APP_NVM_BASE + APP_NVM_RESERVED_SIZE
+* if device has been turned ON 5 times consecutively with each ON duration < 2s, reset to factory settings
+* LED blinks 2 times to indicate device startup without reset
+* LED blinks 5 times to indicate reset at device startup
+* @param void
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FactorySettingReset(void)
+{
+ MOBLEINT16 currSubPageIdx = 0;
+ MOBLE_RESULT result;
+ MOBLEUINT32 resetCount;
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ if(currSubPageIdx > 0)
+ {
+ /* Not the first reset */
+ /* read the previous subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ {
+ /* read the current subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+
+ /* read reset count from the subpage */
+ memcpy((void*)&resetCount,
+ (void*)&(subPageTemp[APP_NVM_RESET_COUNT_OFFSET]),
+ 4);
+ resetCount = resetCount << 1; /* Shifting for making Bits 0 from LSB */
+ memcpy((void*)&(subPageTemp[APP_NVM_RESET_COUNT_OFFSET]), (void*)&resetCount, 4);
+
+ /* Check for "POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING" times, that many bits shall be zero */
+ if (resetCount > MASK_BITS_FOR_POWER_ON_OFF_CYCLES)
+ {
+ /* MASK_BITS_FOR_POWER_ON_OFF_CYCLES = 0xFFFFFFE0 */
+
+ /* update reset count */
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+
+ if (!memcmp((void*)&subPageTemp[APP_NVM_RESET_COUNT_OFFSET],
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_RESET_COUNT_OFFSET),
+ 4))
+ {
+ /* updated value of reset count in flash */
+ }
+
+ /* Blink twice to indicate device startup
+ 1 second to blink once and 2 seconds to blink twice */
+ for (MOBLEUINT8 i=0; i< ON_TIME_IN_SECONDS_FOR_POWER_CYCLING; i++)
+ {
+ Appli_LedBlink();
+ }
+
+ /* Load model data copy from nvm */
+ memcpy((void*)AppliNvm_Reqs.modelData,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else /* Device is forced to factory reset, 5 LSBs are zero */
+ {
+ /* Unprovision node */
+ BLEMesh_Unprovision();
+
+ /* Clear lib data, primary and backup nvm used by BLE-Mesh lib */
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+
+ AppliNvm_ClearModelState();
+
+ BLEMesh_SetUnprovisionedDevBeaconInterval(100);
+
+ /* Blink 5 times to indicate factory setting reset */
+ for (MOBLEUINT8 i=0; i<BLINK_TIMES_FOR_FACTORY_RESET; i++)
+ {
+ Appli_LedBlink();
+ }
+
+ TRACE_M(TF_MISC, "Reset to factory settings \r\n");
+ }
+
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Save model states in nvm
+* @param model state buff
+* @param model state buff size
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL; /* if save model state not defined, return MOBLE_RESULT_FAIL */
+
+#if (SAVE_MODEL_STATE_NVM == 1)
+
+ if (size > APP_NVM_MODEL_SIZE)
+ {
+ /* incorrect size */
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ memcpy(AppliNvm_Reqs.modelData, state, size);
+
+ AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ }
+#endif /* SAVE_MODEL_STATE_NVM */
+ return result;
+}
+
+
+/**
+* @brief Clear model states in nvm
+* @param none
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_ClearModelState(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL; /* if save model state not defined, return MOBLE_RESULT_FAIL */
+
+#if (SAVE_MODEL_STATE_NVM == 1)
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+ MOBLEINT16 subPageIdx;
+ MOBLEUINT8 clearBuff[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE] = {0};
+ MOBLEUINT32 valid = 0;
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ if(subPageIdx > 1)
+ { /* Not the first subpage */
+ /* clear models states */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ memcpy((void*)&subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET],
+ (void*)(clearBuff),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ { /* First subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ memcpy((void*)&subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET],
+ (void*)(clearBuff),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ }
+#endif /* SAVE_MODEL_STATE_NVM */
+ return result;
+}
+
+
+/**
+* @brief Load Model states from nvm
+* @param model state buff
+* @param model state buff size
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+{
+#if (SAVE_MODEL_STATE_NVM == 1)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
+
+ return result;
+#else /* SAVE_MODEL_STATE_NVM */
+ *size = 0;
+ return MOBLE_RESULT_SUCCESS;
+#endif /* SAVE_MODEL_STATE_NVM */
+}
+
+
+/**
+* @brief Process NVM erase and write requests
+* @param void
+* @retval void
+*/
+void AppliNvm_Process(void)
+{
+ MOBLE_RESULT result;
+ MOBLEINT16 subPageIdx;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+
+ /* Erase if required */
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ {
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
+
+ result = MoblePalNvmErase(APP_NVM_BASE, 0);
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ }
+ else
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
+ AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ /* restore reserve area */
+/* FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy); */
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ }
+ }
+ }
+
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
+ && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ {
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+ MOBLEUINT32 valid = 0;
+
+ if(subPageIdx > 0)
+ {
+ /* Not the first reset */
+ /* read the previous subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ {
+ /* read the current subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+
+ memcpy((void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
+ (void*)&(AppliNvm_Reqs.modelData),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint8_t*)subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ }
+ }
+ }
+}
+
+
+/**
+* @brief Fuction used to set the flag which is responsible for storing the
+ states in flash.
+* @param void
+* @retval void
+*/
+void AppliNvm_SaveMessageParam (void)
+{
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+ PowerOnOff_flag = FLAG_SET;
+#endif
+}
+
+
+/**
+* @brief Find first valid subpage available.
+* If no valid subpage found, erase page appli nvm to reset it
+* @param pointer to variable to update first valid subpage index
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset)
+{
+ MOBLEUINT32 valid[2];
+ MOBLEINT8 subPageIdx = -1;
+ MOBLEUINT32 *subPageOffset;
+ MOBLEUINT32 addressValidPage;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (MOBLEUINT16 count=0; count<totalSubPage; count++)
+ {
+ addressValidPage = nvmBaseOffset + SubPageSize*count;
+ subPageOffset = &addressValidPage;
+
+ /* Read 8 bytes and check if it's Empty */
+ memcpy((void*)&valid, (void*)(*subPageOffset), 8);
+
+ if ((valid[0] == FLASH_EMPTY_SIGNATURE) /*&& (valid[1] == FLASH_EMPTY_SIGNATURE)*/)
+ {
+ subPageIdx = count;
+ break;
+ }
+ }
+
+ if (subPageIdx < 0)
+ {
+ TRACE_M(TF_PROVISION,"Out of Memory, Flash page is full \r\n");
+ result = MOBLE_RESULT_OUTOFMEMORY;
+ }
+ else
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ *subPageIndex = subPageIdx;
+
+ return result;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h
new file mode 100644
index 000000000..34667f26c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h
@@ -0,0 +1,92 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.h
+ * @author BLE Mesh Team
+ * @brief Header file for the NVM application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_NVM_H
+#define __APPLI_NVM_H
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+extern const void *prvsnr_data;
+
+/* offset defined for the embedded provisioner node */
+#define PRVN_NVM_PAGE_SIZE 4096U
+#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
+#define PRVN_NVM_CHUNK_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_SUBPAGE_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_CHUNK_SIZE)
+#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
+
+#define APP_NVM_BASE ((unsigned int)appNvmBase)
+#define APP_NVM_SIZE 4096U
+
+/* Exported variables ------------------------------------------------------- */
+typedef struct
+{
+ MOBLEUINT8 devKey[4+DEVICE_KEY_SIZE];
+
+#if ENABLE_SAVE_UUID_PER_NODE
+ MOBLEUINT8 node_UUID[UUID_SIZE];
+#endif
+
+} NvmPerNode_t;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FactorySettingReset(void);
+//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
+MOBLE_RESULT AppliNvm_ClearModelState(void);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+void AppliNvm_Process(void);
+void AppliNvm_SaveMessageParam (void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
+
+MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data,
+ MOBLE_ADDRESS address,
+ uint8_t* pUUID,
+ uint8_t numElements);
+
+MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
+void AppliPrvnNvm_Process(void);
+
+MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
+
+MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
+
+void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
+ MOBLE_ADDRESS address,
+ MOBLEUINT8 *prvnFlag,
+ MOBLEUINT8 numOfElements);
+
+void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+
+
+#endif /* __APPLI_NVM_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c
index 77074438c..7ae8b7d10 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c
@@ -360,7 +360,7 @@ void Sensor_LC_Light_Publish(void)
srcAdd = BLEMesh_GetAddress();
- result = BLEMesh_SetRemotePublication(LIGHT_MODEL_SERVER_LC_MODEL_ID, srcAdd ,
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
SENSOR_STATUS ,
sensor_Data,3,
MOBLE_FALSE, MOBLE_FALSE);
@@ -597,7 +597,7 @@ MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table
for(int i=0;i<NUMBER_OF_SENSOR;i++)
{
- if(prop_ID_Table[i].Property_ID != prop_ID)
+ if(prop_ID_Table[i].Property_ID == prop_ID)
{
status = MOBLE_RESULT_SUCCESS;
break;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h
index d608f35e6..d608f35e6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c
index 405be02c8..405be02c8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h
index 2b9390099..2b9390099 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h
index 4cc3ce72b..4cc3ce72b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h
index 35a4d96ab..35a4d96ab 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_dbg_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/cube_hal.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h
index 3afc2e373..3afc2e373 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/cube_hal.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/data.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s
index 636eb47c6..636eb47c6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/data.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h
index 730c40219..730c40219 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/hal_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
index 393ef19a1..dd7ae8207 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
@@ -31,6 +31,13 @@
#define PAGE_SIZE 4096
#define RESET_MANAGER_FLASH_BASE_ADDRESS (0x10040000)
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#define UUID_SIZE 16U
+
+#define NO_MODEL_AVLBL 0xFFFF
+
void TraceHeader(const char* func_name, int mode);
#define TraceB0(func_name, ...)
#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
@@ -46,6 +53,7 @@ void TraceHeader(const char* func_name, int mode);
#define TraceCX(flags, ...) TraceC ##flags( __VA_ARGS__)
#define TRACE_I(flag, ...) TraceCX(flag, ##__VA_ARGS__)
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
#ifdef EXTERNAL_MAC_ADDR_MGMT
#define EXTERNAL_MAC_TYPE (uint8_t)(EXTERNAL_MAC_IS_PUBLIC_ADDR<<7)
@@ -233,6 +241,7 @@ void TraceHeader(const char* func_name, int mode);
/******************** Serial Interface Handling Control **********************/
/* Exported variables ------------------------------------------------------- */
+
extern const DynBufferParam_t DynBufferParam;
extern const tr_params_t TrParams;
extern const lpn_params_t LpnParams;
@@ -242,5 +251,7 @@ extern const neighbor_table_init_params_t NeighborTableParams;
/* Exported Functions Prototypes ---------------------------------------------*/
MOBLEUINT8 ApplicationSetNodeSigModelList(void);
+MOBLE_RESULT ApplicationInitSigModelList(void);
+MOBLE_RESULT ApplicationInitVendorModelList(void);
#endif /* __MESH_CFG_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h
new file mode 100644
index 000000000..4eeab6bdf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h
@@ -0,0 +1,618 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file mesh_cfg_usr.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_USR_H
+#define __MESH_CFG_USR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+/*
+* Different features supported by BLE-Mesh. Uncomment according to application.
+* Low power feature enabled node do not support other features.
+* Do not define any other feature if Low Power feature is defined
+*/
+#define ENABLE_LOW_POWER_FEATURE
+
+/* Macros Used for user defined serial print data for models.
+Either use 0 to disable or 1 to enable
+@ TF_GENERIC is responsible for the Generic model traces.
+@ TF_LIGHT is responsible for the Light model traces.
+@ TF_SENSOR is responsible for the Sensor model traces.
+@ TF_VENDOR is responsible for the vendor model traces.
+@ TF_NEIGHBOUR is responsible for the neighbour function traces.
+@ TF_PROVISION is responsible for the Provision related function traces.
+@ TF_LPN_FRND is responsible for the Low power nodef function traces.
+@ TF_ELEMENTS is responsible for the element selection function traces.
+@ TF_ADDRESS is responsible for the address of element traces.
+@ TF_HANDLER is responsible for the interrupt file traces.
+@ TF_INIT is responsible for the main function traces.
+@ TF_MISC is responsible for the other type traces.
+
+*/
+#define TF_GENERIC 0
+#define TF_LIGHT 0
+#define TF_LIGHT_LC 0
+#define TF_SENSOR 0
+#define TF_VENDOR 0
+#define TF_COMMON 0
+#define TF_VENDOR_COMMAND 0
+#define TF_NEIGHBOUR 0
+#define TF_LPN_FRND 0
+#define TF_ELEMENTS 0
+#define TF_ADDRESS 0
+#define TF_PROVISION 0
+#define TF_HANDLER 0
+#define TF_INIT 0
+#define TF_MISC 0
+#define TF_MEMORY 0
+#define TF_SERIAL_CTRL 0
+#define TF_BEACON 0
+#define TF_GENERIC_CLIENT 0
+#define TF_LIGHT_CLIENT 0
+#define TF_CONFIG_CLIENT 0
+#define TF_LIGHT_CLIENT 0
+
+/*******************************************************************************
+*** Following section helps to select right configuration of Models ***********
+*******************************************************************************/
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the */
+/* Server Generic Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+#define ENABLE_GENERIC_MODEL_SERVER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+
+/* The Following Models are not available in this version, will be developed in
+ next version.
+*/
+/*
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_BATTERY
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY
+
+*/
+
+/******************************************************************************/
+/******* Define the following Macros to enable the usage of the Light Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+
+/*
+ The following Models are managed in different file light_lc.c in middleware
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_LC
+//#define ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the Sensor Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_SENSOR_MODEL_SERVER
+//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the time and */
+/* scene Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_TIME_MODEL_SERVER
+//#define ENABLE_TIME_MODEL_SERVER_SETUP
+//#define ENABLE_SCENE_MODEL_SERVER
+//#define ENABLE_SCENE_MODEL_SERVER_SETUP
+
+/*
+ The Following Models are not available in this version
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
+
+/******* Define the following Macros to enable the vendor model ******/
+//#define ENABLE_VENDOR_MODEL_SERVER
+#define GENERIC_SERVER_MODEL_PUBLISH
+
+/******************************************************************************/
+/*
+Define the Macros for Enabling/disabling the binding of data between the Generic
+and Light model.
+@ define the Macro for enabling the binding
+@ Undefine or comment the macro for disabling the binding.
+*/
+/******************************************************************************/
+#define ENABLE_MODEL_BINDING
+
+/* Define the macros for the numbers of sensor present.*/
+#define NUMBER_OF_SENSOR 2
+//#define ENABLE_OCCUPANCY_SENSOR
+/*
+Macro is responsible for enabling and desabling the sensor publication.
+Comment this macro to disable the publication
+*/
+//#define ENABLE_SENSOR_PUBLICATION
+
+/******************************************************************************/
+
+
+/* Maximum Time period value of PWM */
+#define PWM_TIME_PERIOD 31990U
+
+/******************************************************************************/
+/***** MACROS for POWER ON-OFF CYCLE BASED UNPROVISIONING *********************/
+/******************************************************************************/
+
+/*
+Define the following Macro to check the Power-OnOff Cycles
+5 Continous cycles of OnOff with Ontime <2 sec will cause unprovisioning
+*/
+//#define ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+
+#define POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING 5
+#define MASK_BITS_FOR_POWER_ON_OFF_CYCLES (0xFFFFFFFF << POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING)
+ /* 0xFFFFFFE0 */
+#define ON_TIME_IN_SECONDS_FOR_POWER_CYCLING 2
+#define BLINK_TIMES_FOR_FACTORY_RESET 5
+
+/*
+Define the following Macro to save Generic and Light Model states in NVM
+This may result into excessive flash erase operations,
+this should be avoided to ensure flash longevity
+*/
+#define ENABLE_SAVE_MODEL_STATE_NVM
+
+/* Only one Macro will be enable at one time */
+//#define SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+//#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+
+/* Macros defined for the number of bytes saved,
+ number of bytes dedicated for generic model and light model.
+*/
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+#define APP_NVM_MODEL_SIZE 40U
+
+/*Macros are defined for the selection of the number of led and type of lighting
+ used for the application.
+*if board has one led, uncomment USER_BOARD_1LED
+*if board has cool warm leds, uncomment USER_BOARD_COOL_WHITE_LED
+*if board has RGB leds, uncomment USER_BOARD_RGB_LED
+*if board has RGB leds as well as cool warm leds,
+ uncomment USER_BOARD_COOL_WHITE_LED and USER_BOARD_RGB_LED
+*/
+/* comment ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME when using
+ USER_BOARD_COOL_WHITE_LED ,USER_BOARD_RGB_LED
+ Default transition is provided only for one led.
+*/
+#define USER_BOARD_1LED
+//#define USER_BOARD_COOL_WHITE_LED
+//#define USER_BOARD_RGB_LED
+
+/* Pulse Width Modulation support for external LED control */
+#define ENABLE_PWM_SUPPORT 0
+
+/* Note: Please use Full Library configuration in project options to use the full
+ configuration of the C/C++ runtime library
+ for printf and scanf functionality */
+
+/* Enables the serial interface using Uart */
+#define ENABLE_SERIAL_INTERFACE 1
+#define ENABLE_UT 1
+#define ENABLE_SERIAL_CONTROL 1
+#define ENABLE_APPLI_TEST 0
+
+/*******************************************************************************
+*** Following section helps to configure the Application of Mesh ***********
+*******************************************************************************/
+
+#define APPLICATION_NUMBER_OF_ELEMENTS 1
+#define APPLICATION_SIG_MODELS_MAX_COUNT 20
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT 2
+
+
+/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
+(the list is available
+@ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers)
+For STMicroelectronics : it is 0x0030 */
+#define COMPANY_ID 0x0030
+
+/* Contains a 16-bit vendor-assigned product identifier */
+#define PRODUCT_ID 0x0002
+
+/* Contains a 16-bit vendor-assigned product version ID */
+#define PRODUCT_VERSION_ID 0x010A
+
+#define MAX_APPLICATION_PACKET_SIZE 160
+
+#define TPT_SEGMENT_COUNT (((MAX_APPLICATION_PACKET_SIZE)/12)+2)
+
+/*******************************************************************************
+********** MAC Address Configuration *******************************************
+*******************************************************************************/
+
+/*
+* Define to enable external MAC handling,
+* DONT change the Values 0x01, 0x02, 0x03
+* SELECT ONLY One of the Option
+*/
+//#define GENERATE_STATIC_RANDOM_MAC 0x01
+//#define EXTERNAL_MAC_ADDR_MGMT 0x02
+#define INTERNAL_UNIQUE_NUMBER_MAC 0x03
+
+/* Declare this value as 0x01 if the External Address is PUBLIC Address */
+/* For example like this: #define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x1 */
+/* Else, by default, the external address will be treated as RANDOM */
+#define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x0
+
+/******************************************************************************/
+
+
+/*******************************************************************************
+****** Following section helps to select right configuration of node ***********
+*******************************************************************************/
+/*
+* Minimum gap between successive transmissions
+* varies from 10 to 65535
+*/
+#define TR_GAP_BETWEEN_TRANSMISSION 50U
+
+
+/*
+* Different provision bearer supported by BLE-Mesh.
+* Define according to application.
+* Atleast one of PB-ADV and PB-GATT should be defined
+*/
+#define ENABLE_PB_ADV
+#define ENABLE_PB_GATT
+//#define ENABLE_PUB_KEY_TYPE_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+#define STATIC_OOB_SIZE 16U
+#else
+#define STATIC_OOB_SIZE 0U
+#endif
+/* Output OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#else
+#define OUTPUT_OOB_SIZE 0U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#endif
+
+/* Input OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#else
+#define INPUT_OOB_SIZE 0U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#endif
+
+
+/*
+* Friend node receive window size is 50 ms
+*/
+
+/*
+* Friend node subscription list size is 4
+*/
+
+/*
+* Friend node message queue is 16
+*/
+
+/*
+* Number of Low power nodes that can be associated with Friend node
+* varies from 1 to 10
+*/
+#define FN_NO_OF_LPNS 6U
+
+/*
+* For prioritizing friendship offer with good RSSI link
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RSSI_FACTOR_LEVEL 1U
+
+/*
+* For prioritizing friendship offer with good receive window factor
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RECIVE_WINDOW_FACTOR_LEVEL 1U
+
+/*
+* Minimum packets queue size required by Low Power node
+* varies from 1 to 7
+* Ref @Mesh_v1.0
+* 1 -> 2
+* 2 -> 4
+* 3 -> 8
+* 4 -> 16
+* 5 -> 32
+* 6 -> 64
+* 7 -> 128
+*/
+#define LPN_MINIMUM_QUEUE_SIZE_LOG 2U
+
+/*
+* (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_DELAY 150U
+
+/*
+* Poll timeout value after which friendship cease to exist (unit 100ms)
+* varies from 0x00000A to 0x34BBFF
+* Ref @Mesh_v1.0
+* 0x00000A -> 1 second
+* 0x34BBFF -> 96 hours
+*/
+#define LPN_POLL_TIMEOUT 2000U
+
+/*
+* Maximum receive window size acceptable to low power node (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_WINDOW_SIZE 255U/*55U*/
+
+/*
+* Minimum friend's subscription list size capability required by lpn
+* varies from 1 to 5
+* Ref @Mesh_v1.0
+*/
+#define LPN_SUBSCR_LIST_SIZE 2U
+
+/*
+* Frequency at which low power node would send friend request (unit 100ms)
+* varies from 0 to 255
+* 100 -> 10s
+*/
+#define LPN_FRIEND_REQUEST_FREQUENCY 50U
+
+/*
+* Frequency at which low power node would poll friend node (unit 100ms)
+* should be less than poll timeout
+* 100 -> 10s
+*/
+#define LPN_FRIEND_POLL_FREQUENCY 25U
+
+/*
+* Minimum RSSI required by low power node
+* should be less than equal to -60
+*/
+#define LPN_MINIMUM_RSSI -100
+
+/*
+* Retries to be made by lpn before termination of friendship
+* varies from 2 to 10
+*/
+#define LPN_NO_OF_RETRIES 10U
+
+/*
+* Maximum address list size buffer in
+* Friend Subscription List Add Message is 10
+*/
+
+
+/*
+* Enable or disable neighbor table
+* if defined -> enabled
+* If MAC address of neighbor changes it appears as new neighbor
+* Neighbor table update can be triggered (configurable) in following cases
+* On receiving Unprovisioned device beacon
+* On receiving Secure network beacon
+* On receiving Mesh message
+* Message with any TTL
+* Message with TTL = 0
+* if not defined -> disabled
+*/
+#define ENABLE_NEIGHBOR_TABLE
+
+/*
+* Size of neighbor table
+*/
+#define NEIGHBOR_COUNT 5U
+
+/*
+* (unit s)
+* Duration (wrt appear or last refresh)
+* for which neighbor exists in neighbor table
+*/
+#define NEIGHBOR_ALIVE_TIME 20U
+
+/*
+* Enable/disable neighbor table update with unprovisioned device beacon
+* 0: Disable neighbor table update with unprovisioned device beacon
+* 1: Enable neighbor table update with unprovisioned device beacon
+*/
+#define NEIGHBOR_UNPRVND_DEV_BEACON_NTU 1U
+
+/*
+* Enable/disable neighbor table update with secure network beacon
+* 0: Disable neighbor table update with secure network beacon
+* 1: Enable neighbor table update with secure network beacon
+*/
+#define NEIGHBOR_SECURE_NET_BEACON_NTU 0U
+
+/*
+* Enable/disable neighbor table update with TTL 0 message
+* 0: Disable neighbor table update messages
+* 1: Enable neighbor table update with messages with 0 TTL
+* 2: Enable neighbor table update with messages with any TTL
+*/
+#define NEIGHBOR_MSG_TTLX_NTU 0U
+
+/*******************************************************************************
+*** Following section helps to configure the LEDs of Application of Mesh ***
+*******************************************************************************/
+
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+ #define SINGLE_LED PWM4
+ #define COOL_LED PWM0
+ #define WARM_LED PWM1
+ #define RED_LED PWM2
+ #define GREEN_LED PWM3
+ #define BLUE_LED PWM4
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (ENABLE_GENERIC_MODEL_SERVER)
+ #define ENABLE_GENERIC_MODEL_SERVER (1)
+#endif
+
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (GENERIC_SERVER_MODEL_ADD_CONFIGURATION)
+ #define GENERIC_SERVER_MODEL_ADD_CONFIGURATION (1)
+
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP) \
+ && !defined (ENABLE_LIGHT_MODEL_SERVER)
+ #define ENABLE_LIGHT_MODEL_SERVER (1)
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP)
+ #define LIGHT_SERVER_MODEL_ADD_CONFIGURATION
+#endif
+
+#if defined(ENABLE_TIME_MODEL_SERVER) \
+ || defined(ENABLE_TIME_MODEL_SERVER_SETUP)\
+ || defined(ENABLE_SCENE_MODEL_SERVER)\
+ || defined(ENABLE_SCENE_MODEL_SERVER_SETUP)
+ #define ENABLE_TIME_SCENE_MODEL_SERVER
+#endif
+
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* __MESH_CFG_USR_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c
index 09ef79884..f82f3b293 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c
@@ -38,10 +38,8 @@
#include "PWM_handlers.h"
#include "appli_light_lc.h"
#include "light_lc.h"
-#ifdef ENABLE_PROVISIONER_FEATURE
#include "appli_generic_client.h"
#include "config_client.h"
-#endif
#include "generic_client.h"
#include "appli_light_client.h"
@@ -110,8 +108,8 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_OnOff_Status,
/* Generic Level callbacks */
Appli_Generic_Level_Set,
- Appli_Generic_LevelDelta_Set,
- Appli_Generic_LevelMove_Set,
+ Appli_Generic_Delta_Set,
+ Appli_Generic_Move_Set,
/* Generic Level Status callbacks */
Appli_Generic_Level_Status,
/* Generic Power on off callbacks */
@@ -119,8 +117,6 @@ const Appli_Generic_cb_t GenericAppli_cb =
/* Generic Power on off callbacks */
Appli_Generic_PowerOnOff_Status,
- Appli_Generic_Restore_PowerOn_Value,
-
/* Generic Default transition time callbacks */
Appli_Generic_DefaultTransitionTime_Set,
/* Generic Default transition time callbacks */
@@ -148,6 +144,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
Appli_Light_GetLightnessDefaultStatus,
+ Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
Appli_Light_GetCtlTemperatureStatus,
@@ -355,7 +352,7 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
- /* Callbacks used by BLE-Mesh Models */
+ /* Callbacks used by BlueNRG-Mesh Models */
BLEMesh_SetSIGModelsCbMap(Model_SIG_cb, MODEL_SIG_COUNT);
/* Load generic model states from nvm */
@@ -422,25 +419,21 @@ void BLEMesh_ModelsProcess(void)
*/
void BLEMesh_ModelsCommand(void)
{
- MOBLE_ADDRESS srcAdd = BLEMesh_GetAddress();
-
#ifdef VENDOR_CLIENT_MODEL_PUBLISH
- Vendor_Publish(srcAdd);
+ Vendor_Publish(BLEMesh_GetAddress());
#endif
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Generic_Publish(srcAdd);
-// Appli_GenericClient_OnOff_Set();
+ Appli_GenericClient_OnOff_Set();
#endif
#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
- Generic_Publish(srcAdd);
-#else
- Vendor_Publish(srcAdd);
+ Generic_Publish(BLEMesh_GetAddress());
#endif
#endif
+
}
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h
index 486e0bcec..486e0bcec 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c
index 30921c8ee..04bc07489 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/pal_nvm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c
@@ -290,6 +290,8 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 remain = 0;
+ MOBLEUINT32 nb_dword = 0;
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
@@ -317,7 +319,10 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
}
else
{
- size >>= 3;
+ nb_dword = (size >> 3);
+ remain = size - ((nb_dword) << 3);
+ if(remain > 0)
+ nb_dword += 1;
uint64_t* src = (uint64_t*)buf;
@@ -325,16 +330,12 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR | FLASH_FLAG_SIZERR | FLASH_FLAG_PGAERR);
- for (size_t i = 0; i < size; i++)
+ for (size_t i = 0; i < nb_dword/*size*/; i++)
{
do
{
while(LL_FLASH_IsActiveFlag_OperationSuspended());
-//#ifndef ENABLE_PROVISIONER_FEATURE
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address + offset + (i <<3), src[i]);
-//#else
-// HW_FLASH_Write(address + offset + (i <<3), src[i]);
-//#endif
while(LL_FLASH_IsActiveFlag_OperationSuspended());
} while(*((uint64_t*)(address + offset + (i <<3))) != src[i]);
}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/svcctl_conf.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c
index 1dce9189e..1dce9189e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/svcctl_conf.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h
index 6df3dc0c7..6df3dc0c7 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c
index 609ca64cf..609ca64cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c
index 43a0e548d..43a0e548d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h
index 773b36116..773b36116 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h
index 22b6dc41c..22b6dc41c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/vcp_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
index 7b22ea955..7b22ea955 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.cproject
index 201ad3d83..80071590d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.cproject
@@ -14,7 +14,7 @@
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="BLE_MeshLightingNodeDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <configuration artifactExtension="elf" artifactName="BLE_MeshLightingLPNDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1472243705" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
<option id="fr.ac6.managedbuild.option.gnu.cross.prefix.2012243190" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
@@ -28,7 +28,7 @@
<option id="fr.ac6.managedbuild.option.gnu.cross.fpu.849017599" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
<option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.503367654" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.softfp" valueType="enumerated"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.313215574" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/Lighting_Node}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1388838888" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <builder buildPath="${workspace_loc:/Lighting_LPN}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1388838888" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
<outputEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
</outputEntries>
@@ -115,7 +115,7 @@
<option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1374383201" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
<option id="gnu.c.link.option.libs.1086385097" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":libSTM32CryptographicV3.0.0_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
<option id="gnu.c.link.option.paths.1171847559" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
@@ -162,12 +162,12 @@
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="Lighting_Node.fr.ac6.managedbuild.target.gnu.cross.exe.549494370" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ <project id="Lighting_LPN.fr.ac6.managedbuild.target.gnu.cross.exe.549494370" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="Debug">
- <resource resourceType="PROJECT" workspacePath="/Lighting_Node"/>
+ <resource resourceType="PROJECT" workspacePath="/Lighting_LPN"/>
</configuration>
<configuration configurationName="Release"/>
</storageModule>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project
new file mode 100644
index 000000000..9bfd9de04
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Lighting_LPN</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/readme.txt</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_debug.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_entry.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_timerserver.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/lp_timer.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/lp_timer.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/main.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/main.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32_lpm_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32wbxx_it.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/syscalls.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_config.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_config.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_handlers.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_handlers.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/app_ble.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/app_ble.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_generic.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_sensor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_sensor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/models_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/models_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/pal_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/pal_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/target/hw_ipcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/target/hw_ipcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_seq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/common.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh_cfg.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/time_scene.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gatt_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hal_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hci_le.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_l2cap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/osal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</locationURI>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld
index 7ac9a391f..7ac9a391f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/stm32wb55xx_flash_cm4.ld
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s
index f79eec117..f79eec117 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/startup_stm32wb55xx_cm4.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c
index e3c8a89f9..e3c8a89f9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/syscalls.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/readme.txt
new file mode 100644
index 000000000..f52a80ae7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/readme.txt
@@ -0,0 +1,225 @@
+/**
+ @page BLE_MeshLightingDemo example
+
+ @verbatim
+ ******************** (C) COPYRIGHT 2020 STMicroelectronics *******************
+ * @file BLE/BLE_MeshLightingLPN/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE Mesh Lighting Low Power Node demo example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2020 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+This is the implementation of the BLE Mesh Low Power Node profile as specified by the BLE SIG.
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@par Directory contents
+ mesh_lighting_demo
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h Interface to support debug in the application
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
+ - BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingLPN/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
+ - BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
+ - BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c Interface to support debug in the application
+ - BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingLPN/Core/Src/main.c Main program
+ - BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/hal_common.h Header for common function of HAL file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/tl_if.c Transport Layer interface
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/user_if.h Header file for User interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/user_if.c User interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG-Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+For more details refer to the Application Note:
+ AN5292_STM32WB_How_to_build_BLE_Mesh_Application
+
+@Introduction
+
+The ST BLE-Mesh library supports all of the following features in a Mesh node:
+1. Relay: to forward received network PDUs on advertising or GATT bearer, if the Proxy feature is enabled
+2. Proxy: to forward received network PDUs between GATT and advertising bearers
+3. Friend: can perform duties such as scanning for other associated nodes that are usually Low Power mode
+4. Low Power: consumes much less power as the node usually does not perform any scanning
+A typical BLE Mesh node radio should always be in scanning mode to avoid missing packets over the air, but this kind of
+operation is not supported by many devices due to continuous energy requirements.
+To enable low power operation, BLE Mesh Profile v1.0 defines the concept of Friendship.
+In a Mesh network, a Low Power feature-enabled Mesh node (LPN) offloads its packet receiving (scanning) duty to an adjacent
+Friend feature-enabled Mesh node (FN). The LPN is not always scanning and remains inactive (or sleeps) for most of its life
+cycle, significantly reducing its energy requirements. Nodes running on batteries or energy harvesting techniques usually
+support the Low Power feature.
+Once connected to each other, the FN and LPN are considered friends and their connection is known as a Friendship. At least
+one FN must be in the direct radio range of an LPN to establish Friendship.
+
+@Configuration
+
+Low Power Node
+Low Power feature support is defined in mesh_cfg_usr.h by hte predefinition of ENABLE_LOW_POWER_FEATURE.
+Note: A Low Power feature-enabled node does not support any other feature: all the other features should be
+undefined.
+
+@Demo setup based on STM32WB55RG-Nucleo
+
+General default setting defined in mesh_cfg_usr.h:
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF (1) /* GENERIC SERVER ONOFF MODEL ON FIRST ELEMENT */
+ APPLICATION_NUMBER_OF_ELEMENTS 3 /* NUMBER OF ELEMENT SUPPORTED */
+ APPLICATION_SIG_MODELS_MAX_COUNT 20 /* TOTAL NUMBER OF MODELS SUPPORTED */
+ APPLICATION_VENDOR_MODELS_MAX_COUNT 2 /* TOTAL NIMBER OF VENDOR MODELS SUPPORTED */
+ ENABLE_PB_ADV /* Provisioning Bearer over advertising channels support */
+ ENABLE_PB_GATT /* Provisioning Bearer over GATT proxy support */
+
+The following demo based on STM32WB55RG-Nucleo has been set up using one board as a Friend node and two
+boards as Low Power nodes.
+
+Low Power node setup:
+Step 1. Configure LPN parameters.
+ Change only if required ohterwise skip this step (use example parameters defined in mesh_cfg_usr.h)
+ LPN_RSSI_FACTOR_LEVEL 1
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL 1
+ LPN_MINIMUM_QUEUE_SIZE_LOG 2
+ LPN_RECEIVE_DELAY 150 ms
+ LPN_POLL_TIMEOUT 2000 (*100 ms)
+ LPN_RECEIVE_WINDOW_SIZE 55 ms
+ LPN_SUBSCR_LIST_SIZE 2
+ LPN_FRIEND_REQUEST_FREQUENCY 50 (*100 ms)
+ LPN_FRIEND_POLL_FREQUENCY 25 (*100 ms)
+ LPN_MINIMUM_RSSI -100
+ LPN_NO_OF_RETRIES 10
+Step 2. Generate and flash binary in 2 boards (LPN1, LPN2)
+
+Friend Node setup (use the Proxy Relay Friend Node BLE_MeshLightingPRFNode project):
+Step 1. Generate and flash binary in a board (FN)
+Step 2. Provision the 3 boards with the default parameters, using BLE-Mesh Android or BLE-Mesh iOS smartphone application
+ (subscribe and publish to default group)
+
+Demo operation
+After provisioning, it might take a few seconds for Friendship to be established between FN and LPNs.
+In this demo, the FN establishes Friendship with LPN1 and LPN2, LPN2 is optional.
+Any packet targeted to LPN1/LPN2 or to a group address subscribed by LPN1 or LPN2 is put in queue by the FN
+that forwards packets to LPN1/LPN2 as soon as it receives a Friend Poll from the respective LPN.
+The LPN is free to send packets (generate traffic) any time.
+
+By pressing [SW1] button on the Friend Node:
+1. FN publishes a LED ON command to the default group and the FN blue LED immediately turns on (when the
+FN belongs to the default group).
+2. FN forwards a LED ON command to the LPNs subscribed to the default group. As soon as the FN receives
+poll from an LPN, it sends LED ON to the respective LPN.
+
+ FN LPN1 LPN2
+ | | |
+ SW1 PUSH->| | |
+ Blue LED on->| | |
+ |<--Friend Poll--| |
+ | | |
+ |-----LED on---->|<-Blue LED on |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |-------------LED on------------>|<-Blue LED on
+ | |
+
+By pressing [SW1] button on the Low Power Node 1:
+1. LPN1 publishes an LED OFF command to the default group. LPN1 blue LED tunrs off.
+ LPN1 immediately forwards LED OFF command to the default group.
+2. FN receives an LED OFF command (as it is subscribed to the default group) and the FN blue LED turns off.
+3. FN also sends an LED OFF command to LPN2 (subscribed to the default group) as soon as FN receives
+ poll from LPN2.
+
+ FN LPN1 LPN2
+ | | |
+ | SW1 PUSH->|<-Blue LED off |
+ Blue LED off->|<----LED off----| |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |------------LED off------------>|<-Blue LED off
+ | |
+
+* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
index 9dbfbba05..9dbfbba05 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h
new file mode 100644
index 000000000..816bf929a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h
@@ -0,0 +1,547 @@
+/**
+ ******************************************************************************
+ * @file app_conf.h
+ * @author MCD Application Team
+ * @brief Application configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_CONFIG_H
+#define __APP_CONFIG_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * MESH Application Config
+ ******************************************************************************/
+
+/**< generic parameters ******************************************************/
+
+/**
+ * Define Tx Power
+ */
+#define CFG_TX_POWER (0x18) /**< +0 dBm */
+
+/**
+ * Define Advertising parameters
+ */
+#define CFG_ADV_BD_ADDRESS (0x7257acd87a6c)
+#define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */
+#define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xA0) /**< 100ms */
+#define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */
+#define CFG_LP_CONN_ADV_INTERVAL_MAX (0x640) /**< 1s */
+
+/**
+ * Define IO Authentication
+ */
+#define CFG_BONDING_MODE (1)
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+
+/**
+ * Define IO capabilities
+ */
+#define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00)
+#define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01)
+#define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02)
+#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
+#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
+
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY
+
+/**
+ * Define MITM modes
+ */
+#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
+#define CFG_MITM_PROTECTION_REQUIRED (0x01)
+
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
+
+
+/**
+ * Define PHY
+ */
+#define ALL_PHYS_PREFERENCE 0x00
+#define RX_2M_PREFERRED 0x02
+#define TX_2M_PREFERRED 0x02
+#define TX_1M 0x01
+#define TX_2M 0x02
+#define RX_1M 0x01
+#define RX_2M 0x02
+
+/**
+ * Generic Access Appearance
+ */
+#define CFG_UNKNOWN_APPEARANCE (0)
+#define CFG_GAP_APPEARANCE (832)
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_IRK {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_ERK {0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21,0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21}
+
+/* USER CODE BEGIN Generic_Parameters */
+/**
+ * SMPS supply
+ * SMPS not used when Set to 0
+ * SMPS used when Set to 1
+ */
+#define CFG_USE_SMPS 1
+/* USER CODE END Generic_Parameters */
+
+/**< specific parameters ********************************************************/
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+
+#define POWEROFF_EXTI_IRQHandler EXTI15_10_IRQHandler
+
+#define CFG_MAX_CONNECTION 1
+
+#define RADIO_ACTIVITY_EVENT 1
+
+
+#define CONN_L(x) ((int)((x)/0.625f))
+#define CONN_P(x) ((int)((x)/1.25f))
+
+ /* L2CAP Connection Update request parameters used for test only with smart Phone */
+#define L2CAP_REQUEST_NEW_CONN_PARAM 1
+
+#define L2CAP_INTERVAL_MIN CONN_P(12) /* 1s */
+#define L2CAP_INTERVAL_MAX CONN_P(12) /* 1s */
+#define L2CAP_SLAVE_LATENCY 0x0000
+#define L2CAP_TIMEOUT_MULTIPLIER 800 /* 0x320 */
+
+
+/******************************************************************************
+ * BLE Stack
+ ******************************************************************************/
+/**
+ * Maximum number of simultaneous connections that the device will support.
+ * Valid values are from 1 to 8
+ */
+#define CFG_BLE_NUM_LINK 8
+
+/**
+ * Maximum number of Services that can be stored in the GATT database.
+ * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services
+ */
+#define CFG_BLE_NUM_GATT_SERVICES 8
+
+/**
+ * Maximum number of Attributes
+ * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services)
+ * that can be stored in the GATT database.
+ * Note that certain characteristics and relative descriptors are added automatically during device initialization
+ * so this parameters should be 9 plus the number of user Attributes
+ */
+#define CFG_BLE_NUM_GATT_ATTRIBUTES 68
+
+/**
+ * Maximum supported ATT_MTU size
+ */
+#define CFG_BLE_MAX_ATT_MTU (23/*156*/)
+
+/**
+ * Size of the storage area for Attribute values
+ * This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute:
+ * - attribute value length
+ * - 5, if UUID is 16 bit; 19, if UUID is 128 bit
+ * - 2, if server configuration descriptor is used
+ * - 2*DTM_NUM_LINK, if client configuration descriptor is used
+ * - 2, if extended properties is used
+ * The total amount of memory needed is the sum of the above quantities for each attribute.
+ */
+#define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344)
+
+/**
+ * Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
+ */
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+
+/**
+ * Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
+ */
+#define CFG_BLE_DATA_LENGTH_EXTENSION 1
+
+/**
+ * Sleep clock accuracy in Slave mode (ppm value)
+ */
+#define CFG_BLE_SLAVE_SCA 500
+
+/**
+ * Sleep clock accuracy in Master mode
+ * 0 : 251 ppm to 500 ppm
+ * 1 : 151 ppm to 250 ppm
+ * 2 : 101 ppm to 150 ppm
+ * 3 : 76 ppm to 100 ppm
+ * 4 : 51 ppm to 75 ppm
+ * 5 : 31 ppm to 50 ppm
+ * 6 : 21 ppm to 30 ppm
+ * 7 : 0 ppm to 20 ppm
+ */
+#define CFG_BLE_MASTER_SCA 0
+
+/**
+ * Source for the 32 kHz slow speed clock
+ * 1 : internal RO
+ * 0 : external crystal ( no calibration )
+ */
+#define CFG_BLE_LSE_SOURCE 0
+
+/**
+ * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_HSE_STARTUP_TIME 0x148
+
+/**
+ * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_MAX_CONN_EVENT_LENGTH ( 0xFFFFFFFF )
+
+/**
+ * Viterbi Mode
+ * 1 : enabled
+ * 0 : disabled
+ */
+#define CFG_BLE_VITERBI_MODE 1
+
+/**
+ * LL Only Mode
+ * 1 : LL Only
+ * 0 : LL + Host
+ */
+#define CFG_BLE_LL_ONLY 0
+
+
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TLBLE_EVT_QUEUE_LENGTH 5
+
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_BLE_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE )
+
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU hw_lpuart1
+
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 0
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+/**
+ * When set to 1, the traces are enabled in the BLE services
+ */
+#define CFG_DEBUG_BLE_TRACE 1
+
+/**
+ * Enable or Disable traces in application
+ */
+#define CFG_DEBUG_APP_TRACE 1
+
+#if (CFG_DEBUG_APP_TRACE != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+
+#if ( (CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0) )
+#define CFG_DEBUG_TRACE 1
+#endif
+
+#if (CFG_DEBUG_TRACE != 0)
+#undef CFG_LPM_SUPPORTED
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+#define CFG_DEBUGGER_SUPPORTED 1
+#endif
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+
+/**
+ * These are the lists of task id registered to the scheduler
+ * Each task id shall be in the range [0:31]
+ * This mechanism allows to implement a generic code in the API TL_BLE_HCI_StatusNot() to comply with
+ * the requirement that a HCI/ACI command shall never be sent if there is already one pending
+ */
+
+/**< Add in that list all tasks that may send a ACI/HCI command */
+typedef enum
+{
+ CFG_TASK_ADV_UPDATE_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_MESH_REQ_ID,
+ CFG_TASK_MESH_BEACON_REQ_ID,
+ CFG_TASK_MESH_UART_RX_REQ_ID,
+ CFG_TASK_APPLI_REQ_ID,
+ CFG_TASK_MESH_SW1_REQ_ID,
+ CFG_TASK_MESH_LPN_REQ_ID,
+
+ CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
+} CFG_Task_Id_With_HCI_Cmd_t;
+
+/**< Add in that list all tasks that never send a ACI/HCI command */
+typedef enum
+{
+ CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
+
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
+
+ CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
+} CFG_Task_Id_With_NO_HCI_Cmd_t;
+#define CFG_TASK_NBR CFG_LAST_TASK_ID_WITHO_NO_HCICMD
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
+} CFG_IdleEvt_Id_t;
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_BLE
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*__APP_CONFIG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h
index 13485c16b..13485c16b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h
index 5d85cd90c..5d85cd90c 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
index 1e2d7a616..1e2d7a616 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h
index 18c088d3e..18c088d3e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h
index 41f226faf..41f226faf 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
index 3de57ae3e..3de57ae3e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h
index 0270583e8..0270583e8 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..06d41fa17
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,66 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+void USART1_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void LPUART1_IRQHandler(void);
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+
+void POWEROFF_EXTI_IRQHandler(void);
+void TIM2_IRQHandler(void);
+void TIM1_CC_IRQHandler(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h
index 4b9e79dde..4b9e79dde 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c
new file mode 100644
index 000000000..246173ae6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @file app_debug.c
+ * @author MCD Application Team
+ * @brief Debug capabilities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "app_debug.h"
+#include "utilities_common.h"
+#include "shci.h"
+#include "tl.h"
+#include "dbg_trace.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef PACKED_STRUCT
+{
+ GPIO_TypeDef* port;
+ uint16_t pin;
+ uint8_t enable;
+ uint8_t reserved;
+} APPD_GpioConfig_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define GPIO_NBR_OF_RF_SIGNALS 9
+#define GPIO_CFG_NBR_OF_FEATURES 34
+#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
+#define NBR_OF_GENERAL_CONFIG_PARAMETERS 4
+
+/**
+ * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
+ */
+#define BLE_DTB_CFG 0
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * It provides timing information on the CPU2 activity.
+ * All configuration of (port, pin) is supported for each features and can be selected by the user
+ * depending on the availability
+ */
+static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] =
+{
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */
+/* From v1.1.1 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */
+/* From v1.2.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */
+/* From v1.3.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */
+/* From v1.4.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */
+};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * This table is relevant only for BLE
+ * It provides timing information on BLE RF activity.
+ * New signals may be allocated at any location when requested by ST
+ * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed
+ */
+#if( BLE_DTB_CFG == 7)
+static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
+{
+ { GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */
+ { GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */
+ { GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */
+ { GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */
+ { GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */
+ { GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */
+ { GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */
+ { GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */
+ { GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
+};
+#endif
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void APPD_SetCPU2GpioConfig( void );
+static void APPD_BleDtbCfg( void );
+
+/* Functions Definition ------------------------------------------------------*/
+void APPD_Init( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+ HAL_DBGMCU_EnableDBGStopMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ APPD_SetCPU2GpioConfig( );
+ APPD_BleDtbCfg( );
+
+ return;
+}
+
+void APPD_EnableCPU2( void )
+{
+ SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
+ {
+ {{0,0,0}}, /**< Does not need to be initialized */
+ {(uint8_t *)aGpioConfigList,
+ (uint8_t *)&APPD_TracesConfig,
+ (uint8_t *)&APPD_GeneralConfig,
+ GPIO_CFG_NBR_OF_FEATURES,
+ NBR_OF_TRACES_CONFIG_PARAMETERS,
+ NBR_OF_GENERAL_CONFIG_PARAMETERS}
+ };
+
+ /**< Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /** GPIO DEBUG Initialization */
+ SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void APPD_SetCPU2GpioConfig( void )
+{
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+ uint16_t gpioc_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+ gpioc_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++)
+ {
+ if( aGpioConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aGpioConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOC:
+ gpioc_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpioc_pin_list != 0)
+ {
+ gpio_config.Pin = gpioc_pin_list;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &gpio_config);
+ HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
+ }
+
+ return;
+}
+
+static void APPD_BleDtbCfg( void )
+{
+#if (BLE_DTB_CFG != 0)
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++)
+ {
+ if( aRfConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aRfConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_AF_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ gpio_config.Alternate = GPIO_AF6_RF_DTB7;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ }
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+*************************************************************/
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ HW_UART_Init(CFG_DEBUG_TRACE_UART);
+ return;
+}
+
+
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c
new file mode 100644
index 000000000..eeae11800
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c
@@ -0,0 +1,414 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.c
+ * @author MCD Application Team
+ * @brief Entry point of the Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_ble.h"
+#include "ble.h"
+#include "tl.h"
+#include "stm32_seq.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "app_debug.h"
+
+#include "app_debug.h"
+
+#include "appli_mesh.h"
+#include "appli_nvm.h"
+#include "pal_nvm.h"
+#include "lp_timer.h"
+#include "mesh_cfg.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+extern MOBLEUINT8 PowerOnOff_flag;
+#endif
+#ifdef ENABLE_OCCUPANCY_SENSOR
+extern MOBLEUINT8 Occupancy_Flag;
+#endif
+extern const void *mobleNvmBase;
+extern const void *appNvmBase;
+extern const void *prvsnr_data;
+#if (LOW_POWER_FEATURE == 1)
+extern __IO uint32_t uwTick;
+extern uint32_t uwTickFreq;
+#if ( CFG_LPM_SUPPORTED == 1)
+static uint32_t BleMesh_sleepTime;
+#endif
+extern volatile uint8_t BleProcessInit;
+#endif
+
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+
+static void APPE_SysUserEvtRx( void * pPayload );
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+uint8_t Mesh_Stop_Mode;
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ MOBLEUINT32 last_user_flash_address = ((READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos) << 12) + FLASH_BASE;
+
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ APPD_Init( );
+
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ Led_Init();
+
+ Button_Init();
+
+ mobleNvmBase = (const void *)(last_user_flash_address - NVM_SIZE);
+ appNvmBase = (const void *)(last_user_flash_address - NVM_SIZE - APP_NVM_SIZE);
+ prvsnr_data = (const void *)(last_user_flash_address - NVM_SIZE - APP_NVM_SIZE - PRVN_NVM_PAGE_SIZE);
+
+#if (LOW_POWER_FEATURE == 1)
+ /**
+ * Initialize the lp timer to be used when the systick is stopped in low power mode
+ */
+ LpTimerInit();
+#endif
+
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ UNUSED(pPayload);
+ /* Traces channel initialization */
+ /* Enable debug on CPU2 */
+ APPD_EnableCPU2( );
+
+ APP_BLE_Init( );
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+#if (LOW_POWER_FEATURE == 1)
+ if(BleProcessInit != 0)
+ {
+ BleMesh_sleepTime = (uint32_t)BLEMesh_GetSleepDuration();
+
+ if (BleMesh_sleepTime > 0)
+ {
+ LpTimerStart(BleMesh_sleepTime);
+
+ UTIL_LPM_EnterLowPower( );
+
+ uwTick += (uwTickFreq*LpGetElapsedTime());
+ }
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+ }
+#else
+ UTIL_LPM_EnterLowPower( );
+#endif
+#else
+#if (LOW_POWER_FEATURE == 1)
+ if(BleProcessInit != 0)
+ {
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+ }
+#endif
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_Run( 0 );
+#else
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+#endif
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ case POWEROFF_PIN:
+ {
+ PowerOnOff_flag = 1;
+ }
+ break;
+#endif
+
+ case BUTTON_SW1_PIN:
+ {
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW1_REQ_ID, CFG_SCH_PRIO_0);
+ }
+ break;
+
+#ifdef ENABLE_OCCUPANCY_SENSOR
+ case BUTTON_SW2_PIN:
+ {
+ Occupancy_Flag = 1;
+ }
+ break;
+#endif
+
+#if ( CFG_LPM_SUPPORTED == 1)
+ case BUTTON_SW3_PIN:
+ {
+ if(Mesh_Stop_Mode == 0)
+ {
+ Mesh_Stop_Mode = 1;
+ /**
+ * Do allow stop mode in the application
+ */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_ENABLE);
+ BSP_LED_Off(LED_GREEN);
+ }
+ else
+ {
+ Mesh_Stop_Mode = 0;
+ /**
+ * Do not allow stop mode in the application
+ */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+ BSP_LED_On(LED_GREEN);
+ }
+ }
+ break;
+#endif
+
+ default:
+ break;
+
+ }
+ return;
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c
index 882181c8c..882181c8c 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c
index c842ba55e..c842ba55e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c
index f6b6d9843..cb97bd718 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c
@@ -184,7 +184,7 @@ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size,
#if (CFG_HW_LPUART1_ENABLED == 1)
case hw_lpuart1:
- HW_UART_RX_IT(hlpuart1, LPUART1);
+ HW_UART_RX_IT(hlpuart1, LPUART1);
break;
#endif
@@ -207,7 +207,7 @@ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size
#if (CFG_HW_LPUART1_ENABLED == 1)
case hw_lpuart1:
- HW_UART_TX_IT(hlpuart1, LPUART1);
+ HW_UART_TX_IT(hlpuart1, LPUART1);
break;
#endif
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c
index 404bb2e3b..404bb2e3b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
index 55ad108d6..95537ac98 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
@@ -233,9 +233,9 @@ static void Init_RTC( void )
/* Disable RTC registers write protection */
LL_RTC_DisableWriteProtection(RTC);
-
+
LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
-
+
/* Enable RTC registers write protection */
LL_RTC_EnableWriteProtection(RTC);
@@ -314,7 +314,7 @@ void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
-
+
/* USER CODE END Error_Handler_Debug */
}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..8120bda4a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,233 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "stm32wbxx_it.h"
+#include "appli_mesh.h"
+#include "PWM_handlers.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/******************************************************************************/
+/* Cortex-M4 Processor Exceptions Handlers */
+/******************************************************************************/
+
+/**
+ * @brief This function handles NMI exception.
+ * @param None
+ * @retval None
+ */
+void NMI_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Hard Fault exception.
+ * @param None
+ * @retval None
+ */
+void HardFault_Handler(void)
+{
+ BSP_LED_On(LED_RED);
+#ifndef DISABLE_TRACES
+ printf("HARDFAULT !\r\n");
+#endif
+ /* Go to infinite loop when Hard Fault exception occurs */
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles SVCall exception.
+ * @param None
+ * @retval None
+ */
+void SVC_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Debug Monitor exception.
+ * @param None
+ * @retval None
+ */
+void DebugMon_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles PendSVC exception.
+ * @param None
+ * @retval None
+ */
+void PendSV_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles SysTick Handler.
+ * @param None
+ * @retval None
+ */
+void SysTick_Handler(void)
+{
+ HAL_IncTick();
+}
+
+/********************************************************************************/
+/* STM32WBxx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32wb55xx_cm4.s). */
+/********************************************************************************/
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void POWEROFF_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(POWEROFF_PIN);
+}
+#endif
+
+#if(CFG_HW_USART1_ENABLED == 1)
+void USART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+#if(CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_USART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+#if(CFG_HW_LPUART1_ENABLED == 1)
+void LPUART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+#if(CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/**
+ * @brief This function handles TIM2 global interrupt.
+ */
+void TIM2_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM2_IRQn 0 */
+
+ /* USER CODE END TIM2_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim2);
+ /* USER CODE BEGIN TIM2_IRQn 1 */
+
+ /* USER CODE END TIM2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles TIM1 global interrupt.
+ */
+void TIM1_CC_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM1_IRQn 0 */
+
+ /* USER CODE END TIM1_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim1);
+ /* USER CODE BEGIN TIM1_IRQn 1 */
+
+ /* USER CODE END TIM1_IRQn 1 */
+}
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c
index 9e9b79832..9e9b79832 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd
new file mode 100644
index 000000000..c09341820
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd
@@ -0,0 +1,2834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_PRF_Node</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+ <configuration>
+ <name>Lighting_Provisioner</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp
new file mode 100644
index 000000000..f3ec864d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp
@@ -0,0 +1,1339 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_PRF_Node</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Lighting_PRF_Node\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Lighting_PRF_Node\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Lighting_PRF_Node\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.80.2.11970</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>CORE_CM4</state>
+ <state>STM32</state>
+ <state>ENABLE_USART</state>
+ <state>TRACE_ENABLE_NO_FUNCTION</state>
+ <state>SERVER</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Inc</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\app</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\Inc</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>BLE_MeshLightingPRFNode.hex</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>BLE_MeshLightingPRFNode.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_IAR.a</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_IARv8.a</state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>Coder</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_debug.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\lp_timer.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ </group>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>app</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\app_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_lc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_mesh.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_nvm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\models_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\pal_nvm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\PWM_config.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\PWM_handlers.c</name>
+ </file>
+ </group>
+ <group>
+ <name>target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_i2c.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_i2c_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>ble</name>
+ <group>
+ <name>blesvc</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\common.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_lc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\mesh.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Src\mesh_cfg.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\time_scene.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\vendor.c</name>
+ </file>
+ </group>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gatt_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hal_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hci_le.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_l2cap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template\osal.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww
new file mode 100644
index 000000000..0ac00f960
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_MeshLightingPRFNode.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..5f36da686
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
new file mode 100644
index 000000000..d868aa269
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
@@ -0,0 +1,1188 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>Lighting_PRFNode</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>18</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>0</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>1</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>0</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>BIN\UL2CM3.DLL</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint/>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>0</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Application/Core</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_debug.c</PathWithFileName>
+ <FilenameWithoutPath>app_debug.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_entry.c</PathWithFileName>
+ <FilenameWithoutPath>app_entry.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_flash.c</PathWithFileName>
+ <FilenameWithoutPath>hw_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_timerserver.c</PathWithFileName>
+ <FilenameWithoutPath>hw_timerserver.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_uart.c</PathWithFileName>
+ <FilenameWithoutPath>hw_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/lp_timer.c</PathWithFileName>
+ <FilenameWithoutPath>lp_timer.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/main.c</PathWithFileName>
+ <FilenameWithoutPath>main.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32_lpm_if.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_it.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_it.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>startup_stm32wb55xx_cm4.s</PathWithFileName>
+ <FilenameWithoutPath>startup_stm32wb55xx_cm4.s</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/STM32_WPAN/app</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/app_ble.c</PathWithFileName>
+ <FilenameWithoutPath>app_ble.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_generic.c</PathWithFileName>
+ <FilenameWithoutPath>appli_generic.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_light.c</PathWithFileName>
+ <FilenameWithoutPath>appli_light.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_light_lc.c</PathWithFileName>
+ <FilenameWithoutPath>appli_light_lc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_mesh.c</PathWithFileName>
+ <FilenameWithoutPath>appli_mesh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_nvm.c</PathWithFileName>
+ <FilenameWithoutPath>appli_nvm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_sensor.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_vendor.c</PathWithFileName>
+ <FilenameWithoutPath>appli_vendor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/models_if.c</PathWithFileName>
+ <FilenameWithoutPath>models_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/pal_nvm.c</PathWithFileName>
+ <FilenameWithoutPath>pal_nvm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/PWM_config.c</PathWithFileName>
+ <FilenameWithoutPath>PWM_config.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/PWM_handlers.c</PathWithFileName>
+ <FilenameWithoutPath>PWM_handlers.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/STM32_WPAN/target</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/target/hw_ipcc.c</PathWithFileName>
+ <FilenameWithoutPath>hw_ipcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Doc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>5</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../readme.txt</PathWithFileName>
+ <FilenameWithoutPath>readme.txt</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_nucleo.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/system_stm32wbxx.c</PathWithFileName>
+ <FilenameWithoutPath>system_stm32wbxx.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_cortex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_i2c.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_i2c_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>38</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>39</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>40</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>41</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>42</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>43</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>44</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>45</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</PathWithFileName>
+ <FilenameWithoutPath>common.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>46</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</PathWithFileName>
+ <FilenameWithoutPath>generic.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>47</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</PathWithFileName>
+ <FilenameWithoutPath>light.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>48</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</PathWithFileName>
+ <FilenameWithoutPath>light_lc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>49</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</PathWithFileName>
+ <FilenameWithoutPath>mesh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>50</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</PathWithFileName>
+ <FilenameWithoutPath>mesh_cfg.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>51</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</PathWithFileName>
+ <FilenameWithoutPath>sensors.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>52</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</PathWithFileName>
+ <FilenameWithoutPath>svc_ctl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>53</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</PathWithFileName>
+ <FilenameWithoutPath>time_scene.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>54</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</PathWithFileName>
+ <FilenameWithoutPath>vendor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/core</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>55</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_gap_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>56</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_gatt_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>57</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_hal_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>58</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</PathWithFileName>
+ <FilenameWithoutPath>ble_hci_le.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>59</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_l2cap_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>60</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</PathWithFileName>
+ <FilenameWithoutPath>osal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>61</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</PathWithFileName>
+ <FilenameWithoutPath>shci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>62</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>63</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>64</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>65</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>66</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</PathWithFileName>
+ <FilenameWithoutPath>tl_mbox.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</PathWithFileName>
+ <FilenameWithoutPath>dbg_trace.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>68</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</PathWithFileName>
+ <FilenameWithoutPath>otp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>69</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>70</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/sequencer/stm32_seq.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_seq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>71</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</PathWithFileName>
+ <FilenameWithoutPath>stm_list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>72</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</PathWithFileName>
+ <FilenameWithoutPath>stm_queue.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>14</GroupNumber>
+ <FileNumber>73</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</PathWithFileName>
+ <FilenameWithoutPath>libBle_Mesh_CM4_Keil.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>74</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</PathWithFileName>
+ <FilenameWithoutPath>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>1</RteFlg>
+ </Group>
+
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx
new file mode 100644
index 000000000..1f26156f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>Lighting_PRFNode</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
+ <PackURL>http://www.keil.com/pack</PackURL>
+ <Cpu>IRAM(0x20000000,0x000040000) IROM(0x08000000,0x001000000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</FlashDriverDll>
+ <DeviceId>0</DeviceId>
+ <RegisterFile>$$Device:STM32WB55RGVx$Drivers\CMSIS\Device\ST\STM32WBxx\Include\stm32wbxx.h</RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32WB55RGVx$CMSIS\SVD\STM32WBxx_CM4.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>Lighting_PRFNode\Exe\</OutputDirectory>
+ <OutputName>BLE_MeshLightingPRFNodeDemo</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>1</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>0</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments> -REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments> -MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4096</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>BIN\UL2CM3.DLL</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>1</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0x40000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x1000000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define>USE_STM32WBXX_NUCLEO,STM32WB55xx,USE_HAL_DRIVER,CORE_CM4,STM32,ENABLE_USART,TRACE_ENABLE_NO_FUNCTION,SERVER</Define>
+ <Undefine></Undefine>
+ <IncludePath>../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc;../Core/Inc;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../STM32_WPAN/app;../../../../../../Middlewares/ST/STM32_WPAN/ble;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <uClangAs>0</uClangAs>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Application/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>app_debug.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_debug.c</FilePath>
+ </File>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>lp_timer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/lp_timer.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/STM32_WPAN/app</GroupName>
+ <Files>
+ <File>
+ <FileName>app_ble.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/app_ble.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_generic.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_generic.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_light.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light_lc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_light_lc.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_mesh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_mesh.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_nvm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_nvm.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_sensor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_sensor.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_vendor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_vendor.c</FilePath>
+ </File>
+ <File>
+ <FileName>models_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/models_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>pal_nvm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/pal_nvm.c</FilePath>
+ </File>
+ <File>
+ <FileName>PWM_config.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/PWM_config.c</FilePath>
+ </File>
+ <File>
+ <FileName>PWM_handlers.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/PWM_handlers.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/STM32_WPAN/target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_nucleo.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <Files>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_i2c.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_i2c_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
+ <Files>
+ <File>
+ <FileName>common.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</FilePath>
+ </File>
+ <File>
+ <FileName>generic.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</FilePath>
+ </File>
+ <File>
+ <FileName>light.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</FilePath>
+ </File>
+ <File>
+ <FileName>light_lc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</FilePath>
+ </File>
+ <File>
+ <FileName>mesh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</FilePath>
+ </File>
+ <File>
+ <FileName>mesh_cfg.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</FilePath>
+ </File>
+ <File>
+ <FileName>sensors.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</FilePath>
+ </File>
+ <File>
+ <FileName>svc_ctl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</FilePath>
+ </File>
+ <File>
+ <FileName>time_scene.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</FilePath>
+ </File>
+ <File>
+ <FileName>vendor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/core</GroupName>
+ <Files>
+ <File>
+ <FileName>ble_gap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_gatt_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hal_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hci_le.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_l2cap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>osal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>hci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>hci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
+ <Files>
+ <File>
+ <FileName>libBle_Mesh_CM4_Keil.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
+ <Files>
+ <File>
+ <FileName>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.1.2" condition="ARMv6_7_8-M Device">
+ <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.4.0"/>
+ <targetInfos>
+ <targetInfo name="Lighting_PRFNode"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s
index e05e3c5ca..e05e3c5ca 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/startup_stm32wb55xx_cm4.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct
index 63845c07b..63845c07b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/stm32wb55xx_flash_cm4.sct
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c
index e9b50f44e..e9b50f44e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h
index a229ec666..a229ec666 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_config.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c
index 698bdced8..698bdced8 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h
index a27fa757b..a27fa757b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/PWM_handlers.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
index 836acc26b..c96144dff 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
@@ -391,7 +391,7 @@ static void Ble_Hci_Gap_Gatt_Init(void){
srd_bd_addr[1] = 0x0000ED6E;
srd_bd_addr[0] = LL_FLASH_GetUDN( );
aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
-
+
/**
* Write Identity root key used to derive LTK and CSRK
*/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h
index d87d3e466..d87d3e466 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/app_ble.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c
index 553bc0a86..578a6f4bf 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c
@@ -76,6 +76,7 @@ const MOBLEUINT8 aConfigAppKeyDeleteDefault[3]=
(MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
(MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff)};
+
const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
{ /* NetKeyIndex : 2B
Index of the NetKey */
@@ -84,11 +85,10 @@ const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
const MOBLEUINT8 aNoParamDefaultConfig;
-#define MAX_CONFIG_PARAM_SIZE 22
const MOBLEUINT8 aNoInitParamDefault[MAX_CONFIG_PARAM_SIZE]= {0};
/* Private macro -------------------------------------------------------------*/
-MOBLEUINT16 aSigModelsToBind[] =
+MOBLEUINT16 aSigModelsToBind[][MAX_ELEMENTS_PER_NODE] = {
{
GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
@@ -96,8 +96,26 @@ MOBLEUINT16 aSigModelsToBind[] =
// SENSOR_SERVER_MODEL_ID,
// LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
// LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ }
};
+
MOBLEUINT16 aPublishModels[] =
{
GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
@@ -714,13 +732,11 @@ eClientSendMsgState_t eClientSendMsgState; /* Keeps the state of Sent Message */
eServerRespRecdState_t eServerRespRecdState; /* Keeps the state of Received Message */
/* Private function prototypes -----------------------------------------------*/
-MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx);
-
/* Private functions ---------------------------------------------------------*/
/**
* @brief This function is callback from library after the Provisioning is
- completed by embedded Provisioner.
+ completed by embedded Provisioner
* @param prvState: Provisioning State of the Node. Expecting "1" when the
provisioning is completed
* @retval None
@@ -735,6 +751,7 @@ void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState)
}
}
+
/**
* @brief This function is Init function for the state machine of the
Configuration Client. The Function shall be called everytime a new
@@ -751,6 +768,7 @@ MOBLE_RESULT Appli_ConfigClient_Init(void)
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief Appli_ConfigClient_Process: This function is Process function and
shall be called from while(1) loop
@@ -821,7 +839,6 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
else if (eClientSendMsgState == CompositionGet_State)
{
-
nowClockTime = Clock_Time();
if( (nowClockTime - NodeInfo.Initial_time) < CONFIGURATION_START_DELAY)
{
@@ -833,7 +850,6 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
{
eClientSendMsgState = AppKeyAdd_State; /* Change the state to Next */
eServerRespRecdState = NodeIdle_State;
-
}
else
{
@@ -903,10 +919,8 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
}
-
-
/**
-* @brief This function is called to Get The Composition data from the
+* @brief This function is called to Get the Composition data from the
* a node under configuration
* @param None
* @retval MOBLE_RESULT
@@ -915,14 +929,18 @@ MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT8 retry;
+ MOBLEUINT16 dst_peer;
switch(eServerRespRecdState)
{
case NodeIdle_State:
ConfigClient_SaveMsgSendingTime();
+
+ dst_peer = GetAddressToConfigure();
+
/* Start the Get Composition Message */
- ConfigClient_CompositionDataGet();
+ ConfigClient_CompositionDataGet(dst_peer);
/* Switch to InProgress_State */
eServerRespRecdState = InProgress_State;
@@ -946,7 +964,7 @@ MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
}
else if (retry == CLIENT_TX_TIMEOUT)
{
- eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */;
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
}
break;
@@ -962,7 +980,7 @@ MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
/**
* @brief Appli_ConfigClient_DefaultAppKeyAdd: This function is called to
- add the default AppKeys and net keys to a node under configuration
+ add the default AppKeys and NetKeys to a node under configuration
* @param None
* @retval MOBLE_RESULT
*/
@@ -973,6 +991,7 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
MOBLEUINT8 *pAppKey;
MOBLEUINT16 netKeyIndex = DEFAULT_NETKEY_INDEX;
MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLE_ADDRESS dst_addr;
pAppKey = GetNewProvNodeAppKey();
@@ -980,10 +999,15 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
{
case NodeIdle_State:
ConfigClient_SaveMsgSendingTime();
+
+ dst_addr = GetAddressToConfigure();
+
/* Start the Set Appkey message */
- ConfigClient_AppKeyAdd (netKeyIndex,
+ ConfigClient_AppKeyAdd ( dst_addr,
+ netKeyIndex,
appKeyIndex,
pAppKey);
+
/* Switch to InProgress_State */
eServerRespRecdState = InProgress_State;
break;
@@ -1005,7 +1029,7 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
}
else if (retry == CLIENT_TX_TIMEOUT)
{
- eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */;
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
}
break;
@@ -1018,21 +1042,15 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
return result;
}
+
/**
* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
function to Bind the element(node) with AppKeyIndex and Models
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
{
-
- /*
- ElementAddress : 2B : Address of the element
- AppKeyIndex : 2B : Index of the AppKey
- ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID
- */
static MOBLEUINT32 modelIdentifier;
static MOBLEUINT8 elementIndex;
static MOBLEUINT8 indexSIGmodels;
@@ -1053,18 +1071,32 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
elementIndex = 0; /* Initialize it for the complete loop */
indexSIGmodels = 0; /* Initialize it for the complete loop */
indexVendormodels = 0;
- modelIdentifier = GetSIGModelToBindApp(elementIndex,indexSIGmodels );
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ modelIdentifier = GetSIGModelToBindApp(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
/* Switch to NodeSendMessage_State */
eServerRespRecdState = NodeSendMessage_State;
break;
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
case NodeSendMessage_State:
/* Start the AppBindModel_State message */
elementAddress = GetServerElementAddress(elementIndex);
- ConfigClient_SaveMsgSendingTime();
/* Switch to InProgress_State */
eServerRespRecdState = InProgress_State;
+
+ ConfigClient_SaveMsgSendingTime();
+
/* Send the Message to the server */
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
break;
@@ -1091,16 +1123,13 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
if (indexSIGmodels < numSIGmodels )
{/* if index is still less, then we have scope of reading 1 more index */
- /* Get the Next Model and Bind it again till all SIG Models are binded */
- modelIdentifier = GetSIGModelToBindApp(elementIndex,indexSIGmodels );
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeNextSigModel_State;
/* Switch to InProgress_State */
}
else if (indexVendormodels < numVendorModels)
{
/*Now, do binding for Vendor Model */
- modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeNextVendorModel_State;
}
else
{
@@ -1116,8 +1145,10 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
else if (elementIndex < numofElements)
{ /* When the Element Index is still less than the total number of
elements in the Node: So, Restart the cycle */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
- eServerRespRecdState = NodeIdle_State;
+ eServerRespRecdState = NodeNextSigModel_State;
}
}
break;
@@ -1149,8 +1180,7 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
/**
* @brief AppliConfigClient_SubscriptionAddDefault: This function is application
used for adding subscription to the element(node) for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
@@ -1175,11 +1205,23 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
elementIndex = 0; /* Initialize it for the complete loop */
indexSIGmodels = 0; /* Initialize it for the complete loop */
indexVendormodels = 0;
- modelIdentifier = GetSIGModelToSubscribe(elementIndex,indexSIGmodels );
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ modelIdentifier = GetSIGModelToSubscribe(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
/* Switch to NodeSendMessage_State */
eServerRespRecdState = NodeSendMessage_State;
break;
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
case NodeSendMessage_State:
elementAddress = GetServerElementAddress(elementIndex);
ConfigClient_SaveMsgSendingTime();
@@ -1214,15 +1256,12 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
{/* if index is still less, then we have scope of reading 1 more index */
/* Get the Next Model and Bind it again till all SIG Models are binded */
- modelIdentifier = GetSIGModelToSubscribe(elementIndex,indexSIGmodels);
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeNextSigModel_State;
}
else if (indexVendormodels < numVendorModels)
{
- modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
- eServerRespRecdState = NodeSendMessage_State;
-
+ eServerRespRecdState = NodeNextVendorModel_State;
}
else
{
@@ -1238,7 +1277,7 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
{ /* When the Element Index is still less than the total number of
elements in the Node: So, Restart the cycle */
- eServerRespRecdState = NodeIdle_State;
+ eServerRespRecdState = NodeNextSigModel_State;
indexSIGmodels =0; /* Reset the variable again for the next element */
indexVendormodels = 0;
}
@@ -1268,12 +1307,12 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
return result;
}
+
/**
* @brief AppliConfigClient_PublicationSetDefault: This function is application
used for adding publication settings to the element(node)
for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
@@ -1305,12 +1344,24 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
elementIndex = 0; /* Initialize it for the complete loop */
indexSIGmodels = 0; /* Initialize it for the complete loop */
indexVendormodels = 0;
- modelIdentifier = GetSIGModelToPublish(elementIndex,indexSIGmodels );
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ modelIdentifier = GetSIGModelToPublish(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
/* Switch to NodeSendMessage_State */
eServerRespRecdState = NodeSendMessage_State;
+ break;
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels);
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
break;
+
case NodeSendMessage_State:
elementAddress = GetServerElementAddress(elementIndex);
@@ -1353,23 +1404,18 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
if (indexSIGmodels < numSIGmodels )
{/* if index is still less, then we have scope of reading 1 more index */
-
- /* Get the Next Model and Bind it again till all SIG Models are binded */
- modelIdentifier = GetSIGModelToPublish(elementIndex,indexSIGmodels);
- eServerRespRecdState = NodeSendMessage_State;
-
+ eServerRespRecdState = NodeNextSigModel_State;
}
else if (indexVendormodels < numVendorModels)
{
- modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels );
- eServerRespRecdState = NodeSendMessage_State;
-
+ eServerRespRecdState = NodeNextVendorModel_State;
}
else
{
/* Now, the element index is handled, change the element index */
elementIndex++;
numofElements = ConfigClient_GetNodeElements();
+
if (elementIndex == numofElements)
{/* we are comparing Index whose counting started from 0, becomes equal,
then exit the loop */
@@ -1379,7 +1425,7 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
{ /* When the Element Index is still less than the total number of
elements in the Node: So, Restart the cycle */
- eServerRespRecdState = NodeIdle_State;
+ eServerRespRecdState = NodeNextSigModel_State;
indexSIGmodels =0; /* Reset the variable again for the next element */
indexVendormodels = 0;
}
@@ -1409,12 +1455,12 @@ MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
return result;
}
+
/**
-* @brief AppliConfigClient_PublicationSetDefault: This function is application
+* @brief AppliConfigClient_SelfPublicationSetDefault: This function is application
used for adding publication settings to the element(node)
for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
@@ -1428,20 +1474,52 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
MOBLEUINT16 elementAddress;
- MOBLEUINT32 modelIdentifier;
- MOBLEUINT8 numSIGmodels;
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- numSIGmodels = sizeof(aPublishModels)/sizeof(MOBLEUINT16);
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
- for (MOBLEUINT8 index=0; index < numSIGmodels; index++)
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
{
- /* Start the Publication Add message */
- elementAddress = BLEMesh_GetAddress();
- modelIdentifier = 0;
- modelIdentifier = (MOBLEUINT16) aPublishModels[index];
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
- /* Switch to InProgress_State */
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
ConfigClient_PublicationSet(elementAddress,
publishAddress,
appKeyIndex,
@@ -1452,74 +1530,125 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
publishRetransmitIntervalSteps,
modelIdentifier);
}
-
+ }
+ }
return result;
}
/**
-* @brief AppliConfigClient_PublicationSetDefault: This function is application
- used for adding publication settings to the element(node)
+* @brief AppliConfigClient_SelfSubscriptionSetDefault: This function is application
+ used for adding Subscription settings to the element(node)
for default settings
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
- MOBLEUINT32 modelIdentifier;
+ MOBLEUINT32 modelIdentifier=0;
MOBLEUINT16 elementAddress;
- MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 elementIndex;
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- numSIGmodels = sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ /*If limit is reaching to no models*/
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
- for (MOBLEUINT8 index=0; index < numSIGmodels; index++)
+ /*Checking for Vendor Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
{
- /* Start the Publication Add message */
- elementAddress = BLEMesh_GetAddress();
- modelIdentifier = 0;
- modelIdentifier = (MOBLEUINT16) aSubscribeModels[index];
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
}
+ }
+ }
return result;
}
+
/**
* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
function to Bind the element(node) with AppKeyIndex and Models
-* @param pGeneric_OnOffParam: Pointer to the parameters received for message
-* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param None
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
- /*
- ElementAddress : 2B : Address of the element
- AppKeyIndex : 2B : Index of the AppKey
- ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID
- */
- MOBLEUINT32 modelIdentifier;
+ MOBLEUINT32 modelIdentifier=0;
MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
MOBLEUINT16 elementAddress;
- MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- numSIGmodels = sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
- for (MOBLEUINT8 index=0; index < numSIGmodels; index++)
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
{
- elementAddress = BLEMesh_GetAddress();
- modelIdentifier = 0;
- modelIdentifier = (MOBLEUINT16) aSigModelsToBind[index];
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
}
-
+ }
+
+ }
return result;
}
@@ -1534,6 +1663,7 @@ void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
eServerRespRecdState = CompositionRecd_State;
}
+
/**
* @brief Appli_AppKeyStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1546,6 +1676,7 @@ void Appli_AppKeyStatusCb(MOBLEUINT8 status)
eServerRespRecdState = AppkeyAck_State;
}
+
/**
* @brief Appli_AppBindModelStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1558,6 +1689,7 @@ void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
eServerRespRecdState = AppBindModelAck_State;
}
+
/**
* @brief Appli_SubscriptionAddStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1570,6 +1702,7 @@ void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
eServerRespRecdState = SubscriptionAck_State;
}
+
/**
* @brief Appli_PublicationStatusCb: This function is callback from config
client middleware on reception of the response
@@ -1582,6 +1715,7 @@ void Appli_PublicationStatusCb(MOBLEUINT8 status)
eServerRespRecdState = PublicationStatus_State;
}
+
/**
* @brief Appli_NodeResetStatusCb: This function is callback from config
client middleware on reception of the Node Reset response
@@ -1594,52 +1728,87 @@ void Appli_NodeResetStatusCb(void)
eServerRespRecdState = NodeResetStatus_State;
}
+
/**
* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
{
+
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ MOBLEUINT16 model_id;
+ MOBLEUINT8 index;
+ MOBLEUINT8 idxSIG = *pModelIndex;
+
+ for (index = idxSIG; index < numberOfModels ; index++ )
+ {
+ model_id = aNodeElements[elementIndex].aSIGModels[index];
+ if (MODEL_IS_FOUNDATION_MODEL(model_id))
+ {
+ /* Do nothing, let the next model_if be scanned */
+ model_id = 0xffff; /* Invalid Model ID */
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *pModelIndex = index;
+ return model_id;
#else
- return aSigModelsToBind[idxSIG] ;
+ return aSigModelsToBind[idxSIG][elementIdx] ;
#endif
}
+
/**
* @brief GetVendorModelToBindApp: This function gets the Vendor Model to Bind
-* @param None
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[indexModels];
#else
return VENDORMODEL_STMICRO_ID1 ;
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountSIGModelToBindApp: This function gets the NUMBER of SIG Model
+ to Bind
+* @param elementIndex Index of the Element for which the Count is needed
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
#else
return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element for which the Count is needed
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
#else
return NUM_VENDOR_MODELS_TO_BIND_APP;
#endif
@@ -1647,111 +1816,147 @@ MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx)
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetSIGModelToPublish: This function gets the SIG Model to Publish
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
#else
return aPublishModels[idxSIG] ;
#endif
}
+
/**
-* @brief GetVendorModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @param idxSIG Pointer to Index of the Model
* @retval MOBLE_RESULT
*/
-MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
#else
return VENDORMODEL_STMICRO_ID1 ;
#endif
}
+
/**
* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
#else
return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
#endif
}
+
/**
-* @brief GetCountVendorModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
#else
return NUM_VENDOR_MODELS_TO_PUBLISH;
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetSIGModelToSubscribe: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
* @retval MOBLE_RESULT
*/
-MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
#else
return aSubscribeModels[idxSIG] ;
#endif
}
+
/**
-* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
-* @param None
+* @brief GetVendorModelToSubscribe: This function Gets the Vendor Model ID for
+ Subscription
+* @param elementIndex Index of the Element
+* @param idxSIG Index to the Model ID to Subscribe
* @retval MOBLE_RESULT
*/
-MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG)
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 idxSIG)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
#else
return VENDORMODEL_STMICRO_ID1 ;
#endif
}
+
/**
-* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountSIGModelToSubscribe: This function gets the SIG Model to Subscribe
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
#else
return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
#endif
}
+
/**
-* @brief GetCountVendorModelToPublish: This function gets the SIG Model to Bind
-* @param None
+* @brief GetCountVendorModelToPublish: This function gets the Count of the
+ Vendor Model to Subscribe
+* @param elementIndex Index of the Element
* @retval MOBLE_RESULT
*/
-MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIdx)
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
#else
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
#endif
}
+
/**
-* @brief AppliConfigClient_SendMessageDefault: This function gets the SIG Model to Bind
+* @brief AppliConfigClient_SendMessageDefault: This function is used for sending
+ a message.
+ ** The Function is not yet written fully
* @param None
* @retval MOBLE_RESULT
*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h
index d9465958b..34169448c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_config_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h
@@ -29,6 +29,9 @@
/* Exported macro ------------------------------------------------------------*/
+#define MAX_CONFIG_PARAM_SIZE 22
+#define CONFIGURE_AS_PER_COMPOSITION_DATA
+
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
@@ -53,19 +56,30 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void);
MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void);
Composition_Data_Page0_t* Appli_GetNodeCompositionBuff (void);
-MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx);
-MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8);
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8);
-MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
+
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c
index 082e7d11f..57c1bc7cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c
@@ -56,6 +56,10 @@ Appli_Generic_PowerOnOffSet AppliPowerOnSet;
Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet;
/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid);
/* Private functions ---------------------------------------------------------*/
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
@@ -80,6 +84,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
{
Appli_LightPwmValue.IntensityValue = AppliOnOffSet.Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
+ if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+ {
+ AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ }
+ else
+ {
+ AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ }
+
if(AppliOnOffSet.Present_OnOffValue > 16000)
{
BSP_LED_On(LED_BLUE);
@@ -118,7 +131,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* @brief Appli_Generic_OnOff_Status: This function is callback for Application
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
@@ -126,9 +139,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
*/
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
{
+ MOBLEUINT8 i;
+
TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Present OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Target OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", pOnOff_status[i]);
+ }
return MOBLE_RESULT_SUCCESS;
}
@@ -168,7 +192,11 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0);
+ if(AppliLevelSet.Present_Level16 < 0x00)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+ duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
Appli_LightPwmValue.IntensityValue = duty;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -193,13 +221,13 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
/**
-* @brief Appli_Generic_LevelDelta_Set: This function is callback for Application
+* @brief Appli_Generic_Delta_Set: This function is callback for Application
* when Generic Level Delta message is received
* @param pdeltalevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
MOBLEUINT8 OptionalValid)
{
@@ -223,13 +251,13 @@ MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelPara
/**
-* @brief Appli_Generic_LevelMove_Set: This function is callback for Application
+* @brief Appli_Generic_Move_Set: This function is callback for Application
* when Generic Level Move message is received
* @param pdeltaMoveParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
MOBLEUINT8 OptionalValid)
{
@@ -277,7 +305,7 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
/* set the flag value for NVM store */
- RestoreFlag = No_NVM_FLAG;
+ //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
AppliNvm_SaveMessageParam();
@@ -365,6 +393,8 @@ MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
*pOnOff_Value = AppliOnOffSet.Present_OnOffValue;
*(pOnOff_Value+1) = AppliOnOffSet.Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet.TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet.TargetValue >> 8;
TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Value: Value %d!\n\r",
AppliOnOffSet.Present_OnOffValue);
return MOBLE_RESULT_SUCCESS;
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h
index a68c231f3..41228825e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h
@@ -53,6 +53,7 @@ typedef struct
{
MOBLEUINT8 Present_OnOff;
MOBLEUINT16 Present_OnOffValue;
+ MOBLEUINT16 TargetValue;
}Appli_Generic_OnOffSet;
typedef struct
@@ -67,7 +68,7 @@ typedef struct
typedef struct
{
- MOBLEINT16 DefaultTransitionTime;
+ MOBLEUINT8 DefaultTransitionTime;
}Appli_Generic_DefaultTransitionSet;
typedef struct
@@ -84,8 +85,8 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
MOBLEUINT32 plength);
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*, MOBLEUINT8);
-MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
-MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
MOBLEUINT8 OptionalValid);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
MOBLEUINT32 plength);
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c
index 0c36b2294..0c36b2294 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h
index 8726f76e8..eb1c7dcf2 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_generic_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h
@@ -36,7 +36,6 @@
MOBLE_RESULT Appli_ConfigClient_Set(void);
MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void);
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
#endif /* __APPLI_GENERIC_CLIENT_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c
index 24cd49583..02c6cb8c2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c
@@ -41,6 +41,7 @@
* @{
*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -52,7 +53,7 @@ Following Variables are used for the LIGHTING Lightness MODEL
*******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
-Appli_Light_lightnessSet ApplilightnessSet;
+Appli_Light_lightnessSet ApplilightnessSet = {1,0,0,0,0,0};
Appli_Light_lightnessLinearSet ApplilightnessLinearSet;
/******************************************************************************/
@@ -92,7 +93,6 @@ Following Variables are used for the RGB board.
*******************************************************************************/
Appli_LightPwmValue_t Appli_LightPwmValue;
-
extern MOBLEUINT8 RestoreFlag;
extern MOBLEUINT8 PowerOnOff_flag;
extern MOBLEUINT8 IntensityFlag;
@@ -114,8 +114,14 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->PresentValue16;
-
+ ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+
+ if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
+ {
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ }
+
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
{
@@ -127,22 +133,8 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
- if(pLight_LightnessParam->PresentValue16 != 0x00)
- {
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->PresentValue16;
- }
-
- if(pLight_LightnessParam->PresentValue16 != 0x00)
- {
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->PresentValue16;
- }
-
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
- Appli_LightPwmValue.IntensityValue = duty;
- Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
-
/* For demo, if Level is more than 100, switch ON the LED */
- if(pLight_LightnessParam->PresentValue16 >= 0x8000)
+ if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
BSP_LED_On(LED_BLUE);
}
@@ -152,6 +144,10 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+ duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
/* set the flag value for NVM store */
RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
@@ -192,7 +188,7 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
MOBLEUINT8 OptionalValid)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->PresentValue16;
+ ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
@@ -240,7 +236,12 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
}
ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+ TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
return MOBLE_RESULT_SUCCESS;
}
@@ -338,6 +339,7 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
AppliCtlSet.PresentLightness16,
AppliCtlSet.PresentTemperature16,
AppliCtlSet.PresentCtlDelta16);
+
/* set the flag value for NVM store */
RestoreFlag = LIGHT_CTL_NVM_FLAG;
@@ -453,6 +455,10 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
return MOBLE_RESULT_SUCCESS;
}
@@ -812,6 +818,23 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
/**
+* @brief Appli_Light_GetLightnessLastStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLastState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+{
+ *(lLastState) = ApplilightnessSet.LastLightness16;
+ *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
+
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
* @brief Appli_Light_GetLightnessRangeStatus: This function is callback for Application
* to get the application values in middleware used for transition change.
* @param lRangeState: Pointer to the status message
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h
index f99a48f74..aaa600146 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h
@@ -172,6 +172,7 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState);
MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState);
MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState);
MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState);
MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState);
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c
index 96626b19a..96626b19a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h
index f216e5175..f216e5175 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c
new file mode 100644
index 000000000..cd419fe7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @file appli_light_ctrl.c
+ * @author BLE Mesh Team
+ * @brief Application interface for light LC Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_light_lc.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variable ----------------------------------------------------------*/
+
+Appli_LightLC_Set_t Appli_LightLC_set;
+Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+
+MOBLEUINT16 AmbientLuxLevel;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_LCMode_Set: This function is callback for Application
+* when Light LC mode Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_mode = pLight_LC_Param->LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Mode Set: %d\n\r",
+ pLight_LC_Param->LC_mode);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OM_Set: This function is callback for Application
+* when Light LC mode Occupancy Model Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_OM = pLight_LC_Param->LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"OM Set: %d\n\r",
+ pLight_LC_Param->LC_OM);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OnOff_Set: This function is callback for Application
+* when Light LC On Off Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Present_Light_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"OnOff Set: %d\n\r",
+ pLight_LC_Param->Present_Light_OnOff);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Get_AmbientLuxLevelOutput: This function is given to calculate the Ambient
+ Lux level output from the ambient sensor.
+* @param void:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void)
+{
+ /* Use AmbientLuxLevel global variable to store the value from ambient lux sensor
+ and then use this value to copmpare the lux level output from state machine.
+ */
+
+ return AmbientLuxLevel;
+}
+
+/**
+* @brief Light_LC_LuxLevelPIRegulator: This function will calculate all the parameter
+* Kid,kpu,kiu,kpd and return the value Light Lightness Linear.
+* @param tableLuxLevel:
+* @param ambientLuxLevel:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,MOBLEUINT16 ambientLuxLevel)
+{
+ MOBLEUINT16 luxLevel = 0;
+ /* User can write their code for the calculation */
+
+
+ return luxLevel;
+}
+
+/**
+* @brief Appli_LightLC_Get_ModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+{
+ *(plcModeState) = Appli_LightLC_set.LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_mode);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OMModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOM_ModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState)
+{
+ *(plcOM_ModeState) = Appli_LightLC_set.LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"Get OM Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_OM);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OnOffStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOnOffState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
+{
+ *(plcOnOffState) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+1) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+2) = Appli_LightLC_set.Light_OnOffState;
+ TRACE_M(TF_SERIAL_CTRL,"Get On Off Status: %d\n\r",
+ Appli_LightLC_set.Light_OnOffState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h
index 049d95308..049d95308 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c
index f594f5e20..2b2f07087 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c
@@ -39,9 +39,6 @@
#include "stm32_seq.h"
#include "PWM_config.h"
-#ifdef ENABLE_PROVISIONER_FEATURE
-#include "serial_prvn.h"
-#endif
#include "mesh_cfg_usr.h"
/** @addtogroup ST_BLE_Mesh
@@ -70,10 +67,11 @@
#define USER_OUTPUT_OOB_APPLI_PROCESS 0U
#define INPUT_OOB_TIMEOUT 300U /* input Oob30 Sec timeout*/
#define PBADV_UNPROV_DEV_BEACON_INTERVAL 100U /* 100 ms */
+
#define DEVICE_KEY_SIZE 16U
#define APP_KEY_SIZE 16U
#if (LOW_POWER_FEATURE == 1)
-#define LPN_API_TIMER_INTERVAL 15*(1000000/CFG_TS_TICK_VAL) /* 15 secondes */
+#define LPN_API_TIMER_INTERVAL 30*(1000000/CFG_TS_TICK_VAL) /* 30 secondes */
#endif
/* Private macro -------------------------------------------------------------*/
#define MAX_APPLI_BUFF_SIZE 8
@@ -120,11 +118,6 @@ MOBLEUINT8 InputOobData[8] = {0};
MOBLEUINT8 inputOOBDataReady = 0;
#endif
-#ifdef ENABLE_PROVISIONER_FEATURE
-static MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE] = {0};
-static MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE] = {0};
-#endif
-MOBLEUINT16 nodeAddressOffset = 1;
/*Number Of Elements selected per Node. Maximum Elements supported = 3*/
MOBLEUINT8 NumberOfElements = APPLICATION_NUMBER_OF_ELEMENTS;
@@ -212,15 +205,10 @@ void Appli_OobAuthenticationProcess(void);
#endif
void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason);
void Appli_LowPowerProcess(void);
-#if (PROVISIONER_FEATURE == 1)
-MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey, MOBLEUINT8* appKey);
-#endif
#if (APPLI_OPTIM == 1)
static void AppliMeshTask(void);
#endif
-#if (PROVISIONER_FEATURE == 1)
-void Appli_SelfConfigurationProcess(void);
-#endif
+
/* Private functions ---------------------------------------------------------*/
/************************* Button Control functions ********************/
@@ -268,7 +256,7 @@ static void Appli_UpdateButtonState(int isPressed)
{
/* Button 1 short press action */
Appli_ShortButtonPress();
- }
+ }
}
/**
@@ -544,6 +532,8 @@ MOBLE_RESULT Appli_BleAttentionTimerCb(void)
#endif /* LOW_POWER_FEATURE == 0 */
return MOBLE_RESULT_SUCCESS;
}
+
+
/**
* @brief Call back function to give Output OOB information
* @param MOBLEUINT8* output_oob
@@ -563,6 +553,7 @@ void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size)
#endif
}
+
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
/**
* @brief Process for both output and Input OOB handling
@@ -587,12 +578,13 @@ void Appli_OobAuthenticationProcess(void)
}
}
#endif
+
+
/**
* @brief Call back function to provide Input OOB information
* @param MOBLEUINT8 size
* @retval MOBLEUINT8*
*/
-
MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
{
#if defined (ENABLE_AUTH_TYPE_INPUT_OOB) && (ENABLE_SERIAL_INTERFACE)
@@ -615,6 +607,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
return NULL;
#endif
}
+
+
/**
* @brief Call back function to provide Input OOB information
* @param rcvdStringBuff: buffer to store input string
@@ -631,10 +625,11 @@ void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize)
#endif
}
+
/**
-* @brief Enable Node as Sniffer to Capture all the packets
+* @brief Application BLE Disable Filter
* @param none
-* @retval Sending the value to BLE Mesh Library
+* @retval Status is replied
*/
MOBLEUINT8 Appli_BleDisableFilterCb(void)
{
@@ -674,6 +669,7 @@ void Appli_CheckForUnprovision(void)
MoblePalNvmErase(NVM_BASE, 0x1000);
MoblePalNvmErase(APP_NVM_BASE, 0);
MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -715,6 +711,28 @@ void Appli_CheckForUnprovision(void)
#endif
}
+void Appli_Unprovision(void)
+{
+ if(!ProxyFlag)
+ {
+ /* No GATT connection */
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+}
+
/**
* @brief Checks and updates Mac address to generate MAC Address
* @param void
@@ -851,168 +869,6 @@ void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason)
AppliNvm_ClearModelState();
}
-#if (PROVISIONER_FEATURE == 1)
-void SaveProvisionedNodeAddress(void)
-{
- nodeAddressOffset += 1; /* Increment the last known address by 1
- after success */
-
- Appli_ConfigClientStartNodeConfiguration(1);
-}
-
-MOBLEUINT8* GetNewProvNodeDevKey(void)
-{
- return &NewProvNodeDevKey[0];
-}
-
-MOBLEUINT8* GetNewProvNodeAppKey(void)
-{
- return &NewProvNodeAppKey[0];
-}
-
-/**
-* @brief Function to Get the Node Address for provisioning
-* @param void
-* @retval void
-*/
-MOBLE_ADDRESS GetAddressToConfigure(void)
-{
- return nodeAddressOffset; /* Take last address provisioned */
-}
-
-/**
-* @brief Function to Get the Node Address for provisioning
-* @param void
-* @retval void
-*/
-MOBLE_ADDRESS GetNewAddressToProvision(void)
-{
- return nodeAddressOffset+1; /* Take last address and increment by 1 before to
- give to provisioner FSM */
-}
-#endif
-
-/**
-* @brief callback for provision the node by provisioner.
-* @param void
-* @retval void
-*/
-void BLEMesh_ProvisionCallback(void)
-{
- ProvisionFlag = 1;
-#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
- PrvngInProcess = 0;
-#endif
- TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
-
-//#if (PROVISIONER_FEATURE == 1)
-// //nodeAddressOffset = nodeAddressOffset + 1;
-// SaveProvisionedNodeAddress();
-//#endif
-#if (LOW_POWER_FEATURE == 1)
- /* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
- HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
-#endif
-}
-
-#if (PROVISIONER_FEATURE == 1)
-/**
-* @brief callback for getting the Node Address by provisioner & giving device key.
-* @param void
-* @retval void
-*/
-MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey, MOBLEUINT8* appKey)
-{
- MOBLE_ADDRESS newNodeAddressToProvision;
- memcpy(NewProvNodeDevKey,devKey,sizeof(NewProvNodeDevKey));
- memcpy(NewProvNodeAppKey,appKey,sizeof(NewProvNodeAppKey));
-
- TRACE_M(TF_PROVISION,"Device Key: ");
- for (MOBLEUINT8 count=0 ; count<DEVICE_KEY_SIZE; count++)
- {
- TRACE_I(TF_PROVISION,"%.2x ", NewProvNodeDevKey[count]);
- }
-
- TRACE_M(TF_PROVISION,"\r\n");
- TRACE_M(TF_PROVISION,"App Key: ");
- for (MOBLEUINT8 count=0 ; count<DEVICE_KEY_SIZE; count++)
- {
- TRACE_I(TF_PROVISION,"%.2x ", NewProvNodeAppKey[count]);
- }
-
- TRACE_M(TF_PROVISION,"\r\n");
-
- AppliPrvnNvm_SaveData(NewProvNodeDevKey ,sizeof(NewProvNodeDevKey));
- newNodeAddressToProvision = GetNewAddressToProvision();
-
- TRACE_M(TF_PROVISION,"Node Address Assigning = %d \r\n",newNodeAddressToProvision);
-
- return newNodeAddressToProvision;
-}
-
-
-#define SELF_CONFIG_IDLE_STATE 0
-#define SELF_CONFIG_INIT_STATE 1
-#define SELF_CONFIG_START_STATE 2
-#define SELF_APPKEY_BIND_STATE 3
-#define SELF_SUBSCRIBE_DEFAULT_STATE 4
-#define SELF_PUBLISH_DEFAULT_STATE 5
-uint8_t self_config_state= SELF_CONFIG_IDLE_STATE;
-
-void Start_SelfConfiguration (void)
-{
- self_config_state = SELF_CONFIG_INIT_STATE;
-}
-
-/**
-* @brief callback for getting the Node Address by provisioner & giving device key.
-* @param void
-* @retval void
-*/
-void Appli_SelfConfigurationProcess(void)
-{
- /* Following functions help to Configure the Provisioner to default settings*/
-
- switch (self_config_state)
- {
- case SELF_CONFIG_IDLE_STATE:
- /* Nothing to do, just wait*/
- return;
-
- case SELF_CONFIG_INIT_STATE:
- /* This state is just to make a "NVM Process" to run once, because the
- function will exit after changing the state*/
- self_config_state = SELF_CONFIG_START_STATE;
- break;
-
- case SELF_CONFIG_START_STATE:
- ApplicationSetNodeSigModelList();
- self_config_state = SELF_APPKEY_BIND_STATE;
- break;
-
- case SELF_APPKEY_BIND_STATE:
- Appli_ConfigClient_SelfDefaultAppKeyBind();
- self_config_state = SELF_SUBSCRIBE_DEFAULT_STATE;
- break;
-
- case SELF_SUBSCRIBE_DEFAULT_STATE:
- AppliConfigClient_SelfSubscriptionSetDefault();
- self_config_state = SELF_PUBLISH_DEFAULT_STATE;
- break;
-
- case SELF_PUBLISH_DEFAULT_STATE:
- AppliConfigClient_SelfPublicationSetDefault();
- self_config_state = SELF_CONFIG_IDLE_STATE;
- break;
-
-
- default:
- break;
- }
-}
-#endif
-
-
/**
* @brief This function scans and prints unprovisioned devices
* @param unprovDeviceArray: Pointer of an array for filling unprovisioned device UUIDs
@@ -1067,9 +923,6 @@ void BLEMesh_PbAdvLinkOpenCb(void)
{
ProvisionFlag = 0;
TRACE_M(TF_PROVISION,"PB-ADV Link opened successfully \n\r");
-#ifdef ENABLE_PROVISIONER_FEATURE
- SerialPrvn_ProvisioningStatusUpdateCb(MOBLE_TRUE, 0);
-#endif
/* Turn ON Red LED*/
#if LOW_POWER_FEATURE
/* do nothing */
@@ -1078,6 +931,7 @@ void BLEMesh_PbAdvLinkOpenCb(void)
#endif
}
+
/**
* @brief Call back function called when PB-ADV link Closed
* @param none
@@ -1091,18 +945,30 @@ void BLEMesh_PbAdvLinkCloseCb(void)
/* do nothing */
#else
BSP_LED_Off(LED_RED);
-#ifdef ENABLE_PROVISIONER_FEATURE
- SerialPrvn_ProvisioningStatusUpdateCb(MOBLE_FALSE, nodeAddressOffset);
#endif
+}
+
+
+/**
+* @brief callback for provision the node by provisioner.
+* @param void
+* @retval void
+*/
+void BLEMesh_ProvisionCallback(void)
+{
+ ProvisionFlag = 1;
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 0;
#endif
- #if (PROVISIONER_FEATURE == 1)
- if (ProvisionFlag == 1)
- {
- SaveProvisionedNodeAddress();
- ProvisionFlag = 0;
- }
+ TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
+
+#if (LOW_POWER_FEATURE == 1)
+ /* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
+ HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
#endif
}
+
+
/**
* @brief callback for friendship established by friend node
* @param address of corresponding low power node
@@ -1471,6 +1337,7 @@ void Appli_IntensityControlPublishing(MOBLEUINT8* value)
}
}
+
/**
* @brief Publish the intensity value for generic level or light lightness
* This function should be called in main loop
@@ -1501,10 +1368,6 @@ void Appli_Process(void)
AppliNvm_Process();
#endif
-#if (SAVE_EMBD_PROVISION_DATA == 1)
- AppliPrvnNvm_Process();
-#endif
-
Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
@@ -1515,10 +1378,16 @@ void Appli_Process(void)
}
#endif
-#if PROVISIONER_FEATURE
- Appli_ConfigClient_Process();
- Appli_SelfConfigurationProcess();
-#endif
+#ifdef TPT_LAYER_BUSY_TEST
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ //SdkEvalLedOn(LED1);
+ }
+ else
+ {
+ //SdkEvalLedOff(LED1);
+ }
+#endif
}
#if PB_ADV_SUPPORTED
@@ -1611,11 +1480,6 @@ void Appli_Init(MOBLEUINT8 *flag)
AppliNvm_FactorySettingReset();
#endif
-#ifdef ENABLE_PROVISIONER_FEATURE
- /* Hardware Factory Provisioner data Restore implementation */
- AppliPrvnNvm_FactorySettingReset(flag);
-#endif
-
#if PB_ADV_SUPPORTED
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_BEACON_REQ_ID, UTIL_SEQ_RFU, UnprovisionedDeviceBeaconApp );
/**
@@ -1634,7 +1498,7 @@ void Appli_Init(MOBLEUINT8 *flag)
GPIO_InitNVICPowerOff();
#endif
-#if ( CFG_LPM_SUPPORTED == 0)
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h
index f4858e296..ad831f2cd 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_mesh.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h
@@ -24,6 +24,7 @@
/* Includes ------------------------------------------------------------------*/
#include "types.h"
#include "mesh_cfg_usr.h"
+#include "mesh_cfg.h"
/* Exported macro ------------------------------------------------------------*/
/* MACROS for Power Level definitions */
@@ -46,18 +47,40 @@
#define TX_POWER_LEVEL_PLUS_8DBM 7 /* = 8 dBm */
#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
-#define POWEROFF_PIN GPIO_PIN_4
+#define POWEROFF_PIN GPIO_PIN_12
#define POWEROFF_GPIO_PORT GPIOB
#define POWEROFF_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define POWEROFF_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
-#define POWEROFF_EXTI_LINE GPIO_PIN_4
-#define POWEROFF_EXTI_IRQn EXTI2_IRQn
+#define POWEROFF_EXTI_LINE GPIO_PIN_12
+#define POWEROFF_EXTI_IRQn EXTI15_10_IRQn
#endif
+typedef enum _prvn_nvm_state
+{
+ NVM_INIT = 0,
+ NVM_SAVE_PENDING,
+} prvn_nvm_state;
+
/* Exported variables ------------------------------------------------------- */
extern MOBLEUINT8 bdaddr[];
+typedef struct
+{
+ MOBLEUINT16 nodeAddress;
+ MOBLEUINT8 numOfElements;
+ MOBLEUINT8 Reserved1; /* For Alignment by 4*/
+ MOBLEUINT16 newNodeAddress;
+ MOBLEUINT8 newNodeElements;
+ prvn_nvm_state saveToNVM;
+ MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeUUID[UUID_SIZE];
+} NodeUnderProvisionParam_t;
+
+extern NodeUnderProvisionParam_t NodeUnderProvisionParam;
+extern MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+extern MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
/* Exported Functions Prototypes ---------------------------------------------*/
MOBLE_RESULT Appli_BleStackInitCb(void);
MOBLE_RESULT Appli_BleSetTxPowerCb(void);
@@ -80,6 +103,7 @@ MOBLE_RESULT Appli_LedBlink(void);
MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl);
void Appli_CheckForUnprovision(void);
+void Appli_Unprovision(void);
void Appli_Process(void);
void Appli_LedCtrl(void);
void Appli_Init(MOBLEUINT8 *flag);
@@ -93,6 +117,8 @@ void IntensityPublish(void);
MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
void Start_SelfConfiguration (void);
+void Appli_ProvisionerInit(void);
+
#endif /* __APPLI_MESH_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c
new file mode 100644
index 000000000..788180389
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c
@@ -0,0 +1,621 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.c
+ * @author BLE Mesh Team
+ * @brief User Application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include <string.h>
+#include "hal_common.h"
+#include "ble_mesh.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "mesh_cfg.h"
+#include "pal_nvm.h"
+#include "appli_mesh.h"
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+#include "common.h"
+#endif
+#if (LOW_POWER_FEATURE == 1)
+#include "app_conf.h"
+#include "stm32_seq.h"
+#endif
+#include "config_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+/* Private define ------------------------------------------------------------*/
+
+extern const MOBLEUINT8* _bdaddr[];
+
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+extern MOBLEUINT8 PowerOnOff_flag;
+#endif
+
+extern const void* appNvmBase;
+
+
+/*
+* Page of size 4k, STM32WB, reserved for application is divided into 16 subpages of each 256 bytes
+* First subpage is reserved (for e.g. External MAC is present in this area)
+* Rest 15 subpages are used on rolling basis for application states.
+* First byte of each subpage indicates if page is valid or not
+*/
+
+#define APP_NVM_RESERVED_SIZE 256U
+#define APP_NVM_SUBPAGE_SIZE 256U
+#define APP_NVM_MAX_SUBPAGE 15U
+#define APP_NVM_SUBPAGE_OFFSET(i) (unsigned int)(APP_NVM_SUBPAGE_SIZE + APP_NVM_SUBPAGE_SIZE*(i))
+
+/* offsets defined wrt start of subpage */
+#define APP_NVM_VALID_FLAG_OFFSET 0U
+#define APP_NVM_VALID_FLAG_SIZE 4U
+#define APP_NVM_RESET_COUNT_OFFSET (unsigned int)APP_NVM_VALID_FLAG_SIZE
+#define APP_NVM_RESET_COUNT_SIZE 12U /* 12 bytes reserved for write cycle optimization */
+#define APP_NVM_GENERIC_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE)
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE+APP_NVM_GENERIC_MODEL_SIZE)
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+
+#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+
+/* Private variables ---------------------------------------------------------*/
+
+typedef struct
+{
+ MOBLEUINT8 modelData[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE];
+ MOBLEBOOL erasePageReq;
+ MOBLEBOOL writeReq;
+} APPLI_NVM_REQS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+
+MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+
+#if 0
+/**
+* @brief This function erases a specified flash page
+* @param Page Number
+* @retval MOBLE_RESULT_INVALIDARG if PageNumber overflow
+* MOBLE_RESULT_FALSE if flash operation is very close to next radio event
+* MOBLE_RESULT_FAIL if flash command error is set
+* MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
+{
+ MOBLE_RESULT result;
+
+ if (PageNumber < N_PAGES)
+ {
+ BLEMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ result = MoblePalNvmErase(APP_NVM_BASE, 0);
+ ATOMIC_SECTION_END();
+ }
+ else /* Invalid page no */
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+
+ return result;
+}
+#endif
+
+/**
+* @brief Program word (32-bit) at a APP_NVM_BASE + APP_NVM_RESERVED_SIZE
+* @param TypeProgram Indicate the way to program at a specified address
+* @param Address: address to write
+* @param Data: word to write
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (offset > PAGE_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > (APP_NVM_BASE + PAGE_SIZE))
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ result = MoblePalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Mark first valid subpage as invalid.
+* @param void
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
+{
+ MOBLEUINT32 valid = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEINT16 currSubPageIdx;
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+
+ /* find valid subpage */
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+
+ if (result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ }
+ else
+ {
+ /* mark valid subpage as invalid */
+ memcpy((void*)subPageTemp,
+ (void*)(PRVN_NVM_BASE_OFFSET + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else if (result == MOBLE_RESULT_FALSE)
+ {
+ /* radio busy, try again later */
+ }
+ else
+ {
+ /* do nothing */
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief This function writes Reset count value in flash at APP_NVM_BASE + APP_NVM_RESERVED_SIZE
+* if device has been turned ON 5 times consecutively with each ON duration < 2s, reset to factory settings
+* LED blinks 2 times to indicate device startup without reset
+* LED blinks 5 times to indicate reset at device startup
+* @param void
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FactorySettingReset(void)
+{
+ MOBLEINT16 currSubPageIdx = 0;
+ MOBLE_RESULT result;
+ MOBLEUINT32 resetCount;
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ if(currSubPageIdx > 0)
+ {
+ /* Not the first reset */
+ /* read the previous subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ {
+ /* read the current subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+
+ /* read reset count from the subpage */
+ memcpy((void*)&resetCount,
+ (void*)&(subPageTemp[APP_NVM_RESET_COUNT_OFFSET]),
+ 4);
+ resetCount = resetCount << 1; /* Shifting for making Bits 0 from LSB */
+ memcpy((void*)&(subPageTemp[APP_NVM_RESET_COUNT_OFFSET]), (void*)&resetCount, 4);
+
+ /* Check for "POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING" times, that many bits shall be zero */
+ if (resetCount > MASK_BITS_FOR_POWER_ON_OFF_CYCLES)
+ {
+ /* MASK_BITS_FOR_POWER_ON_OFF_CYCLES = 0xFFFFFFE0 */
+
+ /* update reset count */
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+
+ if (!memcmp((void*)&subPageTemp[APP_NVM_RESET_COUNT_OFFSET],
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_RESET_COUNT_OFFSET),
+ 4))
+ {
+ /* updated value of reset count in flash */
+ }
+
+ /* Blink twice to indicate device startup
+ 1 second to blink once and 2 seconds to blink twice */
+ for (MOBLEUINT8 i=0; i< ON_TIME_IN_SECONDS_FOR_POWER_CYCLING; i++)
+ {
+ Appli_LedBlink();
+ }
+
+ /* Load model data copy from nvm */
+ memcpy((void*)AppliNvm_Reqs.modelData,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else /* Device is forced to factory reset, 5 LSBs are zero */
+ {
+ /* Unprovision node */
+ BLEMesh_Unprovision();
+
+ /* Clear lib data, primary and backup nvm used by BLE-Mesh lib */
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+
+ AppliNvm_ClearModelState();
+
+ BLEMesh_SetUnprovisionedDevBeaconInterval(100);
+
+ /* Blink 5 times to indicate factory setting reset */
+ for (MOBLEUINT8 i=0; i<BLINK_TIMES_FOR_FACTORY_RESET; i++)
+ {
+ Appli_LedBlink();
+ }
+
+ TRACE_M(TF_MISC, "Reset to factory settings \r\n");
+ }
+
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Save model states in nvm
+* @param model state buff
+* @param model state buff size
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL; /* if save model state not defined, return MOBLE_RESULT_FAIL */
+
+#if (SAVE_MODEL_STATE_NVM == 1)
+
+ if (size > APP_NVM_MODEL_SIZE)
+ {
+ /* incorrect size */
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ memcpy(AppliNvm_Reqs.modelData, state, size);
+
+ AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ }
+#endif /* SAVE_MODEL_STATE_NVM */
+ return result;
+}
+
+
+/**
+* @brief Clear model states in nvm
+* @param none
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_ClearModelState(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL; /* if save model state not defined, return MOBLE_RESULT_FAIL */
+
+#if (SAVE_MODEL_STATE_NVM == 1)
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+ MOBLEINT16 subPageIdx;
+ MOBLEUINT8 clearBuff[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE] = {0};
+ MOBLEUINT32 valid = 0;
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ if(subPageIdx > 1)
+ { /* Not the first subpage */
+ /* clear models states */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ memcpy((void*)&subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET],
+ (void*)(clearBuff),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ { /* First subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ memcpy((void*)&subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET],
+ (void*)(clearBuff),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ }
+#endif /* SAVE_MODEL_STATE_NVM */
+ return result;
+}
+
+
+/**
+* @brief Load Model states from nvm
+* @param model state buff
+* @param model state buff size
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+{
+#if (SAVE_MODEL_STATE_NVM == 1)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
+
+ return result;
+#else /* SAVE_MODEL_STATE_NVM */
+ *size = 0;
+ return MOBLE_RESULT_SUCCESS;
+#endif /* SAVE_MODEL_STATE_NVM */
+}
+
+
+/**
+* @brief Process NVM erase and write requests
+* @param void
+* @retval void
+*/
+void AppliNvm_Process(void)
+{
+ MOBLE_RESULT result;
+ MOBLEINT16 subPageIdx;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+
+ /* Erase if required */
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ {
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
+
+ result = MoblePalNvmErase(APP_NVM_BASE, 0);
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ }
+ else
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
+ AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ /* restore reserve area */
+/* FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy); */
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ }
+ }
+ }
+
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
+ && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ {
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+ MOBLEUINT32 valid = 0;
+
+ if(subPageIdx > 0)
+ {
+ /* Not the first reset */
+ /* read the previous subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ {
+ /* read the current subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+
+ memcpy((void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
+ (void*)&(AppliNvm_Reqs.modelData),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint8_t*)subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ }
+ }
+ }
+}
+
+
+/**
+* @brief Fuction used to set the flag which is responsible for storing the
+ states in flash.
+* @param void
+* @retval void
+*/
+void AppliNvm_SaveMessageParam (void)
+{
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+ PowerOnOff_flag = FLAG_SET;
+#endif
+}
+
+
+/**
+* @brief Find first valid subpage available.
+* If no valid subpage found, erase page appli nvm to reset it
+* @param pointer to variable to update first valid subpage index
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset)
+{
+ MOBLEUINT32 valid[2];
+ MOBLEINT8 subPageIdx = -1;
+ MOBLEUINT32 *subPageOffset;
+ MOBLEUINT32 addressValidPage;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (MOBLEUINT16 count=0; count<totalSubPage; count++)
+ {
+ addressValidPage = nvmBaseOffset + SubPageSize*count;
+ subPageOffset = &addressValidPage;
+
+ /* Read 8 bytes and check if it's Empty */
+ memcpy((void*)&valid, (void*)(*subPageOffset), 8);
+
+ if ((valid[0] == FLASH_EMPTY_SIGNATURE) /*&& (valid[1] == FLASH_EMPTY_SIGNATURE)*/)
+ {
+ subPageIdx = count;
+ break;
+ }
+ }
+
+ if (subPageIdx < 0)
+ {
+ TRACE_M(TF_PROVISION,"Out of Memory, Flash page is full \r\n");
+ result = MOBLE_RESULT_OUTOFMEMORY;
+ }
+ else
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ *subPageIndex = subPageIdx;
+
+ return result;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h
new file mode 100644
index 000000000..34667f26c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h
@@ -0,0 +1,92 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.h
+ * @author BLE Mesh Team
+ * @brief Header file for the NVM application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_NVM_H
+#define __APPLI_NVM_H
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+extern const void *prvsnr_data;
+
+/* offset defined for the embedded provisioner node */
+#define PRVN_NVM_PAGE_SIZE 4096U
+#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
+#define PRVN_NVM_CHUNK_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_SUBPAGE_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_CHUNK_SIZE)
+#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
+
+#define APP_NVM_BASE ((unsigned int)appNvmBase)
+#define APP_NVM_SIZE 4096U
+
+/* Exported variables ------------------------------------------------------- */
+typedef struct
+{
+ MOBLEUINT8 devKey[4+DEVICE_KEY_SIZE];
+
+#if ENABLE_SAVE_UUID_PER_NODE
+ MOBLEUINT8 node_UUID[UUID_SIZE];
+#endif
+
+} NvmPerNode_t;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FactorySettingReset(void);
+//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
+MOBLE_RESULT AppliNvm_ClearModelState(void);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+void AppliNvm_Process(void);
+void AppliNvm_SaveMessageParam (void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
+
+MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data,
+ MOBLE_ADDRESS address,
+ uint8_t* pUUID,
+ uint8_t numElements);
+
+MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
+void AppliPrvnNvm_Process(void);
+
+MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
+
+MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
+
+void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
+ MOBLE_ADDRESS address,
+ MOBLEUINT8 *prvnFlag,
+ MOBLEUINT8 numOfElements);
+
+void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+
+
+#endif /* __APPLI_NVM_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c
index 77074438c..7ae8b7d10 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c
@@ -360,7 +360,7 @@ void Sensor_LC_Light_Publish(void)
srcAdd = BLEMesh_GetAddress();
- result = BLEMesh_SetRemotePublication(LIGHT_MODEL_SERVER_LC_MODEL_ID, srcAdd ,
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
SENSOR_STATUS ,
sensor_Data,3,
MOBLE_FALSE, MOBLE_FALSE);
@@ -597,7 +597,7 @@ MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table
for(int i=0;i<NUMBER_OF_SENSOR;i++)
{
- if(prop_ID_Table[i].Property_ID != prop_ID)
+ if(prop_ID_Table[i].Property_ID == prop_ID)
{
status = MOBLE_RESULT_SUCCESS;
break;
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h
index d608f35e6..d608f35e6 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_sensor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c
index 405be02c8..405be02c8 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h
index 2b9390099..2b9390099 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_vendor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h
index 4cc3ce72b..4cc3ce72b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h
index 35a4d96ab..35a4d96ab 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/ble_dbg_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/cube_hal.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h
index 3afc2e373..3afc2e373 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/cube_hal.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/data.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s
index 636eb47c6..636eb47c6 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/data.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h
index 730c40219..730c40219 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/hal_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h
new file mode 100644
index 000000000..dd7ae8207
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h
@@ -0,0 +1,257 @@
+/**
+ ******************************************************************************
+ * @file mesh_cfg.h
+ * @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_H
+#define __MESH_CFG_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "mesh_cfg_usr.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* Flash parameters */
+#define PAGE_SIZE 4096
+#define RESET_MANAGER_FLASH_BASE_ADDRESS (0x10040000)
+
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#define UUID_SIZE 16U
+
+#define NO_MODEL_AVLBL 0xFFFF
+
+void TraceHeader(const char* func_name, int mode);
+#define TraceB0(func_name, ...)
+#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
+#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
+#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
+
+/*Enable this Macro to enable the main function prints.
+* This trace does not print the function name and clock.
+*/
+#define TraceC0(...)
+#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
+//#define TraceCX(flags, ...) TraceC ##flags( ##__VA_ARGS__)
+#define TraceCX(flags, ...) TraceC ##flags( __VA_ARGS__)
+#define TRACE_I(flag, ...) TraceCX(flag, ##__VA_ARGS__)
+
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ #define EXTERNAL_MAC_TYPE (uint8_t)(EXTERNAL_MAC_IS_PUBLIC_ADDR<<7)
+#else
+ #define EXTERNAL_MAC_TYPE (uint8_t)0
+#endif
+
+#if (!(GENERATE_STATIC_RANDOM_MAC)) && (!(EXTERNAL_MAC_ADDR_MGMT)) && (!(INTERNAL_UNIQUE_NUMBER_MAC))
+#error "Please select atleast one MAC address Option"
+#endif
+
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+#define ENABLE_SAVE_MODEL_STATE_NVM
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+#define SAVE_MODEL_STATE_NVM 1
+#else
+#define SAVE_MODEL_STATE_NVM 0
+#endif
+
+#define TRANSMIT_RECEIVE_PARAMS \
+{ \
+ TR_GAP_BETWEEN_TRANSMISSION \
+}
+
+#ifdef ENABLE_PB_ADV
+#define PB_ADV_SUPPORTED 1
+#else
+#define PB_ADV_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PB_GATT
+#define PB_GATT_SUPPORTED 1
+#else
+#define PB_GATT_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PUB_KEY_TYPE_OOB
+#define PUB_KEY_TYPE_OOB MOBLE_TRUE
+#else
+#define PUB_KEY_TYPE_OOB MOBLE_FALSE
+#endif
+
+
+#if (PB_ADV_SUPPORTED == 0 && PB_GATT_SUPPORTED == 0)
+#error "Atleast one of PB-ADV and PB-GATT should be defined"
+#endif
+
+#define BLUENRG_MESH_PRVN_BEARER_INFO (PB_ADV_SUPPORTED << 0 | PB_GATT_SUPPORTED << 1)
+
+#ifdef ENABLE_RELAY_FEATURE
+#define RELAY_FEATURE 1
+#else
+#define RELAY_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROXY_FEATURE
+#define PROXY_FEATURE 1
+#else
+#define PROXY_FEATURE 0
+#endif
+
+#ifdef ENABLE_FRIEND_FEATURE
+#define FRIEND_FEATURE 1
+#else
+#define FRIEND_FEATURE 0
+#endif
+
+#ifdef ENABLE_LOW_POWER_FEATURE
+#define LOW_POWER_FEATURE 1
+#else
+#define LOW_POWER_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROVISIONER_FEATURE
+#define PROVISIONER_FEATURE 1
+#else
+#define PROVISIONER_FEATURE 0
+#endif
+
+#if (LOW_POWER_FEATURE && RELAY_FEATURE)
+#error "Low power node can't be relay node"
+#elif (LOW_POWER_FEATURE && PROXY_FEATURE)
+#error "Low power node can't be proxy node"
+#elif (LOW_POWER_FEATURE && FRIEND_FEATURE)
+#error "Low power node can't be friend node"
+#endif
+
+#define BLUENRG_MESH_FEATURES (RELAY_FEATURE << 0 | PROXY_FEATURE << 1 | FRIEND_FEATURE << 2 | LOW_POWER_FEATURE << 3)
+
+#define FRIEND_NODE_PARAMS \
+{ \
+ FN_NO_OF_LPNS \
+}
+
+#define LOW_POWER_NODE_PARAMS \
+{ \
+ LPN_RSSI_FACTOR_LEVEL, \
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL, \
+ LPN_MINIMUM_QUEUE_SIZE_LOG, \
+ LPN_RECEIVE_DELAY, \
+ LPN_POLL_TIMEOUT, \
+ LPN_FRIEND_REQUEST_FREQUENCY, \
+ LPN_FRIEND_POLL_FREQUENCY, \
+ LPN_RECEIVE_WINDOW_SIZE, \
+ LPN_SUBSCR_LIST_SIZE, \
+ LPN_MINIMUM_RSSI, \
+ LPN_NO_OF_RETRIES \
+}
+
+#define UNPROV_NODE_INFO_PARAMS \
+{ \
+ PUB_KEY_TYPE_OOB, \
+ PubKeyBuff, \
+ PrivKeyBuff, \
+ STATIC_OOB_SIZE, \
+ StaticOobBuff, \
+ OUTPUT_OOB_SIZE, \
+ OUTPUT_OOB_ACTION, \
+ Appli_BleOutputOOBAuthCb, \
+ INPUT_OOB_SIZE, \
+ INPUT_OOB_ACTION, \
+ Appli_BleInputOOBAuthCb \
+}
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+#define NEIGHBOR_TABLE_SUPPORTED 1
+#else
+#define NEIGHBOR_TABLE_SUPPORTED 0
+#endif
+
+#if (NEIGHBOR_TABLE_SUPPORTED == 1)
+#if (NEIGHBOR_COUNT == 0)
+#error "Number of neighbors should be nonzero"
+#endif /* NO_OF_NEIGHBORS */
+#if (NEIGHBOR_ALIVE_TIME == 0)
+#error "Number of neighbor alive time should be nonzero"
+#endif /* NEIGHBOR_ALIVE_TIME */
+#if ((NEIGHBOR_UNPRVND_DEV_BEACON_NTU == 0) && (NEIGHBOR_MSG_TTLX_NTU == 0) && (NEIGHBOR_SECURE_NET_BEACON_NTU == 0))
+#error "Atleast one of Network Table Update trigger should be enabled"
+#endif
+#if (NEIGHBOR_UNPRVND_DEV_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_UNPRVND_DEV_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_UNPRVND_DEV_BEACON_NTU */
+#if (NEIGHBOR_SECURE_NET_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_SECURE_NET_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_SECURE_NET_BEACON_NTU */
+#if (NEIGHBOR_MSG_TTLX_NTU > 2)
+#error "Invalid valid of NEIGHBOR_MSG_TTLX_NTU. Allowed value: 0, 1 and 2"
+#endif /* NEIGHBOR_MSG_TTLX_NTU */
+#endif /* NEIGHBOR_TABLE_SUPPORTED */
+
+#define NEIGHBOR_TABLE_PARAMS \
+{ \
+ NEIGHBOR_COUNT, \
+ NEIGHBOR_ALIVE_TIME, \
+ NEIGHBOR_UNPRVND_DEV_BEACON_NTU, \
+ NEIGHBOR_SECURE_NET_BEACON_NTU, \
+ NEIGHBOR_MSG_TTLX_NTU \
+}
+
+#if FRIEND_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE FN_NO_OF_LPNS*816+4
+#elif LOW_POWER_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 112U
+#else
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 4U
+#endif
+
+#define DYNAMIC_MEMORY_SIZE 4096U
+
+#define SEGMENTATION_COUNT (MAX_APPLICATION_PACKET_SIZE / 12) + 2
+#define SAR_BUFFER_SIZE ((uint8_t)SEGMENTATION_COUNT) * 40
+/* Added Interrupt handler for Uart */
+#define SdkEvalComIOUartIrqHandler UART_Handler
+
+#if NEIGHBOR_TABLE_SUPPORTED
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 32U*NEIGHBOR_COUNT
+#else
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 0
+#endif
+
+#define SdkEvalComIOUartIrqHandler UART_Handler /* Added Interrupt handler for Uart */
+/******************** Serial Interface Handling Control **********************/
+
+/* Exported variables ------------------------------------------------------- */
+
+extern const DynBufferParam_t DynBufferParam;
+extern const tr_params_t TrParams;
+extern const lpn_params_t LpnParams;
+extern const fn_params_t FnParams;
+extern const prvn_params_t PrvnParams;
+extern const neighbor_table_init_params_t NeighborTableParams;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLEUINT8 ApplicationSetNodeSigModelList(void);
+MOBLE_RESULT ApplicationInitSigModelList(void);
+MOBLE_RESULT ApplicationInitVendorModelList(void);
+
+#endif /* __MESH_CFG_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h
new file mode 100644
index 000000000..23bde6283
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h
@@ -0,0 +1,646 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file mesh_cfg_usr.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_USR_H
+#define __MESH_CFG_USR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+/*
+* Different features supported by BLE-Mesh. Uncomment according to application.
+* Low power feature enabled node do not support other features.
+* Do not define any other feature if Low Power feature is defined
+*/
+#define ENABLE_RELAY_FEATURE
+#define ENABLE_PROXY_FEATURE
+#define ENABLE_FRIEND_FEATURE
+//#define ENABLE_LOW_POWER_FEATURE
+
+/* Macros Used for user defined serial print data for models.
+Either use 0 to disable or 1 to enable
+@ TF_GENERIC is responsible for the Generic model traces.
+@ TF_LIGHT is responsible for the Light model traces.
+@ TF_SENSOR is responsible for the Sensor model traces.
+@ TF_VENDOR is responsible for the vendor model traces.
+@ TF_NEIGHBOUR is responsible for the neighbour function traces.
+@ TF_PROVISION is responsible for the Provision related function traces.
+@ TF_LPN_FRND is responsible for the Low power nodef function traces.
+@ TF_ELEMENTS is responsible for the element selection function traces.
+@ TF_ADDRESS is responsible for the address of element traces.
+@ TF_HANDLER is responsible for the interrupt file traces.
+@ TF_INIT is responsible for the main function traces.
+@ TF_MISC is responsible for the other type traces.
+
+*/
+#ifndef ENABLE_LOW_POWER_FEATURE
+#define TF_GENERIC 1
+#define TF_LIGHT 1
+#define TF_LIGHT_LC 1
+#define TF_SENSOR 1
+#define TF_VENDOR 1
+#define TF_COMMON 1
+#define TF_VENDOR_COMMAND 1
+#define TF_NEIGHBOUR 0
+#define TF_LPN_FRND 1
+#define TF_ELEMENTS 0
+#define TF_ADDRESS 0
+#define TF_PROVISION 1
+#define TF_HANDLER 0
+#define TF_INIT 1
+#define TF_MISC 1
+#define TF_MEMORY 0
+#define TF_SERIAL_CTRL 1
+#define TF_BEACON 0
+#define TF_GENERIC_CLIENT 1
+#define TF_LIGHT_CLIENT 1
+#define TF_CONFIG_CLIENT 1
+#define TF_LIGHT_CLIENT 1
+#else
+#define TF_GENERIC 0
+#define TF_LIGHT 0
+#define TF_LIGHT_LC 0
+#define TF_SENSOR 0
+#define TF_VENDOR 0
+#define TF_COMMON 0
+#define TF_VENDOR_COMMAND 0
+#define TF_NEIGHBOUR 0
+#define TF_LPN_FRND 0
+#define TF_ELEMENTS 0
+#define TF_ADDRESS 0
+#define TF_PROVISION 0
+#define TF_HANDLER 0
+#define TF_INIT 0
+#define TF_MISC 0
+#define TF_MEMORY 0
+#define TF_SERIAL_CTRL 0
+#define TF_BEACON 0
+#define TF_GENERIC_CLIENT 0
+#define TF_LIGHT_CLIENT 0
+#define TF_CONFIG_CLIENT 0
+#define TF_LIGHT_CLIENT 0
+#endif
+
+/*******************************************************************************
+*** Following section helps to select right configuration of Models ***********
+*******************************************************************************/
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the */
+/* Server Generic Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+#define ENABLE_GENERIC_MODEL_SERVER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+
+/* The Following Models are not available in this version, will be developed in
+ next version.
+*/
+/*
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_BATTERY
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY
+
+*/
+
+/******************************************************************************/
+/******* Define the following Macros to enable the usage of the Light Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+
+/*
+ The following Models are managed in different file light_lc.c in middleware
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_LC
+//#define ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the Sensor Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_SENSOR_MODEL_SERVER
+//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the time and */
+/* scene Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_TIME_MODEL_SERVER
+//#define ENABLE_TIME_MODEL_SERVER_SETUP
+//#define ENABLE_SCENE_MODEL_SERVER
+//#define ENABLE_SCENE_MODEL_SERVER_SETUP
+
+/*
+ The Following Models are not available in this version
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
+
+/******* Define the following Macros to enable the vendor model ******/
+//#define ENABLE_VENDOR_MODEL_SERVER
+#define GENERIC_SERVER_MODEL_PUBLISH
+
+/******************************************************************************/
+/*
+Define the Macros for Enabling/disabling the binding of data between the Generic
+and Light model.
+@ define the Macro for enabling the binding
+@ Undefine or comment the macro for disabling the binding.
+*/
+/******************************************************************************/
+#define ENABLE_MODEL_BINDING
+
+/* Define the macros for the numbers of sensor present.*/
+#define NUMBER_OF_SENSOR 2
+//#define ENABLE_OCCUPANCY_SENSOR
+/*
+Macro is responsible for enabling and desabling the sensor publication.
+Comment this macro to disable the publication
+*/
+//#define ENABLE_SENSOR_PUBLICATION
+
+/******************************************************************************/
+
+
+/* Maximum Time period value of PWM */
+#define PWM_TIME_PERIOD 31990U
+
+/******************************************************************************/
+/***** MACROS for POWER ON-OFF CYCLE BASED UNPROVISIONING *********************/
+/******************************************************************************/
+
+/*
+Define the following Macro to check the Power-OnOff Cycles
+5 Continous cycles of OnOff with Ontime <2 sec will cause unprovisioning
+*/
+//#define ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+
+#define POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING 5
+#define MASK_BITS_FOR_POWER_ON_OFF_CYCLES (0xFFFFFFFF << POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING)
+ /* 0xFFFFFFE0 */
+#define ON_TIME_IN_SECONDS_FOR_POWER_CYCLING 2
+#define BLINK_TIMES_FOR_FACTORY_RESET 5
+
+/*
+Define the following Macro to save Generic and Light Model states in NVM
+This may result into excessive flash erase operations,
+this should be avoided to ensure flash longevity
+*/
+#define ENABLE_SAVE_MODEL_STATE_NVM
+
+/* Only one Macro will be enable at one time */
+//#define SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+//#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+
+/* Macros defined for the number of bytes saved,
+ number of bytes dedicated for generic model and light model.
+*/
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+#define APP_NVM_MODEL_SIZE 40U
+
+/*Macros are defined for the selection of the number of led and type of lighting
+ used for the application.
+*if board has one led, uncomment USER_BOARD_1LED
+*if board has cool warm leds, uncomment USER_BOARD_COOL_WHITE_LED
+*if board has RGB leds, uncomment USER_BOARD_RGB_LED
+*if board has RGB leds as well as cool warm leds,
+ uncomment USER_BOARD_COOL_WHITE_LED and USER_BOARD_RGB_LED
+*/
+/* comment ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME when using
+ USER_BOARD_COOL_WHITE_LED ,USER_BOARD_RGB_LED
+ Default transition is provided only for one led.
+*/
+#define USER_BOARD_1LED
+//#define USER_BOARD_COOL_WHITE_LED
+//#define USER_BOARD_RGB_LED
+
+/* Pulse Width Modulation support for external LED control */
+#define ENABLE_PWM_SUPPORT 0
+
+/* Note: Please use Full Library configuration in project options to use the full
+ configuration of the C/C++ runtime library
+ for printf and scanf functionality */
+
+/* Enables the serial interface using Uart */
+#define ENABLE_SERIAL_INTERFACE 1
+#define ENABLE_UT 1
+#define ENABLE_SERIAL_CONTROL 1
+#define ENABLE_APPLI_TEST 0
+
+/*******************************************************************************
+*** Following section helps to configure the Application of Mesh ***********
+*******************************************************************************/
+
+#define APPLICATION_NUMBER_OF_ELEMENTS 1
+#define APPLICATION_SIG_MODELS_MAX_COUNT 20
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT 2
+
+
+/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
+(the list is available
+@ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers)
+For STMicroelectronics : it is 0x0030 */
+#define COMPANY_ID 0x0030
+
+/* Contains a 16-bit vendor-assigned product identifier */
+#define PRODUCT_ID 0x0002
+
+/* Contains a 16-bit vendor-assigned product version ID */
+#define PRODUCT_VERSION_ID 0x010A
+
+#define MAX_APPLICATION_PACKET_SIZE 160
+
+#define TPT_SEGMENT_COUNT (((MAX_APPLICATION_PACKET_SIZE)/12)+2)
+
+/*******************************************************************************
+********** MAC Address Configuration *******************************************
+*******************************************************************************/
+
+/*
+* Define to enable external MAC handling,
+* DONT change the Values 0x01, 0x02, 0x03
+* SELECT ONLY One of the Option
+*/
+//#define GENERATE_STATIC_RANDOM_MAC 0x01
+//#define EXTERNAL_MAC_ADDR_MGMT 0x02
+#define INTERNAL_UNIQUE_NUMBER_MAC 0x03
+
+/* Declare this value as 0x01 if the External Address is PUBLIC Address */
+/* For example like this: #define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x1 */
+/* Else, by default, the external address will be treated as RANDOM */
+#define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x0
+
+/******************************************************************************/
+
+
+/*******************************************************************************
+****** Following section helps to select right configuration of node ***********
+*******************************************************************************/
+/*
+* Minimum gap between successive transmissions
+* varies from 10 to 65535
+*/
+#define TR_GAP_BETWEEN_TRANSMISSION 50U
+
+
+/*
+* Different provision bearer supported by BLE-Mesh.
+* Define according to application.
+* Atleast one of PB-ADV and PB-GATT should be defined
+*/
+#define ENABLE_PB_ADV
+#define ENABLE_PB_GATT
+//#define ENABLE_PUB_KEY_TYPE_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+#define STATIC_OOB_SIZE 16U
+#else
+#define STATIC_OOB_SIZE 0U
+#endif
+/* Output OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#else
+#define OUTPUT_OOB_SIZE 0U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#endif
+
+/* Input OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#else
+#define INPUT_OOB_SIZE 0U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#endif
+
+
+/*
+* Friend node receive window size is 50 ms
+*/
+
+/*
+* Friend node subscription list size is 4
+*/
+
+/*
+* Friend node message queue is 16
+*/
+
+/*
+* Number of Low power nodes that can be associated with Friend node
+* varies from 1 to 10
+*/
+#define FN_NO_OF_LPNS 6U
+
+/*
+* For prioritizing friendship offer with good RSSI link
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RSSI_FACTOR_LEVEL 1U
+
+/*
+* For prioritizing friendship offer with good receive window factor
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RECIVE_WINDOW_FACTOR_LEVEL 1U
+
+/*
+* Minimum packets queue size required by Low Power node
+* varies from 1 to 7
+* Ref @Mesh_v1.0
+* 1 -> 2
+* 2 -> 4
+* 3 -> 8
+* 4 -> 16
+* 5 -> 32
+* 6 -> 64
+* 7 -> 128
+*/
+#define LPN_MINIMUM_QUEUE_SIZE_LOG 2U
+
+/*
+* (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_DELAY 150U
+
+/*
+* Poll timeout value after which friendship cease to exist (unit 100ms)
+* varies from 0x00000A to 0x34BBFF
+* Ref @Mesh_v1.0
+* 0x00000A -> 1 second
+* 0x34BBFF -> 96 hours
+*/
+#define LPN_POLL_TIMEOUT 2000U
+
+/*
+* Maximum receive window size acceptable to low power node (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_WINDOW_SIZE 255U/*55U*/
+
+/*
+* Minimum friend's subscription list size capability required by lpn
+* varies from 1 to 5
+* Ref @Mesh_v1.0
+*/
+#define LPN_SUBSCR_LIST_SIZE 2U
+
+/*
+* Frequency at which low power node would send friend request (unit 100ms)
+* varies from 0 to 255
+* 100 -> 10s
+*/
+#define LPN_FRIEND_REQUEST_FREQUENCY 50U
+
+/*
+* Frequency at which low power node would poll friend node (unit 100ms)
+* should be less than poll timeout
+* 100 -> 10s
+*/
+#define LPN_FRIEND_POLL_FREQUENCY 25U
+
+/*
+* Minimum RSSI required by low power node
+* should be less than equal to -60
+*/
+#define LPN_MINIMUM_RSSI -100
+
+/*
+* Retries to be made by lpn before termination of friendship
+* varies from 2 to 10
+*/
+#define LPN_NO_OF_RETRIES 10U
+
+/*
+* Maximum address list size buffer in
+* Friend Subscription List Add Message is 10
+*/
+
+
+/*
+* Enable or disable neighbor table
+* if defined -> enabled
+* If MAC address of neighbor changes it appears as new neighbor
+* Neighbor table update can be triggered (configurable) in following cases
+* On receiving Unprovisioned device beacon
+* On receiving Secure network beacon
+* On receiving Mesh message
+* Message with any TTL
+* Message with TTL = 0
+* if not defined -> disabled
+*/
+#define ENABLE_NEIGHBOR_TABLE
+
+/*
+* Size of neighbor table
+*/
+#define NEIGHBOR_COUNT 5U
+
+/*
+* (unit s)
+* Duration (wrt appear or last refresh)
+* for which neighbor exists in neighbor table
+*/
+#define NEIGHBOR_ALIVE_TIME 20U
+
+/*
+* Enable/disable neighbor table update with unprovisioned device beacon
+* 0: Disable neighbor table update with unprovisioned device beacon
+* 1: Enable neighbor table update with unprovisioned device beacon
+*/
+#define NEIGHBOR_UNPRVND_DEV_BEACON_NTU 1U
+
+/*
+* Enable/disable neighbor table update with secure network beacon
+* 0: Disable neighbor table update with secure network beacon
+* 1: Enable neighbor table update with secure network beacon
+*/
+#define NEIGHBOR_SECURE_NET_BEACON_NTU 0U
+
+/*
+* Enable/disable neighbor table update with TTL 0 message
+* 0: Disable neighbor table update messages
+* 1: Enable neighbor table update with messages with 0 TTL
+* 2: Enable neighbor table update with messages with any TTL
+*/
+#define NEIGHBOR_MSG_TTLX_NTU 0U
+
+/*******************************************************************************
+*** Following section helps to configure the LEDs of Application of Mesh ***
+*******************************************************************************/
+
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+ #define SINGLE_LED PWM4
+ #define COOL_LED PWM0
+ #define WARM_LED PWM1
+ #define RED_LED PWM2
+ #define GREEN_LED PWM3
+ #define BLUE_LED PWM4
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (ENABLE_GENERIC_MODEL_SERVER)
+ #define ENABLE_GENERIC_MODEL_SERVER (1)
+#endif
+
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (GENERIC_SERVER_MODEL_ADD_CONFIGURATION)
+ #define GENERIC_SERVER_MODEL_ADD_CONFIGURATION (1)
+
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP) \
+ && !defined (ENABLE_LIGHT_MODEL_SERVER)
+ #define ENABLE_LIGHT_MODEL_SERVER (1)
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP)
+ #define LIGHT_SERVER_MODEL_ADD_CONFIGURATION
+#endif
+
+#if defined(ENABLE_TIME_MODEL_SERVER) \
+ || defined(ENABLE_TIME_MODEL_SERVER_SETUP)\
+ || defined(ENABLE_SCENE_MODEL_SERVER)\
+ || defined(ENABLE_SCENE_MODEL_SERVER_SETUP)
+ #define ENABLE_TIME_SCENE_MODEL_SERVER
+#endif
+
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* __MESH_CFG_USR_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c
index 09ef79884..f82f3b293 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c
@@ -38,10 +38,8 @@
#include "PWM_handlers.h"
#include "appli_light_lc.h"
#include "light_lc.h"
-#ifdef ENABLE_PROVISIONER_FEATURE
#include "appli_generic_client.h"
#include "config_client.h"
-#endif
#include "generic_client.h"
#include "appli_light_client.h"
@@ -110,8 +108,8 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_OnOff_Status,
/* Generic Level callbacks */
Appli_Generic_Level_Set,
- Appli_Generic_LevelDelta_Set,
- Appli_Generic_LevelMove_Set,
+ Appli_Generic_Delta_Set,
+ Appli_Generic_Move_Set,
/* Generic Level Status callbacks */
Appli_Generic_Level_Status,
/* Generic Power on off callbacks */
@@ -119,8 +117,6 @@ const Appli_Generic_cb_t GenericAppli_cb =
/* Generic Power on off callbacks */
Appli_Generic_PowerOnOff_Status,
- Appli_Generic_Restore_PowerOn_Value,
-
/* Generic Default transition time callbacks */
Appli_Generic_DefaultTransitionTime_Set,
/* Generic Default transition time callbacks */
@@ -148,6 +144,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
Appli_Light_GetLightnessDefaultStatus,
+ Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
Appli_Light_GetCtlTemperatureStatus,
@@ -355,7 +352,7 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
- /* Callbacks used by BLE-Mesh Models */
+ /* Callbacks used by BlueNRG-Mesh Models */
BLEMesh_SetSIGModelsCbMap(Model_SIG_cb, MODEL_SIG_COUNT);
/* Load generic model states from nvm */
@@ -422,25 +419,21 @@ void BLEMesh_ModelsProcess(void)
*/
void BLEMesh_ModelsCommand(void)
{
- MOBLE_ADDRESS srcAdd = BLEMesh_GetAddress();
-
#ifdef VENDOR_CLIENT_MODEL_PUBLISH
- Vendor_Publish(srcAdd);
+ Vendor_Publish(BLEMesh_GetAddress());
#endif
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Generic_Publish(srcAdd);
-// Appli_GenericClient_OnOff_Set();
+ Appli_GenericClient_OnOff_Set();
#endif
#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
- Generic_Publish(srcAdd);
-#else
- Vendor_Publish(srcAdd);
+ Generic_Publish(BLEMesh_GetAddress());
#endif
#endif
+
}
/**
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h
index 486e0bcec..486e0bcec 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/models_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c
index 488b046ac..04bc07489 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/pal_nvm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c
@@ -290,6 +290,8 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 remain = 0;
+ MOBLEUINT32 nb_dword = 0;
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
@@ -317,7 +319,10 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
}
else
{
- size >>= 3;
+ nb_dword = (size >> 3);
+ remain = size - ((nb_dword) << 3);
+ if(remain > 0)
+ nb_dword += 1;
uint64_t* src = (uint64_t*)buf;
@@ -325,7 +330,7 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR | FLASH_FLAG_SIZERR | FLASH_FLAG_PGAERR);
- for (size_t i = 0; i < size; i++)
+ for (size_t i = 0; i < nb_dword/*size*/; i++)
{
do
{
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/svcctl_conf.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c
index 1dce9189e..1dce9189e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/svcctl_conf.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h
index 6df3dc0c7..6df3dc0c7 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c
index 609ca64cf..609ca64cf 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/tl_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c
index 43a0e548d..43a0e548d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h
index 773b36116..773b36116 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/user_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h
index 22b6dc41c..22b6dc41c 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/vcp_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
index 7b22ea955..7b22ea955 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject
new file mode 100644
index 000000000..ab971234a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="BLE_MeshLightingPRFNodeDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1472243705" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.2012243190" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.350170076" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1066969950" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" useByScannerDiscovery="false" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1545208353" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.849017599" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.503367654" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.softfp" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.313215574" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/Lighting_PRFNode}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1388838888" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.788714469" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.507308354" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.1773837778" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.658170605" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/app"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1884790151" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="STM32"/>
+ <listOptionValue builtIn="false" value="ENABLE_USART"/>
+ <listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
+ <listOptionValue builtIn="false" value="SERVER"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.418016678" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <option id="gnu.c.compiler.option.dialect.std.1675821413" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.2115418046" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.70637041" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.655187957" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1658116989" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1793003576" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1289441927" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/app"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1053099556" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="STM32"/>
+ <listOptionValue builtIn="false" value="ENABLE_USART"/>
+ <listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
+ <listOptionValue builtIn="false" value="SERVER"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1052883489" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.587781019" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1475637392" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1900226888" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1374383201" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1086385097" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+ <listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
+ </option>
+ <option id="gnu.c.link.option.paths.1171847559" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
+ </option>
+ <option id="gnu.c.link.option.ldflags.584114864" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.1158103120" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1513884002" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.2018563809" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.863897384" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1214396075" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+ <listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.1_CM4_GCC.a"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.1746826190" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
+ </option>
+ <option id="gnu.cpp.link.option.flags.327710768" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.613074149" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1396074364" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.2035810026" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1392403353" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.1483330149" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1488646499" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.2083592722" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="Application/STM32_WPAN/app/appli_config_client.c|Application/STM32_WPAN/app/appli_generic_client.c|Application/STM32_WPAN/app/appli_light_client.c|Middlewares/STM32_WPAN/ble/blesvc/config_client.c|Middlewares/STM32_WPAN/ble/blesvc/generic_client.c|Middlewares/STM32_WPAN/ble/blesvc/light_client.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="Lighting_PRFNode.fr.ac6.managedbuild.target.gnu.cross.exe.549494370" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="/Lighting_PRFNode"/>
+ </configuration>
+ <configuration configurationName="Release"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.541963203;fr.ac6.managedbuild.config.gnu.cross.exe.debug.541963203.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.2004397433;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1404205422">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project
new file mode 100644
index 000000000..a99101602
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project
@@ -0,0 +1,394 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Lighting_PRFNode</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/readme.txt</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_debug.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_entry.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_timerserver.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/lp_timer.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/lp_timer.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/main.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/main.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32_lpm_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32wbxx_it.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/syscalls.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_config.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_config.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_handlers.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_handlers.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/app_ble.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/app_ble.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_generic.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_sensor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_sensor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/models_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/models_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/pal_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/pal_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/target/hw_ipcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/target/hw_ipcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_seq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/common.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh_cfg.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/time_scene.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gatt_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hal_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hci_le.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_l2cap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/osal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</locationURI>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld
index 7ac9a391f..7ac9a391f 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/stm32wb55xx_flash_cm4.ld
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s
index f79eec117..f79eec117 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/startup_stm32wb55xx_cm4.s
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c
index e3c8a89f9..e3c8a89f9 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/syscalls.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt
new file mode 100644
index 000000000..b662c6de2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt
@@ -0,0 +1,225 @@
+/**
+ @page BLE_MeshLightingDemo example
+
+ @verbatim
+ ******************** (C) COPYRIGHT 2020 STMicroelectronics *******************
+ * @file BLE/BLE_MeshLightingPRFNode/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE Mesh Lighting Proxy Relay Friend Node demo example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2020 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@par Directory contents
+ mesh_lighting_demo
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h Interface to support debug in the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c Interface to support debug in the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/main.c Main program
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/hal_common.h Header for common function of HAL file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/tl_if.c Transport Layer interface
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/user_if.h Header file for User interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/user_if.c User interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG-Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+For more details refer to the Application Note:
+ AN5292_STM32WB_How_to_build_BLE_Mesh_Application
+
+@Introduction
+
+The ST BLE-Mesh library supports all of the following features in a Mesh node:
+1. Relay: to forward received network PDUs on advertising or GATT bearer, if the Proxy feature is enabled
+2. Proxy: to forward received network PDUs between GATT and advertising bearers
+3. Friend: can perform duties such as scanning for other associated nodes that are usually Low Power mode
+4. Low Power: consumes much less power as the node usually does not perform any scanning
+A typical BLE Mesh node radio should always be in scanning mode to avoid missing packets over the air, but this kind of
+operation is not supported by many devices due to continuous energy requirements.
+To enable low power operation, BLE Mesh Profile v1.0 defines the concept of Friendship.
+In a Mesh network, a Low Power feature-enabled Mesh node (LPN) offloads its packet receiving (scanning) duty to an adjacent
+Friend feature-enabled Mesh node (FN). The LPN is not always scanning and remains inactive (or sleeps) for most of its life
+cycle, significantly reducing its energy requirements. Nodes running on batteries or energy harvesting techniques usually
+support the Low Power feature.
+Once connected to each other, the FN and LPN are considered friends and their connection is known as a Friendship. At least
+one FN must be in the direct radio range of an LPN to establish Friendship.
+
+@Configuration
+
+Low Power Node
+Low Power feature support is defined in mesh_cfg_usr.h by hte predefinition of ENABLE_LOW_POWER_FEATURE.
+Note: A Low Power feature-enabled node does not support any other feature: all the other features should be
+undefined.
+
+@Demo setup based on STM32WB55RG-Nucleo
+
+General default setting defined in mesh_cfg_usr.h:
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF (1) /* GENERIC SERVER ONOFF MODEL ON FIRST ELEMENT */
+ APPLICATION_NUMBER_OF_ELEMENTS 1 /* NUMBER OF ELEMENT SUPPORTED */
+ APPLICATION_SIG_MODELS_MAX_COUNT 20 /* TOTAL NUMBER OF MODELS SUPPORTED */
+ APPLICATION_VENDOR_MODELS_MAX_COUNT 2 /* TOTAL NIMBER OF VENDOR MODELS SUPPORTED */
+ ENABLE_PB_ADV /* Provisioning Bearer over advertising channels support */
+ ENABLE_PB_GATT /* Provisioning Bearer over GATT proxy support */
+
+The following demo based on STM32WB55RG-Nucleo has been set up using one board as a Friend node and two
+boards as Low Power nodes.
+
+Low Power Node setup (use the Low Power Node BLE_MeshLightingLPN project):
+Step 1. Configure LPN parameters.
+ Change only if required ohterwise skip this step (use example parameters defined in mesh_cfg_usr.h)
+ LPN_RSSI_FACTOR_LEVEL 1
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL 1
+ LPN_MINIMUM_QUEUE_SIZE_LOG 2
+ LPN_RECEIVE_DELAY 150 ms
+ LPN_POLL_TIMEOUT 2000 (*100 ms)
+ LPN_RECEIVE_WINDOW_SIZE 55 ms
+ LPN_SUBSCR_LIST_SIZE 2
+ LPN_FRIEND_REQUEST_FREQUENCY 50 (*100 ms)
+ LPN_FRIEND_POLL_FREQUENCY 25 (*100 ms)
+ LPN_MINIMUM_RSSI -100
+ LPN_NO_OF_RETRIES 10
+Step 2. Generate and flash binary in 2 boards (LPN1, LPN2)
+
+Friend Node setup:
+Step 1. Generate and flash binary in a board (FN)
+Step 2. Provision the 3 boards with the default parameters, using BLE-Mesh Android or BLE-Mesh iOS smartphone application
+ (subscribe and publish to default group, view )
+
+Demo operation
+After provisioning, it might take a few seconds for Friendship to be established between FN and LPNs.
+In this demo, the FN establishes Friendship with LPN1 and LPN2
+Any packet targeted to LPN1/LPN2 or to a group address subscribed by LPN1 or LPN2 is put in queue by the FN
+that forwards packets to LPN1/LPN2 as soon as it receives a Friend Poll from the respective LPN.
+The LPN is free to send packets (generate traffic) any time.
+
+By pressing [SW1] button on the Friend Node:
+1. FN publishes a LED ON command to the default group and the FN blue LED immediately turns on (when the
+FN belongs to the default group).
+2. FN forwards a LED ON command to the LPNs subscribed to the default group. As soon as the FN receives
+poll from an LPN, it sends LED ON to the respective LPN.
+
+ FN LPN1 LPN2
+ | | |
+ SW1 PUSH->| | |
+ Blue LED on->| | |
+ |<--Friend Poll--| |
+ | | |
+ |-----LED on---->|<-Blue LED on |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |-------------LED on------------>|<-Blue LED on
+ | |
+
+By pressing [SW1] button on the Low Power Node 1:
+1. LPN1 publishes an LED OFF command to the default group. LPN1 blue LED tunrs off.
+ LPN1 immediately forwards LED OFF command to the default group.
+2. FN receives an LED OFF command (as it is subscribed to the default group) and the FN blue LED turns off.
+3. FN also sends an LED OFF command to LPN2 (subscribed to the default group) as soon as FN receives
+ poll from LPN2.
+
+ FN LPN1 LPN2
+ | | |
+ | SW1 PUSH->|<-Blue LED off |
+ Blue LED off->|<----LED off----| |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |------------LED off------------>|<-Blue LED off
+ | |
+
+* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h
new file mode 100644
index 000000000..9dbfbba05
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h
@@ -0,0 +1,118 @@
+/**
+ ******************************************************************************
+ * @file app_common.h
+ * @author MCD Application Team
+ * @brief Common
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_COMMON_H
+#define __APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+
+#define PAUSE( t ) M_BEGIN \
+ volatile int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_conf.h
new file mode 100644
index 000000000..816bf929a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_conf.h
@@ -0,0 +1,547 @@
+/**
+ ******************************************************************************
+ * @file app_conf.h
+ * @author MCD Application Team
+ * @brief Application configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_CONFIG_H
+#define __APP_CONFIG_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * MESH Application Config
+ ******************************************************************************/
+
+/**< generic parameters ******************************************************/
+
+/**
+ * Define Tx Power
+ */
+#define CFG_TX_POWER (0x18) /**< +0 dBm */
+
+/**
+ * Define Advertising parameters
+ */
+#define CFG_ADV_BD_ADDRESS (0x7257acd87a6c)
+#define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */
+#define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xA0) /**< 100ms */
+#define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */
+#define CFG_LP_CONN_ADV_INTERVAL_MAX (0x640) /**< 1s */
+
+/**
+ * Define IO Authentication
+ */
+#define CFG_BONDING_MODE (1)
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+
+/**
+ * Define IO capabilities
+ */
+#define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00)
+#define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01)
+#define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02)
+#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
+#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
+
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY
+
+/**
+ * Define MITM modes
+ */
+#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
+#define CFG_MITM_PROTECTION_REQUIRED (0x01)
+
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
+
+
+/**
+ * Define PHY
+ */
+#define ALL_PHYS_PREFERENCE 0x00
+#define RX_2M_PREFERRED 0x02
+#define TX_2M_PREFERRED 0x02
+#define TX_1M 0x01
+#define TX_2M 0x02
+#define RX_1M 0x01
+#define RX_2M 0x02
+
+/**
+ * Generic Access Appearance
+ */
+#define CFG_UNKNOWN_APPEARANCE (0)
+#define CFG_GAP_APPEARANCE (832)
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_IRK {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_ERK {0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21,0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21}
+
+/* USER CODE BEGIN Generic_Parameters */
+/**
+ * SMPS supply
+ * SMPS not used when Set to 0
+ * SMPS used when Set to 1
+ */
+#define CFG_USE_SMPS 1
+/* USER CODE END Generic_Parameters */
+
+/**< specific parameters ********************************************************/
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+
+#define POWEROFF_EXTI_IRQHandler EXTI15_10_IRQHandler
+
+#define CFG_MAX_CONNECTION 1
+
+#define RADIO_ACTIVITY_EVENT 1
+
+
+#define CONN_L(x) ((int)((x)/0.625f))
+#define CONN_P(x) ((int)((x)/1.25f))
+
+ /* L2CAP Connection Update request parameters used for test only with smart Phone */
+#define L2CAP_REQUEST_NEW_CONN_PARAM 1
+
+#define L2CAP_INTERVAL_MIN CONN_P(12) /* 1s */
+#define L2CAP_INTERVAL_MAX CONN_P(12) /* 1s */
+#define L2CAP_SLAVE_LATENCY 0x0000
+#define L2CAP_TIMEOUT_MULTIPLIER 800 /* 0x320 */
+
+
+/******************************************************************************
+ * BLE Stack
+ ******************************************************************************/
+/**
+ * Maximum number of simultaneous connections that the device will support.
+ * Valid values are from 1 to 8
+ */
+#define CFG_BLE_NUM_LINK 8
+
+/**
+ * Maximum number of Services that can be stored in the GATT database.
+ * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services
+ */
+#define CFG_BLE_NUM_GATT_SERVICES 8
+
+/**
+ * Maximum number of Attributes
+ * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services)
+ * that can be stored in the GATT database.
+ * Note that certain characteristics and relative descriptors are added automatically during device initialization
+ * so this parameters should be 9 plus the number of user Attributes
+ */
+#define CFG_BLE_NUM_GATT_ATTRIBUTES 68
+
+/**
+ * Maximum supported ATT_MTU size
+ */
+#define CFG_BLE_MAX_ATT_MTU (23/*156*/)
+
+/**
+ * Size of the storage area for Attribute values
+ * This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute:
+ * - attribute value length
+ * - 5, if UUID is 16 bit; 19, if UUID is 128 bit
+ * - 2, if server configuration descriptor is used
+ * - 2*DTM_NUM_LINK, if client configuration descriptor is used
+ * - 2, if extended properties is used
+ * The total amount of memory needed is the sum of the above quantities for each attribute.
+ */
+#define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344)
+
+/**
+ * Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
+ */
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+
+/**
+ * Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
+ */
+#define CFG_BLE_DATA_LENGTH_EXTENSION 1
+
+/**
+ * Sleep clock accuracy in Slave mode (ppm value)
+ */
+#define CFG_BLE_SLAVE_SCA 500
+
+/**
+ * Sleep clock accuracy in Master mode
+ * 0 : 251 ppm to 500 ppm
+ * 1 : 151 ppm to 250 ppm
+ * 2 : 101 ppm to 150 ppm
+ * 3 : 76 ppm to 100 ppm
+ * 4 : 51 ppm to 75 ppm
+ * 5 : 31 ppm to 50 ppm
+ * 6 : 21 ppm to 30 ppm
+ * 7 : 0 ppm to 20 ppm
+ */
+#define CFG_BLE_MASTER_SCA 0
+
+/**
+ * Source for the 32 kHz slow speed clock
+ * 1 : internal RO
+ * 0 : external crystal ( no calibration )
+ */
+#define CFG_BLE_LSE_SOURCE 0
+
+/**
+ * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_HSE_STARTUP_TIME 0x148
+
+/**
+ * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_MAX_CONN_EVENT_LENGTH ( 0xFFFFFFFF )
+
+/**
+ * Viterbi Mode
+ * 1 : enabled
+ * 0 : disabled
+ */
+#define CFG_BLE_VITERBI_MODE 1
+
+/**
+ * LL Only Mode
+ * 1 : LL Only
+ * 0 : LL + Host
+ */
+#define CFG_BLE_LL_ONLY 0
+
+
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TLBLE_EVT_QUEUE_LENGTH 5
+
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_BLE_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE )
+
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU hw_lpuart1
+
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 0
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+/**
+ * When set to 1, the traces are enabled in the BLE services
+ */
+#define CFG_DEBUG_BLE_TRACE 1
+
+/**
+ * Enable or Disable traces in application
+ */
+#define CFG_DEBUG_APP_TRACE 1
+
+#if (CFG_DEBUG_APP_TRACE != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+
+#if ( (CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0) )
+#define CFG_DEBUG_TRACE 1
+#endif
+
+#if (CFG_DEBUG_TRACE != 0)
+#undef CFG_LPM_SUPPORTED
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+#define CFG_DEBUGGER_SUPPORTED 1
+#endif
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+
+/**
+ * These are the lists of task id registered to the scheduler
+ * Each task id shall be in the range [0:31]
+ * This mechanism allows to implement a generic code in the API TL_BLE_HCI_StatusNot() to comply with
+ * the requirement that a HCI/ACI command shall never be sent if there is already one pending
+ */
+
+/**< Add in that list all tasks that may send a ACI/HCI command */
+typedef enum
+{
+ CFG_TASK_ADV_UPDATE_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_MESH_REQ_ID,
+ CFG_TASK_MESH_BEACON_REQ_ID,
+ CFG_TASK_MESH_UART_RX_REQ_ID,
+ CFG_TASK_APPLI_REQ_ID,
+ CFG_TASK_MESH_SW1_REQ_ID,
+ CFG_TASK_MESH_LPN_REQ_ID,
+
+ CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
+} CFG_Task_Id_With_HCI_Cmd_t;
+
+/**< Add in that list all tasks that never send a ACI/HCI command */
+typedef enum
+{
+ CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
+
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
+
+ CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
+} CFG_Task_Id_With_NO_HCI_Cmd_t;
+#define CFG_TASK_NBR CFG_LAST_TASK_ID_WITHO_NO_HCICMD
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
+} CFG_IdleEvt_Id_t;
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_BLE
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*__APP_CONFIG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_debug.h
new file mode 100644
index 000000000..13485c16b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_debug.h
@@ -0,0 +1,45 @@
+
+/**
+ ******************************************************************************
+ * @file app_debug.h
+ * @author MCD Application Team
+ * @brief Interface to support debug in the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_DEBUG_H
+#define __APP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPD_Init( void );
+ void APPD_EnableCPU2( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_DEBUG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_entry.h
new file mode 100644
index 000000000..5d85cd90c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_entry.h
@@ -0,0 +1,44 @@
+
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief Interface to the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_ENTRY_H
+#define __APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..1e2d7a616
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/**
+ ******************************************************************************
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_CONF_H
+#define __HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+/**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+#define CFG_HW_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOA
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_6
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_Channel4
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_Channel4_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_Channel4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
+
+#endif /*__HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_flash.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_flash.h
new file mode 100644
index 000000000..18c088d3e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_flash.h
@@ -0,0 +1,87 @@
+/**
+******************************************************************************
+* @file hw_flash.h
+* @brief Header for hw_flash.c module
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_FLASH_H
+#define __HW_FLASH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Write 64 bits double word in FLASH
+ *
+ * @param FLASH destination address
+ * @param 64 bits double word data
+ * @retval result
+ */
+MOBLE_RESULT HW_FLASH_Write(uint32_t address, uint64_t data);
+
+/**
+ * @brief Erase FLASH page
+ *
+ * @param address of FLASH page
+ * @param number of page
+ * @param interrupt not used
+ * @retval result
+ */
+MOBLE_RESULT HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt);
+
+#if 0
+/**
+ * @brief Get Option Byte IPCC buffer address
+ *
+ * @param None
+ * @retval Option Byte IPCC buffer address
+ */
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void);
+
+/**
+ * @brief Get Option Byte SFSA
+ *
+ * @param None
+ * @retval Option Byte SFSA
+ */
+uint32_t HW_FLASH_OB_GetSFSA(void);
+
+/**
+ * @brief Get Option Byte SBSRA
+ *
+ * @param None
+ * @retval Option Byte SBSRA
+ */
+uint32_t HW_FLASH_OB_GetSBRSA(void);
+
+/**
+ * @brief Get Option Byte SNBRSA
+ *
+ * @param None
+ * @retval Option Byte SNBRSA
+ */
+uint32_t HW_FLASH_OB_GetSNBRSA(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__HW_FLASH_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/lp_timer.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/lp_timer.h
new file mode 100644
index 000000000..41f226faf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/lp_timer.h
@@ -0,0 +1,60 @@
+/**
+******************************************************************************
+* @file lp_timer.h
+* @brief Header for lp_timer.c module
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __LP_TIMER_H
+#define __LP_TIMER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+ /**
+ * @brief Initialize the low power timer
+ *
+ * @param None
+ * @retval None
+ */
+ void LpTimerInit(void);
+
+ /**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : in ms
+ * @retval None
+ */
+ void LpTimerStart(uint32_t time_to_sleep);
+
+ /**
+ * @brief Read how long the timer has run
+ *
+ * @param None
+ * @retval The time elapsed in ms
+ */
+ uint32_t LpGetElapsedTime(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__LP_TIMER_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/main.h
new file mode 100644
index 000000000..3de57ae3e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/main.h
@@ -0,0 +1,38 @@
+/**
+ ******************************************************************************
+ * @file main.h
+ * @author MCD Application Team
+ * @brief Header for main.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported variables --------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..0270583e8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,350 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/* #define HAL_ADC_MODULE_ENABLED */
+#define HAL_COMP_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_CRC_MODULE_ENABLED
+#define HAL_CRYP_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_IPCC_MODULE_ENABLED
+#define HAL_IRDA_MODULE_ENABLED
+#define HAL_IWDG_MODULE_ENABLED
+#define HAL_LCD_MODULE_ENABLED
+#define HAL_LPTIM_MODULE_ENABLED
+#define HAL_PCD_MODULE_ENABLED
+#define HAL_PKA_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_QSPI_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_RNG_MODULE_ENABLED
+#define HAL_RTC_MODULE_ENABLED
+#define HAL_SAI_MODULE_ENABLED
+#define HAL_SMARTCARD_MODULE_ENABLED
+#define HAL_SMBUS_MODULE_ENABLED
+/* #define HAL_SPI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+#define HAL_TSC_MODULE_ENABLED
+#define HAL_UART_MODULE_ENABLED
+#define HAL_USART_MODULE_ENABLED
+#define HAL_WWDG_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE ((uint32_t)32000000) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)48000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)(1<<__NVIC_PRIO_BITS) - 1) /*!< tick interrupt priority (lowest by default) */
+#define USE_RTOS 0
+#define PREFETCH_ENABLE 0
+#define INSTRUCTION_CACHE_ENABLE 1
+#define DATA_CACHE_ENABLE 1
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1 */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 1U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(char* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..06d41fa17
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,66 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+void USART1_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void LPUART1_IRQHandler(void);
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+
+void POWEROFF_EXTI_IRQHandler(void);
+void TIM2_IRQHandler(void);
+void TIM1_CC_IRQHandler(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..4b9e79dde
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/vcp_conf.h
@@ -0,0 +1,53 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA_ID)
+#define VCP_TASK_PRIO (CFG_SEQ_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_debug.c
new file mode 100644
index 000000000..246173ae6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_debug.c
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @file app_debug.c
+ * @author MCD Application Team
+ * @brief Debug capabilities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "app_debug.h"
+#include "utilities_common.h"
+#include "shci.h"
+#include "tl.h"
+#include "dbg_trace.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef PACKED_STRUCT
+{
+ GPIO_TypeDef* port;
+ uint16_t pin;
+ uint8_t enable;
+ uint8_t reserved;
+} APPD_GpioConfig_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define GPIO_NBR_OF_RF_SIGNALS 9
+#define GPIO_CFG_NBR_OF_FEATURES 34
+#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
+#define NBR_OF_GENERAL_CONFIG_PARAMETERS 4
+
+/**
+ * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
+ */
+#define BLE_DTB_CFG 0
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * It provides timing information on the CPU2 activity.
+ * All configuration of (port, pin) is supported for each features and can be selected by the user
+ * depending on the availability
+ */
+static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] =
+{
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */
+/* From v1.1.1 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */
+/* From v1.2.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */
+/* From v1.3.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */
+/* From v1.4.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */
+};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * This table is relevant only for BLE
+ * It provides timing information on BLE RF activity.
+ * New signals may be allocated at any location when requested by ST
+ * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed
+ */
+#if( BLE_DTB_CFG == 7)
+static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
+{
+ { GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */
+ { GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */
+ { GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */
+ { GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */
+ { GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */
+ { GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */
+ { GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */
+ { GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */
+ { GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
+};
+#endif
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void APPD_SetCPU2GpioConfig( void );
+static void APPD_BleDtbCfg( void );
+
+/* Functions Definition ------------------------------------------------------*/
+void APPD_Init( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+ HAL_DBGMCU_EnableDBGStopMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ APPD_SetCPU2GpioConfig( );
+ APPD_BleDtbCfg( );
+
+ return;
+}
+
+void APPD_EnableCPU2( void )
+{
+ SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
+ {
+ {{0,0,0}}, /**< Does not need to be initialized */
+ {(uint8_t *)aGpioConfigList,
+ (uint8_t *)&APPD_TracesConfig,
+ (uint8_t *)&APPD_GeneralConfig,
+ GPIO_CFG_NBR_OF_FEATURES,
+ NBR_OF_TRACES_CONFIG_PARAMETERS,
+ NBR_OF_GENERAL_CONFIG_PARAMETERS}
+ };
+
+ /**< Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /** GPIO DEBUG Initialization */
+ SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void APPD_SetCPU2GpioConfig( void )
+{
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+ uint16_t gpioc_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+ gpioc_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++)
+ {
+ if( aGpioConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aGpioConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOC:
+ gpioc_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpioc_pin_list != 0)
+ {
+ gpio_config.Pin = gpioc_pin_list;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &gpio_config);
+ HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
+ }
+
+ return;
+}
+
+static void APPD_BleDtbCfg( void )
+{
+#if (BLE_DTB_CFG != 0)
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++)
+ {
+ if( aRfConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aRfConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_AF_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ gpio_config.Alternate = GPIO_AF6_RF_DTB7;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ }
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+*************************************************************/
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ HW_UART_Init(CFG_DEBUG_TRACE_UART);
+ return;
+}
+
+
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_entry.c
new file mode 100644
index 000000000..eeae11800
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_entry.c
@@ -0,0 +1,414 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.c
+ * @author MCD Application Team
+ * @brief Entry point of the Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_ble.h"
+#include "ble.h"
+#include "tl.h"
+#include "stm32_seq.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "app_debug.h"
+
+#include "app_debug.h"
+
+#include "appli_mesh.h"
+#include "appli_nvm.h"
+#include "pal_nvm.h"
+#include "lp_timer.h"
+#include "mesh_cfg.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+extern MOBLEUINT8 PowerOnOff_flag;
+#endif
+#ifdef ENABLE_OCCUPANCY_SENSOR
+extern MOBLEUINT8 Occupancy_Flag;
+#endif
+extern const void *mobleNvmBase;
+extern const void *appNvmBase;
+extern const void *prvsnr_data;
+#if (LOW_POWER_FEATURE == 1)
+extern __IO uint32_t uwTick;
+extern uint32_t uwTickFreq;
+#if ( CFG_LPM_SUPPORTED == 1)
+static uint32_t BleMesh_sleepTime;
+#endif
+extern volatile uint8_t BleProcessInit;
+#endif
+
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+
+static void APPE_SysUserEvtRx( void * pPayload );
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+uint8_t Mesh_Stop_Mode;
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ MOBLEUINT32 last_user_flash_address = ((READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos) << 12) + FLASH_BASE;
+
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ APPD_Init( );
+
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ Led_Init();
+
+ Button_Init();
+
+ mobleNvmBase = (const void *)(last_user_flash_address - NVM_SIZE);
+ appNvmBase = (const void *)(last_user_flash_address - NVM_SIZE - APP_NVM_SIZE);
+ prvsnr_data = (const void *)(last_user_flash_address - NVM_SIZE - APP_NVM_SIZE - PRVN_NVM_PAGE_SIZE);
+
+#if (LOW_POWER_FEATURE == 1)
+ /**
+ * Initialize the lp timer to be used when the systick is stopped in low power mode
+ */
+ LpTimerInit();
+#endif
+
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ UNUSED(pPayload);
+ /* Traces channel initialization */
+ /* Enable debug on CPU2 */
+ APPD_EnableCPU2( );
+
+ APP_BLE_Init( );
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+#if (LOW_POWER_FEATURE == 1)
+ if(BleProcessInit != 0)
+ {
+ BleMesh_sleepTime = (uint32_t)BLEMesh_GetSleepDuration();
+
+ if (BleMesh_sleepTime > 0)
+ {
+ LpTimerStart(BleMesh_sleepTime);
+
+ UTIL_LPM_EnterLowPower( );
+
+ uwTick += (uwTickFreq*LpGetElapsedTime());
+ }
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+ }
+#else
+ UTIL_LPM_EnterLowPower( );
+#endif
+#else
+#if (LOW_POWER_FEATURE == 1)
+ if(BleProcessInit != 0)
+ {
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+ }
+#endif
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_Run( 0 );
+#else
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+#endif
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ case POWEROFF_PIN:
+ {
+ PowerOnOff_flag = 1;
+ }
+ break;
+#endif
+
+ case BUTTON_SW1_PIN:
+ {
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW1_REQ_ID, CFG_SCH_PRIO_0);
+ }
+ break;
+
+#ifdef ENABLE_OCCUPANCY_SENSOR
+ case BUTTON_SW2_PIN:
+ {
+ Occupancy_Flag = 1;
+ }
+ break;
+#endif
+
+#if ( CFG_LPM_SUPPORTED == 1)
+ case BUTTON_SW3_PIN:
+ {
+ if(Mesh_Stop_Mode == 0)
+ {
+ Mesh_Stop_Mode = 1;
+ /**
+ * Do allow stop mode in the application
+ */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_ENABLE);
+ BSP_LED_Off(LED_GREEN);
+ }
+ else
+ {
+ Mesh_Stop_Mode = 0;
+ /**
+ * Do not allow stop mode in the application
+ */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+ BSP_LED_On(LED_GREEN);
+ }
+ }
+ break;
+#endif
+
+ default:
+ break;
+
+ }
+ return;
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_flash.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_flash.c
new file mode 100644
index 000000000..882181c8c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_flash.c
@@ -0,0 +1,152 @@
+/*****************************************************************************
+ * @file hw_flash.c
+ * @author MCD Application Team
+ * @brief This file contains the FLASH driver needed by EE module
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+#include "common.h"
+#include "stm32_seq.h"
+//#include "dbg_gpio.h"
+#include "hw_flash.h"
+#include "stm32wbxx_hal.h"
+
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);
+static void HW_FLASH_PageErase(uint32_t Page);
+//static void HW_FLASH_WaitEndOfOperation(void);
+
+/*****************************************************************************/
+
+MOBLE_RESULT HW_FLASH_Write(uint32_t address, uint64_t data)
+{
+ /* Enable EOP interrupt */
+ // __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ // __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_Program_DoubleWord(address, data);
+
+ // HW_FLASH_WaitEndOfOperation();
+
+ /* Disable EOP interrupt */
+// __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the PG bit once data has been written */
+ CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
+
+ return (MOBLE_RESULT_SUCCESS);
+}
+
+/*****************************************************************************/
+
+MOBLE_RESULT HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt)
+{
+ UNUSED(interrupt);
+
+ uint32_t loop;
+
+ /* Enable EOP interrupt */
+ __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ for( loop = 0; loop < n ; loop++)
+ {
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_PageErase(page+loop);
+
+// HW_FLASH_WaitEndOfOperation();
+ }
+
+ /* Disable EOP interrupt */
+ __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the page erase bit */
+ CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
+
+ return (MOBLE_RESULT_SUCCESS);
+}
+
+#if 0
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void)
+{
+ return READ_BIT(FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSFSA(void)
+{
+ return (READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SBRSA) >> FLASH_SRRVR_SBRSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSNBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SNBRSA) >> FLASH_SRRVR_SNBRSA_Pos);
+}
+#endif
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * This is a copy of FLASH_Program_DoubleWord() from the HAL
+ */
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_WRITE);
+
+ /* Set PG bit */
+ SET_BIT(FLASH->CR, FLASH_CR_PG);
+
+ /* Program first word */
+ *(uint32_t *)Address = (uint32_t)Data;
+
+ /* Barrier to ensure programming is performed in 2 steps, in right order
+ (independently of compiler optimization behavior) */
+ __ISB();
+
+ /* Program second word */
+ *(uint32_t *)(Address + 4U) = (uint32_t)(Data >> 32U);
+
+// DBG_GPIO_Gr2Reset(DBG_GPIO_GR2_FLASH_WRITE);
+}
+
+/**
+ * This is a copy of LASH_PageErase() from the HAL
+ */
+static void HW_FLASH_PageErase(uint32_t Page)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+
+ /* Proceed to erase the page */
+ MODIFY_REG(FLASH->CR, FLASH_CR_PNB, ((Page << FLASH_CR_PNB_Pos) | FLASH_CR_PER | FLASH_CR_STRT));
+
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_uart.c
new file mode 100644
index 000000000..cb97bd718
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/hw_uart.c
@@ -0,0 +1,471 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ (__HANDLE__).Init.BaudRate = CFG_HW_##__USART_BASE__##_BAUDRATE; \
+ (__HANDLE__).Init.WordLength = CFG_HW_##__USART_BASE__##_WORDLENGTH; \
+ (__HANDLE__).Init.StopBits = CFG_HW_##__USART_BASE__##_STOPBITS; \
+ (__HANDLE__).Init.Parity = CFG_HW_##__USART_BASE__##_PARITY; \
+ (__HANDLE__).Init.HwFlowCtl = CFG_HW_##__USART_BASE__##_HWFLOWCTL; \
+ (__HANDLE__).Init.Mode = CFG_HW_##__USART_BASE__##_MODE; \
+ (__HANDLE__).Init.OverSampling = CFG_HW_##__USART_BASE__##_OVERSAMPLING; \
+ (__HANDLE__).AdvancedInit.AdvFeatureInit = CFG_HW_##__USART_BASE__##_ADVFEATUREINIT; \
+ HAL_UART_Init(&(__HANDLE__)); \
+ } while(0)
+
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+#define HW_UART_MSP_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ \
+ /* Configure Tx Pin */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_TX_PIN ; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_TX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_TX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_TX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_TX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_TX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure Rx Pin */ \
+ CFG_HW_##__USART_BASE__##_RX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_RX_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_RX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_RX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_RX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_RX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_RX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure CTS Pin */ \
+ CFG_HW_##__USART_BASE__##_CTS_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_CTS_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_CTS_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_CTS_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_CTS_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_CTS_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_CTS_PORT, &GPIO_InitStruct); \
+ \
+ /* Set USART source clock */ \
+ __HAL_RCC_##__USART_BASE__##_CONFIG(CFG_HW_##__USART_BASE__##_SOURCE_CLOCK); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_CLK_ENABLE(); \
+ \
+ HAL_NVIC_SetPriority(__USART_BASE__##_IRQn, CFG_HW_##__USART_BASE__##_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(__USART_BASE__##_IRQn); \
+ } while(0)
+
+#define HW_UART_MSP_TX_DMA_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ /* Configure the DMA handler for Transmission process */ \
+ /* Enable DMA clock */ \
+ CFG_HW_##__USART_BASE__##_DMA_CLK_ENABLE(); \
+ /* Enable DMA MUX clock */ \
+ CFG_HW_##__USART_BASE__##_DMAMUX_CLK_ENABLE(); \
+ \
+ HW_hdma_##__HANDLE__##_tx.Instance = CFG_HW_##__USART_BASE__##_TX_DMA_CHANNEL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Request = CFG_HW_##__USART_BASE__##_TX_DMA_REQ; \
+ HW_hdma_##__HANDLE__##_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphInc = DMA_PINC_DISABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemInc = DMA_MINC_ENABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.Mode = DMA_NORMAL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Priority = DMA_PRIORITY_LOW; \
+ \
+ HAL_DMA_Init(&HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* Associate the initialized DMA handle to the UART handle */ \
+ __HAL_LINKDMA(huart, hdmatx, HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* NVIC configuration for DMA transfer complete interrupt */ \
+ HAL_NVIC_SetPriority(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn, CFG_HW_##__USART_BASE__##_DMA_TX_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_DMA_TX_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn); \
+ } while(0)
+
+/* Variables ------------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+ UART_HandleTypeDef huart1 = {0};
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+void (*HW_huart1RxCb)(void);
+void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ UART_HandleTypeDef hlpuart1 = {0};
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+void (*HW_hlpuart1RxCb)(void);
+void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Init(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_INIT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_INIT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_USART2_ENABLED == 1)
+ case hw_uart2:
+ HW_huart2TxCb = cb;
+ huart2.Instance = USART2;
+ hal_status = HAL_UART_Transmit_DMA(&huart2, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_USART2_DMA_TX_SUPPORTED == 1)
+ case hw_uart2:
+ HAL_DMA_IRQHandler(huart2.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_MspInit(UART_HandleTypeDef *huart)
+{
+#if ( (CFG_HW_USART1_ENABLED == 1) || (CFG_HW_LPUART1_ENABLED == 1) )
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+#endif
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ HW_UART_MSP_UART_INIT( huart1, USART1 );
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( huart1, USART1 );
+#endif
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ HW_UART_MSP_UART_INIT( hlpuart1, LPUART1 );
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( hlpuart1, LPUART1 );
+#endif
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/lp_timer.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/lp_timer.c
new file mode 100644
index 000000000..404bb2e3b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/lp_timer.c
@@ -0,0 +1,134 @@
+/**
+ ***************************************************************************************
+ * File Name : lp_timer.c
+ * Description : Low power timer to be used within Mesh Application.
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "lp_timer.h"
+
+/* Exported variables --------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void LpTimerCb(void);
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ uint32_t LpTimeLeftOnEntry;
+ uint8_t LpTimer_Id;
+} LpTimerContext_t;
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static LpTimerContext_t LpTimerContext;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Initialize the low power timer
+ *
+ * @param None
+ * @retval None
+ */
+void LpTimerInit(void)
+{
+ (void) HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(LpTimerContext.LpTimer_Id), hw_ts_SingleShot, LpTimerCb);
+
+ return;
+}
+
+/**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : in ms
+ * @retval None
+ */
+void LpTimerStart(uint32_t time_to_sleep)
+{
+ /* Converts the number of ms into hw timer tick */
+ if(time_to_sleep > 0x400000)
+ {
+ time_to_sleep = time_to_sleep / (CFG_TS_TICK_VAL);
+ time_to_sleep *= 1000;
+ }
+ else
+ {
+ time_to_sleep *= 1000;
+ time_to_sleep = time_to_sleep / (CFG_TS_TICK_VAL);
+ }
+
+ HW_TS_Start(LpTimerContext.LpTimer_Id, time_to_sleep);
+
+ /**
+ * There might be other timers already running in the timer server that may elapse
+ * before this one.
+ * Store how long before the next event so that on wakeup, it will be possible to calculate
+ * how long the tick has been suppressed
+ */
+ LpTimerContext.LpTimeLeftOnEntry = HW_TS_RTC_ReadLeftTicksToCount();
+
+ return;
+}
+
+/**
+ * @brief Read how long the timer has run
+ *
+ * @param None
+ * @retval The time elapsed in ms
+ */
+uint32_t LpGetElapsedTime(void)
+{
+ uint32_t return_value;
+
+ return_value = (CFG_TS_TICK_VAL) * (uint32_t)(LpTimerContext.LpTimeLeftOnEntry - HW_TS_RTC_ReadLeftTicksToCount());
+ return_value = return_value / 1000;
+
+ /**
+ * The system may have been out from another reason than the timer
+ * Stop the timer after the elapsed time is calculated other wise, HW_TS_RTC_ReadLeftTicksToCount()
+ * may return 0xFFFF ( TIMER LIST EMPTY )
+ * It does not hurt stopping a timer that exists but is not running.
+ */
+ HW_TS_Stop(LpTimerContext.LpTimer_Id);
+
+ return return_value;
+}
+
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Low power timer callback
+ *
+ * @param None
+ * @retval None
+ */
+static void LpTimerCb( void )
+{
+ /**
+ * Nothing to be done
+ */
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/main.c
new file mode 100644
index 000000000..95537ac98
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/main.c
@@ -0,0 +1,432 @@
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief BLE application with BLE core
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Stack_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "app_entry.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include "otp.h"
+#include "stm32wbxx_hal_rcc.h"
+
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application
+* @{
+*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Global variables ---------------------------------------------------------*/
+RTC_HandleTypeDef hrtc = { 0 }; /**< RTC handler declaration */
+TIM_HandleTypeDef htim1 = { 0 };
+TIM_HandleTypeDef htim2 = { 0 };
+
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void Reset_BackupDomain( void );
+static void Init_RTC( void );
+static void SystemClock_Config( void );
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Init_Exti( void );
+void Error_Handler(void);
+void PeriphClock_Config(void);
+static void Config_HSE(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+int main( void )
+{
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /**
+ * When the application is expected to run at higher speed, it should be better to set the correct system clock
+ * in system_stm32yyxx.c so that the initialization phase is running at max speed.
+ */
+ SystemClock_Config(); /**< Configure the system clock */
+
+ PeriphClock_Config();
+
+// HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_16);
+
+ Init_Exti( );
+
+ Init_RTC();
+
+ /* Enable CRC clock */
+ __HAL_RCC_CRC_CLK_ENABLE();
+
+ APPE_Init( );
+
+#if ( CFG_LPM_SUPPORTED == 1)
+// BSP_LED_On(LED_GREEN);
+#endif
+
+ while(1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_RTC( void )
+{
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+
+ __HAL_RCC_RTC_ENABLE(); /**< Enable RTC */
+
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+
+ return;
+}
+
+void PeriphClock_Config(void)
+{
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+ /**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+#if ( CFG_LPM_SUPPORTED == 1)
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
+#else
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+#endif
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+#if (CFG_USE_SMPS != 0)
+ /**
+ * Configure and enable SMPS
+ *
+ * The SMPS configuration is not yet supported by CubeMx
+ */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#endif
+ /* USER CODE END Smps */
+}
+
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..8120bda4a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,233 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "stm32wbxx_it.h"
+#include "appli_mesh.h"
+#include "PWM_handlers.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/******************************************************************************/
+/* Cortex-M4 Processor Exceptions Handlers */
+/******************************************************************************/
+
+/**
+ * @brief This function handles NMI exception.
+ * @param None
+ * @retval None
+ */
+void NMI_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Hard Fault exception.
+ * @param None
+ * @retval None
+ */
+void HardFault_Handler(void)
+{
+ BSP_LED_On(LED_RED);
+#ifndef DISABLE_TRACES
+ printf("HARDFAULT !\r\n");
+#endif
+ /* Go to infinite loop when Hard Fault exception occurs */
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles SVCall exception.
+ * @param None
+ * @retval None
+ */
+void SVC_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Debug Monitor exception.
+ * @param None
+ * @retval None
+ */
+void DebugMon_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles PendSVC exception.
+ * @param None
+ * @retval None
+ */
+void PendSV_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles SysTick Handler.
+ * @param None
+ * @retval None
+ */
+void SysTick_Handler(void)
+{
+ HAL_IncTick();
+}
+
+/********************************************************************************/
+/* STM32WBxx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32wb55xx_cm4.s). */
+/********************************************************************************/
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void POWEROFF_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(POWEROFF_PIN);
+}
+#endif
+
+#if(CFG_HW_USART1_ENABLED == 1)
+void USART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+#if(CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_USART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+#if(CFG_HW_LPUART1_ENABLED == 1)
+void LPUART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+#if(CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/**
+ * @brief This function handles TIM2 global interrupt.
+ */
+void TIM2_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM2_IRQn 0 */
+
+ /* USER CODE END TIM2_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim2);
+ /* USER CODE BEGIN TIM2_IRQn 1 */
+
+ /* USER CODE END TIM2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles TIM1 global interrupt.
+ */
+void TIM1_CC_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM1_IRQn 0 */
+
+ /* USER CODE END TIM1_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim1);
+ /* USER CODE BEGIN TIM1_IRQn 1 */
+
+ /* USER CODE END TIM1_IRQn 1 */
+}
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..9e9b79832
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,343 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "app_common.h"
+#include "otp.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+/* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+ /**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /* FPU settings ------------------------------------------------------------*/
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+#endif
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ LL_RCC_HSE_Enable();
+
+ /**
+ * Set FLASH latency to 1WS
+ */
+ LL_FLASH_SetLatency( LL_FLASH_LATENCY_1 );
+ while( LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1 );
+
+ /**
+ * Switch to HSE
+ *
+ */
+ while(!LL_RCC_HSE_IsReady());
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSE );
+ while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+
+ /**
+ * Switch OFF MSI
+ */
+ LL_RCC_MSI_Disable();
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /*SystemCoreClock=HAL_RCC_GetSysClockFreq();*/
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewd
new file mode 100644
index 000000000..060ef8d44
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewd
@@ -0,0 +1,2834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_Provisioner</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+ <configuration>
+ <name>Lighting_Provisioner</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp
index b5e9a83f0..9272b860d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp
@@ -2,7 +2,7 @@
<project>
<fileVersion>3</fileVersion>
<configuration>
- <name>Lighting_Node</name>
+ <name>Lighting_Provisioner</name>
<toolchain>
<name>ARM</name>
</toolchain>
@@ -16,15 +16,15 @@
<debug>0</debug>
<option>
<name>ExePath</name>
- <state>Lighting_Node\Exe</state>
+ <state>Lighting_Provisioner\Exe</state>
</option>
<option>
<name>ObjPath</name>
- <state>Lighting_Node\Obj</state>
+ <state>Lighting_Provisioner\Obj</state>
</option>
<option>
<name>ListPath</name>
- <state>Lighting_Node\List</state>
+ <state>Lighting_Provisioner\List</state>
</option>
<option>
<name>GEndianMode</name>
@@ -222,6 +222,7 @@
<state>STM32</state>
<state>ENABLE_USART</state>
<state>TRACE_ENABLE_NO_FUNCTION</state>
+ <state>CLIENT</state>
<state>SERVER</state>
</option>
<option>
@@ -666,7 +667,7 @@
</option>
<option>
<name>OOCOutputFile</name>
- <state>BLE_MeshLightingNodeDemo.hex</state>
+ <state>BLE_MeshLightingProvisioner.hex</state>
</option>
<option>
<name>OOCCommandLineProducer</name>
@@ -721,7 +722,7 @@
</option>
<option>
<name>IlinkOutputFile</name>
- <state>BLE_MeshLightingNodeDemo.out</state>
+ <state>BLE_MeshLightingProvisioner.out</state>
</option>
<option>
<name>IlinkDebugInfoEnable</name>
@@ -834,7 +835,7 @@
<option>
<name>IlinkAdditionalLibs</name>
<state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_IAR.a</state>
- <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.1_CM4_IARv8.a</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_IARv8.a</state>
</option>
<option>
<name>IlinkOverrideProgramEntryLabel</name>
@@ -1098,27 +1099,18 @@
</file>
<file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_config_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
</file>
<file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
</file>
<file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
</file>
<file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_lc.c</name>
@@ -1250,27 +1242,18 @@
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\config_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_lc.c</name>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/Project.eww
new file mode 100644
index 000000000..5054ddcb2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_MeshLightingProvisioner.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..5f36da686
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx
index f5aa6c3fe..9f4dc45a5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvoptx
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx
@@ -22,11 +22,11 @@
</DaveTm>
<Target>
- <TargetName>Lighting_Node</TargetName>
+ <TargetName>Lighting_Provisioner</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<TargetOption>
- <CLKADS>12000000</CLKADS>
+ <CLKADS>8000000</CLKADS>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
@@ -93,7 +93,7 @@
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
- <tRfunc>1</tRfunc>
+ <tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
@@ -103,7 +103,7 @@
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
- <nTsel>1</nTsel>
+ <nTsel>0</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
@@ -120,7 +120,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>UL2CM3</Key>
- <Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32WB_M4 -FL01000000 -FS08000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
@@ -129,7 +129,7 @@
</Tracepoint>
<DebugFlag>
<trace>0</trace>
- <periodic>1</periodic>
+ <periodic>0</periodic>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
@@ -171,7 +171,7 @@
<Group>
<GroupName>Application/Core</GroupName>
- <tvExp>1</tvExp>
+ <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -287,7 +287,7 @@
<Group>
<GroupName>Application/MDK-ARM</GroupName>
- <tvExp>0</tvExp>
+ <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -1211,7 +1211,7 @@
<Group>
<GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
- <tvExp>0</tvExp>
+ <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -1222,18 +1222,6 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
- <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_Keil.lib</PathWithFileName>
- <FilenameWithoutPath>libBle_Mesh_CM4_Keil.lib</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>14</GroupNumber>
- <FileNumber>80</FileNumber>
- <FileType>4</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
<PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</PathWithFileName>
<FilenameWithoutPath>libBle_Mesh_CM4_Keil.lib</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@@ -1249,13 +1237,13 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>81</FileNumber>
+ <FileNumber>80</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
- <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</PathWithFileName>
- <FilenameWithoutPath>STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</FilenameWithoutPath>
+ <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</PathWithFileName>
+ <FilenameWithoutPath>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx
index c47d93256..7e4b4d263 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvprojx
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx
@@ -7,7 +7,7 @@
<Targets>
<Target>
- <TargetName>Lighting_Node</TargetName>
+ <TargetName>Lighting_Provisioner</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
@@ -16,14 +16,14 @@
<TargetCommonOption>
<Device>STM32WB55RGVx</Device>
<Vendor>STMicroelectronics</Vendor>
- <PackID>Keil.STM32WBxx_DFP.1.1.0</PackID>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
- <Cpu>IRAM(0x20000000,0x000040000) IROM(0x08000000,0x001000000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ESEL ELITTLE</Cpu>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
- <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</FlashDriverDll>
- <DeviceId>0</DeviceId>
- <RegisterFile>$$Device:STM32WB55RGVx$Drivers\CMSIS\Device\ST\STM32WBxx\Include\stm32wbxx.h</RegisterFile>
+ <FlashDriverDll></FlashDriverDll>
+ <DeviceId></DeviceId>
+ <RegisterFile></RegisterFile>
<MemoryEnv></MemoryEnv>
<Cmp></Cmp>
<Asm></Asm>
@@ -48,8 +48,8 @@
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
- <OutputDirectory>Lighting_Node\Exe\</OutputDirectory>
- <OutputName>BLE_MeshLightingNodeDemo</OutputName>
+ <OutputDirectory>Lighting_Provisioner\Exe\</OutputDirectory>
+ <OutputName>BLE_MeshLightingProvisionerDemo</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>
@@ -110,11 +110,11 @@
</CommonProperty>
<DllOption>
<SimDllName>SARMCM3.DLL</SimDllName>
- <SimDllArguments> -REMAP -MPU</SimDllArguments>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
<SimDlgDll>DCM.DLL</SimDlgDll>
<SimDlgDllArguments>-pCM4</SimDlgDllArguments>
<TargetDllName>SARMCM3.DLL</TargetDllName>
- <TargetDllArguments> -MPU</TargetDllArguments>
+ <TargetDllArguments>-MPU</TargetDllArguments>
<TargetDlgDll>TCM.DLL</TargetDlgDll>
<TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
</DllOption>
@@ -134,11 +134,11 @@
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
<Capability>1</Capability>
- <DriverSelection>4101</DriverSelection>
+ <DriverSelection>4096</DriverSelection>
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2CM3.DLL</Flash2>
- <Flash3></Flash3>
+ <Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
@@ -184,11 +184,12 @@
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
<useUlib>1</useUlib>
- <EndSel>1</EndSel>
+ <EndSel>0</EndSel>
<uLtcg>0</uLtcg>
<nSecure>0</nSecure>
<RoSelD>3</RoSelD>
@@ -243,13 +244,13 @@
</Ocm6>
<IRAM>
<Type>0</Type>
- <StartAddress>0x20000000</StartAddress>
- <Size>0x40000</Size>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
</IRAM>
<IROM>
<Type>1</Type>
<StartAddress>0x8000000</StartAddress>
- <Size>0x1000000</Size>
+ <Size>0x80000</Size>
</IROM>
<XRAM>
<Type>0</Type>
@@ -274,7 +275,7 @@
<OCR_RVCT4>
<Type>1</Type>
<StartAddress>0x8000000</StartAddress>
- <Size>0x1000000</Size>
+ <Size>0x80000</Size>
</OCR_RVCT4>
<OCR_RVCT5>
<Type>1</Type>
@@ -298,8 +299,8 @@
</OCR_RVCT8>
<OCR_RVCT9>
<Type>0</Type>
- <StartAddress>0x20000000</StartAddress>
- <Size>0x40000</Size>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
</OCR_RVCT9>
<OCR_RVCT10>
<Type>0</Type>
@@ -335,7 +336,7 @@
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
- <Define>USE_STM32WBXX_NUCLEO,STM32WB55xx,USE_HAL_DRIVER,CORE_CM4,STM32,ENABLE_USART,TRACE_ENABLE_NO_FUNCTION,SERVER</Define>
+ <Define>USE_STM32WBXX_NUCLEO,STM32WB55xx,USE_HAL_DRIVER,CORE_CM4,STM32,ENABLE_USART,TRACE_ENABLE_NO_FUNCTION,CLIENT,SERVER</Define>
<Undefine></Undefine>
<IncludePath>../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc;../Core/Inc;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../STM32_WPAN/app;../../../../../../Middlewares/ST/STM32_WPAN/ble;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc</IncludePath>
</VariousControls>
@@ -368,7 +369,7 @@
<TextAddressRange>0x08000000</TextAddressRange>
<DataAddressRange>0x20000000</DataAddressRange>
<pXoBase></pXoBase>
- <ScatterFile>stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
<IncludeLibs></IncludeLibs>
<IncludeLibsPath></IncludeLibsPath>
<Misc></Misc>
@@ -450,57 +451,6 @@
<FileName>appli_config_client.c</FileName>
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/appli_config_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
</File>
<File>
<FileName>appli_generic.c</FileName>
@@ -511,57 +461,6 @@
<FileName>appli_generic_client.c</FileName>
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/appli_generic_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
</File>
<File>
<FileName>appli_light.c</FileName>
@@ -572,57 +471,6 @@
<FileName>appli_light_client.c</FileName>
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/appli_light_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
</File>
<File>
<FileName>appli_light_lc.c</FileName>
@@ -818,57 +666,6 @@
<FileName>config_client.c</FileName>
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
</File>
<File>
<FileName>generic.c</FileName>
@@ -879,57 +676,6 @@
<FileName>generic_client.c</FileName>
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
</File>
<File>
<FileName>light.c</FileName>
@@ -940,57 +686,6 @@
<FileName>light_client.c</FileName>
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
</File>
<File>
<FileName>light_lc.c</FileName>
@@ -1145,11 +840,6 @@
<File>
<FileName>libBle_Mesh_CM4_Keil.lib</FileName>
<FileType>4</FileType>
- <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_Keil.lib</FilePath>
- </File>
- <File>
- <FileName>libBle_Mesh_CM4_Keil.lib</FileName>
- <FileType>4</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</FilePath>
</File>
</Files>
@@ -1158,9 +848,9 @@
<GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
<Files>
<File>
- <FileName>STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</FileName>
+ <FileName>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FileName>
<FileType>4</FileType>
- <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</FilePath>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilePath>
</File>
</Files>
</Group>
@@ -1177,7 +867,7 @@
<component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.1.2" condition="ARMv6_7_8-M Device">
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.4.0"/>
<targetInfos>
- <targetInfo name="Lighting_Node"/>
+ <targetInfo name="Lighting_Provisioner"/>
</targetInfos>
</component>
</components>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.c
new file mode 100644
index 000000000..e9b50f44e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.c
@@ -0,0 +1,109 @@
+/**
+ *******************************************************************************
+ * @file PWM_config.c
+ * @author BLE Mesh Team
+ * @brief Configuration file for PWM.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "PWM_config.h"
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+
+#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / 1000000) - 1)
+
+/**
+ *@brief Configure PWM sources and GPIO
+ *@retval None
+ */
+void PWM_Init()
+{
+ TIM_OC_InitTypeDef sConfigOC = {0};
+ TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+ /* GPIO Configuration */
+ GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+
+ /* Configure PWM pins */
+ GPIO_InitStructure.Pin = PWM0_PIN | PWM1_PIN;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Pull = GPIO_PULLUP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
+
+ /* Configure PWM pins */
+ GPIO_InitStructure.Pin = PWM2_PIN | PWM3_PIN | PWM4_PIN;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Pull = GPIO_PULLUP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure.Alternate = GPIO_AF1_TIM2;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ /* MFT Configuration */
+ HAL_NVIC_SetPriority((IRQn_Type)(TIM1_CC_IRQn), 15, 0);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TIM1_CC_IRQn));
+ HAL_NVIC_SetPriority((IRQn_Type)(TIM2_IRQn), 15, 0);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TIM2_IRQn));
+
+ htim1.Instance = TIM1;
+ htim1.Init.Prescaler = 0/*PRESCALER_VALUE*/;
+ htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim1.Init.Period = TIME_PERIOD;
+ htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ HAL_TIM_PWM_Init(&htim1);
+
+ htim2.Instance = TIM2;
+ htim2.Init.Prescaler = 0/*PRESCALER_VALUE*/;
+ htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim2.Init.Period = TIME_PERIOD;
+ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ HAL_TIM_PWM_Init(&htim2);
+
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+ HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
+ HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
+
+ sConfigOC.OCMode = TIM_OCMODE_PWM1;
+ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+ sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+ sConfigOC.Pulse = MFT1_TON_1;
+ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
+ sConfigOC.Pulse = MFT2_TON_1;
+ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
+ sConfigOC.Pulse = MFT1_TON_2;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
+ sConfigOC.Pulse = MFT2_TON_2;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
+ sConfigOC.Pulse = MFT2_TON_3;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
+
+ /* Start channel 1 */
+ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);
+ /* Start channel 2 */
+ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_2);
+ /* Start channel 1 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
+ /* Start channel 2 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_2);
+ /* Start channel 3 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_3);
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.h
new file mode 100644
index 000000000..a229ec666
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_config.h
@@ -0,0 +1,69 @@
+/******************** (C) COPYRIGHT 2015 STMicroelectronics ********************
+* File Name : PWM/PWM_config.c
+* Author : SNM Application Team
+* Version : V1.0.0
+* Date : September-2015
+* Description : Configuration file for PWM
+********************************************************************************
+* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+#include "mesh_cfg_usr.h"
+
+/* Macros defined for the number of PWM Provided */
+#define PWM0 0
+#define PWM1 1
+#define PWM2 2
+#define PWM3 3
+#define PWM4 4
+
+/************************************************************************/
+
+/*STM32WB
+ * This configuration given below is for the STM32WB board.
+ * Here user has selected the PWM0 in SERIAL2_MODE and PWM1 in SERIAL1_MODE.
+ * User can configure software PWM to any of the GPIO which are not used for
+ * hardware PWM.
+*/
+/* PWM pins for MFT1 and MFT2 respectively */
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+
+#define PWM0_PIN GPIO_PIN_14 /* TIM1_CH1 AF1 */
+#define PWM1_PIN GPIO_PIN_15 /* TIM1_CH2 AF1 */
+
+/* GPIOs pins (SOFTWARE PWM) used to output a PWM signal */
+#define PWM2_PIN GPIO_PIN_0 /* TIM2_CH1 AF1 */
+#define PWM3_PIN GPIO_PIN_1 /* TIM2_CH2 AF1 */
+#define PWM4_PIN GPIO_PIN_2 /* TIM2_CH3 AF1 */
+#endif
+/************************************************************************/
+
+#define TIME_PERIOD 32000
+
+/* TIM1 Channel 1 Timer Ton and T0ff (ticks number) PWM0*/
+#define MFT1_TON_1 (12000 - 1)
+#define MFT1_TOFF_1 (20000 - 1)
+
+/* TIM1 Channel 2 Timer 1 Ton and T0ff (ticks number) PWM1*/
+#define MFT2_TON_1 (8000 - 1 )
+#define MFT2_TOFF_1 (24000 - 1)
+
+/* TIM2 Channel 1 Timer 2 Ton and T0ff (ticks number) PWM2*/
+#define MFT1_TON_2 (16000 - 1)
+#define MFT1_TOFF_2 (16000 -1)
+
+/* TIM2 Channel 2 Timer 2 Ton and T0ff (ticks number) PWM3*/
+#define MFT2_TON_2 (4000 - 1)
+#define MFT2_TOFF_2 (28000 - 1)
+
+/* TIM2 Channel 3 Timer 2 Ton and T0ff (ticks number) PWM4*/
+#define MFT2_TON_3 (4000 - 1)
+#define MFT2_TOFF_3 (28000 - 1)
+
+void PWM_Init(void);
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.c
new file mode 100644
index 000000000..698bdced8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.c
@@ -0,0 +1,300 @@
+/**
+********************************************************************************
+* @file PWM_handlers.c
+* @author BLE Mesh Team
+* @version V1.0.0
+* @date 31-July-2018
+* @brief Handlers for PWM and other support functions.
+********************************************************************************
+* @attention
+*
+*<h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "app_conf.h"
+#include "PWM_handlers.h"
+#include "mesh_cfg_usr.h"
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+
+/* Global Variables */
+uint16_t DUTY;
+int NonZeroPWM0=0;
+int NonZeroPWM1=0;
+uint8_t Duty_flag_A = 0;
+uint16_t PWM0_on,
+ PWM1_on,
+ PWM2_on = MFT1_TON_2, /* Timer2, MFT1 */
+ PWM3_on = MFT2_TON_2, /* Timer2, MFT2 */
+ PWM4_on = MFT2_TON_3; /* Timer2, MFT2 */
+
+uint32_t channel = PWM3_PIN; /* It is the channel with initial lowest duty-cycle */
+uint32_t period = TIME_PERIOD; /* Period in ticks of the PWM signal */
+uint8_t channel_number = 0;
+
+uint32_t PWM_channels[] = {PWM3_PIN, PWM4_PIN}; /* Channels managed by MFT2 Timer 2 */
+uint16_t Ton_values[] = {MFT2_TON_2, MFT2_TON_3}; /* Sorted array containing duty-cycle values
+ respectively for PWM3_PIN and PWM4_PIN */
+uint16_t delta_1 = MFT2_TON_3 - MFT2_TON_2; /* Delta between the first two duty-cycles */
+uint16_t delta = MFT2_TON_3 - MFT2_TON_2;
+
+int number_of_channels = 2; /* Number of channels managed by MFT2 Timer 2 */
+int max_duty = MFT2_TON_3; /* Maximum duty-cycle */
+
+/**
+ *@brief PWM2 handler
+ *@retval None
+ */
+void PWM2_handler()
+{
+ if(__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1) > 0)
+ {
+ __HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC1);
+ if(Duty_flag_A == 1)
+ {
+ HAL_GPIO_WritePin(GPIOA, PWM2_PIN, GPIO_PIN_SET);
+ Duty_flag_A = 0;
+ htim1.Instance->CCR1 = PWM2_on;
+ }
+ else
+ {
+ HAL_GPIO_WritePin(GPIOA, PWM2_PIN, GPIO_PIN_RESET);
+ Duty_flag_A = 1;
+ htim1.Instance->CCR1 = TIME_PERIOD - PWM2_on;
+ }
+ }
+}
+
+/**
+ *@brief PWM3 and PWM4 handler
+ *@retval None
+ */
+void PWM3_PWM4_handler()
+{
+ /*STATE 0
+ if delta != 0, there is a channel with a duty lower than the other one.
+ So the channel with the lower duty is cleared. Delta is period - max_duty
+ (the duty of the other channel)
+ The machine passes to STATE 1.
+
+ if delta == 0, the two channel are cleared together.
+ The machine passes to STATE 2
+
+ The delta is computed for the next timer event*/
+
+ if (channel_number < number_of_channels - 1)
+ {
+ if (delta != 0)
+ {
+// HAL_GPIO_WritePin(GPIOA, channel, GPIO_PIN_RESET);
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number ++;
+ delta = period - max_duty; /*computed delta for the next reset of the counter*/
+ channel = PWM_channels[channel_number];
+ }
+ else
+ {
+// HAL_GPIO_WritePin(GPIOA, PWM3_PIN |PWM4_PIN, GPIO_PIN_RESET);
+ delta = period - max_duty;
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number = number_of_channels;
+ }
+ }
+ /*STATE 1
+ Here the channel with the max duty-cycle is cleared. The delta is that one
+ computed in STATE 0. The machine passes to STATE 2 */
+ else if (channel_number == number_of_channels - 1)
+ {
+// HAL_GPIO_WritePin(GPIOA, channel, GPIO_PIN_RESET);
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number ++;
+ }
+ /*STATE 2
+ All the channels have been cleared and now are set again. The machine passes to STATE 0 */
+ else
+ { /* channel_number > number_of_channels - 1 */
+ HAL_GPIO_WritePin(GPIOA, PWM3_PIN | PWM4_PIN, GPIO_PIN_SET);
+ htim2.Instance->CCR2 = Ton_values[0] - 1;
+ htim2.Instance->CCR3 = Ton_values[1] - 1;
+ Ton_sorting();
+ channel_number = 0;
+ delta = Ton_values[1] - Ton_values[0];
+ channel = PWM_channels[0];
+ }
+}
+
+/**
+ *@brief Sorting on basis of duty cycle
+ *@retval None
+ */
+
+void Ton_sorting(void)
+{
+ if (PWM3_on > PWM4_on)
+ {
+ max_duty = PWM3_on;
+ Ton_values[1] = PWM3_on;
+ Ton_values[0] = PWM4_on;
+ PWM_channels[1] = PWM3_PIN;
+ PWM_channels[0] = PWM4_PIN;
+ }
+ else
+ {
+ max_duty = PWM4_on;
+ Ton_values[0] = PWM3_on;
+ Ton_values[1] = PWM4_on;
+ PWM_channels[0] = PWM3_PIN;
+ PWM_channels[1] = PWM4_PIN;
+ }
+}
+
+
+/**
+ *@brief PWM modification
+ *@param PWM_ID: PWM number
+ *@param duty_cycle: Duty cycle at output
+ *@retval None
+ */
+void Modify_PWM(uint8_t PWM_ID, uint16_t duty_cycle)
+{
+#if ( CFG_LPM_SUPPORTED == 0)
+ GPIO_InitTypeDef GPIO_InitStructure1 = {0};
+
+ if (PWM_ID == 0) /* PD14 */
+ {
+ if (duty_cycle == 0 && NonZeroPWM0 == 0)
+ {
+ GPIO_InitStructure1.Pin = PWM0_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStructure1.Pull = GPIO_NOPULL;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+ HAL_GPIO_WritePin(GPIOD, PWM0_PIN, GPIO_PIN_RESET);
+
+ NonZeroPWM0=1;
+ }
+ else if ((duty_cycle != 0 && NonZeroPWM0 == 1))
+ {
+ GPIO_InitStructure1.Pin = PWM0_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure1.Pull = GPIO_PULLUP;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure1.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+
+ NonZeroPWM0=0;
+ }
+ }
+ else if((PWM_ID == 1)) /* GPIO3 */
+ {
+ if (duty_cycle == 0 && NonZeroPWM1 == 0)
+ {
+ GPIO_InitStructure1.Pin = PWM1_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStructure1.Pull = GPIO_NOPULL;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+ HAL_GPIO_WritePin(GPIOD, PWM1_PIN, GPIO_PIN_RESET);
+
+ NonZeroPWM1=1;
+ }
+ else if ((duty_cycle != 0 && NonZeroPWM1 == 1))
+ {
+ GPIO_InitStructure1.Pin = PWM1_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure1.Pull = GPIO_PULLUP;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure1.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+
+ NonZeroPWM1=0;
+ }
+ }
+ else
+ {
+ }
+
+ DUTY = duty_cycle;
+ switch (PWM_ID)
+ {
+ case 0: /* PWM0 */
+ {
+ htim1.Instance->CCR1 = DUTY;
+ }
+ break;
+ case 1: /* PWM1 */
+ {
+ htim1.Instance->CCR2 = DUTY;
+ }
+ break;
+ case 2: /* PWM2 */
+ {
+ PWM2_on = DUTY;
+ htim2.Instance->CCR1 = PWM2_on;
+ }
+ break;
+ case 3: /* PWM3 */
+ {
+ PWM3_on = DUTY;
+ htim2.Instance->CCR2 = PWM3_on;
+ }
+ break;
+ case 4: /* PWM4 */
+ {
+ PWM4_on = DUTY;
+ htim2.Instance->CCR3 = PWM4_on;
+ }
+ break;
+ }
+#endif
+}
+
+/**
+ * @brief Period elapsed callback in non blocking mode
+ * @param htim : TIM handle
+ * @retval None
+ */
+void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
+{
+#if 0
+ if(htim->Instance == TIM1)
+ PWM2_handler();
+ else
+ PWM3_PWM4_handler();
+#endif
+}
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.h
new file mode 100644
index 000000000..a27fa757b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/PWM_handlers.h
@@ -0,0 +1,35 @@
+/**
+ ******************************************************************************
+ * @file PWM/PWM_handlers.c
+* @author SNM Application Team
+* @version V1.0.0
+* @date September-2015
+ * @brief Handlers for PWM and other support functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ ******************************************************************************
+ */
+
+#include "PWM_config.h"
+//#include "SDK_EVAL_Config.h"
+
+/* PWM2 handler */
+void PWM2_handler(void);
+
+/* PWM3 and PWM4 handler */
+void PWM3_PWM4_handler(void);
+
+/* Here the channel with the lower duty-cycle is established*/
+void Ton_sorting(void);
+
+/* Handle modifications in duty cycle */
+void Modify_PWM(uint8_t PWM_ID, uint16_t duty_cycle);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.c
new file mode 100644
index 000000000..4e329c048
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.c
@@ -0,0 +1,661 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.c
+ * @author MCD Application Team
+ * @brief BLE Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+
+#include "stm32_seq.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "mesh_cfg.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+
+/**
+ * security parameters structure
+ */
+typedef struct _tSecurityParams
+{
+ /**
+ * IO capability of the device
+ */
+ uint8_t ioCapability;
+
+ /**
+ * Authentication requirement of the device
+ * Man In the Middle protection required?
+ */
+ uint8_t mitm_mode;
+
+ /**
+ * bonding mode of the device
+ */
+ uint8_t bonding_mode;
+
+ /**
+ * Flag to tell whether OOB data has
+ * to be used during the pairing process
+ */
+ uint8_t OOB_Data_Present;
+
+ /**
+ * OOB data to be used in the pairing process if
+ * OOB_Data_Present is set to TRUE
+ */
+ uint8_t OOB_Data[16];
+
+ /**
+ * this variable indicates whether to use a fixed pin
+ * during the pairing process or a passkey has to be
+ * requested to the application during the pairing process
+ * 0 implies use fixed pin and 1 implies request for passkey
+ */
+ uint8_t Use_Fixed_Pin;
+
+ /**
+ * minimum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMin;
+
+ /**
+ * maximum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMax;
+
+ /**
+ * fixed pin to be used in the pairing process if
+ * Use_Fixed_Pin is set to 1
+ */
+ uint32_t Fixed_Pin;
+
+ /**
+ * this flag indicates whether the host has to initiate
+ * the security, wait for pairing or does not have any security
+ * requirements.\n
+ * 0x00 : no security required
+ * 0x01 : host should initiate security by sending the slave security
+ * request command
+ * 0x02 : host need not send the clave security request but it
+ * has to wait for paiirng to complete before doing any other
+ * processing
+ */
+ uint8_t initiateSecurity;
+}tSecurityParams;
+
+/**
+ * global context
+ * contains the variables common to all
+ * services
+ */
+typedef struct _tBLEProfileGlobalContext
+{
+
+ /**
+ * security requirements of the host
+ */
+ tSecurityParams bleSecurityParam;
+
+ /**
+ * gap service handle
+ */
+ uint16_t gapServiceHandle;
+
+ /**
+ * device name characteristic handle
+ */
+ uint16_t devNameCharHandle;
+
+ /**
+ * appearance characteristic handle
+ */
+ uint16_t appearanceCharHandle;
+
+ /**
+ * connection handle of the current active connection
+ * When not in connection, the handle is set to 0xFFFF
+ */
+ uint16_t connectionHandle;
+
+ /**
+ * length of the UUID list to be used while advertising
+ */
+ uint8_t advtServUUIDlen;
+
+ /**
+ * the UUID list to be used while advertising
+ */
+ uint8_t advtServUUID[100];
+
+}BleGlobalContext_t;
+
+typedef struct
+{
+ BleGlobalContext_t BleApplicationContext_legacy;
+ APP_BLE_ConnStatus_t Device_Connection_Status;
+ /**
+ * ID of the Advertising Timeout
+ */
+ uint8_t Advertising_mgr_timer_Id;
+
+} BleApplicationContext_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define APPBLE_GAP_DEVICE_NAME_LENGTH 7
+#define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
+#define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
+
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* USER CODE BEGIN PD */
+#define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
+
+uint8_t Test_Status =0x00;
+
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+{
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+};
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Extern function prototypes -----------------------------------------------*/
+extern void HCI_Event_CB(void *pckt);
+
+/* Global variables ----------------------------------------------------------*/
+const uint8_t *bd_addr;
+
+/* Private function prototypes -----------------------------------------------*/
+static void BLE_UserEvtRx( void * pPayload );
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
+static void Ble_Tl_Init( void );
+static void Ble_Hci_Gap_Gatt_Init(void);
+static const uint8_t* BleGetBdAddress( void );
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init_1 */
+
+/* USER CODE END APP_BLE_Init_1 */
+ SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet =
+ {
+ {{0,0,0}}, /**< Header unused */
+ {0, /** pBleBufferAddress not used */
+ 0, /** BleBufferSize not used */
+ CFG_BLE_NUM_GATT_ATTRIBUTES,
+ CFG_BLE_NUM_GATT_SERVICES,
+ CFG_BLE_ATT_VALUE_ARRAY_SIZE,
+ CFG_BLE_NUM_LINK,
+ CFG_BLE_DATA_LENGTH_EXTENSION,
+ CFG_BLE_PREPARE_WRITE_LIST_SIZE,
+ CFG_BLE_MBLOCK_COUNT,
+ CFG_BLE_MAX_ATT_MTU,
+ CFG_BLE_SLAVE_SCA,
+ CFG_BLE_MASTER_SCA,
+ CFG_BLE_LSE_SOURCE,
+ CFG_BLE_MAX_CONN_EVENT_LENGTH,
+ CFG_BLE_HSE_STARTUP_TIME,
+ CFG_BLE_VITERBI_MODE,
+ CFG_BLE_LL_ONLY,
+ 0}
+ };
+
+ /**
+ * Initialize Ble Transport Layer
+ */
+ Ble_Tl_Init( );
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+
+ /**
+ * Do not allow stop mode in the application
+ */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+#endif
+
+ /**
+ * Register the hci transport layer to handle BLE User Asynchronous Events
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, hci_user_evt_proc);
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ /**
+ * Initialization of HCI & GATT & GAP layer
+ */
+ Ble_Hci_Gap_Gatt_Init();
+
+ /**
+ * Initialization of the BLE Services
+ */
+ SVCCTL_Init();
+
+ /**
+ * Initialization of the BLE App Context
+ */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
+
+ /*Radio mask Activity*/
+#if(RADIO_ACTIVITY_EVENT != 0)
+ aci_hal_set_radio_activity_mask(0x00FF);
+#endif
+
+ BleApplicationContext.Device_Connection_Status = APP_BLE_FAST_ADV;
+
+/* USER CODE BEGIN APP_BLE_Init_2 */
+
+/* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
+{
+ HCI_Event_CB(pckt);
+
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+
+ return (SVCCTL_UserEvtFlowEnable);
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Ble_Tl_Init( void )
+{
+ HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
+
+ Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
+ Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
+ hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
+
+ return;
+}
+
+static void Ble_Hci_Gap_Gatt_Init(void){
+
+ uint8_t role;
+ uint8_t index;
+ uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
+ const uint8_t *bd_addr;
+ uint32_t srd_bd_addr[2];
+#ifndef BLE_CFG_MESH
+ const uint8_t mode = BLE_CFG_DATA_ROLE_MODE;
+#endif
+ uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
+
+ /**
+ * Initialize HCI layer
+ */
+ /*HCI Reset to synchronise BLE Stack*/
+ hci_reset();
+
+ /**
+ * Write the BD Address
+ */
+
+ bd_addr = BleGetBdAddress();
+ aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
+ CONFIG_DATA_PUBADDR_LEN,
+ (uint8_t*) bd_addr);
+
+ /**
+ * Static random Address
+ * The two upper bits shall be set to 1
+ * The lowest 32bits is read from the UDN to differentiate between devices
+ * The RNG may be used to provide a random number on each power on
+ */
+ srd_bd_addr[1] = 0x0000ED6E;
+ srd_bd_addr[0] = LL_FLASH_GetUDN( );
+ aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
+
+#ifndef BLE_CFG_MESH
+ /**
+ * Write the Role
+ */
+ aci_hal_write_config_data(CONFIG_DATA_ROLE,
+ CONFIG_DATA_ROLE_LEN,
+ (uint8_t*) &mode);
+#endif
+
+ /**
+ * Set TX Power to 0dBm.
+ */
+ aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+
+ /**
+ * Initialize GATT interface
+ */
+ aci_gatt_init();
+
+ /**
+ * Initialize GAP interface
+ */
+ role = 0;
+
+#if (BLE_CFG_PERIPHERAL == 1)
+ role |= GAP_PERIPHERAL_ROLE;
+#endif
+
+#if (BLE_CFG_CENTRAL == 1)
+ role |= GAP_CENTRAL_ROLE;
+#endif
+
+#ifdef BLE_CFG_MESH
+#if (BLE_CFG_BROADCASTER == 1)
+ role |= GAP_BROADCASTER_ROLE;
+#endif
+
+#if (BLE_CFG_OBSERVER == 1)
+ role |= GAP_OBSERVER_ROLE;
+#endif
+#endif
+
+ if (role > 0)
+ {
+ const char *name = "STM32WB";
+ aci_gap_init(role, 0,
+ APPBLE_GAP_DEVICE_NAME_LENGTH,
+ &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
+
+ if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
+ {
+ BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
+ }
+ }
+
+ if(aci_gatt_update_char_value(gap_service_handle,
+ gap_appearance_char_handle,
+ 0,
+ 2,
+ (uint8_t *)&appearance))
+ {
+ BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
+ }
+/**
+ * Initialize Default PHY
+ */
+ hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
+
+ /**
+ * Initialize IO capability
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
+ aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
+
+ /**
+ * Initialize authentication
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = 0;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = 8;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = 16;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = 1;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = 111111;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 1;
+ for (index = 0; index < 16; index++)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
+ }
+
+ aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
+ 0,
+ 0,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
+ 0
+ );
+
+ /**
+ * Initialize whitelist
+ */
+ if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
+ {
+ aci_gap_configure_whitelist();
+ }
+}
+
+const uint8_t* BleGetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTION */
+
+/* USER CODE END FD_LOCAL_FUNCTION */
+
+/*************************************************************
+ *
+ *SPECIFIC FUNCTIONS
+ *
+ *************************************************************/
+/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
+
+/* USER CODE END FD_SPECIFIC_FUNCTIONS */
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void hci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+#if (LOW_POWER_FEATURE == 1)
+static volatile uint8_t HciResponse = 0;
+#endif
+
+void hci_cmd_resp_release(uint32_t flag)
+{
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+#else
+ HciResponse = 1;
+#endif
+ return;
+}
+
+void hci_cmd_resp_wait(uint32_t timeout)
+{
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+#else
+ while(HciResponse == 0);
+ HciResponse = 0;
+#endif
+ return;
+}
+
+static void BLE_UserEvtRx( void * pPayload )
+{
+ SVCCTL_UserEvtFlowStatus_t svctl_return_status;
+ tHCI_UserEvtRxParam *pParam;
+
+ pParam = (tHCI_UserEvtRxParam *)pPayload;
+
+ svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
+ if (svctl_return_status != SVCCTL_UserEvtFlowDisable)
+ {
+ pParam->status = HCI_TL_UserEventFlow_Enable;
+ }
+ else
+ {
+ pParam->status = HCI_TL_UserEventFlow_Disable;
+ }
+}
+
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status )
+{
+ uint32_t task_id_list;
+ switch (status)
+ {
+ case HCI_TL_CmdBusy:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_PauseTask(task_id_list);
+
+ break;
+
+ case HCI_TL_CmdAvailable:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_ResumeTask(task_id_list);
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+void SVCCTL_ResumeUserEventFlow( void )
+{
+ hci_resume_flow();
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.h
new file mode 100644
index 000000000..d87d3e466
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.h
@@ -0,0 +1,79 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.h
+ * @author MCD Application Team
+ * @brief Header for ble application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_BLE_H
+#define APP_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "hci_tl.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+typedef enum
+{
+ APP_BLE_IDLE,
+ APP_BLE_FAST_ADV,
+ APP_BLE_LP_ADV,
+ APP_BLE_SCAN,
+ APP_BLE_LP_CONNECTING,
+ APP_BLE_CONNECTED_SERVER,
+ APP_BLE_CONNECTED_CLIENT
+} APP_BLE_ConnStatus_t;
+
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+void APP_BLE_Init( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*APP_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.c
new file mode 100644
index 000000000..0ab8a8578
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.c
@@ -0,0 +1,1981 @@
+/**
+ ******************************************************************************
+ * @file appli_config_client.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Config CLient Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "config_client.h"
+#include "appli_config_client.h"
+#include "appli_mesh.h"
+#include "sensors.h"
+#include "light_lc.h"
+#include "vendor.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+
+#define DEFAULT_GROUP_ADDR 0xC000
+#define DEFAULT_PUBLISH_ADDR 0xC000
+#define DEFAULT_NETKEY_INDEX 0x0000
+#define DEFAULT_APPKEY_INDEX 0x0000
+#define DEFAULT_CREDENTIAL_FLAG 0x00
+#define DEFAULT_PUBLISH_TTL 0x08
+#define DEFAULT_PUBLISH_PERIOD 0x00
+#define DEFAULT_PUBLISH_RETRANSMIT_COUNT 0x00
+#define DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS 0x00
+
+#define NUM_VENDOR_MODELS_TO_SUBSCRIBE 0
+#define NUM_VENDOR_MODELS_TO_PUBLISH 0
+#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+
+const MOBLEUINT8 aConfigAppKeyDefault[19]=
+ { /* NetKeyIndexAndAppKeyIndex : 3B
+ Index of the NetKey and index of the AppKey*/
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
+ (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff),
+ /* AppKey is initialised as below = 16B */
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 };
+
+
+const MOBLEUINT8 aConfigAppKeyDeleteDefault[3]=
+ { /* NetKeyIndexAndAppKeyIndex : 3B
+ Index of the NetKey and index of the AppKey*/
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
+ (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff)};
+
+
+const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
+ { /* NetKeyIndex : 2B
+ Index of the NetKey */
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) };
+
+const MOBLEUINT8 aNoParamDefaultConfig;
+
+const MOBLEUINT8 aNoInitParamDefault[MAX_CONFIG_PARAM_SIZE]= {0};
+
+/* Private macro -------------------------------------------------------------*/
+#ifndef CONFIGURE_AS_PER_COMPOSITION_DATA
+MOBLEUINT16 aSigModelsToBind[][MAX_ELEMENTS_PER_NODE] = {
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ }
+};
+#endif
+
+MOBLEUINT16 aPublishModels[] =
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+// SENSOR_SERVER_MODEL_ID,
+// LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+// LIGHT_MODEL_SERVER_LC_MODEL_ID
+};
+
+MOBLEUINT16 aSubscribeModels[] =
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+// LIGHT_MODEL_SERVER_LC_MODEL_ID
+};
+
+const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[] = {
+ /* MOBLEUINT16 opcode,
+ MOBLEUINT8 min_payload_size,
+ MOBLEUINT8 max_payload_size;
+ Here in this array, Handler is not defined; */
+
+ /* 4.3.2.37 Config AppKey Add, Opcode = 0x00
+ The Config AppKey Add is an acknowledged message used to add an AppKey
+ to the AppKey List on a node and bind it to the NetKey identified by
+ NetKeyIndex. The added AppKey can be used by the node only as a pair with
+ the specified NetKey.
+ The AppKey is used to authenticate and decrypt messages it receives, as well
+ as authenticate and encrypt messages it sends.
+ The response to a Config AppKey Add message is a Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex: 3B : Index of the NetKey and index of the AppKey
+ AppKey 16B : AppKey value */
+ { OPCODE_CONFIG_APPKEY_ADD, 19, 19, aConfigAppKeyDefault },
+
+ /* 4.3.2.39 Config AppKey Delete, Opcode = 0x80 0x00
+ The Config AppKey Delete is an acknowledged message used to delete an
+ AppKey from the AppKey List on a node.
+ The response to a Config AppKey Delete message is a
+ Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex : 3B : Index of the NetKey and index of the AppKey
+ */
+ { OPCODE_CONFIG_APPKEY_DELETE, 3, 3, aConfigAppKeyDeleteDefault },
+
+ /* 4.3.2.41 Config AppKey Get, Opcode = 0x80 0x01
+ The AppKey Get is an acknowledged message used to report all AppKeys bound
+ to the NetKey.
+ The response to a Config AppKey Get message is a Config AppKey List message */
+ { OPCODE_CONFIG_APPKEY_GET, 2, 2, aConfigAppKeyGetDefault },
+
+ /* 4.3.2.38 Config AppKey Update, Opcode = 0x01
+ The Config AppKey Update is an acknowledged message used to update an
+ AppKey value on the AppKey List on a node. The updated AppKey is used by
+ the node to authenticate and decrypt messages it receives, as well as
+ authenticate and encrypt messages it sends, as defined by the Key Refresh procedure (see Section 3.10.4).
+ The response to an Config AppKey Update message is an Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex: 3B : Index of the NetKey and index of the AppKey
+ AppKey 16B : AppKey value */
+ { OPCODE_CONFIG_APPKEY_UPDATE, 19, 19, aConfigAppKeyDefault },
+
+ /* 4.3.2.1 Config Beacon Get, Opcode = 0x80 0x09
+ The Config Beacon Get is an acknowledged message used to get the current
+ Secure Network Beacon state of a node (see Section 4.2.10).
+ The response to a Config Beacon Get message is a Config Beacon Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_BEACON_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.2 Config Beacon Set, Opcode = 0x80 0x0A
+ The Config Beacon Set is an acknowledged message used to set the
+ Secure Network Beacon state of a node (see Section 4.2.10).
+ The response to a Config Beacon Set message is a Config Beacon Status message.
+ Beacon : 1B: New Secure Network Beacon state*/
+ { OPCODE_CONFIG_BEACON_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.4 Config Composition Data Get, Opcode = 0x80 0x08
+ The Config Composition Data Get is an acknowledged message used to read
+ one page of the Composition Data (see Section 4.2.1).
+ The response to a Config Composition Data Get message is a
+ Config Composition Data Status message.
+ Page : 1B : Page number of the Composition Data */
+ { OPCODE_CONFIG_COMPOSITION_DATA_GET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.16 Config Model Publication Set, Opcode = 0x03
+ The Config Model Publication Set is an acknowledged message used to set the
+ Model Publication state (see Section 4.2.2) of an outgoing message that
+ originates from a model.
+ The response to a Config Model Publication Set message is a
+ Config Model Publication Status message.
+ The Config Model Publication Set message uses a single octet opcode to
+ maximize the size of a payload.
+
+ ElementAddress : 16b : Address of the element
+ PublishAddress : 16b : Value of the publish address
+ AppKeyIndex : 12b : Index of the application key
+ CredentialFlag : 1b : Value of the Friendship Credential Flag
+ RFU : 3b : Reserved for Future Use
+ PublishTTL : 8b : Default TTL value for the outgoing messages
+ PublishPeriod : 8b : Period for periodic status publishing
+ PublishRetransmitCount : 3b : Number of retransmissions for each published message
+ PublishRetransmitIntervalSteps : 5b: Number of 50-millisecond steps between retransmissions
+ ModelIdentifier: 16 or 32b: SIG Model ID or Vendor Model ID
+ */
+
+ { OPCODE_CONFIG_CONFIG_MODEL_PUBLICATION_SET, 11, 13, },
+
+ /* 4.3.2.6 Config Default TTL Get, Opcode = 0x80 0x0C
+ The Config Default TTL Get is an acknowledged message used to get the
+ current Default TTL state of a node.
+ The response to a Config Default TTL Get message is a Config Default TTL Status message.
+ There are no Parameters for this message.
+ */
+ { OPCODE_CONFIG_DEFAULT_TTL_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.7 Config Default TTL Set, Opcode = 0x80 0x0D
+ The Config Default TTL Set is an acknowledged message used to set the
+ Default TTL state of a node (see Section 4.2.7).
+ The response to a Config Default TTL Set message is a
+ Config Default TTL Status message.
+ TTL : 1B : New Default TTL value*/
+ { OPCODE_CONFIG_DEFAULT_TTL_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.55 Config Friend Get, Opcode = 0x80 0x0F
+ The Config Friend Get is an acknowledged message used to get the current
+ Friend state of a node (see Section 4.2.13).
+ The response to a Config Friend Get message is a Config Friend Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_FRIEND_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.56 Config Friend Set, Opcode = 0x80 0x10
+ The Config Friend Set is an acknowledged message used to set the
+ Friend state of a node (see Section 4.2.13).
+ The response to a Config Friend Set message is a Config Friend Status message.
+ Friend : 1B : New Friend state */
+ { OPCODE_CONFIG_FRIEND_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.9 Config GATT Proxy Get, Opcode = 0x80 0x12
+ The Config GATT Proxy Get is an acknowledged message used to get the
+ current GATT Proxy state of a node (see Section 4.2.11).
+ The response to a Config GATT Proxy Get message is a
+ Config GATT Proxy Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_GATT_PROXY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.10 Config GATT Proxy Set, Opcode = 0x80 0x12
+ The Config GATT Proxy Set is an acknowledged message used to set the
+ GATT Proxy state of a node (see Section 4.2.11).
+ The response to a Config GATT Proxy Set message is a Config GATT Proxy
+ Status message
+ GATTProxy : 1B : New GATT Proxy state */
+ { OPCODE_CONFIG_GATT_PROXY_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.61 Config Heartbeat Publication Get, Opcode = 0x80 0x38
+ The Config Heartbeat Publication Get is an acknowledged message used to get
+ the current Heartbeat Publication state of an element (see Section 4.2.17).
+ The response to a Config Heartbeat Publication Get message is a
+ Config Heartbeat Publication Status message.
+ The message has no parameters.*/
+ { OPCODE_CONFIG_HEARTBEAT_PUBLICATION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.62 Config Heartbeat Publication Set, Opcode = 0x80 0x39
+ The Config Heartbeat Publication Set is an acknowledged message used to set
+ the current Heartbeat Publication state of an element (see Section 4.2.17).
+ The response to a Config Heartbeat Publication Set message is a
+ Config Heartbeat Publication Status message.
+
+ Destination : 2B : Destination address for Heartbeat messages
+ CountLog : 1B : Number of Heartbeat messages to be sent
+ PeriodLog : 1B : Period for sending Heartbeat messages
+ TTL : 1B : TTL to be used when sending Heartbeat messages
+ Features : 2B : Bit field indicating features that trigger Heartbeat messages when changed
+ NetKeyIndex : 2B : NetKey Index
+ */
+ { OPCODE_CONFIG_HEARTBEAT_PUBLICATION_SET, 9, 9, aNoInitParamDefault },
+
+ /* 4.3.2.64 Config Heartbeat Subscription Get, Opcode = 0x80 0x3A
+ The Config Heartbeat Subscription Get is an acknowledged message used to get
+ the current Heartbeat Subscription state of an element (see Section 4.2.18).
+ The response to a Config Heartbeat Subscription Get message is a
+ Config Heartbeat Subscription Status message.
+ The message has no parameters. */
+ { OPCODE_CONFIG_HEARTBEAT_SUBSCRIPTION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.65 Config Heartbeat Subscription Set, Opcode = 0x80 0x3B
+ The Config Heartbeat Subscription Set is an acknowledged message used to
+ set the current Heartbeat Subscription state of an element (see Section 4.2.18).
+ The response to a Config Heartbeat Subscription Set message is a
+ Config Heartbeat Subscription Status message.
+
+ Source : 2B : Source address for Heartbeat messages
+ Destination : 2B : Destination address for Heartbeat messages
+ PeriodLog : 1B : Period for receiving Heartbeat messages */
+ { OPCODE_CONFIG_HEARTBEAT_SUBSCRIPTION_SET, 5, 5, aNoInitParamDefault },
+
+ /* 4.3.2.58 Config Key Refresh Phase Get, Opcode = 0x80 0x15
+ The Config Key Refresh Phase Get is an acknowledged message used to get the
+ current Key Refresh Phase state of the identified network key.
+ The response to a Config Key Refresh Phase Get message is a
+ Config Key Refresh Phase Status message.
+ NetKeyIndex : 2B : NetKey Index*/
+ { OPCODE_CONFIG_KEY_REFRESH_PHASE_GET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.59 Config Key Refresh Phase Set, Opcode = 0x80 0x16
+ The Config Key Refresh Phase Set is an acknowledged message used to set the
+ Key Refresh Phase state of the identified network key (see Section 4.2.14).
+ The response to a Config Key Refresh Phase Set message is a
+ Config Key Refresh Phase Status message.
+
+ NetKeyIndex : 2B : NetKey Index
+ Transition : 1B : New Key Refresh Phase Transition */
+ { OPCODE_CONFIG_KEY_REFRESH_PHASE_SET, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.2.67 Config Low Power Node PollTimeout Get, Opcode = 0x80 0x2D
+ The Config Low Power Node PollTimeout Get is an acknowledged message used
+ to get the current value of PollTimeout timer of the Low Power node within
+ a Friend node (see Section 3.6.6.1). The message is sent to a Friend node
+ that has claimed to be handling messages by sending ACKs On Behalf Of (OBO)
+ the indicated Low Power node. This message should only be sent to a node
+ that has the Friend feature supported and enabled.
+ The response to a Config Low Power Node PollTimeout Get message is a
+ Config Low Power Node PollTimeout Status message.
+
+ LPNAddress : 2B : The unicast address of the Low Power node */
+ { OPCODE_CONFIG_LOW_POWER_NODE_POLLTIMEOUT_GET, 2, 2, aNoInitParamDefault },
+
+
+ /* 4.3.3.12 Health Attention Get
+ The Health Attention Get is an acknowledged message used to get the current
+ Attention Timer state of an element (see Section 4.2.9).
+ The response to a Health Attention Get message is an Attention Status message.
+ There are no Parameters for this message.*/
+ { OPCODE_HEALTH_ATTENTION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.3.13 Health Attention Set
+ The Health Attention Set is an acknowledged message used to set the
+ Attention Timer state of an element (see Section 4.2.9).
+ The response to a Health Attention Set message is a
+ Health Attention Status message
+ Attention: 1B: Value of the Attention Timer state*/
+ { OPCODE_HEALTH_ATTENTION_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.3.14 Health Attention Set Unacknowledged
+ The Health Attention Set Unacknowledged is an unacknowledged message used
+ to set the Attention Timer state of an element (see Section 4.2.9). */
+ { OPCODE_HEALTH_ATTENTION_SET_UNACKNOWLEDGED, 1, 1, aNoInitParamDefault },
+
+
+
+
+
+
+ /* 4.3.2.15 Config Model Publication Get
+ The Config Model Publication Get is an acknowledged message used to get the
+ publish address and parameters of an outgoing message that originates
+ from a model.
+ The response to a Config Model Publication Get message is a
+ Config Model Publication Status message.
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2 or 4B : SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_PUBLICATION_GET, 4, 6, aNoInitParamDefault },
+
+ /* 4.3.2.17 Config Model Publication Virtual Address Set
+ The Config Model Publication Virtual Address Set is an acknowledged message
+ used to set the model Publication state (see Section 4.2.2) of an
+ outgoing message that originates from a model.
+ The response to a Config Model Publication Virtual Address Set message is
+ a Config Model Publication Status message.
+
+ ElementAddress : 16b : Address of the element
+ PublishAddress : 128b : Value of the Label UUID publish address
+ AppKeyIndex : 12b : Index of the application key
+ CredentialFlag : 1b : Value of the Friendship Credential Flag
+ RFU : 3b : Reserved for Future Use
+ PublishTTL : 8b : Default TTL value for the outgoing messages
+ PublishPeriod : 8b : Period for periodic status publishing
+ PublishRetransmitCount : 3b : Number of retransmissions for each published message
+ PublishRetransmitIntervalSteps : 5b: Number of 50-millisecond steps between retransmissions
+ ModelIdentifier: 16 or 32b: SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_PUBLICATION_VIRTUAL_ADDRESS_SET, 25, 27, aNoInitParamDefault },
+
+ /* 4.3.2.19 Config Model Subscription Add
+ The Config Model Subscription Add is an acknowledged message used to add an
+ address to a Subscription List of a model (see Section 4.2.3).
+
+ The response to a Config Model Subscription Add message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID
+*/
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_ADD, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.21 Config Model Subscription Delete
+ The Config Model Subscription Delete is an acknowledged message used to
+ delete a subscription address from the Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Delete message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_DELETE, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.25 Config Model Subscription Delete All
+ The Config Model Subscription Delete All is an acknowledged message used to
+ discard the Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Delete All message is a
+ Config Model Subscription Status message.
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_DELETE_ALL, 4, 6, aNoInitParamDefault },
+
+ /* 4.3.2.23 Config Model Subscription Overwrite
+ The Config Model Subscription Overwrite is an acknowledged message used to
+ discard the Subscription List and add an address to the
+ cleared Subscription List of a model (see Section 4.2.3).
+
+ The response to a Config Model Subscription Overwrite message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_OVERWRITE, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.20 Config Model Subscription Virtual Address Add
+ The Config Model Subscription Virtual Address Add is an acknowledged message
+ used to add an address to a Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Add message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ Label : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_ADD, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.22 Config Model Subscription Virtual Address Delete
+ The Config Model Subscription Virtual Address Delete is an acknowledged
+ message used to delete a subscription address from the
+ Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Delete message
+ is a Config Model Subscription Status message.
+ ElementAddress : 2B : Address of the element
+ Address : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_DELETE, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.24 Config Model Subscription Virtual Address Overwrite
+ The Config Model Subscription Virtual Address Overwrite is an acknowledged
+ message used to discard the Subscription List and add an address to the
+ cleared Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Overwrite
+ message is a Config Model Subscription Status message.
+ Element Address : 2B : Address of the element
+ Address : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_OVERWRITE, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.69 Config Network Transmit Get
+ The Config Network Transmit Get is an acknowledged message used to get the
+ current Network Transmit state of a node (see Section 4.2.19).
+ The response to a Config Network Transmit Get message is a Config Network
+ Transmit Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NETWORK_TRANSMIT_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.70 Config Network Transmit Set
+ The Config Network Transmit Set is an acknowledged message used to set the
+ Network Transmit state of a node (see Section 4.2.19).
+ The response to a Config Network Transmit Set message is a Config Network
+ Transmit Status message.
+
+ NetworkTransmitCount : 3b : Number of transmissions for each Network PDU originating from the node
+ NetworkTransmitIntervalSteps : 5b : Number of 10-millisecond steps between transmissions
+ */
+ { OPCODE_CONFIG_NETWORK_TRANSMIT_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.12 Config Relay Get
+ The Config Relay Get is an acknowledged message used to get the
+ current Relay (see Section 4.2.8) and Relay Retransmit (see Section 4.2.20)
+ states of a node.
+ The response to a Config Relay Get message is a Config Relay Status message.
+ There are no Parameters for this message.*/
+ { OPCODE_CONFIG_RELAY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.13 Config Relay Set
+ The Config Relay Set is an acknowledged message used to set the Relay
+ (see Section 4.2.8) and Relay Retransmit (see Section 4.2.20) states of a node.
+ The response to a Config Relay Set message is a Config Relay Status message.
+ Relay : 8 bits : Relay
+ RelayRetransmitCount : 3b : Number of retransmissions on advertising bearer for each Network PDU relayed by the node
+ RelayRetransmitIntervalSteps : 5b : Number of 10-millisecond steps between retransmissions
+ */
+ { OPCODE_CONFIG_RELAY_SET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.27 Config SIG Model Subscription Get
+ The Config SIG Model Subscription Get is an acknowledged message used to
+ get the list of subscription addresses of a model within the element.
+ This message is only for SIG Models.
+ The response to a Config SIG Model Subscription Get message is a Config SIG
+ Model Subscription List message.
+ Element Address : 2B : Address of the element
+ ModelIdentifier : 2B : SIG Model ID */
+
+ { OPCODE_CONFIG_SIG_MODEL_SUBSCRIPTION_GET, 4, 4, aNoInitParamDefault },
+
+ /* 4.3.2.29 Config Vendor Model Subscription Get
+ The Config Vendor Model Subscription Get is an acknowledged message used to
+ get the list of subscription addresses of a model within the element.
+ This message is only for Vendor Models.
+ The response to a Config Vendor Model Subscription Get message is a
+ Config Vendor Model Subscription List message.
+ Element Address : 2B : Address of the element
+ ModelIdentifier : 4B : Vendor Model ID */
+
+ { OPCODE_CONFIG_VENDOR_MODEL_SUBSCRIPTION_GET, 6, 6, aNoInitParamDefault },
+
+
+ /* 4.3.3.4 Health Fault Clear
+ The Health Fault Clear is an acknowledged message used to clear the current
+ Registered Fault state identified by Company ID of an element
+ (see Section 4.2.15.2).
+ The response to a Health Fault Clear message is a Health Fault Status message */
+ { OPCODE_HEALTH_FAULT_CLEAR, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.3 Health Fault Clear Unacknowledged
+ The Health Fault Clear Unacknowledged is an unacknowledged message used to
+ clear the current Registered Fault state identified by Company ID of an
+ element (see Section 4.2.15.2).
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+
+ { OPCODE_HEALTH_FAULT_CLEAR_UNACKNOWLEDGED, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.2 Health Fault Get
+ The Health Fault Get is an acknowledged message used to get the current
+ Registered Fault state identified by Company ID of an element
+ (see Section 4.2.15.2).
+ The response to a Health Fault Get message is a Health Fault Status message
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_GET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.5 Health Fault Test
+ The Health Fault Test is an acknowledged message used to invoke a
+ self-test procedure of an element.
+ The procedure is implementation specific and may result in changing the
+ Health Fault state of an element (see Section 4.2.15).
+ The response to a Health Fault Test message is a Health Fault Status message.
+
+ Test ID : 1B : Identifier of a specific test to be performed
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_TEST, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.3.6 Health Fault Test Unacknowledged
+ The Health Fault Test Unacknowledged is an unacknowledged message used to
+ invoke a self-test procedure of an element. The procedure is implementation
+ specific and may result in changing the Health Fault state of an element
+ (see Section 4.2.15).
+
+ Test ID : 1B : Identifier of a specific test to be performed
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_TEST_UNACKNOWLEDGED, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.3.8 Health Period Get
+ The Health Period Get is an acknowledged message used to get the
+ current Health Fast Period Divisor state of an element (see Section 4.2.16).
+ The response to a Health Period Get message is a Health Period Status message.
+ There are no parameters for this message. */
+ { OPCODE_HEALTH_PERIOD_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.3.10 Health Period Set
+ The Health Period Set is an acknowledged message used to set the current
+ Health Fast Period Divisor state of an element (see Section 4.2.16).
+ The response to a Health Period Set message is a Health Period Status message
+
+ FastPeriodDivisor : 1B: Divider for the Publish Period.
+ Modified Publish Period is used for sending Current */
+ { OPCODE_HEALTH_PERIOD_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.3.9 Health Period Set Unacknowledged
+ The Health Period Set Unacknowledged is an unacknowledged message used to
+ set the current Health Fast Period Divisor state of an element
+ (see Section 4.2.16).
+
+ FastPeriodDivisor : 1B: Divider for the Publish Period.
+ Modified Publish Period is used for sending Current
+ Health Status messages when there are active faults to communicate */
+ { OPCODE_HEALTH_PERIOD_SET_UNACKNOWLEDGED, 1, 1, aNoInitParamDefault },
+//// { OPCODE_HEALTH_PERIOD_STATUS 0x8037
+
+
+
+ /* 4.3.2.46 Config Model App Bind
+ The Config Model App Bind is an acknowledged message used to bind an
+ AppKey to a model.
+ The response to a Config Model App Bind message is a
+ Config Model App Status message.
+
+ ElementAddress : 2B : Address of the element
+ AppKeyIndex : 2B : Index of the AppKey
+ ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID */
+
+ { OPCODE_CONFIG_MODEL_APP_BIND, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.47 Config Model App Unbind
+ The Config Model App Unbind is an acknowledged message used to remove the
+ binding between an AppKey and a model.
+ The response to a Config Model App Unbind message is a Config Model App Status message.
+
+
+ ElementAddress : 2B : Address of the element
+ AppKeyIndex : 2B : Index of the AppKey
+ ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_APP_UNBIND, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.31 Config NetKey Add
+ The Config NetKey Add is an acknowledged message used to add a NetKey
+ to a NetKey List (see Section 4.2.4) on a node.
+ The added NetKey is then used by the node to authenticate and decrypt messages it receives, as well as authenticate and encrypt messages it sends.
+ The response to a Config NetKey Add message is a Config NetKey Status message.
+ NetKeyIndex : 2B
+ NetKey : 16B NetKey */
+ { OPCODE_CONFIG_NETKEY_ADD, 18, 18, aNoInitParamDefault },
+
+ /* 4.3.2.33 Config NetKey Delete
+ The Config NetKey Delete is an acknowledged message used to delete a NetKey
+ on a NetKey List from a node.
+ The response to a Config NetKey Delete message is a
+ Config NetKey Status message.
+ NetKeyIndex : 2B */
+ { OPCODE_CONFIG_NETKEY_DELETE, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.35 Config NetKey Get
+ The Config NetKey Get is an acknowledged message used to report all NetKeys
+ known to the node.
+ The response to a Config NetKey Get message is a Config NetKey List message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NETKEY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.32 Config NetKey Update
+ The Config NetKey Update is an acknowledged message used to update a NetKey
+ on a node. The updated NetKey is then used by the node to authenticate and
+ decrypt messages it receives, as well as authenticate and encrypt messages
+ it sends, as defined by the Key Refresh procedure (see Section 3.10.4).
+ The response to a Config NetKey Update message is a Config NetKey Status message.
+ NetKeyIndex : 2B : Index of the NetKey
+ NetKey : 16B : NetKey */
+ { OPCODE_CONFIG_NETKEY_UPDATE, 18, 18, aNoInitParamDefault},
+
+ /* 4.3.2.43 Config Node Identity Get
+ The Config Node Identity Get is an acknowledged message used to get the
+ current Node Identity state for a subnet (see Section 4.2.12).
+ The response to a Config Node Identity Get message is a
+ Config Node Identity Status message.
+
+ NetKeyIndex : 2B : Index of the NetKey */
+ { OPCODE_CONFIG_NODE_IDENTITY_GET, 2, 2, aNoInitParamDefault},
+
+ /* 4.3.2.44 Config Node Identity Set
+ The Config Node Identity Set is an acknowledged message used to set the
+ current Node Identity state for a subnet (see Section 4.2.12).
+ The response to a Config Node Identity Set message is a
+ Config Node Identity Status message.
+
+ NetKeyIndex : 2B : Index of the NetKey
+ Identity : 1B : New Node Identity state */
+ { OPCODE_CONFIG_NODE_IDENTITY_SET, 3, 3, aNoInitParamDefault},
+
+ /* 4.3.2.53 Config Node Reset
+ The Config Node Reset is an acknowledged message used to reset a node
+ (other than a Provisioner) and remove it from the network.
+ The response to a Config Node Reset message is a Config Node Reset
+ Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NODE_RESET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.49 Config SIG Model App Get
+ The Config SIG Model App Get is an acknowledged message used to request
+ report of all AppKeys bound to the SIG Model.
+ The response to a Config SIG Model App Get message is a Config SIG Model
+ App List message.
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2B : SIG Model ID */
+ { OPCODE_CONFIG_SIG_MODEL_APP_GET, 4, 4, aNoInitParamDefault },
+
+ /* 4.3.2.51 Config Vendor Model App Get
+ The Config Vendor Model App Get is an acknowledged message used to request
+ report of all AppKeys bound to the model. This message is only for Vendor Models.
+ The response to a Config Vendor Model App Get message is a Config Vendor Model App List message
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 4B : Vendor Model ID */
+ { OPCODE_CONFIG_VENDOR_MODEL_APP_GET, 6, 6, aNoInitParamDefault },
+
+};
+/* Private variables ---------------------------------------------------------*/
+
+eClientSendMsgState_t eClientSendMsgState; /* Keeps the state of Sent Message */
+eServerRespRecdState_t eServerRespRecdState; /* Keeps the state of Received Message */
+
+/* Private function prototypes -----------------------------------------------*/
+MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx);
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief This function is callback from library after the Provisioning is
+ completed by embedded Provisioner
+* @param prvState: Provisioning State of the Node. Expecting "1" when the
+ provisioning is completed
+* @retval None
+*/
+void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState)
+{
+ if (prvState==1 )
+ {
+ Appli_ConfigClient_Init();
+ eClientSendMsgState = ProvisioningDone_State;
+ NodeInfo.nodePrimaryAddress = GetAddressToConfigure();
+ }
+}
+
+
+/**
+* @brief This function is Init function for the state machine of the
+ Configuration Client. The Function shall be called everytime a new
+ node is provisioned
+* @param None
+* @retval None
+*/
+MOBLE_RESULT Appli_ConfigClient_Init(void)
+{
+ eClientSendMsgState = ClientIdle_State; /* Init the value of state machine */
+ eServerRespRecdState = NodeIdle_State; /* Init the value of state machine */
+ ConfigClient_ResetTrials();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_ConfigClient_Process: This function is Process function and
+ shall be called from while(1) loop
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_Process(void)
+{
+
+ Appli_ConfigClient_ConfigureNode();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief This function is used to configure the Node after provisioning
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 nowClockTime;
+
+ /*
+ State response called function
+ --------------------------------------------------------------------------------
+ ClientIdle_State X None
+ ProvisioningDone_State X Start the configuration
+ CompositionGet_State ConfigRespInit_State GetComposition
+ CompositionGet_State CompositionRecd_State ChangeThe State to next
+ AppKeyAdd_State X Issue AppKey
+ AppKeyAdd_State AppkeyAck_State ChangeThe State to next
+ AppBindModel_State X Issue AppKetBind
+ AppBindModel_State AppBindModelAck_State ChangeThe State to next
+ AddSubscription_State X Issue the Subscription
+ AddSubscription_State SubscriptionAck_State ChangeThe State to next
+ SetPublication_State PublicationStatus_State Issue the Subscription
+ SetPublication_State PublicationStatus_State ChangeThe State to next
+
+ */
+
+ /* If the Node is already configured, return from here */
+ if (eClientSendMsgState == ConfigurationDone_State)
+ return result;
+
+ if (eClientSendMsgState == ClientIdle_State)
+ {
+ /* Waiting for the Provisioning to be done before to Start the
+ node configuration procedure */
+ return result;
+ }
+
+ if (eServerRespRecdState == NodeNoResponse_State)
+ {
+ /* No Response received from Node under Provisioning for some config
+ messages. So, no need to do the trials */
+ return MOBLE_RESULT_FAIL;
+ }
+
+ if (eClientSendMsgState == ProvisioningDone_State)
+ {
+ /* Start the node configuration procedure */
+ eClientSendMsgState = CompositionGet_State;
+ ConfigClient_SaveMsgSendingTime();
+ }
+
+ else if (eClientSendMsgState == CompositionGet_State)
+ {
+ nowClockTime = Clock_Time();
+ if( (nowClockTime - NodeInfo.Initial_time) < CONFIGURATION_START_DELAY)
+ {
+ return result;
+ }
+ /*------------- Add the delay before to start the configuration messages */
+
+ if (eServerRespRecdState == CompositionRecdCompleted_State)
+ {
+ eClientSendMsgState = AppKeyAdd_State; /* Change the state to Next */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the GetComposition servicing */
+ Appli_ConfigClient_GetCompositionData();
+ }
+ }
+
+ else if (eClientSendMsgState == AppKeyAdd_State)
+ {
+ if (eServerRespRecdState == AppkeyAckCompleted_State)
+ {
+ eClientSendMsgState = AppBindModel_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the AppKeyAdd servicing */
+ Appli_ConfigClient_DefaultAppKeyAdd();
+ }
+ }
+
+ else if (eClientSendMsgState == AppBindModel_State)
+ {
+ if (eServerRespRecdState == AppBindModelAckCompleted_State)
+ {
+ eClientSendMsgState = AddSubscription_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the AppKeyBIND servicing */
+ Appli_ConfigClient_DefaultAppKeyBind();
+ }
+ }
+
+ else if (eClientSendMsgState == AddSubscription_State)
+ {
+ if (eServerRespRecdState == SubscriptionAckCompleted_State)
+ {
+ eClientSendMsgState = SetPublication_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the Subscription add servicing */
+ AppliConfigClient_SubscriptionAddDefault();
+ }
+ }
+
+ else if (eClientSendMsgState == SetPublication_State)
+ {
+ if (eServerRespRecdState == PublicationStatusCompleted_State)
+ {
+ eClientSendMsgState = ConfigurationDone_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ TRACE_M(TF_CONFIG_CLIENT,"**Node is configured** \r\n");
+ }
+ else
+ {
+ /* Continue the Publication add servicing */
+ AppliConfigClient_PublicationSetDefault();
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief This function is called to Get the Composition data from the
+* a node under configuration
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+ MOBLEUINT16 dst_peer;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+
+ ConfigClient_SaveMsgSendingTime();
+
+ dst_peer = GetAddressToConfigure();
+
+ /* Start the Get Composition Message */
+ ConfigClient_CompositionDataGet(dst_peer);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ break;
+
+ case CompositionRecd_State:
+ /* Switch the state to next state AddAppKey_State */
+ ConfigClient_ResetTrials();
+ eServerRespRecdState = CompositionRecdCompleted_State;
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
+ }
+
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyAdd: This function is called to
+ add the default AppKeys and NetKeys to a node under configuration
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+ MOBLEUINT8 *pAppKey;
+ MOBLEUINT16 netKeyIndex = DEFAULT_NETKEY_INDEX;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLE_ADDRESS dst_addr;
+
+ pAppKey = GetNewProvNodeAppKey();
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ ConfigClient_SaveMsgSendingTime();
+
+ dst_addr = GetAddressToConfigure();
+
+ /* Start the Set Appkey message */
+ ConfigClient_AppKeyAdd ( dst_addr,
+ netKeyIndex,
+ appKeyIndex,
+ pAppKey);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ break;
+
+ case AppkeyAck_State:
+ ConfigClient_ResetTrials();
+ eServerRespRecdState = AppkeyAckCompleted_State;
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
+ }
+
+ break;
+
+ default:
+ /* Error State */
+ break;
+}
+
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
+ function to Bind the element(node) with AppKeyIndex and Models
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
+{
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the AppBindModel_State message */
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ modelIdentifier = GetSIGModelToBindApp(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeSendMessage_State:
+ /* Start the AppBindModel_State message */
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Send the Message to the server */
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ break;
+
+ case AppBindModelAck_State:
+ /* Need to check if all SIG Models are binded ? */
+
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ numVendorModels = GetCountVendorModelToBindApp(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ /* Switch to InProgress_State */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ /*Now, do binding for Vendor Model */
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+ if (elementIndex >= numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+
+ eServerRespRecdState = AppBindModelAckCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SubscriptionAddDefault: This function is application
+ used for adding subscription to the element(node) for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
+{
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT16 elementAddress;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the SubscriptionAdd message */
+
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ modelIdentifier = GetSIGModelToSubscribe(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeSendMessage_State:
+ elementAddress = GetServerElementAddress(elementIndex);
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+
+ break;
+
+
+ case SubscriptionAck_State:
+ /* Need to check if all SIG Models are subscribed ? */
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ numVendorModels = GetCountVendorModelToSubscribe(elementIndex);
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+
+ /* Get the Next Model and Bind it again till all SIG Models are binded */
+ eServerRespRecdState = NodeNextSigModel_State;
+
+ }
+ else if (indexVendormodels < numVendorModels)
+{
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+ if (elementIndex == numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+ eServerRespRecdState = SubscriptionAckCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ indexSIGmodels =0; /* Reset the variable again for the next element */
+ indexVendormodels = 0;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_PublicationSetDefault: This function is application
+ used for adding publication settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
+{
+ MOBLEUINT16 publishAddress = DEFAULT_PUBLISH_ADDR;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT8 credentialFlag = DEFAULT_CREDENTIAL_FLAG;
+ MOBLEUINT8 publishTTL = DEFAULT_PUBLISH_TTL;
+ MOBLEUINT8 publishPeriod = DEFAULT_PUBLISH_PERIOD;
+ MOBLEUINT8 publishRetransmitCount = DEFAULT_PUBLISH_RETRANSMIT_COUNT;
+ MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
+
+ static MOBLEUINT16 elementAddress;
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the Publication Add message */
+
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ modelIdentifier = GetSIGModelToPublish(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels);
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+
+ case NodeSendMessage_State:
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+
+ break;
+
+
+ case PublicationStatus_State:
+ /* Need to check if all SIG Models are subscribed ? */
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ numVendorModels = GetCountVendorModelToPublish(elementIndex);
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+ eServerRespRecdState = NodeNextSigModel_State;
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+
+ if (elementIndex == numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+ eServerRespRecdState = PublicationStatusCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ indexSIGmodels =0; /* Reset the variable again for the next element */
+ indexVendormodels = 0;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SelfPublicationSetDefault: This function is application
+ used for adding publication settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
+{
+ MOBLEUINT16 publishAddress = DEFAULT_PUBLISH_ADDR;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT8 credentialFlag = DEFAULT_CREDENTIAL_FLAG;
+ MOBLEUINT8 publishTTL = DEFAULT_PUBLISH_TTL;
+ MOBLEUINT8 publishPeriod = DEFAULT_PUBLISH_PERIOD;
+ MOBLEUINT8 publishRetransmitCount = DEFAULT_PUBLISH_RETRANSMIT_COUNT;
+ MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
+
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT8 elementIndex;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+ }
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SelfSubscriptionSetDefault: This function is application
+ used for adding Subscription settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
+{
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ /*If limit is reaching to no models*/
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
+
+ /*Checking for Vendor Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
+
+ }
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
+ function to Bind the element(node) with AppKeyIndex and Models
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
+{
+
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT8 elementIndex;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ appKeyIndex = DEFAULT_APPKEY_INDEX;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
+
+ }
+ return result;
+}
+
+/**
+* @brief Appli_CompositionDataStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
+{
+ eServerRespRecdState = CompositionRecd_State;
+}
+
+
+/**
+* @brief Appli_AppKeyStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_AppKeyStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = AppkeyAck_State;
+}
+
+
+/**
+* @brief Appli_AppBindModelStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = AppBindModelAck_State;
+}
+
+
+/**
+* @brief Appli_SubscriptionAddStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = SubscriptionAck_State;
+}
+
+
+/**
+* @brief Appli_PublicationStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_PublicationStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = PublicationStatus_State;
+}
+
+
+/**
+* @brief Appli_NodeResetStatusCb: This function is callback from config
+ client middleware on reception of the Node Reset response
+* @param None
+* @retval None
+*/
+void Appli_NodeResetStatusCb(void)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = NodeResetStatus_State;
+}
+
+
+/**
+* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+{
+
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ MOBLEUINT16 model_id;
+ MOBLEUINT8 index;
+ MOBLEUINT8 idxSIG = *pModelIndex;
+
+ for (index = idxSIG; index < numberOfModels ; index++ )
+ {
+ model_id = aNodeElements[elementIndex].aSIGModels[index];
+ if (MODEL_IS_FOUNDATION_MODEL(model_id))
+ {
+ /* Do nothing, let the next model_if be scanned */
+ model_id = 0xffff; /* Invalid Model ID */
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *pModelIndex = index;
+ return model_id;
+#else
+ return aSigModelsToBind[idxSIG][elementIdx] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[indexModels];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+/**
+* @brief GetCountSIGModelToBindApp: This function gets the NUMBER of SIG Model
+ to Bind
+* @param elementIndex Index of the Element for which the Count is needed
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element for which the Count is needed
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_BIND_APP;
+#endif
+}
+
+
+/**
+* @brief GetSIGModelToPublish: This function gets the SIG Model to Publish
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
+#else
+ return aPublishModels[idxSIG] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @param idxSIG Pointer to Index of the Model
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+
+/**
+* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_PUBLISH;
+#endif
+}
+
+
+/**
+* @brief GetSIGModelToSubscribe: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
+#else
+ return aSubscribeModels[idxSIG] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToSubscribe: This function Gets the Vendor Model ID for
+ Subscription
+* @param elementIndex Index of the Element
+* @param idxSIG Index to the Model ID to Subscribe
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 idxSIG)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+
+/**
+* @brief GetCountSIGModelToSubscribe: This function gets the SIG Model to Subscribe
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToPublish: This function gets the Count of the
+ Vendor Model to Subscribe
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
+#endif
+}
+
+
+/**
+* @brief AppliConfigClient_SendMessageDefault: This function is used for sending
+ a message.
+ ** The Function is not yet written fully
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
+{
+ return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.h
new file mode 100644
index 000000000..34169448c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.h
@@ -0,0 +1,89 @@
+/**
+******************************************************************************
+* @file appli_config_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_CONFIG_CLIENT_H
+#define __APPLI_CONFIG_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+#include "config_client.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+#define MAX_CONFIG_PARAM_SIZE 22
+#define CONFIGURE_AS_PER_COMPOSITION_DATA
+
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Init(void);
+MOBLE_RESULT Appli_ConfigClient_Process(void);
+MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
+void Appli_CompositionDataStatusCb(MOBLE_RESULT);
+void Appli_AppKeyStatusCb(MOBLEUINT8 status);
+void Appli_AppBindModelStatusCb(MOBLEUINT8 status);
+void Appli_PublicationStatusCb(MOBLEUINT8 status);
+void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status);
+void Appli_NodeResetStatusCb(void);
+
+void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState);
+MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void);
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void);
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void);
+MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void);
+MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void);
+MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void);
+MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void);
+MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void);
+Composition_Data_Page0_t* Appli_GetNodeCompositionBuff (void);
+
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx);
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx);
+
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8);
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8);
+
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
+
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+
+
+#endif /* __APPLI_CONFIG_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.c
new file mode 100644
index 000000000..57c1bc7cf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.c
@@ -0,0 +1,457 @@
+/**
+ ******************************************************************************
+ * @file appli_generic.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Generic Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "mesh_cfg.h"
+#include "generic.h"
+#include "light.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application_Mesh_Models
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+extern MOBLEUINT8 RestoreFlag;
+extern MOBLEUINT16 IntensityValue;
+extern MOBLEUINT8 IntensityFlag;
+extern MOBLEUINT8 PowerOnOff_flag;
+extern Appli_LightPwmValue_t Appli_LightPwmValue;
+Appli_Generic_OnOffSet AppliOnOffSet;
+Appli_Generic_LevelSet AppliLevelSet;
+Appli_Generic_PowerOnOffSet AppliPowerOnSet;
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet;
+
+/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid);
+/* Private functions ---------------------------------------------------------*/
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+/**
+* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* when Generic OnOff message is received
+* @param pGeneric_OnOffParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
+
+
+ /* This condition is applicable when user want to on off the light with some default
+ * transition value, or optionalValid =IN_TRANSITION , transition is in progress.
+ */
+ if((OptionalValid == DEFAULT_TRANSITION) || (OptionalValid == IN_TRANSITION))
+ {
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet.Present_OnOffValue;
+ Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
+ if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+ {
+ AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ }
+ else
+ {
+ AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ }
+
+ if(AppliOnOffSet.Present_OnOffValue > 16000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+ else
+ {
+ if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+
+/**
+* @brief Appli_Generic_OnOff_Status: This function is callback for Application
+* when Generic OnOff message is received
+* @param pOnOff_status: Pointer to the parameters received for message
+* @param plength: length of the data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Present OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Target OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", pOnOff_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+/**
+* @brief Appli_Generic_Level_Set: This function is callback for Application
+* when Generic Level message is received
+* @param plevelParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
+ MOBLEUINT8 OptionalValid)
+{
+ MOBLEUINT16 duty;
+ static MOBLEUINT16 previousIntensity = 0;
+
+ AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet.Present_Level16 <= 0)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+
+ IntensityValue = AppliLevelSet.Present_Level16;
+
+ if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
+ IntensityValue == INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = MOBLE_FALSE;
+ }
+ else
+ {
+ IntensityFlag = MOBLE_TRUE;
+ }
+ previousIntensity = IntensityValue;
+
+ if(AppliLevelSet.Present_Level16 < 0x00)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+ duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",AppliLevelSet.Present_Level16);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_LEVEL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ /* For demo, if Level is more than 100, switch ON the LED */
+ if(AppliLevelSet.Present_Level16 >= 50)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_Delta_Set: This function is callback for Application
+* when Generic Level Delta message is received
+* @param pdeltalevelParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+
+ /* For demo, if Level is more than 50, switch ON the LED */
+ if (AppliLevelSet.Present_Level16 >= 50)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+ BSP_LED_Off(LED_BLUE);
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Generic_Move_Set: This function is callback for Application
+* when Generic Level Move message is received
+* @param pdeltaMoveParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ if(OptionalValid == 1)
+ {
+ AppliLevelSet.Present_Level16= pdeltaMoveParam->Present_Level16;
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+ /**
+* @brief Appli_Generic_Level_Status: This function is callback for Application
+* when Generic Level Move message is received
+* @param plevel_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_LEVEL */
+
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+/**
+* @brief Appli_Generic_PowerOnOff_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pPowerOnOffParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+
+ /* set the flag value for NVM store */
+ //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+/**
+* @brief Appli_Generic_PowerOnOff_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param powerOnOff_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF */
+
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+/**
+* @brief Appli_Generic_DefaultTransitionTime_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pDefaultTimeParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_DefaultTransitionTime_Status: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pTransition_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
+
+
+/**
+* @brief Appli_Generic_GetOnOffState: This function is callback for Application
+* when Generic on off status message is to be provided
+* @param pOnOff_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+{
+
+ *pOnOff_Status = AppliOnOffSet.Present_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
+ AppliOnOffSet.Present_OnOff);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetOnOffValue: This function is callback for Application
+ to get the PWM value for the generic on off
+* @param pOnOff_Value: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+{
+
+ *pOnOff_Value = AppliOnOffSet.Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet.Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet.TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet.TargetValue >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Value: Value %d!\n\r",
+ AppliOnOffSet.Present_OnOffValue);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetLevelStatus: This function is callback for Application
+ when Generic Level status message is to be provided
+* @param pLevel_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+{
+ *pLevel_Status = AppliLevelSet.Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
+ *pLevel_Status);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetPowerOnOffStatus: This function is callback for Application
+* when Generic Get Power status message is to be provided
+* @param pLevel_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+{
+ *pPower_Status = AppliPowerOnSet.PowerOnState;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
+ AppliPowerOnSet.PowerOnState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetDefaultTransitionStatus: This function is callback for
+* Application when Generic Level status message is to be provided
+* @param pTransition_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+{
+ *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
+ TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
+ AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.h
new file mode 100644
index 000000000..41228825e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.h
@@ -0,0 +1,115 @@
+/**
+ ******************************************************************************
+ * @file appli_generic.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Generic Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_GENERIC_H
+#define __APPLI_GENERIC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* user configuration for Battery status */
+#define BATTERY_ABSENT 0X00
+#define BATTERY_PRESENT_REMOVABLE 0X01
+#define BATTERY_PRESENT_NON_REMOVABLE 0X02
+#define BATTERY_UNKNOWN 0X03
+#define BATTERY_CRITICAL_LOW_LEVEL 0X00
+#define BATTERY_LOW_LEVEL 0X01
+#define BATTERY_GOOD_LEVEL 0X02
+#define BATTERY_LEVEL_UNKNOWN 0X03
+#define BATTERY_NOT_CHARGEABLE 0X00
+#define BATTERY_NOT_CHARGING 0X01
+#define BATTERY_IS_CHARGING 0X02
+#define BATTERY_CHARGING_UNKNOWN 0X03
+#define BATTERY_SERVICE_RFU 0X00
+#define BATTERY_REQUIRE_NO_SERVICE 0X01
+#define BATTERY_REQUIRE_SERVICE 0X02
+#define BATTERY_SERVICE_UNKNOWN 0X03
+
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 Present_OnOff;
+ MOBLEUINT16 Present_OnOffValue;
+ MOBLEUINT16 TargetValue;
+}Appli_Generic_OnOffSet;
+
+typedef struct
+{
+ MOBLEINT16 Present_Level16;
+}Appli_Generic_LevelSet;
+
+typedef struct
+{
+ MOBLEINT16 PowerOnState;
+}Appli_Generic_PowerOnOffSet;
+
+typedef struct
+{
+ MOBLEUINT8 DefaultTransitionTime;
+}Appli_Generic_DefaultTransitionSet;
+
+typedef struct
+{
+ MOBLEUINT8 Is_BatteryPresent;
+ MOBLEUINT8 Is_Chargeable;
+ MOBLEUINT8 Is_Serviceable;
+}Appli_BatteryUserflag_param_t;
+#pragma pack(4)
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
+ MOBLEUINT32 plength);
+
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status) ;
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength);
+
+
+#endif /* __APPLI_GENERIC_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.c
new file mode 100644
index 000000000..0c36b2294
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.c
@@ -0,0 +1,101 @@
+/**
+******************************************************************************
+* @file appli_generic_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "generic_client.h"
+#include "appli_generic_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+MOBLEUINT8 Led_Value;
+/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* when Generic OnOff message is called
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pGeneric_OnOffParam[2];
+
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value;
+ GenericClient_OnOff_Set_Unack(elementAddr,
+ (_Generic_OnOffParam*) pGeneric_OnOffParam,
+ sizeof(pGeneric_OnOffParam) );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/**
+* @brief Appli_Generic_Level_Set: This function is callback for Application
+* when Generic Level message is called
+* @param void:
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ GenericClient_Level_Set_Unack(elementAddr,
+ (_Generic_LevelParam*) pGeneric_LevelParam,
+ sizeof(pGeneric_LevelParam));
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.h
new file mode 100644
index 000000000..eb1c7dcf2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.h
@@ -0,0 +1,44 @@
+/**
+******************************************************************************
+* @file appli_generic_client.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_GENERIC_CLIENT_H
+#define __APPLI_GENERIC_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
+MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void);
+
+
+#endif /* __APPLI_GENERIC_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.c
new file mode 100644
index 000000000..1be35bc07
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.c
@@ -0,0 +1,1312 @@
+/**
+ ******************************************************************************
+ * @file appli_light.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Lighting Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "light.h"
+#include "appli_light.h"
+#include "appli_generic.h"
+#include "common.h"
+#include "mesh_cfg.h"
+#include "PWM_handlers.h"
+#include "PWM_config.h"
+#include "appli_nvm.h"
+#include "math.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING Lightness MODEL
+*******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+
+Appli_Light_lightnessSet ApplilightnessSet = {1,0,0,0,0,0};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet;
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
+/******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING CTL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+
+Appli_Light_CtlSet AppliCtlSet;
+Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet;
+Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
+/******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING HSL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+ Appli_Light_HslSet AppliHslSet;
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet = {0x7FFF,0x7FFF,0x7FFF};
+ Appli_Light_RGBSet Appli_RGBParam;
+ Appli_Light_HslRangeSet AppliHslRangeSet;
+
+/*******************************************************************************/
+#endif /*End of the LIGHTING HSL MODEL variables */
+/*******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the RGB board.
+*******************************************************************************/
+
+Appli_LightPwmValue_t Appli_LightPwmValue;
+extern MOBLEUINT8 RestoreFlag;
+extern MOBLEUINT8 PowerOnOff_flag;
+extern MOBLEUINT8 IntensityFlag;
+extern MOBLEUINT16 IntensityValue;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+/**
+* @brief Appli_Light_Lightness_Set: This function is callback for Application
+* when Light Lightness Set message is received
+* @param pLight_LightnessParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 OptionalValid)
+{
+ MOBLEUINT16 duty;
+ static MOBLEUINT16 previousIntensity = 0;
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+
+ if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
+ {
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ }
+
+ if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
+ IntensityValue == INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = MOBLE_FALSE;
+ }
+ else
+ {
+ IntensityFlag = MOBLE_TRUE;
+ }
+ previousIntensity = IntensityValue;
+
+ /* For demo, if Level is more than 100, switch ON the LED */
+ if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+
+ duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+
+/**
+* @brief Appli_Light_Lightness_Status: This function is callback for Application
+* when Light Lightness status message is received
+* @param pLightness_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+/**
+* @brief Appli_Light_Lightness_Linear_Set: This function is callback for Application
+* when Light Lightness Linear Set message is received
+* @param pLight_LightnessLinearParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
+ MOBLEUINT8 OptionalValid)
+{
+ ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Linear_Status: This function is callback for Application
+* when Light Lightness Linear status message is received
+* @param pLightnessLinear_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+/**
+* @brief Appli_Light_Lightness_Default_Set: This function is callback for Application
+* when Light Lightness Default Set message is received
+* @param pLight_LightnessDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Default_Status: This function is callback for Application
+* when Light Lightness Default status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+/**
+* @brief Appli_Light_Lightness_Range_Set: This function is callback for Application
+* when Light Lightness Range Set message is received
+* @param pLight_LightnessRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+
+ TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Range_Status: This function is callback for Application
+* when Light Lightness range ststus message is received
+* @param pLightnessRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+/**
+* @brief Appli_Light_Ctl_Set: This function is callback for Application
+* when Light Ctl Set message is received
+* @param pLight_CtlParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
+ MOBLEUINT8 OptionalValid)
+{
+ float colourRatio;
+ float brightRatio;
+ TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+
+ AppliCtlSet.PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet.PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet.PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
+ colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+
+ Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
+ Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
+
+ Rgb_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ TRACE_M(TF_SERIAL_CTRL,"#825E%04hx%04hx%04hx!\n\r",
+ AppliCtlSet.PresentLightness16,
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Ctl_Status: This function is callback for Application
+* when Light CTL status message is received
+* @param pLightCtl_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+/**
+* @brief Appli_Light_CtlTemperature_Set: This function is callback for Application
+* when Light Ctl Temperature Set message is received
+* @param pLight_CtltempParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
+ MOBLEUINT8 OptionalValid)
+{
+ float colourRatio;
+ float brightRatio;
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
+ AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+
+ Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
+ Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
+
+ Rgb_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_CtlTemperature_Status: This function is callback for Application
+* when Light CTL temperature status message is received
+* @param pLightCtlTemp_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+/**
+* @brief Appli_Light_CtlTemperature_Range_Set: This function is callback for Application
+* when Light Ctl Temperature range Set message is received
+* @param pLight_CtlTempRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+/**
+* @brief Appli_Light_CtlTemperature_Range_Set: This function is callback for Application
+* when Light CTL temperature range status message is received
+* @param pCtlTempRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+/**
+* @brief Appli_Light_CtlDefault_Set: This function is callback for Application
+* when Light Ctl Default Set message is received
+* @param pLight_CtlDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_CtlDefault_Status: This function is callback for Application
+* when Light CTL Default status message is received
+* @param pCtlDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+/**
+* @brief Appli_Light_Hsl_Set: This function is callback for Application
+* when Light Hsl Set message is received
+* @param pLight_HslParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+
+ /* Function to convert HSL values in RGB values */
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ /* when HSL is set, make CTL pwm will bw zero */
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Hsl_Status: This function is callback for Application
+* when Light HSL status message is received
+* @param pHsl_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+/**
+* @brief Appli_Light_HslHue_Set: This function is callback for Application
+* when Light Hsl Hue Set message is received
+* @param pLight_HslHueParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+
+/**
+* @brief Appli_Light_HslHue_Status: This function is callback for Application
+* when Light HSL HUE status message is received
+* @param pHslHue_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+/**
+* @brief Appli_Light_HslSaturation_Set: This function is callback for Application
+* when Light Hsl Saturation Set message is received
+* @param pLight_HslSaturationParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslSaturation_Status: This function is callback for Application
+* when Light HSL Saturation status message is received
+* @param pHslSaturation_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+/**
+* @brief Appli_Light_HslDefault_Set: This function is callback for Application
+* when Light Hsl Default Set message is received
+* @param pLight_HslDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+
+ AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
+ AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
+ AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslDefault_Status: This function is callback for Application
+* when Light HSL Default status message is received
+* @param pHslDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+/**
+* @brief Appli_Light_HslRange_Set: This function is callback for Application
+* when Light Hsl Range Set message is received
+* @param pLight_HslRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslRange_Status: This function is callback for Application
+* when Light HSL range status message is received
+* @param pHslRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+#endif
+
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING Lightness MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+
+/**
+* @brief Appli_Light_GetLightnessStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLightnessState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+{
+ *(lLightnessState) = ApplilightnessSet.PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessLinearStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLightnessState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+{
+ *(lLightnessState) = ApplilightnessLinearSet.PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet.PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Linear Status: present: %d last: %d\n\r",
+ ApplilightnessLinearSet.PresentState16,
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+{
+ *(lDefaultState) = ApplilightnessSet.LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
+ ApplilightnessSet.LightnessDefault);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessLastStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLastState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+{
+ *(lLastState) = ApplilightnessSet.LastLightness16;
+ *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
+
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetLightnessRangeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lRangeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+{
+ *(lRangeState) = ApplilightnessSet.StatusCode;
+ *(lRangeState+1) = ApplilightnessSet.RangeMin;
+ *(lRangeState+2) = ApplilightnessSet.RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet.RangeMax;
+ *(lRangeState+4) = ApplilightnessSet.RangeMax >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Range Status: status: %d Min: %d Max: %d\n\r",
+ ApplilightnessSet.StatusCode,
+ ApplilightnessSet.RangeMin,
+ ApplilightnessSet.RangeMax);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING CTL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+
+/**
+* @brief Appli_Light_GetCtlLightStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlLightState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+{
+ *(lCtlLightState) = AppliCtlSet.PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet.PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet.PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet.PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet.PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet.PresentCtlDelta16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Light Status: lightness: %d temp: %d delta: %d\n\r",
+ AppliCtlSet.PresentLightness16,
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlTeperatureStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlTempState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+{
+ *(lCtlTempState) = AppliCtlSet.PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet.PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet.PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet.PresentCtlDelta16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Temperature Status: temp: %d delta: %d\n\r",
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlTemperatureRange: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlTempRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+{
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet.StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet.RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet.RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet.RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet.RangeMax >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Temperature Range: status: %d Min: %d Max: %d\n\r",
+ AppliCtlTemperatureRangeSet.StatusCode,
+ AppliCtlTemperatureRangeSet.RangeMin,
+ AppliCtlTemperatureRangeSet.RangeMax);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+{
+ *(lCtlDefaultState) = AppliCtlDefaultSet.CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet.CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet.CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet.CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet.CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet.CtlDefaultDeltaUv >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Default Status: lightness: %d temp: %d deltaUV: %d\n\r",
+ AppliCtlDefaultSet.CtlDefaultLightness16,
+ AppliCtlDefaultSet.CtlDefaultTemperature16,
+ AppliCtlDefaultSet.CtlDefaultDeltaUv);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING HSL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+/**
+* @brief Appli_Light_GetHslStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+{
+ *(lHslState) = AppliHslSet.HslLightness16;
+ *(lHslState+1) = AppliHslSet.HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet.HslHueLightness16;
+ *(lHslState+3) = AppliHslSet.HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet.HslSaturation16;
+ *(lHslState+5) = AppliHslSet.HslSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Status: lightness: %d hue: %d saturation: %d\n\r",
+ AppliHslSet.HslLightness16,
+ AppliHslSet.HslHueLightness16,
+ AppliHslSet.HslSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslHueStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslHueState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+{
+ *(lHslHueState) = AppliHslSet.HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
+ AppliHslSet.HslHueLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetHslSaturationStatus: This function is callback for Application
+* to get the application values in middleware used for transition change
+* @param lHslSaturationState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+{
+ *(lHslSaturationState) = AppliHslSet.HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
+ AppliHslSet.HslSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+{
+ *(lHslDefaultState) = Appli_HslDefaultSet.HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet.HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet.HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet.HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet.HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet.HslDefaultSaturation16 >>8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslSatRange: This function is callback for Application
+* to get the application values in middleware used for transition change
+* @param lHslSatRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+{
+ *(lHslSatRange) = AppliHslRangeSet.StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet.HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet.HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet.HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet.HslMaxSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Range: status: %d min: %d max: %d\n\r",
+ AppliHslRangeSet.StatusCode,
+ AppliHslRangeSet.HslMinSaturation16,
+ AppliHslRangeSet.HslMaxSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslHueRange: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslHueRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+{
+ *(lHslHueRange) = AppliHslRangeSet.StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet.HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet.HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet.HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet.HslHueMaxRange16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Range: status: %d min: %d max: %d\n\r",
+ AppliHslRangeSet.StatusCode,
+ AppliHslRangeSet.HslHueMinRange16,
+ AppliHslRangeSet.HslHueMaxRange16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_SERVER_HSL */
+/******************************************************************************/
+
+/* This Function used to initialise the PWM . This is used for the RGB board */
+void Appli_Light_PwmInit()
+{
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmCoolValue = 0;
+ Appli_LightPwmValue.PwmWarmValue = 0;
+ Appli_LightPwmValue.PwmRedValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmGreenValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmBlueValue = PWM_VALUE_OFF;
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+
+/**
+* @brief Function to convert the map the RGB values in real values.
+* @param value1: This value corresponds to red led.
+* @param value2: This value corresponds to green led .
+* @param value3: This value corresponds to blue led .
+* @retval void
+*/
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+{
+ Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+}
+
+/**
+* @brief Function to convert the HSL values in RGB values.
+* @param void
+* @retval void
+*/
+void HSL2RGB_Conversion(void)
+{
+
+ MOBLEUINT16 hueValue;
+ float lightnessvalue;
+ float saturationValue;
+ MOBLEUINT16 cValue; /* chroma */
+ MOBLEUINT16 mValue; /* intermediate value used for creating the r,g,b baseline */
+ MOBLEUINT16 xValue; /* intermediate value used for computing r,g,b */
+
+ if(AppliHslSet.HslSaturation16 == 0)
+ {
+ Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ }
+ else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ {
+ Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ }
+ else
+ {
+ /* Hue is calculated for angular value. so converting in between 0 to 360 degree */
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet.HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet.HslLightness16/65535;
+ saturationValue = (float)AppliHslSet.HslSaturation16/65535;
+
+ /* Formula to get the values used for RGB conversion */
+ cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
+ mValue = (MOBLEUINT16)((lightnessvalue * 1000) - (cValue/2));
+ xValue = (MOBLEUINT16)(cValue * (1 - fabs(fmod(hueValue / 60.0, 2.0) - 1)));
+
+ /* Conditons applied for the different angle of hue value */
+ if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
+ {
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
+ {
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
+ {
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 2)
+ && hueValue < (2 * HUE_UPPER_LIMIT / 3))
+ {
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ }
+ else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
+ && hueValue < (5 * HUE_UPPER_LIMIT / 6))
+ {
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ }
+ else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
+ {
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ }
+ else
+ {
+ RgbF_Create(mValue, mValue, mValue);
+ }
+ }
+}
+
+#endif
+
+/**
+* @brief Rgb_LedOffState: This function is called while using CTL, makes all the RGB
+* PWM off state for Application.
+* @param void:
+* @retval void
+*/
+void Rgb_LedOffState(void)
+{
+ Appli_LightPwmValue.PwmRedValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmGreenValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmBlueValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+}
+
+/**
+* @brief Ctl_LedOffState: This function is called while using HSL, makes all the
+* cool Warm PWM off state for Application.
+* @param void:
+* @retval void
+*/
+void Ctl_LedOffState(void)
+{
+ Appli_LightPwmValue.PwmWarmValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmCoolValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+}
+
+/**
+* @brief Function to set the values for PWM for RGB board.
+* @param state: decided the state of PWM according to the condition.
+* @retval void
+*/
+void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
+{
+
+#ifndef USER_BOARD_1LED
+ if(light_state.IntensityValue > 0)
+ {
+#ifdef USER_BOARD_COOL_WHITE_LED
+ if((light_state.PwmCoolValue == 0) && (light_state.PwmWarmValue == 0))
+ light_state.PwmWarmValue = light_state.IntensityValue;
+#endif
+#ifdef USER_BOARD_RGB_LED
+ if((light_state.PwmRedValue == PWM_VALUE_OFF) &&
+ (light_state.PwmGreenValue == PWM_VALUE_OFF) &&
+ (light_state.PwmBlueValue == PWM_VALUE_OFF))
+ light_state.PwmBlueValue = light_state.IntensityValue;
+#endif
+ }
+#endif
+
+ if(state == RESUME_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+
+#ifdef USER_BOARD_RGB_LED
+
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+
+ }
+ else if(state == RESET_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, PWM_VALUE_OFF);
+#endif
+#ifdef USER_BOARD_COOL_WHITE_LED
+ Modify_PWM(COOL_LED, 0);
+ Modify_PWM(WARM_LED, 0);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, PWM_VALUE_OFF);
+ Modify_PWM(GREEN_LED, PWM_VALUE_OFF);
+ Modify_PWM(BLUE_LED, PWM_VALUE_OFF);
+#endif
+ }
+ else if(state == LOAD_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+ }
+ else
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+ light_state.PwmCoolValue = PWM_DEFAULT_VALUE;
+
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+ }
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.h
new file mode 100644
index 000000000..aaa600146
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.h
@@ -0,0 +1,196 @@
+/**
+ ******************************************************************************
+ * @file appli_light.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Light Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_H
+#define __APPLI_LIGHT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "light.h"
+
+/* Exported macro ------------------------------------------------------------*/
+#define HUE_UPPER_LIMIT 360
+/* Exported variables -------------------------------------------------------*/
+
+/* Light Lightness set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 PresentState16;
+ MOBLEUINT16 LastLightness16;
+ MOBLEUINT16 LightnessDefault;
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 RangeMin;
+ MOBLEUINT16 RangeMax;
+}Appli_Light_lightnessSet;
+
+
+/* Light Lightness Linear set */
+typedef struct
+{
+ MOBLEUINT16 PresentState16;
+}Appli_Light_lightnessLinearSet;
+
+/* Light Ctl Set */
+typedef struct
+{
+ MOBLEUINT16 PresentLightness16;
+ MOBLEUINT16 PresentTemperature16;
+ MOBLEINT16 PresentCtlDelta16;
+}Appli_Light_CtlSet;
+
+/* Light Ctl Temperature Range Set */
+typedef struct
+{
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 RangeMin;
+ MOBLEUINT16 RangeMax;
+}Appli_Light_CtlTemperatureRangeSet;
+
+/* Light Ctl Default set */
+typedef struct
+{
+ MOBLEUINT16 CtlDefaultLightness16;
+ MOBLEUINT16 CtlDefaultTemperature16;
+ MOBLEINT16 CtlDefaultDeltaUv;
+}Appli_Light_CtlDefaultSet;
+
+/* Light Hsl Hue set */
+typedef struct
+{
+ MOBLEUINT16 HslLightness16;
+ MOBLEUINT16 HslHueLightness16;
+ MOBLEUINT16 HslSaturation16;
+}Appli_Light_HslSet;
+
+/* Light Hsl Hue set */
+typedef struct
+{
+ MOBLEUINT16 HslDefaultLightness16;
+ MOBLEUINT16 HslDefaultHueLightness16;
+ MOBLEUINT16 HslDefaultSaturation16;
+}Appli_Light_HslDefaultSet;
+
+typedef struct
+{
+ MOBLEUINT16 Red_Value;
+ MOBLEUINT16 Green_Value;
+ MOBLEUINT16 Blue_Value;
+}Appli_Light_RGBSet;
+
+typedef struct
+{
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 HslHueMinRange16;
+ MOBLEUINT16 HslHueMaxRange16;
+ MOBLEUINT16 HslMinSaturation16;
+ MOBLEUINT16 HslMaxSaturation16;
+}Appli_Light_HslRangeSet;
+
+typedef struct
+{
+ MOBLEUINT16 IntensityValue;
+ MOBLEUINT16 PwmRedValue;
+ MOBLEUINT16 PwmGreenValue;
+ MOBLEUINT16 PwmBlueValue;
+ MOBLEUINT16 PwmWarmValue;
+ MOBLEUINT16 PwmCoolValue;
+}Appli_LightPwmValue_t;
+#pragma pack(4)
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState);
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState);
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState);
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState);
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState);
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange);
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState);
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState);
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState);
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState);
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange);
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange);
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState);
+void Appli_Light_PwmInit(void);
+void HSL2RGB_Conversion(void);
+void Ctl_LedOffState(void);
+void Rgb_LedOffState(void);
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3);
+void Light_UpdateLedValue(MOBLEUINT8 state , Appli_LightPwmValue_t light_state);
+#endif /* __APPLI_LIGHT_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.c
new file mode 100644
index 000000000..96626b19a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.c
@@ -0,0 +1,102 @@
+/**
+******************************************************************************
+* @file appli_light_client.c
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "generic_client.h"
+#include "appli_light_client.h"
+#include "light_client.h"
+
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+extern MOBLEUINT8 Tid_Client;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_Lightness_Set: This function is callback for Application
+* when Lightness message is called
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pLightnessParam[3];
+
+ Appli_IntensityControlPublishing(pLightnessParam);
+ LightClient_Lightness_Set_Unack(elementAddr,
+ (_Light_LightnessParam*) pLightnessParam,
+ sizeof(pLightnessParam) );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.h
new file mode 100644
index 000000000..f216e5175
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.h
@@ -0,0 +1,62 @@
+/**
+******************************************************************************
+* @file appli_light_client.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_CLIENT_H
+#define __APPLI_LIGHT_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+
+
+#endif /* __APPLI_LIGHT_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c
new file mode 100644
index 000000000..961867aef
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @file appli_light_ctrl.c
+ * @author BLE Mesh Team
+ * @brief Application interface for light LC Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_light_lc.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variable ----------------------------------------------------------*/
+
+Appli_LightLC_Set_t Appli_LightLC_set;
+Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+
+MOBLEUINT16 AmbientLuxLevel;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_LCMode_Set: This function is callback for Application
+* when Light LC mode Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_mode = pLight_LC_Param->LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Mode Set: %d\n\r",
+ pLight_LC_Param->LC_mode);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OM_Set: This function is callback for Application
+* when Light LC mode Occupancy Model Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_OM = pLight_LC_Param->LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"OM Set: %d\n\r",
+ pLight_LC_Param->LC_OM);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OnOff_Set: This function is callback for Application
+* when Light LC On Off Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Present_Light_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"OnOff Set: %d\n\r",
+ pLight_LC_Param->Present_Light_OnOff);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Get_AmbientLuxLevelOutput: This function is given to calculate the Ambient
+ Lux level output from the ambient sensor.
+* @param void:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void)
+{
+ /* Use AmbientLuxLevel global variable to store the value from ambient lux sensor
+ and then use this value to copmpare the lux level output from state machine.
+ */
+
+ return AmbientLuxLevel;
+}
+
+/**
+* @brief Light_LC_LuxLevelPIRegulator: This function will calculate all the parameter
+* Kid,kpu,kiu,kpd and return the value Light Lightness Linear.
+* @param tableLuxLevel:
+* @param ambientLuxLevel:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,MOBLEUINT16 ambientLuxLevel)
+{
+ MOBLEUINT16 luxLevel = 0;
+ /* User can write their code for the calculation */
+
+
+ return luxLevel;
+}
+
+/**
+* @brief Appli_LightLC_Get_ModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+{
+ *(plcModeState) = Appli_LightLC_set.LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_mode);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OMModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOM_ModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState)
+{
+ *(plcOM_ModeState) = Appli_LightLC_set.LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"Get OM Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_OM);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OnOffStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOnOffState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
+{
+ *(plcOnOffState) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+1) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+2) = Appli_LightLC_set.Light_OnOffState;
+ TRACE_M(TF_SERIAL_CTRL,"Get On Off Status: %d\n\r",
+ Appli_LightLC_set.Light_OnOffState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c.ref
index 6cfe8bc27..c36abfb7f 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_light_lc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c.ref
@@ -84,7 +84,7 @@ MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
MOBLEUINT8 OptionalValid)
{
- Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Light_OnOff;
+ Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Present_Light_OnOff;
return MOBLE_RESULT_SUCCESS;
}
@@ -158,6 +158,8 @@ MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState)
MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
{
*(plcOnOffState) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+1) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+2) = Appli_LightLC_set.Light_OnOffState;
TRACE_M(TF_SERIAL_CTRL,"Get On Off Status: %d\n\r",
Appli_LightLC_set.Light_OnOffState);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.h
new file mode 100644
index 000000000..049d95308
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.h
@@ -0,0 +1,89 @@
+/**
+******************************************************************************
+* @file appli_light_ctrl.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Light Control Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_LC_H
+#define __APPLI_LIGHT_LC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "light_lc.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+/*******************************************************************************
+Following Variables are used for the Light LC Mode MODEL
+*******************************************************************************/
+/* Light Lightness set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 LC_mode;
+ MOBLEUINT8 LC_OM;
+ MOBLEUINT8 Light_OnOffState;
+ MOBLEUINT16 Light_OnOffValue;
+}Appli_LightLC_Set_t;
+
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT16 Property_Value;
+}Appli_Light_LC_PropertySet_t;
+#pragma pack(4)
+
+
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState);
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState);
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState);
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void);
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,
+ MOBLEUINT16 ambientLuxLevel);
+#endif /* __APPLI_LIGHT_LC_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.c
new file mode 100644
index 000000000..8bcc82534
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.c
@@ -0,0 +1,1785 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.c
+ * @author BLE Mesh Team
+ * @brief User Application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Includes ------------------------------------------------------------------*/
+#include "ble_common.h"
+#include "app_conf.h"
+#include "hal_common.h"
+#include "appli_mesh.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "ble_hal_aci.h"
+#include "ble_hci_le.h"
+#include <string.h>
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include "generic.h"
+#include "common.h"
+#include "serial_if.h"
+#include "appli_nvm.h"
+#include "pal_nvm.h"
+#include "appli_config_client.h"
+#include "appli_generic_client.h"
+#include "appli_light_client.h"
+
+#include "stm32_seq.h"
+#include "PWM_config.h"
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+#include "serial_prvn.h"
+#endif
+#include "mesh_cfg_usr.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+#define APPLI_OPTIM 0
+
+/*********** Macros to be modified according to the requirement *************/
+#define BOUNCE_THRESHOLD 20U
+#define LONG_PRESS_THRESHOLD 1000U
+#define MANUAL_UNPROVISION_TIMER 3000U
+#define FLASH_ERASE_TIME 100U
+//#define DISCOVER_TIMER 10*60*1000 /* 10 minutes */
+#define DISCOVER_TIMER_INTERVAL 10*60*(1000000/CFG_TS_TICK_VAL) /* 10 minutes */
+#if (APPLI_OPTIM == 1)
+#define APPLI_MESH_TIMER_INTERVAL 1*(1000/CFG_TS_TICK_VAL) /* 1 ms */
+#endif
+#define DEFAULT_DELAY_PACKET_FROM 500U
+#define DEFAULT_DELAY_PACKET_RANDOM_TIME 500U
+#define USER_OUTPUT_OOB_APPLI_PROCESS 0U
+#define INPUT_OOB_TIMEOUT 300U /* input Oob30 Sec timeout*/
+#define PBADV_UNPROV_DEV_BEACON_INTERVAL 100U /* 100 ms */
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#if (LOW_POWER_FEATURE == 1)
+#define LPN_API_TIMER_INTERVAL 30*(1000000/CFG_TS_TICK_VAL) /* 30 secondes */
+#endif
+/* Private macro -------------------------------------------------------------*/
+#define MAX_APPLI_BUFF_SIZE 8
+#define MAX_PENDING_PACKETS_QUE_SIZE 2
+#define DATA_BUFFER_LENGTH 8
+#define MAX_NUMB_ELEMENTS APPLICATION_NUMBER_OF_ELEMENTS
+#define CUSTOM_BEACON_AD_TYPE 0x00
+#define ENABLE_CUSTOM_BEACON 0
+#define CUSTOM_BEACON_INTERVAL 2000U
+
+/**********************Friendship callbacks macros ****************************/
+#define FN_CLEARED_REPEAT_REQUEST 1
+#define FN_CLEARED_POLL_TIMEOUT 2
+#define FN_CLEARED_FRIEND_CLEAR 3
+#define LPN_CLEARED_NO_RESPONSE 1
+
+/* Private variables ---------------------------------------------------------*/
+
+enum ButtonState
+{
+ BS_OFF,
+ BS_DEBOUNCE,
+ BS_SHORT_PRESS,
+ BS_LONG_PRESS
+};
+
+enum ButtonState buttonState = BS_OFF;
+tClockTime tBounce = 0;
+MOBLEUINT8 Appli_LedState = 0;
+MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
+MOBLEUINT8 IntensityFlag = FALSE;
+MOBLEUINT8 ProxyFlag = 0;
+MOBLEUINT8 ProvisionFlag = 0;
+
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+static MOBLEUINT8 PrvngInProcess = 0;
+static MOBLEUINT32 OutputOobData = 0;
+static MOBLEUINT32 OutputOobBlinkCount = 0;
+#endif
+
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+MOBLEUINT8 InputOobData[8] = {0};
+MOBLEUINT8 inputOOBDataReady = 0;
+#endif
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+NodeUnderProvisionParam_t NodeUnderProvisionParam;
+#endif
+
+/*Number Of Elements selected per Node. Maximum Elements supported = 3*/
+MOBLEUINT8 NumberOfElements = APPLICATION_NUMBER_OF_ELEMENTS;
+
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+/* 16 octets Static OOB information to be input here. Used during provisioning by Library */
+const MOBLEUINT8 StaticOobBuff[STATIC_OOB_SIZE] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+#else
+const MOBLEUINT8 StaticOobBuff[] = {0};
+#endif
+
+#ifdef PUB_KEY_TYPE_OOB
+/* 64 octets Public Key information to be input here. It is only required for Public Key OOB case.
+Used during provisioning by Library */
+const MOBLEUINT8 PubKeyBuff[64] = {0xF4, 0x65, 0xE4, 0x3F, 0xF2, 0x3D, 0x3F, 0x1B, 0x9D, 0xC7,
+0xDF, 0xC0, 0x4D, 0xA8, 0x75, 0x81, 0x84, 0xDB, 0xC9, 0x66, 0x20, 0x47, 0x96, 0xEC, 0xCF,
+0x0D, 0x6C, 0xF5, 0xE1, 0x65, 0x00, 0xCC, 0x02, 0x01, 0xD0, 0x48, 0xBC, 0xBB, 0xD8, 0x99,
+0xEE, 0xEF, 0xC4, 0x24, 0x16, 0x4E, 0x33, 0xC2, 0x01, 0xC2, 0xB0, 0x10, 0xCA, 0x6B, 0x4D,
+0x43, 0xA8, 0xA1, 0x55, 0xCA, 0xD8, 0xEC, 0xB2, 0x79};
+
+/* 32 octets Private Key information to be input here. It is only required for Public Key OOB case.
+Used during provisioning by Library */
+const MOBLEUINT8 PrivKeyBuff[32] = {0x52, 0x9A, 0xA0, 0x67, 0x0D, 0x72, 0xCD, 0x64, 0x97, 0x50,
+0x2E, 0xD4, 0x73, 0x50, 0x2B, 0x03, 0x7E, 0x88, 0x03, 0xB5, 0xC6, 0x08, 0x29, 0xA5, 0xA3,
+0xCA, 0xA2, 0x19, 0x50, 0x55, 0x30, 0xBA};
+#else
+const MOBLEUINT8 PubKeyBuff[] = NULL;
+const MOBLEUINT8 PrivKeyBuff[] = NULL;
+#endif
+
+
+
+/* Select Node as Sniffer, Means able to sniff all the packets
+* 0 - Filters are enabled and packets not targeted to node are filtered
+* 1 - Filters are disabled and packets not targeted to node are not filtered
+*/
+MOBLEUINT8 DisableFilter = 0;
+
+#if LOW_POWER_FEATURE
+MOBLEINT32 BLEMesh_sleepTime;
+MOBLEUINT32 SysRefCount;
+#endif
+
+MOBLEUINT8 network_conf[0x1000];
+MOBLEUINT8 nvm_operation;
+MOBLEUINT8 nvm_flash_page;
+MOBLEUINT8 provisioning_completion;
+
+/* Timer to control unprovisioned device beacons */
+#if PB_ADV_SUPPORTED
+MOBLEUINT8 discoverTimer_Id;
+tClockTime discoverTimerinterval = DISCOVER_TIMER_INTERVAL;
+#endif
+
+#if (APPLI_OPTIM == 1)
+MOBLEUINT8 appliTaskTimer_Id;
+#endif
+#if LOW_POWER_FEATURE
+volatile uint8_t BleProcessInit = 0;
+#endif
+#if (LOW_POWER_FEATURE == 1)
+MOBLEUINT8 lowPowerNodeApiTimer_Id;
+#endif
+
+/********************* Application configuration **************************/
+#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
+MOBLEUINT8 bdaddr[8];
+
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+static void Appli_GetMACfromUniqueNumber(void);
+#endif /* INTERNAL_UNIQUE_NUMBER_MAC */
+
+const void *mobleNvmBase;
+const void *appNvmBase;
+const void *prvsnr_data;
+#else
+#error "Unknown compiler"
+#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
+
+/* Private function prototypes -----------------------------------------------*/
+//static void Appli_LongButtonPress(void);
+static void Appli_ShortButtonPress(void);
+#if USER_OUTPUT_OOB_APPLI_PROCESS
+void Appli_OobAuthenticationProcess(void);
+#endif
+void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason);
+void Appli_LowPowerProcess(void);
+MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey, MOBLEUINT8* appKey, MOBLEUINT8 noOfElements);
+#if (APPLI_OPTIM == 1)
+static void AppliMeshTask(void);
+#endif
+void Appli_SelfConfigurationProcess(void);
+
+/* Private functions ---------------------------------------------------------*/
+
+/************************* Button Control functions ********************/
+/**
+* @brief Function calls when a button is pressed for short duration
+* @param void
+* @retval void
+*/
+static void Appli_ShortButtonPress(void)
+{
+ BLEMesh_ModelsCommand();
+}
+
+#if 0
+/**
+* @brief Function calls when a button is pressed for Long duration
+* @param void
+* @retval void
+*/
+static void Appli_LongButtonPress(void)
+{
+ /* User Implementation */
+}
+#endif
+
+/**
+* @brief Updates the button status
+* @param int isPressed
+* @retval void
+*/
+static void Appli_UpdateButtonState(int isPressed)
+{
+ uint32_t t0 = 0,t1 = 1;
+
+ t0 = Clock_Time(); /* SW1 press timing */
+
+ while(BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED);
+ t1 = Clock_Time(); /* SW1 release timing */
+
+ if((t1 - t0) > LONG_PRESS_THRESHOLD)
+ {
+ IntensityPublish();
+ }
+ else if((t1 - t0) > BOUNCE_THRESHOLD)
+ {
+ /* Button 1 short press action */
+ Appli_ShortButtonPress();
+ }
+}
+
+/**
+* @brief task for the BLE MESH, the MESH Models and the Appli processes
+* @param void
+* @retval void
+*/
+static void Mesh_Task()
+{
+ BLEMesh_Process();
+ BLEMesh_ModelsProcess(); /* Models Processing */
+
+#if (APPLI_OPTIM == 0)
+ /* Set the task in the scheduler for the next execution */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+#endif
+}
+
+/**
+* @brief task for the BLE MESH, the MESH Models and the Appli processes
+* @param void
+* @retval void
+*/
+static void Appli_Task()
+{
+ Appli_Process();
+
+#if (APPLI_OPTIM == 0)
+ /* Set the task in the scheduler for the next execution */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+#endif
+}
+
+/************************* LED Control functions ********************/
+/**
+* @brief Controls the state of on board LED
+* @param void
+* @retval void
+*/
+void Appli_LedCtrl(void)
+{
+ if(Appli_LedState)
+ {
+ BSP_LED_On(LED_BLUE);
+
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+
+ }
+}
+
+/************* BLE-Mesh library callback functions ***************/
+
+/**
+* @brief Blinks the on board LED
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_LedBlink(void)
+{
+ /* Switch On the LED */
+ Appli_LedState = 1;
+ Appli_LedCtrl();
+ Clock_Wait(500);
+
+ /* Switch Off the LED */
+ Appli_LedState = 0;
+ Appli_LedCtrl();
+ Clock_Wait(500);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Callback function Sets the state of the bulb
+* @param MOBLEUINT16 ctrl which sets the lighting state of LED
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl)
+{
+ /* Switch On the LED */
+ if(ctrl > 0)
+ {
+ Appli_LedState = 1;
+ }
+ /* Switch Off the LED */
+ else
+ {
+ Appli_LedState = 0;
+ }
+
+ Appli_LedCtrl();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief initializes BLE Stack
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleStackInitCb()
+{
+ /* BLE Stack initialization */
+ /* Not Required in BLE */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Sets transmission power of RF
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetTxPowerCb(void)
+{
+ tBleStatus status;
+ /* API to change the Transmission power of BLE Device */
+ /* uint8_t en_high_power, uint8_t pa_level
+ en_high_power Can be only 0 or 1. Set high power bit on or off.
+ pa_level Can be from 0 to 7. Set the PA level value
+ */
+ status = aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+ if (status)
+ return MOBLE_RESULT_FAIL;
+ else
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief SET UUID value
+* @param uuid_prefix_data : Pointer of UUID buffer data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data)
+{
+ /* UUID is 128 bits (16 bytes) and can guarantee uniqueness across space and time.
+ It can be “Time-based “ UUID or “truly-random or pseudo-random numbers”
+
+ In this buffer user need to fill 10 bytes of UUID data.
+ Remaining 6 bytes, library fill this data with BDaddress.
+
+ For example :
+ F81D4FAE-7DEC-XBC4-Y12F-17D1AD07A961 (16 bytes)
+ <any number> |_| |_| <BDAddress>
+
+ X = 1 i.e. “Time Base UUID”
+ X = 4 i.e. “Random Number“
+ Y = 4 i.e. Conforming to the current spec
+ For UUID information refer RFC4122
+ */
+
+ /* copy UUID prefix data*/
+ uint8_t uuid_buff[10] = {0xF8,0x1D,0x4F,0xAE,0x7D,0xEC};/*random value by user */
+
+ uuid_buff[6] = 0x4B; /* 0x4B => 4 : Random */
+ uuid_buff[7] = 'S' ; /* User define value */
+ uuid_buff[8] = 0xA1; /* 0xA1 => A : Conforming to the current Spec */
+ uuid_buff[9] = 'T' ; /* User define value */
+
+ memcpy(uuid_prefix_data,uuid_buff,sizeof(uuid_buff));
+ memcpy(&uuid_prefix_data[10],bdaddr,6); /* Copy bdaddr to last 6 bytes of UUID */
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief SET CID , PID and VID values
+* @param company_product_info : vendor fill product information in this buffer
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info)
+{
+ /* CID : provide 16-bit company identifier assigned by the Bluetooth SIG */
+ uint16_t company_id = COMPANY_ID;
+
+ /* PID : Provide 16-bit vendor-assigned product identifier */
+ uint16_t product_id = PRODUCT_ID;
+
+ /* VID : Provide 16-bit vendor-assigned product version identifier*/
+ uint16_t product_version_id = PRODUCT_VERSION_ID;
+
+ memcpy(company_product_info + 0,(void *)&company_id,sizeof(company_id));
+ memcpy(company_product_info + 2 ,(void *)&product_id,sizeof(product_id));
+ memcpy(company_product_info + 4 ,(void *)&product_version_id,sizeof(product_version_id));
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Call back function called when GATT Connection Created
+* @param none
+* @retval none
+*/
+void Appli_BleGattConnectionCompleteCb(void)
+{
+ ProvisionFlag = 1;
+ /* Proxy Node, will be called whenever Gatt connection is established */
+ /* Turn ON Red LED*/
+ ProxyFlag = 1;
+ BSP_LED_On(LED_GREEN);
+}
+
+/**
+* @brief Call back function called when GATT Disconnection Complete
+* @param none
+* @retval none
+*/
+void Appli_BleGattDisconnectionCompleteCb(void)
+{
+ ProvisionFlag = 0;
+ /* Proxy Node, will be called whenever Gatt disconnected */
+ /* Turn Off Red LED*/
+ ProxyFlag = 0;
+ BSP_LED_Off(LED_GREEN);
+}
+
+/**
+* @brief Unprovisioned Node Identification
+* @param MOBLEUINT8 data
+* @retval none
+*/
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
+{
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 1;
+#endif
+ TRACE_M(TF_PROVISION,"Unprovisioned Node Identifier received: %02x\n\r", data);
+}
+
+/**
+* @brief Set Number of Elements in a Node
+* @param none
+* @retval Sending the value to BLE Mesh Library
+*/
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
+{
+ if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ {
+ TRACE_M(TF_ELEMENTS,"In version 1.11.00x one Element per node is supported!\r\n");
+ return MAX_NUMB_ELEMENTS;
+ }
+
+ else if(NumberOfElements == 0)
+ {
+ TRACE_M(TF_ELEMENTS,"Number Of Elements must be 1 or greater than 1!\r\n");
+ return 1;
+ }
+
+ else
+ {
+ return NumberOfElements;
+ }
+}
+
+/**
+* @brief Sets the Attention Timer Callback function
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleAttentionTimerCb(void)
+{
+/* avoid printf, if low power feature is supported */
+#if (LOW_POWER_FEATURE == 0)
+ TRACE_M(TF_MISC, " \r\n");
+#endif /* LOW_POWER_FEATURE == 0 */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Call back function to give Output OOB information
+* @param MOBLEUINT8* output_oob
+* @param MOBLEUINT8 size
+* @retval void
+*/
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size)
+{
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ uint32_t ooBData = 0;
+ for (MOBLEUINT8 i = 0; i < size; i++)
+ {
+ ooBData |= (output_oob[i] << 8*i);
+ }
+ OutputOobData = ooBData;
+ TRACE_M(TF_PROVISION,"Output OOB information for provisioner: %ld\n\r", ooBData);
+ #endif
+}
+
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+/**
+* @brief Process for both output and Input OOB handling
+* @param void
+* @retval void
+*/
+void Appli_OobAuthenticationProcess(void)
+{
+ if(OutputOobBlinkCount < OutputOobData)
+ {
+ OutputOobBlinkCount++;
+ Appli_LedBlink();
+ }
+ else
+ {
+ OutputOobBlinkCount++;
+ Clock_Wait(1000);
+ if(OutputOobBlinkCount > OutputOobData+3)
+ {
+ OutputOobBlinkCount = 0;
+ }
+ }
+}
+#endif
+
+
+/**
+* @brief Call back function to provide Input OOB information
+* @param MOBLEUINT8 size
+* @retval MOBLEUINT8*
+*/
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
+{
+#if defined (ENABLE_AUTH_TYPE_INPUT_OOB) && (ENABLE_SERIAL_INTERFACE)
+ MOBLEUINT16 inputTimer = 0;
+ TRACE_M(TF_PROVISION,"Input OOB information for provisioner-Size: %d\n\r", size);
+ while(1)
+ {
+ Serial_InterfaceProcess();
+ /* Check if input is completed or timeout */
+ if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
+ {
+ inputOOBDataReady = 0;
+ break;
+ }
+ Clock_Wait(100);
+ inputTimer++;
+ }
+ return InputOobData;
+#else
+ return NULL;
+#endif
+}
+
+
+/**
+* @brief Call back function to provide Input OOB information
+* @param rcvdStringBuff: buffer to store input string
+* @param rcvdStringSize: length of the input string
+* @retval void
+*/
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+ unsigned long long InputOobDatatemp;
+ sscanf(rcvdStringBuff + 5, "%lld", &InputOobDatatemp);
+ memmove(&InputOobData, &InputOobDatatemp, sizeof(InputOobDatatemp));
+ inputOOBDataReady = 1;
+#endif
+}
+
+
+/**
+* @brief Application BLE Disable Filter
+* @param none
+* @retval Status is replied
+*/
+MOBLEUINT8 Appli_BleDisableFilterCb(void)
+{
+ return DisableFilter;
+}
+
+/**
+* @brief Checks and do Manual Unprovision of board
+* @param void
+* @retval void
+*/
+void Appli_CheckForUnprovision(void)
+{
+ /* Checks if the User button is pressed or not at the startup */
+ if (BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED)
+ {
+ BSP_LED_On(LED_BLUE);
+ tClockTime t = Clock_Time();
+ int interrupted = 0;
+
+ /*Wait to check if user is pressing the button persistently*/
+ while ((Clock_Time() - t) < MANUAL_UNPROVISION_TIMER)
+ {
+ if (BSP_PB_GetState(BUTTON_SW1) != BUTTON_PRESSED)
+ {
+ interrupted = 1;
+ break;
+ }
+ }
+ /* Unprovision, show that unprovisioning is completed, and
+ wait until user releases button*/
+ if (!interrupted)
+ {
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+ t = Clock_Time();
+ while ((Clock_Time() - t) < FLASH_ERASE_TIME)
+ {
+ BLEMesh_Process();
+ }
+
+ while (BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED)
+ {
+ Appli_LedBlink();
+ }
+ }
+ BSP_LED_Off(LED_BLUE);
+ NVIC_SystemReset();
+ }
+
+ /* Register the task for all MESH dedicated processes */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_REQ_ID, UTIL_SEQ_RFU, Mesh_Task );
+ /* Set the task in the scheduler for the next scheduling */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#else
+ BleProcessInit = 1;
+#endif
+
+ /* Register the task for all MESH dedicated processes */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_APPLI_REQ_ID, UTIL_SEQ_RFU, Appli_Task );
+ /* Set the task in the scheduler for the next scheduling */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+
+#if (APPLI_OPTIM == 1)
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &appliTaskTimer_Id, hw_ts_Repeated, AppliMeshTask);
+
+ HW_TS_Start(appliTaskTimer_Id, APPLI_MESH_TIMER_INTERVAL);
+#endif
+}
+
+void Appli_Unprovision(void)
+{
+ if(!ProxyFlag)
+ {
+ /* No GATT connection */
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+}
+
+/**
+* @brief Checks and updates Mac address to generate MAC Address
+* @param void
+* @retval MOBLEUINT8 sum return the sum calculated mac
+*/
+int Appli_CheckBdMacAddr(void)
+{
+ MOBLEUINT8 sum = 239;
+ MOBLEUINT8 result = 0;
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ memcpy(bdaddr, (MOBLEUINT8 *)CFG_ADV_BD_ADDRESS, 7);
+ bdaddr[7] = (EXTERNAL_MAC_ADDR_MGMT | EXTERNAL_MAC_TYPE);
+#endif
+
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+ aci_hal_read_config_data(0x00, &bdaddr[7], bdaddr);
+ Appli_GetMACfromUniqueNumber();
+ bdaddr[7] = INTERNAL_UNIQUE_NUMBER_MAC;
+#endif
+
+ for (int i = 0; i < 6; ++i)
+ {
+ sum = (sum << 1) + bdaddr[i];
+ }
+
+ if (sum == bdaddr[6])
+ {
+ result = 1;
+ }
+
+#if defined(EXTERNAL_MAC_ADDR_MGMT) && defined(EXTERNAL_MAC_IS_PUBLIC_ADDR)
+ /* Do nothing for modification of 2 MSb */
+#else
+ bdaddr[5] |= 0xC0; /* 2 Msb bits shall be 11b for Static Random Address */
+#endif
+
+#ifdef GENERATE_STATIC_RANDOM_MAC
+ bdaddr[7] = GENERATE_STATIC_RANDOM_MAC;
+ /* Do nothing for bdaddr, just pass the identification */
+ result = 1; /* This will overwrite the above for loop result,
+ which is redundant for this case */
+#endif
+
+ return result;
+}
+
+
+/**
+* @brief Reads the unique serial number of the device
+* @param void
+* @retval void
+*/
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+static void Appli_GetMACfromUniqueNumber(void)
+{
+#ifdef STM32L152xE
+ /************************STM32L152RE 96 bit Unique ID addresses***************/
+#define DEVICE_ID_REG0 (0x1FF800D0)
+#define DEVICE_ID_REG1 (0x1FF800D4)
+#define DEVICE_ID_REG2 (0x1FF800E4)
+#endif
+
+ /*
+ The unique serial number is a six bytes value generated from STM32 UID
+ stored at DEVICE_ID_REG0, DEVICE_ID_REG1 and DEVICE_ID_REG2. It is generated
+ cancating 4bytes from DEVICE_ID_REG2 and first bytes of DEVICE_ID_REG0 and
+ DEVICE_ID_REG1. Since the UID at DEVICE_ID_REG0 and
+ DEVICE_ID_REG1 could be identical for same batch samples,
+ 4 bytes have been taken from DEVICE_ID_REG2
+ */
+
+ uint8_t i;
+ uint8_t sum = 239;
+#if 0
+ uint8_t *ls_addr;
+
+ ls_addr = (uint8_t*)DEVICE_ID_REG2;
+
+ for(i = 0; i < 4; i += 1)
+ {
+ bdaddr[i] = *ls_addr;
+ ls_addr++;
+ }
+
+ bdaddr[4] = *(uint8_t*)(DEVICE_ID_REG0);
+ bdaddr[5] = (*(uint8_t*)(DEVICE_ID_REG1)) | 0xC0;
+#endif
+ /* Static Device Address:
+ The two most significant bits
+ of the address shall be equal to 1,
+ hence ORed with 0xC0)*/
+
+ for (i = 0; i < 6; ++i)
+ {
+ sum = (sum << 1) + bdaddr[i];
+ }
+ bdaddr[6] = sum;
+}
+#endif
+
+
+#if 0
+/**
+* @brief provides the information of the power saving mode
+* @param sleepMode curently unused, to be used in future
+* @retval SleepModes returns the mode of the controller
+*/
+SleepModes App_SleepMode_Check(SleepModes sleepMode)
+{
+ if (buttonState == BS_OFF)
+ {
+ return SLEEPMODE_WAKETIMER;
+ }
+ else
+ {
+ return SLEEPMODE_RUNNING;
+ }
+}
+#endif
+
+/**
+* @brief callback for unprovision the node by provisioner.
+* @param status reserved for future
+* @retval void
+*/
+void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason)
+{
+ ProvisionFlag = 0;
+ TRACE_I(TF_PROVISION,"Device is unprovisioned by provisioner \n\r");
+#if PB_ADV_SUPPORTED
+ BLEMesh_SetUnprovisionedDevBeaconInterval(PBADV_UNPROV_DEV_BEACON_INTERVAL);
+#endif
+ AppliNvm_ClearModelState();
+}
+
+/*----------------------------------------------------------------------------*/
+/* Following Functions are ONLY required for the Embedded Provisioner --------*/
+#if (defined(ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER))
+/*----------------------------------------------------------------------------*/
+
+void Appli_ProvisionerInit(void)
+{
+ NodeUnderProvisionParam.nodeAddress = 0;
+ NodeUnderProvisionParam.numOfElements = 0;
+ NodeUnderProvisionParam.Reserved1 = 0;
+ NodeUnderProvisionParam.saveToNVM = NVM_INIT;
+}
+
+
+/**
+* @brief Function for saving the Provisioned node address
+* @param void
+* @retval void
+*/
+void SaveProvisionedNodeAddress(void)
+{
+ NodeUnderProvisionParam.nodeAddress = NodeUnderProvisionParam.newNodeAddress;
+ NodeUnderProvisionParam.numOfElements = NodeUnderProvisionParam.newNodeElements;
+
+ if (NodeUnderProvisionParam.saveToNVM == NVM_SAVE_PENDING)
+ {
+ NodeUnderProvisionParam.saveToNVM = NVM_INIT;
+ AppliPrvnNvm_SaveKeys(1); /* This will trigger the saving in flash */
+ }
+}
+
+
+/**
+* @brief Getting the New Node Provisioning Device Key
+* @param void
+* @retval void
+*/
+MOBLEUINT8* GetNewProvNodeDevKey(void)
+{
+ return &NodeUnderProvisionParam.NewProvNodeDevKey[0];
+}
+
+
+/**
+* @brief Getting the New Node under Provisioning Application Key
+* @param void
+* @retval void
+*/
+MOBLEUINT8* GetNewProvNodeAppKey(void)
+{
+ return &NodeUnderProvisionParam.NewProvNodeAppKey[0];
+}
+
+
+/**
+* @brief Function to Get the Node Address for provisioning
+* @param void
+* @retval void
+*/
+MOBLE_ADDRESS GetAddressToConfigure(void)
+{
+ return NodeUnderProvisionParam.nodeAddress;
+}
+
+
+/**
+* @brief Function to Get the Node Address for provisioning
+* @param void
+* @retval void
+*/
+MOBLE_ADDRESS GetNewAddressToProvision(void)
+{
+ return NodeUnderProvisionParam.nodeAddress + NodeUnderProvisionParam.numOfElements;
+}
+
+
+/**
+* @brief callback for getting the Node Address by provisioner & giving device key, app key & number of elements.
+* @param device key, app key & number of elements
+* @retval To be assigned Node Address
+*/
+MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey,
+ MOBLEUINT8* appKey,
+ MOBLEUINT8 numOfElements)
+{
+ MOBLE_ADDRESS newNodeAddressToProvision;
+ MOBLEUINT8 *pUUID = {0}; /* Not used currently, not passed by Provisioner */
+
+ /* Make a copy for DeviceKey and ApplicationKey, these are required later for
+ device configuration */
+ memcpy(&NodeUnderProvisionParam.NewProvNodeDevKey[0], devKey, DEVICE_KEY_SIZE);
+ memcpy(&NodeUnderProvisionParam.NewProvNodeAppKey[0], appKey, APP_KEY_SIZE);
+
+ /* Print the keys for user */
+ TRACE_M(TF_PROVISION,"Device Key: ");
+ for (MOBLEUINT8 count=0 ; count<DEVICE_KEY_SIZE; count++)
+ {
+ TRACE_I(TF_PROVISION,"%.2x ", NodeUnderProvisionParam.NewProvNodeDevKey[count]);
+ }
+
+ TRACE_I(TF_PROVISION,"\r\n");
+
+ TRACE_M(TF_PROVISION,"App Key: ");
+ for (MOBLEUINT8 count=0 ; count<DEVICE_KEY_SIZE; count++)
+ {
+ TRACE_I(TF_PROVISION,"%.2x ", NodeUnderProvisionParam.NewProvNodeAppKey[count]);
+ }
+
+ TRACE_I(TF_PROVISION,"\r\n");
+
+ newNodeAddressToProvision = GetNewAddressToProvision();
+ TRACE_M(TF_PROVISION,"Node Address Assigned = %d \r\n",newNodeAddressToProvision);
+
+ /* Save Dev key and number of Elements */
+ AppliPrvnNvm_SaveData(NodeUnderProvisionParam.NewProvNodeDevKey,
+ newNodeAddressToProvision,
+ pUUID,
+ numOfElements);
+
+ NodeUnderProvisionParam.saveToNVM = NVM_SAVE_PENDING;
+
+ return newNodeAddressToProvision;
+}
+
+
+/**
+* @brief start Provisioner mode
+* @param void
+* @retval void
+*/
+void Appli_StartProvisionerMode(MOBLEUINT8 mode)
+{
+ MOBLEUINT8 prvsnrDevKey[16];
+ MOBLEUINT8 PrvnDevKeyFlag = mode;
+
+ /* Initializes Mesh network parameters */
+ BLEMesh_CreateNetwork(prvsnrDevKey);
+
+ /* Following functions help to Configure the Provisioner to default settings*/
+ Start_SelfConfiguration();
+
+ TRACE_I(TF_PROVISION,"Provisioner node \r\n");
+ TRACE_I(TF_PROVISION,"Provisioner Dev Key:");
+ for(MOBLEUINT8 i=0;i<16;i++)
+ {
+ TRACE_I(TF_INIT,"[%02x] ",prvsnrDevKey[i]);
+ }
+ TRACE_I(TF_INIT,"\r\n");
+
+ if (mode ==1)
+ {
+ AppliPrvnNvm_SaveProvisionerDevKey(&prvsnrDevKey[0],
+ PROVISIONER_ROOT_ADDR_DEFAULT,
+ &PrvnDevKeyFlag,
+ APPLICATION_NUMBER_OF_ELEMENTS);
+ }/* if (mode ==1) */
+}
+
+
+#define SELF_CONFIG_IDLE_STATE 0
+#define SELF_CONFIG_INIT_STATE 1
+#define SELF_CONFIG_START_STATE 2
+#define SELF_APPKEY_BIND_STATE 3
+#define SELF_SUBSCRIBE_DEFAULT_STATE 4
+#define SELF_PUBLISH_DEFAULT_STATE 5
+uint8_t self_config_state= SELF_CONFIG_IDLE_STATE;
+
+void Start_SelfConfiguration (void)
+{
+ self_config_state = SELF_CONFIG_INIT_STATE;
+}
+
+/**
+* @brief callback for getting the Node Address by provisioner & giving device key.
+* @param void
+* @retval void
+*/
+void Appli_SelfConfigurationProcess(void)
+{
+ /* Following functions help to Configure the Provisioner to default settings*/
+
+ switch (self_config_state)
+ {
+ case SELF_CONFIG_IDLE_STATE:
+ /* Nothing to do, just wait*/
+ return;
+
+ case SELF_CONFIG_INIT_STATE:
+ /* This state is just to make a "NVM Process" to run once, because the
+ function will exit after changing the state*/
+ self_config_state = SELF_CONFIG_START_STATE;
+ break;
+
+ case SELF_CONFIG_START_STATE:
+ ApplicationSetNodeSigModelList();
+ self_config_state = SELF_APPKEY_BIND_STATE;
+ break;
+
+ case SELF_APPKEY_BIND_STATE:
+ Appli_ConfigClient_SelfDefaultAppKeyBind();
+ self_config_state = SELF_SUBSCRIBE_DEFAULT_STATE;
+ break;
+
+ case SELF_SUBSCRIBE_DEFAULT_STATE:
+ AppliConfigClient_SelfSubscriptionSetDefault();
+ self_config_state = SELF_PUBLISH_DEFAULT_STATE;
+ break;
+
+ case SELF_PUBLISH_DEFAULT_STATE:
+ AppliConfigClient_SelfPublicationSetDefault();
+ self_config_state = SELF_CONFIG_IDLE_STATE;
+ break;
+
+
+ default:
+ break;
+ }
+}
+
+/*----------------------------------------------------------------------------*/
+/* The Embedded Provisioner specific code ends ------------------------------ */
+#endif /* (PROVISIONER_FEATURE == 1) */
+/*----------------------------------------------------------------------------*/
+
+/**
+* @brief This function scans and prints unprovisioned devices
+* @param unprovDeviceArray: Pointer of an array for filling unprovisioned device UUIDs
+* @param noOfUnprovDevices: Pointer to take total count of nearby unprovisioned devices
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices)
+{
+ MOBLE_RESULT result;
+
+ result = BLEMesh_GetNeighborState(unprovDeviceArray,noOfUnprovDevices);
+ /* Array print for testing */
+ /* Check if any unprovisioned device is available */
+ if(!(*noOfUnprovDevices))
+ {
+ TRACE_I(TF_PROVISION,"No Unprovisioned Device Nearby\r\n");
+ }
+ else
+ {
+ for(MOBLEINT8 count=0; count < *noOfUnprovDevices; count++)
+ {
+ BLEMesh_PrintStringCb("");
+ TRACE_I(TF_PROVISION,"Device-%d -> ", count);
+ BLEMesh_PrintDataCb(unprovDeviceArray[count].uuid, 16);
+ }
+ }
+ return result;
+}
+/**
+* @brief This function returns starts the provisioning of one of the devices
+* @param unprovDeviceArray: Pointer of an array having unprovisioned device UUIDs
+* @param index: Index of the device to be provisioned
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ result = BLEMesh_ProvisionRemote((unprovDeviceArray+index)->uuid);
+
+ return result;
+}
+
+/* Customized implementation for provisioning a device from mesh node - End */
+
+/**
+* @brief Call back function called when PB-ADV link Opened
+* @param none
+* @retval none
+*/
+void BLEMesh_PbAdvLinkOpenCb(void)
+{
+ ProvisionFlag = 0;
+ TRACE_M(TF_PROVISION,"PB-ADV Link opened successfully \n\r");
+ SerialPrvn_ProvisioningStatusUpdateCb(MOBLE_TRUE, 0);
+ /* Turn ON Red LED*/
+#if LOW_POWER_FEATURE
+ /* do nothing */
+#else
+ BSP_LED_On(LED_RED);
+#endif
+}
+
+
+/**
+* @brief Call back function called when PB-ADV link Closed
+* @param none
+* @retval none
+*/
+void BLEMesh_PbAdvLinkCloseCb(void)
+{
+ TRACE_M(TF_PROVISION,"PB-ADV Link Closed successfully \n\r");
+ /* Turn Off Red LED*/
+#if LOW_POWER_FEATURE
+ /* do nothing */
+#else
+ BSP_LED_Off(LED_RED);
+ SerialPrvn_ProvisioningStatusUpdateCb(MOBLE_FALSE, NodeUnderProvisionParam.nodeAddress);
+#endif
+
+ if (ProvisionFlag == 1)
+ {
+ SaveProvisionedNodeAddress();
+ ProvisionFlag = 0;
+ Appli_ConfigClientStartNodeConfiguration(1);
+ }
+
+}
+
+
+/**
+* @brief callback for provision the node by provisioner.
+* @param void
+* @retval void
+*/
+void BLEMesh_ProvisionCallback(void)
+{
+ ProvisionFlag = 1;
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 0;
+#endif
+ TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
+
+}
+
+
+/**
+* @brief callback for friendship established by friend node
+* @param address of corresponding low power node
+* @param receive delay of low power node (unit ms)
+* @param poll timeout of low power node (unit 100ms)
+* @param number of elements of low power node
+* @param previous friend address of low power node (can be invalid address)
+* @retval void
+*/
+void BLEMesh_FnFriendshipEstablishedCallback(MOBLE_ADDRESS lpnAddress,
+ MOBLEUINT8 lpnReceiveDelay,
+ MOBLEUINT32 lpnPollTimeout,
+ MOBLEUINT8 lpnNumElements,
+ MOBLE_ADDRESS lpnPrevFriendAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship established. Low power node address 0x%.4X \r\n", lpnAddress);
+ TRACE_M(TF_LPN_FRND,"Low power node receive delay %dms \r\n", lpnReceiveDelay);
+ TRACE_M(TF_LPN_FRND,"Low power node poll timeout %ldms \r\n", lpnPollTimeout*100);
+ TRACE_M(TF_LPN_FRND,"Low power node number of elements %d \r\n", lpnNumElements);
+ if (lpnPrevFriendAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_LPN_FRND,"Low power node previous friend address 0x%.4X \r\n", lpnPrevFriendAddress);
+ }
+}
+
+/**
+* @brief callback for friendship clear by friend node
+* @param reason of friendship clear
+* 0: reserved,
+* 1: friend request received from existing low power node (friend)
+* 2: low power node poll timeout occurred
+* 3: friend clear received
+* @param previous friend address of low power node (can be invalid address)
+* @retval void
+*/
+void BLEMesh_FnFriendshipClearedCallback(MOBLEUINT8 reason, MOBLE_ADDRESS lpnAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship cleared. Low power node address 0x%.4X \r\n", lpnAddress);
+
+ switch(reason)
+ {
+ case FN_CLEARED_REPEAT_REQUEST:
+ TRACE_M(TF_LPN_FRND,"Reason: New friend request received from existing low power node \r\n");
+ break;
+ case FN_CLEARED_POLL_TIMEOUT:
+ TRACE_M(TF_LPN_FRND,"Reason: Low power node poll timeout occurred \r\n");
+ break;
+ case FN_CLEARED_FRIEND_CLEAR:
+ TRACE_M(TF_LPN_FRND,"Reason: Friend clear received \r\n");
+ break;
+ default:
+ TRACE_M(TF_LPN_FRND,"Reason: Invalid \r\n");
+ break;
+ }
+}
+
+/**
+* @brief callback for friendship established by low power node
+* @param address of corresponding friend node
+* @retval void
+*/
+void BLEMesh_LpnFriendshipEstablishedCallback(MOBLE_ADDRESS fnAddress)
+{
+ /* Friendship established */
+ TRACE_M(TF_LPN_FRND,"Friend node responding, friendship established.\r\n");
+}
+
+/**
+* @brief callback for friendship cleare by low power node
+* @param reason of friendship clear.
+* 0: reserved
+* 1: No response received from friend node
+* @retval void
+*/
+void BLEMesh_LpnFriendshipClearedCallback(MOBLEUINT8 reason, MOBLE_ADDRESS fnAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship cleared. Friend node address 0x%.4x \r\n", fnAddress);
+
+ if (reason == LPN_CLEARED_NO_RESPONSE)
+ {
+ TRACE_M(TF_LPN_FRND,"Reason: Friend node not responding \r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LPN_FRND,"Reason: Invalid \r\n");
+ }
+}
+
+/**
+* @brief New neighbor appeared callback in neighbor table.
+ If MAC address of neighbor changes it appears as new neighbor.
+* @param MAC address of neighbor.
+* is neighbor provisioned or unprovisioned device.
+* uuid of neighbor. NULL if not available
+* network address of neighbor. MOBLE_ADDRESS_UNASSIGNED if not available
+* last updated rssi value.
+* @retval void
+*/
+void BLEMesh_NeighborAppearedCallback(const MOBLEUINT8* bdAddr,
+ MOBLEBOOL provisioned,
+ const MOBLEUINT8* uuid,
+ MOBLE_ADDRESS networkAddress,
+ MOBLEINT8 rssi)
+{
+ TRACE_M(TF_NEIGHBOUR,"New neighbor appeared. Neighbor MAC address:");
+
+ for (MOBLEUINT8 count=0 ; count<6; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", bdAddr[count]);
+ }
+
+ if (provisioned == MOBLE_TRUE)
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Provisioned node. \n\r");
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Unprovisioned device. \n\r");
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"rssi: %d. ", rssi);
+
+ if (networkAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address: 0x%.4x\n\r", networkAddress);
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address not available\n\r");
+ }
+
+ for (MOBLEUINT8 i=0; i<16; i++)
+ {
+ if (uuid[i] == 0x00)
+ {
+ continue;
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"UUID: ");
+
+ for (MOBLEUINT8 count=0 ; count<16; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", uuid[count]);
+ }
+
+ break;
+ }
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"\n\r");
+}
+
+/**
+* @brief Existing neighbor refreshed callback in neighbor table.
+ If MAC address of neighbor changes it appears as new neighbor.
+* @param MAC address of neighbor.
+* is neighbor provisioned or unprovisioned device.
+* uuid of neighbor. NULL if not available
+* network address of neighbor. MOBLE_ADDRESS_UNASSIGNED if not available
+* last updated rssi value.
+* @retval void
+*/
+void BLEMesh_NeighborRefreshedCallback(const MOBLEUINT8* bdAddr,
+ MOBLEBOOL provisioned,
+ const MOBLEUINT8* uuid,
+ MOBLE_ADDRESS networkAddress,
+ MOBLEINT8 rssi)
+{
+ TRACE_M(TF_NEIGHBOUR,"Existing neighbor refreshed. Neighbor MAC address:");
+
+ for (MOBLEUINT8 count=0 ; count<6; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", bdAddr[count]);
+ }
+
+ if (provisioned == MOBLE_TRUE)
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Provisioned node. \n\r");
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Unprovisioned device. \n\r");
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"rssi: %d. ", rssi);
+
+ if (networkAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address: 0x%.4x\n\r", networkAddress);
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address not available\n\r");
+ }
+
+ for (MOBLEUINT8 i=0; i<16; i++)
+ {
+ if (uuid[i] == 0x00)
+ {
+ continue;
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"UUID: ");
+
+ for (MOBLEUINT8 count=0 ; count<16; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", uuid[count]);
+ }
+
+ break;
+ }
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"\n\r");
+}
+
+/**
+* @brief Beacon received callback
+* Beacons are received only if received beacon ad type is not
+* Mesh Message, Mesh Beacon or PB-ADV
+* @param MAC address
+* data
+* length of beacon
+* rssi value of beacon
+* @retval void
+*/
+#if (ENABLE_CUSTOM_BEACON == 1)
+/* BLEMesh_CustomBeaconReceivedCallback high frequency callback */
+void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
+ const MOBLEUINT8* data,
+ MOBLEUINT8 length,
+ MOBLEINT8 rssi)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (length < 2)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_BEACON, "Message is too small \r\n");
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if ((length-1) < data[0])
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
+ }
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ MOBLEUINT8 adType = data[1];
+ MOBLEUINT8 i;
+
+ if (adType == CUSTOM_BEACON_AD_TYPE)
+ {
+ TRACE_M(TF_BEACON, "Message length(%d), ad type(0x%.2x), rssi(%d) \r\n", length-2, adType, rssi);
+ TRACE_M(TF_BEACON, "Message:\r\n");
+ for(i = 0; i < length-2; i++)
+ TRACE_M(TF_BEACON, "data[%d]= %d\r\n", i, data[2+i]);
+ }
+ else
+ {
+ /* Discard, Ad type mismatch */
+ }
+ }
+}
+#endif /* BLEMesh_CustomBeaconReceivedCallback high frequency callback */
+
+/**
+* @brief Custom beacon generator
+* If size set to > 31 bytes, beacon is rejected
+* BLEMesh_SetCustomBeaconInterval should be set to get this callback
+* @param beacon data buffer. It includes length and AD type fields
+* buffer size
+* @retval void
+*/
+void BLEMesh_CustomBeaconGeneratorCallback(void* buffer, MOBLEUINT8* size)
+{
+ MOBLEUINT8 adType = CUSTOM_BEACON_AD_TYPE;
+ MOBLEUINT8 dataLength = 5;
+ MOBLEUINT8 data[5] = {0x00,0x01,0x02,0x03,0x04};
+ MOBLEUINT8* buf = (MOBLEUINT8*)buffer;
+
+ buf[0] = dataLength+1;
+ buf[1] = adType;
+ memcpy(buf+2, data, dataLength);
+
+ *size = dataLength+2;
+}
+
+/**
+* @brief Low Power mode process
+* If low power feature is supported, device enables low power mode
+* @param void
+* @retval void
+*/
+void Appli_LowPowerProcess(void)
+{
+#if 0
+#if LOW_POWER_FEATURE
+ BluenrgMesh_sleepTime = (MOBLEINT32)BluenrgMesh_GetSleepDuration();
+
+ if (BluenrgMesh_sleepTime > 0)
+ {
+ /* Timer 0 used for low power */
+ HAL_VTimerStart_ms(0, BluenrgMesh_sleepTime);
+
+ /* To start virtual timer */
+ BTLE_StackTick();
+
+ /* save virtual timer current count */
+ SysRefCount = HAL_VTimerGetCurrentTime_sysT32();
+
+ /* wakeup either from io or virtual timer */
+ BlueNRG_Sleep(SLEEPMODE_WAKETIMER, WAKEUP_IO13, WAKEUP_IOx_LOW);
+
+ /* update systick count based on updated virtual timer count */
+ Set_Clock_Time(Clock_Time() +
+ HAL_VTimerDiff_ms_sysT32(HAL_VTimerGetCurrentTime_sysT32(), SysRefCount));
+
+ /* Stop Timer 0 */
+ HAL_VTimer_Stop(0);
+ }
+#endif /* LOW_POWER_FEATURE */
+#endif
+}
+
+/**
+* @brief Appli_IntensityControlPublishing:Function is used to set the intensity value.
+* Publishing the value.
+* @param void
+* @retval void
+*/
+void Appli_IntensityControlPublishing(MOBLEUINT8* value)
+{
+
+ if(IntensityFlag == FALSE)
+ {
+
+ IntensityValue = IntensityValue + (INTENSITY_LEVEL_FULL/5);
+ value[0] = (MOBLEUINT8)IntensityValue;
+ value[1] = (MOBLEUINT8)(IntensityValue >> 8) ;
+
+ if(IntensityValue >= INTENSITY_LEVEL_FULL)
+ {
+ IntensityFlag = TRUE;
+ }
+
+ }
+ else
+ {
+
+ IntensityValue = IntensityValue - (INTENSITY_LEVEL_FULL/5);
+ value[0] = (MOBLEUINT8)IntensityValue;
+ value[1] = (MOBLEUINT8)(IntensityValue >> 8) ;
+
+ if(IntensityValue <= INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = FALSE;
+ }
+
+ }
+}
+
+
+/**
+* @brief Publish the intensity value for generic level or light lightness
+* This function should be called in main loop
+* @param void
+* @retval void
+*/
+void IntensityPublish(void)
+{
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ Appli_LightClient_Lightness_Set();
+#endif
+
+#ifdef GENERIC_CLIENT_MODEL_PUBLISH
+ Appli_GenericClient_Level_Set_Unack();
+#endif
+}
+
+/**
+* @brief Application processing
+* This function should be called in main loop
+* @param void
+* @retval void
+*/
+void Appli_Process(void)
+{
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ AppliNvm_Process();
+#endif
+
+#if (SAVE_EMBD_PROVISION_DATA == 1)
+ AppliPrvnNvm_Process();
+#endif
+
+ Appli_LowPowerProcess();
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ if(PrvngInProcess)
+ {
+#if USER_OUTPUT_OOB_APPLI_PROCESS
+ Appli_OobAuthenticationProcess();
+#endif
+ }
+#endif
+
+ Appli_ConfigClient_Process();
+ Appli_SelfConfigurationProcess();
+
+#ifdef TPT_LAYER_BUSY_TEST
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ //SdkEvalLedOn(LED1);
+ }
+ else
+ {
+ //SdkEvalLedOff(LED1);
+ }
+#endif
+}
+
+#if PB_ADV_SUPPORTED
+static void UnprovisionedDeviceBeaconApp(void)
+{
+ BLEMesh_SetUnprovisionedDevBeaconInterval(0);
+}
+
+static void UnprovisionedDeviceBeaconTask(void)
+{
+ /**
+ * The code shall be executed in the background as aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_BEACON_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+#if (APPLI_OPTIM == 1)
+static void AppliMeshTask(void)
+{
+ /* Set the task in the scheduler for the next execution */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+static void AppliMeshSW1Task(void)
+{
+ Appli_UpdateButtonState(BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED);
+
+ return;
+}
+
+#if (LOW_POWER_FEATURE == 1)
+static void LowPowerNodeApiApp(void)
+{
+ TRACE_I(TF_PROVISION,"Scan disabled \r\n");
+ BLEMesh_LpnDisableScan();
+ return;
+}
+
+static void LowPowerNodeApiTask(void)
+{
+ /* Set the task in the scheduler for the next execution */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_LPN_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+/**
+* @brief function to inintiallise the GPIO interrupt fot Power down
+* @param void
+* @retval void
+*/
+static void GPIO_InitNVICPowerOff(void)
+{
+ GPIO_InitTypeDef gpioinitstruct = {0};
+
+ /* Enable the PowerOff GPIO Clock */
+ POWEROFF_GPIO_CLK_ENABLE();
+
+ /* Configure PowerOff pin as input with External interrupt */
+ gpioinitstruct.Pin = POWEROFF_PIN;
+ gpioinitstruct.Pull = GPIO_PULLUP;
+ gpioinitstruct.Mode = GPIO_MODE_IT_FALLING;
+ HAL_GPIO_Init(POWEROFF_GPIO_PORT, &gpioinitstruct);
+
+ /* Enable and set PowerOff EXTI Interrupt to the lowest priority */
+ HAL_NVIC_SetPriority((IRQn_Type)(POWEROFF_EXTI_IRQn), 0x0F, 0x00);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(POWEROFF_EXTI_IRQn));
+}
+#endif
+
+/**
+* @brief Initializes the Application
+* @param void
+* @retval void
+*/
+void Appli_Init(MOBLEUINT8 *flag)
+{
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+ /* Hardware Factory Restore implementation */
+ AppliNvm_FactorySettingReset();
+#endif
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
+ Appli_ProvisionerInit();
+
+ /* Scan the Provisioner data and Restore the address and num of elements */
+ AppliPrvnNvm_FactorySettingReset(flag);
+
+#endif
+
+#if PB_ADV_SUPPORTED
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_BEACON_REQ_ID, UTIL_SEQ_RFU, UnprovisionedDeviceBeaconApp );
+ /**
+ * Create Timer to control unprovisioned device beacons
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &discoverTimer_Id, hw_ts_SingleShot, UnprovisionedDeviceBeaconTask);
+
+ HW_TS_Start(discoverTimer_Id, DISCOVER_TIMER_INTERVAL);
+#endif
+
+#if ENABLE_SERIAL_INTERFACE
+ Serial_Init();
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ GPIO_InitNVICPowerOff();
+#endif
+
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
+ __HAL_RCC_TIM1_CLK_ENABLE();
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ PWM_Init();
+#endif
+
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
+
+#if (ENABLE_CUSTOM_BEACON == 1)
+ BLEMesh_SetCustomBeaconInterval(CUSTOM_BEACON_INTERVAL);
+#endif
+
+#if (LOW_POWER_FEATURE == 1) /**
+ * Create Timer to control unprovisioned device beacons
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &lowPowerNodeApiTimer_Id, hw_ts_SingleShot, LowPowerNodeApiTask);
+
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_LPN_REQ_ID, UTIL_SEQ_RFU, LowPowerNodeApiApp );
+#endif
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h
new file mode 100644
index 000000000..489ca8dc0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h
@@ -0,0 +1,127 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.h
+ * @author BLE Mesh Team
+ * @brief Header file for the user application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_MESH_H
+#define __APPLI_MESH_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "mesh_cfg_usr.h"
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* MACROS for Power Level definitions */
+#define POWER_LEVEL_LOW 0
+#define TX_POWER_LEVEL_MINUS_18DBM 0 /* = -18 dBm, */
+#define TX_POWER_LEVEL_MINUS_15DBM 1 /* = -15 dBm, */
+#define TX_POWER_LEVEL_MINUS_12DBM 2 /* = -12 dBm, */
+#define TX_POWER_LEVEL_MINUS_9DBM 3 /* = -9 dBm, */
+#define TX_POWER_LEVEL_MINUS_6DBM 4 /* = -6 dBm, */
+#define TX_POWER_LEVEL_MINUS_2DBM 5 /* = -2 dBm, */
+#define TX_POWER_LEVEL_0DBM 6 /* = 0 dBm, */
+#define TX_POWER_LEVEL_PLUS_5DBM 7 /* = 5 dBm. */
+#define POWER_LEVEL_HIGH 1
+#define TX_POWER_LEVEL_MINUS_14DBM 0 /* = -14 dBm, */
+#define TX_POWER_LEVEL_MINUS_11DBM 1 /* = -11 dBm, */
+#define TX_POWER_LEVEL_MINUS_8DBM 2 /* = -8 dBm, */
+#define TX_POWER_LEVEL_MINUS_5DBM 3 /* = -5 dBm, */
+#define TX_POWER_LEVEL_PLUS_2DBM 5 /* = 2 dBm, */
+#define TX_POWER_LEVEL_PLUS_4DBM 6 /* = 4 dBm, */
+#define TX_POWER_LEVEL_PLUS_8DBM 7 /* = 8 dBm */
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+#define POWEROFF_PIN GPIO_PIN_12
+#define POWEROFF_GPIO_PORT GPIOB
+#define POWEROFF_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define POWEROFF_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define POWEROFF_EXTI_LINE GPIO_PIN_12
+#define POWEROFF_EXTI_IRQn EXTI15_10_IRQn
+#endif
+
+typedef enum _prvn_nvm_state
+{
+ NVM_INIT = 0,
+ NVM_SAVE_PENDING,
+} prvn_nvm_state;
+
+/* Exported variables ------------------------------------------------------- */
+
+extern MOBLEUINT8 bdaddr[];
+
+typedef struct
+{
+ MOBLEUINT16 nodeAddress;
+ MOBLEUINT8 numOfElements;
+ MOBLEUINT8 Reserved1; /* For Alignment by 4*/
+ MOBLEUINT16 newNodeAddress;
+ MOBLEUINT8 newNodeElements;
+ prvn_nvm_state saveToNVM;
+ MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeUUID[UUID_SIZE];
+} NodeUnderProvisionParam_t;
+
+extern NodeUnderProvisionParam_t NodeUnderProvisionParam;
+extern MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+extern MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_BleStackInitCb(void);
+MOBLE_RESULT Appli_BleSetTxPowerCb(void);
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data);
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info);
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data);
+void Appli_BleGattConnectionCompleteCb(void);
+void Appli_BleGattDisconnectionCompleteCb(void);
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void);
+MOBLE_RESULT Appli_BleAttentionTimerCb(void);
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size);
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size);
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLEUINT8 Appli_BleDisableFilterCb(void);
+void BLEMesh_PbAdvLinkCloseCb(void);
+void Appli_IntensityControlPublishing(MOBLEUINT8* value);
+
+int Appli_CheckBdMacAddr(void);
+MOBLE_RESULT Appli_LedBlink(void);
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl);
+
+void Appli_CheckForUnprovision(void);
+void Appli_Unprovision(void);
+void Appli_Process(void);
+void Appli_LedCtrl(void);
+void Appli_Init(MOBLEUINT8 *flag);
+
+MOBLE_ADDRESS GetAddressToConfigure(void);
+MOBLE_ADDRESS GetNewAddressToProvision(void);
+void SaveProvisionedNodeAddress(void);
+MOBLEUINT8* GetNewProvNodeDevKey(void);
+MOBLEUINT8* GetNewProvNodeAppKey(void);
+void IntensityPublish(void);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
+void Start_SelfConfiguration (void);
+void Appli_ProvisionerInit(void);
+void Appli_StartProvisionerMode(MOBLEUINT8 mode);
+
+
+#endif /* __APPLI_MESH_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h.ref b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h.ref
new file mode 100644
index 000000000..214e5c92d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h.ref
@@ -0,0 +1,127 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.h
+ * @author BLE Mesh Team
+ * @brief Header file for the user application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_MESH_H
+#define __APPLI_MESH_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "mesh_cfg_usr.h"
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* MACROS for Power Level definitions */
+#define POWER_LEVEL_LOW 0
+#define TX_POWER_LEVEL_MINUS_18DBM 0 /* = -18 dBm, */
+#define TX_POWER_LEVEL_MINUS_15DBM 1 /* = -15 dBm, */
+#define TX_POWER_LEVEL_MINUS_12DBM 2 /* = -12 dBm, */
+#define TX_POWER_LEVEL_MINUS_9DBM 3 /* = -9 dBm, */
+#define TX_POWER_LEVEL_MINUS_6DBM 4 /* = -6 dBm, */
+#define TX_POWER_LEVEL_MINUS_2DBM 5 /* = -2 dBm, */
+#define TX_POWER_LEVEL_0DBM 6 /* = 0 dBm, */
+#define TX_POWER_LEVEL_PLUS_5DBM 7 /* = 5 dBm. */
+#define POWER_LEVEL_HIGH 1
+#define TX_POWER_LEVEL_MINUS_14DBM 0 /* = -14 dBm, */
+#define TX_POWER_LEVEL_MINUS_11DBM 1 /* = -11 dBm, */
+#define TX_POWER_LEVEL_MINUS_8DBM 2 /* = -8 dBm, */
+#define TX_POWER_LEVEL_MINUS_5DBM 3 /* = -5 dBm, */
+#define TX_POWER_LEVEL_PLUS_2DBM 5 /* = 2 dBm, */
+#define TX_POWER_LEVEL_PLUS_4DBM 6 /* = 4 dBm, */
+#define TX_POWER_LEVEL_PLUS_8DBM 7 /* = 8 dBm */
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+#define POWEROFF_PIN GPIO_PIN_12
+#define POWEROFF_GPIO_PORT GPIOB
+#define POWEROFF_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define POWEROFF_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define POWEROFF_EXTI_LINE GPIO_PIN_12
+#define POWEROFF_EXTI_IRQn EXTI2_IRQn
+#endif
+
+typedef enum _prvn_nvm_state
+{
+ NVM_INIT = 0,
+ NVM_SAVE_PENDING,
+} prvn_nvm_state;
+
+/* Exported variables ------------------------------------------------------- */
+
+extern MOBLEUINT8 bdaddr[];
+
+typedef struct
+{
+ MOBLEUINT16 nodeAddress;
+ MOBLEUINT8 numOfElements;
+ MOBLEUINT8 Reserved1; /* For Alignment by 4*/
+ MOBLEUINT16 newNodeAddress;
+ MOBLEUINT8 newNodeElements;
+ prvn_nvm_state saveToNVM;
+ MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeUUID[UUID_SIZE];
+} NodeUnderProvisionParam_t;
+
+extern NodeUnderProvisionParam_t NodeUnderProvisionParam;
+extern const MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+extern const MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_BleStackInitCb(void);
+MOBLE_RESULT Appli_BleSetTxPowerCb(void);
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data);
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info);
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data);
+void Appli_BleGattConnectionCompleteCb(void);
+void Appli_BleGattDisconnectionCompleteCb(void);
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void);
+MOBLE_RESULT Appli_BleAttentionTimerCb(void);
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size);
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size);
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLEUINT8 Appli_BleDisableFilterCb(void);
+void BLEMesh_PbAdvLinkCloseCb(void);
+void Appli_IntensityControlPublishing(MOBLEUINT8* value);
+
+int Appli_CheckBdMacAddr(void);
+MOBLE_RESULT Appli_LedBlink(void);
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl);
+
+void Appli_CheckForUnprovision(void);
+void Appli_Unprovision(void);
+void Appli_Process(void);
+void Appli_LedCtrl(void);
+void Appli_Init(MOBLEUINT8 *flag);
+
+MOBLE_ADDRESS GetAddressToConfigure(void);
+MOBLE_ADDRESS GetNewAddressToProvision(void);
+void SaveProvisionedNodeAddress(void);
+MOBLEUINT8* GetNewProvNodeDevKey(void);
+MOBLEUINT8* GetNewProvNodeAppKey(void);
+void IntensityPublish(void);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
+void Start_SelfConfiguration (void);
+void Appli_ProvisionerInit(void);
+void Appli_StartProvisionerMode(MOBLEUINT8 mode);
+
+
+#endif /* __APPLI_MESH_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c
index 380b0e3d8..fcfedfbe6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c
@@ -33,6 +33,7 @@
#include "app_conf.h"
#include "stm32_seq.h"
#endif
+#include "config_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -44,7 +45,6 @@
/* Private define ------------------------------------------------------------*/
extern const MOBLEUINT8* _bdaddr[];
-extern const MOBLEUINT8* _prvsnr_data[];
#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
extern MOBLEUINT8 PowerOnOff_flag;
@@ -84,15 +84,13 @@ extern const void* prvsnr_data;
#define APP_NVM_LIGHT_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE+APP_NVM_GENERIC_MODEL_SIZE)
#define APP_NVM_LIGHT_MODEL_SIZE 16U
-/* offset defined for the embedded provisioner node */
-#define PRVN_NVM_SUBPAGE_SIZE 16U
-#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_SUBPAGE_SIZE)
-#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
-
#define FIRST_PRVND_NODE_ADDRSS 2U
#define LAST_PRVND_NODE_ADDRSS (unsigned int)(PRVN_NVM_MAX_SUBPAGE+FIRST_PRVND_NODE_ADDRSS)
+#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+
/* Private variables ---------------------------------------------------------*/
+
typedef struct
{
MOBLEUINT8 modelData[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE];
@@ -105,25 +103,23 @@ __attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
typedef struct
{
- MOBLEUINT8 prvnData[PRVN_NVM_SUBPAGE_SIZE];
+ MOBLEUINT8 prvnData[PRVN_NVM_CHUNK_SIZE];
+ MOBLEUINT16 addressToWrite;
MOBLEBOOL erasePageReq;
MOBLEBOOL writeReq;
-} PRVN_NVM_REQS;
+ MOBLEUINT16 size;
+} PrvnNvm_Reqs_t;
/* ALIGN(4) */
-__attribute__((aligned(4))) PRVN_NVM_REQS PrvnNvm_Reqs;
+__attribute__((aligned(4))) PrvnNvm_Reqs_t PrvnNvm_Reqs;
MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
-MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 SubPageSize,
- MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset);
-//MOBLE_RESULT AppliNvm_FindFirstValidSubPage(MOBLEINT8* subPageIndex);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
-//MOBLE_RESULT AppliNvm_LoadGenericState(uint8_t state[], uint8_t* size);
-//MOBLE_RESULT AppliNvm_LoadLightState(uint8_t state[], uint8_t* size);
-//MOBLE_RESULT AppliNvm_PrvnFindFirstValidSubPage(MOBLEINT8* subPageIndex);
-//MOBLE_RESULT AppliNvm_PrvnMarkSubpageInvalid(void);
-//MOBLE_RESULT AppliNvm_SavePrvsnerData(uint8_t* data, uint8_t size);
MOBLEUINT32* AppliPrvnNvm_GetSubPageData(MOBLE_ADDRESS addrss);
MOBLE_RESULT AppliPrvnNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
@@ -195,6 +191,7 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
return result;
}
+
/**
* @brief Program word (32-bit) at a PRVN_NVM_BASE_OFFSET
* @param TypeProgram Indicate the way to program at a specified address
@@ -234,51 +231,6 @@ MOBLE_RESULT AppliPrvnNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBL
return result;
}
-#if 0
-/**
-* @brief Find first valid subpage available.
-* If no valid subpage found, erase page appli nvm to reset it
-* @param pointer to variable to update first valid subpage index
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliNvm_FindFirstValidSubPage(MOBLEINT8* subPageIndex)
-{
- MOBLEUINT32 valid[2];
- MOBLEINT8 subPageIdx = -1;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- /* find valid subpage */
- for (MOBLEUINT8 count=0; count<APP_NVM_MAX_SUBPAGE; count++)
- {
- unsigned int offset = APP_NVM_SUBPAGE_OFFSET(count);
-
- memcpy((void*)&valid, (void*)(APP_NVM_BASE + offset), 8);
- if ((valid[0] == 0xFFFFFFFF) && ((valid[1] == 0xFFFFFFFF)))
- {
- subPageIdx = count;
- break;
- }
- }
-
- /* if no valid subpage found, erase all subpages and reset subPageIdx */
- if (subPageIdx < 0)
- {
- AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
-#if (LOW_POWER_FEATURE == 1)
- UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
-#endif
- result = MOBLE_RESULT_FAIL;
- }
- else
- {
- result = MOBLE_RESULT_SUCCESS;
- }
-
- *subPageIndex = subPageIdx;
-
- return result;
-}
-#endif
/**
* @brief Mark first valid subpage as invalid.
@@ -289,23 +241,25 @@ MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
{
MOBLEUINT32 valid = 0;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEINT8 currSubPageIdx;
+ MOBLEINT16 currSubPageIdx;
MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
/* find valid subpage */
- result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));//AppliNvm_FindFirstValidSubPage(&currSubPageIdx);
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
- if (result != MOBLE_RESULT_SUCCESS)
+ if (result == MOBLE_RESULT_OUTOFMEMORY)
{
- /* do nothing */
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
}
else
{
/* mark valid subpage as invalid */
memcpy((void*)subPageTemp,
- (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ (void*)(PRVN_NVM_BASE_OFFSET + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
APP_NVM_SUBPAGE_SIZE);
subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
@@ -328,6 +282,7 @@ MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
return result;
}
+
/**
* @brief This function writes Reset count value in flash at APP_NVM_BASE + APP_NVM_RESERVED_SIZE
* if device has been turned ON 5 times consecutively with each ON duration < 2s, reset to factory settings
@@ -338,7 +293,7 @@ MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
*/
MOBLE_RESULT AppliNvm_FactorySettingReset(void)
{
- MOBLEINT8 currSubPageIdx = 0;
+ MOBLEINT16 currSubPageIdx = 0;
MOBLE_RESULT result;
MOBLEUINT32 resetCount;
MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
@@ -443,6 +398,7 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
return result;
}
+
/**
* @brief Save model states in nvm
* @param model state buff
@@ -465,6 +421,7 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
memcpy(AppliNvm_Reqs.modelData, state, size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
#if (LOW_POWER_FEATURE == 1)
UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
#endif
@@ -473,6 +430,7 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
return result;
}
+
/**
* @brief Clear model states in nvm
* @param none
@@ -484,12 +442,14 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
- MOBLEINT8 subPageIdx;
+ MOBLEINT16 subPageIdx;
MOBLEUINT8 clearBuff[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE] = {0};
MOBLEUINT32 valid = 0;
- result = AppliNvm_FindFirstEmptyPage(&subPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
if (MOBLE_FAILED(result))
{
@@ -531,111 +491,6 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
return result;
}
-#if 0
-/**
-* @brief Load generic states from nvm
-* @param generic state buff
-* @param generic state buff size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliNvm_LoadGenericState(uint8_t state[], uint8_t* size)
-{
-#if (SAVE_MODEL_STATE_NVM == 1)
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
- MOBLEINT8 subPageIdx;
-
- result = AppliNvm_FindFirstValidSubPage(&subPageIdx);
- if (result == MOBLE_RESULT_SUCCESS)
- {
- if(subPageIdx > 0)
- {
- /* Not the first reset */
- /* read the previous subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
- APP_NVM_GENERIC_MODEL_SIZE);
- *size = APP_NVM_GENERIC_MODEL_SIZE;
- }
- else
- {
- /* read the current subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
- APP_NVM_GENERIC_MODEL_SIZE);
- *size = APP_NVM_GENERIC_MODEL_SIZE;
- }
- }
- return result;
-#else /* SAVE_MODEL_STATE_NVM */
- *size = 0;
- return MOBLE_RESULT_SUCCESS;
-#endif /* SAVE_MODEL_STATE_NVM */
-}
-
-/**
-* @brief Load light states from nvm
-* @param light state buff
-* @param light state buff size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliNvm_LoadLightState(uint8_t state[], uint8_t* size)
-{
-#if (SAVE_MODEL_STATE_NVM == 1)
-// MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-//
-// memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData+APP_NVM_GENERIC_MODEL_SIZE), APP_NVM_LIGHT_MODEL_SIZE);
-// *size = APP_NVM_GENERIC_MODEL_SIZE;
-//
-// return result;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
- MOBLEINT8 subPageIdx;
-
- result = AppliNvm_FindFirstValidSubPage(&subPageIdx);
- if (result == MOBLE_RESULT_SUCCESS)
- {
- if(subPageIdx > 1)
- {
- /* Not the first reset */
- /* read the previous subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_LIGHT_MODEL_OFFSET]),
- APP_NVM_LIGHT_MODEL_SIZE);
- *size = APP_NVM_LIGHT_MODEL_SIZE;
- }
- else
- {
- /* read the current subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_LIGHT_MODEL_OFFSET]),
- APP_NVM_LIGHT_MODEL_SIZE);
- *size = APP_NVM_LIGHT_MODEL_SIZE;
- }
- }
- return result;
-#else /* SAVE_MODEL_STATE_NVM */
- *size = 0;
- return MOBLE_RESULT_SUCCESS;
-#endif /* SAVE_MODEL_STATE_NVM */
- }
-#endif
/**
* @brief Load Model states from nvm
@@ -667,7 +522,7 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
void AppliNvm_Process(void)
{
MOBLE_RESULT result;
- MOBLEINT8 subPageIdx;
+ MOBLEINT16 subPageIdx;
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
@@ -707,14 +562,18 @@ void AppliNvm_Process(void)
if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
&& AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
- result = AppliNvm_FindFirstEmptyPage(&subPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));//AppliNvm_FindFirstValidSubPage(&subPageIdx);
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
#if (LOW_POWER_FEATURE == 1)
UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
#endif
+ result = MOBLE_RESULT_FAIL;
}
else
{
@@ -755,6 +614,7 @@ void AppliNvm_Process(void)
}
}
+
/**
* @brief Fuction used to set the flag which is responsible for storing the
states in flash.
@@ -777,22 +637,26 @@ void AppliNvm_SaveMessageParam (void)
* @param pointer to variable to update first valid subpage index
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 SubPageSize,
- MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset)
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset)
{
MOBLEUINT32 valid[2];
MOBLEINT8 subPageIdx = -1;
MOBLEUINT32 *subPageOffset;
- MOBLEUINT32 addrssValidPage;
+ MOBLEUINT32 addressValidPage;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (MOBLEUINT8 count=0; count<totalSubPage; count++)
+ for (MOBLEUINT16 count=0; count<totalSubPage; count++)
{
- addrssValidPage = nvmBaseOffset + SubPageSize*count;
- subPageOffset = &addrssValidPage;
+ addressValidPage = nvmBaseOffset + SubPageSize*count;
+ subPageOffset = &addressValidPage;
+
+ /* Read 8 bytes and check if it's Empty */
memcpy((void*)&valid, (void*)(*subPageOffset), 8);
- if ((valid[0] == 0xFFFFFFFF) && ((valid[1] == 0xFFFFFFFF)))
+ if ((valid[0] == FLASH_EMPTY_SIGNATURE) /*&& (valid[1] == FLASH_EMPTY_SIGNATURE)*/)
{
subPageIdx = count;
break;
@@ -801,7 +665,7 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 Sub
if (subPageIdx < 0)
{
- TRACE_M(TF_PROVISION," Warning: No Valid Page Found,Erase operation \r\n");
+ TRACE_M(TF_PROVISION,"Out of Memory, Flash page is full \r\n");
result = MOBLE_RESULT_OUTOFMEMORY;
}
else
@@ -814,6 +678,7 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 Sub
return result;
}
+
/**
* @brief Load Provisioner data from nvm
* @param model state buff
@@ -823,10 +688,11 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 Sub
MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size)
{
#if (SAVE_EMBD_PROVISION_DATA == 1)
+
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- memcpy((void*)state, (void*)(PrvnNvm_Reqs.prvnData), PRVN_NVM_SUBPAGE_SIZE);
- *size = PRVN_NVM_SUBPAGE_SIZE;
+ memcpy((void*)state, (void*)(PrvnNvm_Reqs.prvnData), PRVN_NVM_CHUNK_SIZE);
+ *size = PRVN_NVM_CHUNK_SIZE;
return result;
#else /* SAVE_EMBD_PROVISION_DATA */
@@ -835,42 +701,69 @@ MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size)
#endif /* SAVE_EMBD_PROVISION_DATA */
}
+
/**
* @brief Save Embedded provisioner data in nvm
-* @param data: data buffer to be saved
-* @param size: data buffer size
+* @param devkey: data buffer to be saved
+* @param address: address of the Node to be saved
+* @param pUUID: pointer to the UUID
+* @param numElements: number of elements of the node
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data, uint8_t size)
+MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* devkey,
+ MOBLE_ADDRESS address,
+ uint8_t* pUUID,
+ uint8_t numElements)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
-
- if (size > PRVN_NVM_SUBPAGE_SIZE)
- {
- /* incorrect size */
- result = MOBLE_RESULT_FAIL;
- }
- else
- {
- memcpy(PrvnNvm_Reqs.prvnData, data, size);
- PrvnNvm_Reqs.writeReq = MOBLE_TRUE;
-#if (LOW_POWER_FEATURE == 1)
- UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+ uint8_t *pNodeInfo;
+ MOBLEUINT16 sizeTosave=0;
+
+ pNodeInfo = PrvnNvm_Reqs.prvnData;
+
+ /* Copy the Address and Number of Elements */
+ memcpy(pNodeInfo, &address, 2);
+ pNodeInfo += 2;
+ memcpy(pNodeInfo, &numElements, 2);
+
+ pNodeInfo += 2;
+ sizeTosave += 4;
+
+ /* Copy the Device Key of the Node Primary address */
+ memcpy(pNodeInfo, devkey, DEVICE_KEY_SIZE);
+ pNodeInfo += DEVICE_KEY_SIZE;
+ sizeTosave += DEVICE_KEY_SIZE;
+
+#if ENABLE_SAVE_UUID_PER_NODE
+ /* Copy the UUID of the Node */
+ memcpy(pNodeInfo, pUUID, UUID_SIZE);
+ pNodeInfo += UUID_SIZE;
+ sizeTosave += UUID_SIZE;
#endif
- if (MOBLE_FAILED(result))
- {
- result = MOBLE_RESULT_FAIL;
- }
- else
- {
- result = MOBLE_RESULT_SUCCESS;
- }
- }
-
+
+ /*
+ The 3-Element Node data saving will look like this ->
+
+ 0-1 2B Primary address
+ 2,3 2B Element count
+ 4-19 DevKey for example 0x01, 0x02, ... 10
+
+ 20-21 2B Primary address
+ 22-23 2B Element count
+ 24-39 16B DevKey for next address
+
+ Advantage: We identify the Primary Node address
+ */
+
+ NodeUnderProvisionParam.newNodeAddress = address;
+ NodeUnderProvisionParam.newNodeElements = numElements;
+ PrvnNvm_Reqs.size = sizeTosave;
+
return result;
}
+
/**
* @brief Function to get the particular node device key with node address friom the
* provisioner flash.
@@ -880,7 +773,7 @@ MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data, uint8_t size)
MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss)
{
MOBLEUINT16 subPageIndx;
- MOBLEUINT32 *subPageAddrss;
+ MOBLEUINT32 *subPageAddress;
subPageIndx = addrss - FIRST_PRVND_NODE_ADDRSS;
@@ -891,12 +784,13 @@ MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss)
}
else
{
- subPageAddrss = (MOBLEUINT32 *)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(subPageIndx));
- TRACE_M(TF_PROVISION,"Address Of SubPage = %p \r\n", (void *)subPageAddrss);
+ subPageAddress = (MOBLEUINT32 *)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(subPageIndx));
+ TRACE_M(TF_PROVISION,"Address Of SubPage = %p \r\n", (void *)subPageAddress);
}
- return subPageAddrss;
+ return subPageAddress;
}
+
/**
* @brief backup by Copy all the data from the page in RAM.
* @param model state buff
@@ -913,10 +807,10 @@ MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size)
/* find valid subpage */
for (MOBLEUINT8 count=0; count<8; count++)
{
- memcpy((void*)deviceKeysSaved, (void*)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(count)), PRVN_NVM_SUBPAGE_SIZE);
+ memcpy((void*)deviceKeysSaved, (void*)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(count)), PRVN_NVM_CHUNK_SIZE);
}
- *size = PRVN_NVM_SUBPAGE_SIZE;
+ *size = PRVN_NVM_CHUNK_SIZE;
return result;
#else /* SAVE_EMBD_PROVISION_DATA */
@@ -926,6 +820,7 @@ MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size)
}
+
/**
* @brief Process Provisioner NVM erase and write requests
* @param void
@@ -934,33 +829,38 @@ MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size)
void AppliPrvnNvm_Process(void)
{
MOBLE_RESULT result;
- MOBLEINT8 subPageIdx;
+ MOBLEINT16 subPageIdx;
if ( (PrvnNvm_Reqs.erasePageReq == MOBLE_FALSE) &&
(PrvnNvm_Reqs.writeReq == MOBLE_TRUE) )
{
- result = AppliNvm_FindFirstEmptyPage(&subPageIdx,PRVN_NVM_SUBPAGE_SIZE,
- PRVN_NVM_MAX_SUBPAGE,PRVN_NVM_BASE_OFFSET);
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ PRVN_NVM_CHUNK_SIZE,
+ PRVN_NVM_MAX_SUBPAGE-1,
+ PRVN_NVM_BASE_OFFSET);
- if (result == MOBLE_RESULT_SUCCESS)
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ PrvnNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
{
TRACE_M(TF_PROVISION,"Saving in SubPage[%.8x] = \r\n", PRVN_NVM_SUBPAGE_OFFSET(subPageIdx));
+
result = AppliPrvnNvm_FlashProgram(PRVN_NVM_SUBPAGE_OFFSET(subPageIdx),
- PrvnNvm_Reqs.prvnData,
- PRVN_NVM_SUBPAGE_SIZE);
+ PrvnNvm_Reqs.prvnData,
+ PrvnNvm_Reqs.size);
if (result == MOBLE_RESULT_SUCCESS)
{
PrvnNvm_Reqs.writeReq = MOBLE_FALSE;
}
}
- else
- {
- //AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
- }
}
}
+
/**
* @brief This function is to save the provisioner device key in the flash.
* @param data:Pointer to the data passed.
@@ -968,15 +868,38 @@ void AppliPrvnNvm_Process(void)
* @param prvnFlag:Pointer to the flag passed.
* @retval void
*/
-void AppliNvm_saveProvisionerDevKey(MOBLEUINT8 *data , MOBLEUINT8 size , MOBLEUINT8 *prvnFlag)
+void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *devkey ,
+ MOBLE_ADDRESS address,
+ MOBLEUINT8 *prvnFlag,
+ MOBLEUINT8 numOfElements)
{
+ /* Note: Renamed the API from AppliNnm_saveProvisionerDevKey during refactoring */
+ MOBLEUINT8 *pUUID = {0};
+
if(*prvnFlag == 1)
{
- AppliPrvnNvm_SaveData(&data[0] ,size);
+ AppliPrvnNvm_SaveData(&devkey[0], address, pUUID, numOfElements);
+ SaveProvisionedNodeAddress();
prvnFlag = 0;
+ AppliPrvnNvm_SaveKeys(1);
+
+ }
+}
+
+
+/**
+* @brief This function is to save the keys in the flash
+* @retval void
+*/
+void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status)
+{
+ if (status == 1)
+ {
+ PrvnNvm_Reqs.writeReq = MOBLE_TRUE; /* This will trigger the saving in flash */
}
}
+
/**
* @brief This function load the Provisioner nvm data to the buffer after reset.
* @param void
@@ -984,44 +907,60 @@ void AppliNvm_saveProvisionerDevKey(MOBLEUINT8 *data , MOBLEUINT8 size , MOBLEUI
*/
MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8 *flag)
{
- MOBLEINT8 currSubPageIdx;
+ MOBLEINT16 currSubPageIdx;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,PRVN_NVM_SUBPAGE_SIZE,
- PRVN_NVM_MAX_SUBPAGE,PRVN_NVM_BASE_OFFSET);
+ /* Check which sub-page is empty */
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ PRVN_NVM_CHUNK_SIZE,
+ (PRVN_NVM_MAX_SUBPAGE-1),
+ PRVN_NVM_BASE_OFFSET);
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
result = MOBLE_RESULT_FAIL;
- //AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
}
else
{
/* After reset of provisioner , retreiving the next node address to be provisioned */
-#ifdef ENABLE_PROVISIONER_FEATURE
-
- if(currSubPageIdx > 0)
- {
- nodeAddressOffset = currSubPageIdx + 1;
- }
-
-#endif
-
+ if(currSubPageIdx == 0)
+ {
+ *flag = 1;
+ }
- if(currSubPageIdx > 0)
- {
- currSubPageIdx = currSubPageIdx-1;
- }
+ if(currSubPageIdx > 1)
+ {
+ NodeUnderProvisionParam.nodeAddress = currSubPageIdx;
+ }
+
- /* Load model data copy from nvm */
+ if(currSubPageIdx > 0)
+ { /* If 1st page is empty, then decrementing by 1 will cause pointer to
+ wrong address */
+ currSubPageIdx = currSubPageIdx-1;
+
+ /* Load last Provisioner data saved from nvm */
memcpy((void*)PrvnNvm_Reqs.prvnData,
- (void*)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx)),PRVN_NVM_SUBPAGE_SIZE);
-
+ (void*)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ PRVN_NVM_CHUNK_SIZE);
+
+ NodeUnderProvisionParam.nodeAddress = CopyU8LittleEndienArrayToU16word (&PrvnNvm_Reqs.prvnData[0]);
+ NodeUnderProvisionParam.numOfElements = PrvnNvm_Reqs.prvnData[2];
+ }
- TRACE_I(TF_PROVISION,"NEXT NVM ADDRESS %.8x \r\n",PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx+PRVN_NVM_SUBPAGE_SIZE));
+ TRACE_I(TF_PROVISION,"Next NVM Address %.8x \r\n",
+ PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx));
}
return result;
}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.h
new file mode 100644
index 000000000..3dbd8dd3d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.h
@@ -0,0 +1,92 @@
+/**
+******************************************************************************
+* @file appli_nvm.h
+* @author BLE Mesh Team
+ * @brief Header file for the NVM application file
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_NVM_H
+#define __APPLI_NVM_H
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+extern const void *prvsnr_data;
+
+/* offset defined for the embedded provisioner node */
+#define PRVN_NVM_PAGE_SIZE 4096U
+#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
+#define PRVN_NVM_CHUNK_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_SUBPAGE_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_CHUNK_SIZE)
+#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
+
+#define APP_NVM_BASE ((unsigned int)appNvmBase)
+#define APP_NVM_SIZE 4096U
+
+/* Exported variables ------------------------------------------------------- */
+typedef struct
+{
+ MOBLEUINT8 devKey[4+DEVICE_KEY_SIZE];
+
+#if ENABLE_SAVE_UUID_PER_NODE
+ MOBLEUINT8 node_UUID[UUID_SIZE];
+#endif
+
+} NvmPerNode_t;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FactorySettingReset(void);
+//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
+MOBLE_RESULT AppliNvm_ClearModelState(void);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+void AppliNvm_Process(void);
+void AppliNvm_SaveMessageParam (void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
+
+MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data,
+ MOBLE_ADDRESS address,
+ uint8_t* pUUID,
+ uint8_t numElements);
+
+MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
+void AppliPrvnNvm_Process(void);
+
+MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
+
+MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
+
+void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
+ MOBLE_ADDRESS address,
+ MOBLEUINT8 *prvnFlag,
+ MOBLEUINT8 numOfElements);
+
+void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+
+
+#endif /* __APPLI_NVM_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.c
new file mode 100644
index 000000000..7ae8b7d10
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.c
@@ -0,0 +1,633 @@
+/**
+ ******************************************************************************
+ * @file appli_sensor.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Sensor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "hal_common.h"
+#include "types.h"
+#include "sensors.h"
+#include "light_lc.h"
+#include "appli_sensor.h"
+#include "mesh_cfg.h"
+//#include "LPS25HB.h"
+#include "string.h"
+#include "common.h"
+#include "math.h"
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application_Mesh_Models
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#if 0
+/**
+* @brief PRESSURE init structure definition
+*/
+PRESSURE_InitTypeDef InitStructure =
+{
+ LPS25HB_ODR_1Hz,
+ LPS25HB_BDU_READ,
+ LPS25HB_DIFF_ENABLE,
+ LPS25HB_SPI_SIM_3W,
+ LPS25HB_P_RES_AVG_32,
+ LPS25HB_T_RES_AVG_16
+};
+#endif
+
+/* Application variables of sensor model definition */
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus;
+Appli_Sensor_SettingSet_t Appli_Sensor_SettingSet;
+
+/* By Default value used for cadence set for testing. */
+Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR] = {
+ {0x0071 , 0x2 , 2 , 2 ,2 ,0 ,0X05 , 0x64},
+ {0x2A6D , 0x2 , 1 , 1 , 1, 0, 0X258 , 0x3ED}
+};
+#endif
+
+MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
+{
+ {TEMPERATURE_PID},
+ {PRESSURE_PID}
+};
+MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
+extern MOBLEUINT8 NumberOfElements;
+extern MOBLEUINT8 ProvisionFlag;
+
+/* Temperature and Pressure init structure*/
+#if 0
+ PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
+#endif
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+/**
+* @brief Appli_Sensor_Cadence_Set: This function is callback for Application
+* when sensor cadence Set message is received
+* @param pCadence_param: Pointer to the parameters received for message
+* @param property_ID: Property is of sensor coming in data packet
+* @param length: Received data length.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param, MOBLEUINT16 property_ID, MOBLEUINT32 length)
+{
+ if(property_ID == (MOBLEUINT16)TEMPERATURE_PID)
+ {
+ Sensor_CadenceSet[0].Property_ID = pCadence_param->Property_ID;
+ Sensor_CadenceSet[0].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
+ Sensor_CadenceSet[0].StatusTriggerType = pCadence_param->StatusTriggerType ;
+ Sensor_CadenceSet[0].triggerDeltaDown = pCadence_param->triggerDeltaDown;
+ Sensor_CadenceSet[0].triggerDeltaUp = pCadence_param->triggerDeltaUp;
+ Sensor_CadenceSet[0].StatusMinInterval = pCadence_param->StatusMinInterval;
+ Sensor_CadenceSet[0].FastCadenceLow = pCadence_param->FastCadenceLow;
+ Sensor_CadenceSet[0].FastCadenceHigh = pCadence_param->FastCadenceHigh;
+ }
+ else if(property_ID == (MOBLEUINT16)PRESSURE_PID)
+ {
+
+ Sensor_CadenceSet[1].Property_ID = pCadence_param->Property_ID;
+ Sensor_CadenceSet[1].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
+ Sensor_CadenceSet[1].StatusTriggerType = pCadence_param->StatusTriggerType ;
+ Sensor_CadenceSet[1].triggerDeltaDown = pCadence_param->triggerDeltaDown;
+ Sensor_CadenceSet[1].triggerDeltaUp = pCadence_param->triggerDeltaUp;
+ Sensor_CadenceSet[1].StatusMinInterval = pCadence_param->StatusMinInterval;
+ Sensor_CadenceSet[1].FastCadenceLow = pCadence_param->FastCadenceLow;
+ Sensor_CadenceSet[1].FastCadenceHigh = pCadence_param->FastCadenceHigh;
+ }
+ else
+ {
+ /* No Comments */
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_Setting_Set: This function is callback for Application
+* when sensor setting Set message is received
+* @param pSensor_SettingParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_Sensor_SettingSet.Property_ID = pSensor_SettingParam->Property_ID;
+ Appli_Sensor_SettingSet.Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
+ Appli_Sensor_SettingSet.Sensor_Setting_Access = pSensor_SettingParam->Sensor_Setting_Access;
+ Appli_Sensor_SettingSet.Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_Data_Status: This function is callback for Application
+* when sensor get message is received
+* @param sensor_Data: Pointer to the parameters to be send in message
+* @param pLength: Length of the parameters to be sent in response
+* @param prop_ID: Property is of sensor coming in data packet
+* @param length: Received data length
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength,
+ MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLEUINT32 temperatureData = 0;
+ MOBLEUINT32 pressureData = 0;
+ MOBLEUINT8 data_Length = 0x03;
+ MOBLEUINT32 distance = 0x000000C8; // 200 cm;
+
+#if 0
+ LPS25HB_GetTemperature((float*)&temperatureData);
+
+ LPS25HB_GetPressure((float*)&pressureData);
+#endif
+
+ result = Check_Property_ID(Property_ID_Table , prop_ID);
+
+ if((prop_ID == TEMPERATURE_PID ) && (length > 0))
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ *(sensor_Data) = ((TEMPERATURE_PID & 0x07) << 5) | (data_Length <<1) ;
+ *(sensor_Data+1) = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&temperatureData,4);
+
+ *pLength =6;
+ }
+ else if((prop_ID == PRESSURE_PID) && (length > 0))
+{
+ /* Format B for Pressure sensor */
+ *(sensor_Data+0) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+1) = (MOBLEUINT8)PRESSURE_PID ;
+ *(sensor_Data+2) = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&pressureData,4);
+
+ *pLength =7;
+ }
+ else if((prop_ID == TIME_OF_FLIGHT_PID) && (length > 0))
+ {
+ /* Format B for Pressure sensor */
+ *(sensor_Data+0) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+1) = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
+ *(sensor_Data+2) = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&distance,4);
+
+ *pLength =7;
+ }
+ else if((result == MOBLE_RESULT_FALSE) && (length == 0))
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ *(sensor_Data) = ((TEMPERATURE_PID & 0x07) << 5) | (data_Length <<1) ;
+ *(sensor_Data+1) = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&temperatureData,4);
+
+ /* Format B for Pressure sensor */
+ *(sensor_Data+6) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+7) = (MOBLEUINT8)PRESSURE_PID ;
+ *(sensor_Data+8) = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[9],(void*)&pressureData,4);
+
+ /* Format B for Pressure sensor */
+ *(sensor_Data+13) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+14) = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
+ *(sensor_Data+15) = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
+
+ memcpy(&sensor_Data[16],(void*)&distance,4);
+
+ *pLength =20;
+ }
+ else
+ {
+ /* No Comments */
+ }
+
+ TRACE_M(TF_SENSOR,"the temperature reading from sender in hex 0x%08lx \n\r ", temperatureData);
+ TRACE_M(TF_SENSOR,"the pressure reading from sender in hex 0x%08lx \n\r", pressureData );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Sensor_Descriptor_Status: This function is callback for Application
+* when sensor get message is received
+* @param sensor_Descriptor: Pointer to the parameters to be send in message
+* @param pLength: Length of the parameters to be sent in response
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor , MOBLEUINT32* pLength)
+{
+ Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] = {{PRESSURE_PID,0xABC,0xDEF,0x03,0x04,0x05},
+ {TEMPERATURE_PID,0xc56,0xd78,0x06,0x07,0x08},
+ {TIME_OF_FLIGHT_PID,0xD23,0xE45,0x06,0x07,0x08}};
+ MOBLEUINT32 tolerance;
+ tolerance = Appli_Sensor_DescriptorStatus1[0].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[0].PositiveTolerance;
+
+ *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[0].Prop_ID;
+ *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[0].Prop_ID >> 8;
+ *(sensor_Descriptor+2) = tolerance;
+ *(sensor_Descriptor+3) = tolerance >> 8;
+ *(sensor_Descriptor+4) = tolerance >> 16;
+ *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[0].SamplingFunction;
+ *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[0].MeasurementPeriod;
+ *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[0].UpdateInterval;
+
+ tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
+
+ *(sensor_Descriptor+8) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
+ *(sensor_Descriptor+9) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
+ *(sensor_Descriptor+10) = tolerance;
+ *(sensor_Descriptor+11) = tolerance >> 8;
+ *(sensor_Descriptor+12) = tolerance >> 16;
+ *(sensor_Descriptor+13) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
+ *(sensor_Descriptor+14) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
+ *(sensor_Descriptor+15) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
+
+ tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+
+ *(sensor_Descriptor+16) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
+ *(sensor_Descriptor+17) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
+ *(sensor_Descriptor+18) = tolerance;
+ *(sensor_Descriptor+19) = tolerance >> 8;
+ *(sensor_Descriptor+20) = tolerance >> 16;
+ *(sensor_Descriptor+21) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
+ *(sensor_Descriptor+22) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
+ *(sensor_Descriptor+23) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
+
+ *pLength = 24;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @brief Sensor Process Function will continuously monitor the sensors.
+* Function used for the Publishing, data monitoring..
+* @param void
+* @retval void
+*/
+void Sensor_Process(void)
+{
+
+#ifdef ENABLE_SENSOR_PUBLICATION
+ float sensorValue[NUMBER_OF_SENSOR];
+ if(ProvisionFlag == 1)
+ {
+ Read_Sensor_Data(&sensorValue[0]);
+ Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ }
+#endif
+
+ /* Occupancy_Flag become True when ever sensor detect occupancy and get interrupt
+ and make flag True to run this routine.
+ */
+ if(Occupancy_Flag == MOBLE_TRUE)
+ {
+ if(BLE_waitPeriod(CONTROLLER_WAIT_TIME))
+ {
+#ifdef ENABLE_SENSOR_PUBLICATION
+ if(ProvisionFlag == 1)
+ {
+ Read_Sensor_Data(&sensorValue[0]);
+ Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ }
+#endif
+
+ /* publishing the command for LC Light occupancy set message in the sensor status
+ message .
+ */
+ Sensor_LC_Light_Publish();
+ Occupancy_Flag = MOBLE_FALSE;
+ }
+ }
+}
+
+/**
+* @brief Function check for the couupancy in the location and send the status
+ message with the ocuppancy value, when the interrupt is detected.
+* @param void
+* @retval void
+*/
+void Sensor_LC_Light_Publish(void)
+{
+ MOBLEUINT8 occupancyData = 0x1;
+ MOBLEUINT8 sensor_Data[5];
+ MOBLE_ADDRESS srcAdd;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
+ sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
+ sensor_Data[2] = occupancyData;
+
+ srcAdd = BLEMesh_GetAddress();
+
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
+ SENSOR_STATUS ,
+ sensor_Data,3,
+ MOBLE_FALSE, MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ }
+
+}
+
+#if defined ENABLE_SENSOR_PUBLICATION && defined ENABLE_SENSOR_MODEL_SERVER
+/**
+* @brief Function read the particular sensor value which are called inside.
+* @param pSensorValue: pointer to the sensor data array.
+* @retval void
+*/
+void Read_Sensor_Data(float *pSensorValue)
+{
+#if 0
+ float temp,press;
+ LPS25HB_GetTemperature(&temp);
+ pSensorValue[0] = temp;
+ LPS25HB_GetPressure(&press);
+ pSensorValue[1] = press;
+#endif
+}
+
+/**
+* @brief Sensor Publication Process function
+* @param Function will publish the sensor data according to the given conditions.
+* @param void type function pointer.
+* @param pSensorData: Pointer to the sensor data array.
+* @param pProp_ID: Pointer to the Property id of sensor array.
+* @retval void
+*/
+void Sensor_Publication_Process(float* pSensorData, MODEL_Property_IDTableParam_t* pProp_ID)
+{
+ static MOBLEUINT8 sensor_Count = 0;
+ displayFloatToInt_t out_value;
+ MOBLEUINT8 devisorValue;
+ MOBLEUINT32 publishTime;
+ static MOBLEUINT32 cadenceDurationTick[NUMBER_OF_SENSOR];
+ static float previousDataValue[NUMBER_OF_SENSOR];
+ static PublishingDataFlag_t PublishingDataFlag[NUMBER_OF_SENSOR] = {MOBLE_FALSE};
+
+ floatToInt(pSensorData[sensor_Count], &out_value, 2);
+
+ /* Taking the timestamp for the cadence publication and making flag high */
+ if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ {
+ cadenceDurationTick[sensor_Count] = Clock_Time();
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ }
+ /* Taking the sensor value and store it for comparing present sensor value with
+ particular difference of increasing or decreasing. and making flag high.
+ */
+ if(PublishingDataFlag[sensor_Count].DeltaDataFlag == MOBLE_FALSE)
+ {
+ previousDataValue[sensor_Count] = pSensorData[sensor_Count];
+ PublishingDataFlag[sensor_Count].DeltaDataFlag = MOBLE_TRUE;
+ }
+ /*
+ This condition is checking for the difference of present sensor value
+ with prestored sensor value with user defined difference,if this condition
+ is true then it publish the sensor data.And making the delta flag low again.
+ */
+ if((pSensorData[sensor_Count] >= (previousDataValue[sensor_Count] + Sensor_CadenceSet[sensor_Count].triggerDeltaUp)) ||
+ (pSensorData[sensor_Count] <= (previousDataValue[sensor_Count] - Sensor_CadenceSet[sensor_Count].triggerDeltaDown)))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+
+ PublishingDataFlag[sensor_Count].DeltaDataFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"previous value data %.3f \r\n",previousDataValue[sensor_Count]);
+ TRACE_M(TF_SENSOR,"Delta publication of data %.3f\r\n",*((float*)&pSensorData[sensor_Count]));
+ sensor_Count++;
+ }
+ /*
+ This condition is continuously checking the sensor value range, if that
+ value is within the user defined range then publishing duration or rate will
+ be divided by user definedcadence devisor value and rate of publishing will
+ become high.And making the cadence flag low again.
+ */
+ if(((out_value.out_int <= Sensor_CadenceSet[sensor_Count].FastCadenceHigh) &&
+ (out_value.out_int >= Sensor_CadenceSet[sensor_Count].FastCadenceLow)) ||
+ (Sensor_CadenceSet[sensor_Count].FastCadenceHigh < Sensor_CadenceSet[sensor_Count].FastCadenceLow))
+ {
+ devisorValue = (MOBLEUINT8)pow(2 ,Sensor_CadenceSet[sensor_Count].FastCadenceDevisor);
+ publishTime = SENSOR_PUBLISH_PERIOD/devisorValue;
+
+ if(((Clock_Time()- cadenceDurationTick[sensor_Count]) >= publishTime))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"Cadence publication of data %.2f \r\n",*((float*)&pSensorData[sensor_Count]));
+ sensor_Count++;
+ }
+ }
+ else
+ {
+ publishTime = SENSOR_PUBLISH_PERIOD ;
+
+ if(((Clock_Time()- cadenceDurationTick[sensor_Count]) >= SENSOR_PUBLISH_PERIOD))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"Regular publication of data %.3f \r\n",*((float*)&pSensorData[sensor_Count]));
+ }
+ }
+ if(sensor_Count > 1)
+ {
+ sensor_Count = 0;
+ }
+
+}
+
+/**
+* @brief BLEMesh Sensor Publication function
+* @param Function will decide the publish address and element.
+* @param pSensor_Value: Pointer to the sensor data array
+* @param pProp_ID: pointer to the property id of sensor array.
+* @retval void
+*/
+void SensorDataPublish(MOBLEUINT32 *pSensor_Value , MOBLEUINT16* pProp_ID)
+{
+ MOBLEUINT32 length;
+ MOBLEUINT8 sensor_Data[8];
+ MOBLE_ADDRESS srcAdd;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ srcAdd = BLEMesh_GetAddress();
+
+ switch(*pProp_ID)
+ {
+ case TEMPERATURE_PID:
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ sensor_Data[0] = ((TEMPERATURE_PID & 0x07) << 5) | (3 <<1) ;
+ sensor_Data[1] = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&pSensor_Value[0],4);
+ length =6;
+ break;
+ }
+ case PRESSURE_PID:
+ {
+ /* Format B for Pressure sensor */
+ sensor_Data[0] = ((0x03 <<1) | 0x01);
+ sensor_Data[1] = (MOBLEUINT8)PRESSURE_PID ;
+ sensor_Data[2] = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
+ length =7;
+ break;
+ }
+ default:
+ break;
+ }
+
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
+ SENSOR_STATUS ,
+ sensor_Data,length,
+ MOBLE_FALSE, MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ }
+
+}
+
+#endif
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+/**
+* @brief Appli_Sensor_GetSettingStatus: This function is callback for Application
+* when sensor setting numbers status message is to be provided
+* @param pSetting_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+{
+
+ *pSetting_Status = Appli_Sensor_SettingSet.Property_ID;
+ *(pSetting_Status+1) = Appli_Sensor_SettingSet.Property_ID >> 8;
+ *(pSetting_Status+2) = Appli_Sensor_SettingSet.Sensor_Setting_ID;
+ *(pSetting_Status+3) = Appli_Sensor_SettingSet.Sensor_Setting_ID >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_GetSetting_IDStatus: This function is callback for Application
+* when sensor setting numbers and row value status message is to be provided
+* @param pSetting_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status)
+{
+
+ *pSetting_Status = Appli_Sensor_SettingSet.Property_ID;
+ *(pSetting_Status+1) = Appli_Sensor_SettingSet.Property_ID >> 8;
+ *(pSetting_Status+2) = Appli_Sensor_SettingSet.Sensor_Setting_ID;
+ *(pSetting_Status+3) = Appli_Sensor_SettingSet.Sensor_Setting_ID >> 8;
+ *(pSetting_Status+4) = Appli_Sensor_SettingSet.Sensor_Setting_Access;
+ *(pSetting_Status+5) = Appli_Sensor_SettingSet.Sensor_Setting_Value;
+ *(pSetting_Status+6) = Appli_Sensor_SettingSet.Sensor_Setting_Value >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @brief Check_Property_ID: This function is used for checking the Property id
+* of sensor available in table.
+* @param prop_ID_Table: address of the property id table array.
+* @param prop_ID:received property id of sensor.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
+ , MOBLEUINT16 prop_ID)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_FALSE;
+
+ for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ {
+ if(prop_ID_Table[i].Property_ID == prop_ID)
+ {
+ status = MOBLE_RESULT_SUCCESS;
+ break;
+ }
+ }
+ return status;
+}
+
+/**
+* @brief Appli_Sensor_Init: This function is callback for Initialisation of
+* Application interface
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Init(void)
+{
+#if 0
+ LPS25HB_Init(&InitStructure);
+#endif
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.h
new file mode 100644
index 000000000..d608f35e6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.h
@@ -0,0 +1,103 @@
+/**
+ ******************************************************************************
+ * @file appli_sensor.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Light Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_SENSOR_H
+#define __APPLI_SENSOR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+#define CONTROLLER_WAIT_TIME 1000
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+/* Application variables------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/* Sensor Cadence set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 Prop_ID;
+ MOBLEUINT16 PositiveTolerance;
+ MOBLEUINT16 NegativeTolerance;
+ MOBLEUINT8 SamplingFunction;
+ MOBLEUINT8 MeasurementPeriod;
+ MOBLEUINT8 UpdateInterval;
+}Appli_Sensor_DescriptorStatus_t;
+
+/* Sensor Setting set */
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT16 Sensor_Setting_ID;
+ MOBLEUINT8 Sensor_Setting_Access;
+ MOBLEUINT16 Sensor_Setting_Value;
+}Appli_Sensor_SettingSet_t;
+
+
+/* structure of flags used for publishing data */
+typedef struct
+{
+ MOBLEBOOL CadenceDurationFlag ;
+ MOBLEBOOL DeltaDataFlag ;
+}PublishingDataFlag_t;
+
+/* structure for the cadence set */
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT8 FastCadenceDevisor;
+ MOBLEUINT8 StatusTriggerType;
+ MOBLEUINT8 triggerDeltaDown;
+ MOBLEUINT8 triggerDeltaUp;
+ MOBLEUINT8 StatusMinInterval;
+ float FastCadenceLow;
+ float FastCadenceHigh;
+}Sensor_CadenceSet_t;
+#pragma pack(4)
+
+MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param, MOBLEUINT16 property_ID,
+ MOBLEUINT32 length);
+MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength,
+ MOBLEUINT16 prop_ID , MOBLEUINT32 length);
+MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Discriptor ,
+ MOBLEUINT32* pLength);
+MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
+ MOBLEUINT8 OptionalValid);
+
+void Sensor_Publication_Process(float* , MODEL_Property_IDTableParam_t*);
+void SensorDataPublish(MOBLEUINT32 * , MOBLEUINT16*);
+void Read_Sensor_Data(float *);
+MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
+ , MOBLEUINT16 prop_ID);
+
+MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status);
+MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status);
+MOBLE_RESULT Appli_Sensor_Init(void);
+void Sensor_Process(void);
+void Sensor_LC_Light_Publish(void);
+
+#endif /* __APPLI_SENSOR_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.c
new file mode 100644
index 000000000..405be02c8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.c
@@ -0,0 +1,505 @@
+/**
+ ******************************************************************************
+ * @file appli_vendor.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Vendor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "vendor.h"
+#include "appli_vendor.h"
+#include "common.h"
+#include "appli_light.h"
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include <string.h>
+
+
+/** @addtogroup MODEL_VENDOR
+* @{
+*/
+
+/** @addtogroup Vendor_Model_Callbacks
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT16 BuffLength;
+extern MOBLEUINT8 Appli_LedState;
+extern uint16_t DUTY;
+MOBLEUINT32 TestHitCounter = 0;
+extern Appli_LightPwmValue_t Appli_LightPwmValue;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Process the Vendor Device Info Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_DeviceInfo(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLEUINT8 tempBuffer[10];
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ MOBLEUINT8 subCmd = data[0];
+ char *libVersion;
+ char *subLibVersion;
+ MOBLEUINT8 inc = 0;
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0] = subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#02-%02hx! \n\r",data[0]);
+
+ switch(subCmd)
+ {
+ case IC_TYPE:
+ {
+#ifdef BLUENRG1_DEVICE
+ ResponseBuffer[1] = BLUENRG1_BRD;
+#endif
+
+#ifdef BLUENRG2_DEVICE
+ ResponseBuffer[1] = BLUENRG2_BRD;
+#endif
+
+#ifdef BLUENRG_MS
+ ResponseBuffer[1] = BLUENRG_MS_BRD;
+#endif
+
+#ifdef STM32WB55xx
+ ResponseBuffer[1] = STM32WB55XX_BRD;
+#endif
+
+ BuffLength = 2;
+ break;
+ }
+ case LIB_VER:
+ {
+ libVersion = BLEMesh_GetLibraryVersion();
+ while(*libVersion != '\0')
+ {
+ tempBuffer[inc] = *libVersion;
+ if(tempBuffer[inc] != 0x2E)
+ {
+ tempBuffer[inc] = BLEMesh_ModelsASCII_To_Char(tempBuffer[inc]);
+ TRACE_M(TF_VENDOR,"Lib version is %x\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ else
+ {
+ TRACE_M(TF_VENDOR,"Lib version is %c\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ libVersion++;
+
+ inc++;
+ }
+ ResponseBuffer[1]= tempBuffer[0];
+ ResponseBuffer[2]= tempBuffer[1];
+ ResponseBuffer[3]= tempBuffer[3];
+ ResponseBuffer[4]= tempBuffer[4];
+ ResponseBuffer[5]= tempBuffer[6];
+ ResponseBuffer[6]= tempBuffer[7];
+ ResponseBuffer[7]= tempBuffer[8];
+ BuffLength = 8;
+ break;
+ }
+ case LIB_SUB_VER:
+ {
+ subLibVersion = BLEMesh_GetLibrarySubVersion();
+ while(*subLibVersion != '\0')
+ {
+ tempBuffer[inc] = * subLibVersion;
+ if((tempBuffer[inc] != 0x2E) && (tempBuffer[inc] != 0x52))
+ {
+ tempBuffer[inc] = BLEMesh_ModelsASCII_To_Char(tempBuffer[inc]);
+ TRACE_M(TF_VENDOR,"Sub Lib version is %x\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ else
+ {
+ TRACE_M(TF_VENDOR,"Sub Lib version is %c\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ subLibVersion++;
+ inc++;
+ }
+ ResponseBuffer[1]= tempBuffer[0];
+ ResponseBuffer[2]= tempBuffer[1];
+ ResponseBuffer[3]= tempBuffer[3];
+ ResponseBuffer[4]= tempBuffer[5];
+ ResponseBuffer[5]= tempBuffer[7];
+ ResponseBuffer[6]= tempBuffer[9];
+
+ BuffLength = 7;
+
+ break;
+ }
+ case APPLICATION_VER:
+ {
+ /*Insert Command to check Application Version*/
+ break;
+ }
+
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+
+ }
+
+ return status;
+}
+
+
+/**
+* @brief Process the Vendor Test Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#01-%02hx! \n\r",data[0]);
+ switch(subCmd)
+ {
+ case APPLI_TEST_ECHO:
+ {
+ if(length > sizeof(ResponseBuffer))
+ {
+ length = sizeof(ResponseBuffer);
+ TRACE_M(TF_VENDOR,"Length received greater than size of response buffer \r\n");
+ }
+ memcpy (&(ResponseBuffer[1]),&(data[1]),(length-1));
+ BuffLength = length;
+ break;
+ }
+ case APPLI_TEST_RANDOMIZATION_RANGE:
+ {
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_TEST_COUNTER:
+ {
+ if((DUTY <= PWM_TIME_PERIOD) && (DUTY > 1))
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ TRACE_M(TF_VENDOR,"Test Counter is running \r\n");
+ ResponseBuffer[0] = subCmd;
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_TEST_INC_COUNTER:
+ {
+
+ if((DUTY <= PWM_TIME_PERIOD) && (DUTY > 1))
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+
+ TestHitCounter++;
+ TRACE_M(TF_VENDOR,"Command received Count %.2lx \r\n",TestHitCounter);
+ ResponseBuffer[0] = subCmd;
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_MODEL_PUBLISH_SELECT:
+ {
+ for (MOBLEUINT8 idx=0; idx<length; idx++)
+ {
+ TRACE_I(TF_VENDOR,"data[%d]= %d",idx,data[idx]);
+ TRACE_I(TF_VENDOR,"\n\r");
+ }
+ break;
+ }
+
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+
+ return status;
+}
+
+
+/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementNumber : element selected for a node
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCommand;
+ subCommand = data[0];
+ MOBLEUINT16 duty;
+ MOBLEUINT16 intensityValue = 0;
+/* tClockTime delay_t = Clock_Time(); */
+
+ TRACE_M(TF_VENDOR_COMMAND,"#03-%02hx!\n\r",data[0]);
+ switch(subCommand)
+ {
+ /*
+ Message Received B0 B1 B2 B3 B4 B5 B6 B7
+ B0 - Sub-Cmd LED
+ B1-B7 - Data Bytes
+ */
+ case APPLI_CMD_LED_BULB:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+
+ /* Toggle Command */
+ case APPLI_CMD_TOGGLE:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ if(Appli_LedState == 1)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#else
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#endif
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
+ }
+
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* On Command */
+ case APPLI_CMD_ON:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+ BSP_LED_On(LED_BLUE);
+ Appli_LedState = 1;
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM3, mapped on PWM3_PIN (GPIO_2 in mapping) */
+ BSP_LED_On(LED_BLUE);
+ Appli_LedState = 1;
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* Off Command */
+ case APPLI_CMD_OFF:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#else
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#endif
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM3, mapped on PWM3_PIN (GPIO_2 in mapping) */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+
+ break;
+ }
+ /* intensity command */
+ case APPLI_CMD_LED_INTENSITY:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ intensityValue = data[2] << 8;
+ intensityValue |= data[1];
+
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* Default case - Not valid command */
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ /*Buffer will be sent for Reliable Response*/
+ /*First Byte is Sub Command and 2nd Byte is LED Status*/
+ ResponseBuffer[0] = subCommand;
+ if(subCommand == APPLI_CMD_LED_INTENSITY)
+ {
+ ResponseBuffer[1] = intensityValue >> 8 ;
+ ResponseBuffer[2] = intensityValue ;
+ BuffLength = 3;
+ }
+ else
+ {
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ }
+
+ return status;
+}
+
+/**
+* @brief Process the Vendor Data write Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_Data_write(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#0E-%02hx! \n\r",data[0]);
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
+}
+
+/**
+* @brief Appli_GetTestValue: This function is callback for Application
+* when Vensor application test command received then status message is to be provided
+* @param responseValue: Pointer to the status message
+* @retval void
+*/
+void Appli_GetTestValue (MOBLEUINT8 *responseValue)
+{
+ *responseValue = TestHitCounter;
+ *(responseValue+1) = TestHitCounter >> 8;
+ *(responseValue+2) = TestHitCounter >> 16;
+ *(responseValue+3) = TestHitCounter >> 24;
+ TestHitCounter = 0;
+}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.h
new file mode 100644
index 000000000..2b9390099
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.h
@@ -0,0 +1,43 @@
+/**
+ ******************************************************************************
+ * @file appli_vendor.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Vendor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_VENDOR_H
+#define __APPLI_VENDOR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+#define LED_OFF_VALUE 1U
+#define LED_ON_VALUE 32000U
+/* Private define ------------------------------------------------------------*/
+
+MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementNumber, MOBLE_ADDRESS dst_peer);
+MOBLE_RESULT Appli_Vendor_DeviceInfo(MOBLEUINT8 const *data, MOBLEUINT32 length);
+MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length);
+MOBLE_RESULT Appli_Vendor_Data_write(MOBLEUINT8 const *data, MOBLEUINT32 length);
+void Appli_GetTestValue (MOBLEUINT8 *responseValue);
+
+#endif /* __APPLI_VENDOR_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_conf.h
new file mode 100644
index 000000000..4cc3ce72b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_conf.h
@@ -0,0 +1,74 @@
+/**
+ ******************************************************************************
+ * @file ble_conf.h
+ * @author MCD Application Team
+ * @brief BLE configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_CONF_H
+#define __BLE_CONF_H
+
+#include "app_conf.h"
+
+/******************************************************************************
+ *
+ * BLE SERVICES CONFIGURATION
+ * blesvc
+ *
+ ******************************************************************************/
+#define BLE_CFG_MESH 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Peripheral Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_PERIPHERAL 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Central Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_CENTRAL 1
+
+#define BLE_CFG_BROADCASTER 1
+
+#define BLE_CFG_OBSERVER 1
+
+#define BLE_CFG_DATA_ROLE_MODE 4
+
+
+/**
+ * There is one handler per service enabled
+ * Note: There is no handler for the Device Information Service
+ *
+ * This shall take into account all registered handlers
+ * (from either the provided services or the custom services)
+ */
+#define BLE_CFG_SVC_MAX_NBR_CB 7
+
+#define BLE_CFG_CLT_MAX_NBR_CB 5
+
+/******************************************************************************
+ * GAP Service - Apprearance
+ ******************************************************************************/
+#define BLE_CFG_UNKNOWN_APPEARANCE (0)
+#define BLE_CFG_HR_SENSOR_APPEARANCE (832)
+#define BLE_CFG_GAP_APPEARANCE (BLE_CFG_UNKNOWN_APPEARANCE)
+
+#endif /*__BLE_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_dbg_conf.h
new file mode 100644
index 000000000..35a4d96ab
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/ble_dbg_conf.h
@@ -0,0 +1,207 @@
+/**
+ ******************************************************************************
+ * @file ble_dbg_conf.h
+ * @author MCD Application Team
+ * @brief BLE Debug configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_DBG_CONF_H
+#define __BLE_DBG_CONF_H
+
+/**
+ * Enable or Disable traces from BLE
+ */
+
+#define BLE_DBG_DIS_EN 0
+#define BLE_DBG_HRS_EN 0
+#define BLE_DBG_EDS_STM_EN 0
+#define BLE_DBG_LBS_STM_EN 0
+#define BLE_DBG_SVCCTL_EN 1
+#define BLE_DBG_CTS_EN 0
+#define BLE_DBG_HIDS_EN 0
+#define BLE_DBG_PASS_EN 0
+#define BLE_DBG_BLS_EN 0
+#define BLE_DBG_HTS_EN 0
+#define BLE_DBG_ANS_EN 0
+#define BLE_DBG_ESS_EN 0
+#define BLE_DBG_GLS_EN 0
+#define BLE_DBG_BAS_EN 0
+#define BLE_DBG_RTUS_EN 0
+#define BLE_DBG_HPS_EN 0
+#define BLE_DBG_TPS_EN 0
+#define BLE_DBG_LLS_EN 0
+#define BLE_DBG_IAS_EN 0
+#define BLE_DBG_DTS_EN 0
+#define BLE_DBG_WSS_EN 0
+#define BLE_DBG_LNS_EN 0
+#define BLE_DBG_SCPS_EN 0
+#define BLE_DBG_P2P_STM_EN 0
+
+
+/**
+ * Macro definition
+ */
+#if ( BLE_DBG_DIS_EN != 0 )
+#define BLE_DBG_DIS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_DIS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_HRS_EN != 0 )
+#define BLE_DBG_HRS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HRS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_P2P_STM_EN != 0 )
+#define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_EDS_STM_EN != 0 )
+#define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_LBS_STM_EN != 0 )
+#define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_SVCCTL_EN != 0 )
+#define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_CTS_EN != 0)
+#define BLE_DBG_CTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_CTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HIDS_EN != 0)
+#define BLE_DBG_HIDS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HIDS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_PASS_EN != 0)
+#define BLE_DBG_PASS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_PASS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BLS_EN != 0)
+#define BLE_DBG_BLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HTS_EN != 0)
+#define BLE_DBG_HTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ANS_EN != 0)
+#define BLE_DBG_ANS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ANS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ESS_EN != 0)
+#define BLE_DBG_ESS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ESS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_GLS_EN != 0)
+#define BLE_DBG_GLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_GLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BAS_EN != 0)
+#define BLE_DBG_BAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_RTUS_EN != 0)
+#define BLE_DBG_RTUS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_RTUS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HPS_EN != 0)
+#define BLE_DBG_HPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_TPS_EN != 0)
+#define BLE_DBG_TPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LLS_EN != 0)
+#define BLE_DBG_LLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_IAS_EN != 0)
+#define BLE_DBG_IAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_IAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_WSS_EN != 0)
+#define BLE_DBG_WSS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_WSS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LNS_EN != 0)
+#define BLE_DBG_LNS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LNS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_SCPS_EN != 0)
+#define BLE_DBG_SCPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SCPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_DTS_EN != 0)
+#define BLE_DBG_DTS_MSG PRINT_MESG_DBG
+#define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG
+#else
+#define BLE_DBG_DTS_MSG PRINT_NO_MESG
+#define BLE_DBG_DTS_BUF PRINT_NO_MESG
+#endif
+
+
+#endif /*__BLE_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/cube_hal.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/cube_hal.h
new file mode 100644
index 000000000..3afc2e373
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/cube_hal.h
@@ -0,0 +1,47 @@
+/**
+ ******************************************************************************
+ * @file cube_hal.h
+ * @author AMS VMA RF Application team
+ * @brief
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef _CUBE_HAL_H_
+#define _CUBE_HAL_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_conf.h"
+
+#define B1_Pin GPIO_PIN_13
+#define B1_GPIO_Port GPIOC
+#define USART_TX_Pin GPIO_PIN_2
+#define USART_TX_GPIO_Port GPIOA
+#define USART_RX_Pin GPIO_PIN_3
+#define USART_RX_GPIO_Port GPIOA
+#define LD2_Pin GPIO_PIN_5
+#define LD2_GPIO_Port GPIOA
+
+#define UART_TX_TIMEOUT 5
+
+#define Uart_Irq_Handler USART2_IRQHandler
+
+
+void SystemClock_Config(void);
+void Init_Device(void);
+void MX_USART2_UART_Init(void);
+
+
+#endif /* _CUBE_HAL_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/data.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/data.s
new file mode 100644
index 000000000..636eb47c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/data.s
@@ -0,0 +1,50 @@
+;/**
+;******************************************************************************
+;* @file data.s
+;* @author BLE Mesh Team
+;* @version V1.07.000
+;* @date 15-June-2018
+;* @brief Memory management
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+;*
+;* 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 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 STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+;*
+;* Initial BlueNRG-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+;* (MoBLE) technology. The present solution is developed and maintained for both
+;* Mesh library and Applications solely by STMicroelectronics.
+;*
+;******************************************************************************
+;*/
+_bdaddr EQU 0x0807E000
+ EXPORT _bdaddr
+
+ AREA CONFIG, READONLY
+_mobleNvmBase_data
+ EXPORT _mobleNvmBase_data
+ FILL 4096, 0x00
+
+ END
+;/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/hal_common.h
new file mode 100644
index 000000000..730c40219
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/hal_common.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * @file hal_common.h
+ * @author BLE Mesh Team
+ * @brief Common functions of HAL file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef _HAL_H_
+#define _HAL_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#if defined(NUCLEO_L152RE) || defined(USE_STM32WBXX_NUCLEO) || USE_STM32WBXX_USB_DONGLE /* NUCLEO_L152RE */
+#include "user_if.h"
+#else /* not NUCLEO_L152RE */
+#if defined(BLUENRG1) || defined(BLUENRG2) /* BLUENRG1 or BLUENRG2 */
+#include "hal.h"
+#else /* not BLUENRG1 or BLUENRG2 */
+#error "Unsupported board"
+#endif /* BLUENRG1 or BLUENRG2 */
+#endif /* NUCLEO_L152RE */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "types.h"
+
+void SetLed(int state);
+BUTTON_STATE GetButtonState(void);
+BUTTON_STATE GetButton2State(void);
+bool Accel_Process(uint8_t *evt);
+bool Temperature_Read(int16_t *data);
+void InitDevice(void);
+
+void ShouldSleepFunc(void);
+
+#endif /* _HAL_H_ */
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h
new file mode 100644
index 000000000..dd7ae8207
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h
@@ -0,0 +1,257 @@
+/**
+ ******************************************************************************
+ * @file mesh_cfg.h
+ * @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_H
+#define __MESH_CFG_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "mesh_cfg_usr.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* Flash parameters */
+#define PAGE_SIZE 4096
+#define RESET_MANAGER_FLASH_BASE_ADDRESS (0x10040000)
+
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#define UUID_SIZE 16U
+
+#define NO_MODEL_AVLBL 0xFFFF
+
+void TraceHeader(const char* func_name, int mode);
+#define TraceB0(func_name, ...)
+#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
+#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
+#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
+
+/*Enable this Macro to enable the main function prints.
+* This trace does not print the function name and clock.
+*/
+#define TraceC0(...)
+#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
+//#define TraceCX(flags, ...) TraceC ##flags( ##__VA_ARGS__)
+#define TraceCX(flags, ...) TraceC ##flags( __VA_ARGS__)
+#define TRACE_I(flag, ...) TraceCX(flag, ##__VA_ARGS__)
+
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ #define EXTERNAL_MAC_TYPE (uint8_t)(EXTERNAL_MAC_IS_PUBLIC_ADDR<<7)
+#else
+ #define EXTERNAL_MAC_TYPE (uint8_t)0
+#endif
+
+#if (!(GENERATE_STATIC_RANDOM_MAC)) && (!(EXTERNAL_MAC_ADDR_MGMT)) && (!(INTERNAL_UNIQUE_NUMBER_MAC))
+#error "Please select atleast one MAC address Option"
+#endif
+
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+#define ENABLE_SAVE_MODEL_STATE_NVM
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+#define SAVE_MODEL_STATE_NVM 1
+#else
+#define SAVE_MODEL_STATE_NVM 0
+#endif
+
+#define TRANSMIT_RECEIVE_PARAMS \
+{ \
+ TR_GAP_BETWEEN_TRANSMISSION \
+}
+
+#ifdef ENABLE_PB_ADV
+#define PB_ADV_SUPPORTED 1
+#else
+#define PB_ADV_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PB_GATT
+#define PB_GATT_SUPPORTED 1
+#else
+#define PB_GATT_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PUB_KEY_TYPE_OOB
+#define PUB_KEY_TYPE_OOB MOBLE_TRUE
+#else
+#define PUB_KEY_TYPE_OOB MOBLE_FALSE
+#endif
+
+
+#if (PB_ADV_SUPPORTED == 0 && PB_GATT_SUPPORTED == 0)
+#error "Atleast one of PB-ADV and PB-GATT should be defined"
+#endif
+
+#define BLUENRG_MESH_PRVN_BEARER_INFO (PB_ADV_SUPPORTED << 0 | PB_GATT_SUPPORTED << 1)
+
+#ifdef ENABLE_RELAY_FEATURE
+#define RELAY_FEATURE 1
+#else
+#define RELAY_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROXY_FEATURE
+#define PROXY_FEATURE 1
+#else
+#define PROXY_FEATURE 0
+#endif
+
+#ifdef ENABLE_FRIEND_FEATURE
+#define FRIEND_FEATURE 1
+#else
+#define FRIEND_FEATURE 0
+#endif
+
+#ifdef ENABLE_LOW_POWER_FEATURE
+#define LOW_POWER_FEATURE 1
+#else
+#define LOW_POWER_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROVISIONER_FEATURE
+#define PROVISIONER_FEATURE 1
+#else
+#define PROVISIONER_FEATURE 0
+#endif
+
+#if (LOW_POWER_FEATURE && RELAY_FEATURE)
+#error "Low power node can't be relay node"
+#elif (LOW_POWER_FEATURE && PROXY_FEATURE)
+#error "Low power node can't be proxy node"
+#elif (LOW_POWER_FEATURE && FRIEND_FEATURE)
+#error "Low power node can't be friend node"
+#endif
+
+#define BLUENRG_MESH_FEATURES (RELAY_FEATURE << 0 | PROXY_FEATURE << 1 | FRIEND_FEATURE << 2 | LOW_POWER_FEATURE << 3)
+
+#define FRIEND_NODE_PARAMS \
+{ \
+ FN_NO_OF_LPNS \
+}
+
+#define LOW_POWER_NODE_PARAMS \
+{ \
+ LPN_RSSI_FACTOR_LEVEL, \
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL, \
+ LPN_MINIMUM_QUEUE_SIZE_LOG, \
+ LPN_RECEIVE_DELAY, \
+ LPN_POLL_TIMEOUT, \
+ LPN_FRIEND_REQUEST_FREQUENCY, \
+ LPN_FRIEND_POLL_FREQUENCY, \
+ LPN_RECEIVE_WINDOW_SIZE, \
+ LPN_SUBSCR_LIST_SIZE, \
+ LPN_MINIMUM_RSSI, \
+ LPN_NO_OF_RETRIES \
+}
+
+#define UNPROV_NODE_INFO_PARAMS \
+{ \
+ PUB_KEY_TYPE_OOB, \
+ PubKeyBuff, \
+ PrivKeyBuff, \
+ STATIC_OOB_SIZE, \
+ StaticOobBuff, \
+ OUTPUT_OOB_SIZE, \
+ OUTPUT_OOB_ACTION, \
+ Appli_BleOutputOOBAuthCb, \
+ INPUT_OOB_SIZE, \
+ INPUT_OOB_ACTION, \
+ Appli_BleInputOOBAuthCb \
+}
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+#define NEIGHBOR_TABLE_SUPPORTED 1
+#else
+#define NEIGHBOR_TABLE_SUPPORTED 0
+#endif
+
+#if (NEIGHBOR_TABLE_SUPPORTED == 1)
+#if (NEIGHBOR_COUNT == 0)
+#error "Number of neighbors should be nonzero"
+#endif /* NO_OF_NEIGHBORS */
+#if (NEIGHBOR_ALIVE_TIME == 0)
+#error "Number of neighbor alive time should be nonzero"
+#endif /* NEIGHBOR_ALIVE_TIME */
+#if ((NEIGHBOR_UNPRVND_DEV_BEACON_NTU == 0) && (NEIGHBOR_MSG_TTLX_NTU == 0) && (NEIGHBOR_SECURE_NET_BEACON_NTU == 0))
+#error "Atleast one of Network Table Update trigger should be enabled"
+#endif
+#if (NEIGHBOR_UNPRVND_DEV_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_UNPRVND_DEV_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_UNPRVND_DEV_BEACON_NTU */
+#if (NEIGHBOR_SECURE_NET_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_SECURE_NET_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_SECURE_NET_BEACON_NTU */
+#if (NEIGHBOR_MSG_TTLX_NTU > 2)
+#error "Invalid valid of NEIGHBOR_MSG_TTLX_NTU. Allowed value: 0, 1 and 2"
+#endif /* NEIGHBOR_MSG_TTLX_NTU */
+#endif /* NEIGHBOR_TABLE_SUPPORTED */
+
+#define NEIGHBOR_TABLE_PARAMS \
+{ \
+ NEIGHBOR_COUNT, \
+ NEIGHBOR_ALIVE_TIME, \
+ NEIGHBOR_UNPRVND_DEV_BEACON_NTU, \
+ NEIGHBOR_SECURE_NET_BEACON_NTU, \
+ NEIGHBOR_MSG_TTLX_NTU \
+}
+
+#if FRIEND_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE FN_NO_OF_LPNS*816+4
+#elif LOW_POWER_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 112U
+#else
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 4U
+#endif
+
+#define DYNAMIC_MEMORY_SIZE 4096U
+
+#define SEGMENTATION_COUNT (MAX_APPLICATION_PACKET_SIZE / 12) + 2
+#define SAR_BUFFER_SIZE ((uint8_t)SEGMENTATION_COUNT) * 40
+/* Added Interrupt handler for Uart */
+#define SdkEvalComIOUartIrqHandler UART_Handler
+
+#if NEIGHBOR_TABLE_SUPPORTED
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 32U*NEIGHBOR_COUNT
+#else
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 0
+#endif
+
+#define SdkEvalComIOUartIrqHandler UART_Handler /* Added Interrupt handler for Uart */
+/******************** Serial Interface Handling Control **********************/
+
+/* Exported variables ------------------------------------------------------- */
+
+extern const DynBufferParam_t DynBufferParam;
+extern const tr_params_t TrParams;
+extern const lpn_params_t LpnParams;
+extern const fn_params_t FnParams;
+extern const prvn_params_t PrvnParams;
+extern const neighbor_table_init_params_t NeighborTableParams;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLEUINT8 ApplicationSetNodeSigModelList(void);
+MOBLE_RESULT ApplicationInitSigModelList(void);
+MOBLE_RESULT ApplicationInitVendorModelList(void);
+
+#endif /* __MESH_CFG_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h.ref
index 393ef19a1..eff1319d5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h.ref
@@ -31,6 +31,13 @@
#define PAGE_SIZE 4096
#define RESET_MANAGER_FLASH_BASE_ADDRESS (0x10040000)
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#define UUID_SIZE 16U
+
+#define NO_MODEL_AVLBL 0xFFFF
+
void TraceHeader(const char* func_name, int mode);
#define TraceB0(func_name, ...)
#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
@@ -46,6 +53,7 @@ void TraceHeader(const char* func_name, int mode);
#define TraceCX(flags, ...) TraceC ##flags( __VA_ARGS__)
#define TRACE_I(flag, ...) TraceCX(flag, ##__VA_ARGS__)
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
#ifdef EXTERNAL_MAC_ADDR_MGMT
#define EXTERNAL_MAC_TYPE (uint8_t)(EXTERNAL_MAC_IS_PUBLIC_ADDR<<7)
@@ -233,6 +241,7 @@ void TraceHeader(const char* func_name, int mode);
/******************** Serial Interface Handling Control **********************/
/* Exported variables ------------------------------------------------------- */
+
extern const DynBufferParam_t DynBufferParam;
extern const tr_params_t TrParams;
extern const lpn_params_t LpnParams;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h
new file mode 100644
index 000000000..3110dd8af
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h
@@ -0,0 +1,673 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file mesh_cfg_usr.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_USR_H
+#define __MESH_CFG_USR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+/*
+* Different features supported by BLE-Mesh. Uncomment according to application.
+* Low power feature enabled node do not support other features.
+* Do not define any other feature if Low Power feature is defined
+*/
+#define ENABLE_RELAY_FEATURE
+#define ENABLE_PROXY_FEATURE
+#define ENABLE_FRIEND_FEATURE
+//#define ENABLE_PROVISIONER_FEATURE
+#define DYNAMIC_PROVISIONER
+
+/* Macros Used for user defined serial print data for models.
+Either use 0 to disable or 1 to enable
+@ TF_GENERIC is responsible for the Generic model traces.
+@ TF_LIGHT is responsible for the Light model traces.
+@ TF_SENSOR is responsible for the Sensor model traces.
+@ TF_VENDOR is responsible for the vendor model traces.
+@ TF_NEIGHBOUR is responsible for the neighbour function traces.
+@ TF_PROVISION is responsible for the Provision related function traces.
+@ TF_LPN_FRND is responsible for the Low power nodef function traces.
+@ TF_ELEMENTS is responsible for the element selection function traces.
+@ TF_ADDRESS is responsible for the address of element traces.
+@ TF_HANDLER is responsible for the interrupt file traces.
+@ TF_INIT is responsible for the main function traces.
+@ TF_MISC is responsible for the other type traces.
+
+*/
+#define TF_GENERIC 1
+#define TF_LIGHT 1
+#define TF_LIGHT_LC 1
+#define TF_SENSOR 1
+#define TF_VENDOR 1
+#define TF_COMMON 1
+#define TF_VENDOR_COMMAND 1
+#define TF_NEIGHBOUR 0
+#define TF_LPN_FRND 1
+#define TF_ELEMENTS 0
+#define TF_ADDRESS 0
+#define TF_PROVISION 1
+#define TF_HANDLER 0
+#define TF_INIT 1
+#define TF_MISC 1
+#define TF_MEMORY 0
+#define TF_SERIAL_CTRL 1
+#define TF_BEACON 0
+#define TF_GENERIC_CLIENT 1
+#define TF_LIGHT_CLIENT 1
+#define TF_CONFIG_CLIENT 1
+#define TF_LIGHT_CLIENT 1
+
+/*******************************************************************************
+*** Following section helps to select right configuration of Models ***********
+*******************************************************************************/
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the */
+/* Server Generic Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+#define ENABLE_GENERIC_MODEL_SERVER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+
+/* The Following Models are not available in this version, will be developed in
+ next version.
+*/
+/*
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_BATTERY
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY
+
+*/
+
+/******************************************************************************/
+/******* Define the following Macros to enable the usage of the Light Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+
+/*
+ The following Models are managed in different file light_lc.c in middleware
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_LC
+//#define ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the Sensor Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_SENSOR_MODEL_SERVER
+//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the time and */
+/* scene Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_TIME_MODEL_SERVER
+//#define ENABLE_TIME_MODEL_SERVER_SETUP
+//#define ENABLE_SCENE_MODEL_SERVER
+//#define ENABLE_SCENE_MODEL_SERVER_SETUP
+
+/*
+ The Following Models are not available in this version
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
+
+/******* Define the following Macros to enable the vendor model ******/
+//#define ENABLE_VENDOR_MODEL_SERVER
+#define GENERIC_SERVER_MODEL_PUBLISH
+
+/* Define the following Macros to enable the usage of the Client Generic Models */
+#define ENABLE_GENERIC_MODEL_CLIENT_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_CLIENT_LEVEL (1)
+//#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+#define ENABLE_CONFIG_MODEL_CLIENT (1)
+
+/******************************************************************************/
+/*
+Define the Macro for enabling/disabling the Publishing with Generic on off
+or by Vendor Model.
+@ define Macro for Vendor Publishing
+@ Undefine or comment Macro for Generic On Off Publishing
+*/
+//#define VENDOR_CLIENT_MODEL_PUBLISH
+#define GENERIC_CLIENT_MODEL_PUBLISH
+#define LIGHT_CLIENT_MODEL_PUBLISH
+
+#if defined (ENABLE_GENERIC_MODEL_CLIENT_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_CLIENT_LEVEL)
+
+ #define ENABLE_GENERIC_MODEL_CLIENT
+#endif
+
+#if defined (ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS)
+
+ #define ENABLE_LIGHT_MODEL_CLIENT
+#endif
+
+/******************************************************************************/
+/*
+Define the Macros for Enabling/disabling the binding of data between the Generic
+and Light model.
+@ define the Macro for enabling the binding
+@ Undefine or comment the macro for disabling the binding.
+*/
+/******************************************************************************/
+#define ENABLE_MODEL_BINDING
+
+/* Define the macros for the numbers of sensor present.*/
+#define NUMBER_OF_SENSOR 2
+//#define ENABLE_OCCUPANCY_SENSOR
+/*
+Macro is responsible for enabling and desabling the sensor publication.
+Comment this macro to disable the publication
+*/
+//#define ENABLE_SENSOR_PUBLICATION
+
+/******************************************************************************/
+
+
+/* Maximum Time period value of PWM */
+#define PWM_TIME_PERIOD 31990U
+
+/******************************************************************************/
+/***** MACROS for POWER ON-OFF CYCLE BASED UNPROVISIONING *********************/
+/******************************************************************************/
+
+/*
+Define the following Macro to check the Power-OnOff Cycles
+5 Continous cycles of OnOff with Ontime <2 sec will cause unprovisioning
+*/
+//#define ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+
+#define POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING 5
+#define MASK_BITS_FOR_POWER_ON_OFF_CYCLES (0xFFFFFFFF << POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING)
+ /* 0xFFFFFFE0 */
+#define ON_TIME_IN_SECONDS_FOR_POWER_CYCLING 2
+#define BLINK_TIMES_FOR_FACTORY_RESET 5
+
+/*
+Define the following Macro to save Generic and Light Model states in NVM
+This may result into excessive flash erase operations,
+this should be avoided to ensure flash longevity
+*/
+#define ENABLE_SAVE_MODEL_STATE_NVM
+
+/* Only one Macro will be enable at one time */
+//#define SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+//#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+
+/*
+Define the following Macro to save the nodes data in provisioner in NVM
+This may result into excessive flash erase operations,
+this should be avoided to ensure flash longevity
+*/
+#define SAVE_EMBD_PROVISION_DATA 1
+/* Macros defined for the number of bytes saved,
+ number of bytes dedicated for generic model and light model.
+*/
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+#define APP_NVM_MODEL_SIZE 40U
+
+/*Macros are defined for the selection of the number of led and type of lighting
+ used for the application.
+*if board has one led, uncomment USER_BOARD_1LED
+*if board has cool warm leds, uncomment USER_BOARD_COOL_WHITE_LED
+*if board has RGB leds, uncomment USER_BOARD_RGB_LED
+*if board has RGB leds as well as cool warm leds,
+ uncomment USER_BOARD_COOL_WHITE_LED and USER_BOARD_RGB_LED
+*/
+/* comment ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME when using
+ USER_BOARD_COOL_WHITE_LED ,USER_BOARD_RGB_LED
+ Default transition is provided only for one led.
+*/
+#define USER_BOARD_1LED
+//#define USER_BOARD_COOL_WHITE_LED
+//#define USER_BOARD_RGB_LED
+
+/* Pulse Width Modulation support for external LED control */
+#define ENABLE_PWM_SUPPORT 0
+
+/* Note: Please use Full Library configuration in project options to use the full
+ configuration of the C/C++ runtime library
+ for printf and scanf functionality */
+
+/* Enables the serial interface using Uart */
+#define ENABLE_SERIAL_INTERFACE 1
+#define ENABLE_UT 1
+#define ENABLE_SERIAL_CONTROL 1
+#define ENABLE_APPLI_TEST 0
+#define ENABLE_SERIAL_PRVN 1
+
+/*******************************************************************************
+*** Following section helps to configure the Application of Mesh ***********
+*******************************************************************************/
+
+#define APPLICATION_NUMBER_OF_ELEMENTS 1
+#define APPLICATION_SIG_MODELS_MAX_COUNT 20
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT 2
+
+
+/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
+(the list is available
+@ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers)
+For STMicroelectronics : it is 0x0030 */
+#define COMPANY_ID 0x0030
+
+/* Contains a 16-bit vendor-assigned product identifier */
+#define PRODUCT_ID 0x0002
+
+/* Contains a 16-bit vendor-assigned product version ID */
+#define PRODUCT_VERSION_ID 0x010A
+
+#define MAX_APPLICATION_PACKET_SIZE 160
+
+#define TPT_SEGMENT_COUNT (((MAX_APPLICATION_PACKET_SIZE)/12)+2)
+
+/*******************************************************************************
+********** MAC Address Configuration *******************************************
+*******************************************************************************/
+
+/*
+* Define to enable external MAC handling,
+* DONT change the Values 0x01, 0x02, 0x03
+* SELECT ONLY One of the Option
+*/
+//#define GENERATE_STATIC_RANDOM_MAC 0x01
+//#define EXTERNAL_MAC_ADDR_MGMT 0x02
+#define INTERNAL_UNIQUE_NUMBER_MAC 0x03
+
+/* Declare this value as 0x01 if the External Address is PUBLIC Address */
+/* For example like this: #define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x1 */
+/* Else, by default, the external address will be treated as RANDOM */
+#define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x0
+
+/******************************************************************************/
+
+
+/*******************************************************************************
+****** Following section helps to select right configuration of node ***********
+*******************************************************************************/
+/*
+* Minimum gap between successive transmissions
+* varies from 10 to 65535
+*/
+#define TR_GAP_BETWEEN_TRANSMISSION 50U
+
+
+/*
+* Different provision bearer supported by BLE-Mesh.
+* Define according to application.
+* Atleast one of PB-ADV and PB-GATT should be defined
+*/
+#define ENABLE_PB_ADV
+#define ENABLE_PB_GATT
+//#define ENABLE_PUB_KEY_TYPE_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+#define STATIC_OOB_SIZE 16U
+#else
+#define STATIC_OOB_SIZE 0U
+#endif
+/* Output OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#else
+#define OUTPUT_OOB_SIZE 0U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#endif
+
+/* Input OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#else
+#define INPUT_OOB_SIZE 0U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#endif
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+ #define PROVISIONER_ROOT_ADDR_DEFAULT 0x0001
+ #define PRVN_ELEMENTS_PER_NODE_MAX 0x0003
+
+ /* Enables the UUID saving per Node - Currenly Not Supported */
+ #define ENABLE_SAVE_UUID_PER_NODE 0
+
+/* Enables the Elements per Node info saving - Currenly Not Supported */
+ /* #if (ELEMENTS_PER_NODE_MAX > 1)
+ #define ENABLE_SAVE_ELEMENTS_PER_NODE 1
+ #endif
+ */
+#endif
+
+
+/*
+* Friend node receive window size is 50 ms
+*/
+
+/*
+* Friend node subscription list size is 4
+*/
+
+/*
+* Friend node message queue is 16
+*/
+
+/*
+* Number of Low power nodes that can be associated with Friend node
+* varies from 1 to 10
+*/
+#define FN_NO_OF_LPNS 6U
+
+/*
+* For prioritizing friendship offer with good RSSI link
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RSSI_FACTOR_LEVEL 1U
+
+/*
+* For prioritizing friendship offer with good receive window factor
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RECIVE_WINDOW_FACTOR_LEVEL 1U
+
+/*
+* Minimum packets queue size required by Low Power node
+* varies from 1 to 7
+* Ref @Mesh_v1.0
+* 1 -> 2
+* 2 -> 4
+* 3 -> 8
+* 4 -> 16
+* 5 -> 32
+* 6 -> 64
+* 7 -> 128
+*/
+#define LPN_MINIMUM_QUEUE_SIZE_LOG 2U
+
+/*
+* (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_DELAY 150U
+
+/*
+* Poll timeout value after which friendship cease to exist (unit 100ms)
+* varies from 0x00000A to 0x34BBFF
+* Ref @Mesh_v1.0
+* 0x00000A -> 1 second
+* 0x34BBFF -> 96 hours
+*/
+#define LPN_POLL_TIMEOUT 2000U
+
+/*
+* Maximum receive window size acceptable to low power node (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_WINDOW_SIZE 255U/*55U*/
+
+/*
+* Minimum friend's subscription list size capability required by lpn
+* varies from 1 to 5
+* Ref @Mesh_v1.0
+*/
+#define LPN_SUBSCR_LIST_SIZE 2U
+
+/*
+* Frequency at which low power node would send friend request (unit 100ms)
+* varies from 0 to 255
+* 100 -> 10s
+*/
+#define LPN_FRIEND_REQUEST_FREQUENCY 50U
+
+/*
+* Frequency at which low power node would poll friend node (unit 100ms)
+* should be less than poll timeout
+* 100 -> 10s
+*/
+#define LPN_FRIEND_POLL_FREQUENCY 25U
+
+/*
+* Minimum RSSI required by low power node
+* should be less than equal to -60
+*/
+#define LPN_MINIMUM_RSSI -100
+
+/*
+* Retries to be made by lpn before termination of friendship
+* varies from 2 to 10
+*/
+#define LPN_NO_OF_RETRIES 10U
+
+/*
+* Maximum address list size buffer in
+* Friend Subscription List Add Message is 10
+*/
+
+
+/*
+* Enable or disable neighbor table
+* if defined -> enabled
+* If MAC address of neighbor changes it appears as new neighbor
+* Neighbor table update can be triggered (configurable) in following cases
+* On receiving Unprovisioned device beacon
+* On receiving Secure network beacon
+* On receiving Mesh message
+* Message with any TTL
+* Message with TTL = 0
+* if not defined -> disabled
+*/
+#define ENABLE_NEIGHBOR_TABLE
+
+/*
+* Size of neighbor table
+*/
+#define NEIGHBOR_COUNT 5U
+
+/*
+* (unit s)
+* Duration (wrt appear or last refresh)
+* for which neighbor exists in neighbor table
+*/
+#define NEIGHBOR_ALIVE_TIME 20U
+
+/*
+* Enable/disable neighbor table update with unprovisioned device beacon
+* 0: Disable neighbor table update with unprovisioned device beacon
+* 1: Enable neighbor table update with unprovisioned device beacon
+*/
+#define NEIGHBOR_UNPRVND_DEV_BEACON_NTU 1U
+
+/*
+* Enable/disable neighbor table update with secure network beacon
+* 0: Disable neighbor table update with secure network beacon
+* 1: Enable neighbor table update with secure network beacon
+*/
+#define NEIGHBOR_SECURE_NET_BEACON_NTU 0U
+
+/*
+* Enable/disable neighbor table update with TTL 0 message
+* 0: Disable neighbor table update messages
+* 1: Enable neighbor table update with messages with 0 TTL
+* 2: Enable neighbor table update with messages with any TTL
+*/
+#define NEIGHBOR_MSG_TTLX_NTU 0U
+
+/*******************************************************************************
+*** Following section helps to configure the LEDs of Application of Mesh ***
+*******************************************************************************/
+
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+ #define SINGLE_LED PWM4
+ #define COOL_LED PWM0
+ #define WARM_LED PWM1
+ #define RED_LED PWM2
+ #define GREEN_LED PWM3
+ #define BLUE_LED PWM4
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (ENABLE_GENERIC_MODEL_SERVER)
+ #define ENABLE_GENERIC_MODEL_SERVER (1)
+#endif
+
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (GENERIC_SERVER_MODEL_ADD_CONFIGURATION)
+ #define GENERIC_SERVER_MODEL_ADD_CONFIGURATION (1)
+
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP) \
+ && !defined (ENABLE_LIGHT_MODEL_SERVER)
+ #define ENABLE_LIGHT_MODEL_SERVER (1)
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP) \
+ && !defined (LIGHT_SERVER_MODEL_ADD_CONFIGURATION)
+ #define LIGHT_SERVER_MODEL_ADD_CONFIGURATION
+#endif
+
+#if defined(ENABLE_TIME_MODEL_SERVER) \
+ || defined(ENABLE_TIME_MODEL_SERVER_SETUP)\
+ || defined(ENABLE_SCENE_MODEL_SERVER)\
+ || defined(ENABLE_SCENE_MODEL_SERVER_SETUP)
+ && !defined (ENABLE_TIME_SCENE_MODEL_SERVER)
+ #define ENABLE_TIME_SCENE_MODEL_SERVER (1)
+#endif
+
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* __MESH_CFG_USR_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h.ref
index c230c60e0..2590ee1a5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg_usr.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h.ref
@@ -1,43 +1,22 @@
+/* USER CODE BEGIN Header */
/**
-******************************************************************************
-* @file mesh_cfg_usr.h
-* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
-* @brief Header file for mesh_usr_cfg.c
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-*
-* 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 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 STMicroelectronics nor the names of its contributors
-* may be used to endorse or promote products derived from this software
-* without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
-*
-* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
-* (MoBLE) technology. The present solution is developed and maintained for both
-* Mesh library and Applications solely by STMicroelectronics.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file mesh_cfg_usr.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MESH_CFG_USR_H
@@ -48,6 +27,17 @@
/* Exported macro ------------------------------------------------------------*/
+/*
+* Different features supported by BLE-Mesh. Uncomment according to application.
+* Low power feature enabled node do not support other features.
+* Do not define any other feature if Low Power feature is defined
+*/
+#define ENABLE_RELAY_FEATURE
+#define ENABLE_PROXY_FEATURE
+#define ENABLE_FRIEND_FEATURE
+//#define ENABLE_PROVISIONER_FEATURE
+#define DYNAMIC_PROVISIONER
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC is responsible for the Generic model traces.
@@ -64,15 +54,15 @@ Either use 0 to disable or 1 to enable
@ TF_MISC is responsible for the other type traces.
*/
-#define TF_GENERIC 0
-#define TF_LIGHT 0
-#define TF_LIGHT_LC 0
-#define TF_SENSOR 0
-#define TF_VENDOR 0
-#define TF_COMMON 0
-#define TF_VENDOR_COMMAND 0
+#define TF_GENERIC 1
+#define TF_LIGHT 1
+#define TF_LIGHT_LC 1
+#define TF_SENSOR 1
+#define TF_VENDOR 1
+#define TF_COMMON 1
+#define TF_VENDOR_COMMAND 1
#define TF_NEIGHBOUR 0
-#define TF_LPN_FRND 0
+#define TF_LPN_FRND 1
#define TF_ELEMENTS 0
#define TF_ADDRESS 0
#define TF_PROVISION 1
@@ -92,11 +82,6 @@ Either use 0 to disable or 1 to enable
*******************************************************************************/
/******* Define the following Macros to enable the usage of the Models ******/
-#ifdef CLIENT
-#define ENABLE_GENERIC_MODEL_SERVER_ONOFF
-#endif
-
-#ifdef SERVER
/* Define the following Macros to enable the usage of the Server Generic Models */
#define ENABLE_GENERIC_MODEL_SERVER_ONOFF
#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
@@ -107,10 +92,9 @@ Either use 0 to disable or 1 to enable
/* The Following Models are not available in this version, will be developed in
next version.
*/
-
-//#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
-//#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
/*
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
#define ENABLE_GENERIC_MODEL_SERVER_BATTERY
#define ENABLE_GENERIC_MODEL_SERVER_LOCATION
#define ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
@@ -145,8 +129,8 @@ Either use 0 to disable or 1 to enable
/* Define the following Macros to enable the usage of the Sensor Models */
/******************************************************************************/
-//#define ENABLE_SENSOR_MODEL_SERVER
-//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
+#define ENABLE_SENSOR_MODEL_SERVER
+#define ENABLE_SENSOR_MODEL_SERVER_SETUP
/******************************************************************************/
/* Define the following Macros to enable the usage of the time and scene Models */
@@ -164,11 +148,9 @@ Either use 0 to disable or 1 to enable
//#define ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
/******* Define the following Macros to enable the vendor model ******/
-//#define ENABLE_VENDOR_MODEL_SERVER
+#define ENABLE_VENDOR_MODEL_SERVER
#define GENERIC_SERVER_MODEL_PUBLISH
-#endif
-#ifdef CLIENT
/* Define the following Macros to enable the usage of the Client Generic Models */
#define ENABLE_GENERIC_MODEL_CLIENT_ONOFF
#define ENABLE_GENERIC_MODEL_CLIENT_LEVEL
@@ -184,7 +166,7 @@ or by Vendor Model.
*/
//#define VENDOR_CLIENT_MODEL_PUBLISH
#define GENERIC_CLIENT_MODEL_PUBLISH
-//#define LIGHT_CLIENT_MODEL_PUBLISH
+#define LIGHT_CLIENT_MODEL_PUBLISH
#if defined (ENABLE_GENERIC_MODEL_CLIENT_ONOFF) \
|| defined (ENABLE_GENERIC_MODEL_CLIENT_LEVEL)
@@ -197,8 +179,6 @@ or by Vendor Model.
#define ENABLE_LIGHT_MODEL_CLIENT
#endif
-#endif
-
/******************************************************************************/
/*
Define the Macros for Enabling/disabling the binding of data between the Generic
@@ -207,7 +187,7 @@ and Light model.
@ Undefine or comment the macro for disabling the binding.
*/
/******************************************************************************/
-//#define ENABLE_MODEL_BINDING
+#define ENABLE_MODEL_BINDING
/* Define the macros for the numbers of sensor present.*/
#define NUMBER_OF_SENSOR 2
@@ -248,7 +228,7 @@ This may result into excessive flash erase operations, this should be avoided to
/* Only one Macro will be enable at one time */
//#define SAVE_MODEL_STATE_FOR_ALL_MESSAGES
-//#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
/*
Define the following Macro to save the nodes data in provisioner in NVM
@@ -283,18 +263,19 @@ This may result into excessive flash erase operations, this should be avoided to
/* Enables the serial interface using Uart */
#define ENABLE_SERIAL_INTERFACE 1
-#define ENABLE_UT 0
+#define ENABLE_UT 1
#define ENABLE_SERIAL_CONTROL 1
#define ENABLE_APPLI_TEST 0
-#ifdef CLIENT
#define ENABLE_SERIAL_PRVN 1
-#endif
/*******************************************************************************
*** Following section helps to configure the Application of Mesh ***********
*******************************************************************************/
-#define APPLICATION_NUMBER_OF_ELEMENTS 1
+#define APPLICATION_NUMBER_OF_ELEMENTS 3
+#define APPLICATION_SIG_MODELS_MAX_COUNT 20
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT 2
+
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
(the list is available @ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers )
@@ -377,29 +358,31 @@ For STMicroelectronics : it is 0x0030 */
#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
#endif
-/*
-* Different features supported by BLE-Mesh. Uncomment according to application.
-* Low power feature enabled node do not support other features.
-* Do not define any other feature if Low Power feature is defined
-*/
-#define ENABLE_RELAY_FEATURE
-#define ENABLE_PROXY_FEATURE
-#define ENABLE_FRIEND_FEATURE
-//#define ENABLE_LOW_POWER_FEATURE
-#ifdef CLIENT
-#define ENABLE_PROVISIONER_FEATURE
-#endif
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+ #define PROVISIONER_ROOT_ADDR_DEFAULT 0x0001
+ #define PRVN_ELEMENTS_PER_NODE_MAX 0x0003
+
+ /* Enables the UUID saving per Node - Currenly Not Supported */
+ #define ENABLE_SAVE_UUID_PER_NODE 0
+
+/* Enables the Elements per Node info saving - Currenly Not Supported */
+ /* #if (ELEMENTS_PER_NODE_MAX > 1)
+ #define ENABLE_SAVE_ELEMENTS_PER_NODE 1
+ #endif
+ */
+#endif
+
/*
-* Friend node receive window size is fixed at 50 ms
+* Friend node receive window size is 50 ms
*/
/*
-* Friend node subscription list size is fixed at 4
+* Friend node subscription list size is 4
*/
/*
-* Friend node maximum number of messages is fixed at 16
+* Friend node message queue is 16
*/
/*
@@ -617,6 +600,7 @@ For STMicroelectronics : it is 0x0030 */
#define ENABLE_TIME_SCENE_MODEL_SERVER
#endif
+
/* Exported variables -------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.c
new file mode 100644
index 000000000..f82f3b293
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.c
@@ -0,0 +1,627 @@
+/**
+ ******************************************************************************
+ * @file models_if.c
+ * @author BLE Mesh Team
+ * @brief Mesh Modes interface file of the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "appli_mesh.h"
+#include "vendor.h"
+#include "light.h"
+#include "sensors.h"
+#include "generic.h"
+#include "time_scene.h"
+#include "common.h"
+#include "appli_generic.h"
+#include "appli_vendor.h"
+#include "appli_light.h"
+#include "appli_sensor.h"
+#include "appli_nvm.h"
+#include "ble_hci_le.h"
+#include "models_if.h"
+
+#include "PWM_config.h"
+#include "PWM_handlers.h"
+#include "appli_light_lc.h"
+#include "light_lc.h"
+#include "appli_generic_client.h"
+#include "config_client.h"
+#include "generic_client.h"
+#include "appli_light_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+#pragma pack(1)
+typedef struct
+{
+ MOBLE_ADDRESS peer;
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 command;
+ MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
+ MOBLEUINT32 length;
+} APPLI_SEND_RESPONSE_MODULE;
+
+typedef struct
+{
+ MOBLEUINT8 packet_count;
+ MOBLEUINT32 send_time;
+ APPLI_SEND_RESPONSE_MODULE* head;
+ MOBLEUINT8 head_index;
+ APPLI_SEND_RESPONSE_MODULE packet[MAX_PENDING_PACKETS_QUE_SIZE];
+} APPLI_PENDING_PACKETS;
+#pragma pack(4)
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+
+
+/* Private variables ---------------------------------------------------------*/
+APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
+
+__attribute__((aligned(4)))
+const MOBLE_VENDOR_CB_MAP vendor_cb =
+{
+ Vendor_WriteLocalDataCb,
+ Vendor_ReadLocalDataCb,
+ Vendor_OnResponseDataCb
+};
+
+__attribute__((aligned(4)))
+const Appli_Vendor_cb_t VendorAppli_cb =
+{
+ /*Vendor Commads*/
+ Appli_Vendor_LEDControl,
+ Appli_Vendor_DeviceInfo,
+ Appli_Vendor_Test,
+ Appli_LedCtrl,
+ Appli_GetTestValue,
+ Appli_Vendor_Data_write
+};
+
+__attribute__((aligned(4)))
+const Appli_Generic_cb_t GenericAppli_cb =
+{
+ /* Generic OnOff callbacks */
+ Appli_Generic_OnOff_Set,
+ /* Generic OnOff Status callbacks */
+ Appli_Generic_OnOff_Status,
+ /* Generic Level callbacks */
+ Appli_Generic_Level_Set,
+ Appli_Generic_Delta_Set,
+ Appli_Generic_Move_Set,
+ /* Generic Level Status callbacks */
+ Appli_Generic_Level_Status,
+ /* Generic Power on off callbacks */
+ Appli_Generic_PowerOnOff_Set,
+ /* Generic Power on off callbacks */
+ Appli_Generic_PowerOnOff_Status,
+
+ /* Generic Default transition time callbacks */
+ Appli_Generic_DefaultTransitionTime_Set,
+ /* Generic Default transition time callbacks */
+ Appli_Generic_DefaultTransitionTime_Status
+};
+
+__attribute__((aligned(4)))
+const Appli_Generic_State_cb_t Appli_GenericState_cb =
+{
+
+ /* Generic Get On Off status */
+ Appli_Generic_GetOnOffStatus,
+ Appli_Generic_GetOnOffValue,
+ /* Generic Get level status */
+ Appli_Generic_GetLevelStatus,
+ /* Generic Get Power on off status */
+ Appli_Generic_GetPowerOnOffStatus,
+ /* Generic Get Default transition time status */
+ Appli_Generic_GetDefaultTransitionStatus
+};
+
+__attribute__((aligned(4)))
+const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+{
+ Appli_Light_GetLightnessStatus,
+ Appli_Light_GetLightnessLinearStatus,
+ Appli_Light_GetLightnessDefaultStatus,
+ Appli_Light_GetLightnessLastStatus,
+ Appli_Light_GetLightnessRangeStatus,
+ Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTemperatureStatus,
+ Appli_Light_GetCtlTemperatureRange,
+ Appli_Light_GetCtlDefaultStatus,
+ Appli_Light_GetHslStatus,
+ Appli_Light_GetHslHueStatus,
+ Appli_Light_GetHslSaturationStatus,
+ Appli_Light_GetHslHueRange,
+ Appli_Light_GetHslSatRange,
+ Appli_Light_GetHslDefaultStatus
+};
+
+
+__attribute__((aligned(4)))
+const Appli_Light_cb_t LightAppli_cb =
+{
+ /* Light Lightness callbacks */
+ Appli_Light_Lightness_Set,
+ Appli_Light_Lightness_Status,
+
+ Appli_Light_Lightness_Linear_Set,
+ Appli_Light_Lightness_Linear_Status,
+
+ Appli_Light_Lightness_Default_Set,
+ Appli_Light_Lightness_Default_Status,
+
+ Appli_Light_Lightness_Range_Set,
+ Appli_Light_Lightness_Range_Status,
+
+ Appli_Light_Ctl_Set,
+ Appli_Light_Ctl_Status,
+
+ Appli_Light_CtlTemperature_Set,
+ Appli_Light_CtlTemperature_Status,
+
+ Appli_Light_CtlTemperature_Range_Set,
+ Appli_Light_CtlTemperature_Range_Status,
+
+ Appli_Light_CtlDefault_Set,
+ Appli_Light_CtlDefault_Status,
+
+ Appli_Light_Hsl_Set,
+ Appli_Light_Hsl_Status,
+
+ Appli_Light_HslHue_Set,
+ Appli_Light_HslHue_Status,
+
+ Appli_Light_HslSaturation_Set,
+ Appli_Light_HslSaturation_Status,
+
+ Appli_Light_HslDefault_Set,
+ Appli_Light_HslDefault_Status,
+
+ Appli_Light_HslRange_Set,
+ Appli_Light_HslRange_Status
+};
+
+
+__attribute__((aligned(4)))
+const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+{
+ /* Light LC mode set callbacks */
+ Appli_LightLC_Mode_Set,
+ Appli_LightLC_OM_Set,
+ Appli_LightLC_OnOff_Set,
+};
+
+__attribute__((aligned(4)))
+const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+{
+ Appli_LightLC_Get_ModeStatus,
+ Appli_LightLC_Get_OMModeStatus,
+ Appli_LightLC_Get_OnOffStatus,
+ Appli_LightLC_Get_AmbientLuxLevelOutput,
+ Appli_Light_LC_PIRegulatorOutput,
+};
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+__attribute__((aligned(4)))
+const Appli_Sensor_cb_t SensorAppli_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_Cadence_Set,
+ Appli_Sensor_Data_Status,
+ Appli_Sensor_Descriptor_Status ,
+ Appli_Sensor_Setting_Set
+};
+
+__attribute__((aligned(4)))
+const Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+{
+ Appli_Sensor_GetSettingStatus,
+ Appli_Sensor_GetSetting_IDStatus
+};
+
+#endif
+
+
+__attribute__((aligned(4)))
+const MODEL_SIG_cb_t Model_SIG_cb[] =
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER
+ {
+ GenericModelServer_GetOpcodeTableCb,
+ GenericModelServer_GetStatusRequestCb,
+ GenericModelServer_ProcessMessageCb
+ },
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER
+ {
+ LightModelServer_GetOpcodeTableCb,
+ LightModelServer_GetStatusRequestCb,
+ LightModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+{
+ SensorModelServer_GetOpcodeTableCb,
+ SensorModelServer_GetStatusRequestCb,
+ SensorModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
+ {
+ Time_SceneModelServer_GetOpcodeTableCb,
+ Time_SceneModelServer_GetStatusRequestCb,
+ Time_SceneModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ {
+ Light_LC_ModelServer_GetOpcodeTableCb,
+ Light_LC_ModelServer_GetStatusRequestCb,
+ Light_LC_ModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_GENERIC_MODEL_CLIENT
+ {
+ GenericModelClient_GetOpcodeTableCb,
+ GenericModelClient_GetStatusRequestCb,
+ GenericModelClient_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_CONFIG_MODEL_CLIENT
+ {
+ ConfigClientModel_GetOpcodeTableCb,
+ ConfigClientModel_GetStatusRequestCb,
+ ConfigClientModel_ProcessMessageCb
+ },
+#endif
+
+ { 0, 0,0 }
+};
+
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+
+#define MODEL_SIG_COUNT ( ( sizeof(Model_SIG_cb)/sizeof(Model_SIG_cb[0]) - 1 ))
+
+__attribute__((aligned(4)))
+const MODEL_Vendor_cb_t Model_Vendor_cb[] =
+{
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ {
+ VendorModel_PID1_GetOpcodeTableCb,
+ VendorModel_PID1_GetStatusRequestCb,
+ VendorModel_PID1_ProcessMessageCb
+ },
+#endif
+ { 0, 0,0 }
+};
+
+#define MODEL_VENDOR_COUNT ( ( sizeof(Model_Vendor_cb)/sizeof(Model_Vendor_cb[0]) - 1 ))
+
+extern MOBLEUINT8 NumberOfElements;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUINT32* VendorModelscount)
+{
+ *pModelsTable = Model_Vendor_cb ;
+ *VendorModelscount = MODEL_VENDOR_COUNT;
+
+ TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+}
+
+/**
+* @brief Initialization Commands for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsInit(void)
+{
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+
+ MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
+
+#ifdef CLIENT
+ MOBLEUINT8 PrvnStateLoad_Size;
+ MOBLEUINT8 PrvnlStateLoadBuff[16];
+#endif
+
+ /* Callbacks used by BlueNRG-Mesh Models */
+ BLEMesh_SetSIGModelsCbMap(Model_SIG_cb, MODEL_SIG_COUNT);
+
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
+
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
+ if (modelStateLoad_Size != 0)
+ {
+ /* update states of generic model */
+ Model_RestoreStates(modelStateLoadBuff, modelStateLoad_Size);
+ }
+
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initiallization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+#endif
+}
+
+/**
+* @brief Process Commands for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsProcess(void)
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER
+ Generic_Process();
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER
+ Lighting_Process();
+#endif
+
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ Vendor_Process();
+#endif
+/* Define this Macro to enable the publication of sensors data.*/
+#if defined ENABLE_SENSOR_MODEL_SERVER
+ Sensor_Process();
+#endif
+
+#if ENABLE_APPLI_TEST
+ Test_Process();
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ ModelSave_Process();
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Light_control_Process();
+#endif
+}
+
+/**
+* @brief Publish Command for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsCommand(void)
+{
+#ifdef VENDOR_CLIENT_MODEL_PUBLISH
+ Vendor_Publish(BLEMesh_GetAddress());
+#endif
+
+#ifdef GENERIC_CLIENT_MODEL_PUBLISH
+ Appli_GenericClient_OnOff_Set();
+#endif
+
+#ifndef CLIENT
+/* if CLIENT and SERVER => Publish is already done in CLIENT */
+#ifdef GENERIC_SERVER_MODEL_PUBLISH
+ Generic_Publish(BLEMesh_GetAddress());
+#endif
+#endif
+
+}
+
+/**
+* @brief Get the Element Number for selected Model
+* @param dst_peer : Destination Address received
+* @retval MOBLEUINT8 : elementIndex
+*/
+MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
+{
+
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementNumber;
+
+ nodeAddress = BLEMesh_GetAddress();
+ elementNumber = ((dst_peer - nodeAddress)+1);
+
+ return elementNumber;
+}
+
+/**
+* @brief Check Subscription of Elements for Group Address for selected Model
+* @param dst_peer : Destination Address received
+* @param elementNumber : Number of element to check Subscription
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
+ MOBLEUINT8 elementNumber)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_FAIL;
+ MOBLE_ADDRESS subscriptionList[10] = {0};
+ MOBLEUINT8 length;
+ MOBLEUINT32 modelId = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ BLEMesh_GetSubscriptionAddress(subscriptionList,&length,elementNumber, modelId);
+
+
+ for(uint8_t list=0; list<length; list++)
+ {
+ if(dst_peer == subscriptionList[list])
+ {
+ status = MOBLE_RESULT_SUCCESS;
+ break;
+ }
+ }
+
+ return status;
+}
+
+/**
+* @brief Schedule a packet to be sent with randomized send timestamp
+* If a que is empty, random timestamp is calculated
+* Subsequent packets are sent in sequence
+* @param peer: Address of the peer
+* @param dst : Address of the node
+* @param status: Command status
+* @param data: Data buffer.
+* @param length: Length of data in bytes.
+* @retval None
+*/
+void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
+ MOBLE_ADDRESS dst,
+ MOBLEUINT8 command,
+ MOBLEUINT8 const * data,
+ MOBLEUINT32 length)
+{
+ MOBLEUINT8 random_time[8];
+
+ if (Appli_PendingPackets.packet_count == 0)
+ {
+ Appli_PendingPackets.packet_count = 1;
+ hci_le_rand(random_time);
+ Appli_PendingPackets.send_time = Clock_Time() +
+ DEFAULT_DELAY_PACKET_FROM +
+ (random_time[0] + random_time[1]*256)\
+ %DEFAULT_DELAY_PACKET_RANDOM_TIME;
+ Appli_PendingPackets.head = Appli_PendingPackets.packet;
+ Appli_PendingPackets.head_index = 0;
+ TRACE_M(TF_MISC, "Randomized time: %ld\n\r", Appli_PendingPackets.send_time - Clock_Time());
+ }
+ else
+ {
+ Appli_PendingPackets.packet_count += 1;
+ Appli_PendingPackets.packet_count = (Appli_PendingPackets.packet_count)%\
+ (MAX_PENDING_PACKETS_QUE_SIZE+1);
+
+ if (Appli_PendingPackets.head != (Appli_PendingPackets.packet + \
+ MAX_PENDING_PACKETS_QUE_SIZE - 1))
+ {
+ Appli_PendingPackets.head = Appli_PendingPackets.head +1;
+ Appli_PendingPackets.head_index = Appli_PendingPackets.head_index+1;
+ }
+ else
+ {
+ Appli_PendingPackets.head = Appli_PendingPackets.packet;
+ Appli_PendingPackets.head_index = 0;
+ }
+ }
+
+ Appli_PendingPackets.head->peer = peer;
+ Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->command = command;
+ Appli_PendingPackets.head->length = length;
+ for (MOBLEUINT8 count=0; count<length; count++)
+ Appli_PendingPackets.head->data[count] = data[count];
+}
+
+
+/**
+* @brief If send timestamp is reached and que is not empty, send all packets
+* @param None
+* @retval None
+*/
+void BLEMesh_ModelsSendDelayedPacket(void)
+{
+ APPLI_SEND_RESPONSE_MODULE* ptr;
+ MOBLEUINT8 temp_index;
+
+ if ((Appli_PendingPackets.packet_count != 0) &&
+ (Appli_PendingPackets.send_time <= Clock_Time()))
+ {
+ for (MOBLEUINT8 count=Appli_PendingPackets.packet_count; count!=0; count--)
+ {
+ TRACE_M(TF_MISC, "Sending randomized packets. Packet count: %d \n\r",\
+ Appli_PendingPackets.packet_count - count + 1);
+ temp_index = ((Appli_PendingPackets.head_index+MAX_PENDING_PACKETS_QUE_SIZE+1)\
+ -count)%MAX_PENDING_PACKETS_QUE_SIZE;
+ ptr = Appli_PendingPackets.packet + temp_index;
+
+ VendorModel_SendResponse(VENDOR_STMICRO_CID,
+ ptr->peer,
+ ptr->dst,
+ ptr->command,
+ ptr->data,
+ ptr->length);
+ }
+
+ Appli_PendingPackets.packet_count = 0;
+ }
+}
+
+/** \brief Set remote publication for the given Model ID & node Address
+* User is responsible for serializing data into \a data buffer. Vendor_WriteLocalDataCb
+* callback will be called on the remote device.
+* @param modelId ID of the model.
+* @param srcAddress element Address of the Node
+* @param command vendor model commands
+* @param data Data buffer.
+* @param length Length of data in bytes.
+* @param response If 'MOBLE_TRUE', used to get the response. If 'MOBLE_FALSE', no response
+* @return MOBLE_RESULT_SUCCESS on success.
+*/
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 elementIdx,
+ MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
+ MOBLEUINT32 length, MOBLEBOOL ack_flag,
+ MOBLEUINT8 isVendor)
+{
+ MOBLE_ADDRESS srcAddress;
+
+ srcAddress = BLEMesh_GetAddress();
+ srcAddress += elementIdx; /* Get the Address to send in the message */
+
+ return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ srcAddress ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+}
+
+/**
+* @brief Convert ASCII value into Character
+* @param tempValue : 8bit value for conversion
+* @retval MOBLEUINT8
+*/
+MOBLEUINT8 BLEMesh_ModelsASCII_To_Char(MOBLEUINT8 tempValue)
+{
+ tempValue = tempValue - 0x30;
+ return tempValue;
+}
+
+__weak void Test_Process(void)
+{
+}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.h
new file mode 100644
index 000000000..486e0bcec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.h
@@ -0,0 +1,50 @@
+/**
+ ******************************************************************************
+ * @file models_if.h
+ * @author BLE Mesh Team
+ * @brief Mesh Modes interface file header
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MODELS_H
+#define __MODELS_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+void BLEMesh_ModelsInit(void);
+void BLEMesh_ModelsProcess(void);
+void BLEMesh_ModelsCommand(void);
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, MOBLEUINT8 elementNumber);
+MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer, MOBLE_ADDRESS dst, MOBLEUINT8 command,
+ MOBLEUINT8 const * data, MOBLEUINT32 length);
+void BLEMesh_ModelsSendDelayedPacket(void);
+MOBLEUINT8 BLEMesh_ModelsASCII_To_Char(MOBLEUINT8 tempValue);
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLE_ADDRESS element_number,
+ MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
+ MOBLEUINT32 length, MOBLEBOOL ack_flag,
+ MOBLEUINT8 isVendor);
+
+#endif /* __MODELS_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/pal_nvm.c
new file mode 100644
index 000000000..04bc07489
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/pal_nvm.c
@@ -0,0 +1,446 @@
+/**
+ ******************************************************************************
+ * @file pal_nvm.c
+ * @author BLE Mesh Team
+ * @brief Flash management for the Controller
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "pal_nvm.h"
+#include "pal_if.h"
+#include <string.h>
+
+#include "ble.h"
+#include "shci.h"
+#include "mesh_cfg_usr.h"
+
+#include "hw_flash.h"
+
+/* Private define ------------------------------------------------------------*/
+#define FLASH_SECTOR_SIZE 0x1000
+#define MAX_NVM_PENDING_WRITE_REQS 1
+
+/* Private variables ---------------------------------------------------------*/
+typedef struct
+{
+ MOBLEUINT16 offset;
+ MOBLEUINT16 size;
+ void const *buff;
+} BNRGM_NVM_WRITE;
+
+typedef struct
+{
+ MOBLEUINT8 no_of_pages_to_be_erased;
+ MOBLEUINT8 no_of_write_reqs;
+ MOBLEBOOL backup_req;
+ BNRGM_NVM_WRITE write_req[MAX_NVM_PENDING_WRITE_REQS];
+} BNRGM_NVM_REQS;
+
+BNRGM_NVM_REQS BnrgmNvmReqs = {0};
+
+/* Private functions ---------------------------------------------------------*/
+/**
+ * @brief Gets the page of a given address
+ * @param Addr: Address of the FLASH Memory
+ * @retval The page of a given address
+ */
+static MOBLEUINT32 GetPage(MOBLEUINT32 Addr)
+{
+ MOBLEUINT32 page = 0;
+
+ if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
+ {
+ /* Bank 1 */
+ page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
+ }
+ else
+ {
+ /* Bank 2 */
+ page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
+ }
+
+ return page;
+}
+
+#if 0
+/**
+* @brief PalNvmErase
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
+ MOBLEUINT32 offset)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+ uint32_t pageError = 0;
+
+// printf("PalNvmErase >>>\r\n");
+
+ FLASH_EraseInitTypeDef erase;
+ erase.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase.Page = GetPage(address + offset); /* 126 or 127 */;
+ erase.NbPages = FLASH_SECTOR_SIZE >> 12;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON);
+
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ status = HAL_FLASHEx_Erase(&erase, &pageError);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+
+// printf("PalNvmErase <<<\r\n");
+
+ return status == HAL_OK ? MOBLE_RESULT_SUCCESS : MOBLE_RESULT_FAIL;
+}
+#endif
+
+/**
+* @brief returns NVM write protect status
+* @param None
+* @retval TRUE if flash is write protected
+*/
+MOBLEBOOL MoblePalNvmIsWriteProtected(void)
+{
+ /* All flash is writable */
+ return MOBLE_FALSE;
+}
+
+/**
+* @brief Read NVM
+* @param address: read start address of nvm
+* @param offset: offset read start address of nvm
+* @param buf: copy of read content
+* @param size: size of memory to be read
+* @param backup: If read from backup memory
+* @retval Result of read operation
+*/
+MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void *buf,
+ MOBLEUINT32 size,
+ MOBLEBOOL backup)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+// printf("MoblePalNvmRead >>>\r\n");
+
+ if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ memcpy(buf, (void *)(address + offset), size);
+ }
+
+// printf("MoblePalNvmRead <<<\r\n");
+ return result;
+}
+
+/**
+* @brief Compare with NVM
+* @param offset: start address of nvm to compare
+* @param offset: offset start address of nvm
+* @param buf: copy of content
+* @param size: size of memory to be compared
+* @param comparison: outcome of comparison
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size,
+ MOBLE_NVM_COMPARE* comparison)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+// printf("MoblePalNvmCompare >>>\r\n");
+
+ if ((comparison == NULL) || (buf == NULL))
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ *comparison = MOBLE_NVM_COMPARE_EQUAL;
+
+ uint8_t* src = (uint8_t*)buf;
+ uint8_t* dst = (uint8_t*)(address + offset);
+
+ for (MOBLEUINT32 i=0; i<size; ++i)
+ {
+ if ((src[i] != dst[i]) && (*comparison == MOBLE_NVM_COMPARE_EQUAL))
+ {
+ *comparison = MOBLE_NVM_COMPARE_NOT_EQUAL;
+ }
+ if ((src[i] & dst[i]) != dst[i])
+ {
+ *comparison = MOBLE_NVM_COMPARE_NOT_EQUAL_ERASE;
+ break;
+ }
+ }
+ }
+
+// printf("MoblePalNvmCompare <<<\r\n");
+#else
+ *comparison = MOBLE_NVM_COMPARE_EQUAL;
+#endif
+ return result;
+}
+
+/**
+* @brief Erase NVM
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmErase(MOBLEUINT32 address,
+ MOBLEUINT32 offset)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+ uint32_t pageError = 0;
+
+// printf("MoblePalNvmErase >>>\r\n");
+
+ FLASH_EraseInitTypeDef erase;
+ erase.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase.Page = GetPage(address + offset); /* 126 or 127 */;
+ erase.NbPages = FLASH_SECTOR_SIZE >> 12;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON);
+
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ status = HAL_FLASHEx_Erase(&erase, &pageError);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+
+// printf("MoblePalNvmErase <<<\r\n");
+
+ return status == HAL_OK ? MOBLE_RESULT_SUCCESS : MOBLE_RESULT_FAIL;
+}
+
+/**
+* @brief Write to NVM
+* @param offset: wrt start address of nvm
+* @param offset: offset wrt start address of nvm
+* @param buf: copy of write content
+* @param size: size of memory to be written
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 remain = 0;
+ MOBLEUINT32 nb_dword = 0;
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+
+ // printf("MoblePalNvmWrite >>>\r\n");
+
+ if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ nb_dword = (size >> 3);
+ remain = size - ((nb_dword) << 3);
+ if(remain > 0)
+ nb_dword += 1;
+
+ uint64_t* src = (uint64_t*)buf;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR | FLASH_FLAG_SIZERR | FLASH_FLAG_PGAERR);
+
+ for (size_t i = 0; i < nb_dword/*size*/; i++)
+ {
+ do
+ {
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address + offset + (i <<3), src[i]);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ } while(*((uint64_t*)(address + offset + (i <<3))) != src[i]);
+ }
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+ }
+// printf("MoblePalNvmWrite <<<\r\n");
+#endif
+
+ return result;
+}
+
+#if 0
+/**
+* @brief Backup process
+* @param None
+* @retval Result
+*/
+static MOBLE_RESULT BnrgmPalNvmBackupProcess(void)
+{
+ MOBLEUINT32 buff[4*N_BYTES_WORD];
+ static MOBLEUINT8 backup_pages_to_be_erased = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (backup_pages_to_be_erased == 0)
+ {
+ backup_pages_to_be_erased = 1;
+ }
+
+ if(backup_pages_to_be_erased != 0)
+ {
+#if 0
+ BluenrgMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ if(BluenrgMesh_IsFlashReadyToErase())
+ {
+ FLASH_ErasePage((uint16_t)((BNRGM_NVM_BACKUP_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE +
+ BNRGM_NVM_BACKUP_SIZE/PAGE_SIZE - backup_pages_to_be_erased));
+
+ if (FLASH_GetFlagStatus(Flash_CMDERR) == SET)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ backup_pages_to_be_erased--;
+ }
+ }
+ else
+ {
+ /* do nothing */
+ }
+ ATOMIC_SECTION_END();
+#else
+ result = PalNvmErase(NVM_BASE, FLASH_SECTOR_SIZE);
+ if(result == MOBLE_RESULT_SUCCESS)
+ backup_pages_to_be_erased = 0;
+#endif
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS && backup_pages_to_be_erased == 0)
+ {
+#if 0
+ BluenrgMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ if(BluenrgMesh_IsFlashReadyToErase())
+ {
+ for (size_t i = 0; i < BNRGM_NVM_BACKUP_SIZE && FLASH_GetFlagStatus(Flash_CMDERR) == RESET; )
+ {
+ memcpy((MOBLEUINT8*)buff, (void *)(BNRGM_NVM_BASE + i), 4*N_BYTES_WORD);
+ FLASH_ProgramWordBurst(BNRGM_NVM_BACKUP_BASE + i, (uint32_t*)buff);
+ i += 4*N_BYTES_WORD;
+ }
+
+ if (FLASH_GetFlagStatus(Flash_CMDERR) == SET)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ BnrgmNvmReqs.backup_req = MOBLE_FALSE;
+ }
+ }
+ else
+ {
+ /* do nothing */
+ }
+ ATOMIC_SECTION_END();
+#else
+#endif
+ }
+ return result;
+}
+#endif
+
+/**
+* @brief NVM process
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT BnrgmPalNvmProcess(void)
+{
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/svcctl_conf.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/svcctl_conf.c
new file mode 100644
index 000000000..1dce9189e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/svcctl_conf.c
@@ -0,0 +1,82 @@
+/**
+ ******************************************************************************
+ * @file svctl_conf.c
+ * @author MCD Application Team
+ * @brief Configuration of the BLE service controller
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "app_common.h"
+
+#include "otp.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* Private variables ---------------------------------------------------------*/
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+{
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+};
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+const uint8_t* SVCCTL_GetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_conf.h
new file mode 100644
index 000000000..6df3dc0c7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_conf.h
@@ -0,0 +1,33 @@
+/**
+ ******************************************************************************
+ * @file tl_conf.h
+ * @author MCD Application Team
+ * @brief Transport Layer Configuration
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_CONF_H
+#define __TL_CONF_H
+
+/**
+ * It shall be set to 1 for power optimization when standby is supported
+ */
+#define CFG_BLE_HCI_STDBY 0
+
+
+
+#endif /*__TL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_if.c
new file mode 100644
index 000000000..609ca64cf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_if.c
@@ -0,0 +1,47 @@
+/**
+ ******************************************************************************
+ * @file tl_if.c
+ * @author MCD Application Team
+ * @brief Transport layer interface to BLE
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "app_common.h"
+
+#include "hci_tl.h"
+#include "shci_tl.h"
+#include "tl.h"
+
+
+void hci_register_io_bus(tHciIO* fops)
+{
+ /* Register IO bus services */
+ fops->Init = TL_BLE_Init;
+ fops->Send = TL_BLE_SendCmd;
+
+ return;
+}
+
+void shci_register_io_bus(tSHciIO* fops)
+{
+ /* Register IO bus services */
+ fops->Init = TL_SYS_Init;
+ fops->Send = TL_SYS_SendCmd;
+
+ return;
+}
+
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.c
new file mode 100644
index 000000000..43a0e548d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.c
@@ -0,0 +1,364 @@
+/**
+******************************************************************************
+* @file user_if.c
+* @author BLE Mesh Team
+* @version V1.09.000
+* @date 15-Oct-2018
+* @brief User interface file
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BlueNRG-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+/* Includes ------------------------------------------------------------------*/
+#include "cube_hal.h"
+#include "ble_clock.h"
+#include "hci.h"
+#include "user_if.h"
+#include "hal.h"
+#include "hal_common.h"
+#include "mesh_cfg.h"
+
+#include <stdio.h>
+#ifdef IAR
+#include <yfuns.h>
+#else
+#define _LLIO_STDIN 0
+#define _LLIO_STDOUT 1
+#define _LLIO_STDERR 2
+#define _LLIO_ERROR ((size_t)-1) /* For __read and __write. */
+#endif
+
+
+
+typedef struct _IO_ReceiveCallBack
+{
+ /**
+ * callback to notify the application with the received I/O data
+ */
+ IO_RECEIVE_DATA_USER_CALLBACK_TYPE IO_user_application;
+} IO_ReceiveCallBack;
+/**
+* @}
+*/
+
+#define READ_DATA_SIZE 1024
+#define READ_BUFFER_IS_EMPTY() (Read_ptr_in == Read_ptr_out)
+
+/* IO User Callback used to handle received data from I/O channel*/
+static uint8_t Read_Buffer [READ_DATA_SIZE];
+static uint32_t Read_ptr_in = 0;
+static uint32_t Read_ptr_out = 0;
+/*static volatile uint8_t s_SdkEvalVersion = ID_UNKNOWN;*/
+static IO_ReceiveCallBack IO_Receive_Data;
+static void SdkEval_IO_processInputData(uint8_t * rx_data, uint16_t data_size);
+
+
+/**
+* @brief SetLed Sets the state of led
+* @param int state State for the led GPIO
+* @retval void
+*/
+void SetLed(int state)
+{
+ if (state)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+}
+
+#if 0
+/**
+* @brief GetButtonState
+* @param void
+* @retval BUTTON_STATE returns the status of the userbutton GPIO
+*/
+BUTTON_STATE GetButtonState(void)
+{
+ return HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
+}
+
+/**
+* @brief InitButton initializes the GPIO for the user button
+* @param void
+* @retval void
+*/
+void InitButton(void)
+{
+ GPIO_InitTypeDef init;
+ init.Pin = GPIO_PIN_13;
+ init.Mode = GPIO_MODE_INPUT | GPIO_MODE_EVT_FALLING;
+ init.Pull = GPIO_NOPULL;
+ init.Speed = GPIO_SPEED_VERY_LOW;
+ init.Alternate = 0;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &init);
+ EXTI->FTSR |= EXTI_RTSR_TR13; /* enable wake-up event on falling edge */
+ EXTI->IMR &= ~EXTI_IMR_MR13; /* disable interrupt */
+ EXTI->EMR |= EXTI_EMR_MR13; /* enable event */
+}
+#endif
+
+/**
+* @brief processInputData
+* @param uint8_t * rx_data pointer to receive data
+* @param uint16_t data_size size of receive data
+* @retval void
+*/
+void processInputData(uint8_t * rx_data, uint16_t data_size)
+{
+ SdkEval_IO_processInputData(rx_data, data_size);
+}
+
+/**
+* @brief Configure the selected I/O communication channel
+* @param None.
+* @retval None.
+*/
+void SdkEval_IO_Config(IO_RECEIVE_DATA_USER_CALLBACK_TYPE io_receive_function)
+{
+ IO_Receive_Data.IO_user_application = io_receive_function;
+#if defined (ENABLE_USB)
+ /* Init Device Library */
+ USBD_Init(&USBD_Device, &VCP_Desc, 0);
+
+ /* Add Supported Class */
+ USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
+
+ /* Add CDC Interface Class */
+ USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
+
+ /* Start Device Process */
+ USBD_Start(&USBD_Device);
+
+#elif defined (ENABLE_USART)
+ /* Init Serial Uart */
+ MX_USART2_UART_Init();
+#endif
+}
+
+/**
+* @brief InitDevice intitializes the Device
+* @param void
+* @retval void
+*/
+void InitDevice(void)
+{
+ Init_Device(); /* Initializes HAL and System Clock */
+
+#ifndef NEWLIB_SYSCALLS
+ SdkEval_IO_Config(processInputData);
+#endif
+ /* Delay for debug purpose, in order to see printed data at startup. */
+#if defined(ENABLE_USART)
+ Clock_Wait(2000);
+#endif
+
+#if defined(ACCELEROMETER_TYPE) || defined(THERMOMETER_TYPE)
+ I2C_Reset();
+ Temperature_Init();
+ Accel_Init();
+#endif
+ InitButton();
+}
+
+
+/**
+* @brief ShouldSleepFunc sleep mode fuction
+* @param void
+* @retval void
+*/
+void ShouldSleepFunc(void)
+{
+ __disable_irq();
+ __WFE();
+ __NOP();
+ __enable_irq();
+}
+
+/**
+* @brief Receive data on selected I/O port
+* @param rx_data pointer to buffer of received
+* @param data_size number of received data
+* @retval None.
+*/
+void SdkEval_IO_Receive_Data(uint8_t * rx_data, uint16_t data_size)
+{
+ if(IO_Receive_Data.IO_user_application)
+ IO_Receive_Data.IO_user_application(rx_data,data_size);
+
+}
+/**
+* @brief Read buffer push
+* @param byte
+* @retval None.
+*/
+void Read_Buffer_Push(uint8_t byte)
+{
+ Read_Buffer[Read_ptr_in] = byte;
+
+ Read_ptr_in++;
+
+ /* To avoid buffer overflow */
+ if(Read_ptr_in == READ_DATA_SIZE)
+ {
+ Read_ptr_in = 0;
+ }
+}
+/**
+* @brief Read buffer pop
+* @param byte
+* @retval None.
+*/
+int Read_Buffer_Pop(uint8_t *byte)
+{
+ if(READ_BUFFER_IS_EMPTY())
+ return 0;
+
+ *byte = Read_Buffer[Read_ptr_out];
+
+ Read_ptr_out++;
+
+ if(Read_ptr_out == READ_DATA_SIZE)
+ Read_ptr_out = 0;
+
+ return 1;
+}
+/**
+* @brief Process input data
+* @param byte
+* @retval None.
+*/
+static void SdkEval_IO_processInputData(uint8_t * rx_data, uint16_t data_size)
+{
+ for(int i = 0; i < data_size; i++){
+ Read_Buffer_Push(rx_data[i]);
+ }
+}
+extern UART_HandleTypeDef huart2;
+#undef putchar
+/**
+* @brief Put character
+* @param byte
+* @retval None.
+*/
+int putchar(int c)
+{
+ /* wait for the transmission end */
+ while(!(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE)));
+ /* send the data */
+ HAL_UART_Transmit(&huart2, (uint8_t*)&c, 1, UART_TX_TIMEOUT);
+ return c;
+}
+
+void __io_putchar(char c)
+{
+ putchar(c);
+}
+
+/* Required for Keil */
+#ifndef __IAR_SYSTEMS_ICC__
+void _ttywrch(int ch)
+{
+ putchar(ch);
+}
+
+int fputc(int ch, FILE *f)
+{
+ _ttywrch(ch);
+ return(ch);
+}
+int fgetc(FILE *f)
+{
+ return -1;
+}
+#endif
+
+/**
+* @brief Write handle
+* @param buffer
+* @param size
+* @retval None.
+*/
+size_t _write(int handle, const unsigned char * buffer, size_t size)
+{
+ size_t nChars = 0;
+
+ if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) {
+ return _LLIO_ERROR;
+ }
+
+ if (buffer == 0) {
+ /* This means that we should flush internal buffers.
+ spin until TX complete (TX is idle)*/
+#ifdef ENABLE_USB
+ while (!USB_OUT_BUFFER_IS_EMPTY()) {}
+#endif /* ENABLE_USB */
+ return 0;
+ }
+
+ while(size--) {
+ __io_putchar(*buffer++);
+ ++nChars;
+ }
+
+ return nChars;
+}
+
+/**
+* @brief Read handle
+* @param buffer
+* @param size
+* @retval None.
+*/
+size_t __read(int handle, unsigned char * buffer, size_t size)
+{
+ size_t bytes = 0;
+
+ while(bytes < size && Read_Buffer_Pop(buffer+bytes)){
+ bytes++;
+ }
+ return bytes;
+}
+
+uint8_t __io_getcharNonBlocking(uint8_t *data)
+{
+ if (__read(_LLIO_STDIN,data,1))
+ return 1;
+ else
+ return 0;
+}/* end serialReadByte() */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.h
new file mode 100644
index 000000000..773b36116
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/user_if.h
@@ -0,0 +1,62 @@
+/**
+******************************************************************************
+* @file user_if.h
+* @author BLE Mesh Team
+* @version V1.09.000
+* @date 15-Oct-2018
+* @brief Header file for User interface file
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef _USER_INTERFACE_H_
+#define _USER_INTERFACE_H_
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_conf.h"
+#include "ble_clock.h"
+
+#define BUTTON_PRESSED GPIO_PIN_RESET
+
+/* Exported typedefs ---------------------------------------------*/
+typedef GPIO_PinState BUTTON_STATE;
+typedef void (* IO_RECEIVE_DATA_USER_CALLBACK_TYPE) (uint8_t * rx_data, uint16_t data_size);
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* _USER_INTERFACE_H_ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/vcp_conf.h
new file mode 100644
index 000000000..22b6dc41c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/vcp_conf.h
@@ -0,0 +1,52 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_IdleTask_VCP_SendData)
+#define VCP_TASK_PRIO (CFG_SCH_Prio_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TimProcID_isr)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/target/hw_ipcc.c
new file mode 100644
index 000000000..7b22ea955
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/target/hw_ipcc.c
@@ -0,0 +1,517 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for BLE
+ * middleWare.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliCmdNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_CliEvtNotification();
+
+ return;
+}
+
+__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+#endif /* ZIGBEE_WB */
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.cproject
new file mode 100644
index 000000000..64d342212
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.cproject
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2106919477">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2106919477" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="BLE_MeshLightingProvisionerDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2106919477" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2106919477." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.75597975" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.730190850" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.2072091582" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32WB55CGUx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.189342369" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" useByScannerDiscovery="false" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1724737922" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.379473005" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1133239011" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.softfp" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.1133459099" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/Lighting_Provisioner}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.502436180" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1852267998" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.719201886" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.2136162881" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.1225705824" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/app"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1103896373" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="STM32"/>
+ <listOptionValue builtIn="false" value="ENABLE_USART"/>
+ <listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
+ <listOptionValue builtIn="false" value="CLIENT"/>
+ <listOptionValue builtIn="false" value="SERVER"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.432136804" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1898674116" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.538307564" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1579296512" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.370135148" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.664789689" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.328291676" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/app"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1097783580" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="STM32"/>
+ <listOptionValue builtIn="false" value="ENABLE_USART"/>
+ <listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
+ <listOptionValue builtIn="false" value="CLIENT"/>
+ <listOptionValue builtIn="false" value="SERVER"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1199130518" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1979199147" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.562217871" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.745177817" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.319533219" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.619683766" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+ <listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
+ </option>
+ <option id="gnu.c.link.option.paths.1970583672" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
+ </option>
+ <option id="gnu.c.link.option.ldflags.238159959" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.1667816293" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1459481604" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.291319121" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1140046849" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1063914437" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+ <listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.1_CM4_GCC.a"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.55293263" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
+ </option>
+ <option id="gnu.cpp.link.option.flags.1300889115" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.143770351" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.955883710" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.524808949" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1205075798" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.42243415" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.739913651" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1423232419" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="Middlewares/STM32_WPAN/ble/blesvc/time_scene.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="Lighting_Provisioner.fr.ac6.managedbuild.target.gnu.cross.exe.875216092" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2106919477;fr.ac6.managedbuild.config.gnu.cross.exe.debug.2106919477.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1852267998;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1898674116">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration artifactName="${ProjName}" configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="Lighting_Provisioner"/>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.project
index 54ffad474..15b1a61d3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/.project
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
- <name>Lighting_Node</name>
+ <name>Lighting_Provisioner</name>
<comment/>
<projects>
</projects>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..7ac9a391f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/Lighting_Provisioner/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed ā€œas is,ā€ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..f79eec117
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* start address for the .MB_MEM2 section. defined in linker script */
+.word _sMB_MEM2
+/* end address for the .MB_MEM2 section. defined in linker script */
+.word _eMB_MEM2
+
+/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */
+.macro INIT_BSS start, end
+ ldr r0, =\start
+ ldr r1, =\end
+ movs r3, #0
+ bl LoopFillZerobss
+.endm
+
+/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */
+.macro INIT_DATA start, end, src
+ ldr r0, =\start
+ ldr r1, =\end
+ ldr r2, =\src
+ movs r3, #0
+ bl LoopCopyDataInit
+.endm
+
+.section .text.data_initializers
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+ bx lr
+
+FillZerobss:
+ str r3, [r0]
+ adds r0, r0, #4
+
+LoopFillZerobss:
+ cmp r0, r1
+ bcc FillZerobss
+ bx lr
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ INIT_DATA _sdata, _edata, _sidata
+
+/* Zero fill the bss segments. */
+ INIT_BSS _sbss, _ebss
+ INIT_BSS _sMB_MEM2, _eMB_MEM2
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/syscalls.c
new file mode 100644
index 000000000..e3c8a89f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/SW4STM32/syscalls.c
@@ -0,0 +1,204 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2014 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/readme.txt
new file mode 100644
index 000000000..c07c96ce4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/readme.txt
@@ -0,0 +1,315 @@
+/**
+ @page BLE_MeshLightingDemo example
+
+ @verbatim
+ ******************** (C) COPYRIGHT 2020 STMicroelectronics *******************
+ * @file BLE/BLE_MeshLightingProvisioner/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE Mesh Lighting Embedded Provisioner demo example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2020 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@par Directory contents
+ mesh_lighting_demo
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/app_debug.h Interface to support debug in the application
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - BLE/BLE_MeshLightingProvisioner/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/app_debug.c Interface to support debug in the application
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/hw_flash.c FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/main.c Main program
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_MeshLightingProvisioner/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_config_client.c Application interface for Config CLient Mesh Model
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_config_client.h Header of Application interface for Config CLient Mesh Model
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_generic_client.c Application interface for Client Generic Mesh Models
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_generic_client.h Header of Application interface for Client Generic Mesh Models
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_light_client.c Application interface for Client Light Mesh Models
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_light_client.h Header of Application interface for Client Light Mesh Models
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/hal_common.h Header for common function of HAL file
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/tl_if.c Transport Layer interface
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/user_if.h Header file for User interface file
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/user_if.c User interface file
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
+ - BLE/BLE_MeshLightingProvisioner/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG-Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+For more details refer to the Application Note:
+ AN5292_STM32WB_How_to_build_BLE_Mesh_Application
+
+@Introduction
+
+The ST BLE-Mesh library supports all of the following features in a Mesh node:
+1. Relay: to forward received network PDUs on advertising or GATT bearer, if the Proxy feature is enabled
+2. Proxy: to forward received network PDUs between GATT and advertising bearers
+3. Friend: can perform duties such as scanning for other associated nodes that are usually Low Power mode
+4. Low Power: consumes much less power as the node usually does not perform any scanning
+A typical BLE Mesh node radio should always be in scanning mode to avoid missing packets over the air, but this kind of
+operation is not supported by many devices due to continuous energy requirements.
+To enable low power operation, BLE Mesh Profile v1.0 defines the concept of Friendship.
+In a Mesh network, a Low Power feature-enabled Mesh node (LPN) offloads its packet receiving (scanning) duty to an adjacent
+Friend feature-enabled Mesh node (FN). The LPN is not always scanning and remains inactive (or sleeps) for most of its life
+cycle, significantly reducing its energy requirements. Nodes running on batteries or energy harvesting techniques usually
+support the Low Power feature.
+Once connected to each other, the FN and LPN are considered friends and their connection is known as a Friendship. At least
+one FN must be in the direct radio range of an LPN to establish Friendship.
+
+@Configuration
+
+General default setting defined in mesh_cfg_usr.h:
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF (1) /* GENERIC SERVER ONOFF MODEL ON FIRST ELEMENT */
+ APPLICATION_NUMBER_OF_ELEMENTS 1 /* NUMBER OF ELEMENT SUPPORTED */
+ APPLICATION_SIG_MODELS_MAX_COUNT 20 /* TOTAL NUMBER OF MODELS SUPPORTED */
+ APPLICATION_VENDOR_MODELS_MAX_COUNT 2 /* TOTAL NIMBER OF VENDOR MODELS SUPPORTED */
+ ENABLE_PB_ADV /* Provisioning Bearer over advertising channels support */
+ ENABLE_PB_GATT /* Provisioning Bearer over GATT proxy support */
+
+Provisioner Node
+Provisioner feature support is defined in mesh_cfg_usr.h by the predefinition of ENABLE_PROVISIONER_FEATURE or DYNAMIC_PROVISIONER.
+
+When the ENABLE_PROVISIONER_FEATURE is defined after generating and flashing the binary,
+the Provisioner Node is self provisioned and configured during the initialization.
+
+When the DYNAMIC_PROVISIONER is defined after generating, flashing the binary and the initialization the provisioner is like
+an unprovisioned device that can be provisioned and configured by BLE-Mesh Android or BLE-Mesh iOS smartphone application.
+To dynamically set the device as a provisioner self provisioned and self configured, you can run the following command in an external
+terminal: atep root
+Here are the external terminal settings:
+ baud rate of 115200
+ Byte size of 8
+ Parity None
+ Stop bits 1
+ Data Flow Control None
+
+Establishment of Link by ID between a Provisioner and an unprovisioned device:
+
+ Provisioner Device 1 Device 2 Device 3
+ | | | |
+ Scan | | |
+ |<-----------------Unprovisioned Device Beacon (UUID 3, OOB info)----------------|
+ | | | |
+ |<---Unprovisioned Device--| | |
+ | Beacon (UUID 1, OOB info)| | |
+ | | | |
+ |<---Unprovisioned Device Beacon (UUID 2, OOB info)---| |
+ | | | |
+ Provisioner chooses | | |
+ to provision device | | |
+ with UUID 2 | | |
+ | | | |
+ |-------------------Link Open (UUID 2)--------------->| |
+ | | | |
+ |<----------------------Link Ack----------------------| |
+ | | | |
+ PB-ADV Provisioning Process |
+ | | | |
+ |<------------------Link Close (Reason)---------------| |
+ | | | |
+
+PB-ADV Provisioning Process
+
+ Client Server
+ Provisioner New Device
+ | |
+ Scan for Un-provisioned |
+ Device, Link establishment |
+ | |
+ |<-----------------------Un-provisioned Device Adv beacon------------------------|
+ | |
+ |------------------------10% = Invite for Provisioning-------------------------->|
+ | |
+ |<--------------------20% = Provisioning Capabilities sharing--------------------|
+ | |
+ |------------------------30% = Provisioning start PDU--------------------------->|
+ | |
+ |------------------------40% = Provisioning Public Key-------------------------->|
+ | |
+ Calculate ECDH Calculate ECDH
+ | |
+ |<-----------------------50% = Provisioning Public Key---------------------------|
+ | |
+ Session Session
+ Key calculation Key calculation
+ | |
+ |----------------60% = Provisioning Data (Network key, IV Index,---------------->|
+ | Unicast address, Key Index, Flags) |
+ | |
+ |<-----------------------70% = Provisioning Completed----------------------------|
+ | |
+ Disconnection Disconnection
+
+Configuration Process
+
+ Provisioner Provisioned Device
+ | |
+ Scan for Proxy |
+ | |
+ |----------------------------Get Composition Data------------------------------->|
+ | |
+ |<---------------------Status = Receive Composition data-------------------------|
+ | |
+ |----------------------------80% = App Key Add---------------------------------->|
+ | |
+ |<------------------------Status = App Key Status--------------------------------|
+ | |
+ |-----------------90% = App Bind with Models selected by user------------------->|
+ | |
+ |<------------------------Status = Binding Status--------------------------------|
+ | |
+ |-------------100% = Add Subsciption with Models selected by user--------------->|
+ | |
+ |<----------------------Status = Subscription Status-----------------------------|
+ | |
+ |-------------100% = Set Publication Address for Client Node-------------------->|
+ | |
+ |<----------------------Status = Publication Status------------------------------|
+ | |
+ Configuration Configuration
+ completed completed
+
+In the Provisioner terminal, after self provisioning and self configuration you can:
+- scan for un-provisioned device with the command: atep scan
+ The UUID addresses of the unprovisioned devices are displayed like as following:
+ Device-0 -> F81D4FAE7DEC4B53A154F6FB0726E1C0
+- provision and configure the un-provisioned device with the command: atep prvn-0 2
+ 0: is the scanned Device ID, 0 for Device-0 with the UUID address F81D4FAE7DEC4B53A154F6FB0726E1C0
+ 2: is the unicast address you want to associates to the provisioned node (1 is used for the provisioner Node)
+ Many lines are displayed on the terminal, until hte following one:
+ 38281 Appli_ConfigClient_ConfigureNode - **Node is configured**
+
+By pressing [SW1] button on the Provisioner Node:
+1. Provisioner Node publishes a LED ON command to the default group and the Provisioner Node blue LED immediately turns on.
+2. As soon as the Provisioned Node receives the LED ON command, the blue LED immediately turns on.
+
+ Provisioner Node Provisioned Node
+ | |
+ SW1 PUSH->| |
+ Blue LED on->| |
+ |--------------------------------LED on----------------------------------------->|<-Blue LED on
+ | |
+ SW1 PUSH->| |
+ Blue LED off->| |
+ |--------------------------------LED off---------------------------------------->|<-Blue LED off
+ | |
+
+By pressing [SW1] button on the Provisioned Node:
+1. Provisioned Node publishes a LED ON command to the default group and the Provisioned Node blue LED immediately turns on.
+3. As soon as the Provisioner Node receives the LED ON command, the blue LED immediately turns on.
+
+ Provisioner Node Provisioned Node
+ | |
+ | |<-SW1 PUSH
+ | |<-Blue LED on
+ Blue LED on->|<--------------------------------LED on-----------------------------------------|
+ | |
+ | |<-SW1 PUSH
+ | |<-Blue LED off
+ Blue LED off->|<--------------------------------LED off----------------------------------------|
+ | |
+
+From Provisioner Node terminal following command can be sent:
+- atcl c000 8202 01 01
+ c000: default group address
+ 8202: opcode of the GENERIC ONOFF SET command (see chapter 7.1 Messages summary of the Mesh Model Bluetooth SIG Specification Revision v1.0)
+ 01: The target value of the Generic OnOff state (see chapter 3.2.1.2 Generic OnOff Set of the Mesh Model Bluetooth SIG Specification Revision v1.0)
+ 01: Transaction Identifier (see chapter 3.2.1.2 Generic OnOff Set of the Mesh Model Bluetooth SIG Specification Revision v1.0)
+ => Blue LED of Provisioner Node and Provisioned Node turns on.
+From Provisioned Node terminal following command can be sent:
+- atcl c000 8202 00 01
+ c000: default group address
+ 8202: opcode of the GENERIC ONOFF SET command (see chapter 7.1 Messages summary of the Mesh Model Bluetooth SIG Specification Revision v1.0)
+ 00: The target value of the Generic OnOff state (see chapter 3.2.1.2 Generic OnOff Set of the Mesh Model Bluetooth SIG Specification Revision v1.0)
+ 01: Transaction Identifier (see chapter 3.2.1.2 Generic OnOff Set of the Mesh Model Bluetooth SIG Specification Revision v1.0)
+ => Blue LED of Provisioner Node and Provisioned Node turns off.
+
+* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..10c61f9ac 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..10c61f9ac 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/SW4STM32/BLE_Peripheral_Lite/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/SW4STM32/BLE_Peripheral_Lite/.cproject
index 3b24a0fdf..9613e9967 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/SW4STM32/BLE_Peripheral_Lite/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/SW4STM32/BLE_Peripheral_Lite/.cproject
@@ -1,201 +1,282 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1539450082">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1539450082" moduleId="org.eclipse.cdt.core.settings" name="Debug">
- <externalSettings />
+ <externalSettings/>
<extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser" />
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1539450082" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1539450082." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1277938562" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
- <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.530645054" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1643694367" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.board.1330091111" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.530645054" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1643694367" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1330091111" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
<option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
- <listOptionValue builtIn="false" value="ARM Cortex-M4" />
- <listOptionValue builtIn="false" value="CM4" />
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
</option>
- <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1091780791" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1545741691" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1553906696" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated" />
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.706120334" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1091780791" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1545741691" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1553906696" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.706120334" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
<builder buildPath="${workspace_loc:/BLE_Peripheral_Lite}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1863785615" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
<outputEntries>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug" />
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
</outputEntries>
</builder>
-
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1011189033" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.196730665" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated" />
- <option id="gnu.c.compiler.option.debugging.level.1408956266" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated" />
- <option id="gnu.c.compiler.option.include.paths.683454588" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /></option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.734221275" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED" /></option>
- <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.783276604" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1217970000" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.278225223" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s" />
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.196730665" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.1408956266" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.683454588" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.734221275" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.783276604" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1217970000" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.278225223" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1068133630" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
- <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.917815242" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated" />
- <option id="gnu.cpp.compiler.option.debugging.level.1985222155" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated" />
- <option id="gnu.cpp.compiler.option.include.paths.1204814080" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /></option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.971725059" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED" /></option>
- <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.2111821685" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1523933082" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.684294845" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s" />
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.917815242" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1985222155" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1204814080" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.971725059" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.2111821685" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1523933082" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.684294845" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1825502629" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1155854604" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
- <option id="gnu.c.link.option.libs.1879637857" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs" />
- <option id="gnu.c.link.option.paths.2106880013" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths" />
- <option id="gnu.c.link.option.ldflags.877926585" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
- <option id="gnu.c.link.option.other.910726286" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1155854604" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1879637857" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
+ <option id="gnu.c.link.option.paths.2106880013" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
+ <option id="gnu.c.link.option.ldflags.877926585" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.910726286" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1290699950" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
- <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.749405790" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.444642330" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
- <option id="gnu.cpp.link.option.libs.239516015" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs" />
- <option id="gnu.cpp.link.option.paths.716696917" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths" />
- <option id="gnu.cpp.link.option.flags.1182351593" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
- <option id="gnu.cpp.link.option.other.1483636783" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.444642330" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.239516015" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
+ <option id="gnu.cpp.link.option.paths.716696917" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
+ <option id="gnu.cpp.link.option.flags.1182351593" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.1483636783" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.20270577" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
- <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
- <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1663297044" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver" />
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1663297044" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1929559413" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
- <option id="gnu.both.asm.option.include.paths.1991325161" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-
-
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1889063679" superClass="cdt.managedbuild.tool.gnu.assembler.input" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.437396714" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input" />
+ <option id="gnu.both.asm.option.include.paths.1991325161" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1889063679" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.437396714" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
</tool>
</toolChain>
</folderInfo>
<sourceEntries>
- <entry excluding="" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="" />
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings" />
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
<cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.release.880393766">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.880393766" moduleId="org.eclipse.cdt.core.settings" name="Release">
- <externalSettings />
+ <externalSettings/>
<extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser" />
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser" />
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.880393766" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.880393766." name="/" resourcePath="">
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.8951889" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
- <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.530645054" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1643694367" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.board.1330091111" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.530645054" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1643694367" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1330091111" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
<option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
- <listOptionValue builtIn="false" value="ARM Cortex-M4" />
- <listOptionValue builtIn="false" value="CM4" />
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
</option>
- <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1091780791" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1545741691" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated" />
- <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1553906696" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated" />
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.706120334" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1091780791" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1545741691" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1553906696" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.706120334" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
<builder buildPath="${workspace_loc:/BLE_Peripheral_Lite}/Release" id="fr.ac6.managedbuild.builder.gnu.cross.1863785615" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
<outputEntries>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release" />
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release"/>
</outputEntries>
</builder>
-
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1011189033" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.196730665" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated" />
- <option id="gnu.c.compiler.option.debugging.level.1408956266" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated" />
- <option id="gnu.c.compiler.option.include.paths.683454588" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /></option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.734221275" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED" /></option>
- <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.783276604" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1217970000" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.278225223" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s" />
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.196730665" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.1408956266" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.683454588" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.734221275" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.783276604" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1217970000" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.278225223" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1068133630" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
- <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.917815242" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated" />
- <option id="gnu.cpp.compiler.option.debugging.level.1985222155" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.debugging.level.max" valueType="enumerated" />
- <option id="gnu.cpp.compiler.option.include.paths.1204814080" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /></option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.symbols.294530574" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED" /></option>
- <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.2111821685" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1523933082" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.684294845" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s" />
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.917815242" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1985222155" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1204814080" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.symbols.294530574" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="HAL_RTC_MODULE_ENABLED"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.2111821685" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1523933082" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.684294845" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1825502629" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1155854604" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
- <option id="gnu.c.link.option.libs.1879637857" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs" />
- <option id="gnu.c.link.option.paths.2106880013" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths" />
- <option id="gnu.c.link.option.ldflags.877926585" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
- <option id="gnu.c.link.option.other.910726286" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1155854604" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1879637857" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
+ <option id="gnu.c.link.option.paths.2106880013" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
+ <option id="gnu.c.link.option.ldflags.877926585" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.910726286" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1290699950" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
- <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.749405790" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.444642330" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
- <option id="gnu.cpp.link.option.libs.239516015" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs" />
- <option id="gnu.cpp.link.option.paths.716696917" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths" />
- <option id="gnu.cpp.link.option.ldflags.435502386" superClass="gnu.cpp.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
- <option id="gnu.cpp.link.option.other.1483636783" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.444642330" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.239516015" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
+ <option id="gnu.cpp.link.option.paths.716696917" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
+ <option id="gnu.cpp.link.option.ldflags.435502386" superClass="gnu.cpp.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.1483636783" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.20270577" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
- <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
- </tool>
- <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1663297044" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver" />
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1663297044" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.exe.release.125691047" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.exe.release">
- <option id="gnu.both.asm.option.include.paths.1991325161" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1889063679" superClass="cdt.managedbuild.tool.gnu.assembler.input" />
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.437396714" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input" />
+ <option id="gnu.both.asm.option.include.paths.1991325161" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1889063679" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.437396714" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
</tool>
</toolChain>
</folderInfo>
<sourceEntries>
- <entry excluding="" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="" />
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries>
</configuration>
</storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings" />
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="BLE_Peripheral_Lite.fr.ac6.managedbuild.target.gnu.cross.exe.2007208314" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe" />
+ <project id="BLE_Peripheral_Lite.fr.ac6.managedbuild.target.gnu.cross.exe.2007208314" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="" />
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1539450082;fr.ac6.managedbuild.config.gnu.cross.exe.debug.1539450082.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1011189033;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1217970000">
- <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId="" />
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders" />
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration artifactName="${ProjName}" configurationName="Debug">
- <resource resourceType="PROJECT" workspacePath="BLE_Peripheral_Lite" />
+ <resource resourceType="PROJECT" workspacePath="BLE_Peripheral_Lite"/>
</configuration>
</storageModule>
</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Binary/BLE_RfWithFlash_reference.hex b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Binary/BLE_RfWithFlash_reference.hex
new file mode 100644
index 000000000..8971e1cfd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Binary/BLE_RfWithFlash_reference.hex
@@ -0,0 +1,2258 @@
+:020000040800F2
+:1000000010C80220E98A000895880008978800082F
+:10001000998800089B8800089D880008000000005F
+:100020000000000000000000000000009F880008A1
+:10003000A188000800000000A3880008A588000827
+:100040000B8B00080F8B0008138B0008E388000857
+:10005000178B00081B8B0008D7880008DD88000874
+:100060001F8B0008238B0008D1880008278B00080D
+:100070002B8B00082F8B0008A9880008338B000801
+:10008000378B00083B8B00083F8B0008438B000830
+:10009000478B00084B8B00084F8B0008538B0008E0
+:1000A000578B00085B8B00085F8B0008638B000890
+:1000B000678B00086B8B00086F8B0008738B000840
+:1000C000778B00087B8B00087F8B0008838B0008F0
+:1000D000AF880008B5880008878B00088B8B000864
+:1000E0008F8B0008938B0008978B00089B8B000870
+:1000F000EB880008E7880008EF8800089F8B00085D
+:10010000A38B0008A78B0008AB8B0008AF8B0008FF
+:10011000B38B0008B78B0008BB8B0008BF8B0008AF
+:10012000C38B0008C78B0008BB880008CB8B000876
+:10013000CF8B0008D38B0008D78B00082DE9F84F30
+:100140000FF2D017A2B0D7E90045CDE900452C9EAB
+:10015000DFF82C7C04918DF8436000210FF2BC1471
+:100160000D9112944FF0FF368246904699460FE06B
+:10017000C3462C461BF8011B0498D0470028049066
+:1001800000F0B2800D98401C641E0D90F2D1A8447E
+:1001900098F80000252807D10021079108910991BE
+:1001A0000A910B910C910DE06A463146404600F0F1
+:1001B000FDFF050001D10D98B4E0D9D50125E6E792
+:1001C00041F0010118F8010F2028F9D023280CD0A4
+:1001D0002B2804D02D2805D0302809D086E041F006
+:1001E0000201EFE741F00401ECE741F00801E9E723
+:1001F00041F01001E6E700200F900AE00F98B842A6
+:1002000005DA00EB800302EB4302303A0F9208F16B
+:10021000010898F80020A2F130000A28EED398F8DF
+:1002200000002E2818BF0E9629D118F8010F2A2891
+:100230000BD1D9F80000C9F8000008F1010850F806
+:10024000042BC9F800000E9219E02D280CBF18F8F5
+:10025000010B002000220E920BE040B90E9ABA4228
+:1002600005DA02EB820403EB4403303B0E9308F102
+:10027000010898F80030A3F130020A2AEDD3ADF856
+:100280004010129898F8001000F09CFF08B118F880
+:10029000010B8DF842009DF84200682804BF98F8D1
+:1002A0000010682903D162208DF8420008E06C2814
+:1002B00004BF98F800006C2804D171218DF8421019
+:1002C00008F1010813A806904A4618F8013B02A954
+:1002D000504600F067F838B913AA02A9504600F05A
+:1002E000C9F900287FF554AF30461BE02A2882D197
+:1002F000D9F80020C9F8002052F8040BC9F80020F2
+:1003000000280F9003D540420F9041F0040108F1FE
+:10031000010884E70000000000000000686A6C74B7
+:100320007A4C000023B0BDE8F08F622820D0682806
+:1003300011D06A2803D06C2827D0712825D10868ED
+:10034000C01D20F007000860D0E9002308300860D5
+:10035000194610467047002A0A680A60106803D0E0
+:10036000121D0A6000B217E0121D0A6080B217E089
+:10037000002A0A680A60106803D0121D0A6040B2A1
+:100380000AE0121D0A60C0B20AE0002A0A680A6088
+:10039000106803D0121D0A60C1177047121D0A6051
+:1003A000002170477CB50D4611461C462E69B4F1FC
+:1003B000250200F04D811C3A00F08680121F022AAF
+:1003C00040F282800E3A00F00781521F5AD0093A5B
+:1003D0007AD0921E16D0521E35D0521E022A73D9E0
+:1003E000121F30D0521F00F09A80521E4AD0521E67
+:1003F00000F0E480D21E00F0FD80921E42D0D21E9A
+:1004000040D02BE195F83A206C2A09D06869421C4B
+:100410006A610A680A6052F8043B0A60335427E1B3
+:100420000A680A6052F8043B0A60002100930191B7
+:100430004FF0FF322A6329466A4600F096F90028F9
+:1004400040F1168101E195F83A000122FFF76DFFB6
+:10045000C5E900010023994204DA6869411C696119
+:100460002D210DE0288F810704D56869411C696141
+:100470002B2105E0C00722D56869411C6961202154
+:1004800031541CE095F83A000022FFF74EFFC5E911
+:10049000000195F83800010711D5D5E900230020A7
+:1004A000834208BF82420AD044F02000782806D157
+:1004B000686930213154401C411C69613454214623
+:1004C00068693044E86083E00868C01D20F00700D8
+:1004D0000860D0E9002308300860C5E90023D5E9A9
+:1004E0000001C80F04D06869411C69612D210DE02D
+:1004F000288F810704D56869411C69612B2105E0BB
+:10050000C00704D56869411C6961202131546869BC
+:100510003044E8602146284600F032FAA8E005F1B0
+:100520003A02507820B14FF0FF340FF6243070E0DB
+:100530001078622808D0682824D06A2812D06C2845
+:100540002ED071280ED02BE00A680A6052F8040BF6
+:100550000A6020B94FF0FF340FF60C3059E0E96A19
+:10056000017085E00A680A6052F8040B0A6020B93D
+:100570004FF0FF340FF6F0204BE0EA6AD317C0E9E2
+:10058000002375E00A680A6052F8040B0A6020B97B
+:100590004FF0FF340FF6D0203BE0E96A018067E0BE
+:1005A0000A680A6052F8040B0A6020B94FF0FF3461
+:1005B0000FF6B4202DE0E96A016059E00A680A608C
+:1005C00052F8040B0A600021C5E90001EE607821B1
+:1005D000284600F029F94BE06C2285F83A200B6898
+:1005E0000B6053F8042B0B6052BB4FF0FF340FF637
+:1005F000AC200EE095F83A206C2AF0D0086808602C
+:1006000050F8044B0860EC603CB94FF0FF340FF633
+:10061000702000F0F1FD201A76BD2E6B002E04D55F
+:10062000204600F00BFE044608E03246002120463A
+:1006300000F020FE002814BF041B3446AC6117E014
+:10064000294600F092F8002812D54FF0FF3076BD11
+:100650006869411C69612521315409E06969481CB8
+:10066000686125227254210002D0411C6961345412
+:10067000002076BD2DE9F0410E460546716B70698C
+:10068000B46A091A306A091AB069091A706A091A33
+:10069000F069091A96F838000C1B410790460DD4F2
+:1006A000002C0BDD2746B0682021A8470028B06049
+:1006B00057D0F06A401C7F1EF062F4D17369424645
+:1006C0003146284600F0ACFC00284AD1376A002F9A
+:1006D0000ADDB0683021A8470028B06041D0F06A38
+:1006E000401C7F1EF062F4D1B369F268314628469F
+:1006F00000F096FCA8BB776A002F09DDB0683021B6
+:10070000A847B06068B3F06A401C7F1EF062F5D164
+:10071000F068B169F36942183146284600F080FC60
+:10072000F8B9B76A002F09DDB0683021A847B0607A
+:10073000B8B1F06A401C7F1EF062F5D196F838001F
+:1007400041070BD5002C09DDB0682021A847B06017
+:1007500038B1F06A401C641EF062F5D10020BDE89B
+:10076000F0814FF0FF30BDE8F0812DE9F8470D46EC
+:10077000A3B02F6B002F8146904648BF6FF0004713
+:1007800000F0A4FD696B40180FF62C118128D1E907
+:100790000023CDE9012328BF4FF0FF303ED20024D3
+:1007A000002F2FDDD8F8001001AA684600F000FDE8
+:1007B0000646002E35D4D8F8000008B9761E30D48D
+:1007C000B7421FDB6869301881280AD300206863AC
+:1007D00003AA29464846FFF74DFF040012D4002023
+:1007E000686103A8D5F814A032466946504400F069
+:1007F00073FDB244C5F814A058F8040B002818BFC4
+:10080000BF1BCDD12CB903AA29464846FFF732FFBA
+:10081000044614B9002068616863204624B0BDE82E
+:10082000F0874FF0FF34F8E72DE9FC4707468A468A
+:100830003E69BAF16F0F08BF082405D04AF02001C5
+:10084000782914BF0A2410243C25D7E90023BAF1E3
+:10085000640F18BFBAF1690F9046994606D100217E
+:100860008B4203DAD8F1000869EB49090020814581
+:1008700008BF80451FD1386BE8B9082C4CD197F8D8
+:100880003800010748D530203B2586F83B0043E07F
+:1008900000280ED597F8380000F01400102808D171
+:1008A0007A6B7869121A386A121A511A0029C8BF6D
+:1008B0003962BDE8F3878DF800A0404649462246DC
+:1008C000E31700F05DFD3032D0B26D1E3A2801957D
+:1008D00004DB9DF80000A0F151018A1872554046D2
+:1008E00049462246E31700F04BFD8046894600202A
+:1008F000814508BF804503D0F86871198842DCD370
+:10090000082C09D197F83800010705D5715D302909
+:1009100002D06D1E30207055C5F13C01B9617019CF
+:10092000F860386B8142B3DA411A39624FF6EF70E2
+:10093000398F01403987BDE8F3872DE9D04306465A
+:100940000F4614464FF00008DFF8389412E0E00735
+:1009500007D542464B463046394600F029FE06464A
+:100960000F464046494642464B4600F021FE641081
+:1009700080468946002CEAD130463946BDE8D0830E
+:100980002DE9F34F054641F020048DB0D5E90089EB
+:10099000612C02AE09D0286B002848BF062003D482
+:1009A00008BF672C01D101202863D5E90023580036
+:1009B0004015401C0ED119030CD00320A8619DF8EE
+:1009C000380061381A2802D20FF2F46111E00FF2F8
+:1009D000F4610EE058004015401C0FD119030DD1F1
+:1009E0000320A8619DF8380061381A2814D30FF24B
+:1009F000DC61E868032200F06FFCD3E1194621F0C6
+:100A00000043B3F5801F10460DD20027BB4208BF3C
+:100A1000BA42019703D111E00FF2AC61E9E701AAF4
+:100A200000F098FE0AE0DFF8607307EB1352DFF87E
+:100A30005C3301921940DFF858331943C5E90001CE
+:100A4000612C0ED1E86830210170811CE9609DF8AD
+:100A5000381061290CBF7821582141706869801CC9
+:100A60006861D5E900AB2BF0004300202AF00002BA
+:100A7000834204BF8242002300F05A81612C40F07F
+:100A8000A980286B00284CBF2120401C00904046C4
+:100A9000009F7F1C49460022002300F093FED946A8
+:100AA00001988DF8082038BF89F00049001F019097
+:100AB000002FD0460DF1090040F3498140F2FF714B
+:100AC000DFF8D0B20C91064640464946002200238A
+:100AD00000F090FE80F03A814800400D00F11C02C9
+:100AE00010D0002A0EDD0C98824205DB09F0004090
+:100AF00040EA0B01002013E0A448084040EA0251FC
+:100B000040460DE029F00043002028F00002834217
+:100B100008BF82420FBF40461C22404600F082FEC2
+:100B20008046894600F01CFFFF1F002F044609DDA8
+:100B300000F034FF02460B464046494600F040FFB5
+:100B400080468946F01D072104E004F00F0200F8FA
+:100B5000012D2411002C01DD491EF6D5491E5CBF74
+:100B6000002200F8012DF9D5ECE00020194602AA78
+:100B70000A4400E05B1E12F80149491E8442F9D084
+:100B80000F2804D10DF10900425C521C4254002987
+:100B900004D50198001D02AE5B1C0190591E12D4B1
+:100BA0009DF838007218147804F130085FFA88F460
+:100BB000392CC4BFA0F13A04A044491E02F80189AF
+:100BC000F1D58DF83800286B002840F1B080591E0F
+:100BD0002963ACE0404649460022002300F0F2FDC4
+:100BE000019938BF89F0004947F2975041436A4A5A
+:100BF00091FBF2F20192D2F1070204DD4046494630
+:100C0000FFF79BFE0AE0524200206449FFF795FE81
+:100C100002460B464046494600F044FF8046662C9B
+:100C2000286BDFF87CB106BF019F0A3706273F1803
+:100C3000142FC8BF142730208DF8080089460DF105
+:100C4000090000E03046002F34DD064640464946A4
+:100C500001F04CF801460A4606F1080304200A2672
+:100C6000B2FBF6F606EB860EA2EB4E02303203F82C
+:100C7000012C0A22B6FBF2F202EB820EA6EB4E0624
+:100C80003036401E03F8026DE9D1083F002F03F112
+:100C90000806D7DD084601F03DF802460B464046FF
+:100CA000494600F08DFE00225B4600F081FC804644
+:100CB0008946CBE70DF10901401A0DF1090604E060
+:100CC0000199491E401E0191761C31783029F7D0D8
+:100CD000662C02D10199491C03E0652C0CBF01214F
+:100CE00000212B6BCB189842B8BF431E002B1ED49B
+:100CF000834204DAF05C3528A8BF392000DA3020BE
+:100D00001946721E02EB010800E05B1E18F80199FB
+:100D1000491E8145F9D0392802D1705C401C7054BD
+:100D2000002904D50198401C16465B1C01900198CF
+:100D300000B200901BB29DF838103246284600F0F1
+:100D400034F82FE0C61D002F3FF7BEAE30460DF140
+:100D50000901401A009903468842C8BF0B46002B80
+:100D60000DF109063FF52FAF8342BFF6FEAE0DF140
+:100D70000900C05C07287FF7F8AE0F20F6E60000F8
+:100D8000CBCCCC0C0000244002FCFFFFFFFF0F8007
+:100D90000000E03F0000F07FA08601000000F03F6F
+:100DA00084D797410FB0BDE8F08F2DE9F84783B0A5
+:100DB00006468A461746984600F0FCF9B8F1000F3F
+:100DC000406A356B90F8009003DC4FF001080FF299
+:100DD0000037BDF930404AF02000662808BF641C87
+:100DE00015D0672840F0848014F1040FC0F286808B
+:100DF000AC4280F2838096F83800641C010702D46C
+:100E0000A845B8BF454620B22D1A48BF00250FFAA5
+:100E100084FAF068B169BAF1000F25DC4A1C30236E
+:100E20004354002D03DC96F83800010703D5F06821
+:100E300000F80290521C15EB0A0FB8BF6C4220B2AA
+:100E4000441941424445B8BFA046B26171620FFAED
+:100E500088F5F561F068B3692A463946184400F010
+:100E60003BFA641BB462C4E022B29045084417DA2E
+:100E70004246394600F030FAB0694044B061AAEB0E
+:100E80000801002D716203DC96F838100A0705D5B9
+:100E9000F16801F80090F069401CF061B562A8E0CB
+:100EA000394600F019FAB069002D5044A8EB040847
+:100EB00003DC96F838100A0703D5F16801F80090B2
+:100EC000401CB0610FFA88F08542F068B369B8BF82
+:100ED000A8460FFA88F207EB0A01184400F0FCF963
+:100EE000B0690FFA88F10844B061681A706280E056
+:100EF000BAF1610F14D14FF0700A16E0A84504DA78
+:100F000096F838100A0758BF45466D1E48BF0025A1
+:100F1000BAF1670F14BF4FF0450A4FF0650A04E0BD
+:100F2000BAF1410F08BF4FF0500AB169F368481C8D
+:100F3000B061002D17F8012B5A5403DC96F83810D5
+:100F40000A071BD5F168431CB36101F80090002D1E
+:100F500014DDA8F101080FFA88F08542F068B8BFE7
+:100F6000A8460FFA88F23946184400F0B5F9B0697E
+:100F70000FFA88F108446D1AB0617562F068B169C2
+:100F80000844002C80F800A003D42B214170811C60
+:100F900003E02D2141706442811C00206A460AE072
+:100FA00023460A2493FBF4F404EB8405A3EB4503E6
+:100FB00002F8013B401C24B2002CF1DC012806DCC5
+:100FC0004AF02002652A04BF302201F8012B48B9FB
+:100FD000302001F8010B07E0401E1DF800203032E0
+:100FE00001F8012B0028F7DCF068B2691044091AF7
+:100FF000F16196F8380000F0140010280DD17169E5
+:10100000B0694118706A4118F0694118B06A411816
+:10101000706B8142BCBF411A316204B0BDE8F087F9
+:10102000F8B505460E4617461C46002074B117F861
+:10103000011BB068A847B06030B1F06A401CF06294
+:101040000020641EF3D1F2BD4FF0FF30F2BD00006E
+:101050007072696E74665F733A20256E20646973DE
+:10106000616C6C6F776564007072696E74663A20AB
+:1010700062616420256E20617267756D656E740013
+:101080007072696E74665F733A20626164202573C2
+:1010900020617267756D656E740000007072696E14
+:1010A00074665F733A2062616420256C73206172FC
+:1010B00067756D656E7400000000000000000000A0
+:1010C0006E616E004E414E00696E6600494E4600EC
+:1010D0003000F0B40246106895681318506803EBAE
+:1010E0005004C00721D54D441FE0F0BC02F10C00B4
+:1010F000704713F8017B05F8017B491EF9D1A0B1B7
+:10110000B60813F8011B06F00306032E08BF13F8F8
+:10111000016B01EB06214942801C294405D011F8DE
+:10112000016B05F8016B401EF9D1A342DDD013F825
+:10113000016B16F0030104BF13F8011BC91C300931
+:101140000F28DAD113F8010B0F30D6E71B48704790
+:1011500030B45368D418042B09DA41B1057804F887
+:10116000015B10F8015B15B15B1C491EF3E753608E
+:1011700030BC704738B514461D4661B1FFF7E8FF33
+:1011800061686A6B204690476FF00102811A02D0B5
+:10119000491E03D005E06FF0010032BD4FF0FF3073
+:1011A00032BD0021616032BDDA6B1047034BE1E7CD
+:1011B000024BF9E70248704700000000E4100020ED
+:1011C000AC1000200278C9B28A421AB11CBF10F8D4
+:1011D000012FF9E718BF00207047B1F5807F02D3D7
+:1011E0004FF0FF3070470170012070470078401EBB
+:1011F0008041C043C00F704780B508B90FF21C0092
+:1012000005490B681BB122220021984701E000F03C
+:101210008EFD222002BD000004B80220636F6E73B1
+:10122000747261696E742068616E646C65723A20D4
+:10123000626164206D6573736167650000F101038D
+:10124000810704D010F8011B89B18107FAD1026827
+:10125000B2F10131914311F0803F04BF50F8042FE7
+:10126000F6E710F8011B11B110F8011BFBE7C01ADB
+:1012700070470000C9B2830706D0521E22D310F86F
+:10128000013B9942F7D11FE0083A13D302F104025F
+:1012900041EA012141EA014150F8043B121F21BFFC
+:1012A0004B40A3F1013C2CEA030C1CF0803FF3D02F
+:1012B000C9B2001F083210F8013B521E28BF91EA44
+:1012C000030FF8D818BF0120401E704780B5FFF704
+:1012D0003DFF006C02BD000062B38B0708D0521EB8
+:1012E00011F8013B00F8013B00F024808B07F6D198
+:1012F000830740F0208000BF103A07D330B4B1E834
+:101300003810103AA0E83810F9D230BC530724BF87
+:10131000B1E80810A0E8081044BF51F8043B40F8B9
+:10132000043BD20724BF31F8022B20F8022B44BF24
+:101330000B7803707047121F17D35B0009D151F867
+:10134000043B20F8023B1B0C121F20F8023BF6D294
+:101350000BE051F8043B00F8013B1B0A20F8023B6C
+:101360001B0C121F00F8013BF3D238BF121D521E96
+:1013700024BF11F8013B00F8013BF8D8704700008A
+:10138000B3BBD9B1B2F5803F7DD2022A1ED98C46BB
+:10139000B1FBF2F102FB11C31B0443EA1043B3FBA0
+:1013A000F2FC02FB1C3380B240EA0343B3FBF2F0D1
+:1013B00002FB103240EA0C4000237047022A05D994
+:1013C0008446B0FBF2F002FB10C270474AB105D16F
+:1013D00000F0010249085FEA300070470022002354
+:1013E000704700F0A7BC0B000200002100207047EE
+:1013F000904271EB030CF6D3B3F5803F2FD2F0B5DA
+:10140000B3FA83F7B1FA81F4A7F10F0E3D1B5340F5
+:10141000CEF1200602FA0EF2F3415340B5F10F0768
+:1014200046D80F3C2C444140C4F12006A040F14175
+:101430004140B1FBF3F603FB1611A2FB0645001B6E
+:10144000A94102D2761E8018594180EA010221FA90
+:101450000EF362FA0EF200215A403046F0BD30B46D
+:10146000B1FBF3FC03FB1C11A2FB0C45001BA941C3
+:1014700003D2ACF1010C8018594130BC02460B4636
+:10148000604600217047B2F1807F65D3F0B5B2FAB3
+:1014900082F7B1FA81F4C7F10F063D1B22FA06F379
+:1014A00007F1110EF24120355A40B5F10F07B8D9B6
+:1014B0004140C4F12006A040F1414140B1FBF3FCA2
+:1014C00003FB1C11A2FB0C45001BA94103D2BCF17C
+:1014D000010C801859410F2F12D30F3FC90341EA65
+:1014E0005041B1FBF3F603FB1611A2FB0645D4EB0A
+:1014F000C030A94102D2761E8018594146EACC3C40
+:1015000007B34140C7F12006B840F1414140B1FB6B
+:10151000F3F603FB1611A2FB0645001BA94102D2FC
+:10152000761E8018594180EA010221FA0EF3C7F1B4
+:10153000200462FA0EF20CFA07F05A402CFA04F179
+:101540003043F0BD80EA010221FA0EF3002162FA75
+:101550000EF260465A40F0BD8C46B1FBF2F102FB40
+:1015600011C31B0243EA1063B3FBF2FC02FB1C3302
+:101570001B024CEA002043EA1063B3FBF2FC02FBBF
+:101580001C331B024CEA002043EA1063B3FBF2FC5D
+:1015900002FB1C331B024CEA002043EA1063B3FB3E
+:1015A000F2FC02FB1C324CEA0020002370470000D2
+:1015B000B0B581EA030C0CF0004C40F2FF7515EA5F
+:1015C00011541DBF15EA1357AC42AF4239E0E4197C
+:1015D00023EA455343F48013C90241F0004141EA34
+:1015E000505EC7021100A7FB020200284FF0000066
+:1015F000EEFB01204FF00001E3FB072118BF42F092
+:101600000102401800214941E3FB0E01A4F580646A
+:101610000F0302D252004041494154F101046CDDF4
+:10162000470872F1004250F1000051EB0451A1F55E
+:1016300080115CBF41EA0C01B0BD4CEA05510020AD
+:10164000B0BD05EA1357AC4214BFAF4241E050EAC7
+:10165000410E1CBF52EA430E02E061460020B0BDBD
+:1016600024423C441BD15FEA070EF6D0090302BFB7
+:1016700001460020AEF1140EB1FA81F7AEEB07047B
+:1016800001FA07FE0C37C7F1200100FA07F7C8403E
+:101690004EEA000E23EA455343F48013A2E733F0E9
+:1016A0000043B3FA83F704BFB2FA82FE77440B3FDC
+:1016B000E41BB7F1200E2FBF02FA0EF3BB40C7F1B7
+:1016C000200E22FA0EFE38BF43EA0E03BA40641C15
+:1016D00082E750EA410E14BF52EA430E6FF0000158
+:1016E0004FF4001717EB430F8ABF194617EB410F52
+:1016F000B5E74CEA05510020B0BDD4F10104B4F1C6
+:1017000020070FDAC4F12007520828BF42F0010277
+:1017100010FA07F501FA07F7E1BF2A43E040384322
+:10172000E1400FE0352C98DCC7F1200452EA40027A
+:1017300020FA07F218BF42F0010231FA07F0A14087
+:101740000A43002172F1004250F1000051EB0C01FC
+:10175000B0BD000010B5144600F002F8226010BDC4
+:10176000C1F30A5343B14A0012F5001F28D2A3F275
+:10177000FE32A1EB0251704750EA410C20D001F03B
+:10178000004C31EA0C01B1FA81F204BFB0FA80F3E7
+:10179000D2180B3AB2F120032CBF00FA03F19140AA
+:1017A00041EA0C013EBFC2F1200C20FA0CF31943B0
+:1017B0009040524240F2FD33D21A01EB0351704780
+:1017C000002270474FF4001C1CEB410F94BF1CEB30
+:1017D000430F09E041EA030C50EA4C0C52EA0C0CAE
+:1017E00003D2994208BF9042704714BF8B42824295
+:1017F000704700004FF4001C1CEB410F94BF1CEB22
+:10180000430F09E041EA030C50EA4C0C52EA0C0C7D
+:1018100003D28B4208BF8242704714BF9942904264
+:1018200070470000124254D440F2FF7C1CEA11536E
+:101830000FD0634531D09B1863453CBF01EB02518B
+:10184000704701F0004141EA0C510020AFF30080E5
+:10185000704750EA410320D001F0004C91EA0C019E
+:101860001CD0B1FA81F30B3B9A420DD9D21A9940A0
+:1018700051EA0C01C3F1200C20FA0CFC61449840A1
+:10188000531C40F2FF7CD7E7914041EA0C01C2F1C2
+:10189000200C20FA0CF3194390407047B0FA80F303
+:1018A0001533202BE0D3202AEED3203A203B9A4256
+:1018B00009D9D21A00FA03F141EA0C010020531CA5
+:1018C00040F2FF7CB8E700FA02F141EA0C01002087
+:1018D0007047524240F2FF7C1CEA11530DD0634521
+:1018E000DBD0B2EB030C3CBFA1EB025170470CF113
+:1018F000010221EA035141F4801150EA410CCCD09D
+:1019000001F0004C352A27DC30B481EA0C01B2F139
+:10191000200309DAC2F12003044601FA03F5D0409E
+:101920002843D1409C400CE0C3F12002450020FA3E
+:1019300003F418BF44F0010421FA03F091400C4372
+:10194000002174F1004550F1000051EB0C012442DC
+:1019500030BC7FF47BAF70476146002076E7000023
+:10196000C1F30A5340F2FE329B1A14DDD3F1200377
+:101970004FEAE17208DDC90241EA505141F00040EE
+:10198000D84080185040704703F2E13010B1D24384
+:1019900082F000407047002070470000C11768B116
+:1019A0004840401AB0FA80F29040D21CC907C2F5F4
+:1019B000846241EA025202EBD021400570470000E8
+:1019C00070B44FF0004591EA030F40F1B5816B40D0
+:1019D000841A71EB030603D2001BB1411219734143
+:1019E0004FF4001C1CEB410F34BF7CEB430442E07E
+:1019F0000C0DA4EB1356352E4FDC45EAC323DB0A4E
+:101A000045EAC121C912B6F120050DDD63FA05F6DC
+:101A1000EB4086EA0305124218BF45F00105C018E5
+:101A200051F100010CD213E062FA06F5F240554084
+:101A3000F3415A40B340F3405A408018594107D30C
+:101A400049085FEA30005FEA350528BF45F0010527
+:101A500001F58011420875F1004250F1000041EBA0
+:101A600004514E0016F5001F70BC38BF70470020AF
+:101A7000090D090570471CEB410F10D252EA4306CD
+:101A80000BD0BCEB410F05D80C0DAB43661E342EBA
+:101A9000B6DD02E0AB438018594170BC704770BCA2
+:101AA00070470000F0B540F2FF7581EA030C0CF0BE
+:101AB000004C15EA11541DBF15EA1357AC42AF4252
+:101AC000E5E0BC41C1F31301C3F31303801A99414C
+:101AD00043F4801304D2641E4000494180185941E8
+:101AE000C90241EA5051B1FBF3F603FB1611A2FB08
+:101AF0000675D7EBC020A94102D2761E8018594145
+:101B0000C90241EA5051B1FBF3FE03FB1E11A2FBD7
+:101B10000E75D7EBC020A94103D2AEF1010E80189B
+:101B20005941890241EA9051760546EA8E2EB1FB71
+:101B3000F3F603FB1611A2FB0675D7EB8020A94133
+:101B400002D2761E80185941C90241EA50514EEA2C
+:101B5000060EB1FBF3F603FB1611A2FB0675D7EBDD
+:101B6000C020A94102D2761E80185941C90241EA1B
+:101B70005051B1FBF3F703FB1711A2FB0735D3EB71
+:101B8000C020A94167F100070CBF004247F00107E0
+:101B900066F3D5274FEA1E31B80814F5806412DDCC
+:101BA000BD0775F1004250EB0E5051EB045111F599
+:101BB000801F5CBF41EA0C01F0BD4CF07F6141F039
+:101BC000E0410020F0BDBD076D0840EA0E5041F431
+:101BD0008011D4F10104B4F120060ADAC4F1200620
+:101BE0000200E04001FA06F3E1401843B240154319
+:101BF0000EE0342C13DCC6F1200445EA40056D08E4
+:101C000020FA06F2154321FA06F0A1400D43002107
+:101C100075F1004250F1000051EB0C01F0BD0020C5
+:101C20005FEA0C01F0BDCFB992185B41B3FA83F7BC
+:101C300004BFB2FA82F6BF190B3FB7F120062FBFDF
+:101C400002FA06F3BB40C7F1200622FA06F638BFB7
+:101C50003343BA401CB1E419641E33E77F4231F0CC
+:101C60000041B1FA81F404BFB0FA80F6A4190B3C2C
+:101C7000B4F120062FBF00FA06F1A140C4F12006FE
+:101C800020FA06F638BF3143A0403C1B1AE7AC42AD
+:101C90001ABF05EA1357AF4212E050EA41061CBFD3
+:101CA00052EA4306BFE750EA4107304661461CBF8F
+:101CB00041EA0551F0BD52EA430C08BFC143F0BDF3
+:101CC00000204FF4001616EB410F98BF16EB430FA0
+:101CD00008BF16EB410F24BFC14305E016EB430FCD
+:101CE0000CBF61464CEA0551F0BD0000400D49189B
+:101CF00040EA81200CD2490DA1F58061491C40F0D9
+:101D0000004005DBD1F11F0154BFC840C017704728
+:101D100000207047014648B1B0FA80F18840C91CE4
+:101D2000C1F58461090501EBD02140057047012010
+:101D300000F0B6B870470000841A71EB030604D2B5
+:101D40006E40001BB141121973414FF4001C1CEB93
+:101D5000410F34BF7CEB430682E00C0DA4EB13561D
+:101D6000362E7BDC012E45EAC32341DC43EA525385
+:101D700012BFD20292025B08240545EAC12141EA62
+:101D80005051D2EBC020994125D407D1B0FA80F64A
+:101D900010FA06F162D00020203608E0B1FA81F690
+:101DA000B140C6F1200220FA02F21143B0404FEADE
+:101DB000F474B4EB465434F001064FEA74040AD8C4
+:101DC000D6F50016760D04F00044F04061FA06F2F4
+:101DD0005040F1404840C00A40EA415021F00041E3
+:101DE00028BF5FEA500550F1000044EBD12135E0F7
+:101DF000DB0A45EAC121C90AB6F120050EDD42EA37
+:101E00000242120CC5F1200603FA06F6EB4042EA44
+:101E100006056D42984161F100010DE062FA06F598
+:101E2000F240554063FA06FC82EA0C02F3405A4045
+:101E30006D42904161EB030111F4801F05D1641ED6
+:101E4000620502D06D004041494121F480114308F0
+:101E500075F1004350F1000041EB045170BC704734
+:101E60001CEB410F15D223F0004352EA43060BD07E
+:101E70004FEA4C0CBCEB410F04D80C0D661E342EFF
+:101E8000B7DDEBE7801A994150EA410608BF00210F
+:101E9000E4E708BF1CEB430F28BF6FF00001DDE74C
+:101EA00080B5AFF30080024A11001820ABBEFBE7FB
+:101EB0002600020070B58EB002A80FF20411DFF800
+:101EC0004847DFF848673022FFF716FA0FF2A17093
+:101ED0000190009469460FF28170DFF8344700F0FA
+:101EE00051FF0121022001F036F8DFF828270021F8
+:101EF000082001F0AAF802A801F020F900F016FA73
+:101F000001F044F9002084F8900004F126054FF612
+:101F1000FF70288000210FF23562012001F095F852
+:101F20000FF275620021042001F08FF82A20706101
+:101F30004FF4A840B0610020B070F0703071002103
+:101F40000FF27122202001F080F8012001F018F931
+:101F50000020DFF8C426002102EBC003C3E9000122
+:101F6000401CB0F5A84FF7D3DFF8B0164FF400408F
+:101F70000860062001F09CF900203070012070708C
+:101F800001F02BFA0FF20163002204F1910100200D
+:101F900001F020FD0FF2F953002204F1920100201C
+:101FA00001F018FD002068808021DFF874060180B0
+:101FB000A0214180012000F05FFA0EB070BD00004A
+:101FC0000000000000000000000000000000000011
+:101FD0000000000044000800400508013A799C0018
+:101FE000F4010000FFFFFFFF4801010000000000B6
+:101FF000F8B50746DFF818467878DFF81056052858
+:1020000004F1900604D03E2812D0FF2861D0CFE022
+:10201000B888E18C884206D10020E08430700FF24D
+:10202000746001F099FD012000F026FA012048E0DB
+:10203000F87801282BD0032802D00C2803D0B7E071
+:102040000FF27860AAE00FF2A06001F085FD387908
+:1020500000280CBF0FF2AC600FF2D06001F07CFDE5
+:10206000E08C6A460DF1010101F0B4FD60B90FF298
+:10207000E46001F071FD9DF800209DF801100FF261
+:10208000E86001F069FD93E00FF2F86086E0707897
+:1020900001F0C6FCB7F805100FF2047001F05CFD0A
+:1020A000307804280CBF0620052030700021B7F8D6
+:1020B0000500E0846881297205F1080001F087F9C4
+:1020C00000202872E08C688105F1080001F07FF99A
+:1020D0006EE0B7F80300001F63D04FF47F71401A21
+:1020E0001AD0401E4BD0401E19D0401E1ED0401E9C
+:1020F0001FD0401E20D0401E28D0401E4CD0401E75
+:1021000024D0401E28D0401E23D040F2F631401A81
+:1021100004BF012068704BE00FF2B8603EE00FF2A0
+:10212000E06001F019FD0FF2007037E00FF2187057
+:1021300034E00FF2407031E00FF2687001F00CFDF6
+:10214000E08C01F0C4FE0FF27C7027E00FF290707B
+:1021500024E00FF2B07021E0D7F807100FF2D07032
+:1021600001F0FAFCD7F807100FF2DC7001F0F4FC74
+:10217000E08C012101F0F9FE0FF2E0700EE0F97938
+:102180000FF6180001F0E8FCF879002814BF0FF6EC
+:1021900078000FF6600001E00FF6800001F0DCFC33
+:1021A00006E0012001F02FFFB0780A2101F087FC42
+:1021B0000120F2BD2DE9FC47DFF86804DFF84C642C
+:1021C0000468F178B0780FF6AC09DFF85C7404F0BD
+:1021D000FF04651E0029A4F12A0839D138B92A461E
+:1021E00041460FF6600001F0B7FC0121B170706943
+:1021F0000146201A01F080FF002870616FD1012094
+:10220000F0704FF0FF320020B0702A20706100267D
+:10221000A01907EB003E4FF4007CDEE9000191427B
+:1022200008BF90420CD1BCF1010C0EF1080EF4D1A4
+:10223000761C2A2EECD32A4641460FF6580041E080
+:102240007146484601F088FC022001F0DCFEFEE702
+:1022500038B92A4641460FF67C0001F07DFC01208A
+:10226000B0704FEA043AB269DFF8AC43D0004042A4
+:102270002044134600F5283152420AEBC20000F117
+:1022800000601A4601F068FFB06140BBF070B070AA
+:1022900057444FF4A840B0614FF0000C04EBCC0E53
+:1022A000D7E90023DEE900018B4208BF82420ED14C
+:1022B00008370CF1010CBCF5A84FEFD32A46414674
+:1022C0000FF6400002B0BDE8F04701F045BC3946CA
+:1022D000484601F041FC022001F095FEFEE7BDE812
+:1022E000FC471FE080B5C949087940B901220A714D
+:1022F0000FF6500001F030FCCC490A6809E00020DC
+:1023000008710FF6640001F027FCC9494FF48060A2
+:102310000860BDE8014001F07AB80021042000F017
+:10232000A1BE00BF0021202000F09CBE78B589B07E
+:102330000020ADF81A0001F023FCBE4DBE4E286807
+:1023400010F1010F0ED069683074090A020A000CFE
+:10235000B074727406F1100468683175F074090A7B
+:10236000717506E0002001F083FF040008BF0FF63E
+:10237000E41422460621002000F065FF60793072E7
+:1023800007AA207970720621E078B072A078F07206
+:102390006078307320789E4C70734EF66E500890C3
+:1023A000286807902E2000F04EFF0FF6B012102183
+:1023B000182000F048FF0FF6B4121021082000F09A
+:1023C00042FF1821012000F065FF01F063FF0DF1CD
+:1023D000160006A90190009105AB072200210120FB
+:1023E00001F002FD0FF2A470BDF818100090072351
+:1023F000BDF81400002202F00DF80DF11A00009053
+:102400000223BDF81610BDF81400002202F002F8F5
+:1024100002220221002001F010FC0320207001F0B4
+:1024200097FC012060700020E0700820607510208B
+:10243000A075002020758148A0610020A070C1B265
+:1024400021440871401CC1B21029F8DB002004901F
+:102450000023A069617803900122207D0290A07D75
+:102460000190607D0090A07801F08BFCA07808B10D
+:1024700001F012FD0AB070BD2DE9F8410446012CAF
+:1024800087B003D166480588478803E04FF4C865E4
+:102490004FF47A67DFF8788108F19006707801F0E0
+:1024A000BFFA31780FF2EC6001F056FB022C11D12B
+:1024B0003078012818BF02280CD101F0EEFB010092
+:1024C00004D10FF2EC6001F047FB03E00FF204705F
+:1024D00001F042FB347000200690059008F12901BC
+:1024E0000491082298F828000FF6900103900291B9
+:1024F0000192002300933A462946002001F0DFFBB9
+:102500004D490E2001F0A0FC010013D1012C0AD18D
+:102510000FF2E86001F020FB7078494908B0BDE88F
+:10252000F04101F0CCBA08B0BDE8F0410FF2F46020
+:1025300001F012BB08B0012CBDE8F0410CBF0FF256
+:1025400010700FF23C7001F007BB000010B50120C5
+:1025500001F063FD2E4C94F89000052812D001F094
+:102560009CFB002184F8901030B90FF2487001F004
+:10257000F3FA0FF2487001E00FF25C70BDE8104012
+:1025800001F0EABA10BD00000021012000F06ABD90
+:10259000012001F042BD00001CB51D4C94F89000D4
+:1025A000012818BF00282DD018484178012929D1C9
+:1025B000002201784270491C01EBD1725210A1EB4C
+:1025C00042010170F7EE040A017800EB81004FF43C
+:1025D000FA7190ED030AE08C0091C0EE200AFDEE46
+:1025E000E00A10EE902A92B20023114601F056FF45
+:1025F000BDE8164000280CBF0FF200700FF22C70DF
+:1026000001F0AABA13BD0000B00803201C0000208E
+:1026100058B20220C32D0008581200201040005864
+:102620000CB80220804000580060FD079814005844
+:10263000181400588075FF1F0400002007B2010025
+:1026400046E001000021082000F00CBD012000F050
+:102650002BBD012000F030BD10B50446616801F1CA
+:10266000080000F0A1FD00B10120207010BD0000A5
+:1026700010B1012803D070470F2000F003BD0F20D8
+:1026800000F008BD402812BF8028042000F00CBDD7
+:10269000704700000D0A0D2A2A20444953434F4E2B
+:1026A0004E454354494F4E204556454E54205749B8
+:1026B000544820434C49454E54200A000D0A0D2A27
+:1026C0002A20434F4E4E454354494F4E20555044C7
+:1026D000415445204556454E5420574954482043BF
+:1026E0004C49454E54200A004556545F55504441CC
+:1026F00054455F5048595F434F4D504C4554452019
+:102700000A0000004556545F5550444154455F50FF
+:1027100048595F434F4D504C4554452C20737461CC
+:10272000747573206F6B200A000000004556545FDB
+:102730005550444154455F5048595F434F4D504CAC
+:102740004554452C20737461747573206E6F6B2033
+:102750000A000000526561645F5048592073756338
+:1027600063657373200A00005048592050617261FC
+:102770006D202054583D2025642C2052583D2025A2
+:1027800064200A005265616420636F6E66206E6F7C
+:1027900074207375636365657373200A000000001D
+:1027A0004556545F4C455F434F4E4E5F434F4D502F
+:1027B0004C45544520666F7220636F6E6E6563747E
+:1027C000696F6E2068616E646C6520307825780AC8
+:1027D000000000000D0A0D2A2A204556545F424C85
+:1027E00055455F4741505F4C494D495445445F440E
+:1027F0004953434F56455241424C45200A00000080
+:102800000D0A0D2A2A204556545F424C55455F4714
+:1028100041505F504153535F4B45595F52455155AD
+:10282000455354200A0000000D0A0D2A2A20616336
+:10283000695F6761705F706173735F6B65795F7209
+:10284000657370200A0000000D0A0D2A2A204556E3
+:10285000545F424C55455F4741505F415554484F86
+:1028600052495A4154494F4E5F5245515545535470
+:10287000200A00000D0A0D2A2A204556545F424CBA
+:1028800055455F4741505F534C4156455F53454363
+:1028900055524954595F494E495449415445442081
+:1028A0000A0000000D0A0D2A2A204556545F424CAA
+:1028B00055455F4741505F424F4E445F4C4F535424
+:1028C000200A00000D0A0D2A2A2053656E6420613B
+:1028D0006C6C6F77207265626F6E64200A00000076
+:1028E0000D0A0D2A2A204556545F424C55455F4734
+:1028F00041505F4445564943455F464F554E44203D
+:102900000A0000000D0A0D2A2A204556545F424C49
+:1029100055455F4741505F4B455950524553535FB2
+:102920004E4F54494649434154494F4E200A0000F6
+:102930006E756D657269635F76616C7565203D20AB
+:10294000256C640A000000004865785F76616C754C
+:1029500065203D20256C780A000000000D0A0D2A34
+:102960002A206163695F6761705F6E756D6572696A
+:10297000635F636F6D70617269736F6E5F76616CB8
+:1029800075655F636F6E6669726D5F7965736E6F93
+:102990002D2D3E594553200A00000000424C455F52
+:1029A0004354524C5F4170705F4E6F746966696347
+:1029B0006174696F6E3A204556545F424C55455FCD
+:1029C0004741505F50414952494E475F434D504C3B
+:1029D000542C2070616972696E675F636F6D706CF3
+:1029E0006574652D3E537461747573203D202564B4
+:1029F0000A0000000D0A0D2A2A2050616972696ED2
+:102A000067204F4B200A00000D0A0D2A2A20506132
+:102A10006972696E67204B4F200A00000D0A0D2A6B
+:102A20002A204556545F424C55455F4741505F5000
+:102A3000524F4345445552455F434F4D504C4554CA
+:102A400045200A000D0A0D5354415254204552416D
+:102A500053494E4720414C4C20534543544F525309
+:102A60002046524F4D20256C6420544F20256C6425
+:102A70000A0000000D0A0D4552524F5220415420C9
+:102A8000414444524553532030782530386C582007
+:102A90000A0000000D0A0D414C4C20534543544F91
+:102AA00052532046524F4D20256C6420544F202510
+:102AB0006C642048415645204245454E20535543BD
+:102AC0004345535346554C4C592045524153454478
+:102AD0000A0000000D0A0D53544152542057524928
+:102AE00054494E4720414C4C20534543544F525378
+:102AF0002046524F4D20256C6420544F20256C6495
+:102B00000A0000000D0A0D414C4C20534543544F20
+:102B100052532046524F4D20256C6420544F20259F
+:102B20006C642048415645204245454E205355434C
+:102B30004345535346554C4C5920575249545445DC
+:102B40004E0A00000D0A0D435055312054494D499D
+:102B50004E472050524F54454354494F4E20454E06
+:102B600041424C45440A00000D0A0D4350553120A6
+:102B700054494D494E472050524F54454354494FB4
+:102B80004E2044495341424C45440A005032505370
+:102B900052563100466972737420696E64657820FC
+:102BA000696E202564207374617465200A0000003A
+:102BB0005375636365737366756C6C792053746FBA
+:102BC00070706564204164766572746973696E67BC
+:102BD000200A000053746F70204164766572746936
+:102BE00073696E67204661696C6564202C2072658C
+:102BF00073756C743A202564200A00005375636372
+:102C000065737366756C6C792053746172742046B9
+:102C1000617374204164766572746973696E6720AC
+:102C20000A0000005375636365737366756C6C7995
+:102C3000205374617274204C6F7720506F776572E7
+:102C4000204164766572746973696E67200A0000BA
+:102C500053746172742046617374204164766572A6
+:102C6000746973696E67204661696C6564202C2005
+:102C7000726573756C743A202564200A00000000A8
+:102C80005374617274204C6F7720506F7765722097
+:102C90004164766572746973696E67204661696C18
+:102CA0006564202C20726573756C743A202564204D
+:102CB0000A00000020200D0A0D0000002A2A2053DF
+:102CC000544F50204144564552544953494E472091
+:102CD0002A2A20200D0A0D002A2A2053544F502062
+:102CE0004144564552544953494E47202A2A2020F0
+:102CF0004661696C6564200D0A0D0000424C455F19
+:102D00005356435F4C324341505F436F6E6E5F5585
+:102D1000706461746528292C20537563636573732F
+:102D200066756C6C79200D0A0D000000424C455F01
+:102D30005356435F4C324341505F436F6E6E5F5555
+:102D4000706461746528292C204661696C65642073
+:102D50000D0A0D006C7AD8AC577200001234567808
+:102D60009ABCDEF0123456789ABCDEF0FEDCBA096A
+:102D700087654321FEDCBA0987654321095032503B
+:102D8000535256317FB50C466D4D61686D4EE8610A
+:102D90002962284601F0B6FB246805F1240001F001
+:102DA000BBFB746006F1080001F0B6FB0120307037
+:102DB000296829B10FF2551000900294684688479F
+:102DC0007FBD1FB55F4C04F1080001F0A8FB00BBFC
+:102DD0002178F1B1694604F1080001F0C9FB5848B7
+:102DE000C16949B10098029001228DF8042001A820
+:102DF00088479DF8040000E001202070207818B179
+:102E0000009801F06BFC04E0009904F1080001F067
+:102E10008FFB04F1080001F082FB28B9207818B17B
+:102E200004F10800FFF70EFC1FBD2DE9F84306462C
+:102E3000002000F05FF874883088B268DFF8008105
+:102E4000C4F3090444EA8024F068A4B2C1B2204665
+:102E500000F03CF8002748F2E8094846FFF7F9FB84
+:102E600008E06888A04202D1316928780870687843
+:102E700000B1012708F1240001F051FBF0B96946C7
+:102E800008F1240001F074FB009800F10B05407A72
+:102E90000F28E6D0B5F80110A1420DD10098817A33
+:102EA000C81E7169C0B28842C8BF08467061024638
+:102EB0003069E91CFEF710FA2878D9E73800CCD041
+:102EC000012000F017F80020BDE8F28310B513468A
+:102ED0001C4A5468A4F80900E1720A46194604F134
+:102EE0000C00FEF7F9F9164A1369BDE810400021FD
+:102EF000002018471249096A82B008B921B101E0DF
+:102F000011B1012002B0084702B0704710B5014668
+:102F1000487A0F2818BF0E2807D10B4801F012FB82
+:102F2000BDE810400020FFF791BB064C04F10800FB
+:102F300001F008FB04F10800BDE81040FFF782BB78
+:102F4000F4B6022080B7022018B702200C480021F6
+:102F500001604160704710B500F00CF85C6819B171
+:102F6000012904D1204301E024EA0000586082F3E3
+:102F7000108810BDEFF3108272B6014B704700004D
+:102F8000C0B702202DE9FC47594CDFF86891A569CC
+:102F90002840A0614FF0010A4FF0FF3830E0491C93
+:102FA00054F831000642FAD004EBC10718407968A2
+:102FB0001040014208BFC7F804807E68304000F02E
+:102FC0009BF860620AFA00F086437E60EFF310819E
+:102FD00072B6626A20690AFA02F2D2431040206196
+:102FE000022004EBC00353F8086C1640401E43F85F
+:102FF000086CF6D181F31088606A59F82010884770
+:1030000063692069A2691840104207D0E069216A0B
+:10301000084203D1002103EA0206C1E701F0ADFB3B
+:10302000EFF3108972B6216960690140A06901421D
+:1030300001BFE169206A014201F005FC89F31088B3
+:1030400001F01DFCA561BDE8F38738B51446EFF328
+:10305000108572B600F050F8264941F8204085F3FB
+:10306000108831BD10B5EFF3108272B6204B1C6989
+:1030700004431C6153F83140204343F8310082F38C
+:10308000108810BDEFF3108172B6194A536923EA14
+:10309000000005E0EFF3108172B6154A536918433A
+:1030A000506181F310887047EFF3108172B6104AB7
+:1030B000D3691843D061F4E72DE9F0410C4C626A02
+:1030C000266A2062012101FA02F803E039464046EF
+:1030D00001F0BAFB276AE5693D42F7D0404600F0AF
+:1030E0000BF825EA0707E76126626062BDE8F08118
+:1030F0005C10002094B4022002460020110C090448
+:1031000004BF1020120412F07F4F04BF08301202D7
+:103110000FF2180112F0704F04BF001D1201120FC0
+:10312000C0F11F00895C401A7047000004030202CE
+:10313000010101010000000000000000F8B500F1ED
+:103140000C026B4621214FF66640FFE701F0EDFBD4
+:103150009DF80E0005B000BDF8B500F10C026B46FD
+:103160000F214FF66840F1E7F8B500F003F84FF68D
+:103170006940EBE78DF800006B466A460121704715
+:10318000F8B5FFF7F7FF4FF67340DFE71B48002164
+:103190000171017200F034B818490A7941F822002F
+:1031A0000879401C0871704770B504466078FF28A4
+:1031B00002BFB4F8031001F47F41B1F5406F12D1A2
+:1031C00000260E4D00E0761C2979F0B288420AD222
+:1031D000F1B255F82110204688470100F3D002D003
+:1031E000022805D006E02046BDE87040FEF700BF8B
+:1031F000002070BD012070BD00000000ACB70220AF
+:1032000080B501F0E1FB01F0E0FB01F0DFFB01F034
+:10321000DEFB01F0DDFB01F0DCFB01F0DBFB01F08C
+:10322000DAFB01F0D9FB01F0D8FB01F0D7FB01F08C
+:103230000DFC01F0C5FC01F0C4FC01F0C3FCBDE8CD
+:10324000014001F0C0BC18B50C46C7B011460022C1
+:103250008DF800208DF81C008DF81D4022460DF1E0
+:103260001E0001F0B1FC00F03BF83F200C21ADF84E
+:103270000400ADF8061007A8012103900691A41CD4
+:10328000049400F043F800284CBFFF209DF8000094
+:1032900048B010BD00B5C7B000F01BF80F2000F01B
+:1032A0002AF800284CBFFF209DF8000047B000BD61
+:1032B00000B5C7B00021ADF81C0000F016F81820CA
+:1032C00000F019F800284CBFFF209DF8000047B01F
+:1032D00000BD00228DF800208DF81C008DF81D1017
+:1032E0001822002101A801F075BC8DF800101822E9
+:1032F00001A801F06FBCADF8060007A902200490F8
+:103300003F22012003910690ADF80420CDF814D09F
+:10331000002101A8FFF789BD70B506464E4C3078F4
+:103320004CA520B1012807D0032810D070BD012082
+:1033300020700FF2281003E0002121700FF25010CE
+:1033400000F00AFC2846BDE8704000F005BC71683A
+:103350000878C8B94978012909D100F054FE0FF264
+:10336000641000F0F9FB00F02FF80120A0707168E4
+:10337000487848B900F051FE0FF2701000F0ECFBF5
+:1033800000F022F80020A0707068017801291AD19D
+:10339000407801280AD1002000F035FE0FF27410A9
+:1033A00000F0DAFB00F010F80120A0707168487896
+:1033B00048B900F032FE0FF2841000F0CDFB00F0AF
+:1033C00003F80020A07070BD284600F0C5BB00784F
+:1033D000012808BF00F00DB8704780B50FF2390220
+:1033E00000210220FFF731FE1B4900220A70BDE8D0
+:1033F000014080B5002000F010FE17480121417007
+:10340000002181700121C1700021017101BD0021E5
+:103410000220FFF727BE000010B50F4C2079401E98
+:103420008041C00F2071207868B10FF2381000F091
+:1034300093FB08A000F090FBE11CBDE810404FF6A4
+:10344000426001F093BBBDE810400FF2581000F04D
+:1034500083BB0000200A0D00E8B702202D2D20506C
+:103460003250204150504C49434154494F4E205313
+:103470004552564552203A204E4F54494649434101
+:1034800054494F4E20454E41424C45440A000000ED
+:103490002D2D20503250204150504C494341544929
+:1034A0004F4E20534552564552203A204E4F5449D4
+:1034B0004649434154494F4E2044495341424C45AB
+:1034C000440A00002D2D20503250204150504C49CC
+:1034D000434154494F4E2053455256455220203ABD
+:1034E000204C454431204F4E0A0000002D2D205025
+:1034F0003250204150504C49434154494F4E205383
+:10350000455256455220203A204C454431204F46E2
+:10351000460A00002D2D20503250204150504C4979
+:10352000434154494F4E2053455256455220312075
+:103530003A204C454431204F4E0A00002D2D20509A
+:103540003250204150504C49434154494F4E205332
+:1035500045525645522031203A204C454431204FA7
+:1035600046460A002D2D20503250204150504C49E3
+:10357000434154494F4E2053455256455220203A1C
+:1035800020494E464F524D20434C49454E5420420F
+:103590005554544F4E203120505553484544200A2D
+:1035A000200000002D2D20503250204150504C4919
+:1035B000434154494F4E20534552564552203A20DC
+:1035C00043414E275420494E464F524D20434C49CB
+:1035D000454E54202D20204E4F54494649434154D6
+:1035E000494F4E2044495341424C45440A20000073
+:1035F000DFF83C150A6892B200E00246086880B223
+:103600008242FAD170472DE9FC4104461825DFF8C3
+:103610002485DFF82465684308EB00073078062826
+:1036200008D131787170347078754FF0FF30706068
+:10363000002039E000F077F8B9680918B96008F19E
+:103640000803B96832786A439A589142327813D3A2
+:1036500008F1150315FB02FC13F80C30062B25D0DE
+:1036600008F108066B43F358994222BF08F115038D
+:103670006A439A5CEED219E01146337869439A4264
+:103680000BD008F1140308F1150C5B5C15FB03F576
+:103690000CF805407A753B7500E07A7508F1140264
+:1036A0005454317871703470BDE8F6811146694325
+:1036B00008F115035B5C062B04D008F1140615FB1A
+:1036C00003F574557B753A7508F115025454EBE710
+:1036D000F8B5DFF86434DFF85C541E78182402462D
+:1036E0006243B0422A4404D118785870507D187053
+:1036F0000FE0167D507D92F815C005F11507664361
+:10370000062807F806C004D0167D143514FB00F413
+:103710002E55012010731878062802BF00294FF09B
+:10372000FF315960F1BD10B5DFF80C44606810F14D
+:10373000010F0FD0FFF75CFF6168DFF800248142C2
+:1037400061683CBF5388C918081A517848431178FA
+:10375000C84000E0002080B210BD2DE9F84FDFF82E
+:10376000DC53DFF8DCB3D5F80880D8F80000DBF8CC
+:1037700000104A0500F090F9DFF8BC63DFF8B4A34D
+:1037800021F4806181604FF0180934780AF1080053
+:1037900019FB04F14758FFF7C6FF874217D20027ED
+:1037A0000121B170062C3DD019FB04F40AF1080187
+:1037B0000AF108020959814223BF0AF10801095997
+:1037C000091A002111510AEB04014C7DEAE7A9888E
+:1037D0004118B94202D2AF880021E2E73F1ADFE781
+:1037E000022802DA2878012800D07F1ED8F80000CD
+:1037F000C1684A07FAD500F055F9DBF80C00000C57
+:10380000BFB247EA0047CBF80C70FFF7F1FE7060DB
+:10381000A8680068816841F480618160AFF300802E
+:10382000BDE8F18FB8B20028DAD1FFF7E1FE706091
+:103830000320BDE8F24F01F03EBA2DE9F843EFF363
+:10384000108872B6BD4DBB4BA8680168CA224A6297
+:1038500053204862B84A886820F480608860182045
+:103860001678374647431F44387B022826D13C68E8
+:10387000D7F810909078F0B17A7B012A0AD1012113
+:103880003046FFF725FF88F310887968304600F04E
+:1038900016F904E088F31088304600F0C1F8A868F3
+:1038A0000068CA214162224653214162484631469E
+:1038B00000F050F90BE0FFF750FF06E0C868420740
+:1038C000FCD500F07EF89F49086088F31088FF213E
+:1038D000A86802685162BDE8F183F8B5974CA16011
+:1038E000CA2209684A6253224A62954A136843F021
+:1038F00020031360136803F00703C3F1040323706C
+:1039000095682D0C05F07F056D1C6570EDB2926811
+:10391000C2F30E02521C628092B2521E6A43A2F59A
+:10392000A072DA404FF6FF739A422CBFA380A280A8
+:10393000854A136843F400231360844B1D6845F4E3
+:1039400000251D6048BB7C487A4E012383701825F2
+:103950004FF0FF33436000235FFA83FC06F10C074E
+:1039600015FB0CFC4FF0000E07F80CE05B1CDFB2FF
+:10397000062FF1DB06230370886820F480608860DE
+:1039800000F01FF8D060032001F0A0F9A1680868DA
+:10399000826842F48042826005E0C868410544BF05
+:1039A000032001F088F9A1680A68FF205062002214
+:1039B0000321032001F034F9BDE8F240032001F0B7
+:1039C0004CB9C86800F0800060F49060C8604FF4A3
+:1039D00000207047F0B504460025EFF3108672B65C
+:1039E0001827DFF850C10CF10C0007FB05FE10F89A
+:1039F0000E0010B16D1C062DF5DB062D0CD06F43AB
+:103A00000CEB07000127077386F3108804614273EB
+:103A100003600D700020F0BD86F310880120F0BD1A
+:103A2000F8B50746EFF3108472B6032001F020F9D1
+:103A3000424DAE683068CA2141623A465321416224
+:103A4000182043494243895C02291BD10021384692
+:103A5000FFF73EFE3848017806290ED13068384914
+:103A60000A68530500F018F821F480618160C1688C
+:103A70004A07FCD500F016F804E04078884218BFE9
+:103A8000FFF76BFEA9680A68FF205062032001F06F
+:103A9000E4F884F31088F1BD02D5C1684A07FCD46C
+:103AA00081687047C16801F0800161F49061C16074
+:103AB0004FF4002023490860032001F007B92DE9E5
+:103AC000F04180460F46424618201A4942438C185E
+:103AD000207B022804BF4046FFF7A2FFEFF31085CA
+:103AE00072B6032001F0C4F8144EB0680068CA2111
+:103AF00041625321416202202073A7606760404603
+:103B0000FFF781FD0C490A784978914202D0FFF70E
+:103B100024FE02E0A168081AA060FF20B1680A68CC
+:103B20005062032001F099F885F31088BDE8F08118
+:103B300028280040ECB20220F8B70220A0B70220EB
+:103B4000082800400C080058000800588008005859
+:103B5000F8B20220104700000EB4C0B5024603A818
+:103B600000210190009101AB0121044878440C3000
+:103B7000FCF7E4FA06BC5DF810FB00BF4B4F0000F9
+:103B800000B587B000F010F8012003220690ADF8D0
+:103B90000420ADF8062000F07AF800284CBFFF2082
+:103BA0009DF8000007B000BD00208DF8000018222D
+:103BB000002101A801F00EB809220021684601F099
+:103BC00009B81822002102A801F004B8182201A89F
+:103BD00001F000B870B5C8B006460C46154605227F
+:103BE000FFF7EBFFADF82060FFF7EBFF302100F0AF
+:103BF00014F80521049000F019F8002848BFFF20B0
+:103C000009D49DF8000030B99DF8030020709DF89C
+:103C100004002870002048B070BDADF80A100820DC
+:103C20000221ADF80800059108A870470791CDF86A
+:103C300018D0002102A8FFF7F8B800B5C7B000F00F
+:103C40000EF8FFF7C3FF312000F013F800F01FF863
+:103C500000284CBFFF209DF8000047B000BD0023A6
+:103C60008DF81C008DF8003007A84170827000218B
+:103C70007047ADF8060007A9032004900822012030
+:103C800003910690ADF80420704703900691CDF89B
+:103C900014D0002101A8FFF7C8B800B587B000F024
+:103CA00012F900F02EF9812000F008F900F036F941
+:103CB00000284CBFFF209DF8000007B000BD2DE993
+:103CC000F84DC7B09446DDF840E1519A559D569E97
+:103CD000DDF84CA1ADF81D108DF81C004FF0000B65
+:103CE000ADF81FC08DF821308DF822E000F024F8E7
+:103CF00000F017F824F8095F668000F002F93F2011
+:103D0000832100F026F9574406910D37049700F0FF
+:103D100008F900284CBFFF209DF8000048B0BDE81E
+:103D2000F08D88F800A007AC5499E419524608F1C8
+:103D30000100544400F048BF8DF8232017465299E3
+:103D40008DF800B00DF1240809A8B84400F03CBF7C
+:103D500000B5C7B000F00CF8852000F090F800F036
+:103D6000DDF800284CBFFF209DF8000047B000BDE3
+:103D700000218DF81C008DF80010182201A800F019
+:103D800029BF2DE9F841C7B04FF0000800F026F830
+:103D90000DF12300DDF844E14E9F4F9E509D529C53
+:103DA0008DF81F30C0F800E08DF800808DF820708D
+:103DB0008DF821608DF822508DF8274000F0A1F891
+:103DC0008620ADF8060007A90C2000F0A3F8002813
+:103DD0004CBFFF209DF8000000F0D5B88DF81C0006
+:103DE00007A8417082707047F8B5C8B005460E4606
+:103DF00017461C4600F023F808A8467087708DF817
+:103E0000205000F0A1F88A21ADF80A103F200321CC
+:103E100000F08DF8002848BFFF200ED49DF8000068
+:103E200058B94F994E98BDF801202280BDF8032063
+:103E30000280BDF805000880002049B0F0BD0722CF
+:103E40000021684600F0C6BE18B5C7B0044600F0B1
+:103E50003AF88DF81C40224600F083F800F051F843
+:103E60003F208E2100F092F8641C049400F059F871
+:103E700000284CBFFF209DF8000048B010BDADF8F1
+:103E8000060007A901203F22039104907047ADF876
+:103E9000060007A90220704700B587B000F013F8AC
+:103EA00000F02FF8922000F009F800F037F8002811
+:103EB0004CBFFF209DF8000007B000BDADF8060024
+:103EC0003F220120704700208DF80000704700B5A8
+:103ED000C7B00021ADF81C00FFF74DFF9520FFF79C
+:103EE000D6FF00F017F800284CBFFF209DF8000017
+:103EF00047B000BD00228DF80020ADF81C008DF801
+:103F00001E101822002101A800F064BEADF80600C2
+:103F100007A9032004903F22012003910690ADF8E9
+:103F20000420CDF814D0002101A8FEF77EBFADF823
+:103F30000800059108A8072104900791CDF818D032
+:103F4000002102A8FEF771BF1822002102A800F08C
+:103F500041BEADF80400ADF8061007A8012103909A
+:103F600070470DF11D0000F02FBE00B5C7B0FFF780
+:103F7000C1FFA520FFF7CAFF00284CBFFF209DF816
+:103F8000000047B000BD48B0BDE8F081ADF80400C6
+:103F9000ADF8061007A801210390069170470000B4
+:103FA000444981B00A6802430A60096808400090E9
+:103FB000009801B0704778B585B004466846142172
+:103FC00000F0A2FE0220FFF7EBFF00F010F80095D2
+:103FD000012001900021022003900291694656F8C9
+:103FE000240000F095FE00F008F806B070BD0FF256
+:103FF000D400314E30F81450704756F82400002297
+:10400000294600F042BF0FF2BC012B4B31F81010D3
+:1040100053F82000012200F038BF0FF2A801264B10
+:1040200031F8101053F82000002200F02EBFF0B538
+:1040300085B005460C466846142100F065FE0DB9B2
+:10404000042004E0012D18BF022D02D10820FFF743
+:10405000A7FF2000194E0FF274070DD137F8150095
+:10406000009000210191012002900221039100F0B3
+:104070001BF8012001F042F8012C13D137F815008C
+:10408000009001210E480190029100F00DF80FF20E
+:104090004400445D00220F2160B200F0C1FD60B217
+:1040A00000F0DBFD05B0F0BD694656F8250000F0D4
+:1040B0002FBE00004C000058901000209C100020E3
+:1040C000000021102000010002000000100001008B
+:1040D000020000000A06070000EB8100604AD0F8E9
+:1040E0008010914201D0012070470020704742F4B7
+:1040F000806240F8212070472DE9F04104460D46CA
+:104100000026DFF8608102214046FFF7E5FF002826
+:10411000F9D101F05AF80120FFF726F80027AF4245
+:1041200015D2300013D1381900F045F806467F1C2F
+:10413000F5E70020FFF718F801F055F800220221FA
+:104140004046FFF7D4FF00252846BDE8F081002E49
+:10415000EFD0ED1B6D1CF7E72DE9F84380460C46C8
+:1041600015460026DFF8FC9002214846FFF7B4FF11
+:104170000028F9D101F029F80027AF4216D2AEB9D4
+:1041800004EBC700D0E9002308EBC70000F018F8E3
+:1041900006467F1CF1E701F026F80022022148467E
+:1041A000FFF7A5FF00252846BDE8F283002EF2D0D8
+:1041B000ED1B6D1CF7E7014600220023002001E003
+:1041C000014601202DE9F84F86B00225012602950F
+:1041D000049603918DF8000005919246DFF88480E3
+:1041E000214F9B46EFF3108938680003FCD472B668
+:1041F000D8F8180008B1012519E007214046FFF75B
+:104200006BFF0025C4B294B99DF8000020B901A944
+:1042100002A801F035F805E0059952465B460120F9
+:1042200000F0A6FF002207214046FFF760FF89F358
+:1042300010880DB1002002E0002C03D0012000F016
+:1042400015F80646254318BF002ECDD13868410326
+:10425000FCD4701E8041C00F07B0BDE8F08F000095
+:1042600000040080001400581040005800207047DF
+:1042700001460648064AC3798B4218BF904218BFD0
+:104280000838F8D18B4218BF00207047F873FF1F21
+:104290000070FF1F00B587B000208DF8000000F00F
+:1042A000E0F840F20110ADF806003F220120069030
+:1042B00000F0ECF800284CBFFF209DF8000007B08C
+:1042C00000BD2DE9F84107460128C7B088461546CC
+:1042D0001E4608BF022003D002280CBF1020002079
+:1042E0000DF11D010C1800F036F8012F8DF81C702F
+:1042F00002D0022F18D019E002273A4641460DF1AC
+:104300001D0000F061FC2570667000F0AAF83F20E7
+:104310004FF4817100F016F8FF1C049700F0B8F814
+:10432000002805D5FF2009E01027E6E7472005E033
+:104330009DF8000010B94E9800F067F8FFE748B00C
+:10434000BDE8F081ADF80400ADF8061007A8032120
+:1043500003900691704703220021684600F03ABCA2
+:104360002DE9F64F0C460546012CC7B09B4608BF09
+:10437000022003D0022C0CBF102000200DF11F01E1
+:104380000E18FFF7E8FF012CADF81C508DF81E4009
+:1043900002D0022C2CD02DE00227569C559DDDF832
+:1043A0005091DDF84CA1DDF8488148993A4600F07B
+:1043B00054F8A6F800B086F8028086F803A086F8C4
+:1043C00004907571B47100F04CF83F20ADF8040012
+:1043D0004FF4827107A8ADF80610039003210A3745
+:1043E0000497069100F054F8002805D5FF2009E055
+:1043F0001027D2E7472005E09DF8000010B9579834
+:1044000000F003F849B0BDE8F08FBDF8011001805D
+:104410000020704730B5C7B01C464A9B00F026F814
+:1044200000258DF800508DF82140224619460DF1E7
+:10443000220000F0C9FB00F014F83F204FF4837114
+:1044400000F01BF8A41D049400F022F800284CBFD3
+:10445000FF209DF8000047B030BD0DF11F0000F0B7
+:10446000B3BB1822002101A800F0B4BBADF81C00BA
+:10447000ADF81E108DF820207047ADF80400ADF89F
+:10448000061007A80121039006917047ADF804209B
+:10449000CDF814D0002101A8FEF7C7BC30B5C7B0D5
+:1044A0000025ADF81C0007A84A9C41808280ADF829
+:1044B000223004818DF8005000F016F80F2102918F
+:1044C00040F281100A21ADF80600049107A80121ED
+:1044D0003F220390069100F00CF800284CBFFF200B
+:1044E0009DF8000047B030BD1822002101A800F05F
+:1044F00071BBADF80420CDF814D0002101A8FEF75F
+:1045000094BC00000249016002490161704700BF8C
+:10451000D745000801460008006040607047EFF38F
+:10452000108172B6026882420CBF012000201CE09C
+:10453000EFF3108272B603680B6048600160086890
+:10454000416023E0EFF3108272B6086043684B606D
+:1045500041604868016019E0EFF3108172B643686A
+:1045600002681A6042680068426081F310887047F0
+:1045700010B5EFF3108472B602680A600068FFE7B6
+:10458000FFF7EAFF84F3108810BD086082F31088FB
+:104590007047000000F062BF6E486F49016001F192
+:1045A0002002426001F13002826001F13C020262AD
+:1045B00001F14402426201F14C02C26001F1540275
+:1045C000026101F17002426101F174028261803185
+:1045D000C16100F055BF38B50446604D05F11000CB
+:1045E000FFF79AFF5B494868A1680160E168C16014
+:1045F000456005F11001816000F05EFF58482DE034
+:1046000080B554494A6813680120187200F05AFFB7
+:10461000002002BD38B5524C504D07E0694605F107
+:104620001000FFF7A5FF00982168884705F11000EA
+:10463000FFF775FF0028F1D031BD494841680847B0
+:1046400038B50446474D2846FFF766FF4148C06825
+:10465000A1680160456000F03AFF434821680160AD
+:1046600061684160002032BD80B53A49CA6813686C
+:104670001020187200F031FF002002BD3549CA68D1
+:10468000394910680B68184738B5374C354D06E086
+:1046900069462846FFF76CFF0098616888472846FE
+:1046A000FFF73DFF0028F3D031BD38B504462F4D4C
+:1046B0002846FFF731FF2E48FFF72EFF25480069F7
+:1046C000A1688160E168C16005612168016061687D
+:1046D0004160216941616169816131BD80B50146F7
+:1046E0002348FFF72FFFBDE802400FF2090000F05A
+:1046F00004BF000038B5174C1D4D08E06946284638
+:10470000FFF736FF009920690069FFF71BFF284675
+:10471000FFF705FF0028F1D031BD10B5154C20463C
+:10472000FFF7FAFE0B4841690C60BDE8104000F04D
+:10473000F8BE1CB50F4C06E069462046FFF718FF8F
+:10474000009800F019F82046FFF7E9FE0028F3D0A2
+:1047500013BD000000000320BC09032090080320C3
+:10476000D0B70220A8080320D8B70220480A0320A7
+:10477000C8B70220500A03207047704710B5274879
+:10478000274C88B0016841F400410160FEF7DEFB70
+:1047900024490020FFF7A1F800F0E7FE01210120E5
+:1047A000FEF7D9FB0020FFF706FC0120FFF703FC12
+:1047B0000220FFF700FC0120FFF725FC012100206B
+:1047C000FFF735FC01210120FFF731FC0121022018
+:1047D000FFF72DFCFFF7E0FE134A00211020FEF743
+:1047E00034FC04F23C500FF24501009001916946FF
+:1047F0000FF23D0000F044F804F25470029004F50A
+:10480000C96140F23C5005900391049402A8FFF75F
+:104810004CFFFFF7BFFE08B010BD000008000058B5
+:104820003000032020B70220C34800087047000072
+:1048300080B500F0A9FEFDF73DFBBDE80440002176
+:104840000120FEF788BB70474FF0FF30FEF79ABBA0
+:1048500000211020FEF706BC0220FEF725BC022036
+:10486000FEF72ABC012805D0022805D0102805D162
+:10487000FDF738BDFDF751BDFDF753BD70477047DB
+:104880007FB50C464D4D61684D4EE8612962284662
+:1048900000F098FF2468746006F10800FFF73CFE02
+:1048A000012000F068F801203070296841B10FF252
+:1048B000E9000FF2ED0200900192029468468847E9
+:1048C0007FBD1FB53E4C04F10800FFF728FE00BB7A
+:1048D0002178F1B1694604F10800FFF749FE374835
+:1048E000C16949B10098029001228DF8042001A805
+:1048F00088479DF8040000E001202070207818B15E
+:104900000098FFF7EBFE04E0009904F10800FFF7C0
+:104910000FFE04F10800FFF702FE28B9207818B155
+:1049200004F10800FFF794FF1FBD2DE9F041054693
+:104930000E4690461C46002000F01DF8204F786877
+:10494000A0F80950C672324641460C30FCF7C4FC50
+:104950001A4A136900210020984748F2E800FFF73F
+:104960007EFF79688A78D21C04F10800FCF7B4FC59
+:10497000BDE8F04101201CB51049124C096A20B96C
+:1049800001B188470020207013BD0120207011B1B3
+:10499000BDE81C40084713BD0020FFF75DBF0000C5
+:1049A00010B50146064C04F10800FFF7CBFD04F1F9
+:1049B0000800BDE81040FFF74BBF000044B70220DD
+:1049C00090B70220B5B70220704770477047704714
+:1049D00070477047704770477047704770470000D6
+:1049E00038B5054684B068780024FF2802BFB5F8C2
+:1049F000031040F60140814225D165498A88B5F807
+:104A00000700921C904209D1687B0124C10752BF64
+:104A10008DF8004000218DF8001011E04988491CF4
+:104A2000884210D10FF27010FFF796F803208DF82E
+:104A3000000005F10D00B5F80B108DF8081001907D
+:104A40006846FEF769FC204605B030BD10B58AB057
+:104A500050484F4CFEF7A0FB8F218DF81810E52031
+:104A6000B3218DF819008DF81A10D5202E218DF85C
+:104A70001B008DF81C107F204A218DF81D008DF839
+:104A80001E1098202A218DF81F008DF82010482034
+:104A90007A218DF821008DF82210CC2040218DF84C
+:104AA00023008DF82410FE2000218DF82500ADF89C
+:104AB000261000940823012206A90220FFF701FC1A
+:104AC00000F032F8412000F023F8A01C00F010F8AC
+:104AD000062100F015F800F027F8422000F018F841
+:104AE000201D00F005F8102100F00AF80AB010BDF2
+:104AF000059001210491029100200A220190704743
+:104B0000039200910223208806AA0221FFF728BC05
+:104B10008E218DF824008DF823100020FE21ADF8A1
+:104B200026008DF82510704719208DF81800ED210A
+:104B300082208DF81A008DF81910ED20AE218DF825
+:104B40001C008DF81B104C2021218DF81E008DF8C3
+:104B50001D1041209D218DF820008DF81F1022206E
+:104B600045218DF822008DF82110704780B5422232
+:104B70004FF64263984208D105480091022381888C
+:104B800000880022FFF746FC0246104602BD0000E6
+:104B9000F0B70220E14900082D2D20474154542050
+:104BA0003A204C454420434F4E46494755524154C4
+:104BB000494F4E2052454345495645440A0000009E
+:104BC000704770477047704710B50446FCF784FB88
+:104BD000204610BD10B5044610460A460146204640
+:104BE00000F0FAFD204610BD0901020081B002D498
+:104BF0003C48815405E03C4802F00F02104400F8A4
+:104C0000041C01B07047394A13684FF6FF010002D7
+:104C10000B4000F4E06018433549084310607047CA
+:104C200038B5324B1C68C4F30223C3F10704052CCA
+:104C300028BF04241D1D072D34BF0023DB1E0125C2
+:104C400005FA04F4641E2140994005FA03F35B1E43
+:104C50001A401143BDE83440C6E7010007D40122E1
+:104C600000F01F01234B8A40400943F82020704781
+:104C700001000BD4012200F01F011F4B8A404009A4
+:104C800043F82020BFF34F8FBFF36F8F704710B5ED
+:104C9000401EB0F1807F01D3012010BD174C606031
+:104CA0000F214FF0FF30FFF79FFF0022A260072087
+:104CB0002060002010BD010007D4012200F01F0178
+:104CC0000F4B8A40400943F820207047010007D469
+:104CD000012200F01F010B4B8A40400943F82020BD
+:104CE0007047000000E400E018ED00E00CED00E08B
+:104CF0000000FA0500E100E080E100E010E000E0E3
+:104D000000E200E080E200E0002200F099BD000037
+:104D10002DE9F84F4FF00009644A654B4FF00F083A
+:104D200005460E4633E0634FBD4214BF07270427F4
+:104D30008F4027434CF82E70C1431C6801EA040CD5
+:104D40007468E40348BF40EA0C0CC3F800C05C6818
+:104D500001EA040C7468A40348BF40EA0C0CC3F8D1
+:104D600004C0146801EA040C7468E40248BF40EA15
+:104D70000C0CC2F800C0546801EA040C7168890286
+:104D800048BF40EA0C0CC2F804C009F101093168BF
+:104D900031FA09F077D0012404FA09F414EA010089
+:104DA000F3D04FEA490C032101FA0CF16FEA010E2E
+:104DB0007168012918BF022903D0112918BF1229CF
+:104DC00011D1A968F7680EEA010107FA0CF7394317
+:104DD000A960696821EA04047168C1F3001101FA4D
+:104DE00009F10C436C60E968B4680EEA010104FA49
+:104DF0000CF42143E9604FEA89017468022C18BF62
+:104E0000122C12D14FEAD90405EB840401F01C07DF
+:104E1000D4F820A008FA07FB2AEA0B0AD6F810B04B
+:104E20000BFA07F747EA0A0727622C680EEA04071D
+:104E3000347904F0030404FA0CF43C432C607468E5
+:104E4000E400A2D5DFF870C04FEA990E5CF82E702E
+:104E500001F00C0108FA01F427EA0404B5F1904FBF
+:104E600008BF00270ED0154FBD4208BF012709D04B
+:104E7000134FBD4208BF022704D0124FBD427FF43A
+:104E800052AF032754E7BDE8F18F81B0002A14BF69
+:104E90008161816201B070470B4A136803421CBFF5
+:104EA0001060FFF7DFBC70470000000000080058EA
+:104EB0008008005800100048080001400004004825
+:104EC00000080048000C00480C080058984900E011
+:104ED000984981B00A6802430A6009680840009056
+:104EE000009801B0704710B500F0C4FC924C6068A7
+:104EF00040010ED56068C0000BD400F0E9FC00F062
+:104F0000E7FC206840F480302060216821F4803183
+:104F1000216000F0D2F80020FFF7AAF940B18079B3
+:104F20008649E160E16821F47C5141EA0021E160B9
+:104F300000F047F88248834C016800220260026951
+:104F400002F0500202610420FFF7C2FF0120FFF7C8
+:104F5000BFFF0220FFF7BCFF0420FFF7B7FF0120CF
+:104F6000FFF7B4FF0220FFF7B1FF00220F210E2050
+:104F7000FFF756FE0E20FFF770FE00220F213A20A9
+:104F8000FFF74EFE3A20FFF768FE00216E484160B1
+:104F90000F218160046047F6FF71C16000F0A0FC42
+:104FA000CA206062FF2153206062A068C008C00070
+:104FB000A0606162FFF7E2FB4FF0FF30FDF7E2FF18
+:104FC000FAE710B5AEB01CA84821FFF79DFE01A876
+:104FD0001C21FFF799FE08A85021FFF795FE00F06D
+:104FE00077FC5548016821F01801016007215748F6
+:104FF000026822F4C06242F4007202604FF4803210
+:10500000006800F4C06000904FF4807400981C9118
+:1050100001201E900021402020901D9227911F9476
+:105020001CA800F00AFD6F200190022100200291CF
+:1050300003900490059006900790012101A800F0CC
+:10504000B3FF43F60300089000214FF4804019900D
+:105050000E910F91102002211B901A91189408A80C
+:1050600001F078F92EB010BD10B5394C394800F078
+:1050700017F84FF40040E061002020626062A062F7
+:10508000204601F0E5FA0021204602F05EFA0021F8
+:10509000204602F065FA2046BDE8104002F038BA1A
+:1050A00020604FF4E13060600020A060E06020618B
+:1050B0000C2060610020A0617047274881B0016822
+:1050C00041F4801101603F21006800F480100090DD
+:1050D0000098224841604161016841F47C110160FF
+:1050E000026942F47C120261016841F03F010160F3
+:1050F000026942F03F02026101B0704738B50446D0
+:1051000002F08EFA14F1010F054609D000F0C9FB38
+:10511000241805E01248016821F00401016030BF45
+:1051200002F07EFA401BA042F4D331BD0000000023
+:10513000480000584C00005890000058FECAFECAB3
+:10514000800800580028004020B7022000040058C2
+:1051500008B402200038014050000058040C0058E8
+:1051600010ED00E070470000DFF800F0251200208D
+:105170002DE9F0413C4F0646387801288846144610
+:105180001D4608BF02201BD0012139700020786025
+:1051900000F018F8010011D1012E22462B4640469E
+:1051A00002D100F054F802E01146FFF7DDFF00F0F5
+:1051B00009F82E490A6822EA06060E6000213970B5
+:1051C000BDE8F0814FF47A7018E02A49CA680020DF
+:1051D000002A07D5284B294A0B600A60C9680029B4
+:1051E00048BF0120704721490A6842F000420A6026
+:1051F00000200968002958BF0120704770B5054696
+:1052000002F00EFA06461A4C2068C10311D502F0CE
+:1052100007FA801BA842F7D3032070BD1249206013
+:105220004860012070BD02F0FBF9801BA84209D341
+:10523000F2E72068C10744BF012121604CF2FA3136
+:105240000840EBD120684103EDD4002070BD10B5BB
+:1052500006490C6844F001040C6040F8042BBFF3CD
+:105260006F8F036010BD000068B702201440005823
+:10527000104000580840005823016745AB89EFCD26
+:105280002DE9F04100F053F8884608BF02204CD0C9
+:1052900000F052F800F055F8010044D12968DFF819
+:1052A000C470022919D14FF0FF32C8F800206E688F
+:1052B00000E0761C6968AA6851188E4208D2304610
+:1052C00000F043F800F03DF80100F2D0C8F80060AB
+:1052D0007A69DFF894100A407A6139688A050FD537
+:1052E0003A6822F400723A60396841F4006139602A
+:1052F0003A6822F400623A60396841F4007139601A
+:105300003A6851050FD5396821F4806139603A68EF
+:1053100042F480523A60396821F4805139603A6829
+:1053200042F480623A6000212170BDE8F081104CA7
+:105330000546207801287047002001216060217017
+:1053400070474FF47A70FFF759BF08490A6822F492
+:10535000FF6242EAC00242F4803242F002020A6076
+:10536000704700000040005805F8FFFF1440005847
+:1053700068B70220C0680840884201D10120704708
+:1053800000207047C0690840884201D10120704761
+:105390000020704710B5664C02212046FFF7F2FF4F
+:1053A00038B16068C043810703D5FFF76DF902206B
+:1053B00018E001212046FFF7E5FF38B16068C043DF
+:1053C000C10703D5FFF726F901200BE0082120468D
+:1053D000FFF7D8FF38B16068C043010703D5FFF776
+:1053E000A8F90820A06010BD10B5514C00F033F8AA
+:1053F00018B96068C043810306D400F02CF830B9B6
+:105400006068C043810302D5BDE810406EE008210A
+:1054100000F022F870B96068C04301030AD56068E3
+:10542000444940F400206060086880474FF4002041
+:10543000A06010BD202100F00FF858B96068C0438B
+:10544000810207D5606840F400106060BDE810403C
+:10545000FFF7F3B810BD022120468BE736480168FC
+:1054600041F4007101603548026842F40072026044
+:1054700040BF20BF3248016841F4004101607047DD
+:1054800080B53048016841F480110160006800F483
+:105490008010009000982648016841F001010160E9
+:1054A000026842F4803202602C20FFF7D6FBBDE890
+:1054B00002402D20FFF7D1BB23480168490849006D
+:1054C0000160704721494FF48030086070471E48E2
+:1054D000016821F00201016070471B484FF4003160
+:1054E0004160016821F4003101607047164801688D
+:1054F00041F400310160FFF7C1B838B504460C4DE6
+:1055000008212846FFF736FF30B10A480460686872
+:1055100020F40020686031BDA0474FF40021A9604D
+:1055200031BD0948016821F00801016070470000A1
+:10553000000C005800B80220D40800582008005879
+:105540000C04005850000058040C0058080C005877
+:10555000484900E0484981B00A6802430A60096886
+:1055600008400090009801B0704780B500F09CF9A9
+:1055700000F09CF94148016841F48031016002F07B
+:1055800070F8BDE801400EE000B587B068460FF244
+:1055900018211C22FBF7B0FEFFF7BFF86846FDF7A5
+:1055A000DBFD07B000BDF0B585B068461421FFF7FC
+:1055B000ABFB00260025002400210FF2DC0000EBED
+:1055C000C102907988B11368B3F1904F08D02C4F85
+:1055D000BB4208D02B4FBB4204BF9088044304E079
+:1055E0009088064301E090880543491C2229E4DBAA
+:1055F000002002900121032003900191B0B288B1F4
+:1056000000900120FFF7A4FF0120FFF7A3FF6946E8
+:105610004FF09040FFF77CFB0022B1B24FF090407A
+:10562000FFF733FCA8B280B100900220FFF790FF93
+:105630000220FFF78FFF124E69463046FFF768FBE6
+:105640000022A9B23046FFF720FCA0B280B1009042
+:105650000420FFF77DFF0420FFF77CFF094D69461A
+:105660002846FFF755FB0022A1B22846FFF70DFCA4
+:1056700005B0F0BD4C0000584C010058900800588F
+:105680000004004800080048FFF7EEBC13460A4635
+:105690000146002002F02CB8000000480100000084
+:1056A0000000004801000000000000480100000068
+:1056B0000000004801000000000000480100000058
+:1056C0000000004801000000000000480100000048
+:1056D0000000004801000000000000480100000038
+:1056E0000000004801000000000000480100000028
+:1056F0000000004801000000000000480100000018
+:105700000000004801000000000000480100000007
+:1057100000000048010000000000004801000000F7
+:1057200000000048010000000000004801000000E7
+:1057300000000048010000000000004801000000D7
+:1057400000000048010000000000004801000000C7
+:1057500000000048010000000000004801000000B7
+:1057600000000048010000000000004801000000A7
+:105770000000004801000000000000480100000097
+:105780000000004801000000000000480100000087
+:105790000000004801000000000000480100000077
+:1057A00000000048010000000000000000000000B0
+:1057B0000000000098560008280003202C00032059
+:1057C000220404000249016002490161704700BFE0
+:1057D000414600086946000862F30F2262F31F4247
+:1057E000401810F0030308D0C91A1FD3DB0748BFC5
+:1057F00000F8012D28BF20F8022D130030B4144604
+:105800001546103928BF20E93C00FAD8490728BFBF
+:1058100020E90C0048BF40F8042D890028BF20F87B
+:10582000022D48BF00F8012D30BC7047C91818BFC1
+:1058300000F8012DCB0728BF00F8012D70470000AC
+:1058400000B500BF130096469446103928BFA0E863
+:105850000C50FAD85FEA417C28BF0CC048BF40F822
+:10586000042BC90728BF20F8022B48BF00F8012BE2
+:1058700000BD0000134810B5016841F4807101605B
+:105880000320FFF7C0F9002001F070FF002400287A
+:1058900014BF012401F097FF204610BD0A4880681C
+:1058A0007047094800787047084805E007480168D4
+:1058B00041F0020101607047016841F0010101609F
+:1058C000704700000040005884100020042004E0CD
+:1058D0000248016841F4807101607047000400587B
+:1058E00038B5040044D094F8210028B9002184F888
+:1058F0002010204602F01FF800F049F8FF2510B1F3
+:1059000000F03FF834E02168DFF8B0008A68024018
+:105910008A6021688A68636820690343A069034339
+:105920001A438A602168E068086120680169A268FA
+:1059300041EA024101612068C16821F08001C16033
+:105940002068C16C89088900C1642168CA6CE36958
+:10595000606903431A43CA6420688168880609D4D1
+:1059600000F020F830B120684562042100F01FF8F3
+:10597000012032BD20684562012184F821100020F9
+:1059800032BD20684562042184F82110704702204E
+:1059900084F82100CA20216848625320226850629E
+:1059A000204626E020460BE02068C0F8248084F8DA
+:1059B0002110002084F8200070470000BFFF8FFFF7
+:1059C00070B5044640F2E9362068C16821F0A001B4
+:1059D000C16001F025FE05462068C168880606D42E
+:1059E00001F01EFE401BB042F6D3032070BD002024
+:1059F00070BD70B504462068C1684A0612D44FF0E5
+:105A0000FF32C26040F2E93601F00AFE0546206826
+:105A1000C168480606D401F003FE401BB042F6D32D
+:105A2000032070BD002070BD4FF0B040006800F052
+:105A3000F000B02888BFB02070472DE9F041040085
+:105A400051D0207881064FF0B04535D5A868E96877
+:105A500010F00C0001F0030103D00C2808BF01294D
+:105A600043D12868800702D5E06900283BD0FFF7C2
+:105A7000DBFF616A884207D2084600F0D8FB0028A5
+:105A800031D100F07AFA0FE0286820F0F0000143ED
+:105A900029606968206A21F47F4141EA0021696038
+:105AA000606A00F0C4FBF0B901F0AAFFDFF8180843
+:105AB000006801F05BFEB0B92078C1070DD5A86879
+:105AC000E96800F00C00082801F0030103D00C285D
+:105AD00008BF03292CD12868800340F14181606808
+:105AE000002840F03D81012040E2E06980B1296852
+:105AF00041F0010100F02EFB06462868800700F106
+:105B00002C8101F08DFD801B0328F6D303202DE2AC
+:105B100028684008400000F03EFA0646286800F079
+:105B200028FAC9D001F07CFD801B0328F6D3EDE7ED
+:105B30006068B0F5803F06D0B0F5A02F296807D186
+:105B400041F480212960286840F48030286006E014
+:105B500021F4803129602A6822F480222A6060685A
+:105B600060B101F05DFD06462868800300F1F88011
+:105B700001F056FD801B6528F6D3C7E701F050FD04
+:105B800006462868400C10F0010000F0E98001F0A2
+:105B900047FD801B6528F4D3B8E701F041FDC01B29
+:105BA0000328C0F01181B1E7E06878B1296841F4B9
+:105BB000807100F0CFFA06462868400500F1178191
+:105BC00001F02EFD801B0328F6D39FE7286820F400
+:105BD000807000F0E0F906462868800A10F00100A5
+:105BE00000F0DC8001F01CFD801B0328F4D38DE75E
+:105BF00001F016FDC01B0328C0F00B8186E740F0C2
+:105C0000010000F0CEF907467068800700F11C81A2
+:105C100001F006FDC01B0328F6D377E7706820F07B
+:105C2000040000F0BEF907467068C00810F00100DB
+:105C300000F0198101F0F4FCC01B0428F4D365E7DF
+:105C40000528306806D140F004003060316841F02A
+:105C5000010105E0400840003060316821F0040196
+:105C60003160A06841F2893768B101F0D9FC804603
+:105C70003068800700F10C8101F0D2FCA0EB080035
+:105C8000B842F5D342E701F0CBFC8046306800F023
+:105C900070F900F0FD8001F0C3FCA0EB0800B842F1
+:105CA000F4D333E701F0BCFCC01B0328C0F0FE8036
+:105CB0002CE7B06840084000B06001F0B1FC074636
+:105CC000B06800F056F900F0F58001F0A9FCC01BA7
+:105CD0000328F5D31AE701F0A3FC801B0328C0F0CA
+:105CE0001F8113E701F09CFC001B0328C0F03981E1
+:105CF0000CE7286881010CD4296841F08071296083
+:105D0000E86840F08050E86001F08AFC04462868AA
+:105D1000810100F12A8101F083FC001B0328F6D3E6
+:105D2000F4E60C2931D0286820F080702860E968FA
+:105D3000DFF8980589088900E960E9680140E960B1
+:105D400001F06EFC04462868810140F10E8101F0EB
+:105D500067FC001B0328F6D3D8E600F00EF9ABE68B
+:105D6000207881071AD5A868E96800F00C0004289B
+:105D700001F0030104D00C2808BF02297FF414AFFE
+:105D80002868400503D5E06800283FF4ACAE696898
+:105D9000206921F0FE4141EA006169602168DFF875
+:105DA000306511F0180F38D0606900283FF436AF25
+:105DB000C90670687FF523AF800709D4706840F08A
+:105DC000010000F0EEF80746706880077FF5E5AE49
+:105DD000706840F0040000F0E4F8074670680007BF
+:105DE0000DD401F01DFCC01B0428F7D38EE66868B3
+:105DF000216920F0FE4040EA01606860CEE77068EB
+:105E0000A16920F4706040EA0120706000F0C6F8DB
+:105E1000074600F0ADF87FF4EBAE2078410737D5A8
+:105E2000DFF8B0743868C10529D4FFF751FD01F0DF
+:105E3000F7FB80463868C10521D401F0F1FBA0EBE7
+:105E400008000328F6D361E6706820F00400706053
+:105E50007068C00810F00100DFD001F0E1FBC01B4A
+:105E60000428F5D352E600F099F8074600F080F8D0
+:105E7000D3D001F0D5FBC01B0328F7D346E6A068BA
+:105E800001287FF4DDAE306840F001003060E8E6C4
+:105E9000217848060ED5A06A00283FF40AAFB16801
+:105EA00041F00101B16001F0BBFB0746B06880071B
+:105EB0007FF5F8AEE06A002857D0A968EA680228A2
+:105EC00001F00C017FF42DAF236B02F00300984228
+:105ED00002BF02F07000636B984214D1A36BC2F34F
+:105EE0000620984202BF02F47810E36B98420AD170
+:105EF000236C02F06060984202BF02F06042606C66
+:105F000082423FF4F6AE0C293FF4EDAD2868410122
+:105F10003FF5E9AD296821F0807100F01BF90646D4
+:105F2000286881013FF5D7AEE968DFF8AC03A26BC2
+:105F30000140206B0143606B0143E06B41EA0221A9
+:105F40000143206C0143606C0143E960286840F024
+:105F500080702860E96841F08051E96001F060FBE1
+:105F60000446286881017FF5BDAE0020BDE8F081C0
+:105F70007068400810F0010070472968606A21F0DD
+:105F8000F001014329606868216A20F47F4040EAFB
+:105F9000012068607047286001F042BB70684008CB
+:105FA0004000706001F03CBB2DE9F84304008846D6
+:105FB00044D0DFF8286300F0C8F847D200F0CDF8ED
+:105FC000074600F0C2F841D001F02AFBC01B0228AE
+:105FD000F7D90320B7E001F023FB401B022843D987
+:105FE000F7E701F01DFBA0EB090002284CD9F0E710
+:105FF00001F016FBA0EB0900022854D9E9E701F0F3
+:106000000FFB401B02285DD9E3E701F009FB401BB1
+:10601000022867D9DDE701F003FB401B484577D331
+:10602000D7E7032802D13968890103E000283968DD
+:1060300002D1890762D401E049055FD4012082E0E2
+:1060400001F0EEFAC01B022872D9C2E7207881075E
+:106050004FF0B0470BD5B968A06821F0F0010143BB
+:10606000B96001F0DDFA0546B868C003B3D5207801
+:10607000DFF8505281060AD52968606921F0F001E5
+:10608000014300F067F8814628688003A9D520788D
+:1060900041060BD52968A0690909090141EA1011D7
+:1060A00000F058F881462868C003A1D52078410740
+:1060B0000BD5B968E06821F4E0610143B96001F0F3
+:1060C000AFFA0546B868800399D5207801070CD54A
+:1060D000B868216920F4605040EAC100B86001F05E
+:1060E0009FFA0546B86840038FD52078C10717D5B9
+:1060F0006068022895D1396889039FD5B9688908F5
+:1061000040EA8100B86041F2893901F089FA054618
+:10611000B868616800F00C00B0EB810F7FF47BAFD2
+:10612000306800F00700804505D200F016F80746F9
+:1061300000F00BF884D101F063FCFFF7AFFBBDE882
+:10614000F24301F013BBBDE8F283306800F00700B2
+:1061500040457047296001F063BA3168C90848EAD0
+:10616000C101316001F05CBA38B54FF0B0445D4D0B
+:10617000A16811F00C0106D1FFF756FCC0F3031023
+:1061800055F8200032BD0429574A05D00829574840
+:1061900004D12168C90222D5104632BDE16801F060
+:1061A0000301022904D0032904D12168C90207D5BB
+:1061B000104605E0FFF738FCC0F3031055F8200047
+:1061C000E168E268E368C1F306214843C2F30211C3
+:1061D000491C5B0FB0FBF1F05B1CB0FBF3F032BD70
+:1061E00080B5FFF7C1FF3E49FFE7414A0968C1F3A7
+:1061F000031152F82110B0FBF1F002BD80B5FFF79A
+:10620000EFFF00F010F8C1F3022106E080B5FFF7C0
+:10621000E7FF00F008F8C1F3C22112F8211001F0E5
+:106220001F01C84002BD2E49324A0968704770B547
+:106230002C49B1282EBFCC6AC0F3031051F820407E
+:106240002048056801F06AFC29492B4A05F00F0532
+:1062500051F82510B4FBF1F10024B1FBF2F1B0F5D7
+:10626000007F0FF2B402204609D10FF2900353F8D9
+:1062700020508D4214D2401C0328F8D912E00FF2AE
+:106280008C0353F820508D420AD2401C0328F8D3C7
+:1062900008E001F0C5F9801B03280BD3032070BD73
+:1062A00052F820400D4D2868C00844EAC000FFF7AE
+:1062B00072FE0646296801F00701A142E9D10020DB
+:1062C00070BD0000080100588C100020FFFFFEEE9A
+:1062D00090000058000400588C80C1110040005804
+:1062E00008000058DC7A00080024F4000048E801A7
+:1062F0009C7A0008708A000840420F0012000000DB
+:1063000024000000360000004000000006000000ED
+:106310000C00000010000000000000000100000060
+:106320000200000003000000DFF820130A680309E0
+:1063300003F47F2300019A4300F47F2000F082B928
+:10634000DFF808231368010C23EA014343EA004302
+:10635000136070472DE9F843054600242878DFF8DC
+:10636000EC624106A0464FF0B0472DD5286B70B1C6
+:10637000B0F5800F06D0B0F5000F18BFB0F5400F94
+:1063800017D01FE0F86840F48030F860EDE038681E
+:1063900020F08060386001F043F9814638680001E0
+:1063A00040F1D08001F03CF9A0EB09000228F5D9BA
+:1063B0000324D7E001F034F9A0EB0900022840F2F1
+:1063C000C980F5E70124A0462868010531D5B068E9
+:1063D00000F44078286C80452AD0FFF779FAB8F1AC
+:1063E000000FB16805D1286C21F440710143B16000
+:1063F0001EE0B06840F48030B06021F44071B068B5
+:1064000020F48030B060286C0143B160B068C007F0
+:106410000ED501F005F9804641F28939B068800750
+:1064200006D401F0FDF8A0EB08004845F6D303249C
+:10643000A0462878C10705D53168A869890840EACF
+:10644000810131602878810705D53168E86921F438
+:106450004061014331602878C10644BFA86AFFF754
+:106460006FFF2878810644BFE86AFFF769FF287844
+:10647000410744BF286AFFF757FF2878010744BF48
+:10648000686AFFF751FF2868C1051BD53168686B42
+:1064900021F0406101433160686BB0F1006F00F0A2
+:1064A000BDF8686BB0F1806F75D100F0BDF804469F
+:1064B0003868000160D501F0B3F8001B0228F7D955
+:1064C0004FF0030867E001F0ABF8001B02285BD92E
+:1064D000F6E7316821F04041316020F080503268A9
+:1064E00022F0406210433060A86BB0F1C05F00F052
+:1064F00095F8286841056DD53168E86B21F0405169
+:1065000001433160E86BB0F1005F03D1F96841F4F9
+:106510008031F960E86BB0F1805F5BD100F084F806
+:1065200004463868000146D501F07AF8001B0228BD
+:10653000F7D94FF003084DE001F072F8001B022874
+:1065400041D9F6E700F061F8A86821F4781100F06D
+:1065500071F88146386800017FF52CAF39696869A8
+:1065600001433961002C7FF42EAF3168286B21F490
+:1065700040010143316027E700F047F8E86821F067
+:10658000606100F057F80446386800019BD539690E
+:1065900068690143396128688105AAD5A86BB0F103
+:1065A000804F1CBFB0F1004F002892D1316821F01C
+:1065B0004041084397E700F028F8286921F060413E
+:1065C00000F038F8044638680001B5D539696869C3
+:1065D000014339612868C10405D5F168686C21F46C
+:1065E00040410143F160286881040BD5796AE86C69
+:1065F00021F0300101437962796AA86C890840EA88
+:10660000810179624046BDE8F2833869696820F407
+:10661000FE4040EA012038613969704703D1F968CA
+:1066200041F08071F9607047396821F0806139600C
+:1066300000F0F6BF01433961386840F0806038608F
+:1066400000F0EEBF1043086070470000880000585B
+:1066500038B5040009D004F17C05686808B900F079
+:106660001EF800F021F8012801D1012032BDA06AF6
+:1066700008B100F02AF800F00AF821F02A01FFE73B
+:10668000816000F01BF8BDE8324000F02EBE2068AB
+:10669000416821F490414160206881687047002181
+:1066A0002970204601F0A4B82420686020680168A1
+:1066B000490849000160204600F040B9206801689F
+:1066C00041F00101016020467047204600F0AABD5C
+:1066D00070B5044604F17C0513466868202836D15D
+:1066E00049B3180027D02878012830D001222A7019
+:1066F00004F154062165338073800020E860212076
+:106700006860306AC8B1DFF82012C162DFF81C028D
+:10671000316A0863316ADFF8180248630020316A81
+:1067200088632068216D00F12802306A01F065FA63
+:1067300018B100F00EF8012070BD216840200862F9
+:10674000002028702068816841F0800108E0022064
+:1067500070BD1020E860002028702020686070471D
+:106760008160002070BD206881684A067047F8B5D6
+:10677000044640F60F002568E9692A68AB680840BE
+:106780000DD1880602D5900602D4D80040F1898048
+:10679000E16E00294FD02046BDE8F4400847654827
+:1067A000034204BF644E32427BD0CF0709D5D605E1
+:1067B00007D501262E62D4F8885045F00105C4F8AB
+:1067C00088508D070AD5DD0708D526680225356271
+:1067D000D4F8885045F00405C4F888504D070AD510
+:1067E000DD0708D5266804253562D4F8885045F0C1
+:1067F0000205C4F888500D070CD5950601D4034254
+:1068000008D0256808202862D4F8880040F00800E5
+:10681000C4F8880008050BD5500109D525684FF448
+:1068200000602862D4F8880040F02000C4F8880096
+:10683000D4F88800002870D0890607D5900601D4C6
+:10684000D80003D5E16E09B120468847D4F8880006
+:1068500021688A68510602D410F0280F1AD0204609
+:1068600000F0BEFDFFF77FFF0FD500F057F860B1D5
+:10687000DFF890198163A06F01F002FA00284CD074
+:10688000A06F816BBDE8F44008472046BDE8F240A8
+:1068900001F0E6BA204601F0E3FA0020C4F88800CF
+:1068A000F1BDC80209D5580207D54FF480102862FF
+:1068B0002046BDE8F24000F0B1BE080609D510063A
+:1068C00001D4180205D5216F39B32046BDE8F44044
+:1068D000084748060FD550060DD5286820F040001F
+:1068E00028602021C4F88010002020672046BDE8E1
+:1068F000F24000F01EBF080206D5500004D5204625
+:10690000BDE8F24001F0ADBAC80148BF002A04D585
+:106910002046BDE8F24001F0A5BAF1BD816821F042
+:1069200040018160A06F70473574000863740008EF
+:106930006974000801000010200100042DE9F84FDF
+:106940000446DFF8C8082768DFF8C4B83968DFF8FC
+:10695000C4A80140A0680143206901436069014364
+:10696000E0690143606E0143396000267968E068A0
+:1069700021F4405101437960B046A169DFF88808ED
+:1069800087421CBF206A0143BA68DFF8780A0240D8
+:106990001143B9604FF48075F96A606A090940EAE9
+:1069A0000111F9625F454FF400404FF400714FF45C
+:1069B00080624FF400634FF4805C4FF4005E4FF44C
+:1069C000804929D1DAF800B00BF0030BBBF1030FBB
+:1069D0003ED8DFE80BF00237343A4FF0010AD4F822
+:1069E0001CB05746BBF5004F4FF6F07A40F01183CC
+:1069F000012F09D0022F00F05482042F00F08D8265
+:106A0000082F00F0C282F5E2FFF700FC0146606A41
+:106A1000002840F01B8242E2DFF8ECB75F4517D157
+:106A2000DAF800A01AF4406A27D0BAF5806F09D0CE
+:106A3000BAF5006F03D0BAF5406F06D008E04FF00A
+:106A4000020A07E04FF0040A04E04FF0080A01E0F0
+:106A50004FF0100ADFF8B0B75F45C0D1BAF1000FB0
+:106A60000BD0BAF1020F49D0BAF1040F00F08280C6
+:106A7000BAF1080F00F0B080B6E3FFF7BFFB0146A4
+:106A8000606A58B3012808BF022028D0022808BF36
+:106A9000042024D0032808BF062020D0042808BFE3
+:106AA00008201CD0052808BF0A2018D0062808BFD7
+:106AB0000C2014D0072808BF102010D0082808BFC9
+:106AC00020200CD0092808BF402008D00A2808BF81
+:106AD000802004D00B2808BF284600D00120B1FB3D
+:106AE000F0F0002800F08283626802EB42018842E5
+:106AF00003D31103814280F0A18075E3606AB0B3D3
+:106B0000012808BFDFF80009EED0022808BFDFF82F
+:106B1000FC08E9D0032808BFDFF8F408E4D0042813
+:106B200008BFDFF8F008DFD0052808BFDFF8E80865
+:106B3000DAD0062808BFDFF8E408D5D0072808BF58
+:106B4000DFF8DC08D0D0082808BFDFF8D808CBD0A1
+:106B5000092808BFDFF8D008C6D00A2808BFDFF828
+:106B6000CC08C1D00B2808BF4FF22440BCD0DFF8BE
+:106B7000C008B9E7FFF7F8FA0146606A58B3012880
+:106B800008BF0220ABD0022808BF0420A7D00328EA
+:106B900008BF0620A3D0042808BF08209FD00528DE
+:106BA00008BF0A209BD0062808BF0C2097D00728D2
+:106BB00008BF102093D0082808BF20208FD00928B4
+:106BC00008BF40208BD00A2808BF802087D00B2820
+:106BD00008BF284683D081E7676A002F84D0012F41
+:106BE00008BF4846FAD0022F08BF7046F6D0032FE0
+:106BF00008BF41F25550F1D0042F08BF6046EDD0D8
+:106C0000052F08BF40F6CC40E8D0062F08BF40F65D
+:106C1000AA2012D0072F08BF18460ED0082F08BF91
+:106C200010460AD0092F08BF084606D00A2F08BF11
+:106C3000284602D00B2F00D1802055E7BAF1000F73
+:106C40000BD0BAF1020F38D0BAF1040F00F0728005
+:106C5000BAF1080F00F0A780ECE0FFF7CFFA014689
+:106C6000606A40B3012808BF02251ED0022808BF71
+:106C700004251AD0032808BF062516D0042808BF0B
+:106C8000082512D0052808BF0A250ED0062808BFFF
+:106C90000C250AD0072808BF102506D0082808BFF1
+:106CA000202502D0092808BF402572D00A280CBF31
+:106CB00080250B286DD001256BE0606A002836D056
+:106CC000012808BFDFF800682BD0022808BFDFF8D2
+:106CD000FC6726D0032808BFDFF8F46721D004281A
+:106CE00008BFDFF8F0671CD0052808BFDFF8E867A9
+:106CF00017D0062808BFDFF8E46712D0072808BFBE
+:106D0000DFF8DC670DD0082808BFDFF8D86708D0A7
+:106D1000092808BFDFF8D06703D00A2808BFDFF8CA
+:106D2000CC677CD00B2808BFDFF8046777D0DFF88A
+:106D3000C06774E0FFF718FA0146606A40B30128A3
+:106D400008BF022525D0022808BF042521D003282A
+:106D500008BF06251DD0042808BF082519D005281E
+:106D600008BF0A2515D0062808BF0C2511D0072812
+:106D700008BF10250DD0082808BF202509D00928F4
+:106D800008BF402505D00A280CBF80250B2800D05D
+:106D900001256268B1FBF5F65008002110EB0620D2
+:106DA00051EB166141E0606A002836D0012808BF27
+:106DB0004FF4800633D0022808BF4FF400162ED0BF
+:106DC000032808BFDFF82C6729D0042808BF4FF438
+:106DD000801624D0052808BFDFF81C671FD00628BE
+:106DE00008BFDFF818671AD0072808BF4FF400263D
+:106DF00015D0082808BF4FF4802610D0092808BFF6
+:106E00004FF400360BD00A2808BF4FF4803606D066
+:106E10000B2808BF4FF4004601D04FF40006C246CD
+:106E2000002116EB52004AEB01010023FAF7A8FA01
+:106E3000064601E04FF00108A6F54070DFF8C016E5
+:106E4000884280F0D1812168CE60CFE1012808BF5F
+:106E500002251AD0022808BF042516D0032808BF2F
+:106E6000062512D0042808BF08250ED0052808BF23
+:106E70000A250AD0062808BF0C2506D0072808BF17
+:106E8000102502D0082808BF202575D0092808BF82
+:106E9000402571D00A280CBF80250B286CD0012515
+:106EA0006AE0606AB0B3012808BFDFF8840521D02A
+:106EB000022808BFDFF850051CD0032808BFDFF800
+:106EC000440617D0042808BFDFF8400512D0052873
+:106ED00008BFDFF834060DD0062808BFDFF83005FC
+:106EE00008D0072808BFDFF82C0503D0082808BF02
+:106EF000DFF82C057AD0092808BFDFF8280575D0FF
+:106F00000A2808BFDFF8200570D00B2808BFDFF87B
+:106F10001C056BD0DFF8D40568E0FFF725F90146C2
+:106F2000606A40B3012808BF022525D0022808BFA7
+:106F3000042521D0032808BF06251DD0042808BF3A
+:106F4000082519D0052808BF0A2515D0062808BF2E
+:106F50000C2511D0072808BF10250DD0082808BF20
+:106F6000202509D0092808BF402505D00A280CBFD4
+:106F700080250B2800D001256068B1FBF5F142089F
+:106F800002EB4102B2FBF0F632E0666A66B3012E14
+:106F90002CD0022E08BF484628D0032E08BF42F648
+:106FA000AA2023D0042E08BF70461FD0052E08BF8C
+:106FB00041F698101AD0062E08BF41F2545015D051
+:106FC000072E08BF604611D0082E08BF18460DD006
+:106FD000092E08BF104609D00A2E08BF084605D062
+:106FE0000B2E08BF284601D04FF4803000F014F972
+:106FF000B6B201E04FF00108A6F11000504580F054
+:10700000F3800AEA0601C6F3420001432068C1602A
+:10701000ECE0012F07D0022F35D0042F70D0082FBD
+:1070200000F0A580D7E0FFF7F1F80146606A40B3B1
+:10703000012808BF022516D0022808BF042512D057
+:10704000032808BF06250ED0042808BF08250AD04B
+:10705000052808BF0A2506D0062808BF0C2502D03F
+:10706000072808BF10257AD0082808BF202576D029
+:10707000092808BF402572D00A280CBF80250B289C
+:107080006DD001256BE0606AB0B3012808BFDFF85E
+:10709000781333D0022808BFDFF870132ED00328EE
+:1070A00008BFDFF86C1329D0042808BFDFF8641389
+:1070B00024D0052808BFDFF860131FD0062808BFBA
+:1070C000DFF858131AD0072808BFDFF8541315D07B
+:1070D000082808BFDFF84C1310D0092808BFDFF8D4
+:1070E00048130BD00A2808BFDFF8401306D00B283E
+:1070F00008BF4FF2244101D0DFF83413606831E05B
+:10710000FFF732F80146606A40B3012808BF022544
+:1071100025D0022808BF042521D0032808BF062552
+:107120001DD0042808BF082519D0052808BF0A2546
+:1071300015D0062808BF0C2511D0072808BF102538
+:107140000DD0082808BF202509D0092808BF4025F0
+:1071500005D00A280CBF80250B2800D001256068C7
+:10716000B1FBF5F101EB5001B1FBF0F631E0666ADD
+:107170006EB3012E08BF484629D0022E08BF7046C4
+:1071800025D0032E08BF41F2555020D0042E08BF51
+:1071900060461CD0052E08BF40F6CC4017D0062E06
+:1071A00008BF40F6AA2012D0072E08BF18460ED0FE
+:1071B000082E08BF10460AD0092E08BF084606D080
+:1071C0000A2E08BF284602D00B2E08BF802000F0F0
+:1071D00023F8B6B201E04FF00108A6F110005045C7
+:1071E00002D22068C66001E04FF0010804F1680097
+:1071F0000121418001800021416081604046BDE85D
+:10720000F28F0000B774000800800040F369FFCFE0
+:107210000038014088000058616800EB5100B0FB65
+:10722000F1F6704790F82810CA0706D5026853682F
+:10723000C16A23F400330B43536090F828108A0787
+:1072400006D502685368016B23F480330B43536007
+:1072500090F828104A0706D502685368416B23F45A
+:1072600080230B43536090F828100A0706D5026864
+:107270005368816B23F400430B43536090F828104C
+:10728000CA0606D502689368C16B23F480530B438A
+:10729000936090F828108A0606D502689368016CFE
+:1072A00023F400530B43936090F828104A0610D53E
+:1072B00002685368416C23F480130B435360416CA4
+:1072C000B1F5801F05D15368816C23F4C0030B43D3
+:1072D000536090F828100A0606D501684A68C06C09
+:1072E00022F4002202434A607047F8B5044604F1D4
+:1072F0007C050020E8606FF07E4700F091F90646BB
+:10730000206801680A0708D50097334600224FF429
+:107310000011204600F016F860B9206801684A079D
+:107320000AD50097334600224FF48001204600F032
+:1073300009F808B10320F2BD20206860A860002091
+:107340002870F2BD2DE9F041069C05460E46904698
+:107350001F462868C1693140B1420CBF012000209E
+:1073600040451CD114F1010FF3D000F059F9C01BB6
+:10737000844200D314B900F015F80CE028680168C5
+:107380004A07E6D5C1690A05E3D54FF400620262F7
+:1073900000F008F8C16000210170032000E0002027
+:1073A000BDE8F0812868016821F4D0710160286887
+:1073B000816849084900816005F17C002021416015
+:1073C0008160704701680A6822F0C0020A600168A3
+:1073D0008A6822F400028A602021C0F88010704779
+:1073E00001680A6822F490720A60DFF820110268CE
+:1073F00093680B4093602021C0F884100021C1667F
+:1074000070470000FFF4FF1100127A0000093D00F0
+:10741000AAB0280080841E00006A18005558140085
+:1074200040420F0020A1070090D0030048E801006F
+:107430000024F400816A00680268930644BF08468D
+:1074400000F077B90020A1F856000868826822F0A1
+:10745000800282600868FFE7016841F04001016036
+:107460007047806A00F0FFBCF8B5846A04F18005BB
+:1074700004F1560728686E6821688A68110606D5E7
+:10748000212804D1002038802046FFF79BFF206888
+:107490008168480606D5222E04D100203881204676
+:1074A000FFF79EFFA86840F01000A8602046BDE8E6
+:1074B000F24000F0D5BC806A00F1560100220A813A
+:1074C0000A8000F0CDBC00000000127A0000093DE7
+:1074D00000AAB0280080841E00006A1800555814C5
+:1074E0000040420F0020A1070090D0030048E801AF
+:1074F000000024F40055150000CC0C0000AA0A007E
+:1075000000FD0F005461510000D43000FEFFFFEF7A
+:1075100010B500F17C010A78012A01D1022010BDCA
+:1075200001230B7024224A600268136814686408FF
+:10753000640014600022426623F000530068036078
+:10754000202048600020087010BD70B500F01EF8C3
+:1075500001D1022070BD00F01FF822F0604209E066
+:1075600070B500F013F801D1022070BD00F014F8DE
+:1075700022F0606211438160204600F01AF8206812
+:107580000660202068600020287070BD044604F169
+:107590007C0528780128704701222A702420686021
+:1075A00020680668026852085200026020688268FB
+:1075B0007047FFB50FF254020FF25806D2E90034BB
+:1075C00002A9C1E90034D6E90071CDE90071416E2C
+:1075D00011B90121012213E001688A688968520EFD
+:1075E00002F00702490F02AC655CA45C1DF80110B3
+:1075F0001DF80220ED00E40095FBF1F194FBF2F29E
+:10760000683041800280FFBD0000000001010103DD
+:10761000070100000804020408010101704700008E
+:1076200001484068704700BF8410002038B5EFF370
+:10763000108472B6284D6946281D00F02EFD69465B
+:10764000281D00F087FD38B184F31088BDF80010C4
+:10765000224AFEF71BF831BD0120287084F3108800
+:1076600031BD80B5FEF710F80221009100231A48C1
+:1076700000F124014FF48052001D00F0F5FB01BD24
+:1076800000BFF8B514460026EFF3108510F1010F86
+:107690001ED001281CBF02284FF0FF3618D1BCB104
+:1076A000264672B60C4F012392B2381D00F0F0FB53
+:1076B00000281CBF3978002908D000223A7085F3D1
+:1076C0001088A1B2054AFDF7E1FF01E085F31088BB
+:1076D0003046F2BD00000000380000202D76000882
+:1076E00063601D481D4B704723601D481D4B70474C
+:1076F00070B51C46002300251B4E10B1022804D093
+:107700000AE03460FFF7F1FF02E07460FFF7E9FF81
+:107710000360FEF7DDFF0346012B05D007D3032BE3
+:1077200004D038BF022502E0012500E003252846E9
+:1077300070BD82B00068094A0B49904206D0094AE0
+:10774000904207D1086828B102B00047486808B1E4
+:1077500002B0004702B070477CB3022000800040B6
+:1077600008B4022000380140B8B7022070B50F4EAF
+:10777000044630780025A8B1FEF732FD32784FF488
+:107780007A71B1FBF2F1B0FBF1F0FDF780FA48B984
+:10779000102C07D2002221464FF0FF30FDF740FAAF
+:1077A000B46000E00125284670BD00BF84100020B1
+:1077B000734981B00A6802430A6009680840009072
+:1077C000009801B0704780B56E48016841F400210F
+:1077D00001600022006800F4002000900F21009852
+:1077E0002E20FDF71DFABDE802402E20FDF735BA28
+:1077F00038B58AB0044668461421FDF785FA20683A
+:10780000614A624990423ED10868614D40F00100F2
+:107810000860096801F00101059105980120FFF752
+:10782000C7FF0C200090022100200191029003214B
+:107830000820039100F06AF8402000F060F808206A
+:1078400000F064F853482860112000F065F808B192
+:10785000FDF788FC4FF08850069000210120079129
+:10786000ADF82010099006A9284600F0BDFC08B12B
+:10787000FDF778FC6567AC62002200212520FDF74A
+:10788000CFF9252037E0444A904236D14868434D2D
+:1078900040F480404860486800F4804005900598B6
+:1078A0000120FFF785FF0220FFF782FF4FF4006001
+:1078B00000F025F8072000F029F8C02000900221F0
+:1078C0000120019102900321072003910490694651
+:1078D0003348FDF71DFA334828600F2000F01CF8EC
+:1078E00008B1FDF73FFC6567AC620022002124204F
+:1078F000FDF796F92420FDF7B0F90BB030BD0090EC
+:107900000221002002900390019170470490694683
+:107910004FF09040FDF7FCB968601020A86000208F
+:10792000E8608020286100206861A861E861286221
+:10793000284600F0FBB81CB504461B492068884265
+:107940001CD1FDF7C5FFFDF7C3FF1848816B21F47B
+:10795000407141F480718163816B41F40041816326
+:10796000026842F480620260006800F48060009067
+:1079700000982046BDE8164000F068BC13BD00002A
+:107980004C00005850000058008000405C00005837
+:1079900094B502204400024000380140F4B50220B2
+:1079A00000040048440402400028004058000058E9
+:1079B0003249002008604FF4E0223148016841F468
+:1079C000700101604FF0B041086840F001000860AC
+:1079D0008A602C480A6802402B480A60036823F03A
+:1079E00005030360426852085200426000222748A3
+:1079F000C8600861086820F4802008608A617047C8
+:107A00004FF0B0410FF2D4000A68C2F3031250F8ED
+:107A100022008A6802F00C02042A04D0082A04D04A
+:107A20000C2A04D01CE01A481AE01A4818E0CA6868
+:107A3000CB68C3F3021302F003025B1C022A08BFE7
+:107A4000134802D0032A08BF1248B0FBF3F2C868FB
+:107A5000CB68C0F306205B0F42435B1CB2FBF3F024
+:107A60000D4A0FF23803106088681168C0F30310E4
+:107A700053F82000B1FBF0F01060704708ED00E013
+:107A800088ED00E0FBFEF6FA940000580010042296
+:107A90000024F4000048E801A810002001000000C4
+:107AA00003000000050000000100000001000000CC
+:107AB000060000000A000000200000000200000094
+:107AC000040000000800000010000000400000005A
+:107AD000800000000001000000020000A0860100FC
+:107AE000400D0300801A060000350C0040420F00D4
+:107AF00080841E0000093D0000127A000024F4007A
+:107B000000366E010048E801006CDC020000000055
+:107B1000000000000000000000000000DFF8080086
+:107B2000006800F4C06070470004005838B50400D5
+:107B300001D1012032BD2168DFF8FC02814204F14D
+:107B4000240500F042F8022068700A68A0686FF30C
+:107B50000E120243E0680243206902436069024357
+:107B6000A0690243E0690243206A02430A6020469A
+:107B700000F039F9A068B0F5804F04BF00216160C2
+:107B8000696A207900F014F838B1052805D220463A
+:107B900000F043F900F012F803E000202863686366
+:107BA000A8630020A861012068700020287032BD01
+:107BB0000860A96AE86A486060687047296B00201D
+:107BC0000860696BA86B486070470AD2DFF86C02E6
+:107BD00042181423B2FBF3F292002A62DFF860022B
+:107BE00009E0DFF8600242181423B2FBF3F29200BE
+:107BF0002A62DFF85402E8617047F8B5044604F1E0
+:107C0000240600253078012801D10220F2BD012789
+:107C10003770707801282FD102277770B5612068FE
+:107C200007687F087F000760204600F0C0F82168E1
+:107C3000F06820B10A6842F00E020A6008E00868A5
+:107C400020F0040008602068016841F00A0101602A
+:107C5000706A0168CA0303D5026842F48072026048
+:107C6000306B18B1016841F48071016020680268CE
+:107C700042F00102026001E0357002252846F2BDA3
+:107C800038B500F1240200245178022903D00420E1
+:107C90009061012428E001680B6823F00E030B605B
+:107CA00001680D686D086D000D60516A0B6823F462
+:107CB00080730B60012192F82030D56903F01C031A
+:107CC00099406960936AD16A5960116B31B10B6850
+:107CD00023F480730B60536B916B596001215170D9
+:107CE0001470516901B18847204632BDF8B500F1E2
+:107CF00024010423CA6914680268156891F8206099
+:107D000006F01C0603FA06F73C4210D06F070ED5AA
+:107D10001468A50603D4156825F00405156000F065
+:107D20003DF8C968002938D0BDE8F440084702236F
+:107D300003FA06F73C4213D0AF0711D51468A50625
+:107D400005D4156825F00A05156001224A7000F077
+:107D500025F800220A708968F9B1BDE8F4400847A7
+:107D6000082303FA06F6344217D02B0715D51368FB
+:107D700023F00E031360012291F82030CC6903F048
+:107D80001C039A40626001228A614A7000220A70D4
+:107D9000096911B1BDE8F4400847F1BD91F8202010
+:107DA000CC6902F01C02934063607047000078B514
+:107DB000C56C046D6C60446D14B1846DC56D6560F7
+:107DC000012590F84440066C04F01C04A540756041
+:107DD000046863608068102802D1A260E16071BD10
+:107DE000A160E26071BD416C0268134B89089A4240
+:107DF00034BF164B164B03EB8101816402F0FF0286
+:107E0000083A1421B2FBF1F1124AC26401F01C01DC
+:107E1000012202FA01F10165704701790E4A02EB75
+:107E200081024265491E0D4A826501F0030101226B
+:107E30008A40C2657047000008040240F8FFFDBF99
+:107E400000000240F8FBFDBF0004024000080240B1
+:107E50001C08024080080240FC0802404009024021
+:107E6000704770477047704710B5029C01604260D0
+:107E70000021C1600161416181610381A107047733
+:107E800004D5008910B14FF0FF3010BD002010BDA7
+:107E90002DE9F04F064685B030890C460027BB46D9
+:107EA00000287169DC460CBF4FF00208D84681B14A
+:107EB00068B930697768451CBD4228BFED1B37683B
+:107EC000385C7D5D00EB0527BF1CBFB203E00746B1
+:107ED00000E000B102463069F568A84223BF75682A
+:107EE000281AC01B0020154608EB050903FB09FEF4
+:107EF000864532BF0020B0FBF9FA09FB1A00C0B278
+:107F0000804509DA96F81C905FEAC97A48BF844632
+:107F10005FEA897048BFC446100000F0B480706802
+:107F2000714461448842C0F0AE8008EB020080B228
+:107F30000390D946100AADF802000294ADF8002073
+:107F4000049359E0800740D53089002840F09B8099
+:107F50003268D018A34600F8024C200A32681A444E
+:107F600002F8010C224630681844F9F7B5F9706937
+:107F700020187061B069019C401CB061200A316812
+:107F80000C70316848701CE08CB3307FC207D9D5C3
+:107F9000308940B931681944FF2001F8020C31687A
+:107FA000194401F8010C4FF0000B7069241874613A
+:107FB0002C463089002340B931680C70210A3068A2
+:107FC000417002237069801C706108EB0407002176
+:107FD000BFB231615CB1DA44029800EB0A0130684B
+:107FE00022461844F9F778F970692418746109F188
+:107FF0000109B069401CB061049A7068316991450B
+:1080000045D2791881422CBF081A084630610346D0
+:108010003089A0B93068BDF80010C1545B1C70688D
+:108020003168834228BF1B1ABDF80200C8545B1C8C
+:108030007068834228BF1B1A7069801C706105FB41
+:1080400009FA7468BDF80000E41A844288BF044647
+:10805000029800EB0A01281BAC42019003D093D296
+:10806000307F002890D137682246F818F9F734F9A4
+:10807000706920187061A346019C039F0023A9E743
+:108080003068404400E0002005B0BDE8F08F88442F
+:108090008045F5D3A8EB0008F2E778B50289002304
+:1080A0000B80002A44690CBF02250025002C4FD00C
+:1080B000028952B9C2684668531CB34228BF9B1B51
+:1080C0000668B25CF35C02EB03220A80027F02F0D6
+:1080D0000302012A25D10B884FF6FF72934204BF99
+:1080E0000289002A09D0C36802699A4219D202891A
+:1080F000BAB14668F31A934213D24368C268E41ACD
+:1081000014190022C260446102894AB902681478D5
+:10811000012B94BFC3F101030123D25C04EB0222C3
+:108120000A80C468426806682B19934228BF9B1ACC
+:1081300033440E884169891B491B416105D03419BC
+:108140002D19954228BFAD1AC5608169491E81610C
+:10815000184672BDF8B5028900230B80002A4269D7
+:108160000CBF02240024002A3BD0C56802892B469C
+:108170004AB946686A1CB24228BF921B0668775DFE
+:10818000B25C07EB02220A80067F06F00306012E8E
+:1081900020D10F884FF6FF72974204BF0289002A50
+:1081A00007D142680023012A94BFC2F101020122D3
+:1081B0000AE00269AA420DD202895AB14668751BCB
+:1081C000954207D2002304E005682E78AA5C06EBEE
+:1081D00002220A8041680068E4188C4228BF641AB1
+:1081E00003191846F2BD000018B500F124025078BA
+:1081F00001281BD11378012B01D1022012BD536A33
+:1082000010701C680A48044008680443C868401E8F
+:1082100044EAC04448680443087A497A44EA00447E
+:1082200044EA41241C600020107012BD012012BDE0
+:10823000FFFD00E08A60FF2102685162012180F8A1
+:108240002110002180F820100020704790F82010A5
+:10825000012901D102207047012280F8202002214B
+:1082600080F82110CA2102685162532103685962C3
+:1082700001688A6842F02002FFF7DCBF10B50446AF
+:10828000AFF30080204600F005F80446AFF300800D
+:10829000204610BD7CB500F10F06F608F600B0428E
+:1082A00040D2082E04D2082602E0083000F047F839
+:1082B000DFF804512C68210005D1002007E0026896
+:1082C000B24221D2011D08680028F8D12068291D7A
+:1082D0000A68824222D01368B34238BF111DF7D317
+:1082E00012E093190B60801B54685C600B68186087
+:1082F0001660096800291DBF48680028081D002075
+:10830000286002F1080076BD61B10A681068A0F12A
+:108310000803B342E5D250680860EAE700F04EF87F
+:108320000028C2D1002076BD10B5040006D0AFF3FE
+:108330000080204600F003F8AFF3008010BD002855
+:1083400000D1704750B4A0F108021368072B2BD955
+:1083500013F0070F28D1184C616809B18A4202D284
+:108360005160626013E0486800B3904238BF014634
+:10837000F9D31BE0964203D11B180B600A4606E0B6
+:10838000486810B1134498420ED350604A60506858
+:1083900050B11368D118814206D1002121600168D3
+:1083A000CB1813604068506050BC704708680E18C6
+:1083B000B242DFD250BC7047E0B7022007490868DC
+:1083C00008B1002070470648C008C0000860054991
+:1083D000C908C900091A0160704700BF08B8022027
+:1083E00017C8022010CC02202DE9F041074688462C
+:1083F000387810F0030F16461D4633D0384600F08B
+:1084000099F878BBB8F1000F1CBFD8E900018619B4
+:10841000012D2ED13888C10415D5396A07F14402DF
+:10842000384600F0A3F83A6B044602B93A69F96895
+:10843000384600F09BF8361B341A7A69F9683846DA
+:1084400000F094F8261A1EB94DB916F1010F09D0A3
+:1084500097F903002A46314600F08EF8064616F1D9
+:10846000010F09D12320AFF300804FF0FF30BDE8AA
+:10847000F081022DE8D1EBE7388810F4405F0ED090
+:108480007868F86038617861B8617868F86107F1F8
+:108490004400386207F13000786200203863B8F198
+:1084A000000F05D0D8E9020107F13402C2E900014A
+:1084B00039884CF6FF60014039800020BDE8F0812A
+:1084C00070B50546AFF300802888810415D56E6825
+:1084D0000024EA6895F903003146914212D2521AFB
+:1084E000FFF7CEF810F1010F1CBF00283618F0D1AD
+:1084F0000FE04DF6FF70014029802846AFF3008061
+:10850000002070BD00220021FFF7BAF810F1010F22
+:1085100000D101246868E860A861E861002C29881E
+:10852000E7D041F4007129802846AFF300804FF076
+:10853000FF3070BDF8B5A0B9AFF3008000250A4E3A
+:1085400008244FF0FF37306820B1FFF7B9FF00284B
+:1085500048BF3D46361D641EF5D1AFF30080284666
+:10856000F2BDBDE8F240ABE704120020914234BFF7
+:10857000511A0021084670473EB504000D00012A3B
+:1085800002D100F063F807E0022A07D1009400202E
+:10859000019069460C20ABBE2D1801E0002A0CD1D9
+:1085A0000094019569460A20ABBE002805D100223F
+:1085B0002100280000F027F801E00020C04303B0AC
+:1085C00030BD000010B4314A002113461C688442BB
+:1085D0001EBF491C9C6884421EBF491C1C69844202
+:1085E00009D09C69491C844205D0491C20331029BC
+:1085F000ECD310BC7047002342F8313002EBC101CC
+:108600004B6010BC704778B4204C002325462E6880
+:108610008E421EBF5B1CAE688E421EBF5B1C2E6965
+:108620008E4209D0AE695B1C8E4205D05B1C2035A2
+:10863000102BECD372BC7047054604EBC303012A30
+:1086400004BF59684D195D6072BC704710B40F4A81
+:10865000002113461C6884421EBF491C9C6884424A
+:108660001EBF491C1C6984420AD09C69491C844273
+:1086700006D0491C20331029ECD310BC00207047D1
+:1086800002EBC100406810BC7047000014B5022026
+:1086900010B50446E068A169884251D3218849F2A7
+:1086A00002030B40022B08D008044CBF4FF40070AB
+:1086B0004FF48440014321803BE001F4C042B2F515
+:1086C000C04F06D1A168884203D32046FFF732FF8E
+:1086D00078BB208810F4406F02BF606804F1440149
+:1086E000884217D14FF40070FFF7C8FD606030B9C1
+:1086F00004F144006060E060401CA0600AE0218852
+:1087000041F040012180E060606100F50072606826
+:10871000A260E06160682061A068A06120784107E4
+:108720000AD502220021204600F00CF810F1010FBA
+:1087300002D14FF0FF3010BD208840F4C0402080AF
+:10874000002010BD70B504460D461646AFF30080FC
+:1087500033462A4600212046FFF746FE05462046BE
+:10876000AFF30080284670BD38B504000ED02078E5
+:1087700010F0030F03D094F90300002809D5AFF3DC
+:108780000080204600F030F8AFF300804FF0FF305B
+:1087900032BD2046FFF7CEFE0546AFF300802078BD
+:1087A000410644BF606800F05DF80020606094F905
+:1087B0000300022804D900F057F808B14FF0FF3544
+:1087C000E06B48B100F05CF808B14FF0FF35E06BAA
+:1087D00000F048F80020E063204600F005F8AFF311
+:1087E0000080284632BD000001780A0626D51C4AC2
+:1087F00013680021834203D1002342F821301BE09B
+:108800005368012183421EBF022193688342F3D043
+:10881000D368032183421EBF042113698342EBD036
+:108820005369052183421EBF0621936983421EBFFF
+:108830000721D3698342DFD000F014B80021018002
+:108840004FF0FF31C17000F144014160C16001612E
+:1088500041618161C161016200F130014162704793
+:1088600004120020FFF760BD1CB5020000926946AB
+:108870000220ABBE04001000FFF7A4FE200016BDCE
+:10888000E0B50090F8F7DAFC019069460E20ABBE27
+:1088900003B000BD7047FEE7FEE7FEE7FEE7704766
+:1088A0007047704700F026B80548FFF71FBA054823
+:1088B000FDF75DBF0448FDF75ABF0448FFF716BA3D
+:1088C00094B5022008B402207CB30220F4B5022043
+:1088D0001020FCF7E1BA0120FCF7DEBA0220FCF719
+:1088E000DBBAFAF7AABFFCF77FBDFCF753BD00F077
+:1088F00009B8000002484168027889184160704751
+:10890000841000200449C8680A6882430A604860ED
+:10891000F9F7B8BE000000000015005838B50C4645
+:10892000C5B22046AFF30080E068A169884204D355
+:108930002046FFF7ADFE00280FD4E068401CE06041
+:1089400000F8015D2088010503D440050BD50A2DF0
+:1089500009D12046FFF7EEFD28B12046AFF3008095
+:108960004FF0FF3032BD2046AFF30080284632BDC5
+:1089700019E050F8042BD30744BFA9F101039A185A
+:10898000091F0023042942F8043BF9D25FEA817CE5
+:10899000134604D54FF0000CA2F800C09B1CC90779
+:1089A00044BF0021197050F8041B0029E1D1704721
+:1089B00038B50D4D0824286800281CBF017811F037
+:1089C000030F05D090F90310002958BFFFF7CCFE24
+:1089D0002D1D641EEFD1BDE83840002200214FF06C
+:1089E000FF30FEF74DBE00BF0412002010B507494E
+:1089F00079441831064C7C44163404E00A68081D9A
+:108A0000114488470146A142F8D110BD2C00000056
+:108A1000600000004EF68851CEF20001086840F474
+:108A200070000860BFF34F8FBFF36F8F4FF000707F
+:108A3000E1EE100A7047000039FFFFFFB8A5020001
+:108A400058120020800800003000032000000000C1
+:108A50008386FFFF880100001E0200000400002042
+:108A60007386FFFF87020000060000002800032035
+:108A700000000000000000000000000000000000F6
+:108A800001000000020000000300000004000000DC
+:108A900000F00DF8002801D0FFF7A8FFAFF3008029
+:108AA0000020AFF30080FCF71EFA00F002F801206E
+:108AB000704700F001B800000746FFF779FF38461D
+:108AC000F9F7EEF9FBE738B504460D46284600F005
+:108AD00005F8A84218BF0024204632BD0149FFF71F
+:108AE0001DBF00BF741100200148804701480047A6
+:108AF000B1790008F98A0008AFF30080FFF78AFF18
+:108B0000FFF7C6FF00002E004300FFF7FEBFFFF790
+:108B1000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF789
+:108B2000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF779
+:108B3000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF769
+:108B4000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF759
+:108B5000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF749
+:108B6000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF739
+:108B7000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF729
+:108B8000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF719
+:108B9000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF709
+:108BA000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7F9
+:108BB000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7E9
+:108BC000FEBFFFF7FEBFFFF7FEBFFFF7FEBFFFF7D9
+:108BD000FEBFFFF7FEBFFFF7FEBF0000F003100D62
+:108BE000FF018300016004484200007A4428F3FF3B
+:108BF000010001F1FF01F1FF01F1FF01F1FF01F1BE
+:108C0000FF01F1FF01F1FF01F1FF01F1FF01F1FFB0
+:108C100001F1FF01F1FF01F1FF01F1FF01F1350168
+:108C200052FF01AD3F106D4C10221008700104007E
+:108C30004804120804520C04F00507093D00048B97
+:108C40000008046158F200061410010000080C210D
+:108C500064FC0217AC100020B71013ED117E110157
+:108C600043DB113C210110070104000070110020BA
+:108C70007104527004211BA108F3115C11641007E8
+:108C800002040101A4B60220F40452A404213461B8
+:108C90000812B844F213A448500208020254405289
+:108CA000540421346108F0031200120020EC481231
+:108CB0002C24127404F206BC2C101730B50A4B5A3F
+:108CC0006842F480225A60EFF3108472B680225119
+:108CD000F8045B40040012521EF9D11868C103FC6D
+:0E8CE000D484F3108830BD10400058520001BB
+:0400000508008AF96C
+:00000001FF
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_common.h
new file mode 100644
index 000000000..836f40dcf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_common.h
@@ -0,0 +1,115 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_conf.h
new file mode 100644
index 000000000..dfab84959
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_conf.h
@@ -0,0 +1,613 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+
+/**< generic parameters ******************************************************/
+
+/**
+ * Define Tx Power
+ */
+#define CFG_TX_POWER (0x18) /**< 0dbm */
+
+/**
+ * Define Advertising parameters
+ */
+#define CFG_ADV_BD_ADDRESS (0x7257acd87a6c)
+#define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */
+#define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xa0) /**< 100ms */
+#define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */
+#define CFG_LP_CONN_ADV_INTERVAL_MAX (0xfa0) /**< 2.5s */
+
+/**
+ * Define IO Authentication
+ */
+#define CFG_BONDING_MODE (0)
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+
+/**
+ * Define IO capabilities
+ */
+#define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00)
+#define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01)
+#define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02)
+#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
+#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
+
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT
+
+/**
+ * Define MITM modes
+ */
+#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
+#define CFG_MITM_PROTECTION_REQUIRED (0x01)
+
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
+
+/**
+ * Define Secure Connections Support
+ */
+#define CFG_SECURE_NOT_SUPPORTED (0x00)
+#define CFG_SECURE_OPTIONAL (0x01)
+#define CFG_SECURE_MANDATORY (0x02)
+
+#define CFG_SC_SUPPORT CFG_SECURE_OPTIONAL
+
+/**
+ * Define Keypress Notification Support
+ */
+#define CFG_KEYPRESS_NOT_SUPPORTED (0x00)
+#define CFG_KEYPRESS_SUPPORTED (0x01)
+
+#define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED
+
+/**
+ * Numeric Comparison Answers
+ */
+#define YES (0x01)
+#define NO (0x00)
+
+/**
+ * Device name configuration for Generic Access Service
+ */
+#define CFG_GAP_DEVICE_NAME "TEMPLATE"
+#define CFG_GAP_DEVICE_NAME_LENGTH (8)
+
+/**
+ * Define PHY
+ */
+#define ALL_PHYS_PREFERENCE 0x00
+#define RX_2M_PREFERRED 0x02
+#define TX_2M_PREFERRED 0x02
+#define TX_1M 0x01
+#define TX_2M 0x02
+#define RX_1M 0x01
+#define RX_2M 0x02
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_IRK {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_ERK {0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21,0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21}
+
+/* USER CODE BEGIN Generic_Parameters */
+/**
+ * SMPS supply
+ * SMPS not used when Set to 0
+ * SMPS used when Set to 1
+ */
+#define CFG_USE_SMPS 1
+/* USER CODE END Generic_Parameters */
+
+/**< specific parameters */
+/*****************************************************/
+
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+
+#define P2P_SERVER1 1 /*1 = Device is Peripherique*/
+#define P2P_SERVER2 0
+#define P2P_SERVER3 0
+#define P2P_SERVER4 0
+#define P2P_SERVER5 0
+#define P2P_SERVER6 0
+
+#define CFG_DEV_ID_P2P_SERVER1 (0x83)
+#define CFG_DEV_ID_P2P_SERVER2 (0x84)
+#define CFG_DEV_ID_P2P_SERVER3 (0x87)
+#define CFG_DEV_ID_P2P_SERVER4 (0x88)
+#define CFG_DEV_ID_P2P_SERVER5 (0x89)
+#define CFG_DEV_ID_P2P_SERVER6 (0x8A)
+#define CFG_DEV_ID_P2P_ROUTER (0x85)
+
+#define RADIO_ACTIVITY_EVENT 1 /* 1 for OOB Demo */
+
+/**
+* AD Element - Group B Feature
+*/
+/* LSB - First Byte */
+#define CFG_FEATURE_THREAD_SWITCH (0x40)
+
+/* LSB - Second Byte */
+#define CFG_FEATURE_OTA_REBOOT (0x20)
+
+#define CONN_L(x) ((int)((x)/0.625f))
+#define CONN_P(x) ((int)((x)/1.25f))
+
+ /* L2CAP Connection Update request parameters used for test only with smart Phone */
+#define L2CAP_REQUEST_NEW_CONN_PARAM 1
+
+#define L2CAP_INTERVAL_MIN CONN_P(1000) /* 1s */
+#define L2CAP_INTERVAL_MAX CONN_P(1000) /* 1s */
+#define L2CAP_SLAVE_LATENCY 0x0000
+#define L2CAP_TIMEOUT_MULTIPLIER 0x1F4
+
+/* This is the number of sector that is either erased or written each time SW3 is pressed */
+#define CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS (42)
+
+/**
+ * When set to 1, FD_WaitForSemAvailable() is implemented to wait for the Semaphore
+ * to be free (i.e no more timing protection). This gives the opportunity to the Sequencer to run other tasks.
+ * From the Flash Driver user point of view, any FD_xxx() API is not returned until all
+ * actions are done with the flash
+ *
+ * When set to 0, any FD_xxx() returns to the user with the information whether all actions
+ * are completed or not. It is up to the user to restart flash processing either
+ * - immediately as shown in the example
+ * - when the Semaphore are free (i.e no more timing protection).
+ * Before restarting the operation, the user has the opportunity to run other tasks.
+ *
+ */
+#define CFG_USE_SEQ_TO_WAIT_FOR_SEM 0
+
+/* USER CODE BEGIN Specific_Parameters */
+
+/* USER CODE END Specific_Parameters */
+
+/******************************************************************************
+ * BLE Stack
+ ******************************************************************************/
+/**
+ * Maximum number of simultaneous connections that the device will support.
+ * Valid values are from 1 to 8
+ */
+#define CFG_BLE_NUM_LINK 8
+
+/**
+ * Maximum number of Services that can be stored in the GATT database.
+ * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services
+ */
+#define CFG_BLE_NUM_GATT_SERVICES 8
+
+/**
+ * Maximum number of Attributes
+ * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services)
+ * that can be stored in the GATT database.
+ * Note that certain characteristics and relative descriptors are added automatically during device initialization
+ * so this parameters should be 9 plus the number of user Attributes
+ */
+#define CFG_BLE_NUM_GATT_ATTRIBUTES 68
+
+/**
+ * Maximum supported ATT_MTU size
+ */
+#define CFG_BLE_MAX_ATT_MTU (156)
+
+/**
+ * Size of the storage area for Attribute values
+ * This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute:
+ * - attribute value length
+ * - 5, if UUID is 16 bit; 19, if UUID is 128 bit
+ * - 2, if server configuration descriptor is used
+ * - 2*DTM_NUM_LINK, if client configuration descriptor is used
+ * - 2, if extended properties is used
+ * The total amount of memory needed is the sum of the above quantities for each attribute.
+ */
+#define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344)
+
+/**
+ * Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
+ */
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+
+/**
+ * Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
+ */
+#define CFG_BLE_DATA_LENGTH_EXTENSION 1
+
+/**
+ * Sleep clock accuracy in Slave mode (ppm value)
+ */
+#define CFG_BLE_SLAVE_SCA 500
+
+/**
+ * Sleep clock accuracy in Master mode
+ * 0 : 251 ppm to 500 ppm
+ * 1 : 151 ppm to 250 ppm
+ * 2 : 101 ppm to 150 ppm
+ * 3 : 76 ppm to 100 ppm
+ * 4 : 51 ppm to 75 ppm
+ * 5 : 31 ppm to 50 ppm
+ * 6 : 21 ppm to 30 ppm
+ * 7 : 0 ppm to 20 ppm
+ */
+#define CFG_BLE_MASTER_SCA 0
+
+/**
+ * Source for the 32 kHz slow speed clock
+ * 1 : internal RO
+ * 0 : external crystal ( no calibration )
+ */
+#define CFG_BLE_LSE_SOURCE 0
+
+/**
+ * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_HSE_STARTUP_TIME 0x148
+
+/**
+ * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_MAX_CONN_EVENT_LENGTH ( 0xFFFFFFFF )
+
+/**
+ * Viterbi Mode
+ * 1 : enabled
+ * 0 : disabled
+ */
+#define CFG_BLE_VITERBI_MODE 1
+
+/**
+ * LL Only Mode
+ * 1 : LL Only
+ * 0 : LL + Host
+ */
+#define CFG_BLE_LL_ONLY 0
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TLBLE_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_BLE_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 1
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+/**
+ * When set to 1, the traces are enabled in the BLE services
+ */
+#define CFG_DEBUG_BLE_TRACE 1
+
+/**
+ * Enable or Disable traces in application
+ */
+#define CFG_DEBUG_APP_TRACE 1
+
+#if (CFG_DEBUG_APP_TRACE != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+#if ( (CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0) )
+#define CFG_DEBUG_TRACE 1
+#endif
+
+#if (CFG_DEBUG_TRACE != 0)
+#undef CFG_LPM_SUPPORTED
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+#define CFG_DEBUGGER_SUPPORTED 1
+#endif
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/* USER CODE BEGIN Defines */
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+
+/**
+ * These are the lists of task id registered to the scheduler
+ * Each task id shall be in the range [0:31]
+ * This mechanism allows to implement a generic code in the API TL_BLE_HCI_StatusNot() to comply with
+ * the requirement that a HCI/ACI command shall never be sent if there is already one pending
+ */
+
+/**< Add in that list all tasks that may send a ACI/HCI command */
+typedef enum
+{
+ CFG_TASK_ADV_CANCEL_ID,
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ CFG_TASK_CONN_UPDATE_REG_ID,
+#endif
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+/* USER CODE BEGIN CFG_Task_Id_With_HCI_Cmd_t */
+
+/* USER CODE END CFG_Task_Id_With_HCI_Cmd_t */
+ CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
+} CFG_Task_Id_With_HCI_Cmd_t;
+
+/**< Add in that list all tasks that never send a ACI/HCI command */
+typedef enum
+{
+ CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_FLASH_OPERATION_REQ_ID,
+/* USER CODE BEGIN CFG_Task_Id_With_NO_HCI_Cmd_t */
+
+/* USER CODE END CFG_Task_Id_With_NO_HCI_Cmd_t */
+ CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
+} CFG_Task_Id_With_NO_HCI_Cmd_t;
+#define CFG_TASK_NBR CFG_LAST_TASK_ID_WITHO_NO_HCICMD
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_FLASH_OPER_ALLOWED,
+} CFG_IdleEvt_Id_t;
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_BLE,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_debug.h
new file mode 100644
index 000000000..4224edbe0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_debug.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_debug.h
+ * Description : Header for app_debug.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_DEBUG_H
+#define __APP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPD_Init( void );
+ void APPD_EnableCPU2( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*__APP_DEBUG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_entry.h
new file mode 100644
index 000000000..77ead2384
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_entry.h
@@ -0,0 +1,69 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief Interface to the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/flash_driver.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/flash_driver.h
new file mode 100644
index 000000000..ad8a207e6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/flash_driver.h
@@ -0,0 +1,179 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file flash_driver.h
+ * @author MCD Application Team
+ * @brief Dual core Flash driver interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef FLASH_DRIVER_H
+#define FLASH_DRIVER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+typedef enum
+{
+ SINGLE_FLASH_OPERATION_DONE,
+ SINGLE_FLASH_OPERATION_NOT_EXECUTED,
+}SingleFlashOperationStatus_t;
+
+typedef enum
+{
+ WAITED_SEM_BUSY,
+ WAITED_SEM_FREE,
+}WaitedSemStatus_t;
+
+typedef enum
+{
+ WAIT_FOR_SEM_BLOCK_FLASH_REQ_BY_CPU1,
+ WAIT_FOR_SEM_BLOCK_FLASH_REQ_BY_CPU2,
+}WaitedSemId_t;
+
+/* Exported functions ------------------------------------------------------- */
+
+ /**
+ * @brief Implements the Dual core algorithm to erase multiple sectors in flash with CPU1
+ * It calls for each sector to be erased the API FD_EraseSingleSector()
+ *
+ * @param FirstSector: The first sector to be erased
+ * This parameter must be a value between 0 and (SFSA - 1)
+ * @param NbrOfSectors: The number of sectors to erase
+ * This parameter must be a value between 1 and (SFSA - FirstSector)
+ * @retval Number of sectors not erased:
+ * Depending on the implementation of FD_WaitForSemAvailable(),
+ * it may still have some sectors not erased when the timing protection has been
+ * enabled by either CPU1 or CPU2. When the value returned is not 0, the application
+ * should wait until both timing protection before retrying to erase the last missing sectors.
+ *
+ * In addition, When the returned value is not 0:
+ * - The Sem2 is NOT released
+ * - The FLASH is NOT locked
+ * - SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF) is NOT called
+ * It is expected that the user will call one more time this function to finish the process
+ */
+uint32_t FD_EraseSectors(uint32_t FirstSector, uint32_t NbrOfSectors);
+
+ /**
+ * @brief Implements the Dual core algorithm to write multiple 64bits data in flash with CPU1
+ * The user shall first make sure the location to be written has been first erase.
+ * Otherwise, the API will loop for ever as it will be not able to write in flash
+ * The only value that can be written even though the destination is not erased is 0.
+ * It calls for each 64bits to be written the API FD_WriteSingleData()
+ *
+ * @param DestAddress: Address of the flash to write the first data. It shall be 64bits aligned
+ * @param pSrcBuffer: Address of the buffer holding the 64bits data to be written in flash
+ * @param NbrOfData: Number of 64bits data to be written
+ * @retval Number of 64bits data not written:
+ * Depending on the implementation of FD_WaitForSemAvailable(),
+ * it may still have 64bits data not written when the timing protection has been
+ * enabled by either CPU1 or CPU2. When the value returned is not 0, the application
+ * should wait until both timing protection before retrying to write the last missing 64bits data.
+ *
+ * In addition, When the returned value is not 0:
+ * - The Sem2 is NOT released
+ * - The FLASH is NOT locked
+ * It is expected that the user will call one more time this function to finish the process
+ */
+ uint32_t FD_WriteData(uint32_t DestAddress, uint64_t * pSrcBuffer, uint32_t NbrOfData);
+
+ /**
+ * @brief Implements the Dual core algorithm to erase one sector in flash with CPU1
+ *
+ * It expects the following point before calling this API:
+ * - The Sem2 is taken
+ * - The FLASH is unlocked
+ * - SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON) has been called
+ * It expects the following point to be done when no more sectors need to be erased
+ * - The Sem2 is released
+ * - The FLASH is locked
+ * - SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF) is called
+ *
+ * The two point above are implemented in FD_EraseSectors()
+ * This API needs to be used instead of FD_EraseSectors() in case a provided library is taking
+ * care of these two points and request only a single operation.
+ *
+ * @param FirstSector: The sector to be erased
+ * This parameter must be a value between 0 and (SFSA - 1)
+ * @retval: SINGLE_FLASH_OPERATION_DONE -> The data has been written
+ * SINGLE_FLASH_OPERATION_NOT_EXECUTED -> The data has not been written due to timing protection
+ * from either CPU1 or CPU2. On a failure status, the user should check
+ * both timing protection before retrying.
+ */
+ SingleFlashOperationStatus_t FD_EraseSingleSector(uint32_t SectorNumber);
+
+ /**
+ * @brief Implements the Dual core algorithm to write one 64bits data in flash with CPU1
+ * The user shall first make sure the location to be written has been first erase.
+ * Otherwise, the API will loop for ever as it will be not able to write in flash
+ * The only value that can be written even though the destination is not erased is 0.
+ *
+ * It expects the following point before calling this API:
+ * - The Sem2 is taken
+ * - The FLASH is unlocked
+ * It expects the following point to be done when no more sectors need to be erased
+ * - The Sem2 is released
+ * - The FLASH is locked
+ *
+ * The two point above are implemented in FD_WriteData()
+ * This API needs to be used instead of FD_WriteData() in case a provided library is taking
+ * care of these two points and request only a single operation.
+ *
+ * @param DestAddress: Address of the flash to write the data. It shall be 64bits aligned
+ * @param Data: 64bits Data to be written
+ * @retval: SINGLE_FLASH_OPERATION_DONE -> The data has been written
+ * SINGLE_FLASH_OPERATION_NOT_EXECUTED -> The data has not been written due to timing protection
+ * from either CPU1 or CPU2. On a failure status, the user should check
+ * both timing protection before retrying.
+ */
+ SingleFlashOperationStatus_t FD_WriteSingleData(uint32_t DestAddress, uint64_t Data);
+
+ /**
+ * By default, this function is implemented weakly in flash_driver.c to return WAITED_SEM_BUSY.
+ * When the semaphore is busy, this will result in either FD_WriteSingleData() or FD_EraseSingleSector()
+ * to loop until the semaphore is free.
+ *
+ * This function may be implemented so that when using either an OS or the UTIL_SEQ_WaitEvt() API from the sequencer,
+ * it could possible to run other tasks or enter idle mode until the waited semaphore is free.
+ * This function shall not take the waited semaphore but just return when it is free.
+ *
+ * @param WaitedSemId: The semaphore ID this function should not return until it is free
+ * @retval: WAITED_SEM_BUSY -> The function returned before waiting for the semaphore to be free. This will exit the loop
+ * from either FD_EraseSingleSector() or FD_WriteSingleData() and the number of actions left to
+ * be processed are reported to the user
+ * WAITED_SEM_FREE -> The semaphore has been checked as free. Both FD_EraseSingleSector() and FD_WriteSingleData()
+ * try again to process one more time the flash.
+ */
+ WaitedSemStatus_t FD_WaitForSemAvailable(WaitedSemId_t WaitedSemId);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*FLASH_DRIVER_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..1ea46c74b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_conf.h
@@ -0,0 +1,248 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for BLE
+ * middleWare.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOA
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_6
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_4
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_4_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_4_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_CHANNEL_4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_CHANNEL_4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_CHANNEL_4_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/main.h
new file mode 100644
index 000000000..4b10d2beb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/main.h
@@ -0,0 +1,72 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.h
+ * @author MCD Application Team
+ * @brief Header for main.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "app_conf.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32wbxx_nucleo.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..d5db0e33f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,359 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..bdc3e950c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,80 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void DMA1_Channel4_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+void HSEM_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_debug.c
new file mode 100644
index 000000000..14ed65c22
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_debug.c
@@ -0,0 +1,399 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_debug.c
+ * Description : Debug capabilities source file for STM32WPAN Middleware
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+
+#include "app_debug.h"
+#include "utilities_common.h"
+#include "shci.h"
+#include "tl.h"
+#include "dbg_trace.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+typedef PACKED_STRUCT
+{
+ GPIO_TypeDef* port;
+ uint16_t pin;
+ uint8_t enable;
+ uint8_t reserved;
+} APPD_GpioConfig_t;
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+#define GPIO_NBR_OF_RF_SIGNALS 9
+#define GPIO_CFG_NBR_OF_FEATURES 34
+#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
+#define NBR_OF_GENERAL_CONFIG_PARAMETERS 4
+
+/**
+ * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
+ */
+#define BLE_DTB_CFG 0
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+
+#ifdef CFG_DEBUG_TRACE_UART
+#if(CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if(CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+#endif
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * It provides timing information on the CPU2 activity.
+ * All configuration of (port, pin) is supported for each features and can be selected by the user
+ * depending on the availability
+ */
+static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] =
+{
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */
+/* From v1.1.1 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */
+/* From v1.2.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */
+/* From v1.3.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */
+/* From v1.4.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */
+};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * This table is relevant only for BLE
+ * It provides timing information on BLE RF activity.
+ * New signals may be allocated at any location when requested by ST
+ * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed
+ */
+#if( BLE_DTB_CFG == 7)
+static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
+{
+ { GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */
+ { GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */
+ { GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */
+ { GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */
+ { GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */
+ { GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */
+ { GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */
+ { GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */
+ { GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
+};
+#endif
+/* USER CODE END PV */
+
+/* Global variables ----------------------------------------------------------*/
+/* USER CODE BEGIN GV */
+/* USER CODE END GV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+static void APPD_SetCPU2GpioConfig( void );
+static void APPD_BleDtbCfg( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPD_Init( void )
+{
+/* USER CODE BEGIN APPD_Init */
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+ HAL_DBGMCU_EnableDBGStopMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ APPD_SetCPU2GpioConfig( );
+ APPD_BleDtbCfg( );
+
+/* USER CODE END APPD_Init */
+ return;
+}
+
+void APPD_EnableCPU2( void )
+{
+/* USER CODE BEGIN APPD_EnableCPU2 */
+ SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
+ {
+ {{0,0,0}}, /**< Does not need to be initialized */
+ {(uint8_t *)aGpioConfigList,
+ (uint8_t *)&APPD_TracesConfig,
+ (uint8_t *)&APPD_GeneralConfig,
+ GPIO_CFG_NBR_OF_FEATURES,
+ NBR_OF_TRACES_CONFIG_PARAMETERS,
+ NBR_OF_GENERAL_CONFIG_PARAMETERS}
+ };
+
+ /**< Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /** GPIO DEBUG Initialization */
+ SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+
+/* USER CODE END APPD_EnableCPU2 */
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void APPD_SetCPU2GpioConfig( void )
+{
+/* USER CODE BEGIN APPD_SetCPU2GpioConfig */
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+ uint16_t gpioc_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+ gpioc_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++)
+ {
+ if( aGpioConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aGpioConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOC:
+ gpioc_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpioc_pin_list != 0)
+ {
+ gpio_config.Pin = gpioc_pin_list;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &gpio_config);
+ HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
+ }
+
+/* USER CODE END APPD_SetCPU2GpioConfig */
+ return;
+}
+
+static void APPD_BleDtbCfg( void )
+{
+/* USER CODE BEGIN APPD_BleDtbCfg */
+#if (BLE_DTB_CFG != 0)
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++)
+ {
+ if( aRfConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aRfConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_AF_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ gpio_config.Alternate = GPIO_AF6_RF_DTB7;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ }
+#endif
+
+/* USER CODE END APPD_BleDtbCfg */
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+*************************************************************/
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+/* USER CODE BEGIN DbgOutputInit */
+#ifdef CFG_DEBUG_TRACE_UART
+if (CFG_DEBUG_TRACE_UART == hw_lpuart1)
+{
+#if(CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+}
+else if (CFG_DEBUG_TRACE_UART == hw_uart1)
+{
+#if(CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+#endif
+}
+#endif
+
+/* USER CODE END DbgOutputInit */
+ return;
+}
+
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+/* USER CODE END DbgOutputTraces */
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+/* USER CODE END DbgOutputTraces */
+ return;
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_entry.c
new file mode 100644
index 000000000..a70641314
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_entry.c
@@ -0,0 +1,309 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.c
+ * @author MCD Application Team
+ * @brief Entry point of the Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_ble.h"
+#include "ble.h"
+#include "tl.h"
+#include "stm32_seq.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "app_debug.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+static void APPE_SysUserEvtRx( void * pPayload );
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ APPD_Init();
+
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ Led_Init();
+
+ Button_Init();
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ UNUSED(pPayload);
+ /* Traces channel initialization */
+ APPD_EnableCPU2( );
+
+ APP_BLE_Init( );
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+ BSP_LED_On(LED_GREEN);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ APP_BLE_Key_Button1_Action();
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_BLE_Key_Button2_Action();
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_BLE_Key_Button3_Action();
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/flash_driver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/flash_driver.c
new file mode 100644
index 000000000..dcd415b18
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/flash_driver.c
@@ -0,0 +1,322 @@
+/**
+ ******************************************************************************
+ * File Name : flash_driver.c
+ * Description : Dual core Flash driver
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "flash_driver.h"
+#include "shci.h"
+#include "utilities_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ SEM_LOCK_SUCCESSFUL,
+ SEM_LOCK_BUSY,
+}SemStatus_t;
+
+typedef enum
+{
+ FLASH_ERASE,
+ FLASH_WRITE,
+}FlashOperationType_t;
+
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static SingleFlashOperationStatus_t ProcessSingleFlashOperation(FlashOperationType_t FlashOperationType,
+ uint32_t SectorNumberOrDestAddress,
+ uint64_t Data);
+/* Public functions ----------------------------------------------------------*/
+uint32_t FD_EraseSectors(uint32_t FirstSector, uint32_t NbrOfSectors)
+{
+ uint32_t loop_flash;
+ uint32_t return_value;
+ SingleFlashOperationStatus_t single_flash_operation_status;
+
+ single_flash_operation_status = SINGLE_FLASH_OPERATION_DONE;
+
+ /**
+ * Take the semaphore to take ownership of the Flash IP
+ */
+ while(LL_HSEM_1StepLock(HSEM, CFG_HW_FLASH_SEMID));
+
+ HAL_FLASH_Unlock();
+
+ /**
+ * Notify the CPU2 that some flash erase activity may be executed
+ * On reception of this command, the CPU2 enables the BLE timing protection versus flash erase processing
+ * The Erase flash activity will be executed only when the BLE RF is idle for at least 25ms
+ * The CPU2 will prevent all flash activity (write or erase) in all cases when the BL RF Idle is shorter than 25ms.
+ */
+ SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_ON);
+
+ for(loop_flash = 0; (loop_flash < NbrOfSectors) && (single_flash_operation_status == SINGLE_FLASH_OPERATION_DONE) ; loop_flash++)
+ {
+ single_flash_operation_status = FD_EraseSingleSector(FirstSector+loop_flash);
+ }
+
+ if(single_flash_operation_status != SINGLE_FLASH_OPERATION_DONE)
+ {
+ return_value = NbrOfSectors - loop_flash + 1;
+ }
+ else
+ {
+ /**
+ * Notify the CPU2 there will be no request anymore to erase the flash
+ * On reception of this command, the CPU2 disables the BLE timing protection versus flash erase processing
+ */
+ SHCI_C2_FLASH_EraseActivity(ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+
+ /**
+ * Release the ownership of the Flash IP
+ */
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_FLASH_SEMID, 0);
+
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+uint32_t FD_WriteData(uint32_t DestAddress, uint64_t * pSrcBuffer, uint32_t NbrOfData)
+{
+ uint32_t loop_flash;
+ uint32_t return_value;
+ SingleFlashOperationStatus_t single_flash_operation_status;
+
+ single_flash_operation_status = SINGLE_FLASH_OPERATION_DONE;
+
+ /**
+ * Take the semaphore to take ownership of the Flash IP
+ */
+ while(LL_HSEM_1StepLock(HSEM, CFG_HW_FLASH_SEMID));
+
+ HAL_FLASH_Unlock();
+
+ for(loop_flash = 0; (loop_flash < NbrOfData) && (single_flash_operation_status == SINGLE_FLASH_OPERATION_DONE) ; loop_flash++)
+ {
+ single_flash_operation_status = FD_WriteSingleData(DestAddress+(8*loop_flash), *(pSrcBuffer+loop_flash));
+ }
+
+ if(single_flash_operation_status != SINGLE_FLASH_OPERATION_DONE)
+ {
+ return_value = NbrOfData - loop_flash + 1;
+ }
+ else
+ {
+ HAL_FLASH_Lock();
+
+ /**
+ * Release the ownership of the Flash IP
+ */
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_FLASH_SEMID, 0);
+
+ return_value = 0;
+ }
+
+ return return_value;
+}
+
+SingleFlashOperationStatus_t FD_EraseSingleSector(uint32_t SectorNumber)
+{
+ SingleFlashOperationStatus_t return_value;
+
+ /* The last parameter is unused in that case and set to 0 */
+ return_value = ProcessSingleFlashOperation(FLASH_ERASE, SectorNumber, 0);
+
+ return return_value;
+}
+
+SingleFlashOperationStatus_t FD_WriteSingleData(uint32_t DestAddress, uint64_t Data)
+{
+ SingleFlashOperationStatus_t return_value;
+
+ return_value = ProcessSingleFlashOperation(FLASH_WRITE, DestAddress, Data);
+
+ return return_value;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static SingleFlashOperationStatus_t ProcessSingleFlashOperation(FlashOperationType_t FlashOperationType,
+ uint32_t SectorNumberOrDestAddress,
+ uint64_t Data)
+{
+ SemStatus_t cpu1_sem_status;
+ SemStatus_t cpu2_sem_status;
+ WaitedSemStatus_t waited_sem_status;
+ SingleFlashOperationStatus_t return_status;
+
+ uint32_t page_error;
+ FLASH_EraseInitTypeDef p_erase_init;
+
+ waited_sem_status = WAITED_SEM_FREE;
+
+ p_erase_init.TypeErase = FLASH_TYPEERASE_PAGES;
+ p_erase_init.NbPages = 1;
+ p_erase_init.Page = SectorNumberOrDestAddress;
+
+ do
+ {
+ /**
+ * When the PESD bit mechanism is used by CPU2 to protect its timing, the PESD bit should be polled here.
+ * If the PESD is set, the CPU1 will be stalled when reading literals from an ISR that may occur after
+ * the flash processing has been requested but suspended due to the PESD bit.
+ *
+ * Note: This code is required only when the PESD mechanism is used to protect the CPU2 timing.
+ * However, keeping that code make it compatible with the two mechanisms.
+ */
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ UTILS_ENTER_CRITICAL_SECTION();
+
+ /**
+ * Depending on the application implementation, in case a multitasking is possible with an OS,
+ * it should be checked here if another task in the application disallowed flash processing to protect
+ * some latency in critical code execution
+ * When flash processing is ongoing, the CPU cannot access the flash anymore.
+ * Trying to access the flash during that time stalls the CPU.
+ * The only way for CPU1 to disallow flash processing is to take CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID.
+ */
+ cpu1_sem_status = (SemStatus_t)LL_HSEM_GetStatus(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID);
+ if(cpu1_sem_status == SEM_LOCK_SUCCESSFUL)
+ {
+ /**
+ * Check now if the CPU2 disallows flash processing to protect its timing.
+ * If the semaphore is locked, the CPU2 does not allow flash processing
+ *
+ * Note: By default, the CPU2 uses the PESD mechanism to protect its timing,
+ * therefore, it is useless to get/release the semaphore.
+ *
+ * However, keeping that code make it compatible with the two mechanisms.
+ * The protection by semaphore is enabled on CPU2 side with the command SHCI_C2_SetFlashActivityControl()
+ *
+ */
+ cpu2_sem_status = (SemStatus_t)LL_HSEM_1StepLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID);
+ if(cpu2_sem_status == SEM_LOCK_SUCCESSFUL)
+ {
+ /**
+ * When CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID is taken, it is allowed to only erase one sector or
+ * write one single 64bits data
+ * When either several sectors need to be erased or several 64bits data need to be written,
+ * the application shall first exit from the critical section and try again.
+ */
+ if(FlashOperationType == FLASH_ERASE)
+ {
+ HAL_FLASHEx_Erase(&p_erase_init, &page_error);
+ }
+ else
+ {
+ HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, SectorNumberOrDestAddress, Data);
+ }
+ /**
+ * Release the semaphore to give the opportunity to CPU2 to protect its timing versus the next flash operation
+ * by taking this semaphore.
+ * Note that the CPU2 is polling on this semaphore so CPU1 shall release it as fast as possible.
+ * This is why this code is protected by a critical section.
+ */
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID, 0);
+ }
+ }
+
+ UTILS_EXIT_CRITICAL_SECTION();
+
+ if(cpu1_sem_status != SEM_LOCK_SUCCESSFUL)
+ {
+ /**
+ * To avoid looping in ProcessSingleFlashOperation(), FD_WaitForSemAvailable() should implement a mechanism to
+ * continue only when CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID is free
+ */
+ waited_sem_status = FD_WaitForSemAvailable(WAIT_FOR_SEM_BLOCK_FLASH_REQ_BY_CPU1);
+ }
+ else if(cpu2_sem_status != SEM_LOCK_SUCCESSFUL)
+ {
+ /**
+ * To avoid looping in ProcessSingleFlashOperation(), FD_WaitForSemAvailable() should implement a mechanism to
+ * continue only when CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID is free
+ */
+ waited_sem_status = FD_WaitForSemAvailable(WAIT_FOR_SEM_BLOCK_FLASH_REQ_BY_CPU2);
+ }
+ }
+ while( ((cpu2_sem_status != SEM_LOCK_SUCCESSFUL) || (cpu1_sem_status != SEM_LOCK_SUCCESSFUL))
+ && (waited_sem_status != WAITED_SEM_BUSY) );
+
+ /**
+ * In most BLE application, the flash should not be blocked by the CPU2 longer than FLASH_TIMEOUT_VALUE (1000ms)
+ * However, it could be that for some marginal application, this time is longer.
+ * In that case either HAL_FLASHEx_Erase() or HAL_FLASH_Program() will exit with FLASH_TIMEOUT_VALUE value.
+ * This is not a failing case and there is no other way than waiting the operation to be completed.
+ * If for any reason this test is never passed, this means there is a failure in the system and there is no other
+ * way to recover than applying a device reset.
+ *
+ * Note: This code is required only when the PESD mechanism is used to protect the CPU2 timing.
+ * However, keeping that code make it compatible with the two mechanisms.
+ */
+ while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_CFGBSY));
+
+ if(waited_sem_status != WAITED_SEM_BUSY)
+ {
+ /**
+ * The flash processing has been done. It has not been checked whether it has been successful or not.
+ * The only commitment is that it is possible to request a new flash processing
+ */
+ return_status = SINGLE_FLASH_OPERATION_DONE;
+ }
+ else
+ {
+ /**
+ * The flash processing has not been executed due to timing protection from either the CPU1 or the CPU2.
+ * This status is reported up to the user that should retry after checking that each CPU do not
+ * protect its timing anymore.
+ */
+ return_status = SINGLE_FLASH_OPERATION_NOT_EXECUTED;
+ }
+
+ return return_status;
+}
+
+/*************************************************************
+ *
+ * WEAK FUNCTIONS
+ *
+ *************************************************************/
+__WEAK WaitedSemStatus_t FD_WaitForSemAvailable(WaitedSemId_t WaitedSemId)
+{
+ /**
+ * The timing protection is enabled by either CPU1 or CPU2. It should be decided here if the driver shall
+ * keep trying to erase/write the flash until successful or if it shall exit ans report to the user that the action
+ * has not been executed.
+ * WAITED_SEM_BUSY returns to the user
+ * WAITED_SEM_FREE keep looping in the driver until the action is executed. This will result in the current tack looping
+ * until this is done. In a bare metal implementation, only the code within interrupt handler can be executed. With an OS,
+ * only task with higher priority can be processed
+ *
+ */
+ return WAITED_SEM_BUSY;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..e0e4fcb5d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_uart.c
new file mode 100644
index 000000000..ce910235c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/main.c
new file mode 100644
index 000000000..fffe89652
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/main.c
@@ -0,0 +1,623 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief BLE application with BLE core
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Stack_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+#include "app_common.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+
+RTC_HandleTypeDef hrtc;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+/* USER CODE BEGIN PFP */
+void PeriphClock_Config(void);
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Reset_BackupDomain( void );
+static void Init_Exti( void );
+static void Config_HSE(void);
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+ Reset_Device();
+ Config_HSE();
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Init code for STM32_WPAN */
+ APPE_Init();
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while(1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ HAL_PWR_EnableBkUpAccess();
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN LPUART1_Init 0 */
+
+ /* USER CODE END LPUART1_Init 0 */
+
+ /* USER CODE BEGIN LPUART1_Init 1 */
+
+ /* USER CODE END LPUART1_Init 1 */
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN LPUART1_Init 2 */
+
+ /* USER CODE END LPUART1_Init 2 */
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART1_Init 0 */
+
+ /* USER CODE END USART1_Init 0 */
+
+ /* USER CODE BEGIN USART1_Init 1 */
+
+ /* USER CODE END USART1_Init 1 */
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART1_Init 2 */
+
+ /* USER CODE END USART1_Init 2 */
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+ /* USER CODE BEGIN RF_Init 0 */
+
+ /* USER CODE END RF_Init 0 */
+
+ /* USER CODE BEGIN RF_Init 1 */
+
+ /* USER CODE END RF_Init 1 */
+ /* USER CODE BEGIN RF_Init 2 */
+
+ /* USER CODE END RF_Init 2 */
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+ /* USER CODE BEGIN RTC_Init 0 */
+
+ /* USER CODE END RTC_Init 0 */
+
+ /* USER CODE BEGIN RTC_Init 1 */
+
+ /* USER CODE END RTC_Init 1 */
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+ __HAL_RCC_DMA2_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+/* USER CODE END 4 */
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..0fd13443f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,333 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* USER CODE BEGIN MspInit 1 */
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 15, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ PA6 ------> LPUART1_CTS
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_DMAMUX1_CH1_EVT;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_NO_EVENT;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = DISABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_lpuart1_tx, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ PA6 ------> LPUART1_CTS
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+ HAL_RTCEx_EnableBypassShadow(hrtc);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..14f005825
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,320 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+extern UART_HandleTypeDef hlpuart1;
+extern UART_HandleTypeDef huart1;
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles DMA1 channel4 global interrupt.
+ */
+void DMA1_Channel4_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel4_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA2 channel4 global interrupt.
+ */
+void DMA2_Channel4_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 0 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewd
new file mode 100644
index 000000000..6645ec409
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_RfWithFlash</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewp
new file mode 100644
index 000000000..84a839367
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/BLE_RfWithFlash.ewp
@@ -0,0 +1,1253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_RfWithFlash</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>BLE_RfWithFlash\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>BLE_RfWithFlash\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>BLE_RfWithFlash\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/ble</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/ble/core</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>BLE_RfWithFlash.hex</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>BLE_RfWithFlash.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_debug.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\flash_driver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\p2p_server_app.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_ipcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gatt_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hal_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hci_le.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_l2cap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template\osal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\p2p_stm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/Project.eww
new file mode 100644
index 000000000..4a9a32773
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_RfWithFlash.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..5f36da686
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvoptx
new file mode 100644
index 000000000..c94657b72
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvoptx
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+ <Target>
+ <TargetName>BLE_RfWithFlash</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath />
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>0</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <nTsel>13</nTsel>
+ <sDll />
+ <sDllPa />
+ <sDlgDll />
+ <sDlgPa />
+ <sIfile />
+ <tDll />
+ <tDllPa />
+ <tDlgDll />
+ <tDlgPa />
+ <tIfile />
+ <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ST-LINKIII-KEIL_SWO</Key>
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RG$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key />
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RG$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable />
+ <LintConfigFile />
+ </TargetOption>
+ </Target>
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvprojx
new file mode 100644
index 000000000..4332cffc3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/BLE_RfWithFlash.uvprojx
@@ -0,0 +1,746 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="project_proj.xsd">
+
+ <SchemaVersion>1.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>BLE_RfWithFlash</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
+ <FlashUtilSpec/>
+ <StartupFile/>
+ <FlashDriverDll/>
+ <DeviceId/>
+ <RegisterFile/>
+ <MemoryEnv/>
+ <Cmp/>
+ <Asm/>
+ <Linker/>
+ <OHString/>
+ <InfinionOptionDll/>
+ <SLE66CMisc/>
+ <SLE66AMisc/>
+ <SLE66LinkerMisc/>
+ <SFDFile/>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath/>
+ <IncludePath/>
+ <LibPath/>
+ <RegisterFilePath/>
+ <DBRegisterFilePath/>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>BLE_RfWithFlash\Exe\</OutputDirectory>
+ <OutputName>BLE_RfWithFlash</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>1</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath>BLE_RfWithFlash/List</ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString/>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument/>
+ <IncludeLibraryModules/>
+ <ComprImg/>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ <Simulator>
+ <UseSimulator>0</UseSimulator>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>1</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+ <RestoreSysVw>1</RestoreSysVw>
+ </Simulator>
+ <Target>
+ <UseTarget>1</UseTarget>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>0</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <RestoreTracepoints>1</RestoreTracepoints>
+ <RestoreSysVw>1</RestoreSysVw>
+ </Target>
+ <RunDebugAfterBuild>0</RunDebugAfterBuild>
+ <TargetSelection>13</TargetSelection>
+ <SimDlls>
+ <CpuDll/>
+ <CpuDllArguments/>
+ <PeripheralDll/>
+ <PeripheralDllArguments/>
+ <InitializationFile/>
+ </SimDlls>
+ <TargetDlls>
+ <CpuDll/>
+ <CpuDllArguments/>
+ <PeripheralDll/>
+ <PeripheralDllArguments/>
+ <InitializationFile/>
+ <Driver>STLink\ST-LINKIII-KEIL_SWO.dll</Driver>
+ </TargetDlls>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4107</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
+ <Flash3/>
+ <Flash4/>
+ <pFcarmOut/>
+ <pFcarmGrp/>
+ <pFcArmRoot/>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName/>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress/>
+ <Size/>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress/>
+ <Size/>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress/>
+ <Size/>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress/>
+ <Size/>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector/>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <useXO>0</useXO>
+ <VariousControls>
+ <MiscControls>--diag_suppress 1296 </MiscControls>
+ <Define>USE_STM32WBXX_NUCLEO,USE_HAL_DRIVER,STM32WB55xx</Define>
+ <Undefine/>
+ <IncludePath>../Core/Inc;../STM32_WPAN/App;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN/ble;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template;../../../../../../Middlewares/ST/STM32_WPAN/ble/core;../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <VariousControls>
+ <MiscControls/>
+ <Define/>
+ <Undefine/>
+ <IncludePath/>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase/>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs/>
+ <IncludeLibsPath/>
+ <Misc/>
+ <LinkerInputFile/>
+ <DisabledWarnings/>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>app_debug.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_debug.c</FilePath>
+ </File>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>flash_driver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/flash_driver.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_msp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_hal_msp.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/App</GroupName>
+ <Files>
+ <File>
+ <FileName>app_ble.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/App/app_ble.c</FilePath>
+ </File>
+ <File>
+ <FileName>p2p_server_app.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/App/p2p_server_app.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/Target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/Target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_nucleo.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <Files>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_hsem.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN</GroupName>
+ <Files>
+ <File>
+ <FileName>hci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ <File>
+ <FileName>osal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</FilePath>
+ </File>
+ <File>
+ <FileName>svc_ctl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</FilePath>
+ </File>
+ <File>
+ <FileName>p2p_stm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/p2p_stm.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_gap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_gatt_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hal_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hci_le.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_l2cap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>hci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+
+ </Target>
+ </Targets>
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.3.0" condition="CMSIS Core">
+ <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.5.0"/>
+ <targetInfos>
+ <targetInfo name="BLE_RfWithFlash"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+</Project> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..62481a1ff
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1491 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.c
+ * @author MCD Application Team
+ * @brief BLE Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+
+#include "stm32_seq.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+#include "p2p_server_app.h"
+
+#include "flash_driver.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ FLASH_PROCESS_FINISHED,
+ FLASH_PROCESS_STARTED,
+}FlashProcessStatus_t;
+
+typedef enum
+{
+ FLASH_ERASE_REQ,
+ FLASH_WRITE_REQ,
+}FlashOperationReq_t;
+
+typedef enum
+{
+ DISABLED,
+ ENABLED,
+}TimingProtectionStatus_t;
+
+/**
+ * security parameters structure
+ */
+typedef struct _tSecurityParams
+{
+ /**
+ * IO capability of the device
+ */
+ uint8_t ioCapability;
+
+ /**
+ * Authentication requirement of the device
+ * Man In the Middle protection required?
+ */
+ uint8_t mitm_mode;
+
+ /**
+ * bonding mode of the device
+ */
+ uint8_t bonding_mode;
+
+ /**
+ * Flag to tell whether OOB data has
+ * to be used during the pairing process
+ */
+ uint8_t OOB_Data_Present;
+
+ /**
+ * OOB data to be used in the pairing process if
+ * OOB_Data_Present is set to TRUE
+ */
+ uint8_t OOB_Data[16];
+
+ /**
+ * this variable indicates whether to use a fixed pin
+ * during the pairing process or a passkey has to be
+ * requested to the application during the pairing process
+ * 0 implies use fixed pin and 1 implies request for passkey
+ */
+ uint8_t Use_Fixed_Pin;
+
+ /**
+ * minimum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMin;
+
+ /**
+ * maximum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMax;
+
+ /**
+ * fixed pin to be used in the pairing process if
+ * Use_Fixed_Pin is set to 1
+ */
+ uint32_t Fixed_Pin;
+
+ /**
+ * this flag indicates whether the host has to initiate
+ * the security, wait for pairing or does not have any security
+ * requirements.\n
+ * 0x00 : no security required
+ * 0x01 : host should initiate security by sending the slave security
+ * request command
+ * 0x02 : host need not send the clave security request but it
+ * has to wait for paiirng to complete before doing any other
+ * processing
+ */
+ uint8_t initiateSecurity;
+}tSecurityParams;
+
+/**
+ * global context
+ * contains the variables common to all
+ * services
+ */
+typedef struct _tBLEProfileGlobalContext
+{
+
+ /**
+ * security requirements of the host
+ */
+ tSecurityParams bleSecurityParam;
+
+ /**
+ * gap service handle
+ */
+ uint16_t gapServiceHandle;
+
+ /**
+ * device name characteristic handle
+ */
+ uint16_t devNameCharHandle;
+
+ /**
+ * appearance characteristic handle
+ */
+ uint16_t appearanceCharHandle;
+
+ /**
+ * connection handle of the current active connection
+ * When not in connection, the handle is set to 0xFFFF
+ */
+ uint16_t connectionHandle;
+
+ /**
+ * length of the UUID list to be used while advertising
+ */
+ uint8_t advtServUUIDlen;
+
+ /**
+ * the UUID list to be used while advertising
+ */
+ uint8_t advtServUUID[100];
+
+}BleGlobalContext_t;
+
+typedef struct
+{
+ BleGlobalContext_t BleApplicationContext_legacy;
+ APP_BLE_ConnStatus_t Device_Connection_Status;
+ /**
+ * ID of the Advertising Timeout
+ */
+ uint8_t Advertising_mgr_timer_Id;
+
+ uint8_t SwitchOffGPIO_timer_Id;
+}BleApplicationContext_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define APPBLE_GAP_DEVICE_NAME_LENGTH 7
+#define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
+#define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
+
+#define BD_ADDR_SIZE_LOCAL 6
+
+#define FLASH_SECTOR_SIZE (4) /* a sector on stm32wb55xx is 4K bytes */
+
+/* USER CODE BEGIN PD */
+#define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
+
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+ {
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+ };
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+/**
+ * Identity root key used to derive LTK and CSRK
+ */
+static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
+
+/**
+ * Encryption root key used to derive LTK and CSRK
+ */
+static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
+
+/**
+ * These are the two tags used to manage a power failure during OTA
+ * The MagicKeywordAdress shall be mapped @0x140 from start of the binary image
+ * The MagicKeywordvalue is checked in the ble_ota application
+ */
+PLACE_IN_SECTION("TAG_OTA_END") const uint32_t MagicKeywordValue = 0x94448A29 ;
+PLACE_IN_SECTION("TAG_OTA_START") const uint32_t MagicKeywordAddress = (uint32_t)&MagicKeywordValue;
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static uint16_t AdvIntervalMin, AdvIntervalMax;
+
+P2PS_APP_ConnHandle_Not_evt_t handleNotification;
+
+#if L2CAP_REQUEST_NEW_CONN_PARAM != 0
+#define SIZE_TAB_CONN_INT 2
+float tab_conn_interval[SIZE_TAB_CONN_INT] = {50, 1000} ; /* ms */
+uint8_t index_con_int, mutex;
+#endif
+
+/**
+ * Advertising Data
+ */
+#if (P2P_SERVER1 != 0)
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME ,'P','2','P','S','R','V','1'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ CFG_DEV_ID_P2P_SERVER1 /* STM32WB - P2P Server 1*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+};
+#endif
+/**
+ * Advertising Data
+ */
+#if (P2P_SERVER2 != 0)
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME, 'P', '2', 'P', 'S', 'R', 'V', '2'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ CFG_DEV_ID_P2P_SERVER2 /* STM32WB - P2P Server 2*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+};
+
+#endif
+
+#if (P2P_SERVER3 != 0)
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME, 'P', '2', 'P', 'S', 'R', 'V', '3'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ CFG_DEV_ID_P2P_SERVER3 /* STM32WB - P2P Server 3*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+};
+#endif
+
+#if (P2P_SERVER4 != 0)
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME, 'P', '2', 'P', 'S', 'R', 'V', '4'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ CFG_DEV_ID_P2P_SERVER4 /* STM32WB - P2P Server 4*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+};
+#endif
+
+#if (P2P_SERVER5 != 0)
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME, 'P', '2', 'P', 'S', 'R', 'V', '5'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ CFG_DEV_ID_P2P_SERVER5 /* STM32WB - P2P Server 5*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+};
+#endif
+
+#if (P2P_SERVER6 != 0)
+static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME, 'P', '2', 'P', 'S', 'R', 'V', '6'};
+uint8_t manuf_data[14] = {
+ sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
+ 0x01/*SKD version */,
+ CFG_DEV_ID_P2P_SERVER6 /* STM32WB - P2P Server 1*/,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP A Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00 /* GROUP B Feature */,
+ 0x00, /* BLE MAC start -MSB */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00, /* BLE MAC stop */
+};
+#endif
+
+uint32_t NbrOfSectorToBeErased;
+uint32_t NbrOfDataToBeWritten;
+FlashProcessStatus_t FlashProcessStatus;
+FlashOperationReq_t FlashOperationReq;
+TimingProtectionStatus_t TimingProtectionStatus;
+uint64_t FlashDataToWriteTab[CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+static void BLE_UserEvtRx( void * pPayload );
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
+static void Ble_Tl_Init( void );
+static void Ble_Hci_Gap_Gatt_Init(void);
+static const uint8_t* BleGetBdAddress( void );
+static void Adv_Request( APP_BLE_ConnStatus_t New_Status );
+static void Adv_Cancel( void );
+static void Adv_Cancel_Req( void );
+static void Switch_OFF_GPIO( void );
+#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
+static void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle);
+static void Connection_Interval_Update_Req( void );
+#endif
+static void FlashOperationProc( void );
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+ uint32_t loop;
+ /* USER CODE BEGIN APP_BLE_Init_1 */
+
+ /* USER CODE END APP_BLE_Init_1 */
+ SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet =
+ {
+ {{0,0,0}}, /**< Header unused */
+ {0, /** pBleBufferAddress not used */
+ 0, /** BleBufferSize not used */
+ CFG_BLE_NUM_GATT_ATTRIBUTES,
+ CFG_BLE_NUM_GATT_SERVICES,
+ CFG_BLE_ATT_VALUE_ARRAY_SIZE,
+ CFG_BLE_NUM_LINK,
+ CFG_BLE_DATA_LENGTH_EXTENSION,
+ CFG_BLE_PREPARE_WRITE_LIST_SIZE,
+ CFG_BLE_MBLOCK_COUNT,
+ CFG_BLE_MAX_ATT_MTU,
+ CFG_BLE_SLAVE_SCA,
+ CFG_BLE_MASTER_SCA,
+ CFG_BLE_LSE_SOURCE,
+ CFG_BLE_MAX_CONN_EVENT_LENGTH,
+ CFG_BLE_HSE_STARTUP_TIME,
+ CFG_BLE_VITERBI_MODE,
+ CFG_BLE_LL_ONLY,
+ 0}
+ };
+
+ /**
+ * Initialize Ble Transport Layer
+ */
+ Ble_Tl_Init( );
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+
+ /**
+ * Register the hci transport layer to handle BLE User Asynchronous Events
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, hci_user_evt_proc);
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ /**
+ * Initialization of HCI & GATT & GAP layer
+ */
+ Ble_Hci_Gap_Gatt_Init();
+
+ /**
+ * Initialization of the BLE Services
+ */
+ SVCCTL_Init();
+
+ /**
+ * Initialization of the BLE App Context
+ */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
+ /**
+ * From here, all initialization are BLE application specific
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_CONN_UPDATE_REG_ID, UTIL_SEQ_RFU, Connection_Interval_Update_Req);
+#endif
+
+ /******************** START FLASH TEST SPECIFIC INITIALIZATION *************************/
+ NbrOfSectorToBeErased = CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS;
+ NbrOfDataToBeWritten = CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512;
+ FlashProcessStatus = FLASH_PROCESS_FINISHED;
+ FlashOperationReq = FLASH_ERASE_REQ;
+ TimingProtectionStatus = DISABLED;
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_FLASH_OPERATION_REQ_ID, UTIL_SEQ_RFU, FlashOperationProc);
+ /* Select which mechanism is used by CPU2 to protect its timing versus flash operation */
+ SHCI_C2_SetFlashActivityControl(FLASH_ACTIVITY_CONTROL_SEM7);
+
+ /* Fill the table */
+ for(loop = 0; loop < (CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512) ; loop++)
+ {
+ FlashDataToWriteTab[loop] = loop;
+ }
+
+ /**
+ * The error flag shall be cleared before moving forward
+ */
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
+
+ /******************** END FLASH TEST SPECIFIC INITIALIZATION ***************************/
+
+ /**
+ * Initialization of ADV - Ad Manufacturer Element - Support OTA Bit Mask
+ */
+#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
+ manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
+#endif
+#if(RADIO_ACTIVITY_EVENT != 0)
+ aci_hal_set_radio_activity_mask(0x0006);
+#endif
+
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ index_con_int = 0;
+ mutex = 1;
+#endif
+ /**
+ * Initialize P2P Server Application
+ */
+ P2PS_APP_Init();
+
+ /**
+ * Create timer to handle the Advertising Stop
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(BleApplicationContext.Advertising_mgr_timer_Id), hw_ts_SingleShot, Adv_Cancel_Req);
+ /**
+ * Create timer to handle the Led Switch OFF
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(BleApplicationContext.SwitchOffGPIO_timer_Id), hw_ts_SingleShot, Switch_OFF_GPIO);
+
+ /**
+ * Make device discoverable
+ */
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID[0] = NULL;
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen = 0;
+
+ /* Initialize intervals for reconnexion without intervals update */
+ AdvIntervalMin = CFG_FAST_CONN_ADV_INTERVAL_MIN;
+ AdvIntervalMax = CFG_FAST_CONN_ADV_INTERVAL_MAX;
+
+ /**
+ * Start to Advertise to be connected by P2P Client
+ */
+ Adv_Request(APP_BLE_FAST_ADV);
+
+ /* USER CODE BEGIN APP_BLE_Init_2 */
+
+ /* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
+{
+ hci_event_pckt *event_pckt;
+ evt_le_meta_event *meta_evt;
+ evt_blue_aci *blue_evt;
+ hci_le_phy_update_complete_event_rp0 *evt_le_phy_update_complete;
+ uint8_t TX_PHY, RX_PHY;
+ tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
+
+ event_pckt = (hci_event_pckt*) ((hci_uart_pckt *) pckt)->data;
+
+ switch (event_pckt->evt)
+ {
+ case EVT_DISCONN_COMPLETE:
+ {
+ hci_disconnection_complete_event_rp0 *disconnection_complete_event;
+ disconnection_complete_event = (hci_disconnection_complete_event_rp0 *) event_pckt->data;
+
+ if (disconnection_complete_event->Connection_Handle == BleApplicationContext.BleApplicationContext_legacy.connectionHandle)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0;
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+
+ APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT \n");
+ }
+
+ /* restart advertising */
+ Adv_Request(APP_BLE_FAST_ADV);
+ /*
+ * SPECIFIC to P2P Server APP
+ */
+ handleNotification.P2P_Evt_Opcode = PEER_DISCON_HANDLE_EVT;
+ handleNotification.ConnectionHandle = BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ P2PS_APP_Notification(&handleNotification);
+ /* USER CODE BEGIN EVT_DISCONN_COMPLETE */
+
+ /* USER CODE END EVT_DISCONN_COMPLETE */
+ }
+
+ break; /* EVT_DISCONN_COMPLETE */
+
+ case EVT_LE_META_EVENT:
+ {
+ meta_evt = (evt_le_meta_event*) event_pckt->data;
+ /* USER CODE BEGIN EVT_LE_META_EVENT */
+
+ /* USER CODE END EVT_LE_META_EVENT */
+ switch (meta_evt->subevent)
+ {
+ case EVT_LE_CONN_UPDATE_COMPLETE:
+ APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \n");
+
+ /* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
+
+ /* USER CODE END EVT_LE_CONN_UPDATE_COMPLETE */
+ break;
+ case EVT_LE_PHY_UPDATE_COMPLETE:
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE \n");
+ evt_le_phy_update_complete = (hci_le_phy_update_complete_event_rp0*)meta_evt->data;
+ if (evt_le_phy_update_complete->Status == 0)
+ {
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status ok \n");
+ }
+ else
+ {
+ APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \n");
+ }
+
+ ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Read_PHY success \n");
+
+ if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ else
+ {
+ APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
+ }
+ }
+ else
+ {
+ APP_DBG_MSG("Read conf not succeess \n");
+ }
+ /* USER CODE BEGIN EVT_LE_PHY_UPDATE_COMPLETE */
+
+ /* USER CODE END EVT_LE_PHY_UPDATE_COMPLETE */
+ break;
+ case EVT_LE_CONN_COMPLETE:
+ {
+ hci_le_connection_complete_event_rp0 *connection_complete_event;
+
+ /**
+ * The connection is done, there is no need anymore to schedule the LP ADV
+ */
+ connection_complete_event = (hci_le_connection_complete_event_rp0 *) meta_evt->data;
+
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+
+ APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\n", connection_complete_event->Connection_Handle);
+ if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
+ {
+ /* Connection as client */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
+ }
+ else
+ {
+ /* Connection as server */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
+ }
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = connection_complete_event->Connection_Handle;
+ /*
+ * SPECIFIC to P2P Server APP
+ */
+ handleNotification.P2P_Evt_Opcode = PEER_CONN_HANDLE_EVT;
+ handleNotification.ConnectionHandle = BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ P2PS_APP_Notification(&handleNotification);
+ /* USER CODE BEGIN HCI_EVT_LE_CONN_COMPLETE */
+ /*
+ * SPECIFIC to P2P Server APP
+ */
+ handleNotification.P2P_Evt_Opcode = PEER_CONN_HANDLE_EVT;
+ handleNotification.ConnectionHandle = BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
+ P2PS_APP_Notification(&handleNotification);
+ /**/
+ /* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
+ }
+ break; /* HCI_EVT_LE_CONN_COMPLETE */
+
+ default:
+ /* USER CODE BEGIN SUBEVENT_DEFAULT */
+
+ /* USER CODE END SUBEVENT_DEFAULT */
+ break;
+ }
+ }
+ break; /* HCI_EVT_LE_META_EVENT */
+
+ case EVT_VENDOR:
+ blue_evt = (evt_blue_aci*) event_pckt->data;
+ /* USER CODE BEGIN EVT_VENDOR */
+
+ /* USER CODE END EVT_VENDOR */
+ switch (blue_evt->ecode)
+ {
+ /* USER CODE BEGIN ecode */
+ aci_gap_pairing_complete_event_rp0 *pairing_complete;
+
+ case EVT_BLUE_GAP_LIMITED_DISCOVERABLE:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_LIMITED_DISCOVERABLE \n");
+ break; /* EVT_BLUE_GAP_LIMITED_DISCOVERABLE */
+ case EVT_BLUE_GAP_PASS_KEY_REQUEST:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PASS_KEY_REQUEST \n");
+ /*
+ aci_gap_pass_key_resp(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,123456);
+ */
+ APP_DBG_MSG("\r\n\r** aci_gap_pass_key_resp \n");
+ break; /* EVT_BLUE_GAP_PASS_KEY_REQUEST */
+ case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_AUTHORIZATION_REQUEST \n");
+ break; /* EVT_BLUE_GAP_AUTHORIZATION_REQUEST */
+ case EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \n");
+ break; /* EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
+ case EVT_BLUE_GAP_BOND_LOST:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_BOND_LOST \n");
+ aci_gap_allow_rebond(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
+ APP_DBG_MSG("\r\n\r** Send allow rebond \n");
+ break; /* EVT_BLUE_GAP_BOND_LOST */
+ case EVT_BLUE_GAP_DEVICE_FOUND:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
+ break; /* EVT_BLUE_GAP_DEVICE_FOUND */
+ case EVT_BLUE_GAP_ADDR_NOT_RESOLVED:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \n");
+ break; /* EVT_BLUE_GAP_DEVICE_FOUND */
+ case (EVT_BLUE_GAP_KEYPRESS_NOTIFICATION):
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_KEYPRESS_NOTIFICATION \n");
+ break; /* EVT_BLUE_GAP_KEY_PRESS_NOTIFICATION */
+ case (EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE):
+ APP_DBG_MSG("numeric_value = %ld\n",
+ ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
+
+ APP_DBG_MSG("Hex_value = %lx\n",
+ ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
+
+ aci_gap_numeric_comparison_value_confirm_yesno(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, 1); /* CONFIRM_YES = 1 */
+
+ APP_DBG_MSG("\r\n\r** aci_gap_numeric_comparison_value_confirm_yesno-->YES \n");
+ break;
+ case (EVT_BLUE_GAP_PAIRING_CMPLT):
+ {
+ pairing_complete = (aci_gap_pairing_complete_event_rp0*)blue_evt->data;
+ APP_DBG_MSG("BLE_CTRL_App_Notification: EVT_BLUE_GAP_PAIRING_CMPLT, pairing_complete->Status = %d\n",pairing_complete->Status);
+ if (pairing_complete->Status == 0)
+ {
+ APP_DBG_MSG("\r\n\r** Pairing OK \n");
+ }
+ else
+ {
+ APP_DBG_MSG("\r\n\r** Pairing KO \n");
+ }
+ }
+ break;
+ /* USER CODE END ecode */
+ /*
+ * SPECIFIC to P2P Server APP
+ */
+ case EVT_BLUE_L2CAP_CONNECTION_UPDATE_RESP:
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ mutex = 1;
+#endif
+ /* USER CODE BEGIN EVT_BLUE_L2CAP_CONNECTION_UPDATE_RESP */
+
+ /* USER CODE END EVT_BLUE_L2CAP_CONNECTION_UPDATE_RESP */
+ break;
+ case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
+ APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PROCEDURE_COMPLETE \n");
+ /* USER CODE BEGIN EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+
+ /* USER CODE END EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+#if(RADIO_ACTIVITY_EVENT != 0)
+ case ACI_HAL_END_OF_RADIO_ACTIVITY_VSEVT_CODE:
+ /* USER CODE BEGIN RADIO_ACTIVITY_EVENT*/
+ BSP_LED_On(LED_GREEN);
+ HW_TS_Start(BleApplicationContext.SwitchOffGPIO_timer_Id, (uint32_t)LED_ON_TIMEOUT);
+ /* USER CODE END RADIO_ACTIVITY_EVENT*/
+ break; /* RADIO_ACTIVITY_EVENT */
+#endif
+ }
+ break; /* EVT_VENDOR */
+
+ default:
+ /* USER CODE BEGIN ECODE_DEFAULT*/
+
+ /* USER CODE END ECODE_DEFAULT*/
+ break;
+ }
+
+ return (SVCCTL_UserEvtFlowEnable);
+}
+
+APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void)
+{
+ return BleApplicationContext.Device_Connection_Status;
+}
+
+static void FlashOperationProc( void )
+{
+ uint32_t first_secure_sector_idx;
+ uint32_t loop1, loop2;
+ uint64_t * p_data_flash;
+
+ /**
+ * The test is alternatively erasing/writing the last CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS sectors on each SW3 button action
+ * On the first button SW3 action, it erases all sectors
+ * On the next button SW3 action, it writes all sectors
+ * Etc...
+ */
+
+ /* Erase/Write in the last CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS sectors */
+ first_secure_sector_idx = (READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos);
+
+ if(FlashOperationReq == FLASH_ERASE_REQ)
+ {
+ if(FlashProcessStatus == FLASH_PROCESS_FINISHED)
+ {
+ APP_DBG_MSG("\r\n\rSTART ERASING ALL SECTORS FROM %ld TO %ld\n", first_secure_sector_idx-CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS, first_secure_sector_idx-1);
+ FlashProcessStatus = FLASH_PROCESS_STARTED;
+ }
+
+ NbrOfSectorToBeErased = FD_EraseSectors(first_secure_sector_idx-NbrOfSectorToBeErased, NbrOfSectorToBeErased);
+
+ if(NbrOfSectorToBeErased == 0)
+ {
+ FlashOperationReq = FLASH_WRITE_REQ;
+ FlashProcessStatus = FLASH_PROCESS_FINISHED;
+ NbrOfSectorToBeErased = CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS;
+
+ /****************** START TEST RESULT CHECK *********************************/
+ /* Check all sectors have been erased */
+ for(loop1 = 0; loop1 < CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS; loop1++)
+ {
+ p_data_flash = (uint64_t*)(FLASH_BASE + ((loop1 + first_secure_sector_idx - CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS)*FLASH_SECTOR_SIZE*1024));
+
+ /* Check all data in the current sector have been erased */
+ for(loop2 = 0; loop2 < (FLASH_SECTOR_SIZE*128); loop2++)
+ {
+ if((*p_data_flash) != (uint64_t)0xFFFFFFFFFFFFFFFF)
+ {
+ APP_DBG_MSG("\r\n\rERROR AT ADDRESS 0x%08lX \n", (uint32_t)p_data_flash);
+ BSP_LED_On(LED_RED);
+ /* Stop here code execution */
+ while(1);
+ }
+ p_data_flash++;
+ }
+ }
+ /****************** END TEST RESULT CHECK ***********************************/
+ APP_DBG_MSG("\r\n\rALL SECTORS FROM %ld TO %ld HAVE BEEN SUCCESSFULLY ERASED\n", first_secure_sector_idx-CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS, first_secure_sector_idx-1);
+ }
+ else
+ {
+ /**
+ * There are still sectors to be erased
+ * Request the background to run one more time the task
+ */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_FLASH_OPERATION_REQ_ID, CFG_SCH_PRIO_0);
+ }
+ }
+ else
+ {
+ if(FlashProcessStatus == FLASH_PROCESS_FINISHED)
+ {
+ APP_DBG_MSG("\r\n\rSTART WRITING ALL SECTORS FROM %ld TO %ld\n", first_secure_sector_idx-CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS, first_secure_sector_idx-1);
+ FlashProcessStatus = FLASH_PROCESS_STARTED;
+ }
+
+ NbrOfDataToBeWritten = FD_WriteData(FLASH_BASE
+ + ((first_secure_sector_idx - CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS)*FLASH_SECTOR_SIZE*1024)
+ + (((CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512) - NbrOfDataToBeWritten)*8),
+ FlashDataToWriteTab + (CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512) - NbrOfDataToBeWritten,
+ NbrOfDataToBeWritten);
+
+ if(NbrOfDataToBeWritten == 0)
+ {
+ FlashOperationReq = FLASH_ERASE_REQ;
+ FlashProcessStatus = FLASH_PROCESS_FINISHED;
+ NbrOfDataToBeWritten = CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512;
+
+ /****************** START TEST RESULT CHECK *********************************/
+ /* Check all sectors have been written */
+ p_data_flash = (uint64_t*)(FLASH_BASE + ((first_secure_sector_idx - CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS)*FLASH_SECTOR_SIZE*1024));
+ for(loop1 = 0; loop1 < (CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS*512); loop1++)
+ {
+ if((*p_data_flash) != FlashDataToWriteTab[loop1])
+ {
+ APP_DBG_MSG("\r\n\rERROR AT ADDRESS 0x%08lX \n", (uint32_t)p_data_flash);
+ BSP_LED_On(LED_RED);
+ /* Stop here code execution */
+ while(1);
+ }
+ p_data_flash++;
+ }
+ /****************** END TEST RESULT CHECK ***********************************/
+
+ APP_DBG_MSG("\r\n\rALL SECTORS FROM %ld TO %ld HAVE BEEN SUCCESSFULLY WRITTEN\n", first_secure_sector_idx-CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS, first_secure_sector_idx-1);
+ }
+ else
+ {
+ /**
+ * There are still data to be written
+ * Request the background to run one more time the task
+ */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_FLASH_OPERATION_REQ_ID, CFG_SCH_PRIO_0);
+ }
+ }
+ return;
+}
+
+/* USER CODE BEGIN FD*/
+void APP_BLE_Key_Button1_Action(void)
+{
+ /**
+ * There are two use cases that could be demonstrated:
+ *
+ * 1/
+ * SW1 is pressed -> the notification is sent to the client and the timing protection is enabled
+ * SW3 is pressed -> the task FlashOperationProc() is polling on Sem6 until SW1 is pressed again
+ * SW1 is pressed -> the protection is disabled,
+ * the task FlashOperationProc() resume and complete the test
+ * the notification is sent to the client
+ *
+ *2/
+ * SW3 is pressed -> the task FlashOperationProc() starts running the test
+ * SW1 is pressed while FlashOperationProc() is running -> the timing protection is enabled
+ * the task FlashOperationProc() is polling on Sem6 until SW1 is pressed again
+ * SW1 is pressed -> the protection is disabled,
+ * the task FlashOperationProc() resume and complete the test
+ * the notification is sent to the client
+ * Note: although SW1 is pressed twice, only one notification is sent to the client.
+ * This is the correct behavior because the notification is not sent from the interrupt handler but from a background task.
+ * As long as the CPU is looping into FlashOperationProc(), this background task is not executed.
+ * This means that although the background task has been requested twice, it will run only once because the sequencer does not count
+ * how many times a task has been requested.
+ */
+ if(TimingProtectionStatus == DISABLED)
+ {
+ TimingProtectionStatus = ENABLED;
+ APP_DBG_MSG("\r\n\rCPU1 TIMING PROTECTION ENABLED\n");
+ LL_HSEM_1StepLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID);
+ }
+ else
+ {
+ TimingProtectionStatus = DISABLED;
+ APP_DBG_MSG("\r\n\rCPU1 TIMING PROTECTION DISABLED\n");
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID, 0);
+ }
+
+ P2PS_APP_SW1_Button_Action();
+}
+
+void APP_BLE_Key_Button2_Action(void)
+{
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_CONN_UPDATE_REG_ID, CFG_SCH_PRIO_0);
+#endif
+
+ return;
+}
+
+void APP_BLE_Key_Button3_Action(void)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_FLASH_OPERATION_REQ_ID, CFG_SCH_PRIO_0);
+}
+
+/* USER CODE END FD*/
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Ble_Tl_Init( void )
+{
+ HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
+
+ Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
+ Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
+ hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
+
+ return;
+}
+
+static void Ble_Hci_Gap_Gatt_Init(void){
+
+ uint8_t role;
+ uint8_t index;
+ uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
+ const uint8_t *bd_addr;
+ uint32_t srd_bd_addr[2];
+ uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
+
+ /**
+ * Initialize HCI layer
+ */
+ /*HCI Reset to synchronise BLE Stack*/
+ hci_reset();
+
+ /**
+ * Write the BD Address
+ */
+
+ bd_addr = BleGetBdAddress();
+ aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
+ CONFIG_DATA_PUBADDR_LEN,
+ (uint8_t*) bd_addr);
+
+ /* BLE MAC in ADV Packet */
+ manuf_data[ sizeof(manuf_data)-6] = bd_addr[5];
+ manuf_data[ sizeof(manuf_data)-5] = bd_addr[4];
+ manuf_data[ sizeof(manuf_data)-4] = bd_addr[3];
+ manuf_data[ sizeof(manuf_data)-3] = bd_addr[2];
+ manuf_data[ sizeof(manuf_data)-2] = bd_addr[1];
+ manuf_data[ sizeof(manuf_data)-1] = bd_addr[0];
+
+ /**
+ * Static random Address
+ * The two upper bits shall be set to 1
+ * The lowest 32bits is read from the UDN to differentiate between devices
+ * The RNG may be used to provide a random number on each power on
+ */
+ srd_bd_addr[1] = 0x0000ED6E;
+ srd_bd_addr[0] = LL_FLASH_GetUDN( );
+ aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
+
+ /**
+ * Set TX Power to 0dBm.
+ */
+ aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+
+ /**
+ * Initialize GATT interface
+ */
+ aci_gatt_init();
+
+ /**
+ * Initialize GAP interface
+ */
+ role = 0;
+
+#if (BLE_CFG_PERIPHERAL == 1)
+ role |= GAP_PERIPHERAL_ROLE;
+#endif
+
+#if (BLE_CFG_CENTRAL == 1)
+ role |= GAP_CENTRAL_ROLE;
+#endif
+
+ if (role > 0)
+ {
+ const char *name = "P2PSRV1";
+ aci_gap_init(role, 0,
+ APPBLE_GAP_DEVICE_NAME_LENGTH,
+ &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
+
+ if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
+ {
+ BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
+ }
+ }
+
+ if(aci_gatt_update_char_value(gap_service_handle,
+ gap_appearance_char_handle,
+ 0,
+ 2,
+ (uint8_t *)&appearance))
+ {
+ BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
+ }
+ /**
+ * Initialize Default PHY
+ */
+ hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
+
+ /**
+ * Initialize IO capability
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
+ aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
+
+ /**
+ * Initialize authentication
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = 0;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = CFG_ENCRYPTION_KEY_SIZE_MIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = CFG_ENCRYPTION_KEY_SIZE_MAX;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = CFG_USED_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = CFG_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = CFG_BONDING_MODE;
+ for (index = 0; index < 16; index++)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
+ }
+
+ aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
+ CFG_SC_SUPPORT,
+ CFG_KEYPRESS_NOTIFICATION_SUPPORT,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
+ PUBLIC_ADDR
+ );
+
+ /**
+ * Initialize whitelist
+ */
+ if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
+ {
+ aci_gap_configure_whitelist();
+ }
+}
+
+static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
+{
+ tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
+ uint16_t Min_Inter, Max_Inter;
+
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ Min_Inter = AdvIntervalMin;
+ Max_Inter = AdvIntervalMax;
+ }
+ else
+ {
+ Min_Inter = CFG_LP_CONN_ADV_INTERVAL_MIN;
+ Max_Inter = CFG_LP_CONN_ADV_INTERVAL_MAX;
+ }
+
+ /**
+ * Stop the timer, it will be restarted for a new shot
+ * It does not hurt if the timer was not running
+ */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+
+ APP_DBG_MSG("First index in %d state \n", BleApplicationContext.Device_Connection_Status);
+
+ if ((New_Status == APP_BLE_LP_ADV)
+ && ((BleApplicationContext.Device_Connection_Status == APP_BLE_FAST_ADV)
+ || (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_ADV)))
+ {
+ /* Connection in ADVERTISE mode have to stop the current advertising */
+ ret = aci_gap_set_non_discoverable();
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG("Successfully Stopped Advertising \n");
+ }
+ else
+ {
+ APP_DBG_MSG("Stop Advertising Failed , result: %d \n", ret);
+ }
+ }
+
+ BleApplicationContext.Device_Connection_Status = New_Status;
+ /* Start Fast or Low Power Advertising */
+ ret = aci_gap_set_discoverable(
+ ADV_IND,
+ Min_Inter,
+ Max_Inter,
+ PUBLIC_ADDR,
+ NO_WHITE_LIST_USE, /* use white list */
+ sizeof(local_name),
+ (uint8_t*) &local_name,
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen,
+ BleApplicationContext.BleApplicationContext_legacy.advtServUUID,
+ 0,
+ 0);
+
+ /* Update Advertising data */
+ ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
+ if (ret == BLE_STATUS_SUCCESS)
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Successfully Start Fast Advertising \n" );
+ /* Start Timer to STOP ADV - TIMEOUT */
+ HW_TS_Start(BleApplicationContext.Advertising_mgr_timer_Id, INITIAL_ADV_TIMEOUT);
+ }
+ else
+ {
+ APP_DBG_MSG("Successfully Start Low Power Advertising \n");
+ }
+ }
+ else
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Start Fast Advertising Failed , result: %d \n", ret);
+ }
+ else
+ {
+ APP_DBG_MSG("Start Low Power Advertising Failed , result: %d \n", ret);
+ }
+ }
+
+ return;
+}
+
+const uint8_t* BleGetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTION */
+
+/* USER CODE END FD_LOCAL_FUNCTION */
+
+/*************************************************************
+ *
+ *SPECIFIC FUNCTIONS FOR P2P SERVER
+ *
+ *************************************************************/
+static void Adv_Cancel( void )
+{
+ /* USER CODE BEGIN Adv_Cancel_1 */
+ BSP_LED_Off(LED_GREEN);
+ /* USER CODE END Adv_Cancel_1 */
+
+ if (BleApplicationContext.Device_Connection_Status != APP_BLE_CONNECTED_SERVER)
+
+ {
+
+ tBleStatus result = 0x00;
+
+ result = aci_gap_set_non_discoverable();
+
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ if (result == BLE_STATUS_SUCCESS)
+ {
+ APP_DBG_MSG(" \r\n\r");APP_DBG_MSG("** STOP ADVERTISING ** \r\n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("** STOP ADVERTISING ** Failed \r\n\r");
+ }
+
+ }
+
+ /* USER CODE BEGIN Adv_Cancel_2 */
+
+ /* USER CODE END Adv_Cancel_2 */
+ return;
+}
+
+static void Adv_Cancel_Req( void )
+{
+ /* USER CODE BEGIN Adv_Cancel_Req_1 */
+
+ /* USER CODE END Adv_Cancel_Req_1 */
+ UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_CANCEL_ID, CFG_SCH_PRIO_0);
+ /* USER CODE BEGIN Adv_Cancel_Req_2 */
+
+ /* USER CODE END Adv_Cancel_Req_2 */
+ return;
+}
+
+static void Switch_OFF_GPIO(){
+ /* USER CODE BEGIN Switch_OFF_GPIO */
+ BSP_LED_Off(LED_GREEN);
+ /* USER CODE END Switch_OFF_GPIO */
+}
+
+#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
+void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle)
+{
+ /* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_1 */
+
+ /* USER CODE END BLE_SVC_L2CAP_Conn_Update_1 */
+ if(mutex == 1) {
+ mutex = 0;
+ index_con_int = (index_con_int + 1)%SIZE_TAB_CONN_INT;
+ uint16_t interval_min = CONN_P(tab_conn_interval[index_con_int]);
+ uint16_t interval_max = CONN_P(tab_conn_interval[index_con_int]);
+ uint16_t slave_latency = L2CAP_SLAVE_LATENCY;
+ uint16_t timeout_multiplier = L2CAP_TIMEOUT_MULTIPLIER;
+ tBleStatus result;
+
+ result = aci_l2cap_connection_parameter_update_req(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,
+ interval_min, interval_max,
+ slave_latency, timeout_multiplier);
+ if( result == BLE_STATUS_SUCCESS )
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(), Successfully \r\n\r");
+ }
+ else
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(), Failed \r\n\r");
+ }
+ }
+ /* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_2 */
+
+ /* USER CODE END BLE_SVC_L2CAP_Conn_Update_2 */
+ return;
+}
+#endif
+
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+static void Connection_Interval_Update_Req( void )
+{
+ if (BleApplicationContext.Device_Connection_Status != APP_BLE_FAST_ADV && BleApplicationContext.Device_Connection_Status != APP_BLE_IDLE)
+ {
+ BLE_SVC_L2CAP_Conn_Update(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
+ }
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
+
+/* USER CODE END FD_SPECIFIC_FUNCTIONS */
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void hci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask(1 << CFG_TASK_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void hci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void hci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+static void BLE_UserEvtRx( void * pPayload )
+{
+ SVCCTL_UserEvtFlowStatus_t svctl_return_status;
+ tHCI_UserEvtRxParam *pParam;
+
+ pParam = (tHCI_UserEvtRxParam *)pPayload;
+
+ svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
+ if (svctl_return_status != SVCCTL_UserEvtFlowDisable)
+ {
+ pParam->status = HCI_TL_UserEventFlow_Enable;
+ }
+ else
+ {
+ pParam->status = HCI_TL_UserEventFlow_Disable;
+ }
+}
+
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status )
+{
+ uint32_t task_id_list;
+ switch (status)
+ {
+ case HCI_TL_CmdBusy:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_PauseTask(task_id_list);
+
+ break;
+
+ case HCI_TL_CmdAvailable:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_ResumeTask(task_id_list);
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+void SVCCTL_ResumeUserEventFlow( void )
+{
+ hci_resume_flow();
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+#if(CFG_USE_SEQ_TO_WAIT_FOR_SEM == 1)
+WaitedSemStatus_t FD_WaitForSemAvailable(WaitedSemId_t WaitedSemId)
+{
+ if(WaitedSemId == WAIT_FOR_SEM_BLOCK_FLASH_REQ_BY_CPU1)
+ {
+ LL_HSEM_ClearFlag_C1ICR(HSEM, __HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID)); /* There is a bug in __HAL_HSEM_CLEAR_FLAG() */
+ if(LL_HSEM_GetStatus(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID))
+ {
+ APP_DBG_MSG("\r\n\rWAIT UNTILL CPU1 ALLOWS FLASH OPERATION\n");
+
+ HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID));
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_FLASH_OPER_ALLOWED);
+ HAL_HSEM_DeactivateNotification(__HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID));
+ }
+ }
+
+ if(WaitedSemId == WAIT_FOR_SEM_BLOCK_FLASH_REQ_BY_CPU2)
+ {
+ LL_HSEM_ClearFlag_C1ICR(HSEM, __HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID)); /* There is a bug in __HAL_HSEM_CLEAR_FLAG() */
+ if(LL_HSEM_GetStatus(HSEM, CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID))
+ {
+ APP_DBG_MSG("\r\n\rWAIT UNTILL CPU2 ALLOWS FLASH OPERATION\n");
+
+ HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID));
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_FLASH_OPER_ALLOWED);
+ HAL_HSEM_DeactivateNotification(__HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID));
+ }
+ }
+
+ return WAITED_SEM_FREE;
+}
+#endif
+
+void HAL_HSEM_FreeCallback(uint32_t SemMask)
+{
+ if(SemMask == __HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID))
+ {
+ UTIL_SEQ_SetEvt(1<< CFG_IDLEEVT_FLASH_OPER_ALLOWED);
+ }
+
+ if(SemMask == __HAL_HSEM_SEMID_TO_MASK(CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID))
+ {
+ UTIL_SEQ_SetEvt(1<< CFG_IDLEEVT_FLASH_OPER_ALLOWED);
+ }
+}
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..657ba432b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,88 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.h
+ * @author MCD Application Team
+ * @brief Header for ble application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_BLE_H
+#define APP_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "hci_tl.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+ typedef enum
+ {
+ APP_BLE_IDLE,
+ APP_BLE_FAST_ADV,
+ APP_BLE_LP_ADV,
+ APP_BLE_SCAN,
+ APP_BLE_LP_CONNECTING,
+ APP_BLE_CONNECTED_SERVER,
+ APP_BLE_CONNECTED_CLIENT
+ } APP_BLE_ConnStatus_t;
+
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APP_BLE_Init( void );
+
+ APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void);
+
+/* USER CODE BEGIN EF */
+void APP_BLE_Key_Button1_Action(void);
+void APP_BLE_Key_Button2_Action(void);
+void APP_BLE_Key_Button3_Action(void);
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*APP_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..bdb821276
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_conf.h
@@ -0,0 +1,70 @@
+/**
+ ******************************************************************************
+ * File Name : App/ble_conf.h
+ * Description : Configuration file for BLE Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef BLE_CONF_H
+#define BLE_CONF_H
+
+#include "app_conf.h"
+
+/******************************************************************************
+ *
+ * BLE SERVICES CONFIGURATION
+ * blesvc
+ *
+ ******************************************************************************/
+
+ /**
+ * This setting shall be set to '1' if the device needs to support the Peripheral Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_PERIPHERAL 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Central Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_CENTRAL 0
+
+/**
+ * There is one handler per service enabled
+ * Note: There is no handler for the Device Information Service
+ *
+ * This shall take into account all registered handlers
+ * (from either the provided services or the custom services)
+ */
+#define BLE_CFG_SVC_MAX_NBR_CB 1
+
+#define BLE_CFG_CLT_MAX_NBR_CB 0
+
+/******************************************************************************
+ * GAP Service - Apprearance
+ ******************************************************************************/
+
+#define BLE_CFG_UNKNOWN_APPEARANCE (0)
+#define BLE_CFG_HR_SENSOR_APPEARANCE (832)
+#define BLE_CFG_GAP_APPEARANCE (BLE_CFG_UNKNOWN_APPEARANCE)
+
+/******************************************************************************
+ * Over The Air Feature (OTA) - STM Proprietary
+ ******************************************************************************/
+#define BLE_CFG_OTA_REBOOT_CHAR 0/**< REBOOT OTA MODE CHARACTERISTIC */
+
+#endif /*BLE_CONF_H */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..926abb3f0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_dbg_conf.h
@@ -0,0 +1,199 @@
+/**
+ ******************************************************************************
+ * File Name : App/ble_dbg_conf.h
+ * Description : Debug configuration file for BLE Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_DBG_CONF_H
+#define __BLE_DBG_CONF_H
+
+/**
+ * Enable or Disable traces from BLE
+ */
+
+#define BLE_DBG_APP_EN 0
+#define BLE_DBG_DIS_EN 0
+#define BLE_DBG_HRS_EN 0
+#define BLE_DBG_SVCCTL_EN 0
+#define BLE_DBG_BLS_EN 0
+#define BLE_DBG_HTS_EN 0
+#define BLE_DBG_P2P_STM_EN 1
+
+/**
+ * Macro definition
+ */
+#if ( BLE_DBG_APP_EN != 0 )
+#define BLE_DBG_APP_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_APP_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_DIS_EN != 0 )
+#define BLE_DBG_DIS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_DIS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_HRS_EN != 0 )
+#define BLE_DBG_HRS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HRS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_P2P_STM_EN != 0 )
+#define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_TEMPLATE_STM_EN != 0 )
+#define BLE_DBG_TEMPLATE_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TEMPLATE_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_EDS_STM_EN != 0 )
+#define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_LBS_STM_EN != 0 )
+#define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_SVCCTL_EN != 0 )
+#define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_CTS_EN != 0)
+#define BLE_DBG_CTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_CTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HIDS_EN != 0)
+#define BLE_DBG_HIDS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HIDS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_PASS_EN != 0)
+#define BLE_DBG_PASS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_PASS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BLS_EN != 0)
+#define BLE_DBG_BLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HTS_EN != 0)
+#define BLE_DBG_HTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ANS_EN != 0)
+#define BLE_DBG_ANS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ANS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ESS_EN != 0)
+#define BLE_DBG_ESS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ESS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_GLS_EN != 0)
+#define BLE_DBG_GLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_GLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BAS_EN != 0)
+#define BLE_DBG_BAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_RTUS_EN != 0)
+#define BLE_DBG_RTUS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_RTUS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HPS_EN != 0)
+#define BLE_DBG_HPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_TPS_EN != 0)
+#define BLE_DBG_TPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LLS_EN != 0)
+#define BLE_DBG_LLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_IAS_EN != 0)
+#define BLE_DBG_IAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_IAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_WSS_EN != 0)
+#define BLE_DBG_WSS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_WSS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LNS_EN != 0)
+#define BLE_DBG_LNS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LNS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_SCPS_EN != 0)
+#define BLE_DBG_SCPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SCPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_DTS_EN != 0)
+#define BLE_DBG_DTS_MSG PRINT_MESG_DBG
+#define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG
+#else
+#define BLE_DBG_DTS_MSG PRINT_NO_MESG
+#define BLE_DBG_DTS_BUF PRINT_NO_MESG
+#endif
+
+#endif /*__BLE_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.c
new file mode 100644
index 000000000..5c95b3afe
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.c
@@ -0,0 +1,389 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file p2p_server_app.c
+ * @author MCD Application Team
+ * @brief peer to peer Server Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_common.h"
+#include "dbg_trace.h"
+#include "ble.h"
+#include "p2p_server_app.h"
+#include "stm32_seq.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+ typedef struct{
+ uint8_t Device_Led_Selection;
+ uint8_t Led1;
+ }P2P_LedCharValue_t;
+
+ typedef struct{
+ uint8_t Device_Button_Selection;
+ uint8_t ButtonStatus;
+ }P2P_ButtonCharValue_t;
+
+typedef struct
+{
+ uint8_t Notification_Status; /* used to chek if P2P Server is enabled to Notify */
+ P2P_LedCharValue_t LedControl;
+ P2P_ButtonCharValue_t ButtonControl;
+ uint16_t ConnectionHandle;
+} P2P_Server_App_Context_t;
+/* USER CODE END PTD */
+
+/* Private defines ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+/**
+ * START of Section BLE_APP_CONTEXT
+ */
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static P2P_Server_App_Context_t P2P_Server_App_Context;
+
+/**
+ * END of Section BLE_APP_CONTEXT
+ */
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+static void P2PS_Send_Notification(void);
+static void P2PS_APP_LED_BUTTON_context_Init(void);
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void P2PS_STM_App_Notification(P2PS_STM_App_Notification_evt_t *pNotification)
+{
+/* USER CODE BEGIN P2PS_STM_App_Notification_1 */
+
+/* USER CODE END P2PS_STM_App_Notification_1 */
+ switch(pNotification->P2P_Evt_Opcode)
+ {
+/* USER CODE BEGIN P2PS_STM_App_Notification_P2P_Evt_Opcode */
+#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
+ case P2PS_STM_BOOT_REQUEST_EVT:
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : BOOT REQUESTED\n");
+ APP_DBG_MSG(" \n\r");
+
+ *(uint32_t*)SRAM1_BASE = *(uint32_t*)pNotification->DataTransfered.pPayload;
+ NVIC_SystemReset();
+ break;
+#endif
+/* USER CODE END P2PS_STM_App_Notification_P2P_Evt_Opcode */
+
+ case P2PS_STM__NOTIFY_ENABLED_EVT:
+/* USER CODE BEGIN P2PS_STM__NOTIFY_ENABLED_EVT */
+ P2P_Server_App_Context.Notification_Status = 1;
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : NOTIFICATION ENABLED\n");
+ APP_DBG_MSG(" \n\r");
+/* USER CODE END P2PS_STM__NOTIFY_ENABLED_EVT */
+ break;
+
+ case P2PS_STM_NOTIFY_DISABLED_EVT:
+/* USER CODE BEGIN P2PS_STM_NOTIFY_DISABLED_EVT */
+ P2P_Server_App_Context.Notification_Status = 0;
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : NOTIFICATION DISABLED\n");
+ APP_DBG_MSG(" \n\r");
+/* USER CODE END P2PS_STM_NOTIFY_DISABLED_EVT */
+ break;
+
+ case P2PS_STM_WRITE_EVT:
+/* USER CODE BEGIN P2PS_STM_WRITE_EVT */
+ if(pNotification->DataTransfered.pPayload[0] == 0x00){ /* ALL Deviceselected - may be necessary as LB Routeur informs all connection */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#if(P2P_SERVER1 != 0)
+ if(pNotification->DataTransfered.pPayload[0] == 0x01){ /* end device 1 selected - may be necessary as LB Routeur informs all connection */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#endif
+#if(P2P_SERVER2 != 0)
+ if(pNotification->DataTransfered.pPayload[0] == 0x02){ /* end device 2 selected */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 2 : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 2 : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#endif
+#if(P2P_SERVER3 != 0)
+ if(pNotification->DataTransfered.pPayload[0] == 0x03){ /* end device 3 selected - may be necessary as LB Routeur informs all connection */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 3 : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 3 : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#endif
+#if(P2P_SERVER4 != 0)
+ if(pNotification->DataTransfered.pPayload[0] == 0x04){ /* end device 4 selected */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 2 : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 2 : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#endif
+#if(P2P_SERVER5 != 0)
+ if(pNotification->DataTransfered.pPayload[0] == 0x05){ /* end device 5 selected - may be necessary as LB Routeur informs all connection */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 5 : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 5 : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#endif
+#if(P2P_SERVER6 != 0)
+ if(pNotification->DataTransfered.pPayload[0] == 0x06){ /* end device 6 selected */
+ if(pNotification->DataTransfered.pPayload[1] == 0x01)
+ {
+ BSP_LED_On(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 6 : LED1 ON\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 6 : LED1 OFF\n");
+ APP_DBG_MSG(" \n\r");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ }
+#endif
+/* USER CODE END P2PS_STM_WRITE_EVT */
+ break;
+
+ default:
+/* USER CODE BEGIN P2PS_STM_App_Notification_default */
+
+/* USER CODE END P2PS_STM_App_Notification_default */
+ break;
+ }
+/* USER CODE BEGIN P2PS_STM_App_Notification_2 */
+
+/* USER CODE END P2PS_STM_App_Notification_2 */
+ return;
+}
+
+void P2PS_APP_Notification(P2PS_APP_ConnHandle_Not_evt_t *pNotification)
+{
+/* USER CODE BEGIN P2PS_APP_Notification_1 */
+
+/* USER CODE END P2PS_APP_Notification_1 */
+ switch(pNotification->P2P_Evt_Opcode)
+ {
+/* USER CODE BEGIN P2PS_APP_Notification_P2P_Evt_Opcode */
+
+/* USER CODE END P2PS_APP_Notification_P2P_Evt_Opcode */
+ case PEER_CONN_HANDLE_EVT :
+/* USER CODE BEGIN PEER_CONN_HANDLE_EVT */
+
+/* USER CODE END PEER_CONN_HANDLE_EVT */
+ break;
+
+ case PEER_DISCON_HANDLE_EVT :
+/* USER CODE BEGIN PEER_DISCON_HANDLE_EVT */
+ P2PS_APP_LED_BUTTON_context_Init();
+/* USER CODE END PEER_DISCON_HANDLE_EVT */
+ break;
+
+ default:
+/* USER CODE BEGIN P2PS_APP_Notification_default */
+
+/* USER CODE END P2PS_APP_Notification_default */
+ break;
+ }
+/* USER CODE BEGIN P2PS_APP_Notification_2 */
+
+/* USER CODE END P2PS_APP_Notification_2 */
+ return;
+}
+
+void P2PS_APP_Init(void)
+{
+/* USER CODE BEGIN P2PS_APP_Init */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SW1_BUTTON_PUSHED_ID, UTIL_SEQ_RFU, P2PS_Send_Notification );
+
+ /**
+ * Initialize LedButton Service
+ */
+ P2P_Server_App_Context.Notification_Status=0;
+ P2PS_APP_LED_BUTTON_context_Init();
+/* USER CODE END P2PS_APP_Init */
+ return;
+}
+
+/* USER CODE BEGIN FD */
+void P2PS_APP_LED_BUTTON_context_Init(void){
+
+ BSP_LED_Off(LED_BLUE);
+
+ #if(P2P_SERVER1 != 0)
+ P2P_Server_App_Context.LedControl.Device_Led_Selection=0x01; /* Device1 */
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* led OFF */
+ P2P_Server_App_Context.ButtonControl.Device_Button_Selection=0x01;/* Device1 */
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+#endif
+#if(P2P_SERVER2 != 0)
+ P2P_Server_App_Context.LedControl.Device_Led_Selection=0x02; /* Device2 */
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* led OFF */
+ P2P_Server_App_Context.ButtonControl.Device_Button_Selection=0x02;/* Device2 */
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+#endif
+#if(P2P_SERVER3 != 0)
+ P2P_Server_App_Context.LedControl.Device_Led_Selection=0x03; /* Device3 */
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* led OFF */
+ P2P_Server_App_Context.ButtonControl.Device_Button_Selection=0x03; /* Device3 */
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+#endif
+#if(P2P_SERVER4 != 0)
+ P2P_Server_App_Context.LedControl.Device_Led_Selection=0x04; /* Device4 */
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* led OFF */
+ P2P_Server_App_Context.ButtonControl.Device_Button_Selection=0x04; /* Device4 */
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+#endif
+ #if(P2P_SERVER5 != 0)
+ P2P_Server_App_Context.LedControl.Device_Led_Selection=0x05; /* Device5 */
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* led OFF */
+ P2P_Server_App_Context.ButtonControl.Device_Button_Selection=0x05; /* Device5 */
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+#endif
+#if(P2P_SERVER6 != 0)
+ P2P_Server_App_Context.LedControl.Device_Led_Selection=0x06; /* device6 */
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* led OFF */
+ P2P_Server_App_Context.ButtonControl.Device_Button_Selection=0x06; /* Device6 */
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+#endif
+}
+
+void P2PS_APP_SW1_Button_Action(void)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_SW1_BUTTON_PUSHED_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS*/
+void P2PS_Send_Notification(void)
+{
+
+ if(P2P_Server_App_Context.ButtonControl.ButtonStatus == 0x00){
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x01;
+ } else {
+ P2P_Server_App_Context.ButtonControl.ButtonStatus=0x00;
+ }
+
+ if(P2P_Server_App_Context.Notification_Status){
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : INFORM CLIENT BUTTON 1 PUSHED \n ");
+ APP_DBG_MSG(" \n\r");
+ P2PS_STM_App_Update_Char(P2P_NOTIFY_CHAR_UUID, (uint8_t *)&P2P_Server_App_Context.ButtonControl);
+ } else {
+ APP_DBG_MSG("-- P2P APPLICATION SERVER : CAN'T INFORM CLIENT - NOTIFICATION DISABLED\n ");
+ }
+
+ return;
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS*/
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.h
new file mode 100644
index 000000000..ab5aaf17e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN */
+/**
+ ******************************************************************************
+ * File Name : App/p2p_server_app.h
+ * Description : Header for p2p_server_app.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __P2P_SERVER_APP_H
+#define __P2P_SERVER_APP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+typedef enum
+{
+ PEER_CONN_HANDLE_EVT,
+ PEER_DISCON_HANDLE_EVT,
+} P2PS_APP__Opcode_Notification_evt_t;
+
+typedef struct
+{
+ P2PS_APP__Opcode_Notification_evt_t P2P_Evt_Opcode;
+ uint16_t ConnectionHandle;
+}P2PS_APP_ConnHandle_Not_evt_t;
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void P2PS_APP_Init( void );
+ void P2PS_APP_Notification( P2PS_APP_ConnHandle_Not_evt_t *pNotification );
+/* USER CODE BEGIN EF */
+ void P2PS_APP_SW1_Button_Action( void );
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__P2P_SERVER_APP_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..a58b95cad
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,519 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.cproject
new file mode 100644
index 000000000..17ef25fed
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.cproject
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2027251981">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2027251981" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2027251981" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2027251981." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.356151554" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.16957397" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1492569829" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.2018989303" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1700819301" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1047226127" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1517702867" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.2096750485" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/BLE_RfWithFlash}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1335744773" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1327804741" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1161574384" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.1606029866" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.1654222780" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1280718046" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.1123497602" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.361024237" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.965906699" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1637180489" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1134459745" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1392908752" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.405754811" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.750883363" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.2128195035" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1805106535" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.428100976" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1503388115" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.932156476" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1899297538" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
+ <option id="gnu.c.link.option.paths.1926034481" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
+ <option id="gnu.c.link.option.ldflags.914996539" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.22015823" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.2041439794" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.1214100407" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.164394613" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1141473534" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
+ <option id="gnu.cpp.link.option.paths.448193396" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
+ <option id="gnu.cpp.link.option.flags.1069361990" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.1864090745" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2004554524" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1977547180" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1463593829" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.47464960" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.938422095" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1130002564" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="BLE_RfWithFlash.fr.ac6.managedbuild.target.gnu.cross.exe.420983196" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.2027251981;fr.ac6.managedbuild.config.gnu.cross.exe.debug.2027251981.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1327804741;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.361024237">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="/BLE_RfWithFlash"/>
+ </configuration>
+ <configuration configurationName="Release"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.project
new file mode 100644
index 000000000..c6eb49636
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/.project
@@ -0,0 +1,308 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
+ <name>BLE_RfWithFlash</name>
+ <comment/>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/syscalls.c</location>
+ </link><link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</location>
+ </link>
+
+ <link>
+ <name>Application/User/Core/main.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/main.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/app_debug.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/app_entry.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/flash_driver.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/flash_driver.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/stm32_lpm_if.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/hw_timerserver.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/hw_uart.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/stm32wbxx_it.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/stm32wbxx_hal_msp.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_msp.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/App/app_ble.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_ble.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/App/p2p_server_app.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/p2p_server_app.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/Target/hw_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</location>
+ </link>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/readme.txt</location>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</location>
+ </link>
+ <link>
+ <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_hsem.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/hci_tl_if.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/shci_tl_if.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/tl_mbox.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/shci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/dbg_trace.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/otp.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/stm_list.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/stm_queue.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/osal.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/svc_ctl.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/p2p_stm.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/p2p_stm.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble_gap_aci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble_gatt_aci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble_hal_aci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble_hci_le.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble_l2cap_aci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/hci_tl.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/shci_tl.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
+ </link>
+ <link>
+ <name>Utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
+ </link>
+ <link>
+ <name>Utilities/stm32_seq.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
+ </link>
+ </linkedResources>
+</projectDescription> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..7ac9a391f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/BLE_RfWithFlash/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed ā€œas is,ā€ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..f79eec117
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* start address for the .MB_MEM2 section. defined in linker script */
+.word _sMB_MEM2
+/* end address for the .MB_MEM2 section. defined in linker script */
+.word _eMB_MEM2
+
+/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */
+.macro INIT_BSS start, end
+ ldr r0, =\start
+ ldr r1, =\end
+ movs r3, #0
+ bl LoopFillZerobss
+.endm
+
+/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */
+.macro INIT_DATA start, end, src
+ ldr r0, =\start
+ ldr r1, =\end
+ ldr r2, =\src
+ movs r3, #0
+ bl LoopCopyDataInit
+.endm
+
+.section .text.data_initializers
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+ bx lr
+
+FillZerobss:
+ str r3, [r0]
+ adds r0, r0, #4
+
+LoopFillZerobss:
+ cmp r0, r1
+ bcc FillZerobss
+ bx lr
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ INIT_DATA _sdata, _edata, _sidata
+
+/* Zero fill the bss segments. */
+ INIT_BSS _sbss, _ebss
+ INIT_BSS _sMB_MEM2, _eMB_MEM2
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/syscalls.c
new file mode 100644
index 000000000..e266506b6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/SW4STM32/syscalls.c
@@ -0,0 +1,204 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt
new file mode 100644
index 000000000..0ec8e081d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt
@@ -0,0 +1,140 @@
+/**
+ @page Application
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE/BLE_RfWithFlash/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE_RfWithFlash application
+ ******************************************************************************
+ *
+ * Copyright (c) 2020 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+This example is to demonstrate the capability to erase/write the flash while a Point-to-Point communication using BLE component is active.
+
+This project is built on top of BLE_p2pServer where SW3 has been added to erase/write in flash and SW1 has been modified to enable/disable
+timing protection versus flash activity from CPU1.
+The flash driver implements the algorithm described in AN5289 - Building a Wireless application.
+The BLE_RfWithFlash shall be downloaded in a STM32WB55xx board acting as a GATT server.
+The client could be either a phone with the ST BLE Sensor application or the BLE_P2PClient application downloaded on a STM32WB55xx board.
+
+@par Directory contents
+
+ - BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_RfWithFlash/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.h Header for app_ble.c module
+ - BLE/BLE_RfWithFlash/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_RfWithFlash/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_RfWithFlash/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_RfWithFlash/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.h Header for p2p_server_app.c module
+ - BLE/BLE_RfWithFlash/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_RfWithFlash/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_RfWithFlash/Core/Src/main.c Main program
+ - BLE/BLE_RfWithFlash/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_RfWithFlash/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.c P2P Server application
+ - BLE/BLE_RfWithFlash/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - BLE/BLE_RfWithFlash/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_RfWithFlash/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_RfWithFlash/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_RfWithFlash/Core/Src/flash_driver.c Flash Driver (implements the algorithm from AN5289)
+ - BLE/BLE_RfWithFlash/Core/Inc/flash_driver.h Interface to be used to erase/write in Flash
+
+@par Hardware and Software environment
+
+ - This application runs on STM32WB55xx devices.
+
+ - Nucleo board (MB1355C) Set-up
+ - Connect the Nucleo Board to your PC with a USB cable type A to mini-B to ST-LINK connector (USB_STLINK).
+ - Please ensure that the ST-LINK connectors and jumpers are fitted.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following :
+ - Open your preferred toolchain
+ - Rebuild all files and load the image into Target memory
+ - OR use the BLE_RfWithFlash_reference.hex from Binary directory
+
+First demonstration
+On the android/ios device, enable the Bluetooth communications, and if not done before,
+ - Install the ST BLE Profile application on the android device
+ https://play.google.com/store/apps/details?id=com.stm.bluetoothlevalidation&hl=en
+ https://itunes.apple.com/fr/App/st-ble-profile/id1081331769?mt=8
+
+ - Install the ST BLE Sensor application on the ios/android device
+ https://play.google.com/store/apps/details?id=com.st.bluems
+ https://itunes.apple.com/us/App/st-bluems/id993670214?mt=8
+
+ - Power on the Nucleo board with the BLE_RfWithFlash application
+ - The Peripheral device (BLE_RfWithFlash) starts advertising (during 1 minute), the green led blinks for each advertising event.
+ - Then, click on the App icon, ST BLE Sensor (android device)
+ - connect to the device
+ - select the P2PSRVx in the device list and play with the Light and the SW1 button of the board
+ - When pressing SW1 on the board, a notification is sent to the phone.
+ - The blue led on the board can be switched ON/OFF from the phone.
+
+ Specific implementation for the test flash procedure
+ The descritpions above are taken from the BLE_p2pServer and are still valid as the BLE_RfWithFlash application is built on top of the
+ BLE_p2pServer application.
+ The BLE_RfWithFlash application is working in the same way than BLE_p2pServer application with additional features :
+ - Each time SW3 is pressed, the application alternatively :
+ - Erase the last CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS (configurable from app_conf.h). A message is sent over before
+ the erase process is started and once it is finished. The application checks that all the sectors have been erased. If it is not
+ the case, the RED LED is switched ON and a message is sent over the traces with the first the address that has not been properly erased.
+ - Write the last CFG_NBR_OF_FLASH_SECTOR_TO_PROCESS (configurable from app_conf.h) with 64bits data starting from 0x00 and incremented
+ by 1 until the end of the test.A message is sent over before the write process is started and once it is finished. The application checks
+ that all the sectors have been written. If it is not the case, the RED LED is switched ON and a message is sent over the traces with the
+ first the address that has not been properly written.
+ - Each time SW1 is pressed, in addition to what is described above, the CPU1 timing protection is alternatively enabled/disabled. Each time
+ SW1 is pressed, a message is sent over the traces to notify the protection status.
+ - When SW3 is pressed while the CPU1 timing protection has been enabled with SW1, the CPU1 loops into the FlashOperationProc() until the CPU1
+ timing protection is disabled. Over all the time, the RF link activity is maintained.
+
+Second demonstration - The phone may be replaced by the BLE_p2pClient application dowloaded on a STM32WB55xx board
+ - BLE_RfWithFlash may be connected by BLE_p2pClient.
+ - Once the code (BLE_RfWithFlash & BLE_p2pClient) is downloaded into the two STM32WB55xx boards and executed, the modules are initialized.
+
+ - The Peripheral device (BLE_RfWithFlash) starts advertising (during 1 minute), the green led blinks for each advertising event.
+ - The Central device (BLE_p2pClient) starts scanning when pressing the User button (SW1) on the USB Dongle board.
+ - BLE_p2pClient blue led becomes on.
+ - Scan req takes about 5 seconds.
+ - Make sure BLE_RfWithFlash advertises, if not press reset button or switch off/on to restart advertising.
+ - Then, it automatically connects to the BLE_RfWithFlash.
+ - Blue led turns off and green led starts blinking as on the MB1355C. Connection is done.
+ - When pressing SW1 on a board, the blue led toggles on the other one.
+ - The SW1 button can be pressed independently on the GATT Client or on the GATT Server.
+ - When the server is located on a MB1355C, the connection interval can be modified from 50ms to 1s and vice-versa using SW2.
+ - The green led on the 2 boards blinks for each advertising event, it means quickly when 50ms and slowly when 1s.
+ - Passing from 50ms to 1s is instantaneous, but from 1s to 50ms takes around 10 seconds.
+ - The SW1 event, switch on/off blue led, depends on the connection Interval event.
+ - So the delay from SW1 action and blue led change is more or less fast.
+
+ For more details refer to the Application Note:
+ AN5289 - Building a Wireless application
+
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Src/main.c
index 96ea11292..eedbff9a4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/Core/Src/main.c
@@ -256,6 +256,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c
index 095e23b4d..9705250e9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/App/tm.c
@@ -76,7 +76,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t HciAclDataBuffer[sizeof(TL_P
static uint8_t RxHostData[5];
static HciReceiveStatus_t HciReceiveStatus;
-static TL_CmdPacket_t SysLocalCmd;
+ALIGN(4) static TL_CmdPacket_t SysLocalCmd;
static uint8_t *pHostRx;
static tListNode HostTxQueue;
static TL_EvtPacket_t *pTxToHostPacket;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/SW4STM32/BLE_TransparentMode/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/SW4STM32/BLE_TransparentMode/.cproject
index a4efb1fea..a518959c2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/SW4STM32/BLE_TransparentMode/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_TransparentMode/SW4STM32/BLE_TransparentMode/.cproject
@@ -34,7 +34,7 @@
</outputEntries>
</builder>
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.756434054" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.705691989" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.none" valueType="enumerated"/>
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.705691989" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
<option id="gnu.c.compiler.option.debugging.level.402976942" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
<option id="gnu.c.compiler.option.include.paths.1867833369" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../../../Core/Inc"/>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Src/main.c
index 7cebe8df3..b28a928fb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/Core/Src/main.c
@@ -356,6 +356,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c
index 7cebe8df3..b28a928fb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c
@@ -356,6 +356,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/BLE_p2pServer.ioc b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/BLE_p2pServer.ioc
index 979db0d43..425ee3f55 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/BLE_p2pServer.ioc
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/BLE_p2pServer.ioc
@@ -241,10 +241,6 @@ STM32_WPAN.BLE_APPLICATION_TYPE=BLE_SERVER_PROFILE
STM32_WPAN.BLE_CFG_SVC_MAX_NBR_CB=1
STM32_WPAN.BLE_DBG_APP_EN=0
STM32_WPAN.BLE_DBG_P2P_STM_EN=1
-STM32_WPAN.BT_SIG_BEACON=Disabled
-STM32_WPAN.BT_SIG_BLOOD_PRESSURE_SENSOR=Disabled
-STM32_WPAN.BT_SIG_HEALTH_THERMOMETER_SENSOR=Disabled
-STM32_WPAN.BT_SIG_HEART_RATE_SENSOR=Disabled
STM32_WPAN.CFG_ADV_BD_ADDRESS=0x7257acd87a6c
STM32_WPAN.CFG_CONSOLE_MENU=hw_lpuart1
STM32_WPAN.CFG_DEBUGGER_SUPPORTED=1
@@ -272,9 +268,8 @@ STM32_WPAN.CFG_RTCCLK_DIVIDER_CONF=0
STM32_WPAN.CUSTOM_P2P_SERVER=Enabled
STM32_WPAN.CUSTOM_TEMPLATE=Disabled
STM32_WPAN.DBG_TRACE_UART_CFG=hw_uart1
-STM32_WPAN.IPParameters=P2P_SERVER_NUMBER,CFG_FAST_CONN_ADV_INTERVAL_MAX_HEXA,CFG_LP_CONN_ADV_INTERVAL_MAX_HEXA,LOCAL_NAME_FORMATTED,CFG_HW_LPUART1_ENABLED,CFG_DEBUG_BLE_TRACE,CFG_DEBUG_APP_TRACE,DBG_TRACE_UART_CFG,CFG_ADV_BD_ADDRESS,CFG_LP_CONN_ADV_INTERVAL_MAX,CFG_LP_CONN_ADV_INTERVAL_MIN,BLE_DBG_P2P_STM_EN,CFG_HW_USART1_ENABLED,CFG_LPM_SUPPORTED,L2CAP_REQUEST_NEW_CONN_PARAM,BLE_APPLICATION_TYPE,BT_SIG_BEACON,BT_SIG_BLOOD_PRESSURE_SENSOR,BT_SIG_HEALTH_THERMOMETER_SENSOR,BT_SIG_HEART_RATE_SENSOR,CUSTOM_P2P_SERVER,CUSTOM_TEMPLATE,BLE_CFG_SVC_MAX_NBR_CB,CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER,CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO,CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO,CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION,CFG_HW_RESET_BY_FW,CFG_DEBUGGER_SUPPORTED,CFG_FAST_CONN_ADV_INTERVAL_MIN,CFG_FAST_CONN_ADV_INTERVAL_MAX,CFG_IO_CAPABILITY,CFG_MITM_PROTECTION,CFG_RTCCLK_DIVIDER_CONF,CFG_DEBUG_TRACE_UART,BLE_DBG_APP_EN,CFG_DEBUG_TRACE_LIGHT,CFG_CONSOLE_MENU
+STM32_WPAN.IPParameters=P2P_SERVER_NUMBER,CFG_FAST_CONN_ADV_INTERVAL_MAX_HEXA,CFG_LP_CONN_ADV_INTERVAL_MAX_HEXA,CFG_HW_LPUART1_ENABLED,CFG_DEBUG_BLE_TRACE,CFG_DEBUG_APP_TRACE,DBG_TRACE_UART_CFG,CFG_ADV_BD_ADDRESS,CFG_LP_CONN_ADV_INTERVAL_MAX,CFG_LP_CONN_ADV_INTERVAL_MIN,BLE_DBG_P2P_STM_EN,CFG_HW_USART1_ENABLED,CFG_LPM_SUPPORTED,L2CAP_REQUEST_NEW_CONN_PARAM,BLE_APPLICATION_TYPE,CUSTOM_P2P_SERVER,CUSTOM_TEMPLATE,BLE_CFG_SVC_MAX_NBR_CB,CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER,CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO,CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO,CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION,CFG_HW_RESET_BY_FW,CFG_DEBUGGER_SUPPORTED,CFG_FAST_CONN_ADV_INTERVAL_MIN,CFG_FAST_CONN_ADV_INTERVAL_MAX,CFG_IO_CAPABILITY,CFG_MITM_PROTECTION,CFG_RTCCLK_DIVIDER_CONF,CFG_DEBUG_TRACE_UART,BLE_DBG_APP_EN,CFG_DEBUG_TRACE_LIGHT,CFG_CONSOLE_MENU
STM32_WPAN.L2CAP_REQUEST_NEW_CONN_PARAM=1
-STM32_WPAN.LOCAL_NAME_FORMATTED=,'P','2','P','S','R','V','1'
STM32_WPAN.P2P_SERVER_NUMBER=P2P_SERVER1
USART1.AutoBaudRateEnableParam=UART_ADVFEATURE_AUTOBAUDRATE_DISABLE
USART1.BaudRate=115200
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Inc/main.h
index 4b10d2beb..55097bac8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Inc/main.h
@@ -29,7 +29,6 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
-#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Src/main.c
index fffe89652..e31de98cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/Core/Src/main.c
@@ -356,6 +356,10 @@ static void MX_RTC_Init(void)
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt
index 0f0a1614e..ea421ecf5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt
@@ -96,9 +96,6 @@ On the android/ios device, enable the Bluetooth communications, and if not done
Second demonstration
- - BLE_p2pServer may be connected by BLE_p2pClient as well(MB1293C).
- - Once the code (BLE_p2pServer & BLE_p2pClient) is downloaded into the two STM32WB55xx boards and executed, the modules are initialized.
-
- BLE_p2pServer may be connected by BLE_p2pClient.
- Once the code (BLE_p2pServer & BLE_p2pClient) is downloaded into the two STM32WB55xx boards and executed, the modules are initialized.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Binary/BLE_p2pServer_ota_reference.bin b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Binary/BLE_p2pServer_ota_reference.bin
index fae195d86..2d1f596da 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Binary/BLE_p2pServer_ota_reference.bin
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Binary/BLE_p2pServer_ota_reference.bin
Binary files differ
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_common.h
index 4defc5d7a..836f40dcf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_common.h
@@ -1,12 +1,13 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_common.h
* Description : App Common application configuration file for STM32WPAN Middleware.
*
- ******************************************************************************
+ ******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -16,7 +17,7 @@
*
******************************************************************************
*/
-
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_COMMON_H
#define APP_COMMON_H
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_conf.h
index 37d63c350..2c54fcb5d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_conf.h
@@ -1,12 +1,12 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_conf.h
* Description : Application configuration file for STM32WPAN Middleware.
- *
- ******************************************************************************
+ ******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -16,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_CONF_H
@@ -48,11 +49,11 @@
/**
* Define IO Authentication
*/
-#define CFG_BONDING_MODE (1)
-#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
-#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
-#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+#define CFG_BONDING_MODE (0)
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
/**
* Define IO capabilities
@@ -63,7 +64,7 @@
#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
-#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT
/**
* Define MITM modes
@@ -74,6 +75,35 @@
#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
/**
+ * Define Secure Connections Support
+ */
+#define CFG_SECURE_NOT_SUPPORTED (0x00)
+#define CFG_SECURE_OPTIONAL (0x01)
+#define CFG_SECURE_MANDATORY (0x02)
+
+#define CFG_SC_SUPPORT CFG_SECURE_OPTIONAL
+
+/**
+ * Define Keypress Notification Support
+ */
+#define CFG_KEYPRESS_NOT_SUPPORTED (0x00)
+#define CFG_KEYPRESS_SUPPORTED (0x01)
+
+#define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED
+
+/**
+ * Numeric Comparison Answers
+ */
+#define YES (0x01)
+#define NO (0x00)
+
+/**
+ * Device name configuration for Generic Access Service
+ */
+#define CFG_GAP_DEVICE_NAME "TEMPLATE"
+#define CFG_GAP_DEVICE_NAME_LENGTH (8)
+
+/**
* Define PHY
*/
#define ALL_PHYS_PREFERENCE 0x00
@@ -105,6 +135,7 @@
/**< specific parameters */
/*****************************************************/
+
#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
@@ -119,8 +150,8 @@
#define CFG_DEV_ID_P2P_SERVER2 (0x84)
#define CFG_DEV_ID_P2P_SERVER3 (0x87)
#define CFG_DEV_ID_P2P_SERVER4 (0x88)
-#define CFG_DEV_ID_P2P_SERVER5 (0x89)
-#define CFG_DEV_ID_P2P_SERVER6 (0x8A)
+#define CFG_DEV_ID_P2P_SERVER5 (0x89)
+#define CFG_DEV_ID_P2P_SERVER6 (0x8A)
#define CFG_DEV_ID_P2P_ROUTER (0x85)
#define RADIO_ACTIVITY_EVENT 1 /* 1 for OOB Demo */
@@ -145,6 +176,10 @@
#define L2CAP_SLAVE_LATENCY 0x0000
#define L2CAP_TIMEOUT_MULTIPLIER 0x1F4
+/* USER CODE BEGIN Specific_Parameters */
+
+/* USER CODE END Specific_Parameters */
+
/******************************************************************************
* BLE Stack
******************************************************************************/
@@ -383,7 +418,7 @@
typedef enum
{
- CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_PROC_ID_ISR,
} CFG_TimProcID_t;
/******************************************************************************
@@ -431,11 +466,6 @@ typedef enum
#define CFG_DEBUGGER_SUPPORTED 1
#endif
-/* USER CODE BEGIN Defines */
-#define CFG_LED_SUPPORTED 1
-#define CFG_BUTTON_SUPPORTED 1
-/* USER CODE END Defines */
-
/**
* When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
* When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
@@ -472,6 +502,11 @@ typedef enum
#define DBG_TRACE_MSG_QUEUE_SIZE 4096
#define MAX_DBG_TRACE_MSG_SIZE 1024
+/* USER CODE BEGIN Defines */
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+/* USER CODE END Defines */
+
/******************************************************************************
* Scheduler
******************************************************************************/
@@ -488,6 +523,9 @@ typedef enum
{
CFG_TASK_ADV_CANCEL_ID,
CFG_TASK_SW1_BUTTON_PUSHED_ID,
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ CFG_TASK_CONN_UPDATE_REG_ID,
+#endif
CFG_TASK_HCI_ASYNCH_EVT_ID,
/* USER CODE BEGIN CFG_Task_Id_With_HCI_Cmd_t */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_debug.h
index 13485c16b..4224edbe0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_debug.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_debug.h
@@ -1,23 +1,22 @@
-
+/* USER CODE BEGIN Header */
/**
- ******************************************************************************
- * @file app_debug.h
- * @author MCD Application Team
- * @brief Interface to support debug in the application
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
******************************************************************************
- */
-
+ * File Name : app_debug.h
+ * Description : Header for app_debug.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __APP_DEBUG_H
@@ -27,17 +26,42 @@
extern "C" {
#endif
- /* Includes ------------------------------------------------------------------*/
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
/* Exported types ------------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* External variables --------------------------------------------------------*/
- /* Exported macros -----------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
void APPD_Init( void );
void APPD_EnableCPU2( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
#ifdef __cplusplus
-}
+} /* extern "C" */
#endif
#endif /*__APP_DEBUG_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/hw_conf.h
index 523eb30f6..1ea46c74b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/hw_conf.h
@@ -24,9 +24,9 @@
#define HW_CONF_H
/******************************************************************************
-* Semaphores
-* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
-*****************************************************************************/
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
/**
* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/main.h
index 55097bac8..4b10d2beb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/main.h
@@ -29,6 +29,7 @@ extern "C" {
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
+#include "app_conf.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_hal_conf.h
index 31d63e37a..d5db0e33f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_hal_conf.h
@@ -39,6 +39,7 @@
/*#define HAL_CRC_MODULE_ENABLED */
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
@@ -70,6 +71,7 @@
#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
@@ -243,6 +245,10 @@
#include "stm32wbxx_hal_i2c.h"
#endif /* HAL_I2C_MODULE_ENABLED */
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
#ifdef HAL_IPCC_MODULE_ENABLED
#include "stm32wbxx_hal_ipcc.h"
#endif /* HAL_IPCC_MODULE_ENABLED */
@@ -276,7 +282,6 @@
#endif /* HAL_PWR_MODULE_ENABLED */
#ifdef HAL_QSPI_MODULE_ENABLED
- #define USE_HAL_QSPI_REGISTER_CALLBACKS 0U
#include "stm32wbxx_hal_qspi.h"
#endif /* HAL_QSPI_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_debug.c
index 448c176ad..14ed65c22 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_debug.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_debug.c
@@ -1,24 +1,25 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
- * @file app_debug.c
- * @author MCD Application Team
- * @brief Debug capabilities
+ * File Name : app_debug.c
+ * Description : Debug capabilities source file for STM32WPAN Middleware
******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
******************************************************************************
*/
-
+/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
#include "app_common.h"
#include "app_debug.h"
@@ -26,8 +27,10 @@
#include "shci.h"
#include "tl.h"
#include "dbg_trace.h"
+/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
typedef PACKED_STRUCT
{
GPIO_TypeDef* port;
@@ -35,8 +38,10 @@ typedef PACKED_STRUCT
uint8_t enable;
uint8_t reserved;
} APPD_GpioConfig_t;
+/* USER CODE END PTD */
/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
#define GPIO_NBR_OF_RF_SIGNALS 9
#define GPIO_CFG_NBR_OF_FEATURES 34
#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
@@ -46,15 +51,25 @@ typedef PACKED_STRUCT
* THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
*/
#define BLE_DTB_CFG 0
+/* USER CODE END PD */
/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
-#if (CFG_HW_USART1_ENABLED == 1)
+#ifdef CFG_DEBUG_TRACE_UART
+#if(CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if(CFG_HW_USART1_ENABLED == 1)
extern void MX_USART1_UART_Init(void);
#endif
+#endif
/**
* THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
@@ -125,15 +140,22 @@ static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
{ GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
};
#endif
+/* USER CODE END PV */
/* Global variables ----------------------------------------------------------*/
+/* USER CODE BEGIN GV */
+/* USER CODE END GV */
+
/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
static void APPD_SetCPU2GpioConfig( void );
static void APPD_BleDtbCfg( void );
+/* USER CODE END PFP */
/* Functions Definition ------------------------------------------------------*/
void APPD_Init( void )
{
+/* USER CODE BEGIN APPD_Init */
#if (CFG_DEBUGGER_SUPPORTED == 1)
/**
* Keep debugger enabled while in any low power mode
@@ -173,11 +195,13 @@ void APPD_Init( void )
APPD_SetCPU2GpioConfig( );
APPD_BleDtbCfg( );
+/* USER CODE END APPD_Init */
return;
}
void APPD_EnableCPU2( void )
{
+/* USER CODE BEGIN APPD_EnableCPU2 */
SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
{
{{0,0,0}}, /**< Does not need to be initialized */
@@ -195,6 +219,7 @@ void APPD_EnableCPU2( void )
/** GPIO DEBUG Initialization */
SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+/* USER CODE END APPD_EnableCPU2 */
return;
}
@@ -205,6 +230,7 @@ void APPD_EnableCPU2( void )
*************************************************************/
static void APPD_SetCPU2GpioConfig( void )
{
+/* USER CODE BEGIN APPD_SetCPU2GpioConfig */
GPIO_InitTypeDef gpio_config = {0};
uint8_t local_loop;
uint16_t gpioa_pin_list;
@@ -270,11 +296,13 @@ static void APPD_SetCPU2GpioConfig( void )
HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
}
+/* USER CODE END APPD_SetCPU2GpioConfig */
return;
}
static void APPD_BleDtbCfg( void )
{
+/* USER CODE BEGIN APPD_BleDtbCfg */
#if (BLE_DTB_CFG != 0)
GPIO_InitTypeDef gpio_config = {0};
uint8_t local_loop;
@@ -326,6 +354,7 @@ static void APPD_BleDtbCfg( void )
}
#endif
+/* USER CODE END APPD_BleDtbCfg */
return;
}
@@ -337,15 +366,32 @@ static void APPD_BleDtbCfg( void )
#if(CFG_DEBUG_TRACE != 0)
void DbgOutputInit( void )
{
- MX_USART1_UART_Init();
- return;
+/* USER CODE BEGIN DbgOutputInit */
+#ifdef CFG_DEBUG_TRACE_UART
+if (CFG_DEBUG_TRACE_UART == hw_lpuart1)
+{
+#if(CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+}
+else if (CFG_DEBUG_TRACE_UART == hw_uart1)
+{
+#if(CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+#endif
}
+#endif
+/* USER CODE END DbgOutputInit */
+ return;
+}
void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
{
+/* USER CODE END DbgOutputTraces */
HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+/* USER CODE END DbgOutputTraces */
return;
}
#endif
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_entry.c
index 3d8f0f871..86b202fc1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_entry.c
@@ -73,6 +73,9 @@ static void APPE_SysUserEvtRx( void * pPayload );
#if (CFG_HW_LPUART1_ENABLED == 1)
extern void MX_LPUART1_UART_Init(void);
#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
/* USER CODE BEGIN PFP */
static void Led_Init( void );
@@ -120,6 +123,7 @@ void APPE_Init( void )
* LOCAL FUNCTIONS
*
*************************************************************/
+
/**
* @brief Configure the system for power optimization
*
@@ -193,7 +197,7 @@ static void APPE_SysUserEvtRx( void * pPayload )
{
UNUSED(pPayload);
/* Traces channel initialization */
- APPD_EnableCPU2();
+ APPD_EnableCPU2( );
APP_BLE_Init( );
UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/main.c
index 4741fe7f1..e31de98cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/main.c
@@ -110,7 +110,6 @@ int main(void)
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
-
/* MCU Configuration--------------------------------------------------------*/
@@ -139,9 +138,8 @@ int main(void)
/* USER CODE END 2 */
- /* Init code for STM32_WPAN */
+ /* Init code for STM32_WPAN */
APPE_Init();
-
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while(1)
@@ -166,6 +164,7 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
+ HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
/** Configure the main internal regulator output voltage
*/
@@ -209,12 +208,14 @@ void SystemClock_Config(void)
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
- PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
-
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
}
/**
@@ -358,6 +359,7 @@ static void MX_RTC_Init(void)
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
@@ -404,6 +406,7 @@ static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_hal_msp.c
index 87614ca60..fc4e64f31 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_hal_msp.c
@@ -88,6 +88,7 @@ void HAL_MspInit(void)
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
if(huart->Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspInit 0 */
@@ -132,6 +133,16 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
Error_Handler();
}
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_DMAMUX1_CH1_EVT;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_NO_EVENT;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = DISABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_lpuart1_tx, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
__HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
/* LPUART1 interrupt Init */
@@ -282,6 +293,7 @@ void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
/* USER CODE END RTC_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
/* USER CODE BEGIN RTC_MspInit 1 */
HAL_RTCEx_EnableBypassShadow(hrtc);
/* USER CODE END RTC_MspInit 1 */
@@ -304,6 +316,7 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
/* USER CODE END RTC_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
/* USER CODE BEGIN RTC_MspDeInit 1 */
/* USER CODE END RTC_MspDeInit 1 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/system_stm32wbxx.c
index fe8bf4976..79f9bbb64 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/system_stm32wbxx.c
@@ -281,7 +281,6 @@ void SystemCoreClockUpdate(void)
/*MSI frequency range in Hz*/
msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
- /*SystemCoreClock=HAL_RCC_GetSysClockFreq();*/
/* Get SYSCLK source -------------------------------------------------------*/
switch (RCC->CFGR & RCC_CFGR_SWS)
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/app_ble.c
index 27a3dcc39..350f2a76a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/app_ble.c
@@ -232,7 +232,7 @@ P2PS_APP_ConnHandle_Not_evt_t handleNotification;
#define SIZE_TAB_CONN_INT 2
float tab_conn_interval[SIZE_TAB_CONN_INT] = {50, 1000} ; /* ms */
uint8_t index_con_int, mutex;
-#endif
+#endif
/**
* Advertising Data
@@ -370,6 +370,7 @@ static void Adv_Cancel_Req( void );
static void Switch_OFF_GPIO( void );
#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
static void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle);
+static void Connection_Interval_Update_Req( void );
#endif
/* USER CODE BEGIN PFP */
@@ -444,15 +445,19 @@ void APP_BLE_Init( void )
* From here, all initialization are BLE application specific
*/
UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_CONN_UPDATE_REG_ID, UTIL_SEQ_RFU, Connection_Interval_Update_Req);
+#endif
+
/**
* Initialization of ADV - Ad Manufacturer Element - Support OTA Bit Mask
*/
-#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
- manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
+#if(BLE_CFG_OTA_REBOOT_CHAR != 0)
+ manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
#endif
#if(RADIO_ACTIVITY_EVENT != 0)
aci_hal_set_radio_activity_mask(0x0006);
-#endif
+#endif
#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
index_con_int = 0;
@@ -477,6 +482,7 @@ void APP_BLE_Init( void )
*/
BleApplicationContext.BleApplicationContext_legacy.advtServUUID[0] = NULL;
BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen = 0;
+
/* Initialize intervals for reconnexion without intervals update */
AdvIntervalMin = CFG_FAST_CONN_ADV_INTERVAL_MIN;
AdvIntervalMax = CFG_FAST_CONN_ADV_INTERVAL_MAX;
@@ -522,11 +528,10 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
Adv_Request(APP_BLE_FAST_ADV);
/*
* SPECIFIC to P2P Server APP
-*/
+*/
handleNotification.P2P_Evt_Opcode = PEER_DISCON_HANDLE_EVT;
handleNotification.ConnectionHandle = BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
P2PS_APP_Notification(&handleNotification);
-
/* USER CODE BEGIN EVT_DISCONN_COMPLETE */
/* USER CODE END EVT_DISCONN_COMPLETE */
@@ -542,7 +547,7 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
/* USER CODE END EVT_LE_META_EVENT */
switch (meta_evt->subevent)
{
- case EVT_LE_CONN_UPDATE_COMPLETE:
+ case EVT_LE_CONN_UPDATE_COMPLETE:
APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \n");
/* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
@@ -560,10 +565,12 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \n");
}
+
ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
if (ret == BLE_STATUS_SUCCESS)
{
APP_DBG_MSG("Read_PHY success \n");
+
if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
{
APP_DBG_MSG("PHY Param TX= %d, RX= %d \n", TX_PHY, RX_PHY);
@@ -582,33 +589,31 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
/* USER CODE END EVT_LE_PHY_UPDATE_COMPLETE */
break;
case EVT_LE_CONN_COMPLETE:
- {
+ {
hci_le_connection_complete_event_rp0 *connection_complete_event;
/**
* The connection is done, there is no need anymore to schedule the LP ADV
*/
connection_complete_event = (hci_le_connection_complete_event_rp0 *) meta_evt->data;
-
+
HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
- APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\n",
- connection_complete_event->Connection_Handle);
- if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
- {
- /* Connection as client */
- BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
- }
- else
- {
- /* Connection as server */
- BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
- }
- BleApplicationContext.BleApplicationContext_legacy.connectionHandle =
- connection_complete_event->Connection_Handle;
- /*
+ APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\n", connection_complete_event->Connection_Handle);
+ if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
+ {
+ /* Connection as client */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
+ }
+ else
+ {
+ /* Connection as server */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
+ }
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = connection_complete_event->Connection_Handle;
+/*
* SPECIFIC to P2P Server APP
-*/
+*/
handleNotification.P2P_Evt_Opcode = PEER_CONN_HANDLE_EVT;
handleNotification.ConnectionHandle = BleApplicationContext.BleApplicationContext_legacy.connectionHandle;
P2PS_APP_Notification(&handleNotification);
@@ -621,7 +626,7 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
P2PS_APP_Notification(&handleNotification);
/**/
/* USER CODE END HCI_EVT_LE_CONN_COMPLETE */
- }
+ }
break; /* HCI_EVT_LE_CONN_COMPLETE */
default:
@@ -715,23 +720,23 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
/* USER CODE BEGIN EVT_BLUE_GAP_PROCEDURE_COMPLETE */
/* USER CODE END EVT_BLUE_GAP_PROCEDURE_COMPLETE */
- break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
+ break; /* EVT_BLUE_GAP_PROCEDURE_COMPLETE */
#if(RADIO_ACTIVITY_EVENT != 0)
- case 0x0004:
+ case ACI_HAL_END_OF_RADIO_ACTIVITY_VSEVT_CODE:
/* USER CODE BEGIN RADIO_ACTIVITY_EVENT*/
BSP_LED_On(LED_GREEN);
HW_TS_Start(BleApplicationContext.SwitchOffGPIO_timer_Id, (uint32_t)LED_ON_TIMEOUT);
/* USER CODE END RADIO_ACTIVITY_EVENT*/
- break; /* RADIO_ACTIVITY_EVENT */
+ break; /* RADIO_ACTIVITY_EVENT */
#endif
}
break; /* EVT_VENDOR */
- default:
- /* USER CODE BEGIN ECODE_DEFAULT*/
+ default:
+ /* USER CODE BEGIN ECODE_DEFAULT*/
- /* USER CODE END ECODE_DEFAULT*/
- break;
+ /* USER CODE END ECODE_DEFAULT*/
+ break;
}
return (SVCCTL_UserEvtFlowEnable);
@@ -751,13 +756,10 @@ void APP_BLE_Key_Button1_Action(void)
void APP_BLE_Key_Button2_Action(void)
{
#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
- if (BleApplicationContext.Device_Connection_Status != APP_BLE_FAST_ADV && BleApplicationContext.Device_Connection_Status != APP_BLE_IDLE)
- {
- BLE_SVC_L2CAP_Conn_Update(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
-
- }
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_CONN_UPDATE_REG_ID, CFG_SCH_PRIO_0);
+#endif
+
return;
-#endif
}
void APP_BLE_Key_Button3_Action(void)
@@ -781,7 +783,7 @@ static void Ble_Tl_Init( void )
return;
}
- static void Ble_Hci_Gap_Gatt_Init(void){
+static void Ble_Hci_Gap_Gatt_Init(void){
uint8_t role;
uint8_t index;
@@ -812,7 +814,7 @@ static void Ble_Tl_Init( void )
manuf_data[ sizeof(manuf_data)-3] = bd_addr[2];
manuf_data[ sizeof(manuf_data)-2] = bd_addr[1];
manuf_data[ sizeof(manuf_data)-1] = bd_addr[0];
-
+
/**
* Static random Address
* The two upper bits shall be set to 1
@@ -858,7 +860,7 @@ static void Ble_Tl_Init( void )
if (role > 0)
{
- const char *name = "STM32WB";
+ const char *name = "P2PSRV1";
aci_gap_init(role, 0,
APPBLE_GAP_DEVICE_NAME_LENGTH,
&gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
@@ -893,11 +895,11 @@ static void Ble_Tl_Init( void )
*/
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = 0;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = 8;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = 16;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = 1;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = 111111;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 1;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = CFG_ENCRYPTION_KEY_SIZE_MIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = CFG_ENCRYPTION_KEY_SIZE_MAX;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = CFG_USED_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = CFG_FIXED_PIN;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = CFG_BONDING_MODE;
for (index = 0; index < 16; index++)
{
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
@@ -905,14 +907,14 @@ static void Ble_Tl_Init( void )
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 1,
- 0,
+ CFG_SC_SUPPORT,
+ CFG_KEYPRESS_NOTIFICATION_SUPPORT,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
-0
- );
+ PUBLIC_ADDR
+ );
/**
* Initialize whitelist
@@ -927,7 +929,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
{
tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
uint16_t Min_Inter, Max_Inter;
-
+
if (New_Status == APP_BLE_FAST_ADV)
{
Min_Inter = AdvIntervalMin;
@@ -946,6 +948,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
APP_DBG_MSG("First index in %d state \n", BleApplicationContext.Device_Connection_Status);
+
if ((New_Status == APP_BLE_LP_ADV)
&& ((BleApplicationContext.Device_Connection_Status == APP_BLE_FAST_ADV)
|| (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_ADV)))
@@ -955,7 +958,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
if (ret == BLE_STATUS_SUCCESS)
{
APP_DBG_MSG("Successfully Stopped Advertising \n");
- }
+ }
else
{
APP_DBG_MSG("Stop Advertising Failed , result: %d \n", ret);
@@ -976,10 +979,10 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
BleApplicationContext.BleApplicationContext_legacy.advtServUUID,
0,
0);
+
/* Update Advertising data */
ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
-
- if (ret == BLE_STATUS_SUCCESS)
+ if (ret == BLE_STATUS_SUCCESS)
{
if (New_Status == APP_BLE_FAST_ADV)
{
@@ -990,7 +993,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
else
{
APP_DBG_MSG("Successfully Start Low Power Advertising \n");
- }
+ }
}
else
{
@@ -1141,6 +1144,17 @@ void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle)
}
#endif
+#if (L2CAP_REQUEST_NEW_CONN_PARAM != 0 )
+static void Connection_Interval_Update_Req( void )
+{
+ if (BleApplicationContext.Device_Connection_Status != APP_BLE_FAST_ADV && BleApplicationContext.Device_Connection_Status != APP_BLE_IDLE)
+ {
+ BLE_SVC_L2CAP_Conn_Update(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
+ }
+ return;
+}
+#endif
+
/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
/* USER CODE END FD_SPECIFIC_FUNCTIONS */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_conf.h
index f6e04686e..e4e4af40b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_conf.h
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_dbg_conf.h
index bec936bbe..926abb3f0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_dbg_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/ble_dbg_conf.h
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.h
index 11e27d8a2..ab5aaf17e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.h
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c
index 7b22ea955..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c
@@ -1,21 +1,21 @@
/**
******************************************************************************
- * File Name : Target/hw_ipcc.c
- * Description : Hardware IPCC source file for BLE
- * middleWare.
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
******************************************************************************
- * @attention
- *
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -150,6 +151,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
* SHCI_C2_Reinit( ) before jumping to the application.
@@ -393,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_CliEvtNotification();
-
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/SW4STM32/syscalls.c
index 9b7c4071a..e266506b6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/SW4STM32/syscalls.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/SW4STM32/syscalls.c
@@ -3,23 +3,20 @@
**
** File : syscalls.c
**
-** Author : Auto-generated by System workbench for STM32
-**
** Abstract : System Workbench Minimal System calls file
**
** For more information about which c-functions
** need which of these lowlevel functions
** please consult the Newlib libc-manual
**
-** Target : STMicroelectronics STM32
+** Environment : System Workbench for MCU
**
** Distribution: The file is distributed “as is,” without any warranty
** of any kind.
**
*****************************************************************************
-** @attention
**
-** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
@@ -28,7 +25,7 @@
** 2. Redistributions in binary form 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 STMicroelectronics nor the names of its contributors
+** 3. Neither the name of Ac6 nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt
index 602ee87f9..4025eba36 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt
@@ -108,9 +108,6 @@ On the android/ios device, enable the Bluetooth communications, and if not done
Second demonstration
- - BLE_p2pServer may be connected by BLE_p2pClient as well(MB1293C).
- - Once the code (BLE_p2pServer & BLE_p2pClient) is downloaded into the two STM32WB55xx boards and executed, the modules are initialized.
-
- BLE_p2pServer may be connected by BLE_p2pClient.
- Once the code (BLE_p2pServer & BLE_p2pClient) is downloaded into the two STM32WB55xx boards and executed, the modules are initialized.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_conf.h
index ea543c351..0a3695c66 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_conf.h
@@ -389,6 +389,8 @@
typedef enum
{
CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_WAIT_BEFORE_SWITCH,
+ CFG_TIM_TEST
} CFG_TimProcID_t;
/******************************************************************************
@@ -500,7 +502,8 @@ typedef enum
CFG_TASK_BUTTON_SW1,
/* Concurrent System */
- CFG_Task_Switch_Protocol,
+ CFG_TASK_INIT_SWITCH_PROTOCOL,
+ CFG_TASK_ACTIVATE_PROTOCOL,
CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
} CFG_Task_Id_With_HCI_Cmd_t;
@@ -542,10 +545,13 @@ typedef enum
CFG_EVT_ACK_FROM_M0_EVT,
CFG_EVT_SYNCHRO_BYPASS_IDLE,
CFG_EVT_ZIGBEE_STOP,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
} CFG_IdleEvt_Id_t;
#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+#define EVENT_ZIGBEE_CONTINUE_INIT (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
/******************************************************************************
* Configure Log level for Application
******************************************************************************/
@@ -581,6 +587,44 @@ typedef enum
BUTTON_1 = 0x1,
} button_type_t;
+
+/******************************************************************************
+ * NVM
+ ******************************************************************************/
+ /**
+ NVM DEFINES
+ */
+/* CFG_EE_BANK0_SIZE is the size allocated for the EE bank0 it should be
+ the considered as the max Flash size for all computation and <= of the
+ allocated size within the scatterfile in bytes
+
+ CFG_NVM_BASE_ADDRESS : offset to add to the base flash address to get the
+ beginning of the NVM (shall be withon allocation range of scatterfile)
+
+ ST_PERSIST_MAX_ALLOC_SZ : max size of the RAM cache in bytes
+ either an abitrary choice or the CFG_NVM_MAX_SIZE
+
+ ST_PERSIST_FLASH_DATA_OFFSET : offset in bytes of zigbee data
+ (U8[4] for lenght - 1st data[]...)
+ CFG_NB_OF_PAGE : Number of page of flash to use
+
+ CFG_NVM_MAX_SIZE : Max allocable size in byte for NVM
+ Flash size/8 * (number of element by page in byte)
+ ZIGBEE_DB_START_ADDR: beginning of zigbee NVM
+
+ CFG_EE_AUTO_CLEAN : Clean the flash automatically when needed
+*/
+
+#define CFG_NB_OF_PAGE (16U)
+#define CFG_EE_BANK0_SIZE (CFG_NB_OF_PAGE * HW_FLASH_PAGE_SIZE)
+#define CFG_NVM_BASE_ADDRESS ( 0x70000 )
+#define CFG_EE_BANK0_MAX_NB (1000U) // In U32 words
+#define ST_PERSIST_MAX_ALLOC_SZ (4U*CFG_EE_BANK0_MAX_NB) // Max data in bytes
+#define ST_PERSIST_FLASH_DATA_OFFSET (4U)
+#define ZIGBEE_DB_START_ADDR (0U)
+#define CFG_EE_AUTO_CLEAN (1U)
+
+
#endif /* APP_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Src/app_entry.c
index 14288366d..54a45261f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Src/app_entry.c
@@ -33,39 +33,29 @@
#include "app_ble.h"
#include "shci.h"
-/* Private includes -----------------------------------------------------------*/
-/* USER CODE BEGIN Includes */
-/* USER CODE END Includes */
-
-/* Private typedef -----------------------------------------------------------*/
-/* USER CODE BEGIN PTD */
-
-/* USER CODE END PTD */
+/* External definition */
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Private defines -----------------------------------------------------------*/
-/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+/* POOL_SIZE */
#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4))
-/* USER CODE BEGIN PD */
-
-/* USER CODE END PD */
-/* Private variables ---------------------------------------------------------*/
-
-extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+/* Switch timeout */
+#define SWITCH_TMO 3*1000*1000/CFG_TS_TICK_VAL
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
-/* SELECT THE PROTOCOL THAT WILL START FIRST (BLE or ZIGBEE) */
static SHCI_C2_CONCURRENT_Mode_Param_t ConcurrentMode = BLE_ENABLE;
-//static SHCI_C2_CONCURRENT_Mode_Param_t ConcurrentMode = ZIGBEE_ENABLE;
+static uint8_t TS_ID1;
+static int NbTotalSwitch = 0;
+static int FlagSwitchingOnGoing = 0;
-/* Global variables ----------------------------------------------------------*/
-
-/* Global function prototypes -----------------------------------------------*/
+/* Global functions prototypes -----------------------------------------------*/
size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+SHCI_C2_CONCURRENT_Mode_Param_t APP_GetCurrentProtocolMode(void);
/* Private function prototypes -----------------------------------------------*/
static void SystemPower_Config( void );
@@ -74,13 +64,12 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
static void APPE_SysUserEvtRx( void * pPayload );
static void appe_Tl_Init( void );
-/* USER CODE BEGIN PFP */
static void Led_Init( void );
static void Button_Init( void );
-/* USER CODE END PFP */
-
-static void Process_Switch_Protocol(void);
+static void Process_InitiateSwitchProtocol(void);
+static void Process_ActivateNewProtocol(void);
+static void ScheduleProcessSwitchProtocol(void);
/* Functions Definition ------------------------------------------------------*/
void APPE_Init( void )
@@ -94,8 +83,8 @@ void APPE_Init( void )
APP_DBG("ConcurrentMode = %d", ConcurrentMode);
/* Task common to Zigbee and BLE */
- UTIL_SEQ_RegTask( 1<<CFG_Task_Switch_Protocol, UTIL_SEQ_RFU,Process_Switch_Protocol);
-
+ UTIL_SEQ_RegTask( 1U <<CFG_TASK_INIT_SWITCH_PROTOCOL, UTIL_SEQ_RFU,Process_InitiateSwitchProtocol);
+ UTIL_SEQ_RegTask( 1U <<CFG_TASK_ACTIVATE_PROTOCOL, UTIL_SEQ_RFU,Process_ActivateNewProtocol);
/**
* The Standby mode should not be entered before the initialization is over
* The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
@@ -117,29 +106,69 @@ void APPE_Init( void )
return;
}
-/** Scheduler tasks **/
-static void Process_Switch_Protocol(void)
+/**
+ * @brief Return the current protocol in use
+ * @param None
+ * @retval None
+ */
+SHCI_C2_CONCURRENT_Mode_Param_t APP_GetCurrentProtocolMode()
+{
+ return ConcurrentMode;
+}
+
+/**
+ * @brief Process used to initiate the protocol switch
+ * @param None
+ * @retval None
+ */
+static void Process_InitiateSwitchProtocol(void)
{
- APP_DBG("Process_Switch_Protocol");
+ APP_DBG("Process_InitiateSwitchProtocol (nb = %d)",NbTotalSwitch ++);
/* Send Switch event to M0 */
/* SWITCH BLE <-> ZIGBEE */
+ if (FlagSwitchingOnGoing == 1)
+ return;
+ FlagSwitchingOnGoing = 1;
+
if(ConcurrentMode == ZIGBEE_ENABLE)
{
APP_DBG("STOP ZIGBEE");
APP_ZIGBEE_Stop();
- /* wait Zigbee has stopped completely -> callback changed state called */
+ /* start a timer */
+ HW_TS_Create(CFG_TIM_WAIT_BEFORE_SWITCH, &TS_ID1, hw_ts_SingleShot, ScheduleProcessSwitchProtocol);
+
+ HW_TS_Start(TS_ID1, SWITCH_TMO);
APP_DBG("SWITCH PROTOCOL TO BLE");
}
else
{
APP_DBG("STOP BLE");
-
APP_BLE_Stop();
-
APP_DBG("SWITCH PROTOCOL TO Zigbee");
+ ScheduleProcessSwitchProtocol();
}
+}
+
+/**
+ * @brief Schedule the process used to switch protocol
+ * @param None
+ * @retval None
+ */
+static void ScheduleProcessSwitchProtocol(void)
+{
+ UTIL_SEQ_SetTask(1 << CFG_TASK_ACTIVATE_PROTOCOL,CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Process the activation of the new protocol
+ * @param None
+ * @retval None
+ */
+static void Process_ActivateNewProtocol(void)
+{
+ APP_DBG("Process_ActivateNewProtocol");
/* Toggle Mode flag */
if(ConcurrentMode == ZIGBEE_ENABLE){
@@ -159,8 +188,10 @@ static void Process_Switch_Protocol(void)
APP_DBG("INIT BLE");
APP_BLE_Init( );
}
+ FlagSwitchingOnGoing = 0;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -306,7 +337,6 @@ static void Led_Init( void )
BSP_LED_Init(LED_GREEN);
BSP_LED_Init(LED_RED);
- //BSP_LED_On(LED_GREEN);
#endif
return;
@@ -343,7 +373,6 @@ void UTIL_SEQ_Idle( void )
return;
}
-
/**
* @brief This function is called by the scheduler each time an event
* is pending.
@@ -367,10 +396,10 @@ void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
break;
- default:
- /* default case */
- UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
- break;
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
}
}
@@ -454,8 +483,8 @@ void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
case BUTTON_SW2_PIN:
APP_DBG("BUTTON 2 PUSHED ! : SWITCHING PROTOCOL");
- /* Set "Switch Protocol" Task */
- UTIL_SEQ_SetTask(1<<CFG_Task_Switch_Protocol,CFG_SCH_PRIO_0);
+ UTIL_SEQ_PauseTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_INIT_SWITCH_PROTOCOL,CFG_SCH_PRIO_0);
break;
case BUTTON_SW3_PIN:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/ble_zigbee_static.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/ble_zigbee_static.ewp
index 61b5fbb1f..6a47dbd71 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/ble_zigbee_static.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/ble_zigbee_static.ewp
@@ -1281,9 +1281,6 @@
</group>
<group>
<name>platform</name>
- <file>
- <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\platform\flash_emulation.c</name>
- </file>
</group>
<group>
<name>stack</name>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/stm32wb55xx_flash_cm4.icf
index 81eded0c7..ab8dbbb2a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/stm32wb55xx_flash_cm4.icf
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/EWARM/stm32wb55xx_flash_cm4.icf
@@ -12,7 +12,8 @@ define symbol __ICFEDIT_region_RAM_end__ = 0x20025FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
-define symbol __ICFEDIT_size_heap__ = 102400; /* Heap increased for Zigbee */
+define symbol __ICFEDIT_size_heap__ = 138400;
+/* 102400; Heap increased for Zigbee */
/**** End of ICF editor section. ###ICF###*/
define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.c
index 10aa93e85..8bb0e4479 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.c
@@ -5,7 +5,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -34,7 +34,6 @@
#include "zcl/zcl.onoff.h"
#include "zcl/zcl.identify.h"
-#include "flash_emulation.h"
/* Private defines -----------------------------------------------------------*/
#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
@@ -42,15 +41,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 13U
-/******************************************************************************
- * Persistence
- ******************************************************************************
- */
-/* For certification testing, we need a little more than 2K for one of the tests.
- * Set to 4K to be safe. 4K is enough for a Coordinator to persist an 80-node
- * network. */
-#define ST_PERSIST_MAX_ALLOC_SZ (4U * 1024U)
-#define ST_PERSIST_FLASH_DATA_OFFSET 4U
+/* external definition */
+extern const uint8_t sec_key_ha[ZB_SEC_KEYSIZE];
+extern SHCI_C2_CONCURRENT_Mode_Param_t APP_GetCurrentProtocolMode(void);
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
@@ -61,17 +54,20 @@ static void APP_ZIGBEE_ConfigGroupAddr(void);
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+static void APP_ZIGBEE_persist_delete(void);
static void Wait_Getting_Ack_From_M0(void);
static void Receive_Ack_From_M0(void);
static void Receive_Notification_From_M0(void);
-static const void * APP_ZIGBEE_persist_load(unsigned int *bufLen);
-static void APP_ZIGBEE_persist_delete(void);
-static void APP_ZIGBEE_persist_buf_free(const void *buf);
+static enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT* zb);
+static void APP_ZIGBEE_persist_notify_cb(struct ZigBeeT *zb, void *cbarg);
+static bool APP_ZIGBEE_persist_save(void);
+static bool APP_ZIGBEE_persist_load(void);
-static uint32_t APP_ZIGBEE_GetStartNb(void);
-static void APP_ZIGBEE_IncrementStartNb(void);
+static uint32_t APP_ZIGBEE_GetCompleteJoinCpt(void);
+static void APP_ZIGBEE_IncrCompleteJoinCpt(void);
+static void APP_ZIGBEE_ResetCompleteJoinCpt(void);
/* Private variables -----------------------------------------------*/
static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
@@ -96,15 +92,24 @@ struct zigbee_app_info {
struct ZbZclClusterT *onoff_client_1;
};
-static struct zigbee_app_info zigbee_app_info;
+/* NVM variables */
+/* cache in uninit RAM to store/retrieve persistent data */
+union cache
+{
+ uint8_t U8_data[ST_PERSIST_MAX_ALLOC_SZ]; // in bytes
+ uint32_t U32_data[ST_PERSIST_MAX_ALLOC_SZ/4U]; // in U32 words
+};
+__no_init union cache cache_persistent_data;
+
+static struct zigbee_app_info zigbee_app_info;
static uint32_t join_start_time;
static double join_time_duration;
-
-/* Keep track of number of Zigbee start */
-static uint8_t zigbee_start_nb = 0U;
+static uint8_t zigbee_complete_join_cpt = 1U;
/* Functions Definition ------------------------------------------------------*/
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
void APP_ZIGBEE_Init(void)
{
@@ -141,8 +146,6 @@ void APP_ZIGBEE_Init(void)
/* Initialize Zigbee stack layers */
APP_ZIGBEE_StackLayersInit();
- APP_ZIGBEE_IncrementStartNb();
-
} /* APP_ZIGBEE_Init */
void APP_ZIGBEE_Stop(void)
@@ -153,6 +156,8 @@ void APP_ZIGBEE_Stop(void)
BSP_LED_Off(LED_GREEN);
BSP_LED_Off(LED_BLUE);
+ UTIL_SEQ_PauseTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM);
+
/* Save Persistent data */
APP_DBG("Save persistent data");
APP_ZIGBEE_persist_save();
@@ -162,7 +167,6 @@ void APP_ZIGBEE_Stop(void)
if (zigbee_app_info.zb == NULL) {
return;
}
- //ZbIfDetach(zigbee_app_info.zb, &zigbee_app_info.device);
ZbDestroy(zigbee_app_info.zb);
zigbee_app_info.zb = NULL;
}
@@ -199,6 +203,12 @@ static void APP_ZIGBEE_StackLayersInit(void)
UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
}
+/**
+ * @brief Configuration of the end points
+ * @param None
+ * @retval None
+ */
+
static void APP_ZIGBEE_ConfigEndpoints(void)
{
ZbApsmeAddEndpointReqT req;
@@ -248,9 +258,14 @@ static void APP_ZIGBEE_NwkForm(void)
config.channelList.list[0].page = 0;
config.channelList.list[0].channelMask = 1 << CHANNEL; /* Channel in use*/
- APP_DBG("*** zigbee_start_nb value = %d ***", APP_ZIGBEE_GetStartNb());
- if(APP_ZIGBEE_GetStartNb() < 2U)
+ APP_DBG("*** zigbee_complete_join_cpt value = %d ***", APP_ZIGBEE_GetCompleteJoinCpt());
+
+ ZbPersistNotifyRegister(zigbee_app_info.zb,NULL,NULL);
+
+ if(APP_ZIGBEE_GetCompleteJoinCpt() < 2U)
{
+ /* Clear the persistemt data before starting a complete join */
+ APP_ZIGBEE_persist_delete();
/* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
* a blocking call on the M4. */
status = ZbStartupWait(zigbee_app_info.zb, &config);
@@ -263,6 +278,7 @@ static void APP_ZIGBEE_NwkForm(void)
APP_DBG("JOIN SUCCESS, Duration = (%.2f seconds)", join_time_duration);
zigbee_app_info.join_delay = 0U;
zigbee_app_info.init_after_join = true;
+ APP_ZIGBEE_IncrCompleteJoinCpt();
BSP_LED_On(LED_BLUE);
}
else
@@ -273,22 +289,31 @@ static void APP_ZIGBEE_NwkForm(void)
}
else
{
- /* Restart from persistence */
- if (APP_ZIGBEE_ZbStartupPersist(zigbee_app_info.zb) == ZB_STATUS_SUCCESS)
- {
- APP_DBG("APP_ZIGBEE_ZbStartupPersist SUCCESS!");
- zigbee_app_info.join_status = ZB_STATUS_SUCCESS;
- BSP_LED_On(LED_BLUE);
- }
- else
- {
- APP_DBG("APP_ZIGBEE_ZbStartupPersist FAILED!");
- }
+ /* Disabling of the notification */
+ ZbPersistNotifyRegister(zigbee_app_info.zb,NULL,NULL);
+
+ /* Restart from persistence */
+ if (APP_ZIGBEE_ZbStartupPersist(zigbee_app_info.zb) == ZB_STATUS_SUCCESS)
+ {
+ APP_DBG("APP_ZIGBEE_ZbStartupPersist SUCCESS!");
+ zigbee_app_info.join_status = ZB_STATUS_SUCCESS;
+
+ /* Register Persistent data change notification */
+ ZbPersistNotifyRegister(zigbee_app_info.zb,APP_ZIGBEE_persist_notify_cb,NULL);
+ /* Call the callback once here to save persistence data */
+ APP_ZIGBEE_persist_notify_cb(zigbee_app_info.zb,NULL);
+
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("APP_ZIGBEE_ZbStartupPersist FAILED!");
+ APP_ZIGBEE_ResetCompleteJoinCpt();
+ }
}
}
-
/* If Network forming/joining was not successful reschedule the current task to retry the process */
- if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (APP_GetCurrentProtocolMode() == ZIGBEE_ENABLE))
{
UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
}
@@ -297,7 +322,7 @@ static void APP_ZIGBEE_NwkForm(void)
zigbee_app_info.init_after_join = false;
/* Do it only first time */
- if(APP_ZIGBEE_GetStartNb() == 1U)
+ if(APP_ZIGBEE_GetCompleteJoinCpt() == 2U)
{
/* Assign ourselves to the group addresses */
APP_ZIGBEE_ConfigGroupAddr();
@@ -334,12 +359,14 @@ struct ZbStartupWaitInfo {
enum ZbStatusCodeT status;
};
+
static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
{
struct ZbStartupWaitInfo *info = cb_arg;
info->status = status;
info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
} /* ZbStartupWaitCb */
enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
@@ -359,173 +386,145 @@ enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
info->active = false;
return status;
}
- while (info->active) {
- UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
- }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
status = info->status;
free(info);
return status;
} /* ZbStartupWait */
-static void APP_ZIGBEE_IncrementStartNb(void)
-{
- zigbee_start_nb++;
-}
-
-static uint32_t APP_ZIGBEE_GetStartNb(void)
-{
- return zigbee_start_nb;
-}
-
-/* Persistence */
/**
- * @brief Start Zigbee Network with data from persistent memory
- * @param zb : Zigbee Device object
+ * @brief Increment counter
+ * @param None
* @retval None
*/
-enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb)
+static void APP_ZIGBEE_IncrCompleteJoinCpt(void)
{
- const void *buf_ptr;
- unsigned int buf_len;
- enum ZbStatusCodeT status = ZB_STATUS_SUCCESS;
-
- /* Restore persistence */
- buf_ptr = APP_ZIGBEE_persist_load(&buf_len);
- APP_ZIGBEE_persist_delete();
-
- if (buf_ptr != NULL) {
- APP_DBG("APP_ZIGBEE_ZbStartupPersist: restoring stack persistence");
- /* FIXME 0 - CBKE config? */
- status = ZbStartupPersist(zb, buf_ptr, buf_len, NULL);
- APP_ZIGBEE_persist_buf_free(buf_ptr);
-
- }else
- {
- status = ZB_STATUS_ALLOC_FAIL;
- }
-
- return status;
-
+ zigbee_complete_join_cpt ++;
}
/**
- * @brief Load persitent data
- * @param bufLen : pointer on buffer length
- * @retval None
+ * @brief Return counter value
+ * @param None
+ * @retval Counter value
*/
-static const void * APP_ZIGBEE_persist_load(unsigned int *bufLen)
+static uint32_t APP_ZIGBEE_GetCompleteJoinCpt(void)
{
- uint8_t *buf;
- uint32_t persist_len;
-
- buf = malloc(ST_PERSIST_MAX_ALLOC_SZ);
- if (buf == NULL) {
- APP_DBG("APP_ZIGBEE_persist_load : memory exhausted!");
- return NULL;
- }
-
- /* Read the persistence length */
- if (utilsFlashRead(0, buf, ST_PERSIST_FLASH_DATA_OFFSET) != ST_PERSIST_FLASH_DATA_OFFSET) {
- APP_DBG("APP_ZIGBEE_persist_load : failed to read length from Flash!");
- return NULL;
- }
- persist_len = pletoh32(buf);
- APP_DBG("ZIGBBE Persistent data length = %d ", persist_len);
- if (persist_len > ST_PERSIST_MAX_ALLOC_SZ) {
- APP_DBG("APP_ZIGBEE_persist_load : invalid length = %d!", persist_len);
- return NULL;
- }
-
- if (utilsFlashRead(ST_PERSIST_FLASH_DATA_OFFSET, buf, persist_len) != persist_len) {
- APP_DBG("APP_ZIGBEE_persist_load : failed to read persist data from Flash!");
- return NULL;
- }
-
- APP_DBG("Successfully retrieved data from persistence");
-
- *bufLen = persist_len;
- return buf;
+ return zigbee_complete_join_cpt;
}
/**
- * @brief Delete first word of persistent data (size = 0 meaning no data)
+ * @brief Reset counter value
* @param None
* @retval None
*/
-static void APP_ZIGBEE_persist_delete(void)
+static void APP_ZIGBEE_ResetCompleteJoinCpt(void)
{
- uint8_t len_buf[ST_PERSIST_FLASH_DATA_OFFSET];
-
- putle32(len_buf, 0);
- if (utilsFlashWrite(0, len_buf, ST_PERSIST_FLASH_DATA_OFFSET) != ST_PERSIST_FLASH_DATA_OFFSET) {
- APP_DBG("APP_ZIGBEE_persist_delete : failed to write flash");
- }
+ zigbee_complete_join_cpt = 1;
}
/**
- * @brief Free buffer
- * @param buf : pointer on buffer to free
+ * @brief Start Zigbee Network from persistent data
+ * @param zb: Zigbee device object pointer
+ * @retval Zigbee stack Status code
+ */
+static enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT* zb)
+{
+ bool read_status;
+ enum ZbStatusCodeT status = ZB_STATUS_SUCCESS;
+
+ /* Restore persistence */
+ read_status = APP_ZIGBEE_persist_load();
+
+ if (read_status)
+ {
+ /* Make sure the EPID is cleared, before we are allowed to restore persistence */
+ uint64_t epid = 0U;
+ ZbNwkSet(zb, ZB_NWK_NIB_ID_ExtendedPanId, &epid, sizeof(uint64_t));
+
+ /* Start-up from persistence */
+ APP_DBG("APP_ZIGBEE_ZbStartupPersist: restoring stack persistence");
+ status = ZbStartupPersist(zb, &cache_persistent_data.U8_data[4], cache_persistent_data.U32_data[0],NULL);
+ }
+ else
+ {
+ /* Failed to restart from persistence */
+ APP_DBG("APP_ZIGBEE_ZbStartupPersist: no persistence data to restore");
+ status = ZB_STATUS_ALLOC_FAIL;
+ }
+
+ return status;
+}/* APP_ZIGBEE_ZbStartupPersist */
+
+/**
+ * @brief notify to save persitent data callback
+ * @param zb: Zigbee device object pointer, cbarg: callback arg pointer
* @retval None
*/
-static void APP_ZIGBEE_persist_buf_free(const void *buf)
+static void APP_ZIGBEE_persist_notify_cb(struct ZigBeeT *zb, void *cbarg)
{
- free((void *)buf);
+ APP_DBG("Notification to save persistent data requested from stack");
+ /* Save the persistent data */
+ APP_ZIGBEE_persist_save();
}
+
/**
- * @brief Save persistent data in FLASH (Or Flash Emulation in RAM)
+ * @brief Load persitent data
* @param None
- * @retval None
+ * @retval true if sucess, false if fail
*/
-bool APP_ZIGBEE_persist_save(void)
+static bool APP_ZIGBEE_persist_load()
{
- uint8_t *buf;
- uint8_t len_buf[ST_PERSIST_FLASH_DATA_OFFSET];
- unsigned int len;
-
- len = ZbPersistGet(zigbee_app_info.zb, 0, 0);
- if (len == 0U) {
- /* If the persistence length was zero, then remove the file. */
- APP_DBG("APP_ZIGBEE_persist_save: no persistence data!");
- //cli_persist_delete(cli_p, filename);
- return true;
- }
- if (len > ST_PERSIST_MAX_ALLOC_SZ) {
- APP_DBG("APP_ZIGBEE_persist_save: persist size too large for storage (%d)", len);
+ /* Check length range */
+ if ((cache_persistent_data.U32_data[0] == 0) ||
+ (cache_persistent_data.U32_data[0] > ST_PERSIST_MAX_ALLOC_SZ))
+ {
+ APP_DBG("No data or too large lenght : %d",cache_persistent_data.U32_data[0]);
return false;
}
+ return true;
+} /* APP_ZIGBEE_persist_load */
- buf = malloc(ST_PERSIST_MAX_ALLOC_SZ);
- if (buf == NULL) {
- APP_DBG("APP_ZIGBEE_persist_save: memory exhausted");
- return false;
- }
+/**
+ * @brief Save persistent data
+ * @param None
+ * @retval true if success , false if fail
+ */
+static bool APP_ZIGBEE_persist_save(void)
+{
+ uint32_t len;
- len = ZbPersistGet(zigbee_app_info.zb, buf, len);
+ /* Clear the RAM cache before saving */
+ memset(cache_persistent_data.U8_data, 0x00, ST_PERSIST_MAX_ALLOC_SZ);
- /* Write the length */
- putle32(len_buf, len);
- if (utilsFlashWrite(0, len_buf, ST_PERSIST_FLASH_DATA_OFFSET) != ST_PERSIST_FLASH_DATA_OFFSET) {
- APP_DBG("APP_ZIGBEE_persist_save: failed to write flash");
- free(buf);
+ len = ZbPersistGet(zigbee_app_info.zb, 0, 0);
+ /* Check Length range */
+ if (len == 0U)
+ {
+ /* If the persistence length was zero then no data available. */
+ APP_DBG("APP_ZIGBEE_persist_save: no persistence data to save !");
return false;
}
-
- /* Write the persistent data */
- if (utilsFlashWrite(ST_PERSIST_FLASH_DATA_OFFSET, buf, len) != len) {
- APP_DBG("APP_ZIGBEE_persist_save: failed to write flash");
- free(buf);
+ if (len > ST_PERSIST_MAX_ALLOC_SZ)
+ {
+ /* if persistence length to big to store */
+ APP_DBG("APP_ZIGBEE_persist_save: persist size too large for storage (%d)", len);
return false;
}
- free(buf);
+ /* Store in cache the persistent data */
+ len = ZbPersistGet(zigbee_app_info.zb, &cache_persistent_data.U8_data[ST_PERSIST_FLASH_DATA_OFFSET], len);
+
+ /* Store in cache the persistent data length */
+ cache_persistent_data.U32_data[0] = len;
zigbee_app_info.persistNumWrites++;
- APP_DBG("APP_ZIGBEE_persist_save: Persistence written (num writes = %d)", zigbee_app_info.persistNumWrites);
- return true;
-}
+ APP_DBG("APP_ZIGBEE_persist_save: Persistence written in cache RAM (num writes = %d) len=%d",
+ zigbee_app_info.persistNumWrites, cache_persistent_data.U32_data[0]);
+ return true;
+} /* APP_ZIGBEE_persist_save */
/**
@@ -807,4 +806,16 @@ void APP_ZIGBEE_ProcessRequestM0ToM4(void)
}
}
+/**
+ * @brief Delete persistent data
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_delete(void)
+{
+ /* Clear RAM cache */
+ memset(cache_persistent_data.U8_data, 0x00, ST_PERSIST_MAX_ALLOC_SZ);
+ APP_DBG("Persistent Data RAM cache cleared");
+
+} /* APP_ZIGBEE_persist_delete */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/p2p_server_app.c
index 7ca76bb29..3161fa059 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/p2p_server_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/p2p_server_app.c
@@ -151,15 +151,15 @@ void P2PS_STM_App_Notification(P2PS_STM_App_Notification_evt_t *pNotification)
APP_DBG_MSG(" \n\r");
P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
}
- /* Switch to Thread */
+ /* Switch to Zigbee */
if(pNotification->DataTransfered.pPayload[1] == 0x02)
{
BSP_LED_Off(LED_BLUE);
APP_DBG("SYSTEM: SWITCH TO THREAD");
- APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : SWITCH TO THREAD\n");
+ APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : SWITCH TO ZIGBEE\n");
APP_DBG_MSG(" \n\r");
/* Set "Switch Protocol" Task */
- UTIL_SEQ_SetTask(1<<CFG_Task_Switch_Protocol,CFG_SCH_PRIO_0);
+ UTIL_SEQ_SetTask(1<<CFG_TASK_INIT_SWITCH_PROTOCOL,CFG_SCH_PRIO_0);
}
}
#endif
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/CKS/CKS_Crypt/Keys/Store_keys.bat b/Projects/P-NUCLEO-WB55.Nucleo/Applications/CKS/CKS_Crypt/Keys/Store_keys.bat
new file mode 100644
index 000000000..d17dea8af
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/CKS/CKS_Crypt/Keys/Store_keys.bat
@@ -0,0 +1,21 @@
+echo off
+REM Set CubeProgrammer path release 2.1 and above
+SET PROG="C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer2\bin\STM32_Programmer_CLI.exe"
+
+REM Next commands use bootloader with USB connection
+REM Store 128 bits key in clear format
+%PROG% -c port=usb1 -wusrkey Simple_128.bin
+
+REM Store 256 bits key in clear format
+%PROG% -c port=usb1 -wusrkey Simple_256.bin
+
+REM Store 128 bits master key in clear format
+REM Index reported is 0x0: OK or 0xFF: Master key already here
+%PROG% -c port=usb1 -wusrkey Master.bin
+
+REM Store 128 bits key encrypted with master key
+%PROG% -c port=usb1 -wusrkey Encrypted_128.bin
+
+REM Store 128 bits key encrypted with master key
+%PROG% -c port=usb1 -wusrkey Encrypted_256.bin
+pause
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/EWARM/.gitignore b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/EWARM/.gitignore
new file mode 100644
index 000000000..2cbca2ce9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/EWARM/.gitignore
@@ -0,0 +1,4 @@
+settings/*
+STM32WBxx_Nucleo/*
+Mac_802_15_4_FFD_Demo.ewt
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/app_common.h
index edef96642..e6e423501 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/app_common.h
@@ -61,10 +61,6 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
-#define MAX( x, y ) (((x)>(y))?(x):(y))
-
-#define MIN( x, y ) (((x)<(y))?(x):(y))
-
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
@@ -105,9 +101,6 @@ extern "C" {
#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
-/* Exported functions prototypes ---------------------------------------------*/
-void Error_Handler(void);
-
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/main.h
index 9ddae28d9..4d6c32bbe 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/main.h
@@ -56,6 +56,8 @@ extern "C" {
/* USER CODE END EM */
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
/* USER CODE BEGIN EFP */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/stm_logging.h
new file mode 100644
index 000000000..84270802b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/inc/stm_logging.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * @file stm_logging.h
+ * @author MCD Application Team
+ * @brief Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0U /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum
+{
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_OPENTHREAD_API = 2U, /* OpenThread API */
+ APPLI_LOG_REGION_OT_API_LINK = 3U, /* OpenThread Link API */
+ APPLI_LOG_REGION_OT_API_INSTANCE = 4U, /* OpenThread Instance API */
+ APPLI_LOG_REGION_OT_API_MESSAGE = 5U /* OpenThread Message API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/stm32wbxx_hal_msp.c
index a3f4cac8c..391d219eb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/stm32wbxx_hal_msp.c
@@ -23,6 +23,7 @@
/* Includes ------------------------------------------------------------------*/
#include "app_conf.h"
#include "app_common.h"
+#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/EWARM/.gitignore b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/EWARM/.gitignore
new file mode 100644
index 000000000..7472315df
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/EWARM/.gitignore
@@ -0,0 +1,4 @@
+settings/*
+STM32WBxx_Nucleo/*
+Mac_802_15_4_LPM_Periodic_Transmit.ewt
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4.c
index 4af242c1a..f5cd8c846 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4.c
@@ -25,6 +25,7 @@
#include "app_conf.h"
#include "utilities_common.h"
#include "app_entry.h"
+#include "main.h"
#include "app_lpm_transmit_mac_802_15_4.h"
#include "802_15_4_mac_sap.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4_process.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4_process.c
index 927ed44bc..0c1cb67ba 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4_process.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/app/app_lpm_transmit_mac_802_15_4_process.c
@@ -21,9 +21,11 @@
******************************************************************************
*/
+
+#include "app_common.h"
#include "app_lpm_transmit_mac_802_15_4.h"
#include "app_lpm_transmit_mac_802_15_4_process.h"
-#include "app_common.h"
+#include "main.h"
#include "shci.h"
#include "stm32_seq.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/STM32_WPAN/target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/EWARM/.gitignore b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/EWARM/.gitignore
new file mode 100644
index 000000000..acbc834a1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/EWARM/.gitignore
@@ -0,0 +1,4 @@
+settings/*
+STM32WBxx_Nucleo/*
+Mac_802_15_4_RFD_Demo.ewt
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h
new file mode 100644
index 000000000..836f40dcf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h
@@ -0,0 +1,115 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h
new file mode 100644
index 000000000..6f9269921
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h
@@ -0,0 +1,360 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+ /**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum
+{
+ CFG_TASK_MSG_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ /* USER CODE BEGIN CFG_IdleTask_Id_t */
+ CFG_TASK_SEND_BUFFER,
+ CFG_TASK_PROVISIONING,
+ /* USER CODE END CFG_IdleTask_Id_t */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+/* USER CODE BEGIN DEFINE_TASK */
+#define TASK_SEND_BUFFER (1U << CFG_TASK_SEND_BUFFER)
+#define TASK_PROVISIONING (1U << CFG_TASK_PROVISIONING)
+/* USER CODE END DEFINE_TASK */
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+ /**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ /* USER CODE BEGIN CFG_IdleEvt_Id_t */
+ CFG_EVT_RESPONSE_ACK,
+ /* USER CODE END CFG_IdleEvt_Id_t */
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+/* USER CODE BEGIN DEFINE_EVENT */
+#define EVENT_RESPONSE_ACK (1U << CFG_EVT_RESPONSE_ACK)
+/* USER CODE END DEFINE_EVENT */
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_THREAD,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..297f7cee0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f580a14ee
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,359 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..6ac5b7b53
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h
@@ -0,0 +1,59 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum
+{
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_OPENTHREAD_API = 2U, /* OpenThread API */
+ APPLI_LOG_REGION_OT_API_LINK = 3U, /* OpenThread Link API */
+ APPLI_LOG_REGION_OT_API_INSTANCE = 4U, /* OpenThread Instance API */
+ APPLI_LOG_REGION_OT_API_MESSAGE = 5U /* OpenThread Message API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..66e0e60c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h
@@ -0,0 +1,53 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#include "app_thread.h"
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA)
+#define VCP_TASK_PRIO (CFG_SCH_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c
new file mode 100644
index 000000000..c0478d8be
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c
@@ -0,0 +1,430 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_thread.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC(( sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Global function prototypes -----------------------------------------------*/
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+
+/* USER CODE BEGIN GFP */
+
+/* USER CODE END GFP */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void Init_Debug( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+static void APPE_SysUserEvtRx( void * pPayload );
+static void APPE_SysEvtReadyProcessing( void );
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ Init_Debug();
+
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch(ErrorCode)
+ {
+ case ERR_THREAD_LLD_FATAL_ERROR:
+ APP_DBG("** ERR_THREAD : LLD_FATAL_ERROR \n");
+ break;
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_THREAD : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_THREAD : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ APP_THREAD_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch(evt_waited_bm)
+ {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Does not allow other tasks when waiting for OT Cmd response */
+ UTIL_SEQ_Run(0);
+ break;
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Run only the task CFG_TASK_MSG_FROM_M0_TO_M4 */
+ UTIL_SEQ_Run(TASK_MSG_FROM_M0_TO_M4);
+ break;
+ default :
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..e0e4fcb5d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c
new file mode 100644
index 000000000..ce910235c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c
new file mode 100644
index 000000000..2874778d1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c
@@ -0,0 +1,616 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Thread_FTD_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+#include "app_common.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+
+RTC_HandleTypeDef hrtc;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+/* USER CODE BEGIN PFP */
+void PeriphClock_Config(void);
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Reset_BackupDomain( void );
+static void Init_Exti( void );
+static void Config_HSE(void);
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+ Reset_Device();
+ Config_HSE();
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Init code for STM32_WPAN */
+ APPE_Init();
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ HAL_PWR_EnableBkUpAccess();
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN LPUART1_Init 0 */
+
+ /* USER CODE END LPUART1_Init 0 */
+
+ /* USER CODE BEGIN LPUART1_Init 1 */
+
+ /* USER CODE END LPUART1_Init 1 */
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN LPUART1_Init 2 */
+
+ /* USER CODE END LPUART1_Init 2 */
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART1_Init 0 */
+
+ /* USER CODE END USART1_Init 0 */
+
+ /* USER CODE BEGIN USART1_Init 1 */
+
+ /* USER CODE END USART1_Init 1 */
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART1_Init 2 */
+
+ /* USER CODE END USART1_Init 2 */
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+ /* USER CODE BEGIN RF_Init 0 */
+
+ /* USER CODE END RF_Init 0 */
+
+ /* USER CODE BEGIN RF_Init 1 */
+
+ /* USER CODE END RF_Init 1 */
+ /* USER CODE BEGIN RF_Init 2 */
+
+ /* USER CODE END RF_Init 2 */
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+ /* USER CODE BEGIN RTC_Init 0 */
+
+ /* USER CODE END RTC_Init 0 */
+
+ /* USER CODE BEGIN RTC_Init 1 */
+
+ /* USER CODE END RTC_Init 1 */
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+/* USER CODE END 4 */
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..6fdb80557
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,336 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..636b316a4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,383 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+extern UART_HandleTypeDef hlpuart1;
+extern UART_HandleTypeDef huart1;
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles EXTI4_IRQ Handler.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c
new file mode 100644
index 000000000..8c76e703c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c
@@ -0,0 +1,211 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion)
+ {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_OPENTHREAD_API:
+ strcpy(logRegionString, "[M4 OPENTHREAD API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_LINK:
+ strcpy(logRegionString, "[M4 LINK API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_INSTANCE:
+ strcpy(logRegionString, "[M4 INSTANCE API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_MESSAGE:
+ strcpy(logRegionString, "[M4 MESSAGE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww
new file mode 100644
index 000000000..f4f0dc304
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<workspace>
+ <project>
+ <path>$WS_DIR$\Thread_Coap_DataTransfer.ewp</path>
+ </project>
+ <batchBuild/>
+</workspace>
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewd
new file mode 100644
index 000000000..d2f102d79
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Thread_Coap_DataTransfer</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state />
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state />
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state />
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state />
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state />
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state />
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state />
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state />
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state />
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state />
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state />
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state />
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state />
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state />
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state />
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state />
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewp
new file mode 100644
index 000000000..826f2151d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Thread_Coap_DataTransfer.ewp
@@ -0,0 +1,1540 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Thread_Coap_DataTransfer</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>P-NUCLEO-WB55.Nucleo\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>P-NUCLEO-WB55.Nucleo\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>P-NUCLEO-WB55.Nucleo\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.60.2.11347</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>THREAD_WB</state>
+ <state>STM32WB55xx</state>
+ <state>ST_OT_DEBUG</state>
+ <state>FRAMEWORK_1</state>
+ <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\App</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\Target</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\stack\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\stack\include\openthread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../tiny_lpm</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Project.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data></data>
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Thread_Coap_DataTransfer.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data></data>
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <group>
+ <name>src</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/stm_logging.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/stm32wbxx_hal_msp.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>app</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_thread.c</name>
+ </file>
+ </group>
+ <group>
+ <name>target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$/../STM32_WPAN/App/app_thread.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$/../STM32_WPAN/Target/hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$/../Core/Src/system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_adc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_adc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_ipcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_ll_usb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_thread_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>thread</name>
+ <group>
+ <name>openthread</name>
+ <group>
+ <name>core</name>
+ <group>
+ <name>openthread_api</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_manager.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_monitor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\child_supervision.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\coap.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\commissioner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\crypto.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\diag.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dns.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\icmp6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\instance.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\ip6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\jam_detection.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\joiner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link_raw.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\message.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\netdata.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\network_time.cpp</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread_api_wb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\radio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\tasklet.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\udp.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+</project>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,528 @@
+;/********************* COPYRIGHT(c) 2019 STMicroelectronics ********************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;********************************************************************************
+;*
+;* 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 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 STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+;*
+;*******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD USB_FS_WKUP_CRS_IRQHandler ; USB Full speed wakeup
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK USB_FS_WKUP_CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_FS_WKUP_CRS_IRQHandler
+ B USB_FS_WKUP_CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+ END
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..46f07d1f3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvoptx
new file mode 100644
index 000000000..cd5a76e59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvoptx
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+ <Target>
+ <TargetName>P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath />
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>0</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <nTsel>13</nTsel>
+ <sDll />
+ <sDllPa />
+ <sDlgDll />
+ <sDlgPa />
+ <sIfile />
+ <tDll />
+ <tDllPa />
+ <tDlgDll />
+ <tDlgPa />
+ <tIfile />
+ <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ST-LINKIII-KEIL_SWO</Key>
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RG$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key />
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RG$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable />
+ <LintConfigFile />
+ </TargetOption>
+ </Target>
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvprojx
new file mode 100644
index 000000000..17be484ee
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Thread_Coap_DataTransfer.uvprojx
@@ -0,0 +1,861 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="project_proj.xsd">
+
+ <SchemaVersion>1.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
+ <FlashUtilSpec/>
+ <StartupFile/>
+ <FlashDriverDll/>
+ <DeviceId/>
+ <RegisterFile/>
+ <MemoryEnv/>
+ <Cmp/>
+ <Asm/>
+ <Linker/>
+ <OHString/>
+ <InfinionOptionDll/>
+ <SLE66CMisc/>
+ <SLE66AMisc/>
+ <SLE66LinkerMisc/>
+ <SFDFile/>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath/>
+ <IncludePath/>
+ <LibPath/>
+ <RegisterFilePath/>
+ <DBRegisterFilePath/>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>P-NUCLEO-WB55.Nucleo\Exe\</OutputDirectory>
+ <OutputName>Project</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath>P-NUCLEO-WB55.Nucleo\List</ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf #L --bin --output=$L@L.bin</UserProg1Name>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString/>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument/>
+ <IncludeLibraryModules/>
+ <ComprImg/>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ <Simulator>
+ <UseSimulator>0</UseSimulator>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>1</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+ <RestoreSysVw>1</RestoreSysVw>
+ </Simulator>
+ <Target>
+ <UseTarget>1</UseTarget>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>0</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <RestoreTracepoints>1</RestoreTracepoints>
+ <RestoreSysVw>1</RestoreSysVw>
+ </Target>
+ <RunDebugAfterBuild>0</RunDebugAfterBuild>
+ <TargetSelection>13</TargetSelection>
+ <SimDlls>
+ <CpuDll/>
+ <CpuDllArguments/>
+ <PeripheralDll/>
+ <PeripheralDllArguments/>
+ <InitializationFile/>
+ </SimDlls>
+ <TargetDlls>
+ <CpuDll/>
+ <CpuDllArguments/>
+ <PeripheralDll/>
+ <PeripheralDllArguments/>
+ <InitializationFile/>
+ <Driver>STLink\ST-LINKIII-KEIL_SWO.dll</Driver>
+ </TargetDlls>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4107</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
+ <Flash3/>
+ <Flash4/>
+ <pFcarmOut/>
+ <pFcarmGrp/>
+ <pFcArmRoot/>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName/>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress/>
+ <Size/>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress/>
+ <Size/>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress/>
+ <Size/>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress/>
+ <Size/>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector/>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <useXO>0</useXO>
+ <VariousControls>
+ <MiscControls/>
+ <Define>CORE_CM4,USE_HAL_DRIVER,USE_STM32WBXX_NUCLEO,THREAD_WB,STM32WB55xx,ST_OT_DEBUG,FRAMEWORK_1,OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</Define>
+ <Undefine/>
+ <IncludePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/;../Core/Inc;../STM32_WPAN/App;../STM32_WPAN/Target;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <VariousControls>
+ <MiscControls/>
+ <Define/>
+ <Undefine/>
+ <IncludePath/>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase/>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs/>
+ <IncludeLibsPath/>
+ <Misc/>
+ <LinkerInputFile/>
+ <DisabledWarnings/>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/Core/src</GroupName>
+ <Files>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_msp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_hal_msp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_logging.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm_logging.c</FilePath>
+ </File>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/app</GroupName>
+ <Files>
+ <File>
+ <FileName>app_thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/App/app_thread.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/Target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_nucleo.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_adc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_adc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_hsem.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_ll_usb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_thread_hci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api</GroupName>
+ <Files>
+ <File>
+ <FileName>channel_manager.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</FilePath>
+ </File>
+ <File>
+ <FileName>channel_monitor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</FilePath>
+ </File>
+ <File>
+ <FileName>child_supervision.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</FilePath>
+ </File>
+ <File>
+ <FileName>coap.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</FilePath>
+ </File>
+ <File>
+ <FileName>commissioner.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</FilePath>
+ </File>
+ <File>
+ <FileName>crypto.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</FilePath>
+ </File>
+ <File>
+ <FileName>dataset.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</FilePath>
+ </File>
+ <File>
+ <FileName>dataset_ftd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</FilePath>
+ </File>
+ <File>
+ <FileName>dhcp6_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>dhcp6_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>diag.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</FilePath>
+ </File>
+ <File>
+ <FileName>dns.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</FilePath>
+ </File>
+ <File>
+ <FileName>icmp6.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</FilePath>
+ </File>
+ <File>
+ <FileName>instance.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</FilePath>
+ </File>
+ <File>
+ <FileName>ip6.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</FilePath>
+ </File>
+ <File>
+ <FileName>jam_detection.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</FilePath>
+ </File>
+ <File>
+ <FileName>joiner.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</FilePath>
+ </File>
+ <File>
+ <FileName>link.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</FilePath>
+ </File>
+ <File>
+ <FileName>link_raw.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</FilePath>
+ </File>
+ <File>
+ <FileName>message.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</FilePath>
+ </File>
+ <File>
+ <FileName>netdata.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</FilePath>
+ </File>
+ <File>
+ <FileName>network_time.cpp</FileName>
+ <FileType>8</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</FilePath>
+ </File>
+ <File>
+ <FileName>openthread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</FilePath>
+ </File>
+ <File>
+ <FileName>openthread_api_wb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</FilePath>
+ </File>
+ <File>
+ <FileName>radio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</FilePath>
+ </File>
+ <File>
+ <FileName>server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</FilePath>
+ </File>
+ <File>
+ <FileName>tasklet.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</FilePath>
+ </File>
+ <File>
+ <FileName>thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</FilePath>
+ </File>
+ <File>
+ <FileName>thread_ftd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</FilePath>
+ </File>
+ <File>
+ <FileName>udp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+
+ </Target>
+ </Targets>
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.3.0" condition="CMSIS Core">
+ <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.5.0"/>
+ <targetInfos>
+ <targetInfo name="P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+</Project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c
new file mode 100644
index 000000000..624d1aefe
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c
@@ -0,0 +1,1299 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : App/app_thread.c
+ * Description : Thread Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_thread.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "openthread_api_wb.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#include "vcp.h"
+#include "vcp_conf.h"
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "data_transfer.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define C_SIZE_CMD_STRING 256U
+#define C_PANID 0x2226U
+#define C_CHANNEL_NB 19U
+
+/* USER CODE BEGIN PD */
+#define C_RESSOURCE_DATA_TRANSFER "dataTransfer"
+#define C_RESSOURCE_Provisioning "provisioning"
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_THREAD_CheckWirelessFirmwareInfo(void);
+static void APP_THREAD_DeviceConfig(void);
+static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext);
+static void APP_THREAD_TraceError(const char * pMess, uint32_t ErrCode);
+#if (CFG_FULL_LOW_POWER == 0)
+static void Send_CLI_To_M0(void);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+static void Send_CLI_Ack_For_OT(void);
+static void HostTxCb( void );
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+static uint32_t ProcessCmdString(uint8_t* buf , uint32_t len);
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static void RxCpltCallback(void);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* USER CODE BEGIN PFP */
+static void APP_THREAD_CheckMsgValidity(void);
+static void APP_THREAD_SendNextBuffer(void);
+static void APP_THREAD_DummyReqHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapDataReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_ProvisioningReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static otError APP_THREAD_ProvisioningRespSend(otCoapHeader* pRequestHeader,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_ProvisioningReqSend(void);
+static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
+static void APP_THREAD_SendCoapUnicastRequest(void);
+static void APP_THREAD_DataRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
+static void APP_THREAD_DummyRespHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
+static void APP_THREAD_AskProvisioning(void);
+/* USER CODE END PFP */
+
+/* Private variables -----------------------------------------------*/
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+static uint8_t TmpString[C_SIZE_CMD_STRING];
+static uint8_t VcpRxBuffer[sizeof(TL_CmdSerial_t)]; /* Received Data over USB are stored in this buffer */
+static uint8_t VcpTxBuffer[sizeof(TL_EvtPacket_t) + 254U]; /* Transmit buffer over USB */
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static uint8_t aRxBuffer[C_SIZE_CMD_STRING];
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_FULL_LOW_POWER == 0)
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+static __IO uint16_t indexReceiveChar = 0;
+static __IO uint16_t CptReceiveCmdFromUser = 0;
+
+static TL_CmdPacket_t *p_thread_otcmdbuffer;
+static TL_EvtPacket_t *p_thread_notif_M0_to_M4;
+static __IO uint32_t CptReceiveMsgFromM0 = 0;
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_TH_Config_t ThreadConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
+
+/* USER CODE BEGIN PV */
+static otCoapResource OT_RessourceDataTransfer = {C_RESSOURCE_DATA_TRANSFER, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapDataReqHandler, NULL};
+static otCoapResource OT_RessourceProvisionning = {C_RESSOURCE_Provisioning, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_ProvisioningReqHandler, NULL};
+static otMessageInfo OT_MessageInfo = {0};
+static otCoapHeader OT_Header = {0};
+static uint8_t OT_Command = 0;
+static uint16_t OT_BufferIdRead = 1U;
+static uint16_t OT_BufferIdSend = 1U;
+static uint8_t OT_BufferSend[COAP_PAYLOAD_MAX_LENGTH] = {0};
+static uint8_t OT_BufferReceived[COAP_PAYLOAD_MAX_LENGTH] = {0};
+static otMessage * pOT_Message = NULL;
+static otIp6Address OT_PeerAddress = { .mFields.m8 = { 0 } };
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+
+void APP_THREAD_Init( void )
+{
+ /* USER CODE BEGIN APP_THREAD_INIT_1 */
+
+ /* USER CODE END APP_THREAD_INIT_1 */
+
+ SHCI_CmdStatus_t ThreadInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_THREAD_CheckWirelessFirmwareInfo();
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ VCP_Init(&VcpTxBuffer[0], &VcpRxBuffer[0]);
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+ /* Register cmdbuffer */
+ APP_THREAD_RegisterCmdBuffer(&ThreadOtCmdBuffer);
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_THREAD, UTIL_LPM_DISABLE);
+
+ /* Init config buffer and call TL_THREAD_Init */
+ APP_THREAD_TL_THREAD_INIT();
+
+ /* Configure UART for sending CLI command from M4 */
+ APP_THREAD_Init_UART_CLI();
+
+ /* Send Thread start system cmd to M0 */
+ ThreadInitStatus = SHCI_C2_THREAD_Init();
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ThreadInitStatus);
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_MSG_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_THREAD_ProcessMsgM0ToM4);
+
+ /* USER CODE BEGIN INIT TASKS */
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_SEND_BUFFER, UTIL_SEQ_RFU, APP_THREAD_SendNextBuffer);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_PROVISIONING, UTIL_SEQ_RFU, APP_THREAD_AskProvisioning);
+ /* USER CODE END INIT TASKS */
+
+ /* Initialize and configure the Thread device*/
+ APP_THREAD_DeviceConfig();
+
+ /* USER CODE BEGIN APP_THREAD_INIT_2 */
+ /* USER CODE END APP_THREAD_INIT_2 */
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_THREAD_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ /* USER CODE BEGIN APP_THREAD_Error_1 */
+
+ /* USER CODE END APP_THREAD_Error_1 */
+ switch(ErrId)
+ {
+ case ERR_REC_MULTI_MSG_FROM_M0 :
+ APP_THREAD_TraceError("ERROR : ERR_REC_MULTI_MSG_FROM_M0 ", ErrCode);
+ break;
+ case ERR_THREAD_SET_STATE_CB :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SET_STATE_CB ",ErrCode);
+ break;
+ case ERR_THREAD_SET_CHANNEL :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SET_CHANNEL ",ErrCode);
+ break;
+ case ERR_THREAD_SET_PANID :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SET_PANID ",ErrCode);
+ break;
+ case ERR_THREAD_IPV6_ENABLE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_IPV6_ENABLE ",ErrCode);
+ break;
+ case ERR_THREAD_START :
+ APP_THREAD_TraceError("ERROR: ERR_THREAD_START ", ErrCode);
+ break;
+ case ERR_THREAD_ERASE_PERSISTENT_INFO :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_ERASE_PERSISTENT_INFO ",ErrCode);
+ break;
+ case ERR_THREAD_CHECK_WIRELESS :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_CHECK_WIRELESS ",ErrCode);
+ break;
+ /* USER CODE BEGIN APP_THREAD_Error_2 */
+ case ERR_THREAD_COAP_START :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_START ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_ADD_RESSOURCE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_ADD_RESSOURCE ",ErrCode);
+ break;
+ case ERR_THREAD_MESSAGE_READ :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_MESSAGE_READ ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_SEND_RESPONSE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_SEND_RESPONSE ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_APPEND :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_APPEND ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_SEND_REQUEST :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_SEND_REQUEST ",ErrCode);
+ break;
+ case ERR_THREAD_SETUP :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SETUP ", ErrCode);
+ break;
+ case ERR_THREAD_LINK_MODE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_LINK_MODE ", ErrCode);
+ break;
+ case ERR_ALLOC_MSG :
+ APP_THREAD_TraceError("ERROR : ERR_ALLOC_MSG ", ErrCode);
+ break;
+ case ERR_FILE_RESP_HANDLER :
+ APP_THREAD_TraceError("ERROR : ERR_FILE_RESP_HANDLER ", ErrCode);
+ break;
+ case ERR_MSG_COMPARE_FAILED :
+ APP_THREAD_TraceError("ERROR : ERR_MSG_COMPARE_FAILED ", ErrCode);
+ break;
+ case ERR_NEW_MSG_ALLOC:
+ APP_THREAD_TraceError("ERROR : ERR_NEW_MSG_ALLOC ", ErrCode);
+ break;
+ case ERR_PROVISIONING_RESP:
+ APP_THREAD_TraceError("ERROR : ERR_PROVISIONING_RESP ", ErrCode);
+ break;
+ case ERR_THREAD_DATA_RESPONSE:
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_DATA_RESPONSE ", ErrCode);
+ break;
+ case ERR_APPEND:
+ APP_THREAD_TraceError("ERROR : ERR_APPEND ", ErrCode);
+ break;
+ case ERR_HEADER_INIT:
+ APP_THREAD_TraceError("ERROR : ERR_HEADER_INIT ", ErrCode);
+ break;
+ case ERR_TOKEN:
+ APP_THREAD_TraceError("ERROR : ERR_TOKEN ", ErrCode);
+ break;
+ /* USER CODE END APP_THREAD_Error_2 */
+ default :
+ APP_THREAD_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Thread initialization.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_DeviceConfig(void)
+{
+ otError error;
+ error = otInstanceErasePersistentInfo(NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_ERASE_PERSISTENT_INFO,error);
+ }
+ otInstanceFinalize(NULL);
+ otInstanceInitSingle();
+ error = otSetStateChangedCallback(NULL, APP_THREAD_StateNotif, NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_STATE_CB,error);
+ }
+ error = otLinkSetChannel(NULL, C_CHANNEL_NB);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_CHANNEL,error);
+ }
+ error = otLinkSetPanId(NULL, C_PANID);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_PANID,error);
+ }
+ error = otIp6SetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_IPV6_ENABLE,error);
+ }
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_START,error);
+ }
+
+ /* USER CODE BEGIN DEVICECONFIG */
+ /* Start the COAP server */
+ error = otCoapStart(NULL, OT_DEFAULT_COAP_PORT);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_START,error);
+ }
+ /* Add COAP resources */
+ error = otCoapAddResource(NULL, &OT_RessourceDataTransfer);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE,error);
+ }
+ /* Add APP_THREAD_AskProvisioning resources */
+ error = otCoapAddResource(NULL, &OT_RessourceProvisionning);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE,error);
+ }
+ /* USER CODE END DEVICECONFIG */
+}
+
+/**
+ * @brief Thread notification when the state changes.
+ * @param aFlags : Define the item that has been modified
+ * aContext: Context
+ *
+ * @retval None
+ */
+static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
+
+ /* USER CODE BEGIN APP_THREAD_STATENOTIF */
+ static uint32_t provisioning = 0;
+ /* USER CODE END APP_THREAD_STATENOTIF */
+
+ if ((NotifFlags & (uint32_t)OT_CHANGED_THREAD_ROLE) == (uint32_t)OT_CHANGED_THREAD_ROLE)
+ {
+ switch (otThreadGetDeviceRole(NULL))
+ {
+ case OT_DEVICE_ROLE_DISABLED:
+ /* USER CODE BEGIN OT_DEVICE_ROLE_DISABLED */
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_DISABLED */
+ break;
+ case OT_DEVICE_ROLE_DETACHED:
+ /* USER CODE BEGIN OT_DEVICE_ROLE_DETACHED */
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_DETACHED */
+ break;
+ case OT_DEVICE_ROLE_CHILD:
+ /* USER CODE BEGIN OT_DEVICE_ROLE_CHILD */
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ if (provisioning == 0)
+ {
+ HAL_Delay(3000U);
+ UTIL_SEQ_SetTask(TASK_PROVISIONING, CFG_SCH_PRIO_1);
+ }
+ provisioning = 1U;
+ /* USER CODE END OT_DEVICE_ROLE_CHILD */
+ break;
+ case OT_DEVICE_ROLE_ROUTER :
+ /* USER CODE BEGIN OT_DEVICE_ROLE_ROUTER */
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_ROUTER */
+ break;
+ case OT_DEVICE_ROLE_LEADER :
+ /* USER CODE BEGIN OT_DEVICE_ROLE_LEADER */
+ BSP_LED_On(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_LEADER */
+ break;
+ default:
+ /* USER CODE BEGIN DEFAULT */
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END DEFAULT */
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (OpenThread or other module if any)
+ * @retval None
+ */
+static void APP_THREAD_TraceError(const char * pMess, uint32_t ErrCode)
+{
+ /* USER CODE BEGIN TRACE_ERROR */
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while(1U == 1U)
+ {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+ /* USER CODE END TRACE_ERROR */
+}
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Thread
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_THREAD_Error((uint32_t)ERR_THREAD_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_THREAD_FTD :
+ APP_DBG("FW Type : Thread FTD");
+ break;
+ case INFO_STACK_TYPE_THREAD_MTD :
+ APP_DBG("FW Type : Thread MTD");
+ break;
+ case INFO_STACK_TYPE_BLE_THREAD_FTD_STATIC :
+ APP_DBG("FW Type : Static Concurrent Mode BLE/Thread");
+ break;
+ default :
+ /* No Thread device supported ! */
+ APP_THREAD_Error((uint32_t)ERR_THREAD_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+}
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+/**
+ * @brief This function is used to compare the message received versus
+ * the original message.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_CheckMsgValidity(void)
+{
+ uint16_t mMsgId=OT_BufferIdRead - 1U; /* Corrected MsgId (MsgId starts at 1, not at 0) */
+ uint32_t mOffset = COAP_PAYLOAD_MAX_LENGTH*mMsgId; /* the starting offset */
+ uint32_t i;
+ bool valid =true;
+
+ for(i = mOffset; i < mOffset+COAP_PAYLOAD_MAX_LENGTH; i++)
+ {
+ if(OT_BufferReceived[i-mOffset] != aDataBuffer[i])
+ {
+ valid =false;
+ }
+ }
+
+ if(valid == false)
+ APP_THREAD_Error(ERR_MSG_COMPARE_FAILED, 0);
+}
+
+/**
+ * @brief This function compute the next message to be send
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SendNextBuffer(void)
+{
+ uint16_t j;
+ uint16_t mOffset;
+
+ if (OT_BufferIdSend < 5U)
+ {
+ /* Prepare next buffers to be send */
+ OT_BufferIdSend++;
+ mOffset=(OT_BufferIdSend - 1U) * COAP_PAYLOAD_MAX_LENGTH;
+
+ memset(OT_BufferSend, 0, COAP_PAYLOAD_MAX_LENGTH);
+ for(j = mOffset; j < mOffset + COAP_PAYLOAD_MAX_LENGTH; j++)
+ {
+ OT_BufferSend[j - mOffset] = aDataBuffer[j];
+ }
+
+ /* Send the data in unicast mode */
+ APP_THREAD_SendCoapUnicastRequest();
+ }
+ else
+ {
+ /* Buffer transfer has been successfully transfered */
+ BSP_LED_On(LED1);
+ APP_DBG(" ********* BUFFER HAS BEEN TRANFERED \r\n");
+ }
+}
+
+/**
+ * @brief Dummy request handler
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_DummyReqHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+}
+
+/**
+ * @brief Data request handler triggered at the reception of the COAP message
+ * @param pHeader header pointer
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @retval None
+ */
+static void APP_THREAD_CoapDataReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+ do
+ {
+ APP_DBG(" ********* APP_THREAD_CoapDataReqHandler \r\n");
+ if (otCoapHeaderGetType(pHeader) != OT_COAP_TYPE_CONFIRMABLE &&
+ otCoapHeaderGetType(pHeader) != OT_COAP_TYPE_NON_CONFIRMABLE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE, 0);
+ break;
+ }
+
+ if (otCoapHeaderGetCode(pHeader) != OT_COAP_CODE_PUT)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE, 0);
+ break;
+ }
+
+ if (otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_BufferReceived, sizeof(OT_BufferReceived)) != sizeof(OT_BufferReceived))
+ {
+ APP_THREAD_Error(ERR_THREAD_MESSAGE_READ, 0);
+ }
+ OT_BufferIdRead=otCoapHeaderGetMessageId(pHeader);
+
+ APP_THREAD_CheckMsgValidity();
+
+ if (otCoapHeaderGetType(pHeader) == OT_COAP_TYPE_CONFIRMABLE)
+ {
+ APP_THREAD_SendDataResponse(pHeader, pMessageInfo);
+ }
+ } while (false);
+}
+
+/**
+ * @brief This function acknowledge the data reception by sending an ACK
+ * back to the sender.
+ * @param pRequestHeader coap header
+ * @param pMessageInfo message info pointer
+ * @retval None
+ */
+static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
+ const otMessageInfo * pMessageInfo)
+{
+ otError error = OT_ERROR_NONE;
+
+ APP_DBG(" ********* APP_THREAD_SendDataResponse \r\n");
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_ACKNOWLEDGMENT, OT_COAP_CODE_CHANGED);
+ otCoapHeaderSetMessageId(&OT_Header, otCoapHeaderGetMessageId(pRequestHeader));
+ otCoapHeaderSetToken(&OT_Header,
+ otCoapHeaderGetToken(pRequestHeader),
+ otCoapHeaderGetTokenLength(pRequestHeader));
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_NEW_MSG_ALLOC,error);
+ }
+ error = otCoapSendResponse(NULL, pOT_Message, pMessageInfo);
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ APP_THREAD_Error(ERR_THREAD_DATA_RESPONSE,error);
+ }
+}
+
+
+
+/**
+ * @brief This function is used to handle the APP_THREAD_AskProvisioning handler
+ *
+ * @param pHeader header pointer
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @retval None
+ */
+static void APP_THREAD_ProvisioningReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+ (void)pMessage;
+
+ APP_DBG("**** Leader receives APP_THREAD_AskProvisioning_request *****\n\r");
+ if (otCoapHeaderGetType(pHeader) == OT_COAP_TYPE_NON_CONFIRMABLE &&
+ otCoapHeaderGetCode(pHeader) == OT_COAP_CODE_GET)
+ {
+ if (APP_THREAD_ProvisioningRespSend(pHeader, pMessageInfo) != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_PROVISIONING_RESP, 0);
+ }
+ }
+}
+
+/**
+ * @brief This function is used to handle the APP_THREAD_AskProvisioning response
+ *
+ * @param pRequestHeader
+ * @param pMessageInfo message info pointer
+ * @retval error code
+ */
+static otError APP_THREAD_ProvisioningRespSend(otCoapHeader * pRequestHeader,
+ const otMessageInfo * pMessageInfo)
+{
+ otError error = OT_ERROR_NO_BUFS;
+
+ do
+ {
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_CONTENT);
+ otCoapHeaderSetToken(&OT_Header,
+ otCoapHeaderGetToken(pRequestHeader),
+ otCoapHeaderGetTokenLength(pRequestHeader));
+ otCoapHeaderSetPayloadMarker(&OT_Header);
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_ALLOC_MSG, error);
+ }
+
+ error = otMessageAppend(pOT_Message, &OT_Command, sizeof(OT_Command));
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_APPEND, error);
+ }
+
+ error = otMessageAppend(pOT_Message, otThreadGetMeshLocalEid(NULL), sizeof(otIp6Address));
+ if (error != OT_ERROR_NONE)
+ {
+ break;
+ }
+ APP_DBG("**** 2) APP_THREAD_ProvisioningRespSend *****\n\r");
+ error = otCoapSendResponse(NULL, pOT_Message, pMessageInfo);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ APP_THREAD_Error(ERR_THREAD_COAP_SEND_RESP, error);
+ }
+ } while (false);
+
+ return error;
+}
+
+/**
+ * @brief This function is used to manage the APP_THREAD_AskProvisioning request
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_ProvisioningReqSend()
+{
+ otError error = OT_ERROR_NONE;
+
+ do
+ {
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_GET);
+
+ otCoapHeaderGenerateToken(&OT_Header, 2U);
+
+ error = otCoapHeaderAppendUriPathOptions(&OT_Header, C_RESSOURCE_Provisioning);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_APEND_URI,error);
+ }
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_NEW_MSG_ALLOC,error);
+ }
+
+ memset(&OT_MessageInfo, 0, sizeof(OT_MessageInfo));
+ OT_MessageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;
+ OT_MessageInfo.mPeerPort = OT_DEFAULT_COAP_PORT;
+ otIp6AddressFromString("FF03::1", &OT_MessageInfo.mPeerAddr);
+
+ APP_DBG("**** 1) APP_THREAD_ProvisioningReqSend *****\n\r");
+ error = otCoapSendRequest(NULL,
+ pOT_Message,
+ &OT_MessageInfo,
+ &APP_THREAD_DummyRespHandler,
+ (void*)&APP_THREAD_ProvisioningRespHandler);
+ } while (false);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ }
+}
+
+/**
+ * @brief This function is used to manage the APP_THREAD_AskProvisioning response
+ * handler.
+ *
+ * @param pHeader header
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @param Result error code if any
+ * @retval None
+ */
+static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
+{
+ (void)pHeader;
+ if (Result == OT_ERROR_NONE)
+ {
+ if ((otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_Command, sizeof(OT_Command)) == sizeof(OT_Command)))
+ {
+ /* Retrieve the */
+ if (otMessageRead(pMessage,
+ otMessageGetOffset(pMessage) + sizeof(OT_Command),
+ &OT_PeerAddress,
+ sizeof(OT_PeerAddress)) != sizeof(OT_PeerAddress))
+ {
+ APP_THREAD_Error(ERR_READ, 0);
+ }
+ APP_DBG("**** 3) APP_THREAD_ProvisioningRespHandler *****");
+ /* Ask to start the first transfer */
+ UTIL_SEQ_SetTask(TASK_SEND_BUFFER, CFG_SCH_PRIO_1);
+ }
+ }
+ else
+ {
+ APP_DBG("**** 3)APP_THREAD_AskProvisioning failed ***** with ERROR code = %d\n\r",Result);
+ }
+}
+
+
+/**
+ * @brief This function initiates the APP_THREAD_AskProvisioning phase
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_AskProvisioning(void)
+{
+ HAL_Delay(1000U);
+ APP_THREAD_ProvisioningReqSend();
+}
+/**
+ * @brief This function is used to send the data via a Coap message in
+ * confirmable mode.
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SendCoapUnicastRequest()
+{
+ otError error = OT_ERROR_NONE;
+
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_CONFIRMABLE, OT_COAP_CODE_PUT);
+ otCoapHeaderSetMessageId(&OT_Header,OT_BufferIdSend);
+ otCoapHeaderGenerateToken(&OT_Header, 2U);
+
+ error = otCoapHeaderAppendUriPathOptions(&OT_Header,C_RESSOURCE_DATA_TRANSFER);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_APEND_URI,error);
+ }
+ otCoapHeaderSetPayloadMarker(&OT_Header);
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_ALLOC_MSG,error);
+ }
+ error = otMessageAppend(pOT_Message, &OT_BufferSend, sizeof(OT_BufferSend));
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_APPEND,error);
+ }
+ memset(&OT_MessageInfo, 0, sizeof(OT_MessageInfo));
+ OT_MessageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;
+ OT_MessageInfo.mPeerPort = OT_DEFAULT_COAP_PORT;
+ memcpy(&OT_MessageInfo.mPeerAddr, &OT_PeerAddress, sizeof(OT_MessageInfo.mPeerAddr));
+ error = otCoapSendRequest(NULL,
+ pOT_Message,
+ &OT_MessageInfo,
+ &APP_THREAD_DummyRespHandler,
+ (void*)&APP_THREAD_DataRespHandler);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ }
+}
+
+/**
+ * @brief This function manages the data response handler
+ * and reschedules the sending of data.
+ *
+ * @param pHeader header
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @param Result error code
+ * @retval None
+ */
+static void APP_THREAD_DataRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(pHeader);
+ UNUSED(pMessage);
+ UNUSED(pMessageInfo);
+
+ if (Result == OT_ERROR_NONE)
+ {
+ /* Ask to perform a new transfer */
+ HAL_Delay(1000U);
+ UTIL_SEQ_SetTask(TASK_SEND_BUFFER, CFG_SCH_PRIO_1);
+ }
+ else
+ {
+ APP_THREAD_Error(ERR_FILE_RESP_HANDLER,Result);
+ }
+}
+
+/**
+ * @brief This function is used to handle a dummy response handler
+ *
+ * @param p_context context
+ * @param pHeader coap header
+ * @param pMessage message
+ * @paramp pMessageInfo otMessage information
+ * @param Result error status
+ * @retval None
+ */
+static void APP_THREAD_DummyRespHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(p_context);
+ UNUSED(pHeader);
+ UNUSED(pMessage);
+ UNUSED(pMessageInfo);
+ UNUSED(Result);
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_THREAD_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer)
+{
+ p_thread_otcmdbuffer = p_buffer;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_OTCmdPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)p_thread_otcmdbuffer->cmdserial.cmd.payload;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)((TL_EvtPacket_t *)p_thread_otcmdbuffer)->evtserial.evt.payload;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_NotificationPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)(p_thread_notif_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the Ot commands from the
+ * M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void Ot_Cmd_Transfer(void)
+{
+ /* OpenThread OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_thread_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ uint32_t l_size = ((Thread_OT_Cmd_Request_t*)(p_thread_otcmdbuffer->cmdserial.cmd.payload))->Size * 4U + 8U;
+ p_thread_otcmdbuffer->cmdserial.cmd.plen = l_size;
+
+ TL_OT_SendCmd();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+}
+
+/**
+ * @brief This function is called when acknowledge from OT command is received from the M0+.
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_OT_CmdEvtReceived( TL_EvtPacket_t * Otbuffer )
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+}
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_THREAD_NotReceived( TL_EvtPacket_t * Notbuffer )
+{
+ p_thread_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+}
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_OtCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+}
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+}
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+}
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveMsgFromM0++;
+ UTIL_SEQ_SetTask(TASK_MSG_FROM_M0_TO_M4,CFG_SCH_PRIO_0);
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ if (aRxBuffer[0] == '\r')
+ {
+ CptReceiveCmdFromUser = 1U;
+
+ /* UART task scheduling*/
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_CLI_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief Process the command strings.
+ * As soon as a complete command string has been received, the task
+ * in charge of sending the command to the M0 is scheduled
+ * @param None
+ * @retval None
+ */
+static uint32_t ProcessCmdString( uint8_t* buf , uint32_t len )
+{
+ uint32_t i,j,tmp_start;
+ tmp_start = 0;
+ uint32_t res = 0;
+
+ i= 0;
+ while ((buf[i] != '\r') && (i < len))
+ {
+ i++;
+ }
+
+ if (i != len)
+ {
+ memcpy(CommandString, buf,(i+1));
+ indexReceiveChar = i + 1U; /* Length of the buffer containing the command string */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ tmp_start = i;
+ for (j = 0; j < (len - tmp_start - 1U) ; j++)
+ {
+ buf[j] = buf[tmp_start + j + 1U];
+ }
+ res = len - tmp_start - 1U;
+ }
+ else
+ {
+ res = len;
+ }
+ return res; /* Remaining characters in the temporary buffer */
+}
+#endif/* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_FULL_LOW_POWER == 0)
+/**
+ * @brief Process sends receive CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void Send_CLI_To_M0(void)
+{
+ memset(ThreadCliCmdBuffer.cmdserial.cmd.payload, 0x0U, 255U);
+ memcpy(ThreadCliCmdBuffer.cmdserial.cmd.payload, CommandString, indexReceiveChar);
+ ThreadCliCmdBuffer.cmdserial.cmd.plen = indexReceiveChar;
+ ThreadCliCmdBuffer.cmdserial.cmd.cmdcode = 0x0;
+
+ /* Clear receive buffer, character counter and command complete */
+ CptReceiveCmdFromUser = 0;
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+
+ TL_CLI_SendCmd();
+}
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+
+/**
+ * @brief Send notification for CLI TL Channel.
+ * @param None
+ * @retval None
+ */
+static void Send_CLI_Ack_For_OT(void)
+{
+
+ /* Notify M0 that characters have been sent to UART */
+ TL_THREAD_CliSendAck();
+}
+
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_Init_UART_CLI(void)
+{
+#if (CFG_FULL_LOW_POWER == 0)
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_CLI_TO_M0, UTIL_SEQ_RFU,Send_CLI_To_M0);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+ MX_LPUART1_UART_Init();
+ HW_UART_Receive_IT(CFG_CLI_UART, aRxBuffer, 1, RxCpltCallback);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+}
+
+/**
+ * @brief Perform initialization of TL for THREAD.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_TL_THREAD_INIT(void)
+{
+ ThreadConfigBuffer.p_ThreadOtCmdRspBuffer = (uint8_t*)&ThreadOtCmdBuffer;
+ ThreadConfigBuffer.p_ThreadNotAckBuffer = (uint8_t*)ThreadNotifRspEvtBuffer;
+ ThreadConfigBuffer.p_ThreadCliRspBuffer = (uint8_t*)&ThreadCliCmdBuffer;
+
+ TL_THREAD_Init( &ThreadConfigBuffer );
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_THREAD_CliNotReceived( TL_EvtPacket_t * Notbuffer )
+{
+ TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t l_size = l_CliBuffer->cmdserial.cmd.plen;
+
+ /* WORKAROUND: if string to output is "> " then respond directly to M0 and do not output it */
+ if (strcmp((const char *)l_CliBuffer->cmdserial.cmd.payload, "> ") != 0)
+ {
+ /* Write to CLI UART */
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ VCP_SendData( l_CliBuffer->cmdserial.cmd.payload, l_size, HostTxCb);
+#else
+ HW_UART_Transmit_IT(CFG_CLI_UART, l_CliBuffer->cmdserial.cmd.payload, l_size, HostTxCb);
+#endif /*USAGE_OF_VCP */
+ }
+ else
+ {
+ Send_CLI_Ack_For_OT();
+ }
+}
+
+/**
+ * @brief End of transfer callback for CLI UART sending.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void HostTxCb(void)
+{
+ Send_CLI_Ack_For_OT();
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_ProcessMsgM0ToM4(void)
+{
+ if (CptReceiveMsgFromM0 != 0)
+ {
+ /* If CptReceiveMsgFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveMsgFromM0 > 1U)
+ {
+ APP_THREAD_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else
+ {
+ OpenThread_CallBack_Processing();
+ }
+ /* Reset counter */
+ CptReceiveMsgFromM0 = 0;
+ }
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief This function is called when thereare some data coming
+ * from the Hyperterminal via the USB port
+ * Data received over USB OUT endpoint are sent over CDC interface
+ * through this function.
+ * @param Buf: Buffer of data received
+ * @param Len: Number of data received (in bytes)
+ * @retval Number of characters remaining in the buffer and not yet processed
+ */
+void VCP_DataReceived(uint8_t* Buf , uint32_t *Len)
+{
+ uint32_t i,flag_continue_checking = TRUE;
+ uint32_t char_remaining = 0;
+ static uint32_t len_total = 0;
+
+ /* Copy the characteres in the temporary buffer */
+ for (i = 0; i < *Len; i++)
+ {
+ TmpString[len_total++] = Buf[i];
+ }
+
+ /* Process the buffer commands one by one */
+ /* A command is limited by a \r caracaters */
+ while (flag_continue_checking == TRUE)
+ {
+ char_remaining = ProcessCmdString(TmpString,len_total);
+ /* If char_remaining is equal to len_total, it means that the command string is not yet
+ * completed.
+ * If char_remaining is equal to 0, it means that the command string has
+ * been entirely processed.
+ */
+ if ((char_remaining == 0) || (char_remaining == len_total))
+ {
+ flag_continue_checking = FALSE;
+ }
+ len_total = char_remaining;
+ }
+}
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h
new file mode 100644
index 000000000..7ce237d59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h
@@ -0,0 +1,137 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : App/app_thread.h
+ * Description : Header for Thread Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_THREAD_H
+#define APP_THREAD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "tl_thread_hci.h"
+
+/* OpenThread Library */
+#include OPENTHREAD_CONFIG_FILE
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+/* Thread application generic defines */
+/*------------------------------------*/
+typedef enum
+{
+ APP_THREAD_LIMITED,
+ APP_THREAD_FULL,
+} APP_THREAD_InitMode_t;
+
+/* ipv6-addressing defines */
+/*------------------------------------*/
+/* Key Point: A major difference between FTDs and MTDs are that FTDs subscribe to the ff03::2 multicast address.
+ * MTDs do not. */
+
+#define MULICAST_FTD_MED "ff03::1"
+#define MULICAST_FTD_BORDER_ROUTER "ff03::2"
+
+/* Application errors */
+/*------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum
+{
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_THREAD_SET_STATE_CB,
+ ERR_THREAD_SET_CHANNEL,
+ ERR_THREAD_SET_PANID,
+ ERR_THREAD_IPV6_ENABLE,
+ ERR_THREAD_START,
+ ERR_THREAD_ERASE_PERSISTENT_INFO,
+/* USER CODE BEGIN ERROR_APPLI_ENUM */
+ ERR_THREAD_COAP_START,
+ ERR_THREAD_COAP_ADD_RESSOURCE,
+ ERR_THREAD_MESSAGE_READ,
+ ERR_THREAD_COAP_SEND_RESPONSE,
+ ERR_THREAD_COAP_APPEND,
+ ERR_THREAD_COAP_SEND_REQUEST,
+ ERR_THREAD_COAP_SEND_RESP,
+ ERR_THREAD_SETUP,
+ ERR_THREAD_LINK_MODE,
+ ERR_ALLOC_MSG,
+ ERR_FILE_RESP_HANDLER,
+ ERR_MSG_COMPARE_FAILED,
+ ERR_NEW_MSG_ALLOC,
+ ERR_PROVISIONING_HANDLER,
+ ERR_THREAD_DATA_RESPONSE,
+ ERR_APPEND,
+ ERR_PROVISIONING_RESP,
+ ERR_HEADER_INIT,
+ ERR_TOKEN,
+ ERR_APEND_URI,
+ ERR_READ,
+/* USER CODE END ERROR_APPLI_ENUM */
+ ERR_THREAD_CHECK_WIRELESS
+ } ErrAppliIdEnum_t;
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ------------------------------------------------------- */
+void APP_THREAD_Init( void );
+void APP_THREAD_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_THREAD_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+void APP_THREAD_ProcessMsgM0ToM4(void);
+void APP_THREAD_Init_UART_CLI(void);
+void APP_THREAD_TL_THREAD_INIT(void);
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_THREAD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h
new file mode 100644
index 000000000..ef2e4b2ae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h
@@ -0,0 +1,5033 @@
+/**
+ ******************************************************************************
+ * @file data_transfer.h
+ * @author MCD Application Team
+ * @brief data to be transfered
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+#ifndef DATA_TRANSFER_H_
+#define DATA_TRANSFER_H_
+#include <stdio.h>
+#include <string.h>
+#include <openthread/platform/logging.h>
+#include "thread.h"
+#include <openthread/coap.h>
+#include "app_conf.h"
+#include "dbg_trace.h"
+#include "app_common.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "stm32_seq.h"
+#define COAP_PAYLOAD_MAX_LENGTH 64
+#define DATA_BUFFER_LENGTH 79872
+#define TOKEN_LENGTH 2
+
+static const uint8_t aDataBuffer[DATA_BUFFER_LENGTH]={0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
+0x00, 0x00, 0x02, 0x76, 0x00, 0x00, 0x01, 0x68, 0x08, 0x06, 0x00, 0x00, 0x00, 0xDA, 0x60, 0xB6,
+0x8F, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00,
+0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00,
+0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC4, 0x00, 0x00, 0x0E, 0xC4, 0x01, 0x95,
+0x2B, 0x0E, 0x1B, 0x00, 0x00, 0xFF, 0xA5, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5E, 0xEC, 0xFD, 0x07,
+0x90, 0x64, 0x49, 0x7A, 0x1E, 0x08, 0x7A, 0x6A, 0x5D, 0x5A, 0xCB, 0xAE, 0xAA, 0xD6, 0xBA, 0x7B,
+0xBA, 0x67, 0x7A, 0x44, 0x8F, 0x00, 0x06, 0xC0, 0x60, 0x20, 0x08, 0x10, 0x00, 0x79, 0x5C, 0xE2,
+0xC8, 0xE3, 0xED, 0xAE, 0x19, 0xF7, 0x78, 0x67, 0x7B, 0x76, 0x76, 0x66, 0xBB, 0xB6, 0x6B, 0x6B,
+0x46, 0xB3, 0xB3, 0xBB, 0x5B, 0xB3, 0x5B, 0xB3, 0x5B, 0xDB, 0x5B, 0x1E, 0xB9, 0x47, 0x72, 0x77,
+0x09, 0x70, 0x49, 0x88, 0x85, 0xC6, 0x00, 0xA3, 0x30, 0x18, 0xCC, 0xF4, 0x4C, 0x4F, 0x6B, 0x2D,
+0x4B, 0x76, 0x69, 0x5D, 0x95, 0x5A, 0x67, 0xDE, 0xF7, 0xFD, 0xC2, 0xDD, 0x5F, 0x64, 0x64, 0x66,
+0x64, 0x75, 0x65, 0x54, 0x75, 0x96, 0xBF, 0xEE, 0xA8, 0x8C, 0x78, 0xE1, 0xCF, 0x9F, 0xFB, 0xE7,
+0x1E, 0xE1, 0x5F, 0x7C, 0xBF, 0xF0, 0x96, 0x79, 0x1C, 0xA1, 0x1C, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x9F, 0x78, 0x04, 0x5A, 0x3F, 0xF1,
+0x3D, 0x28, 0x1D, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x10, 0x04, 0x0A, 0xB1, 0x2B, 0x13, 0xA1, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B,
+0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A,
+0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90,
+0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35,
+0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10,
+0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28,
+0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05,
+0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41,
+0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5,
+0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1,
+0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0,
+0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28,
+0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32,
+0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81,
+0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40,
+0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB,
+0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02,
+0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0,
+0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B,
+0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A,
+0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90,
+0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35,
+0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x65,
+0x1E, 0xC7, 0x1A, 0xE9, 0xCB, 0x9A, 0xEF, 0x46, 0x19, 0xAA, 0x35, 0x3F, 0xC4, 0xA5, 0x83, 0x37,
+0x19, 0x81, 0x96, 0x96, 0x96, 0x9B, 0x5C, 0x63, 0xA9, 0xAE, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC,
+0xDE, 0x08, 0x14, 0xC5, 0xEE, 0xF6, 0x1E, 0x9F, 0xD2, 0xBA, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x0D, 0x23, 0x50, 0x14, 0xBB, 0x86, 0xA1, 0x6A, 0x7E,
+0x41, 0x57, 0xE8, 0x8A, 0xEA, 0xD0, 0x7C, 0xEC, 0xCB, 0x1D, 0xD7, 0x06, 0x02, 0xFC, 0x0C, 0x95,
+0xCF, 0xCF, 0xDA, 0x18, 0xCB, 0xD2, 0x8B, 0x82, 0x40, 0x41, 0xA0, 0x31, 0x04, 0x0A, 0xB1, 0x6B,
+0x0C, 0xA7, 0x5B, 0x52, 0x2A, 0x27, 0x76, 0xB4, 0x97, 0xCF, 0xCE, 0xCD, 0x87, 0xB9, 0xB9, 0xB9,
+0x30, 0x3D, 0x83, 0xC7, 0xEC, 0xAC, 0xBD, 0xC6, 0x3B, 0xB7, 0xC4, 0xDA, 0xC4, 0x9B, 0xB2, 0x55,
+0x7A, 0x73, 0x6F, 0x82, 0xDA, 0xF5, 0x57, 0x6A, 0xDD, 0xCF, 0x3A, 0x60, 0x4F, 0xAB, 0xB5, 0xDF,
+0x12, 0xF8, 0xB3, 0x5E, 0xAD, 0xF4, 0xFE, 0xDA, 0xFF, 0x16, 0x41, 0x65, 0x1E, 0xFF, 0x2D, 0xEC,
+0xDF, 0x4A, 0x6A, 0x5C, 0x6C, 0x78, 0x13, 0xFA, 0x2B, 0xA9, 0x2D, 0x2F, 0xBB, 0x82, 0x89, 0xE3,
+0x03, 0x12, 0x2F, 0xF7, 0xBB, 0x2F, 0xD2, 0x8A, 0x6C, 0x1C, 0x1B, 0x99, 0x11, 0xF9, 0x78, 0xE7,
+0xB3, 0x27, 0xBF, 0xED, 0x82, 0x26, 0x2C, 0xD1, 0xED, 0x36, 0x14, 0xEE, 0xEB, 0xEA, 0x08, 0xED,
+0xAD, 0x18, 0x85, 0x62, 0x8E, 0xBD, 0xD1, 0x09, 0x52, 0xAE, 0x2B, 0x08, 0x14, 0x04, 0x3E, 0x81,
+0x08, 0x14, 0x62, 0x77, 0x1B, 0x0D, 0x5A, 0xEE, 0x43, 0x57, 0xBB, 0x18, 0xCD, 0x81, 0xD4, 0x4D,
+0x4C, 0xCF, 0x84, 0xF1, 0xA9, 0x99, 0x30, 0x34, 0x3E, 0x19, 0x06, 0xC7, 0x26, 0xC3, 0xC4, 0xE4,
+0x74, 0x98, 0x04, 0xC9, 0x5B, 0xB8, 0x70, 0xAE, 0x8C, 0x58, 0x71, 0xC1, 0xD4, 0x45, 0xD3, 0x2D,
+0xF3, 0xF9, 0xA2, 0xBD, 0x18, 0xBF, 0x71, 0x52, 0xA0, 0x7F, 0xFD, 0xCA, 0xBC, 0x35, 0x8D, 0xAF,
+0xA7, 0x37, 0x42, 0xEC, 0x96, 0xA2, 0x3B, 0x3E, 0xA8, 0x35, 0x9E, 0x06, 0x15, 0x66, 0xE0, 0x18,
+0xE1, 0x64, 0xDD, 0xAA, 0x88, 0x46, 0xEB, 0xF2, 0x14, 0x75, 0x91, 0x6B, 0x15, 0x13, 0xBD, 0xE1,
+0x5C, 0x76, 0x83, 0xC6, 0x30, 0xA9, 0x56, 0x2A, 0xAF, 0xEA, 0xB0, 0x1A, 0x1D, 0xA5, 0x5A, 0x1A,
+0x54, 0xE7, 0x5A, 0x83, 0x63, 0x9E, 0x70, 0xC4, 0xE2, 0x7C, 0xB2, 0x02, 0x4F, 0x0C, 0xBB, 0xD6,
+0xAB, 0xD0, 0xFB, 0xF2, 0x5F, 0xD2, 0x56, 0xBD, 0x67, 0x65, 0xD6, 0x59, 0x33, 0xAA, 0xF3, 0x62,
+0xF1, 0x0F, 0x9B, 0xD7, 0x51, 0xED, 0xA6, 0x52, 0x62, 0xC5, 0x4F, 0xEF, 0x93, 0x8D, 0x5A, 0x9D,
+0xCA, 0x52, 0x0B, 0x3A, 0xDB, 0x5A, 0xC3, 0xA1, 0xAD, 0xEB, 0xC2, 0x40, 0x4F, 0x87, 0x5C, 0x5D,
+0xC8, 0xDD, 0x6D, 0xF4, 0x45, 0x57, 0x9A, 0x52, 0x10, 0x28, 0x08, 0xAC, 0x2A, 0x02, 0x85, 0xD8,
+0xAD, 0x2A, 0xBC, 0x2B, 0xAB, 0x3C, 0x27, 0x76, 0x0C, 0x69, 0x19, 0x9E, 0x98, 0x0A, 0xC3, 0x20,
+0x71, 0x63, 0x20, 0x70, 0x24, 0x75, 0xFC, 0x4B, 0x62, 0x37, 0x3C, 0x3E, 0x15, 0x06, 0x71, 0x7E,
+0x02, 0xCF, 0xA7, 0x66, 0x66, 0xEB, 0x2C, 0xEF, 0x69, 0x81, 0x8B, 0xCF, 0x6C, 0xC5, 0xD4, 0xF5,
+0xD6, 0xC9, 0x0C, 0xDE, 0x9D, 0xB7, 0x33, 0xF8, 0xE3, 0xCA, 0x92, 0x2F, 0xDA, 0x95, 0xD6, 0x2F,
+0x20, 0x30, 0xB9, 0xC6, 0x52, 0xAB, 0xD8, 0xE9, 0x95, 0x8D, 0x93, 0x98, 0x54, 0x39, 0xAF, 0xC9,
+0x35, 0xAE, 0xC5, 0x55, 0x1A, 0xA3, 0x4D, 0xDE, 0x2F, 0xB9, 0x2E, 0x3F, 0x12, 0x71, 0x81, 0x68,
+0xA3, 0xEF, 0x2D, 0x43, 0xEC, 0x6A, 0xBB, 0x28, 0x44, 0x62, 0x01, 0x93, 0x70, 0x04, 0xED, 0x8D,
+0xC5, 0xF8, 0xA5, 0xDC, 0xCE, 0x09, 0x8F, 0x17, 0x02, 0xC2, 0xB1, 0x31, 0x8B, 0xCD, 0x8D, 0x2A,
+0xE1, 0x12, 0x52, 0x42, 0x5A, 0x53, 0x21, 0x65, 0x8A, 0x2D, 0xB8, 0x7E, 0x1D, 0x4E, 0x6A, 0xF7,
+0xB2, 0xBE, 0xF2, 0x76, 0x7E, 0xC8, 0x50, 0x57, 0xF8, 0xEC, 0x42, 0x5A, 0x58, 0x9F, 0x38, 0xE1,
+0xC2, 0x1A, 0x62, 0x97, 0xD4, 0xDA, 0x45, 0x08, 0x62, 0x56, 0x9E, 0xF7, 0x57, 0xC2, 0xBF, 0xF8,
+0x51, 0x97, 0xD8, 0xB5, 0x54, 0x89, 0x1D, 0x47, 0x7C, 0xE9, 0x9F, 0x2C, 0x55, 0x62, 0xF7, 0xC0,
+0xCE, 0x8D, 0xE1, 0xFE, 0x1D, 0xEB, 0x43, 0x57, 0x3B, 0xAE, 0x6C, 0x6C, 0x32, 0xAE, 0xEC, 0x03,
+0x5B, 0x4A, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x10, 0x81, 0x42, 0xEC, 0x6E, 0xF1, 0xA0,
+0x2C, 0xA6, 0xD2, 0x4D, 0x82, 0xB4, 0x1D, 0x3E, 0x77, 0x35, 0xBC, 0x7F, 0xF6, 0x72, 0xF8, 0xE8,
+0xF2, 0x60, 0xB8, 0x3A, 0x32, 0x21, 0xE4, 0x4E, 0xCD, 0xB1, 0x21, 0xCC, 0xCC, 0xCD, 0x62, 0x61,
+0xC7, 0x73, 0x13, 0xD7, 0x72, 0x7E, 0xE1, 0x8B, 0x24, 0xBB, 0xB6, 0x14, 0xB1, 0x13, 0xBD, 0xC5,
+0x88, 0x5D, 0xD5, 0x5A, 0x58, 0x87, 0xAD, 0x64, 0xA7, 0xA2, 0x7E, 0x82, 0x85, 0xD7, 0x35, 0xA3,
+0x44, 0x5D, 0x92, 0x0E, 0xC4, 0xAA, 0xA5, 0x6C, 0xD6, 0xC6, 0xD4, 0x9E, 0x96, 0x4C, 0x1F, 0x74,
+0xA3, 0x65, 0xE2, 0x5E, 0x4A, 0xF0, 0xB2, 0xD7, 0xB5, 0xBC, 0xCC, 0x0D, 0x9D, 0x19, 0x81, 0xD1,
+0xBA, 0x73, 0xD5, 0x51, 0x01, 0x68, 0xC5, 0x29, 0x7D, 0xCF, 0x5B, 0x59, 0x43, 0x17, 0x33, 0x2E,
+0x94, 0xA6, 0x83, 0x9D, 0x5C, 0xC0, 0x74, 0xB4, 0xFE, 0x48, 0x31, 0xEA, 0x11, 0xBB, 0x48, 0x22,
+0xD8, 0x09, 0xB2, 0x2F, 0x2D, 0x24, 0xFA, 0x1F, 0x9E, 0xD7, 0x92, 0x13, 0x6F, 0x8D, 0xE3, 0xCA,
+0x66, 0xD6, 0x6A, 0x69, 0x8E, 0x45, 0xEC, 0x83, 0x11, 0xA7, 0x7C, 0xAC, 0x2B, 0x53, 0x39, 0xAF,
+0x54, 0xDA, 0x5B, 0xD3, 0x50, 0x1F, 0x9B, 0x0C, 0x97, 0x1A, 0xDE, 0xA7, 0xEF, 0xC8, 0x38, 0xD0,
+0x9C, 0xA9, 0x58, 0x7A, 0x19, 0x92, 0x6F, 0xAD, 0x15, 0xCF, 0x5A, 0x1C, 0x13, 0x6D, 0x81, 0xDC,
+0xC9, 0xFA, 0x9C, 0x94, 0xBD, 0x8C, 0x53, 0x6A, 0x01, 0xA9, 0x50, 0x5B, 0x55, 0x0F, 0xC4, 0xFC,
+0x74, 0x9C, 0x71, 0xD5, 0xE1, 0x59, 0x00, 0xA4, 0xB5, 0xCE, 0x20, 0xDF, 0xBB, 0xB1, 0x2F, 0xFC,
+0xC6, 0xA7, 0x0E, 0x84, 0xCD, 0x7D, 0x5D, 0x15, 0x68, 0xCA, 0x8B, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0xB0, 0x96, 0x11, 0x28, 0xC4, 0xEE, 0x16, 0x8F, 0x6E, 0x4E, 0xEC, 0x48, 0xD4, 0x06, 0x47, 0x27,
+0xC3, 0xD5, 0xD1, 0xF1, 0x70, 0x6D, 0x64, 0x3C, 0x1C, 0x3E, 0x7B, 0x25, 0x7C, 0x00, 0x72, 0x77,
+0xF2, 0xF2, 0x50, 0xB8, 0x0E, 0xD3, 0x2B, 0xFD, 0xEA, 0x84, 0x20, 0x80, 0xA9, 0x70, 0x09, 0xE3,
+0xDA, 0x59, 0x4F, 0x89, 0x90, 0x45, 0xBC, 0x86, 0x97, 0x78, 0x37, 0xF3, 0x85, 0xD4, 0x0D, 0x69,
+0xB5, 0x6B, 0xAB, 0x52, 0xAE, 0x9A, 0x55, 0x33, 0x5B, 0x7B, 0xDD, 0x24, 0xE6, 0x6A, 0x50, 0xCE,
+0x7D, 0x48, 0xE6, 0x5A, 0x8D, 0x2C, 0xD6, 0x27, 0x76, 0xD6, 0x82, 0xD4, 0xC4, 0x05, 0x04, 0x4E,
+0x96, 0xFB, 0xCA, 0x5A, 0xAF, 0xB4, 0xC4, 0xC9, 0x5E, 0xDE, 0x17, 0xA1, 0x17, 0x5C, 0xC8, 0x9D,
+0xBC, 0x89, 0xB4, 0xC5, 0x23, 0xB5, 0xBF, 0x35, 0x92, 0x29, 0x67, 0x27, 0x75, 0xA9, 0x6F, 0x05,
+0x4B, 0x6D, 0x03, 0xFE, 0x8D, 0x9D, 0x73, 0x4A, 0x53, 0x25, 0x31, 0xB1, 0x8F, 0xD9, 0x3C, 0xAA,
+0x25, 0x51, 0xDE, 0x15, 0x25, 0x39, 0xA0, 0x77, 0xD9, 0xD8, 0x48, 0xBF, 0xD8, 0x5A, 0xBD, 0x9D,
+0xBC, 0x12, 0x0C, 0x6B, 0xE6, 0xE5, 0x02, 0x62, 0x67, 0x75, 0xD4, 0x23, 0x6C, 0x71, 0x3C, 0xD3,
+0x45, 0x4A, 0xEC, 0xF2, 0x81, 0x32, 0x88, 0x73, 0xC2, 0xEB, 0x3D, 0xCC, 0xF1, 0x8D, 0xC4, 0xAE,
+0x4E, 0x7B, 0xB4, 0xB5, 0x6C, 0x7B, 0x95, 0x9E, 0x55, 0x5E, 0x19, 0xF9, 0x97, 0x11, 0x71, 0x82,
+0x9F, 0x75, 0x58, 0xCA, 0x3A, 0x20, 0xF9, 0x3D, 0x1C, 0x98, 0x6C, 0x72, 0xD6, 0x4C, 0x89, 0x85,
+0xAE, 0x9C, 0x42, 0x30, 0x4D, 0xE5, 0xC3, 0xBD, 0xB6, 0x80, 0xD0, 0xFD, 0x1F, 0xBF, 0xFC, 0x40,
+0xD8, 0x0D, 0x82, 0x57, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xA7, 0x20, 0x50, 0x88, 0xDD,
+0x2D, 0x1A, 0xE9, 0x7A, 0x11, 0xAF, 0x34, 0xAD, 0xBE, 0x79, 0xE2, 0x7C, 0x78, 0xE9, 0xE8, 0x99,
+0x70, 0xEC, 0xE2, 0x60, 0x18, 0x81, 0xB9, 0x75, 0x7C, 0x0A, 0x7E, 0x74, 0xD3, 0x73, 0x50, 0xE8,
+0xA8, 0x8C, 0xE8, 0xA2, 0xE5, 0x64, 0x2E, 0x89, 0x41, 0xB6, 0x62, 0x9B, 0xBD, 0xAE, 0x56, 0xC8,
+0xE0, 0x55, 0x39, 0x09, 0x8B, 0x64, 0x40, 0xD6, 0x7A, 0x57, 0x5E, 0x72, 0x6D, 0xC5, 0x14, 0x1A,
+0xC3, 0x46, 0xE8, 0x48, 0x66, 0xCA, 0x92, 0xFB, 0xD6, 0x2C, 0xB8, 0x91, 0xE0, 0x60, 0x6D, 0x8D,
+0x64, 0xA8, 0x2A, 0x03, 0xDA, 0x15, 0x55, 0x12, 0xE0, 0xD5, 0x54, 0xC8, 0xA1, 0xEB, 0x4B, 0xCA,
+0x83, 0x8C, 0x3E, 0xE8, 0x1F, 0x5F, 0xDC, 0x23, 0x67, 0x71, 0x15, 0x49, 0xCA, 0x91, 0x88, 0xD5,
+0xFA, 0xD5, 0x69, 0x25, 0x95, 0xEB, 0x2A, 0xBC, 0x31, 0xA1, 0xD5, 0x62, 0xCA, 0x93, 0xD6, 0xC4,
+0xFB, 0x39, 0xB1, 0xCB, 0x2F, 0x50, 0xFA, 0xE3, 0x7A, 0x63, 0x7D, 0x62, 0x57, 0x9D, 0x54, 0xD5,
+0x36, 0x27, 0xFA, 0xE4, 0xD7, 0x8A, 0xF2, 0xC5, 0xB1, 0x80, 0x12, 0x2B, 0xEF, 0x2E, 0x70, 0x7D,
+0xAB, 0x2A, 0x9A, 0x52, 0x3B, 0x1A, 0xA8, 0xD7, 0x67, 0x74, 0xC7, 0xC8, 0x90, 0xD4, 0xE1, 0x24,
+0x8A, 0x44, 0xD1, 0xC7, 0xAB, 0xC2, 0x8C, 0xF2, 0x36, 0x56, 0xE9, 0x61, 0x3E, 0x7F, 0x74, 0xD8,
+0xF3, 0x0B, 0xEB, 0xD0, 0x3F, 0x7B, 0xBB, 0x3A, 0x83, 0x4C, 0x71, 0xCD, 0xAF, 0x8F, 0x6D, 0x4A,
+0xEF, 0xC9, 0xBD, 0xC4, 0x4E, 0xBB, 0xB0, 0x91, 0xF9, 0x0F, 0x14, 0x6D, 0xAD, 0xCF, 0x73, 0x6B,
+0x52, 0xDE, 0x14, 0x62, 0x61, 0xF3, 0xBF, 0x15, 0xFE, 0x75, 0xEC, 0xF3, 0x40, 0x77, 0x47, 0xF8,
+0x27, 0x5F, 0x7C, 0x20, 0xEC, 0xDF, 0x32, 0x10, 0xDD, 0x02, 0x8A, 0x49, 0xB6, 0x3A, 0x37, 0xCB,
+0xAB, 0x82, 0x40, 0x41, 0x60, 0xED, 0x21, 0x50, 0x88, 0xDD, 0x2D, 0x1A, 0x53, 0x27, 0x76, 0x8C,
+0x70, 0xBD, 0x3E, 0x36, 0x11, 0x46, 0xE0, 0x4F, 0x77, 0x65, 0x68, 0x34, 0xBC, 0x7E, 0xEC, 0x7C,
+0x78, 0xE5, 0xF8, 0xD9, 0x70, 0xF2, 0xCA, 0x90, 0xB4, 0xAC, 0x1D, 0xEA, 0x5C, 0x2B, 0x08, 0x07,
+0x17, 0x24, 0x2E, 0xE4, 0xB2, 0xB4, 0x71, 0x51, 0x97, 0xC5, 0xDB, 0x4D, 0x64, 0xBA, 0x28, 0xCE,
+0x63, 0x61, 0xE3, 0x5A, 0x37, 0x57, 0xB3, 0xD6, 0xAB, 0x29, 0x2D, 0x23, 0x07, 0x26, 0x7D, 0x25,
+0xBF, 0x2D, 0x7D, 0x5F, 0xD7, 0x5D, 0xA5, 0x7A, 0xAA, 0x72, 0xC5, 0x15, 0x3B, 0x11, 0x08, 0xB9,
+0x8F, 0x6B, 0x7A, 0xA6, 0xA4, 0xD9, 0xDA, 0xEF, 0xA4, 0xA4, 0xAA, 0x72, 0xB9, 0x69, 0x4E, 0x81,
+0x76, 0x8A, 0xB5, 0x80, 0x2F, 0x64, 0xFC, 0x81, 0xB5, 0x3A, 0x39, 0x51, 0xAE, 0x95, 0xB7, 0xC3,
+0x06, 0xCC, 0xB9, 0x56, 0x46, 0xEC, 0x94, 0xD7, 0x18, 0x2B, 0x72, 0xE7, 0x38, 0x21, 0x9A, 0x2C,
+0x6C, 0x66, 0x43, 0x96, 0xA9, 0x10, 0x3B, 0xAD, 0xCF, 0x09, 0x8C, 0xB7, 0x4B, 0x89, 0x1D, 0xD5,
+0x47, 0x7D, 0x9F, 0xAA, 0x54, 0xF4, 0x3D, 0xCC, 0x08, 0x95, 0x13, 0x4C, 0x2D, 0xA6, 0xED, 0xCC,
+0x8D, 0xAD, 0x6C, 0x86, 0xEB, 0x9F, 0xA9, 0x8C, 0x3E, 0x93, 0x6B, 0xA5, 0xA3, 0xC4, 0x5F, 0x4D,
+0xEC, 0x91, 0xD8, 0xD9, 0x18, 0x6B, 0x7D, 0x5A, 0x2F, 0xF9, 0x0F, 0x3E, 0xB0, 0x7A, 0x91, 0x10,
+0x7D, 0xBF, 0xA7, 0x8E, 0x99, 0x37, 0x41, 0xE6, 0x40, 0x4E, 0xEC, 0xAC, 0x5E, 0x99, 0x23, 0x5E,
+0x8E, 0xB7, 0xF5, 0x17, 0x42, 0x8A, 0xAC, 0x3D, 0x72, 0x9F, 0x1A, 0xF2, 0x96, 0x5D, 0xE4, 0x4A,
+0x66, 0xE2, 0x58, 0x8E, 0x4B, 0xAA, 0xDB, 0xE7, 0xA8, 0xB4, 0x2E, 0x9B, 0x8B, 0x7E, 0x43, 0x99,
+0x7E, 0xD6, 0x0D, 0x69, 0x83, 0xFE, 0x93, 0x3A, 0xE0, 0xE8, 0xD8, 0xFC, 0x4E, 0xBD, 0xCB, 0x88,
+0x9D, 0x54, 0x5E, 0x01, 0x49, 0xC6, 0x99, 0xF3, 0xB8, 0xAF, 0xB7, 0x53, 0xFE, 0xAE, 0xEB, 0xEE,
+0x0C, 0xFF, 0x87, 0x2F, 0x3D, 0x58, 0x88, 0x5D, 0x36, 0xE6, 0xE5, 0x69, 0x41, 0xA0, 0x20, 0xB0,
+0xF6, 0x11, 0x28, 0xC4, 0xAE, 0xC9, 0x63, 0x5C, 0x49, 0x61, 0x82, 0x05, 0xED, 0xDA, 0xF0, 0x78,
+0x78, 0xFD, 0xF8, 0xB9, 0x70, 0xEC, 0xFC, 0xD5, 0x70, 0xF8, 0xFC, 0x95, 0x70, 0x71, 0x70, 0x34,
+0x8C, 0x4C, 0x4E, 0x69, 0x50, 0x04, 0xC9, 0x15, 0xD6, 0xAE, 0x59, 0x2C, 0xCC, 0xB4, 0xC2, 0xCE,
+0xE2, 0x39, 0x17, 0xF7, 0x59, 0x2C, 0x60, 0x24, 0x01, 0xA2, 0x1B, 0xC5, 0x30, 0x45, 0x12, 0x3F,
+0xA5, 0x44, 0xC9, 0xB2, 0xA5, 0x54, 0x47, 0xCF, 0x19, 0x19, 0xE3, 0x29, 0x71, 0xE0, 0xC7, 0x39,
+0xFC, 0x55, 0xE2, 0xE2, 0xD7, 0x66, 0x2A, 0x90, 0x10, 0x49, 0x23, 0x2A, 0x62, 0x1B, 0x74, 0x72,
+0xA5, 0x84, 0x8F, 0xB7, 0x75, 0xB2, 0xE8, 0x0B, 0xB8, 0x34, 0x85, 0x45, 0x23, 0xC9, 0xD0, 0x6B,
+0xFC, 0x3C, 0x5F, 0xB5, 0x59, 0x3D, 0x42, 0xFE, 0xAC, 0xA0, 0xB4, 0xD2, 0x5E, 0xB3, 0xAD, 0x5A,
+0xB7, 0x13, 0x9F, 0xC4, 0x0C, 0xA4, 0x9C, 0x70, 0x34, 0x65, 0x66, 0x26, 0xD2, 0x69, 0x40, 0x82,
+0xF4, 0x02, 0x0F, 0x01, 0x84, 0x0D, 0x51, 0x77, 0xFD, 0x56, 0xA6, 0xBB, 0xE0, 0xFA, 0x2F, 0xFD,
+0x57, 0x36, 0x91, 0x93, 0x0D, 0xED, 0x03, 0x73, 0x9D, 0x69, 0x0D, 0x91, 0x2B, 0x79, 0xFF, 0x9C,
+0xFD, 0x78, 0x39, 0xC3, 0xB7, 0x6A, 0x90, 0x95, 0x1B, 0xC6, 0x0E, 0x31, 0x0E, 0xD6, 0x0F, 0x0F,
+0x70, 0x10, 0xEA, 0x22, 0x64, 0xCC, 0x58, 0x8D, 0x5D, 0x21, 0x37, 0x04, 0x13, 0x17, 0xF2, 0x62,
+0x3C, 0xC5, 0x83, 0x1C, 0x22, 0xD5, 0x31, 0x5F, 0x4A, 0x25, 0x4C, 0xA9, 0x0E, 0x76, 0x91, 0xF5,
+0xCD, 0xE3, 0x89, 0x97, 0x15, 0x3E, 0x27, 0xF3, 0x24, 0x11, 0x25, 0x9D, 0x2B, 0x86, 0xA9, 0xF5,
+0x87, 0x7F, 0xE4, 0xC1, 0x2A, 0xF5, 0x82, 0x74, 0xFF, 0x48, 0xEC, 0x34, 0xA2, 0x37, 0x12, 0x40,
+0xB9, 0x8F, 0xD2, 0x56, 0xF6, 0x45, 0xFD, 0x05, 0xE9, 0xA7, 0x69, 0xD7, 0x1A, 0x1F, 0x4C, 0x7D,
+0x71, 0xE2, 0xE5, 0x05, 0xB4, 0x4D, 0xEA, 0xDB, 0x99, 0xFE, 0xEA, 0x8D, 0xED, 0x21, 0xEC, 0xD3,
+0xCA, 0x5B, 0x1F, 0xB4, 0x3E, 0xBB, 0x96, 0xFD, 0xE7, 0xC3, 0xB0, 0x88, 0x9C, 0xDF, 0xCE, 0xB7,
+0xB7, 0xB7, 0x85, 0xBD, 0xDB, 0x37, 0x84, 0x0E, 0x04, 0x4C, 0x6C, 0x5F, 0xD7, 0x17, 0xFE, 0x93,
+0x2F, 0x3F, 0x14, 0x76, 0x15, 0x53, 0x6C, 0x9C, 0x8F, 0xE5, 0x49, 0x41, 0xA0, 0x20, 0xB0, 0xF6,
+0x11, 0x28, 0xC4, 0xAE, 0xC9, 0x63, 0xEC, 0xC4, 0x6E, 0x06, 0x6C, 0xED, 0xDC, 0xD5, 0xE1, 0x70,
+0x14, 0x64, 0xEE, 0xD5, 0xA3, 0x67, 0xC3, 0x89, 0x8B, 0xD7, 0xF0, 0xB8, 0x1E, 0x26, 0xC1, 0xE0,
+0xB8, 0x38, 0xB5, 0x99, 0x62, 0x46, 0x13, 0x2C, 0x39, 0x1E, 0xB3, 0x9A, 0x70, 0x2D, 0xE5, 0x83,
+0xC4, 0x8E, 0x24, 0x8F, 0x4B, 0xA3, 0x04, 0x06, 0x50, 0xA9, 0xA3, 0x88, 0x23, 0x24, 0x06, 0x8F,
+0xC8, 0xA4, 0x8C, 0xB0, 0x19, 0x31, 0x53, 0xF2, 0x24, 0xCC, 0x48, 0xD5, 0x38, 0x92, 0x15, 0xB3,
+0x07, 0x0A, 0x29, 0xE4, 0xFA, 0xC9, 0x3A, 0xF8, 0x1F, 0x5E, 0xCF, 0x45, 0x9F, 0x25, 0x54, 0x18,
+0xC3, 0x2B, 0xF5, 0x3A, 0x2A, 0x6F, 0xC6, 0xAF, 0x84, 0x51, 0x09, 0x5F, 0xD4, 0x26, 0x25, 0xC3,
+0xA7, 0xF2, 0x4A, 0xE3, 0x6F, 0x5A, 0x9E, 0x44, 0x4B, 0x28, 0x29, 0xEE, 0xA5, 0xCF, 0xF5, 0x5A,
+0x7F, 0xC2, 0x7E, 0x3B, 0x81, 0x93, 0xF7, 0xA4, 0xAD, 0x46, 0xDA, 0xE4, 0xB5, 0x11, 0x4A, 0xBB,
+0x27, 0xCB, 0xB8, 0x99, 0x58, 0x89, 0x9D, 0xBE, 0x21, 0xCA, 0x16, 0xDF, 0x33, 0x62, 0xC7, 0xF6,
+0xB7, 0x8A, 0x7C, 0x96, 0x13, 0x3B, 0x57, 0x32, 0x9D, 0xD8, 0x59, 0x5B, 0xAC, 0x6E, 0x9A, 0x66,
+0xA3, 0xFA, 0x96, 0xF5, 0x51, 0x60, 0xD4, 0xC6, 0x65, 0xB3, 0x47, 0xC0, 0x93, 0xD7, 0x73, 0x46,
+0xEC, 0x84, 0xB3, 0x39, 0x79, 0x92, 0x37, 0x40, 0x94, 0x8C, 0xFC, 0x38, 0x89, 0x53, 0x62, 0x67,
+0x44, 0xCC, 0xF8, 0x15, 0x8B, 0x2A, 0xE9, 0xD2, 0x3E, 0xF0, 0xC5, 0x9C, 0xFB, 0x2D, 0x3A, 0xA9,
+0xE1, 0xBB, 0x46, 0xEE, 0xE7, 0xC1, 0xDC, 0xAA, 0x54, 0x88, 0x97, 0xE8, 0x8D, 0xE5, 0xBC, 0xD5,
+0x2B, 0xB7, 0xB6, 0xEB, 0xE5, 0x6D, 0x21, 0x86, 0x7A, 0x9F, 0xC8, 0xAB, 0x62, 0x59, 0x39, 0x2B,
+0xF7, 0xB5, 0x56, 0x28, 0x81, 0x94, 0x3A, 0x71, 0x8E, 0x24, 0x55, 0x48, 0xAE, 0x9D, 0xE3, 0x79,
+0xEB, 0x4B, 0x4E, 0xEC, 0xB4, 0x1D, 0x46, 0x07, 0x23, 0x43, 0xE4, 0x35, 0xA6, 0xF4, 0x89, 0xB4,
+0xA8, 0xCC, 0x93, 0xF5, 0xCB, 0x08, 0x64, 0xE5, 0xA4, 0xEF, 0x32, 0x5F, 0x6A, 0x89, 0x9D, 0x7D,
+0x18, 0x4C, 0x1E, 0x46, 0x33, 0xA4, 0x6F, 0x3D, 0x30, 0xBF, 0x1E, 0xD8, 0xB5, 0x31, 0x74, 0x75,
+0xB6, 0x23, 0x22, 0x76, 0x63, 0xF8, 0x07, 0x9F, 0xBF, 0x3F, 0x6C, 0x19, 0xE8, 0xC9, 0xC6, 0xA9,
+0x3C, 0x2D, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x6B, 0x1B, 0x81, 0x05, 0xDE, 0x3C, 0x6B, 0xBB, 0xBB,
+0xB7, 0xB6, 0x77, 0x9E, 0x05, 0x9F, 0x64, 0x65, 0x1C, 0xA9, 0x4B, 0x7E, 0xF2, 0xC1, 0xC9, 0xF0,
+0xC7, 0x3F, 0x79, 0x37, 0xBC, 0x02, 0x9F, 0xBA, 0x33, 0x57, 0x87, 0x84, 0x10, 0x74, 0x88, 0x9A,
+0xC6, 0x9C, 0x75, 0x73, 0x48, 0x77, 0x32, 0x8B, 0xC7, 0x5C, 0x18, 0x9D, 0x9A, 0x0B, 0x53, 0x60,
+0x72, 0x24, 0x79, 0x0C, 0xB0, 0x48, 0xF5, 0x28, 0x21, 0x21, 0xFF, 0x4A, 0x84, 0xC7, 0x08, 0x97,
+0x29, 0x53, 0xAC, 0xCE, 0xB8, 0x9C, 0x98, 0xFB, 0xA4, 0x1C, 0xD6, 0x44, 0x21, 0x59, 0xCA, 0xD1,
+0xB2, 0xE7, 0xC8, 0xDD, 0x16, 0x49, 0x0D, 0xCF, 0x33, 0x97, 0x1B, 0xAF, 0xD1, 0xF3, 0xF2, 0xB0,
+0xD7, 0x52, 0x17, 0x17, 0x6C, 0xA9, 0xD3, 0xEA, 0x95, 0xF7, 0x84, 0x89, 0xD8, 0x35, 0xE9, 0x3A,
+0x55, 0xC5, 0xEC, 0x1A, 0xE3, 0x44, 0x72, 0xBD, 0x2F, 0xFA, 0xF6, 0x9E, 0xD0, 0x0C, 0x23, 0x1F,
+0x4A, 0x1C, 0xA3, 0x46, 0x14, 0x55, 0x1D, 0x3F, 0x17, 0x29, 0x87, 0xD5, 0x21, 0xF5, 0x53, 0x63,
+0x02, 0x41, 0xE0, 0x73, 0x15, 0x9E, 0xF8, 0xD7, 0x7C, 0xE5, 0x04, 0x5A, 0x23, 0x1A, 0x72, 0x5A,
+0xEF, 0x15, 0x59, 0x8D, 0xD7, 0x23, 0x7F, 0x9D, 0x5D, 0x19, 0xA9, 0x90, 0xB6, 0x5A, 0x75, 0xD2,
+0xC3, 0x54, 0x57, 0x22, 0x51, 0x4A, 0x86, 0x84, 0x60, 0xFA, 0xAD, 0xAD, 0xFD, 0x6A, 0x42, 0xD5,
+0x93, 0x39, 0x16, 0x7C, 0x1D, 0x15, 0x28, 0xC7, 0x2E, 0x6F, 0x87, 0x93, 0x9C, 0x0C, 0x6F, 0xA9,
+0xC3, 0xDA, 0x18, 0xF1, 0xB1, 0x9B, 0xFA, 0x78, 0x46, 0x15, 0xD2, 0xC6, 0x5A, 0xC6, 0xC5, 0x79,
+0xA8, 0x8C, 0x9B, 0x8F, 0xBD, 0xF6, 0x2B, 0xBD, 0xAE, 0xCE, 0x09, 0x7E, 0x41, 0xF8, 0x3C, 0xD1,
+0xB9, 0xA1, 0xFE, 0x9A, 0x24, 0xD0, 0xAD, 0x32, 0xEE, 0x46, 0x8E, 0xF1, 0x97, 0xA4, 0x3C, 0x9E,
+0xC3, 0xFB, 0xFA, 0x5A, 0xFF, 0x7A, 0x39, 0x7F, 0xED, 0xEF, 0xB1, 0x1E, 0x3E, 0xA7, 0x92, 0x2B,
+0x65, 0xF8, 0x3A, 0x3B, 0x57, 0x79, 0xEE, 0xEF, 0x23, 0xFB, 0xB0, 0x9C, 0xE7, 0x5F, 0xAF, 0x9F,
+0xCF, 0xE1, 0x5B, 0xD7, 0xD3, 0xD5, 0x2E, 0x1F, 0x72, 0xB6, 0x7B, 0xD7, 0xFA, 0xDE, 0xD0, 0x89,
+0x1F, 0x49, 0x65, 0x8F, 0xE5, 0x5B, 0xFB, 0xBD, 0x57, 0xEE, 0x5E, 0x10, 0x28, 0x08, 0x34, 0x17,
+0x81, 0x42, 0xEC, 0x9A, 0x8B, 0x37, 0xD4, 0xB7, 0xB9, 0x70, 0xE1, 0xDA, 0x30, 0x82, 0x24, 0xCE,
+0xC1, 0x9F, 0xEE, 0x4C, 0x78, 0xFF, 0xF4, 0x85, 0x70, 0xE1, 0xFA, 0xB0, 0x04, 0x4A, 0x30, 0x09,
+0x31, 0x1F, 0xF4, 0xBB, 0x9B, 0x9C, 0x99, 0x87, 0x39, 0x96, 0x3B, 0x4C, 0xA8, 0x62, 0x47, 0x73,
+0x9A, 0x2B, 0x76, 0x6C, 0xB2, 0x92, 0x9E, 0x6C, 0x35, 0xCF, 0xFA, 0xE1, 0x6B, 0x78, 0xBE, 0x96,
+0xCB, 0x35, 0xFE, 0x70, 0xF2, 0x96, 0x9F, 0xB3, 0xEB, 0x7D, 0xED, 0xCF, 0xCB, 0x0B, 0x31, 0x8A,
+0x84, 0x25, 0x11, 0x97, 0x74, 0x1F, 0xD3, 0x74, 0xF2, 0x8B, 0xA5, 0x6E, 0x23, 0x48, 0x91, 0x53,
+0x18, 0x89, 0xA8, 0x69, 0xAB, 0xBF, 0x4C, 0xED, 0x4D, 0xD7, 0x2D, 0x68, 0x77, 0xE5, 0x1E, 0xD5,
+0x72, 0xB5, 0x43, 0x99, 0x8A, 0x1A, 0x23, 0xCB, 0xDA, 0x11, 0x65, 0xA8, 0x28, 0x9D, 0x91, 0x74,
+0x59, 0x0D, 0xFE, 0x57, 0x94, 0x22, 0x3D, 0x97, 0xFB, 0xCD, 0x2D, 0x3E, 0x65, 0x5C, 0x37, 0xAB,
+0xAD, 0x27, 0xD5, 0x5D, 0x69, 0xBE, 0xBD, 0xE0, 0x55, 0xD5, 0xB6, 0x66, 0x77, 0x70, 0x92, 0x5B,
+0xB9, 0x69, 0x0D, 0xD0, 0x69, 0x26, 0xC4, 0x31, 0xAE, 0x87, 0x85, 0xE0, 0xEB, 0x84, 0xAE, 0x66,
+0xEC, 0xE3, 0x7B, 0x56, 0xC6, 0x7B, 0xED, 0xAA, 0xEC, 0x82, 0xB9, 0x23, 0x73, 0xC8, 0x54, 0x34,
+0x14, 0x16, 0xF3, 0xB9, 0x3C, 0x4C, 0x99, 0x8D, 0xC4, 0xD1, 0xCE, 0xE3, 0x75, 0xFA, 0xD1, 0x90,
+0x54, 0xD9, 0x8A, 0x02, 0x9B, 0x5F, 0x23, 0xCF, 0x5D, 0x51, 0x75, 0x75, 0x38, 0x11, 0xC4, 0x9C,
+0x50, 0x7A, 0xDB, 0xA8, 0xCE, 0x76, 0x75, 0xB4, 0x43, 0x4D, 0x54, 0x62, 0xBF, 0x03, 0xC4, 0xAE,
+0x03, 0x64, 0xAF, 0x1C, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x4E, 0x42, 0xA0, 0x7C, 0xEB, 0x35,
+0x61, 0xB4, 0x45, 0x91, 0x11, 0x95, 0xA4, 0x05, 0x64, 0x0D, 0x91, 0xAF, 0xF0, 0xA9, 0xFB, 0xC3,
+0xE7, 0xDF, 0x02, 0xA9, 0xBB, 0x24, 0x0A, 0x4E, 0x87, 0x58, 0x3A, 0x41, 0xE0, 0x40, 0xE4, 0xC6,
+0xA6, 0xE6, 0x11, 0x09, 0x0B, 0x72, 0x07, 0x42, 0x27, 0x39, 0xE6, 0x32, 0xB5, 0xC3, 0x17, 0x41,
+0x59, 0x9D, 0x85, 0x0D, 0xF8, 0x92, 0xA6, 0x92, 0x8B, 0x2B, 0x2F, 0xFA, 0x5E, 0xEA, 0x58, 0xE4,
+0x29, 0xC6, 0x2F, 0xC4, 0xFC, 0x96, 0x71, 0x31, 0x16, 0xF5, 0x4B, 0x5C, 0x71, 0x52, 0x32, 0xB3,
+0xFC, 0x21, 0xD7, 0xB9, 0x53, 0x98, 0xCA, 0x75, 0x49, 0x18, 0xE2, 0x0B, 0x95, 0xB6, 0x8C, 0x88,
+0x3A, 0x5D, 0x48, 0x37, 0xD4, 0x4B, 0x49, 0xD0, 0xF4, 0xBF, 0xCA, 0xF5, 0xDE, 0x46, 0x13, 0xBB,
+0x54, 0x19, 0xCC, 0x7C, 0xBE, 0xE4, 0xDE, 0x0A, 0x83, 0x08, 0x6F, 0x15, 0xBD, 0xCC, 0x4C, 0xCB,
+0x06, 0x95, 0xBE, 0x6B, 0x65, 0xE5, 0x2E, 0x39, 0x09, 0xB3, 0xF7, 0xE4, 0xAC, 0x99, 0x18, 0x6B,
+0xFA, 0x6F, 0xCD, 0x8C, 0xF7, 0x72, 0x82, 0x64, 0x43, 0xE4, 0xC2, 0xA0, 0xB6, 0x27, 0xC3, 0x53,
+0xE9, 0x8F, 0x76, 0x44, 0xEF, 0xAF, 0x7D, 0x14, 0x15, 0x29, 0x02, 0x9C, 0x29, 0x84, 0x76, 0x32,
+0x1F, 0x33, 0xC5, 0xC7, 0x79, 0x27, 0xE7, 0x84, 0xBD, 0x2B, 0x7D, 0x4E, 0x88, 0xE5, 0x44, 0xDA,
+0x03, 0x6D, 0xF4, 0x3A, 0xAF, 0xDF, 0xF0, 0x17, 0x52, 0x96, 0x5F, 0x6B, 0xFD, 0xB7, 0x49, 0xA0,
+0xD5, 0xBB, 0xB9, 0xDE, 0xFD, 0xE1, 0x4C, 0xAD, 0xB4, 0x0B, 0xA5, 0xE9, 0xD2, 0x14, 0x23, 0xFA,
+0x11, 0x67, 0x35, 0xB1, 0x7A, 0x13, 0xF5, 0x8E, 0x76, 0x5F, 0xAB, 0x55, 0xEA, 0x46, 0x01, 0x85,
+0x40, 0x71, 0x88, 0x66, 0xE7, 0xBC, 0x70, 0x05, 0x84, 0x54, 0x87, 0x8B, 0xAC, 0xD5, 0x31, 0x24,
+0xB6, 0xF3, 0x50, 0xE8, 0xE8, 0x7F, 0x3A, 0x27, 0xBE, 0xA3, 0x3B, 0x36, 0xF4, 0xE1, 0x75, 0xF9,
+0x8A, 0xCB, 0xC7, 0xA0, 0x3C, 0x2F, 0x08, 0x14, 0x04, 0xD6, 0x3E, 0x02, 0xE5, 0x5B, 0xAF, 0x89,
+0x63, 0x3C, 0x81, 0xD4, 0x25, 0x87, 0x41, 0xE6, 0x5E, 0x3B, 0x76, 0x3A, 0xBC, 0x7B, 0xF2, 0x3C,
+0x92, 0x0E, 0x8F, 0xCA, 0x02, 0x2F, 0x01, 0x11, 0x54, 0xEA, 0x40, 0xE6, 0x68, 0x72, 0x9D, 0x16,
+0x85, 0x2E, 0x2D, 0xA8, 0x75, 0x09, 0x56, 0x9D, 0x45, 0x6F, 0xA9, 0xAE, 0x38, 0x65, 0xF2, 0xCB,
+0x16, 0x27, 0x6D, 0xBA, 0xEA, 0xA7, 0xEA, 0x9D, 0x3C, 0x2E, 0x7E, 0x85, 0x92, 0xC4, 0x9C, 0x62,
+0xE4, 0xAB, 0x73, 0x4D, 0xAB, 0x16, 0x21, 0x9C, 0xB5, 0x6D, 0x5F, 0x8A, 0x54, 0xD6, 0x7B, 0x4F,
+0x5B, 0xE9, 0xD4, 0xB0, 0x5A, 0x9B, 0x9E, 0x4D, 0xE4, 0x2A, 0xA7, 0xAC, 0x5E, 0x57, 0x5E, 0xA7,
+0xF7, 0x58, 0x6A, 0x89, 0x6F, 0x24, 0xDF, 0xBC, 0xDA, 0xB2, 0x52, 0xAC, 0x06, 0x26, 0x27, 0x3E,
+0xB1, 0x0A, 0x23, 0x53, 0xF5, 0xC6, 0xC8, 0xB8, 0x5E, 0xBA, 0x5D, 0xCD, 0x0D, 0x9C, 0x0C, 0xA6,
+0x72, 0xCE, 0xC0, 0x16, 0x27, 0xDF, 0x11, 0x89, 0xBC, 0x21, 0x71, 0x50, 0x6B, 0x10, 0xF4, 0x97,
+0xFE, 0xBE, 0x13, 0xEA, 0xAC, 0xB1, 0x8B, 0x4F, 0xB7, 0xFA, 0x23, 0x95, 0xFF, 0x70, 0x58, 0xD8,
+0x67, 0xA5, 0x71, 0x79, 0x9D, 0x4B, 0x4E, 0xE7, 0xDA, 0x41, 0xAA, 0xF4, 0xC3, 0xDE, 0xC4, 0x1F,
+0x9A, 0x67, 0xD5, 0x93, 0x61, 0x2E, 0xF4, 0xC3, 0x24, 0xBB, 0x1E, 0xD1, 0xB1, 0x6D, 0x1E, 0x4C,
+0xD3, 0xC4, 0xCF, 0x79, 0xB9, 0x55, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8, 0x95, 0x08, 0x14, 0x62,
+0xB7, 0x8A, 0xE8, 0xE7, 0x4A, 0x1D, 0x6F, 0x73, 0x6D, 0x78, 0x2C, 0x7C, 0xE7, 0xD5, 0x0F, 0xC2,
+0xCB, 0x1F, 0x9E, 0x0A, 0x33, 0x60, 0x6F, 0x6D, 0x50, 0x18, 0xE0, 0x4A, 0x17, 0xC6, 0xA7, 0x5B,
+0xC2, 0xD8, 0x4C, 0x0B, 0x02, 0x27, 0xA0, 0x36, 0x88, 0x53, 0x79, 0x0A, 0x4C, 0xA8, 0x90, 0x0C,
+0x6B, 0x6B, 0xCD, 0xFA, 0xAB, 0x74, 0xC6, 0x54, 0x31, 0x59, 0x50, 0x13, 0x8F, 0xA9, 0x21, 0x5C,
+0x49, 0x4D, 0x71, 0xD1, 0xAF, 0xBA, 0xC0, 0x1A, 0x05, 0x72, 0x9F, 0xB4, 0x48, 0x35, 0x16, 0x2E,
+0xDE, 0xBE, 0x70, 0xE7, 0x0B, 0xB2, 0xAB, 0x37, 0xAE, 0xBE, 0x48, 0x6D, 0x6C, 0x9A, 0xDF, 0xAC,
+0x42, 0x94, 0xAA, 0xF4, 0x2A, 0x37, 0x75, 0x6A, 0xD4, 0x6B, 0xAE, 0x68, 0x59, 0x37, 0x4C, 0x19,
+0xCC, 0x5B, 0x13, 0x95, 0x1F, 0x69, 0x73, 0x34, 0x4E, 0x4B, 0xCB, 0x25, 0xDA, 0x53, 0xAA, 0x51,
+0x14, 0x9D, 0xDA, 0xA5, 0x52, 0x55, 0x22, 0xE8, 0xD0, 0x39, 0xE6, 0xA2, 0x0C, 0x45, 0x09, 0x4E,
+0xC7, 0x24, 0x87, 0x57, 0xCA, 0xB9, 0xBF, 0x9B, 0x5D, 0x94, 0x14, 0x48, 0x1D, 0x07, 0xC7, 0x49,
+0xD5, 0xAD, 0x34, 0xD9, 0xBC, 0x8B, 0x4A, 0x0A, 0xB5, 0x62, 0x0D, 0x60, 0xD1, 0x7E, 0x4B, 0x59,
+0xC3, 0x4E, 0x15, 0x49, 0x3D, 0xAF, 0x1C, 0xDA, 0x71, 0xCD, 0xC9, 0xAA, 0xD6, 0x9D, 0x88, 0xBB,
+0xD7, 0xA5, 0x18, 0xE4, 0xEF, 0xB8, 0x8A, 0xA8, 0x38, 0xB2, 0xDE, 0xEA, 0xF8, 0xE6, 0xAA, 0xED,
+0x92, 0x84, 0xCB, 0xD2, 0x91, 0x48, 0x2D, 0xA6, 0xDC, 0x39, 0x42, 0xA9, 0x1D, 0xDA, 0x2E, 0x9F,
+0x92, 0xEE, 0x31, 0x69, 0x72, 0x9D, 0x8E, 0x4B, 0x1C, 0xA3, 0x84, 0x4F, 0x0E, 0x74, 0x6C, 0x5E,
+0xE2, 0x70, 0xEA, 0x43, 0x59, 0x73, 0xB4, 0xC3, 0xCF, 0x0E, 0x61, 0x45, 0x30, 0x0B, 0xCF, 0x85,
+0xAD, 0xFD, 0xDD, 0x50, 0xC2, 0x99, 0xCF, 0x4E, 0x55, 0xDE, 0x72, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x3B, 0x05, 0x81, 0x42, 0xEC, 0x9A, 0x30, 0xD2, 0x34, 0x0D, 0x5D, 0x19, 0x1E, 0x85, 0x09,
+0xF6, 0x2C, 0x1E, 0x67, 0x10, 0x0D, 0x3B, 0x08, 0x85, 0x4E, 0x23, 0x03, 0x99, 0xCA, 0x84, 0x11,
+0xAF, 0xEE, 0x47, 0x97, 0x96, 0x2B, 0x5D, 0xBC, 0xE3, 0xAA, 0x98, 0xB5, 0x53, 0x4E, 0x67, 0x6F,
+0xE7, 0x5D, 0xD0, 0x4B, 0xF2, 0x85, 0x2C, 0x7B, 0xEE, 0x4F, 0xEB, 0xAC, 0xD6, 0x8B, 0x5C, 0xB1,
+0x28, 0x3A, 0x51, 0xA1, 0xE2, 0xA2, 0x2E, 0x6D, 0x59, 0x66, 0xF1, 0xF4, 0x46, 0xDF, 0x08, 0xDE,
+0xCE, 0xB4, 0x16, 0x5C, 0x5B, 0x73, 0xCF, 0x3A, 0x4D, 0x68, 0xA8, 0x5F, 0x8E, 0x65, 0x1D, 0xBC,
+0xE3, 0xF5, 0x19, 0xA9, 0xA8, 0x60, 0x9F, 0x3B, 0xAD, 0x39, 0xF2, 0x39, 0xE4, 0x8B, 0x62, 0xE3,
+0x2C, 0x6D, 0x69, 0x40, 0x16, 0x8E, 0xE7, 0xC2, 0xD1, 0xCD, 0xFB, 0xD8, 0x90, 0xF2, 0xC5, 0x31,
+0x8B, 0xB7, 0x5D, 0xF2, 0x8A, 0x58, 0xAA, 0x61, 0x6A, 0x54, 0xAF, 0xE0, 0x82, 0x61, 0x52, 0xD3,
+0xBB, 0x1F, 0x37, 0x1E, 0xDC, 0x60, 0x13, 0x03, 0x63, 0xC0, 0xF8, 0xE5, 0x76, 0xC8, 0x75, 0xE2,
+0x5F, 0x87, 0x8A, 0x77, 0xC2, 0x0C, 0xDB, 0x81, 0xC0, 0x89, 0x72, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x3B, 0x0D, 0x81, 0x42, 0xEC, 0x56, 0x69, 0xC4, 0xF3, 0x08, 0xD8, 0x69, 0xB0, 0xB7, 0x23,
+0x67, 0x2E, 0x85, 0xBF, 0x78, 0xF1, 0xED, 0x70, 0xFE, 0xDA, 0x90, 0x44, 0x96, 0x52, 0xA5, 0x98,
+0x82, 0x42, 0x37, 0x8D, 0x87, 0xA6, 0x7E, 0x30, 0x35, 0x2D, 0x63, 0x12, 0xAE, 0x38, 0xC5, 0xBC,
+0x74, 0x26, 0xAF, 0xC9, 0x72, 0x46, 0xC2, 0x20, 0x62, 0x8C, 0xA9, 0x36, 0x3C, 0x19, 0xC5, 0x17,
+0x7B, 0x91, 0x2D, 0xDE, 0x52, 0xCA, 0x09, 0x8C, 0x2D, 0xEC, 0x8B, 0x94, 0x12, 0xE5, 0x2B, 0xE5,
+0xC2, 0xE3, 0x85, 0xB9, 0xD4, 0x64, 0x62, 0x9A, 0x93, 0x2D, 0x51, 0x96, 0x54, 0x2D, 0x63, 0xA3,
+0x54, 0x68, 0xD2, 0x4E, 0x44, 0xE5, 0x2E, 0x2F, 0x53, 0x17, 0xEF, 0x5C, 0x23, 0xF2, 0xEB, 0x0C,
+0x08, 0x97, 0xC8, 0xE4, 0x7E, 0xFA, 0x42, 0x61, 0xB0, 0x3B, 0x65, 0xAA, 0x91, 0x2A, 0x5A, 0xFA,
+0x5F, 0x8A, 0x3E, 0xF5, 0x96, 0x78, 0xD0, 0x47, 0xF2, 0x79, 0xF3, 0xA6, 0xB8, 0xDF, 0x9E, 0x90,
+0x55, 0xBF, 0x9F, 0x0A, 0x64, 0x72, 0xC8, 0x69, 0x27, 0x76, 0xAC, 0xDA, 0x70, 0xCC, 0xC7, 0x58,
+0x9E, 0xF3, 0x1A, 0x79, 0x5F, 0x49, 0x9B, 0x54, 0x25, 0xD7, 0xA9, 0x7A, 0x96, 0x54, 0x52, 0xF7,
+0x86, 0xCB, 0x83, 0x3F, 0xAA, 0x04, 0xCB, 0x71, 0x94, 0x59, 0xE1, 0xAA, 0x93, 0x15, 0xC9, 0xDB,
+0xE5, 0xED, 0xF3, 0x51, 0xF2, 0x2E, 0x54, 0x7E, 0x20, 0x78, 0x2F, 0xE4, 0x42, 0xC5, 0xA6, 0x4A,
+0x0F, 0x6B, 0x07, 0x25, 0xAF, 0x25, 0x19, 0xB2, 0x17, 0x72, 0xB6, 0xFC, 0x2E, 0xA6, 0x88, 0x1A,
+0x88, 0x5E, 0x56, 0x55, 0xCF, 0x84, 0x63, 0x84, 0xD8, 0x7C, 0x42, 0x0D, 0x9D, 0xEA, 0x1C, 0xAB,
+0x69, 0x8E, 0x8C, 0x77, 0xEE, 0x18, 0x6A, 0xEF, 0x7B, 0x37, 0x1C, 0x45, 0x46, 0x94, 0xAB, 0x7F,
+0xDD, 0x7C, 0xD8, 0xB7, 0x79, 0x00, 0x81, 0x14, 0x85, 0xD8, 0xD5, 0xFD, 0xB8, 0x95, 0x93, 0x05,
+0x81, 0x82, 0xC0, 0x9A, 0x46, 0xA0, 0x10, 0xBB, 0x55, 0x1E, 0xDE, 0xA9, 0xE9, 0x99, 0x70, 0xF6,
+0xF2, 0xF5, 0xF0, 0xDA, 0xE1, 0x53, 0xF0, 0xAB, 0x3B, 0x17, 0x46, 0x27, 0x26, 0xE4, 0x8E, 0x92,
+0x8B, 0x6E, 0x0E, 0x46, 0xA3, 0x2A, 0x83, 0x5A, 0xBA, 0x35, 0x75, 0xC4, 0x95, 0xCA, 0x62, 0x5B,
+0x79, 0xDF, 0x99, 0x97, 0x13, 0xA1, 0x46, 0x3B, 0xBA, 0xF0, 0x26, 0x4E, 0xD3, 0x16, 0xAB, 0x61,
+0xC1, 0x82, 0x1F, 0x39, 0x59, 0x9D, 0x06, 0x5B, 0x25, 0x0B, 0x49, 0xC2, 0xC2, 0xDA, 0x1B, 0x29,
+0x53, 0xBD, 0x2A, 0x0B, 0x53, 0xA8, 0x90, 0x97, 0xAA, 0x39, 0xCE, 0x1D, 0xF6, 0xF3, 0x6B, 0x17,
+0x10, 0xA1, 0x78, 0x73, 0x7D, 0x92, 0xB7, 0x25, 0x12, 0xAB, 0xCC, 0xC4, 0x67, 0xFC, 0x6D, 0x51,
+0x25, 0x35, 0xBF, 0x97, 0x8F, 0xCC, 0x42, 0x91, 0x73, 0x71, 0xBC, 0x84, 0x92, 0xF9, 0xDB, 0x8B,
+0x02, 0x53, 0xF3, 0x46, 0x6C, 0x5F, 0x4D, 0xBD, 0x46, 0x4C, 0x13, 0xDD, 0x5A, 0x6C, 0x50, 0x96,
+0x6E, 0xCF, 0x92, 0x33, 0x6A, 0x89, 0xC1, 0x8B, 0xB5, 0x56, 0xFA, 0xB3, 0xF2, 0xD1, 0x8E, 0xF7,
+0x67, 0x7F, 0xF0, 0x4D, 0x46, 0xD7, 0x06, 0x86, 0x8F, 0x77, 0x21, 0x60, 0x62, 0xCB, 0x40, 0x89,
+0x88, 0x6D, 0xF4, 0x13, 0x5F, 0xCA, 0x15, 0x04, 0x0A, 0x02, 0x6B, 0x0B, 0x81, 0x42, 0xEC, 0x56,
+0x61, 0x3C, 0x73, 0xBF, 0x9E, 0x61, 0x6C, 0x17, 0xF6, 0xDA, 0x91, 0x53, 0xE1, 0x87, 0x6F, 0x1D,
+0x41, 0xEE, 0xBA, 0x29, 0x51, 0x74, 0x48, 0xEA, 0x66, 0x90, 0xCC, 0x76, 0x4E, 0x14, 0xAE, 0x85,
+0x8E, 0xE4, 0xDE, 0xA4, 0xA8, 0x6E, 0x54, 0xD6, 0x57, 0xD1, 0x2F, 0x2A, 0xBE, 0x54, 0x4B, 0x12,
+0x94, 0x28, 0x41, 0x55, 0x4B, 0xC5, 0xBA, 0xB3, 0xD3, 0x7A, 0xCE, 0xD4, 0x3A, 0xBB, 0xE7, 0x02,
+0x6D, 0xC7, 0x14, 0x98, 0xDC, 0x39, 0x5E, 0xAE, 0x93, 0x7F, 0x2C, 0x7A, 0xD3, 0x98, 0x4B, 0x0C,
+0xDE, 0xF4, 0x02, 0x22, 0x67, 0x69, 0xC5, 0x7E, 0xFF, 0x7A, 0x6D, 0x8F, 0xC4, 0x49, 0xDA, 0x93,
+0x1D, 0x92, 0x2C, 0x77, 0x91, 0x14, 0x27, 0x1E, 0x06, 0x5A, 0xA1, 0x61, 0x91, 0x61, 0x6A, 0x34,
+0xAD, 0xB0, 0xA3, 0x4C, 0x81, 0xF3, 0xB7, 0xA3, 0xFF, 0x5A, 0xD6, 0x5B, 0xE9, 0x83, 0xBF, 0xAE,
+0x86, 0x5F, 0x68, 0x57, 0x2D, 0x87, 0x9B, 0x75, 0xC9, 0x4D, 0xD3, 0x1E, 0x25, 0x5B, 0x21, 0x6D,
+0x0B, 0x30, 0xA3, 0xBA, 0x87, 0x9E, 0x64, 0xBE, 0x87, 0x4B, 0x51, 0x28, 0xF5, 0x11, 0xCB, 0xFA,
+0x9D, 0xBA, 0x65, 0xEA, 0xA5, 0x22, 0xAA, 0x9A, 0xAF, 0x29, 0x93, 0xEC, 0xA7, 0xCD, 0xAF, 0x0A,
+0x2D, 0x95, 0x73, 0xE6, 0x7F, 0x97, 0x8F, 0x44, 0x65, 0xA0, 0x75, 0x8E, 0xF9, 0x21, 0x7D, 0x12,
+0x8C, 0xAA, 0xE4, 0xAB, 0xAA, 0x37, 0x66, 0xE5, 0xAD, 0xBF, 0x3E, 0xCE, 0x7E, 0x95, 0xD7, 0x5A,
+0x3B, 0xF7, 0x44, 0x99, 0xAE, 0x8C, 0x9B, 0xBE, 0xCA, 0x5B, 0xA1, 0x79, 0x09, 0xD3, 0xFD, 0xA5,
+0xB9, 0x78, 0x29, 0xD3, 0x09, 0xFF, 0xE8, 0x6E, 0x25, 0x54, 0xC2, 0x19, 0x38, 0xD1, 0x11, 0xFA,
+0xB0, 0x9D, 0x98, 0x6F, 0xC5, 0x97, 0x4F, 0xA1, 0xF2, 0xBC, 0x20, 0x50, 0x10, 0x28, 0x08, 0xAC,
+0x75, 0x04, 0x0A, 0xB1, 0x5B, 0xA5, 0x11, 0x9E, 0x86, 0xD3, 0xDC, 0xB9, 0x2B, 0xD7, 0xC3, 0x07,
+0xA7, 0xCE, 0x87, 0x37, 0x40, 0xEC, 0x8E, 0x9F, 0xBF, 0x0C, 0x3F, 0x3A, 0x84, 0xBB, 0xD2, 0xBD,
+0x7B, 0xBE, 0x0D, 0x4A, 0xDD, 0xC2, 0x4D, 0xA9, 0x62, 0x53, 0x6A, 0xE5, 0xA1, 0x05, 0xCA, 0xC6,
+0x22, 0xEA, 0x06, 0x17, 0xBA, 0x3A, 0xFD, 0x89, 0x0A, 0x91, 0x2F, 0x9E, 0x75, 0x9C, 0xC9, 0x13,
+0xDD, 0xAA, 0xB7, 0xC4, 0xFA, 0x12, 0x9D, 0x2A, 0x8F, 0xEA, 0x51, 0xA4, 0x00, 0x5C, 0xCD, 0x97,
+0x03, 0x73, 0xE9, 0x32, 0xE9, 0xF2, 0xE5, 0xD5, 0x9B, 0x65, 0x4B, 0x2C, 0x59, 0x60, 0xE1, 0x9B,
+0x55, 0x8C, 0x52, 0x3F, 0x16, 0x94, 0xB4, 0x13, 0x62, 0x0A, 0x37, 0x58, 0xF4, 0x79, 0x35, 0x70,
+0xA3, 0x82, 0x84, 0x95, 0x5D, 0x4A, 0x9C, 0xD5, 0x6A, 0xB3, 0xBB, 0xD5, 0x6B, 0xFF, 0xB2, 0x9D,
+0x5E, 0xDA, 0xC0, 0xBA, 0xDC, 0xE8, 0x54, 0xE7, 0xDF, 0x62, 0x88, 0xD4, 0xD6, 0x92, 0x00, 0x69,
+0xF4, 0x8A, 0x45, 0x6A, 0x68, 0xB8, 0x79, 0x09, 0x26, 0xA5, 0x7E, 0xA4, 0xAA, 0x88, 0x9B, 0x10,
+0xFF, 0x3A, 0x1E, 0x5B, 0xD7, 0xF5, 0x4A, 0xA2, 0xE2, 0x12, 0x33, 0xD1, 0x38, 0xA4, 0xA5, 0x64,
+0x41, 0xA0, 0x20, 0xB0, 0x76, 0x10, 0x28, 0xC4, 0xEE, 0x26, 0x8F, 0xA5, 0x2B, 0x39, 0xA3, 0x13,
+0x93, 0xE1, 0x95, 0x0F, 0x3E, 0x0A, 0xDF, 0x7B, 0xED, 0x03, 0x28, 0x76, 0xA7, 0x65, 0x0B, 0xA6,
+0x56, 0xAC, 0xEC, 0x73, 0x2D, 0x1D, 0x78, 0xC0, 0xF7, 0x47, 0x54, 0x10, 0x55, 0x55, 0x16, 0x2C,
+0x88, 0x99, 0xC4, 0x21, 0xEA, 0x86, 0xBF, 0xF6, 0x82, 0xA2, 0x3A, 0xA9, 0xF4, 0x94, 0xB6, 0x6C,
+0x72, 0xF6, 0xE0, 0x1D, 0x4A, 0x6C, 0x30, 0xCF, 0x6F, 0xA6, 0x0E, 0x62, 0xE6, 0xB7, 0x65, 0x54,
+0x22, 0xF1, 0x05, 0xB9, 0x5B, 0x6C, 0x8F, 0x8B, 0x38, 0xB5, 0x9E, 0x60, 0xB1, 0xBC, 0x29, 0x5D,
+0x39, 0x84, 0x75, 0x89, 0x65, 0x45, 0x0D, 0xAA, 0xCF, 0x4E, 0x12, 0x06, 0xA6, 0xCC, 0x18, 0x07,
+0xD4, 0x16, 0xD9, 0x21, 0x8A, 0x8C, 0x2A, 0x8A, 0x7E, 0x3E, 0x6A, 0x97, 0x59, 0x6E, 0xB7, 0x24,
+0xCB, 0xE9, 0x75, 0xF9, 0xFE, 0xAC, 0xE6, 0x04, 0xA7, 0xE7, 0xF9, 0xF0, 0x31, 0x10, 0x38, 0x33,
+0xFF, 0x3B, 0xBE, 0xAE, 0xED, 0x4C, 0x94, 0x89, 0xB4, 0x4E, 0x8F, 0x54, 0x55, 0x41, 0xCD, 0xA9,
+0xD9, 0xC2, 0x86, 0x5B, 0x30, 0x6F, 0xC6, 0xBA, 0xB4, 0xB7, 0x95, 0x71, 0x31, 0x62, 0xE8, 0xED,
+0xCA, 0x49, 0x89, 0x06, 0x17, 0x38, 0x93, 0xB4, 0x46, 0xC7, 0x1A, 0xD2, 0x78, 0xAB, 0x5A, 0xE7,
+0xBE, 0x6E, 0xA6, 0x2A, 0xE6, 0x64, 0xD1, 0x24, 0x30, 0x6F, 0xAE, 0x77, 0xAF, 0xD2, 0x4D, 0xC3,
+0x23, 0x7A, 0x24, 0x46, 0x15, 0x56, 0x26, 0x5B, 0x1C, 0xEA, 0xA4, 0x9C, 0xEA, 0x78, 0xF9, 0x9E,
+0xBB, 0x2C, 0xE0, 0xFE, 0x9F, 0x8A, 0xBD, 0x02, 0xED, 0x53, 0x20, 0x9F, 0xEB, 0xC9, 0x07, 0x33,
+0x79, 0x65, 0xE6, 0x73, 0x49, 0xCA, 0x56, 0x26, 0x80, 0xD5, 0x65, 0x9F, 0x1D, 0x05, 0x54, 0x29,
+0x35, 0xFD, 0x56, 0xE7, 0xF0, 0xC3, 0x89, 0x7F, 0xF7, 0x6F, 0x5D, 0x0F, 0x73, 0x2C, 0x12, 0x15,
+0xE7, 0xBF, 0x3E, 0xF2, 0x8A, 0xCB, 0xF3, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xB0, 0x86, 0x11, 0x28,
+0xC4, 0x6E, 0x15, 0x06, 0x97, 0x49, 0x88, 0x4F, 0x9C, 0xBB, 0x1C, 0x5E, 0x3D, 0x7C, 0x32, 0xBC,
+0x79, 0xF4, 0x54, 0x38, 0x7F, 0xF5, 0x3A, 0xE5, 0x04, 0xAC, 0x41, 0x6D, 0x48, 0xC6, 0x80, 0x2D,
+0x8E, 0x7C, 0xB1, 0x5D, 0x56, 0xE1, 0x5A, 0xBE, 0x71, 0x1E, 0x28, 0xB0, 0xB0, 0xA4, 0xAD, 0xE2,
+0xCB, 0xCB, 0x68, 0x35, 0x97, 0x2E, 0x24, 0x5E, 0x75, 0xC9, 0x5A, 0x56, 0xAC, 0x96, 0x9A, 0xD6,
+0xA7, 0x6E, 0xF5, 0xFB, 0xE2, 0xAD, 0x4C, 0xEF, 0xDA, 0xD5, 0x46, 0x06, 0x84, 0x28, 0x64, 0x97,
+0x26, 0x42, 0xA7, 0x27, 0x1B, 0xBD, 0x57, 0xDD, 0x3E, 0xD4, 0xBD, 0xDE, 0x4A, 0x7E, 0x9C, 0xB1,
+0xA9, 0x73, 0x6D, 0x4E, 0x68, 0x96, 0x1F, 0xD5, 0x54, 0x42, 0xAA, 0xAA, 0x25, 0x28, 0x4B, 0xB4,
+0xAD, 0xFA, 0x56, 0x63, 0x9D, 0x58, 0x12, 0xC3, 0x65, 0xAB, 0x58, 0xBA, 0x80, 0xB6, 0x7F, 0xF1,
+0xB1, 0xAF, 0xE9, 0x69, 0x63, 0xD0, 0xD4, 0xD4, 0xA7, 0x8A, 0xDD, 0x2C, 0xDC, 0xEB, 0xB0, 0xCF,
+0x32, 0x98, 0xE0, 0xEE, 0x4D, 0x25, 0x70, 0xA2, 0x31, 0x20, 0x4B, 0xA9, 0x82, 0x40, 0x41, 0x60,
+0x2D, 0x22, 0x50, 0x88, 0xDD, 0x4D, 0x1C, 0xD5, 0xA8, 0xD6, 0x8D, 0x4F, 0x85, 0x9F, 0xBC, 0x7B,
+0x34, 0xBC, 0x0E, 0x62, 0x77, 0xEA, 0xE2, 0x55, 0xF1, 0xFB, 0xA1, 0xF4, 0x30, 0x0B, 0xB5, 0x6E,
+0x9E, 0x5E, 0xDE, 0xF4, 0xAF, 0x8A, 0xF7, 0xAD, 0xF3, 0xCC, 0x49, 0x8D, 0x2B, 0x1D, 0x35, 0xAA,
+0x85, 0xAA, 0x20, 0xB6, 0x1C, 0xCB, 0x9F, 0x44, 0x86, 0x2A, 0x4C, 0x87, 0xD7, 0x8B, 0x54, 0x92,
+0x67, 0x89, 0x5B, 0xDC, 0xA7, 0x4F, 0x6B, 0xD2, 0x9B, 0xB9, 0xC2, 0x52, 0x0B, 0x8F, 0x93, 0x00,
+0xF5, 0x29, 0x73, 0x15, 0x27, 0x25, 0xAF, 0x70, 0x02, 0x53, 0x2B, 0xB4, 0x2C, 0x06, 0xB3, 0x97,
+0x4F, 0x04, 0xAF, 0x46, 0x19, 0xB2, 0x8A, 0x2C, 0x25, 0x5D, 0xA6, 0xE0, 0xF8, 0x1D, 0xBC, 0x6F,
+0xB5, 0xF4, 0x2F, 0xBB, 0xA3, 0xFB, 0x87, 0x2D, 0x42, 0xB8, 0x9C, 0x7B, 0x18, 0x54, 0x49, 0x5E,
+0xAA, 0xD7, 0x79, 0x03, 0x46, 0xA3, 0x5C, 0xAD, 0xAD, 0x72, 0xCE, 0x06, 0xCB, 0xE5, 0xC4, 0xEC,
+0x5A, 0xF7, 0xA7, 0xAB, 0x47, 0xEE, 0xF2, 0x26, 0xF9, 0x73, 0xE9, 0x59, 0x3D, 0x32, 0x84, 0x73,
+0xD5, 0x98, 0xDE, 0x5C, 0x4B, 0xCD, 0x91, 0xD4, 0x0A, 0xA2, 0x5F, 0xA1, 0xB7, 0xA5, 0x86, 0xC1,
+0xC5, 0x31, 0x62, 0xBD, 0x09, 0xCE, 0x94, 0x62, 0x2E, 0xE3, 0x64, 0x39, 0xA1, 0xD6, 0x3B, 0x25,
+0xFF, 0x50, 0xB9, 0x80, 0x73, 0x9A, 0x6A, 0xAA, 0xCF, 0xDD, 0x65, 0x18, 0xB7, 0xD7, 0x21, 0x4D,
+0x23, 0x8C, 0x75, 0x28, 0xBA, 0x93, 0xC2, 0x98, 0xB3, 0xCE, 0xB1, 0x97, 0x01, 0x4B, 0x48, 0xE8,
+0x1E, 0xC6, 0x48, 0x1F, 0x04, 0x53, 0x6C, 0x07, 0x6C, 0xB2, 0x5B, 0x37, 0xF4, 0xE3, 0x6F, 0x5B,
+0xC9, 0x5F, 0x77, 0x13, 0xBF, 0xDB, 0x4A, 0x55, 0x05, 0x81, 0x82, 0xC0, 0x27, 0x07, 0x81, 0x42,
+0xEC, 0x6E, 0xF2, 0x58, 0xD1, 0xB7, 0xEE, 0xE4, 0x85, 0xCB, 0x50, 0xEA, 0x4E, 0x87, 0xD3, 0x88,
+0x86, 0x1D, 0xC6, 0x1E, 0xB0, 0xB2, 0xD8, 0xB5, 0xC2, 0x34, 0xD4, 0xCA, 0xF4, 0x0B, 0x9A, 0xE8,
+0xB6, 0xDE, 0x91, 0xC8, 0x4D, 0x4E, 0x4A, 0x6A, 0x4B, 0x5A, 0x29, 0x5B, 0xF8, 0x85, 0x52, 0x79,
+0x7D, 0x39, 0x19, 0x88, 0x4E, 0x60, 0x7A, 0x7D, 0x2D, 0x81, 0x58, 0x66, 0xDD, 0xAD, 0x94, 0x5F,
+0xAE, 0x6C, 0xE3, 0x10, 0x2E, 0x56, 0x53, 0x4E, 0x3C, 0xAD, 0xB1, 0x79, 0xD1, 0x3A, 0x24, 0x67,
+0x11, 0x11, 0x28, 0xA7, 0x53, 0x4B, 0x36, 0xAB, 0x96, 0x64, 0xA5, 0xFA, 0x96, 0xE9, 0xAD, 0x15,
+0x54, 0x02, 0xE3, 0x64, 0x2E, 0x1B, 0xB9, 0xBA, 0x84, 0x6C, 0x69, 0x32, 0x5D, 0xE5, 0x5D, 0x76,
+0xFF, 0x45, 0x88, 0xDD, 0x72, 0xF3, 0xE6, 0x86, 0xC6, 0xCA, 0xEF, 0x55, 0xFB, 0xD7, 0x48, 0x97,
+0xDF, 0xB3, 0xB6, 0x49, 0x89, 0x9C, 0x19, 0xB1, 0xE3, 0xD0, 0x2D, 0x3F, 0x30, 0x8B, 0xCE, 0xFD,
+0xC5, 0x07, 0xAC, 0x06, 0x93, 0xEC, 0x1E, 0x32, 0x73, 0xF8, 0xC3, 0x69, 0x7E, 0x46, 0xFE, 0x6E,
+0xE8, 0xEB, 0x0E, 0xEB, 0x7A, 0xBA, 0x02, 0xF7, 0x8D, 0x2D, 0x47, 0x41, 0xA0, 0x20, 0x50, 0x10,
+0xB8, 0x13, 0x11, 0x28, 0xC4, 0xEE, 0x26, 0x8D, 0xBA, 0xAB, 0x75, 0x63, 0x13, 0x53, 0xE1, 0x35,
+0xF8, 0xD6, 0x1D, 0x3E, 0x7D, 0x21, 0x4C, 0xC3, 0x24, 0xCB, 0x4D, 0xC8, 0x45, 0xD9, 0x69, 0xED,
+0xC4, 0x5F, 0xAA, 0x08, 0xC2, 0xED, 0x32, 0x7D, 0x22, 0xA5, 0x23, 0x89, 0x4B, 0x91, 0xBC, 0x9F,
+0xCB, 0x13, 0xD5, 0x46, 0x56, 0xDC, 0xC9, 0x58, 0xD2, 0x4E, 0xD8, 0x15, 0x52, 0x38, 0xDF, 0x24,
+0x3D, 0xAE, 0xB6, 0x52, 0x60, 0x09, 0x27, 0x7F, 0x53, 0xEA, 0xF2, 0x4C, 0x21, 0x79, 0x9D, 0xF9,
+0x02, 0x9F, 0xA2, 0x62, 0x93, 0x72, 0xE2, 0xF4, 0xC6, 0xFF, 0xE6, 0xEA, 0x5F, 0xAD, 0x0C, 0xA6,
+0xF5, 0xFA, 0x0A, 0x9D, 0x33, 0x53, 0x8B, 0x16, 0x5D, 0x6C, 0x5D, 0x8E, 0x84, 0xD6, 0x93, 0xDC,
+0xBA, 0xD6, 0x53, 0x8F, 0x76, 0x38, 0xA1, 0x55, 0xBD, 0x49, 0xAB, 0xAC, 0x46, 0xD6, 0xE6, 0x2D,
+0x50, 0x92, 0x90, 0x06, 0xA7, 0x52, 0x63, 0xF6, 0x42, 0xDB, 0x6E, 0xE3, 0x66, 0x3B, 0x53, 0xE4,
+0x7D, 0x97, 0xDB, 0x38, 0x70, 0xF9, 0x30, 0x5A, 0x21, 0xF9, 0x23, 0x2A, 0x55, 0x22, 0xDC, 0x89,
+0x68, 0xA6, 0xB6, 0xD6, 0xE3, 0x59, 0xD5, 0xD4, 0xBE, 0xF5, 0x41, 0x92, 0xB3, 0xEE, 0x47, 0x99,
+0x0F, 0x60, 0x1D, 0xD2, 0x55, 0xEF, 0x37, 0x81, 0x8F, 0xB3, 0xB4, 0x89, 0xED, 0x24, 0x2C, 0x3A,
+0x6D, 0xA3, 0x9E, 0x1B, 0xA3, 0x6F, 0x0D, 0x0B, 0xBB, 0x65, 0x9A, 0xD7, 0x35, 0xF7, 0xD2, 0x5E,
+0xE5, 0x3F, 0x30, 0x92, 0x46, 0x57, 0xC7, 0x55, 0x33, 0x1B, 0xAF, 0x85, 0xEA, 0xB6, 0x8A, 0xD5,
+0x7A, 0x3D, 0x95, 0xBA, 0x56, 0x38, 0x38, 0x88, 0x7F, 0x1D, 0x4E, 0xEC, 0xD9, 0xB4, 0xAE, 0xF8,
+0xD7, 0x55, 0xBF, 0x2E, 0xCA, 0xAB, 0x82, 0x40, 0x41, 0xE0, 0x0E, 0x43, 0xA0, 0x10, 0xBB, 0x9B,
+0x38, 0xE0, 0x8C, 0x7A, 0x3D, 0x8F, 0x48, 0x58, 0xFA, 0xD5, 0x5D, 0xBE, 0x3E, 0x22, 0x8B, 0x4D,
+0x9B, 0x90, 0xBA, 0x76, 0x7D, 0xAC, 0xE8, 0x58, 0x4C, 0xFA, 0x20, 0xF1, 0xA8, 0x30, 0xC3, 0xC6,
+0x6B, 0x6D, 0x48, 0x4D, 0xB1, 0x55, 0x7C, 0x99, 0x5A, 0x17, 0x53, 0x66, 0xAA, 0x8B, 0x77, 0x9D,
+0x4A, 0x16, 0x11, 0xA4, 0x12, 0xB1, 0x59, 0xA6, 0x91, 0x78, 0xBB, 0x12, 0x58, 0x50, 0xB9, 0x45,
+0xE3, 0x2A, 0x4D, 0x3D, 0xD2, 0x54, 0xAF, 0xCB, 0xB1, 0x35, 0x35, 0xC4, 0x4E, 0xA9, 0x85, 0x9E,
+0xCC, 0x5B, 0x5C, 0xAF, 0xBC, 0xD7, 0xAB, 0xA9, 0x39, 0xF4, 0xD5, 0x02, 0x22, 0xD8, 0xE0, 0x28,
+0xD6, 0xEB, 0x61, 0xC2, 0xAE, 0x5A, 0x89, 0x26, 0xF5, 0x6D, 0xB0, 0xE2, 0x15, 0x17, 0x4B, 0x2A,
+0x64, 0xDD, 0x5B, 0xD4, 0x39, 0x99, 0x4E, 0x39, 0xCD, 0x33, 0x2C, 0x2A, 0x65, 0xEB, 0x21, 0x53,
+0xA7, 0x87, 0x36, 0x09, 0x48, 0xEA, 0x5A, 0xA0, 0xD6, 0xD1, 0xBF, 0x8E, 0xC4, 0x6E, 0xDF, 0xD6,
+0x0D, 0x25, 0x31, 0xF1, 0x8A, 0xC7, 0xB2, 0x5C, 0x50, 0x10, 0x28, 0x08, 0xAC, 0x25, 0x04, 0x0A,
+0xB1, 0xBB, 0x89, 0xA3, 0x39, 0x39, 0x35, 0x13, 0xDE, 0xFF, 0xE8, 0x5C, 0x78, 0xE7, 0xC4, 0xD9,
+0x30, 0x3B, 0x3B, 0xA3, 0x1B, 0x92, 0xC3, 0xA7, 0xAE, 0xA5, 0xAD, 0x0B, 0x77, 0x49, 0x8C, 0x26,
+0xFA, 0x21, 0xD9, 0x12, 0x9F, 0x94, 0x90, 0x85, 0x8D, 0xA9, 0x4B, 0x55, 0xA4, 0x5E, 0xDB, 0xE9,
+0xA0, 0x96, 0x59, 0x38, 0x69, 0x20, 0x3F, 0xCB, 0x16, 0xCC, 0xB4, 0x94, 0x56, 0x17, 0x64, 0x5F,
+0x46, 0x17, 0xA3, 0x44, 0xD5, 0x25, 0x38, 0xB5, 0x2F, 0xF9, 0x64, 0x25, 0x0D, 0xC9, 0xEB, 0x48,
+0x75, 0xA9, 0xCE, 0xA3, 0x75, 0xA8, 0xF4, 0x53, 0x4D, 0xF9, 0x91, 0xF4, 0x22, 0xC5, 0xC0, 0xFE,
+0x75, 0x7F, 0xB5, 0x84, 0x5A, 0x12, 0xC0, 0x8C, 0xD7, 0x5A, 0xC6, 0x3C, 0xBB, 0x46, 0x3B, 0x2D,
+0x77, 0x73, 0x49, 0xD4, 0x9A, 0xAA, 0x77, 0xD0, 0x76, 0x68, 0x5F, 0x8D, 0x19, 0x8A, 0x4F, 0x18,
+0xFD, 0xD0, 0xD8, 0x2C, 0x9E, 0xD3, 0x36, 0xE6, 0xFA, 0x50, 0x3E, 0x1A, 0x5A, 0x43, 0x26, 0xC4,
+0xB1, 0x1D, 0xE2, 0x53, 0x66, 0xF5, 0x7A, 0x54, 0x6C, 0x2D, 0x97, 0xB2, 0x8B, 0xB4, 0x6D, 0xDE,
+0x16, 0xBD, 0x53, 0x34, 0xA3, 0xB3, 0xED, 0xF1, 0x3A, 0xBB, 0x93, 0xD4, 0xAF, 0x83, 0xE8, 0x7B,
+0x9D, 0xA6, 0x36, 0x24, 0xDC, 0x6A, 0xF9, 0x53, 0x22, 0xAC, 0x7E, 0x5D, 0xCD, 0x24, 0x88, 0x28,
+0x38, 0x32, 0x69, 0x8C, 0xBC, 0xBF, 0xDA, 0x64, 0xCF, 0xB0, 0x98, 0xCD, 0x8C, 0x08, 0x00, 0xF3,
+0xE0, 0xB1, 0xCD, 0x49, 0x6D, 0xAE, 0xD5, 0x4D, 0x3D, 0x1A, 0x76, 0xE1, 0xBC, 0xF2, 0xF9, 0x57,
+0x63, 0x7E, 0xCF, 0xC6, 0x2B, 0xE3, 0xBF, 0x15, 0x3F, 0x4E, 0xFF, 0x0C, 0xE9, 0xBD, 0xD9, 0x48,
+0x44, 0x9A, 0xF3, 0x73, 0x86, 0xC7, 0x1C, 0x5C, 0x20, 0x98, 0xF2, 0xE4, 0xAE, 0xED, 0x9B, 0x42,
+0x57, 0x67, 0xC7, 0x4D, 0xFC, 0x54, 0x97, 0xAA, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x27, 0x0B,
+0x81, 0x42, 0xEC, 0x6E, 0xD2, 0x78, 0x91, 0x1C, 0x0C, 0x8E, 0x8C, 0x85, 0xB7, 0xA1, 0xD6, 0x5D,
+0xC0, 0x5E, 0xB0, 0x42, 0xAA, 0xA8, 0xD2, 0xB5, 0x61, 0x91, 0x69, 0xAB, 0x51, 0xEB, 0x1A, 0x52,
+0x51, 0x16, 0xA3, 0x5A, 0xF5, 0x1A, 0x6C, 0x65, 0xF3, 0x4B, 0x96, 0xBC, 0xC7, 0x62, 0xF4, 0x25,
+0xAD, 0xAE, 0x0D, 0x55, 0x55, 0x7B, 0x8F, 0x65, 0x9B, 0xBC, 0x58, 0xA3, 0xEA, 0xD0, 0x93, 0xEC,
+0xD4, 0xE2, 0xF9, 0xDF, 0x6A, 0xAE, 0x5B, 0xB4, 0xCF, 0xB5, 0x0D, 0x23, 0xA9, 0x73, 0x1C, 0xF3,
+0xE7, 0x4E, 0xBC, 0x16, 0x62, 0x9C, 0x08, 0x93, 0xBE, 0x27, 0xAF, 0x8D, 0x81, 0x68, 0xCA, 0x99,
+0x74, 0xCD, 0xC2, 0x66, 0xD4, 0x90, 0xA3, 0xCC, 0x28, 0xE9, 0x5C, 0xAF, 0x42, 0x66, 0xB2, 0xDB,
+0xD7, 0xA6, 0x5C, 0x69, 0x68, 0xEA, 0xC4, 0xEB, 0x17, 0xC7, 0x3B, 0xB5, 0x68, 0xF1, 0x1A, 0x97,
+0x99, 0x25, 0x15, 0x90, 0xBC, 0x96, 0xA5, 0x72, 0xC7, 0xA5, 0x7B, 0x56, 0xE7, 0xAB, 0x5F, 0xA3,
+0x67, 0x95, 0xDC, 0xE7, 0xCE, 0x0A, 0x71, 0xB0, 0x16, 0xCC, 0x2F, 0xFE, 0xB8, 0x99, 0xC6, 0x6E,
+0x13, 0x7C, 0xCC, 0x85, 0x3E, 0x24, 0x26, 0xDE, 0xBA, 0x0E, 0x7B, 0xC4, 0xC2, 0xFD, 0xA1, 0x1C,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x4E, 0x45, 0xA0, 0x7C, 0x03, 0xDE, 0x84, 0x91, 0xE7, 0xC2,
+0x3E, 0x8B, 0x3C, 0x75, 0x34, 0xC3, 0xBE, 0xF2, 0xC1, 0xF1, 0x30, 0x83, 0x6D, 0xC4, 0xC4, 0x02,
+0xDB, 0xD1, 0x2D, 0x8F, 0xCA, 0x22, 0x45, 0x25, 0xC6, 0xCE, 0xE8, 0x62, 0xE8, 0xD1, 0x85, 0xAE,
+0xC7, 0x78, 0x83, 0x5C, 0x1E, 0x31, 0xE5, 0xCD, 0x5F, 0x1A, 0x03, 0xC8, 0xF7, 0x63, 0xF5, 0xE8,
+0x4C, 0x51, 0x9F, 0x58, 0xA3, 0x28, 0x50, 0x4E, 0x15, 0xD4, 0x1B, 0x2A, 0xD5, 0x1E, 0x97, 0xE0,
+0xCA, 0x12, 0x9A, 0x2F, 0xE2, 0xE2, 0x9F, 0x97, 0x71, 0x95, 0x8A, 0xB6, 0x12, 0x9B, 0xA5, 0xF5,
+0x44, 0xC2, 0xE3, 0xF7, 0xAC, 0x10, 0x32, 0x36, 0x48, 0x55, 0x3A, 0xDF, 0xC4, 0x21, 0x11, 0x95,
+0x2A, 0xA1, 0xA8, 0xBC, 0x8A, 0x17, 0xE8, 0x0D, 0xA2, 0x08, 0x87, 0xF3, 0x82, 0x16, 0xCF, 0x65,
+0xE3, 0x96, 0x93, 0x8A, 0xBC, 0x1E, 0x51, 0xC1, 0x32, 0xC5, 0x4B, 0x25, 0x37, 0xC7, 0x62, 0x69,
+0x8A, 0xE4, 0x63, 0xE3, 0xDA, 0x95, 0x6B, 0x79, 0xAE, 0x54, 0xBA, 0x6A, 0xA4, 0x4A, 0x1B, 0xFD,
+0x1C, 0x93, 0x79, 0xD5, 0x6E, 0x93, 0x02, 0x65, 0xDD, 0x23, 0x4F, 0x06, 0xC1, 0x46, 0xDF, 0x6E,
+0xEF, 0x70, 0xA6, 0x39, 0xA1, 0x67, 0x74, 0xF4, 0x5C, 0xD7, 0x5B, 0x88, 0x55, 0x1A, 0x45, 0x1F,
+0x05, 0xBF, 0xC2, 0x90, 0x89, 0xCC, 0x35, 0xDF, 0x35, 0x23, 0x81, 0x96, 0xB7, 0x51, 0xD5, 0xCA,
+0x85, 0x87, 0x63, 0xAC, 0x7D, 0xB6, 0x36, 0x59, 0x83, 0x75, 0x88, 0x6A, 0x33, 0x1C, 0x26, 0x2F,
+0x01, 0x1F, 0xEF, 0x38, 0x3F, 0x6A, 0xE9, 0x1A, 0xC7, 0x52, 0xA7, 0x47, 0xF4, 0x2C, 0xC8, 0xB4,
+0xDD, 0xA4, 0xC4, 0xDA, 0x67, 0x44, 0x30, 0x89, 0x0D, 0xB2, 0x79, 0x31, 0x3F, 0x8B, 0x78, 0x09,
+0xA8, 0x75, 0xB3, 0x20, 0x76, 0x78, 0x7F, 0x73, 0x7F, 0x0F, 0xD4, 0x3A, 0xFD, 0x11, 0xE5, 0x2A,
+0xE7, 0x4D, 0xF8, 0x78, 0x97, 0x2A, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x27, 0x0A, 0x81, 0x42,
+0xEC, 0x6E, 0xD2, 0x70, 0x4D, 0x60, 0xBB, 0xB0, 0xB7, 0x8F, 0x9D, 0x96, 0x88, 0x58, 0xFA, 0xFB,
+0xB4, 0x40, 0xA9, 0x6B, 0x69, 0xEB, 0x24, 0xBB, 0xB3, 0x25, 0x6D, 0xE9, 0x1B, 0xD5, 0xD2, 0xBA,
+0x4A, 0xE9, 0x7C, 0x75, 0x34, 0xF3, 0xDC, 0xF2, 0xB5, 0x25, 0x62, 0x27, 0x0B, 0xDD, 0xB2, 0xFD,
+0xCC, 0x6F, 0xB2, 0x6C, 0x61, 0x5D, 0x59, 0x97, 0x20, 0x03, 0x0B, 0xEE, 0x29, 0xC5, 0x17, 0x61,
+0x10, 0xB5, 0xF5, 0x2C, 0xC9, 0xB9, 0x1A, 0xD7, 0x91, 0x1C, 0x81, 0xBC, 0x7A, 0x25, 0x96, 0xF9,
+0x0D, 0xEA, 0x23, 0x93, 0x4A, 0x24, 0x1C, 0xE3, 0x39, 0x3B, 0x95, 0xD7, 0x5F, 0x45, 0x3B, 0x27,
+0xBC, 0x8B, 0x21, 0xB5, 0x3C, 0xC6, 0xF5, 0xDA, 0x9F, 0xAE, 0x4A, 0xED, 0xD6, 0x72, 0xB5, 0xA5,
+0x8D, 0x81, 0xD5, 0xED, 0x5E, 0xF5, 0xE4, 0xD2, 0x14, 0x57, 0xEF, 0xA8, 0xF3, 0x33, 0xA7, 0xF8,
+0x4E, 0x45, 0x97, 0x9F, 0x59, 0xCB, 0xF7, 0xB4, 0x91, 0x12, 0xD5, 0x84, 0x28, 0x72, 0x77, 0x90,
+0x3A, 0xD8, 0x60, 0xE1, 0xF6, 0x80, 0xCF, 0x1B, 0x5E, 0xEF, 0xDA, 0xB4, 0x3E, 0x74, 0x17, 0x33,
+0x6C, 0x23, 0x60, 0x96, 0x32, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x46, 0xA0, 0x10, 0xBB, 0x8F, 0x39,
+0xB8, 0xAE, 0x08, 0x0D, 0x8E, 0x8E, 0x87, 0x1F, 0xBC, 0xF6, 0x5E, 0x18, 0xC7, 0x8E, 0x13, 0x5C,
+0x02, 0xDB, 0xA0, 0xD4, 0xB5, 0xC0, 0x14, 0x2B, 0x8B, 0xA1, 0xCB, 0x32, 0x76, 0x2F, 0x5F, 0x82,
+0x5D, 0x09, 0xD1, 0x25, 0x53, 0x0B, 0xC9, 0x32, 0x89, 0x02, 0x8B, 0x52, 0x0F, 0x09, 0x9C, 0x50,
+0x82, 0xA4, 0x65, 0x6C, 0xB1, 0x35, 0xF5, 0xC3, 0x4E, 0x99, 0xEF, 0x97, 0x2F, 0xBE, 0x4E, 0xEC,
+0xF2, 0x5A, 0xF5, 0x79, 0x6C, 0x8B, 0xB5, 0x4D, 0xDA, 0x5B, 0xC3, 0x32, 0x2B, 0x4B, 0x6A, 0xF6,
+0x9E, 0x5E, 0xCB, 0xF2, 0x9E, 0xD3, 0x2D, 0xA9, 0x30, 0x6E, 0xAB, 0xA4, 0x1F, 0x96, 0x2E, 0xFD,
+0x1E, 0x47, 0xE9, 0x6D, 0xC8, 0x09, 0x41, 0x0D, 0x40, 0x99, 0xBE, 0x68, 0xB0, 0xC4, 0x86, 0xCA,
+0xED, 0xEB, 0x39, 0x0F, 0x8A, 0xBF, 0xD7, 0xC2, 0x6C, 0x68, 0xBE, 0x5F, 0xAA, 0xB4, 0x31, 0x23,
+0x28, 0x3E, 0xEC, 0x4E, 0x58, 0x1C, 0x0C, 0x29, 0xEF, 0x4A, 0x94, 0xC0, 0x6C, 0x18, 0x66, 0x4D,
+0x14, 0x75, 0x4E, 0x14, 0x2B, 0x53, 0x5F, 0x59, 0x9E, 0xCF, 0xED, 0xA1, 0xE2, 0xA5, 0xFA, 0xA8,
+0x89, 0xE6, 0x96, 0xED, 0x98, 0xE1, 0x03, 0xAB, 0x6A, 0x62, 0xC2, 0x5F, 0x10, 0x32, 0x9F, 0x3F,
+0x51, 0x29, 0x6D, 0x64, 0xBD, 0x57, 0xAE, 0x6C, 0xB9, 0xC4, 0x15, 0xD1, 0x63, 0x59, 0xC1, 0x38,
+0x23, 0x7A, 0x52, 0x71, 0x1A, 0xC7, 0xAA, 0xC2, 0xA9, 0x2A, 0xA0, 0xB4, 0x4D, 0x8B, 0xC5, 0x7E,
+0xD4, 0x25, 0x78, 0xD6, 0x46, 0xBF, 0x87, 0xAA, 0xC1, 0x46, 0xF2, 0x5C, 0x72, 0x93, 0x69, 0x68,
+0x73, 0x72, 0xA9, 0xB9, 0x6B, 0x93, 0x53, 0x66, 0xAC, 0x49, 0xC2, 0x79, 0xD4, 0xAD, 0x23, 0xA6,
+0x63, 0x93, 0xB5, 0xC6, 0xB0, 0xF2, 0x1E, 0xC6, 0x99, 0x0B, 0x13, 0xEC, 0xDC, 0xEC, 0x5C, 0x98,
+0x85, 0x7F, 0x5D, 0x2B, 0xEA, 0x3B, 0xB8, 0x73, 0x33, 0x88, 0xDD, 0x4A, 0x83, 0x94, 0x3E, 0xE6,
+0x17, 0x40, 0xB9, 0xBC, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x66, 0x08, 0x14, 0x62, 0x77, 0x13,
+0x06, 0x64, 0x0A, 0xA6, 0xD7, 0xE3, 0x67, 0x2E, 0x86, 0x0F, 0x4E, 0x9E, 0x95, 0x14, 0x27, 0x2D,
+0x48, 0x8E, 0xDA, 0xDA, 0x8E, 0xF4, 0x26, 0xAD, 0x0D, 0xC2, 0x6B, 0x44, 0x65, 0x45, 0xDA, 0x47,
+0x0D, 0xF9, 0x8A, 0xC4, 0xC4, 0x99, 0x5D, 0xBD, 0x7E, 0xC9, 0x0D, 0x6C, 0xFB, 0x27, 0x27, 0x88,
+0xF1, 0x2F, 0xDA, 0xEA, 0xCF, 0x65, 0xE5, 0xD6, 0x72, 0xF1, 0x5C, 0xF6, 0x3C, 0x3F, 0x1F, 0x4D,
+0x5E, 0xB6, 0xD8, 0x6B, 0x3A, 0x95, 0x74, 0x8F, 0x4A, 0xDA, 0x15, 0xB1, 0x4F, 0x2F, 0xF6, 0x9E,
+0x92, 0x83, 0xBC, 0x7C, 0x7C, 0xEE, 0xC4, 0x57, 0xDA, 0xA0, 0xE9, 0x63, 0x16, 0xD4, 0x2B, 0xEF,
+0x19, 0xC9, 0x59, 0x50, 0x8F, 0x12, 0x11, 0xEF, 0x8B, 0x5E, 0x6B, 0x69, 0x68, 0xF2, 0xB2, 0xD6,
+0xEE, 0xFA, 0x18, 0xA1, 0x7C, 0x0D, 0x76, 0xD6, 0x53, 0x6B, 0x5D, 0x7A, 0x95, 0xB0, 0x33, 0xCA,
+0xEE, 0xC4, 0xCB, 0xCD, 0xB0, 0x19, 0xCE, 0x95, 0xBE, 0x48, 0xFD, 0xD5, 0x31, 0x6A, 0x61, 0x04,
+0x4E, 0xCD, 0x75, 0x8E, 0xBF, 0x5F, 0x9B, 0xF7, 0xCB, 0xCB, 0xC6, 0x7A, 0xBC, 0x4F, 0xF9, 0x78,
+0x66, 0xE7, 0x88, 0x67, 0xBD, 0x31, 0xAE, 0x9D, 0x0B, 0x8B, 0xBD, 0x16, 0x92, 0x95, 0xF5, 0x47,
+0x88, 0xF0, 0xB2, 0x75, 0xCA, 0x34, 0xD4, 0x7F, 0x84, 0x90, 0xDB, 0x5F, 0x1B, 0x43, 0xE7, 0xD2,
+0xC9, 0x06, 0x6F, 0xE4, 0xDA, 0xE6, 0xB4, 0x07, 0xE2, 0xC0, 0xE7, 0x01, 0xC4, 0x0E, 0xA6, 0x58,
+0x7C, 0x7E, 0xBA, 0xE0, 0xC7, 0xBA, 0x7B, 0xCB, 0x86, 0xD0, 0x89, 0xAD, 0xC4, 0xCA, 0x51, 0x10,
+0x28, 0x08, 0x14, 0x04, 0xEE, 0x64, 0x04, 0x1A, 0x64, 0x1E, 0x77, 0x32, 0x44, 0x4B, 0xF7, 0x9D,
+0x8B, 0xEB, 0xC8, 0xF8, 0x44, 0x78, 0xE9, 0xDD, 0x23, 0x61, 0x08, 0xAA, 0x1D, 0x17, 0x2B, 0x51,
+0xEB, 0x2C, 0x60, 0x22, 0x7A, 0xB8, 0x65, 0x8A, 0x4F, 0xAE, 0xB6, 0x24, 0x75, 0x26, 0x53, 0x6F,
+0x94, 0xA3, 0x38, 0x57, 0xAB, 0x6F, 0xF4, 0xCC, 0x0A, 0xE4, 0x84, 0x50, 0x9F, 0x93, 0x20, 0x24,
+0xF5, 0x8F, 0x95, 0xE9, 0x02, 0xAC, 0x8B, 0xB8, 0x92, 0x1A, 0xEC, 0xAA, 0x69, 0x7F, 0xF5, 0x35,
+0x72, 0xEC, 0x91, 0x88, 0x4A, 0x14, 0xAF, 0xFD, 0xE5, 0x73, 0x9C, 0x4B, 0x44, 0x88, 0x65, 0x98,
+0x8B, 0xCF, 0xCA, 0x4B, 0x8E, 0x3E, 0x96, 0xE1, 0xDE, 0xB7, 0x78, 0xD8, 0x5F, 0xAF, 0x47, 0xCE,
+0xC9, 0xFD, 0xF4, 0xBA, 0x56, 0x2E, 0xDC, 0x20, 0xBD, 0x3C, 0x2F, 0xF5, 0x56, 0x1E, 0x3C, 0x87,
+0xB2, 0xAC, 0xBF, 0xF6, 0xC1, 0x5D, 0x04, 0xE4, 0xD1, 0x8A, 0xCB, 0xED, 0x79, 0x56, 0x46, 0xCE,
+0xB1, 0xFE, 0xFC, 0x3A, 0xDC, 0x8B, 0xF7, 0x8B, 0x75, 0x91, 0x6C, 0xB3, 0x8C, 0x94, 0x65, 0x1F,
+0xB3, 0x6B, 0xEC, 0xB9, 0xDE, 0x43, 0xCB, 0xB4, 0x4A, 0xCE, 0x41, 0xDC, 0x2F, 0x5E, 0xD3, 0x86,
+0x7B, 0xA7, 0xFA, 0x2A, 0xED, 0x88, 0xED, 0xD3, 0xEB, 0x79, 0x4D, 0xFE, 0x37, 0xF6, 0x5F, 0xEA,
+0x42, 0xBB, 0x70, 0x7F, 0xB6, 0xA5, 0x8D, 0xF8, 0xF1, 0xB9, 0xFC, 0xE5, 0x7B, 0x86, 0x49, 0xDE,
+0x46, 0x69, 0xB7, 0x8E, 0x89, 0x96, 0xB5, 0xF6, 0x3B, 0xAE, 0x91, 0xE8, 0xDA, 0x98, 0xF8, 0x98,
+0x59, 0x3F, 0x1C, 0x63, 0x1D, 0xFB, 0x44, 0x8A, 0x75, 0xBC, 0x88, 0x91, 0xD7, 0xE7, 0x63, 0x6D,
+0x63, 0x5A, 0x3B, 0xC6, 0x46, 0xDE, 0xD8, 0x17, 0xD9, 0x3D, 0xC5, 0xE7, 0x91, 0xE5, 0x69, 0xD4,
+0x5C, 0x8D, 0x5E, 0xBF, 0x8E, 0xBB, 0x90, 0xB6, 0x78, 0x5D, 0xF6, 0x23, 0x01, 0x99, 0xE7, 0x7C,
+0x6E, 0x24, 0x12, 0x5C, 0xFF, 0x07, 0x47, 0xBC, 0x1E, 0x6D, 0x75, 0x02, 0xE8, 0xAA, 0xEA, 0xDC,
+0xF4, 0xA4, 0xA4, 0x14, 0xE2, 0xE4, 0xEE, 0xEB, 0xEE, 0x0C, 0x9B, 0xD7, 0xF5, 0x87, 0xF6, 0xB2,
+0xE3, 0x44, 0xF9, 0xB2, 0x2E, 0x08, 0x14, 0x04, 0xEE, 0x70, 0x04, 0x60, 0x59, 0xC9, 0xED, 0x5A,
+0x77, 0x38, 0x1A, 0x37, 0xD0, 0x7D, 0xAA, 0x05, 0x27, 0xA0, 0xD6, 0xFD, 0x3F, 0xFE, 0xA7, 0x3F,
+0x0A, 0xCF, 0xBD, 0xF5, 0x81, 0xEC, 0x30, 0xD1, 0xBB, 0x7E, 0x73, 0xE8, 0xE8, 0x19, 0x10, 0x82,
+0x25, 0xC2, 0x9A, 0x90, 0x2C, 0x72, 0x68, 0x55, 0xAC, 0xC4, 0x11, 0x9D, 0x8B, 0xB4, 0xD3, 0x37,
+0x5F, 0x04, 0xFD, 0xBC, 0x2B, 0x34, 0xB8, 0x62, 0x8E, 0xCF, 0x61, 0x2F, 0x6B, 0x93, 0x4C, 0xFA,
+0x26, 0xD3, 0xD9, 0xFB, 0xF3, 0x24, 0x42, 0xB4, 0xA5, 0xD9, 0x7B, 0xF3, 0xF3, 0x24, 0x0C, 0xAE,
+0x98, 0xB8, 0xA4, 0xA7, 0x8B, 0xAB, 0x10, 0x3E, 0x61, 0x77, 0xD8, 0x7A, 0x49, 0x98, 0x1E, 0x9D,
+0xD1, 0xF5, 0x7A, 0xBB, 0x85, 0x12, 0x49, 0x57, 0x76, 0x5C, 0xE1, 0xB2, 0x36, 0x92, 0xE4, 0xC4,
+0x83, 0xEB, 0xB2, 0x5D, 0xE7, 0xC2, 0x8B, 0x10, 0x5A, 0x21, 0x8F, 0x99, 0x51, 0xD0, 0x08, 0xAA,
+0x10, 0x3A, 0xDC, 0x55, 0xBA, 0xCE, 0x7E, 0x4B, 0x3B, 0x34, 0xD5, 0x88, 0x5C, 0xC2, 0xD7, 0x52,
+0x27, 0xB9, 0x01, 0x51, 0xA1, 0xA9, 0x8E, 0x24, 0xC1, 0xDE, 0x8F, 0x37, 0x46, 0x1D, 0xD2, 0x57,
+0xBD, 0x87, 0xE3, 0xAA, 0xE5, 0xCC, 0x68, 0x6A, 0x17, 0xB9, 0x37, 0x98, 0x10, 0x1B, 0xE9, 0x38,
+0xEE, 0xEB, 0x20, 0x48, 0xBB, 0xBC, 0x72, 0xAB, 0x4B, 0xEE, 0xE9, 0x8A, 0x19, 0xEE, 0x63, 0x89,
+0x8A, 0x45, 0x31, 0x33, 0xEC, 0xA4, 0x1E, 0xE9, 0x04, 0xFF, 0x98, 0xA9, 0x53, 0x3A, 0xE0, 0xD8,
+0xA6, 0xF6, 0x4A, 0xD2, 0x68, 0x04, 0xD4, 0xE8, 0xF8, 0xA9, 0xD9, 0x55, 0x61, 0x27, 0xFE, 0x76,
+0xB8, 0xD9, 0x92, 0x45, 0x6D, 0x4C, 0xF8, 0x07, 0x97, 0x69, 0x95, 0x56, 0x50, 0x4C, 0x94, 0x52,
+0x56, 0x53, 0xA4, 0x70, 0xCE, 0xC9, 0x7B, 0x56, 0x6F, 0xEE, 0x75, 0x28, 0xA7, 0xC5, 0x0C, 0x6C,
+0x63, 0x6C, 0xF5, 0xF8, 0x3D, 0xA3, 0x8B, 0x26, 0xDA, 0xC7, 0x7A, 0xB4, 0x3E, 0xEB, 0x62, 0xD6,
+0x1E, 0xAF, 0x53, 0xEB, 0xE3, 0xAD, 0xB8, 0xBB, 0x03, 0x9F, 0xA3, 0xBC, 0x01, 0x22, 0x79, 0xF2,
+0xC4, 0xCC, 0x9C, 0xB7, 0xD5, 0xA6, 0x99, 0x35, 0x70, 0x0E, 0xFD, 0x75, 0xBF, 0xC6, 0x68, 0x42,
+0x97, 0xFE, 0xF2, 0xD2, 0xAC, 0x13, 0xAC, 0x07, 0x0D, 0xD1, 0xA9, 0x62, 0x15, 0xF2, 0x05, 0xA2,
+0x5D, 0xD5, 0x44, 0x9D, 0x1A, 0x27, 0x6F, 0x83, 0xD4, 0x85, 0xE1, 0x0B, 0x30, 0xC3, 0x4E, 0x4B,
+0x7A, 0x93, 0xC7, 0x0F, 0xED, 0x0D, 0xFF, 0xC5, 0x6F, 0x7E, 0x3D, 0xEC, 0x82, 0x6A, 0x57, 0x8E,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0x27, 0x23, 0x50, 0x88, 0xDD, 0xC7, 0x18, 0x7D, 0x2E, 0x38,
+0x4C, 0x4A, 0xFC, 0xCA, 0x7B, 0xC7, 0xC2, 0x7F, 0xF1, 0x2F, 0x7E, 0x37, 0x9C, 0xBE, 0x70, 0x35,
+0xB4, 0x77, 0xF7, 0x84, 0x9E, 0x0D, 0x5B, 0xA1, 0xDA, 0x21, 0x77, 0x5D, 0xB6, 0x30, 0xB7, 0x66,
+0xE6, 0x29, 0x59, 0xA8, 0x4C, 0xDD, 0x30, 0xE6, 0xA7, 0x0A, 0x87, 0x11, 0x3B, 0x35, 0x1B, 0x72,
+0xE5, 0x63, 0x5E, 0x7D, 0x5D, 0xC0, 0xDB, 0x44, 0x4D, 0x73, 0x76, 0x00, 0x52, 0xE1, 0x04, 0xC7,
+0x98, 0x95, 0xE4, 0x14, 0xC3, 0x42, 0x4B, 0xE2, 0xA3, 0xAA, 0x1A, 0xAF, 0x57, 0x92, 0x27, 0x0B,
+0x21, 0x02, 0x3A, 0xC2, 0xEC, 0x14, 0x7C, 0xCD, 0x61, 0xBE, 0xE2, 0x62, 0x09, 0x13, 0x16, 0xF7,
+0xD6, 0x54, 0x03, 0xA2, 0xD3, 0x3D, 0x2C, 0xDA, 0xBC, 0x44, 0xAE, 0x73, 0xC6, 0xA2, 0xEF, 0x3B,
+0x39, 0x94, 0x57, 0xB2, 0xDD, 0xAD, 0x13, 0x22, 0xBC, 0x49, 0xCE, 0xA7, 0xBC, 0x48, 0x48, 0x9B,
+0x90, 0x58, 0xE5, 0x5F, 0x46, 0xDA, 0x14, 0x08, 0x29, 0x26, 0xC4, 0x4E, 0x89, 0x87, 0x53, 0x45,
+0xA9, 0x5F, 0xBA, 0x67, 0xB8, 0x68, 0x75, 0x5A, 0x5E, 0x6F, 0xE7, 0x54, 0x42, 0x55, 0xBF, 0x48,
+0x36, 0x9D, 0xE0, 0x29, 0x48, 0xDA, 0xFF, 0x6C, 0x40, 0x51, 0x1F, 0x89, 0xA2, 0xF2, 0x44, 0xA7,
+0x72, 0x8A, 0xA1, 0xE4, 0x01, 0xB4, 0xFF, 0xF4, 0x5E, 0xEE, 0x27, 0xC8, 0x17, 0x24, 0x76, 0x54,
+0x34, 0xED, 0x1C, 0x6B, 0x47, 0x21, 0x96, 0x11, 0x7F, 0x49, 0xE9, 0x27, 0xDF, 0xB7, 0x86, 0x7A,
+0x3F, 0xF3, 0xB9, 0x24, 0xC4, 0xC9, 0x9A, 0x1A, 0xE7, 0x81, 0xF6, 0x2B, 0x4F, 0x61, 0x22, 0x04,
+0x47, 0xF0, 0x4F, 0x75, 0x09, 0x81, 0x92, 0x72, 0x4A, 0x7C, 0x94, 0xF4, 0xD9, 0x85, 0x42, 0xAC,
+0x52, 0x85, 0x4E, 0x02, 0xFD, 0xD6, 0x46, 0x95, 0x12, 0x79, 0xB4, 0x7A, 0xFD, 0x7C, 0xBA, 0xD4,
+0x88, 0x9A, 0x5C, 0x28, 0x83, 0x1D, 0x7D, 0xFE, 0x0C, 0xCD, 0xD4, 0x9B, 0x7A, 0xC4, 0xCD, 0x9A,
+0xEB, 0x6D, 0xD5, 0xC2, 0x89, 0x0E, 0xCA, 0x0F, 0x0E, 0xB6, 0x5D, 0xC8, 0x63, 0x4E, 0xF6, 0x32,
+0x1E, 0x2C, 0xEF, 0x39, 0x89, 0xD3, 0xFB, 0x4B, 0x4B, 0x9C, 0xF0, 0xD9, 0x95, 0xD1, 0xE7, 0xD1,
+0xEF, 0xC1, 0xCE, 0xCC, 0x4C, 0x84, 0xB9, 0xB1, 0xC1, 0x30, 0x39, 0x35, 0x15, 0xB6, 0xAC, 0x1F,
+0x08, 0x3F, 0xFF, 0xE9, 0x47, 0xC2, 0x3F, 0xFA, 0xFA, 0xE7, 0xC3, 0x26, 0xA4, 0x3B, 0x29, 0x11,
+0xB1, 0xF9, 0x44, 0x2C, 0xCF, 0x0B, 0x02, 0x05, 0x81, 0x3B, 0x0D, 0x81, 0x42, 0xEC, 0x3E, 0xC6,
+0x88, 0x73, 0xC1, 0xA1, 0x19, 0xF6, 0x8F, 0xBF, 0xFF, 0x72, 0xF8, 0x6F, 0xFE, 0xDD, 0x37, 0xC2,
+0x38, 0x22, 0x63, 0xBB, 0xFB, 0xD6, 0x87, 0xAE, 0x75, 0x1B, 0xC5, 0x2C, 0x19, 0xA9, 0x84, 0x13,
+0x8C, 0x4C, 0x99, 0x5B, 0x92, 0xD8, 0x39, 0x9B, 0xA9, 0x10, 0xBB, 0x8C, 0x6C, 0x71, 0x71, 0xD7,
+0xEC, 0xC7, 0x20, 0x2E, 0x4E, 0x54, 0x7C, 0x1F, 0x5A, 0x9E, 0xE7, 0xA2, 0xCD, 0x07, 0x17, 0x56,
+0x92, 0x38, 0x3E, 0xE8, 0x8F, 0x84, 0x7D, 0x6B, 0xA7, 0xA7, 0x91, 0x9A, 0x05, 0xEF, 0x45, 0x62,
+0xE7, 0xC4, 0x42, 0xC9, 0x82, 0x0A, 0x55, 0x76, 0xAF, 0x98, 0x5F, 0x82, 0x6B, 0xBF, 0x2E, 0xFE,
+0xF2, 0xAF, 0x10, 0x3B, 0x65, 0x73, 0x4E, 0xBE, 0xFC, 0x3D, 0x0D, 0x28, 0xB0, 0xEB, 0x6D, 0x45,
+0x27, 0xA7, 0x55, 0x62, 0x44, 0x02, 0x47, 0x95, 0x50, 0xDB, 0xAC, 0x35, 0x2A, 0xD1, 0x11, 0x62,
+0xA7, 0x0C, 0x2C, 0x8E, 0x88, 0x94, 0x33, 0x8E, 0x28, 0x6D, 0xD3, 0x5B, 0xCB, 0xBF, 0xA4, 0x10,
+0x42, 0xF2, 0x22, 0xB9, 0xD2, 0x4A, 0xE2, 0x86, 0xF1, 0x42, 0x86, 0x94, 0xD8, 0x49, 0x35, 0xCA,
+0xEF, 0xE4, 0x1E, 0xA2, 0x34, 0x19, 0x6E, 0x6C, 0x85, 0xD4, 0x2B, 0xAA, 0x50, 0x46, 0xA0, 0xBC,
+0x0F, 0xA9, 0x35, 0x4E, 0x7F, 0x94, 0xB0, 0x7A, 0xEB, 0x23, 0x03, 0x8D, 0xE8, 0xC4, 0x4E, 0xC9,
+0x7D, 0xBC, 0x8F, 0x86, 0xAD, 0xBC, 0x74, 0x96, 0x65, 0xB7, 0xF3, 0x53, 0xD6, 0xC0, 0x98, 0x26,
+0xC5, 0x55, 0xC7, 0x4A, 0xF0, 0x0D, 0xBB, 0x29, 0xD5, 0x26, 0x32, 0x56, 0x73, 0x67, 0x21, 0x89,
+0x46, 0xFD, 0x22, 0xC6, 0x7E, 0x0F, 0x6F, 0x51, 0x54, 0xEB, 0x48, 0x5E, 0xB3, 0x76, 0xFA, 0x75,
+0xB5, 0xD7, 0xCB, 0x90, 0xD5, 0xD4, 0xEB, 0xA4, 0xD4, 0xCB, 0x3A, 0xC2, 0xF2, 0xD7, 0x48, 0x5A,
+0x7A, 0x8F, 0xC3, 0xA1, 0xAF, 0x5C, 0x89, 0x8D, 0x32, 0xA6, 0xEA, 0x77, 0x19, 0x56, 0xD9, 0x55,
+0xF1, 0xA9, 0x8E, 0x5E, 0xEC, 0x19, 0xE6, 0xF3, 0xEC, 0xE4, 0x78, 0x18, 0x43, 0xB0, 0xD2, 0x5D,
+0x3B, 0xB6, 0x86, 0xFF, 0xFD, 0xD7, 0xBF, 0x10, 0xBE, 0xF6, 0xCC, 0x23, 0x62, 0x92, 0x2D, 0xC4,
+0x2E, 0x42, 0x59, 0x9E, 0x14, 0x04, 0x0A, 0x02, 0x77, 0x20, 0x02, 0x85, 0xD8, 0x7D, 0xCC, 0x41,
+0x3F, 0x77, 0xF9, 0x7A, 0xF8, 0xAF, 0x7F, 0xEB, 0x4F, 0xC2, 0xB7, 0x5F, 0x7A, 0x5B, 0x08, 0x43,
+0x0F, 0xCD, 0xB0, 0xDD, 0xBD, 0x42, 0x79, 0xE2, 0x8E, 0x01, 0x4E, 0x30, 0x48, 0x07, 0x84, 0x8F,
+0x99, 0x3F, 0x91, 0x2B, 0x31, 0xA6, 0xBE, 0x89, 0x59, 0x8B, 0x26, 0x48, 0x27, 0x1E, 0x42, 0xEC,
+0x94, 0xA0, 0x88, 0x62, 0xE7, 0x8B, 0x1F, 0xAE, 0x77, 0x13, 0xAD, 0x10, 0x3B, 0x51, 0x03, 0xE9,
+0xD7, 0xA4, 0x64, 0x6B, 0x6E, 0x72, 0x14, 0x0F, 0x28, 0x1A, 0x33, 0x53, 0xF0, 0x2F, 0x87, 0x1F,
+0x12, 0x9E, 0xCF, 0x53, 0xA9, 0x93, 0x8D, 0xD2, 0x8D, 0xD8, 0xC8, 0x22, 0x2B, 0xB5, 0xCB, 0x43,
+0xCD, 0x6B, 0x89, 0x3C, 0x55, 0x16, 0x64, 0x29, 0x63, 0x0B, 0x6F, 0x85, 0xC8, 0x64, 0x4B, 0x3A,
+0xC9, 0x8E, 0xAE, 0xE7, 0xD1, 0xC4, 0x1C, 0xC9, 0x81, 0x76, 0xC1, 0xFA, 0x8E, 0x27, 0x90, 0x05,
+0xA3, 0xFA, 0xC5, 0xBA, 0x19, 0xC1, 0x99, 0x11, 0xB8, 0x8C, 0xAD, 0xE5, 0x4B, 0xF9, 0x02, 0x92,
+0x22, 0x24, 0xCF, 0xB9, 0x98, 0x9B, 0x3C, 0xAD, 0x3F, 0x55, 0x4A, 0xA5, 0xD0, 0x44, 0x72, 0x22,
+0xCA, 0x60, 0xA4, 0x95, 0xD6, 0x71, 0x25, 0x8A, 0xCA, 0x39, 0x9D, 0x44, 0x38, 0x22, 0xEC, 0x5C,
+0x55, 0xF1, 0x33, 0xEB, 0x72, 0x9C, 0x3D, 0x39, 0xD9, 0xB2, 0x66, 0x45, 0x22, 0x9A, 0xE3, 0xE0,
+0x35, 0x26, 0xE4, 0x80, 0x85, 0x37, 0x4C, 0x78, 0x4B, 0x22, 0xAB, 0xAA, 0xCA, 0x3A, 0x19, 0x65,
+0x13, 0x14, 0x48, 0x21, 0xA3, 0x19, 0xA7, 0xCD, 0x31, 0x97, 0xF1, 0x8F, 0xE3, 0x68, 0xD7, 0xE3,
+0x8F, 0x2A, 0x7B, 0x49, 0x27, 0x9D, 0x33, 0x42, 0xA7, 0x3B, 0x98, 0xB8, 0xCB, 0x40, 0xFA, 0x30,
+0xE4, 0xC4, 0x4E, 0xE6, 0x87, 0xDD, 0x2F, 0x43, 0xC4, 0x79, 0x68, 0xBA, 0xC8, 0xDA, 0x67, 0x14,
+0x3D, 0x11, 0xF7, 0x38, 0xB7, 0x72, 0x62, 0x97, 0xE3, 0x9F, 0xCF, 0xB6, 0x8C, 0xF8, 0xD9, 0xDC,
+0xAF, 0xCE, 0x87, 0x14, 0x5D, 0x3D, 0x83, 0x40, 0xA5, 0x91, 0xB1, 0x89, 0xF0, 0xC8, 0xC1, 0x3D,
+0xE1, 0xBF, 0xFC, 0x07, 0xBF, 0x14, 0x1E, 0xBF, 0x67, 0xAF, 0x7C, 0x4E, 0x0A, 0xB1, 0x4B, 0x43,
+0x52, 0x9E, 0x15, 0x04, 0x0A, 0x02, 0x77, 0x1E, 0x02, 0x85, 0xD8, 0x7D, 0x8C, 0x31, 0xA7, 0xF2,
+0xF5, 0xDE, 0xF1, 0x33, 0xE1, 0x3F, 0xFB, 0xE7, 0xBF, 0x13, 0x8E, 0x9C, 0xBE, 0x10, 0xDA, 0x11,
+0x09, 0xDB, 0xB3, 0x7E, 0x0B, 0x36, 0x9A, 0xE8, 0x34, 0x55, 0xC8, 0x54, 0x15, 0x51, 0x97, 0xC8,
+0x2C, 0xA8, 0x14, 0x65, 0xC4, 0xCE, 0x95, 0x12, 0x53, 0xF2, 0x16, 0x12, 0x3B, 0x2E, 0xB8, 0x2A,
+0x35, 0x89, 0x6F, 0x99, 0xAF, 0xE6, 0x24, 0x20, 0x66, 0x92, 0x54, 0x81, 0x0B, 0xAF, 0xD1, 0x16,
+0x3A, 0x92, 0x53, 0x99, 0x9B, 0x9D, 0x18, 0x81, 0x9A, 0x01, 0x62, 0x37, 0x3D, 0x15, 0x66, 0x41,
+0xEC, 0x66, 0xA7, 0x94, 0xD8, 0x89, 0x52, 0x27, 0x8B, 0xBE, 0x2F, 0xAA, 0xF9, 0xB3, 0x6C, 0x7D,
+0x36, 0x62, 0xE0, 0x67, 0x2A, 0x69, 0x44, 0x72, 0xCE, 0x93, 0x0A, 0x44, 0xB3, 0xA4, 0xA8, 0x63,
+0x56, 0xBD, 0x9B, 0x17, 0x23, 0x09, 0x12, 0x72, 0x45, 0xF6, 0x57, 0x25, 0x76, 0x75, 0x18, 0x82,
+0xB5, 0x80, 0xEA, 0xDE, 0x52, 0xEA, 0x13, 0x6F, 0x66, 0xA4, 0x45, 0x08, 0x71, 0x5E, 0xB6, 0xA6,
+0xA1, 0x4E, 0x2E, 0xA5, 0xE6, 0x64, 0x62, 0xCD, 0x87, 0xDF, 0x79, 0x89, 0xD1, 0x8F, 0xA4, 0xD0,
+0x09, 0xC4, 0x39, 0x55, 0xCC, 0x58, 0x6C, 0x65, 0xFE, 0xA4, 0x32, 0x2A, 0xEB, 0x99, 0xA2, 0x69,
+0xF4, 0xD4, 0x15, 0xC1, 0x5C, 0x08, 0x55, 0xCA, 0x9C, 0xC6, 0x21, 0x57, 0xAE, 0x68, 0xB6, 0x96,
+0x5B, 0x9B, 0x5F, 0x9E, 0x13, 0x16, 0x21, 0xFE, 0x1E, 0x1C, 0x13, 0x91, 0x72, 0xA5, 0x13, 0xF3,
+0xC0, 0x9A, 0x41, 0x2F, 0x4E, 0x6F, 0xBA, 0x9A, 0x39, 0x45, 0xE7, 0xD4, 0x16, 0xC7, 0x5C, 0x27,
+0xD9, 0xD3, 0xBC, 0xF9, 0x59, 0xBF, 0x12, 0xDF, 0xF4, 0xF9, 0x9C, 0x5A, 0x59, 0xB9, 0x24, 0x0E,
+0xB4, 0x11, 0x45, 0xAB, 0x23, 0xCD, 0x36, 0xBB, 0x35, 0x4F, 0x70, 0x0E, 0xCB, 0xCC, 0x5D, 0x78,
+0xD3, 0x04, 0xB5, 0x0F, 0x9A, 0xB4, 0x20, 0xD2, 0x52, 0x5E, 0x27, 0xF3, 0x1F, 0x4F, 0xBA, 0x3B,
+0xDA, 0xC3, 0xD3, 0x0F, 0x1C, 0x0C, 0xFF, 0xF9, 0x6F, 0xFE, 0x42, 0xD8, 0xBF, 0x63, 0x8B, 0xF9,
+0xE3, 0x2D, 0xD2, 0x91, 0xCA, 0x58, 0x95, 0x17, 0x05, 0x81, 0x82, 0x40, 0x41, 0x60, 0x6D, 0x22,
+0x50, 0x88, 0xDD, 0x0D, 0x8E, 0x2B, 0x09, 0x0A, 0xF7, 0x86, 0xFD, 0x1B, 0xE4, 0xAE, 0xFB, 0xA7,
+0x08, 0x9C, 0xB8, 0x72, 0x7D, 0x24, 0x74, 0xF7, 0xF6, 0x87, 0xAE, 0xFE, 0x0D, 0x12, 0xF1, 0x28,
+0x79, 0xC4, 0xDC, 0xFC, 0xE7, 0x24, 0x8C, 0x0B, 0x52, 0x16, 0x1C, 0x20, 0xCB, 0x1A, 0x15, 0x34,
+0x5F, 0xC0, 0x8D, 0xB0, 0xA9, 0x69, 0xD2, 0xBC, 0xDF, 0xCC, 0x77, 0x4E, 0x14, 0x26, 0x93, 0xBD,
+0x74, 0x81, 0xE7, 0xE2, 0xCE, 0x68, 0x49, 0x92, 0x3A, 0xF8, 0xFA, 0x81, 0xCC, 0x4D, 0x8F, 0x0C,
+0x09, 0xA9, 0xA3, 0x1F, 0xDD, 0x3C, 0xB3, 0xF2, 0xB3, 0x6E, 0x90, 0x39, 0xFA, 0x01, 0xCE, 0xE3,
+0xC1, 0xBF, 0x73, 0x28, 0x8B, 0x57, 0x22, 0xD1, 0xE5, 0x4E, 0xF7, 0x4B, 0xC3, 0x90, 0x29, 0x2A,
+0x8B, 0x10, 0xBB, 0x28, 0xAD, 0xD5, 0xBE, 0x9F, 0xBF, 0x66, 0x17, 0xCC, 0xF1, 0x4C, 0x49, 0xC6,
+0xF2, 0x87, 0x2E, 0xE9, 0x46, 0x08, 0xB2, 0xE2, 0x15, 0x4D, 0xCD, 0xA0, 0x71, 0x88, 0xD4, 0x12,
+0x98, 0x68, 0x83, 0x3C, 0xA7, 0xE2, 0x26, 0x9C, 0x92, 0x0A, 0x55, 0xC6, 0x91, 0x2B, 0x9A, 0xA0,
+0xDE, 0x40, 0xE9, 0xAF, 0xD3, 0x22, 0xBB, 0x7B, 0xEE, 0x18, 0x97, 0x51, 0xB1, 0xDC, 0xA5, 0x6F,
+0x41, 0x6F, 0x2A, 0xFC, 0x82, 0xF5, 0x18, 0xD1, 0xAA, 0x14, 0x34, 0x92, 0xB8, 0x40, 0x8F, 0xB4,
+0x31, 0x96, 0xB2, 0x46, 0x35, 0x5D, 0xC1, 0x33, 0x02, 0x9B, 0x13, 0xA6, 0x44, 0x90, 0x38, 0x9F,
+0x9C, 0x78, 0x69, 0x09, 0x27, 0xBC, 0x8A, 0x65, 0xF5, 0x2A, 0x99, 0x46, 0x52, 0xA8, 0xB6, 0xF5,
+0xA9, 0x9C, 0x9B, 0xAB, 0x63, 0x11, 0xBB, 0x46, 0x10, 0xCE, 0x2F, 0xCE, 0x06, 0x6A, 0xE1, 0xB8,
+0xA9, 0xF9, 0x3C, 0xDE, 0x4A, 0x88, 0x9D, 0xAA, 0x8F, 0xE9, 0xD0, 0x3B, 0xE9, 0x8F, 0x16, 0x6F,
+0x52, 0x1A, 0xE9, 0x9C, 0x70, 0xD3, 0xCF, 0xB0, 0x0B, 0xA4, 0xEE, 0xC9, 0xBB, 0xF7, 0x85, 0xCF,
+0x3D, 0x7C, 0x4F, 0xF8, 0x3B, 0x5F, 0xFD, 0x4C, 0xD8, 0xB6, 0x71, 0x5D, 0x51, 0xEB, 0x16, 0x4C,
+0xC2, 0x72, 0xA2, 0x20, 0x50, 0x10, 0xB8, 0xD3, 0x10, 0x28, 0xC4, 0xEE, 0x06, 0x47, 0x5C, 0xF7,
+0x86, 0x1D, 0x0F, 0xFF, 0xCB, 0xB7, 0x7F, 0x1C, 0xFE, 0x87, 0x3F, 0xFD, 0x6B, 0x21, 0x79, 0x3D,
+0x03, 0xC8, 0xA3, 0xD5, 0xDD, 0x6F, 0x26, 0x33, 0x12, 0x3B, 0x5B, 0xBA, 0x96, 0x22, 0x76, 0x5C,
+0x6C, 0x6D, 0x71, 0x94, 0x34, 0x0E, 0x66, 0xF2, 0xF3, 0x88, 0x55, 0xCA, 0x5F, 0x12, 0xA8, 0x90,
+0x45, 0xC5, 0x2A, 0xB1, 0xB3, 0x85, 0x92, 0x99, 0xF7, 0xA1, 0xCC, 0x4D, 0x8F, 0x0D, 0x87, 0x99,
+0xD1, 0xC1, 0x30, 0x3D, 0x0E, 0x62, 0x47, 0xF5, 0x2E, 0xFA, 0x33, 0xB5, 0x42, 0x49, 0x6C, 0x93,
+0xC8, 0x41, 0x2E, 0x84, 0x1D, 0x4C, 0xC7, 0x81, 0xD7, 0xED, 0x92, 0xEA, 0xC2, 0xBD, 0xB8, 0x72,
+0x63, 0x97, 0xD2, 0x88, 0xEA, 0xF2, 0x9F, 0x28, 0x58, 0x4E, 0xB2, 0xBC, 0x5C, 0x85, 0xCB, 0x2D,
+0x45, 0xEC, 0xD8, 0xD7, 0xBA, 0x6C, 0xAE, 0x11, 0x8A, 0xB7, 0xF4, 0x40, 0xB9, 0xA9, 0xD7, 0x59,
+0xE0, 0x02, 0x62, 0x27, 0x24, 0x9A, 0x84, 0xD9, 0x4D, 0x8F, 0x46, 0x13, 0xF2, 0x4E, 0xF0, 0x16,
+0x66, 0xB2, 0x95, 0x40, 0x8C, 0x8C, 0x73, 0x2C, 0x24, 0xA2, 0x39, 0xF9, 0xA8, 0xD7, 0x36, 0x25,
+0x93, 0x7A, 0x78, 0xFF, 0xAA, 0xC4, 0x2E, 0x42, 0x25, 0xE2, 0x53, 0x7D, 0x32, 0x53, 0xA9, 0x39,
+0x53, 0x0D, 0x97, 0x44, 0xC3, 0xC9, 0x9A, 0x17, 0xCA, 0xE0, 0xCD, 0x91, 0xD6, 0x69, 0x67, 0xD4,
+0x6A, 0x09, 0x62, 0x27, 0xB3, 0xC1, 0xF9, 0xAD, 0x61, 0x14, 0xEF, 0x9F, 0x13, 0x3B, 0xB7, 0xE7,
+0x57, 0xCC, 0xEA, 0x5E, 0x32, 0xA3, 0x7A, 0xD6, 0xF1, 0xEA, 0x54, 0x51, 0x22, 0x2B, 0xA5, 0xAC,
+0x2D, 0xB5, 0x4D, 0xD2, 0x31, 0xD5, 0x58, 0x72, 0x3E, 0xEF, 0xEF, 0xE9, 0x0A, 0x9F, 0x7B, 0xE8,
+0xEE, 0xF0, 0x28, 0xC8, 0xDD, 0xD3, 0x0F, 0x1E, 0x0C, 0x03, 0xBD, 0x48, 0x33, 0xD4, 0x28, 0x46,
+0x37, 0xF8, 0xB9, 0x2F, 0x97, 0x15, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x1D, 0x81, 0x42, 0xEC,
+0x6E, 0x70, 0x84, 0x48, 0xEC, 0x8E, 0x9F, 0xBD, 0x14, 0xFE, 0xAB, 0xFF, 0xDF, 0x1F, 0x86, 0x57,
+0x0F, 0x7F, 0x24, 0xF9, 0xC5, 0xBA, 0x07, 0x36, 0x81, 0x34, 0x61, 0x2B, 0x31, 0x33, 0x13, 0x51,
+0x75, 0x93, 0xF5, 0x50, 0x4C, 0xB0, 0x4A, 0xA4, 0x34, 0x3D, 0x04, 0x56, 0x3E, 0xBE, 0xB6, 0xF3,
+0xAE, 0xC4, 0x49, 0x64, 0x2B, 0x1E, 0xD1, 0x77, 0x8C, 0xC1, 0x00, 0x62, 0x6A, 0xE4, 0x5F, 0x33,
+0xE7, 0x4A, 0x7B, 0xE1, 0x63, 0x87, 0x28, 0xD7, 0xD9, 0xA9, 0x49, 0x21, 0x73, 0x53, 0x20, 0x75,
+0x4C, 0xFB, 0xC0, 0xC8, 0x57, 0x92, 0x11, 0x12, 0xB8, 0x76, 0xE4, 0x17, 0x63, 0x4E, 0xAF, 0x9E,
+0xAE, 0xCE, 0xB0, 0x71, 0xA0, 0x4F, 0xD2, 0x40, 0xEC, 0xDA, 0xBC, 0x41, 0x22, 0x08, 0xD7, 0x0F,
+0xF4, 0xCA, 0xA2, 0xD8, 0xC5, 0x64, 0xAE, 0x0B, 0x16, 0xF4, 0xC5, 0x00, 0x69, 0x90, 0x7C, 0x2D,
+0x43, 0xEC, 0x1A, 0x92, 0xE9, 0x6E, 0x70, 0x4C, 0x96, 0xBD, 0x6C, 0x31, 0x52, 0x69, 0xE3, 0x65,
+0xD0, 0x2A, 0x15, 0x5B, 0x94, 0x80, 0x2A, 0xAD, 0xA8, 0x67, 0x42, 0xCC, 0xEF, 0x9F, 0x13, 0xCB,
+0xC5, 0x0C, 0xC4, 0x55, 0x02, 0x9D, 0x11, 0x3B, 0x0B, 0xEC, 0xA8, 0x48, 0x95, 0x0D, 0xC2, 0xBF,
+0x2C, 0x06, 0xB5, 0x05, 0xBC, 0xEF, 0x35, 0x7E, 0x85, 0xB5, 0xFD, 0x8B, 0xC4, 0x39, 0xBB, 0x3E,
+0x29, 0x76, 0x7A, 0x52, 0xCD, 0xBD, 0x32, 0x3D, 0x97, 0x3E, 0x6A, 0xE7, 0x48, 0x0E, 0xBC, 0xD6,
+0x64, 0x67, 0x52, 0x45, 0x49, 0xED, 0x4B, 0xAC, 0x6F, 0x5D, 0x6F, 0x6F, 0xD8, 0x89, 0x79, 0xBD,
+0x0E, 0x7B, 0xC4, 0xF6, 0x75, 0x77, 0x69, 0x44, 0x78, 0x21, 0x76, 0x2B, 0x9E, 0x02, 0xE5, 0x82,
+0x82, 0x40, 0x41, 0x60, 0x6D, 0x21, 0x50, 0x88, 0xDD, 0x0A, 0xC7, 0xD3, 0x23, 0xFB, 0x66, 0xB0,
+0x8D, 0xD1, 0x8B, 0xEF, 0x1E, 0x0F, 0xFF, 0xF9, 0xBF, 0xF8, 0xBD, 0x70, 0x69, 0x70, 0x24, 0x74,
+0xF6, 0xF4, 0x86, 0xAE, 0xDE, 0x01, 0x2C, 0x2C, 0x4C, 0x35, 0xA2, 0x2A, 0x9B, 0xA8, 0x43, 0xA2,
+0x76, 0x90, 0xD8, 0x51, 0x1C, 0xB1, 0x14, 0x1A, 0xFA, 0xC2, 0x52, 0x81, 0x98, 0x44, 0x24, 0xA4,
+0x6F, 0xA1, 0x62, 0xA7, 0x51, 0xA4, 0x68, 0xA4, 0xA4, 0x31, 0x51, 0xB5, 0x82, 0x24, 0x6E, 0x6A,
+0xF8, 0x5A, 0x98, 0x19, 0x53, 0xB3, 0xEB, 0x0C, 0x82, 0x24, 0x26, 0xB1, 0xFB, 0xC5, 0x2C, 0xA2,
+0x5F, 0x77, 0x6C, 0x5C, 0x0F, 0x9F, 0xA3, 0x03, 0xE1, 0xBE, 0x7D, 0x3B, 0xC2, 0x76, 0x98, 0xA6,
+0xB8, 0xF0, 0xF5, 0x43, 0xC9, 0xE8, 0x45, 0xB4, 0x60, 0x6F, 0x17, 0xC8, 0x1C, 0xB6, 0x5C, 0xEA,
+0x14, 0xE2, 0x67, 0x09, 0x83, 0x57, 0xD8, 0xFF, 0x52, 0xFC, 0xCE, 0x40, 0xA0, 0xAA, 0xD8, 0x26,
+0x15, 0x77, 0xB5, 0xF8, 0x65, 0x3D, 0x54, 0x73, 0x7E, 0x98, 0x2B, 0xC5, 0xCE, 0x03, 0x39, 0x87,
+0x3B, 0x30, 0x97, 0x35, 0x05, 0x4E, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0x40, 0x7E,
+0x5B, 0x97, 0x04, 0xC5, 0x2B, 0x9B, 0x08, 0x4E, 0xEC, 0x46, 0xC7, 0x27, 0xC3, 0x37, 0x7E, 0xFC,
+0x46, 0xF8, 0x7F, 0xFD, 0xFB, 0x6F, 0x86, 0x11, 0xA4, 0x39, 0xE9, 0xE9, 0x1B, 0x08, 0xED, 0x9D,
+0x3D, 0x42, 0xDE, 0x6A, 0x89, 0x5D, 0x8C, 0xFA, 0x6C, 0x94, 0xD8, 0x99, 0xDF, 0x9D, 0x5E, 0xE7,
+0xA6, 0x32, 0x12, 0x44, 0xE8, 0x16, 0xF4, 0x95, 0x9B, 0x1A, 0x0F, 0x53, 0x43, 0x20, 0x76, 0x13,
+0xA3, 0x12, 0x10, 0xC1, 0x5D, 0x10, 0xD6, 0x43, 0xB5, 0xD8, 0x04, 0x65, 0xEE, 0x00, 0x1C, 0xC8,
+0x3F, 0xF3, 0xE0, 0xA1, 0xF0, 0xC0, 0xFE, 0x9D, 0x61, 0xFB, 0xA6, 0x75, 0x61, 0xFB, 0x66, 0xA4,
+0x5F, 0x29, 0x1B, 0xA3, 0xAF, 0x6C, 0x90, 0x4B, 0xE9, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x7C, 0x42, 0x11, 0x58, 0xD2, 0xF7, 0xFB, 0x13, 0xDA, 0xA7, 0xA6, 0x34, 0x7B, 0x7C,
+0x6A, 0x3A, 0x7C, 0x70, 0xEA, 0x42, 0x98, 0x66, 0xB6, 0x7C, 0xD9, 0xCE, 0xAA, 0x5D, 0xD4, 0xB9,
+0x98, 0xAB, 0x8B, 0xAC, 0x19, 0x0F, 0x2A, 0x0D, 0x6A, 0x79, 0x32, 0x82, 0x66, 0xD2, 0x83, 0x9E,
+0x77, 0x6F, 0x21, 0x35, 0xD9, 0x4A, 0x39, 0x0F, 0x90, 0x10, 0xDA, 0xAD, 0xAF, 0x35, 0x02, 0x10,
+0x41, 0x0F, 0x93, 0x63, 0x30, 0xBB, 0xC2, 0xF4, 0x0A, 0xB5, 0x6E, 0x6E, 0x06, 0x69, 0x4C, 0x70,
+0x6E, 0x0A, 0xCA, 0x61, 0x27, 0x7C, 0xE6, 0x9E, 0xBE, 0xEF, 0x40, 0xF8, 0x8F, 0x7E, 0xE1, 0x8B,
+0xE1, 0x1F, 0xE1, 0xF1, 0xA5, 0x27, 0xEF, 0x0F, 0x77, 0xEF, 0xDD, 0x1E, 0xB6, 0x6C, 0x1C, 0x08,
+0x1D, 0x65, 0xEF, 0xCC, 0xA6, 0xCC, 0x87, 0x72, 0x93, 0x5B, 0x8B, 0x40, 0xD9, 0x40, 0xE7, 0xD6,
+0xE2, 0x5F, 0xEE, 0x5E, 0x10, 0x28, 0x08, 0xDC, 0x3E, 0x08, 0x14, 0x62, 0x77, 0x83, 0x63, 0x31,
+0x31, 0x39, 0x1D, 0x4E, 0x5C, 0xB8, 0xA2, 0x8A, 0x99, 0xED, 0x79, 0x9A, 0xA7, 0xC4, 0xC8, 0xAB,
+0xAD, 0x98, 0xAF, 0x2A, 0xC4, 0xAE, 0x7A, 0xF3, 0x5A, 0x33, 0x57, 0x7C, 0x2D, 0xFE, 0x74, 0xE3,
+0x50, 0xE8, 0xC6, 0xF4, 0x81, 0xC4, 0xAC, 0xCC, 0xE1, 0xD5, 0xD1, 0xD1, 0x81, 0x14, 0x0F, 0x5B,
+0xC3, 0xA7, 0x40, 0xEA, 0x9E, 0x79, 0xE8, 0x50, 0xF8, 0xEC, 0xC3, 0x77, 0x87, 0x27, 0xEF, 0xDB,
+0x87, 0x73, 0x9B, 0xC3, 0x46, 0x64, 0xE0, 0xEF, 0x35, 0xBF, 0xA3, 0x1B, 0xEC, 0x62, 0xB9, 0xAC,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x4F, 0x18, 0x02, 0x85, 0xD8,
+0xAD, 0x70, 0xC0, 0xDC, 0x39, 0x7B, 0x12, 0xC4, 0xEE, 0xDC, 0x55, 0xA4, 0x17, 0x01, 0xFB, 0x92,
+0x8D, 0xD9, 0xC5, 0xCF, 0x27, 0x39, 0xD5, 0xE7, 0xCE, 0xF3, 0x51, 0xB9, 0x63, 0x72, 0x59, 0x4F,
+0xE5, 0x40, 0x47, 0x73, 0x73, 0x58, 0xD7, 0x78, 0x40, 0x1E, 0xAA, 0xCE, 0xE5, 0xAA, 0x1F, 0xCF,
+0xD2, 0x8F, 0x6E, 0x92, 0x11, 0xAF, 0x30, 0xBD, 0x32, 0x37, 0x1D, 0x45, 0xBD, 0x29, 0xF8, 0xD3,
+0xF5, 0xF7, 0x74, 0x87, 0x9F, 0x79, 0xEA, 0x41, 0xA8, 0x74, 0x5F, 0x08, 0xCF, 0x3E, 0x76, 0x2F,
+0xC8, 0x5C, 0x6F, 0x71, 0x1E, 0x5F, 0xE1, 0x78, 0x96, 0xE2, 0x6B, 0x03, 0x81, 0x12, 0x34, 0xB1,
+0x36, 0xC6, 0xB1, 0xF4, 0xA2, 0x20, 0x50, 0x10, 0xF8, 0xF8, 0x08, 0x14, 0x62, 0x77, 0x03, 0x18,
+0x32, 0xB5, 0xC9, 0x85, 0xEB, 0xC3, 0x61, 0x70, 0x74, 0x42, 0x02, 0x1E, 0x5A, 0xDB, 0x18, 0x5D,
+0x9A, 0xA5, 0x73, 0x50, 0x8A, 0xB6, 0xB0, 0xE6, 0xFA, 0xA1, 0x96, 0x95, 0x72, 0x95, 0xEB, 0x68,
+0x81, 0x35, 0xB5, 0x8E, 0x09, 0x87, 0x99, 0xD6, 0x64, 0x16, 0x5B, 0x81, 0x31, 0xF5, 0xC9, 0xDE,
+0x6D, 0x9B, 0xA0, 0xD4, 0xED, 0x0F, 0x9F, 0x7D, 0xE8, 0x20, 0xFE, 0xDE, 0x15, 0xF6, 0x41, 0xA5,
+0xEB, 0x46, 0x04, 0x6C, 0x59, 0xE0, 0x6E, 0x60, 0x40, 0xCB, 0x25, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x58, 0x23, 0x08, 0x14, 0x62, 0xB7, 0x82, 0x81, 0x74, 0x25, 0x6D, 0x08,
+0xDB, 0x18, 0x1D, 0x3E, 0x73, 0x31, 0x4C, 0x23, 0x90, 0x81, 0x11, 0x79, 0x4C, 0x48, 0xEC, 0xC9,
+0x2A, 0xDC, 0x57, 0x2E, 0xAF, 0xD6, 0xB3, 0x3B, 0x54, 0xA8, 0x9F, 0x5C, 0xC0, 0xD4, 0x27, 0x94,
+0xEE, 0xFC, 0x2A, 0x4B, 0xF3, 0xE0, 0x29, 0x28, 0xF0, 0x92, 0x81, 0x12, 0x33, 0xC8, 0x4D, 0xC7,
+0xBD, 0x5F, 0xE7, 0x10, 0x4C, 0x01, 0x97, 0x3A, 0xE4, 0xA5, 0x6B, 0x0F, 0x5F, 0x84, 0x42, 0xF7,
+0xF7, 0x7E, 0xE6, 0x99, 0xF0, 0xF0, 0xDD, 0x7B, 0x25, 0xD2, 0xB5, 0x1C, 0x05, 0x81, 0x3B, 0x11,
+0x01, 0x49, 0xC2, 0xDD, 0xC0, 0x0F, 0xA6, 0x3B, 0x11, 0x9B, 0xD2, 0xE7, 0x82, 0x40, 0x41, 0xE0,
+0xCE, 0x44, 0xA0, 0x10, 0xBB, 0x1B, 0x18, 0xF7, 0xE1, 0xF1, 0x89, 0x70, 0xF4, 0xEC, 0x65, 0x90,
+0xAC, 0x39, 0xD9, 0x64, 0x5E, 0x76, 0x9A, 0xC8, 0x92, 0x77, 0x25, 0xD3, 0x6A, 0x4D, 0xE5, 0xF5,
+0xB2, 0x32, 0x08, 0x97, 0xCB, 0xF3, 0x76, 0x25, 0xA5, 0x8F, 0x7B, 0xBD, 0xCE, 0x4E, 0x22, 0x48,
+0x62, 0x1A, 0xFB, 0xBC, 0x22, 0xF9, 0x2B, 0xA3, 0x5B, 0xB7, 0x22, 0x20, 0xE2, 0x71, 0x24, 0x64,
+0xFD, 0x2C, 0x22, 0x5F, 0x9F, 0x00, 0xA9, 0x63, 0x4A, 0x13, 0xDD, 0x47, 0xB6, 0x1C, 0x05, 0x81,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0xE9, 0x08, 0x14, 0x46, 0xB0, 0x82,
+0x19, 0xE0, 0x66, 0xCE, 0xE1, 0xB1, 0xC9, 0x70, 0xEC, 0x3C, 0x89, 0x9D, 0x46, 0xC4, 0x56, 0xCC,
+0x9F, 0xB2, 0xBD, 0x41, 0xF2, 0xA5, 0xF3, 0x24, 0xAE, 0xA2, 0x2C, 0x78, 0xEE, 0x3A, 0xA1, 0x81,
+0xD9, 0x86, 0x4A, 0xC6, 0xE5, 0x4C, 0xC4, 0x33, 0x9A, 0x87, 0x6D, 0xC2, 0x10, 0x24, 0x31, 0x37,
+0x8D, 0x3D, 0x5F, 0x51, 0x7E, 0x06, 0xD7, 0x6F, 0x40, 0x62, 0xE1, 0xC7, 0x41, 0xE6, 0xFE, 0xFE,
+0xCF, 0x7C, 0x06, 0x41, 0x12, 0xFB, 0x4B, 0x1A, 0x93, 0x15, 0x8C, 0x5D, 0x29, 0xBA, 0x36, 0x11,
+0xE0, 0x67, 0xAF, 0xB8, 0x1F, 0xAC, 0xCD, 0xB1, 0x2D, 0xBD, 0x2A, 0x08, 0x14, 0x04, 0x6E, 0x0C,
+0x81, 0x42, 0xEC, 0x56, 0x80, 0x1B, 0x23, 0x60, 0x49, 0xEA, 0xAE, 0x0C, 0x8D, 0x84, 0x4B, 0xD8,
+0x1B, 0x96, 0x84, 0x8B, 0x8A, 0xDD, 0x82, 0x85, 0xA5, 0x8E, 0x69, 0x68, 0xA1, 0xC7, 0x5D, 0xCE,
+0xE6, 0x5C, 0xE3, 0xA3, 0x53, 0x9D, 0xFA, 0xE7, 0xCD, 0xCD, 0x42, 0xA5, 0x9B, 0x9E, 0x54, 0x9F,
+0x3A, 0x2C, 0x5E, 0x7B, 0xB7, 0x6D, 0x0C, 0x4F, 0xDC, 0xB3, 0x17, 0xD1, 0xAF, 0x07, 0xC2, 0x53,
+0x20, 0x75, 0x3B, 0x91, 0x9F, 0x8E, 0xBB, 0x4B, 0x94, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x80, 0x23, 0x50, 0x98, 0x41, 0x83, 0x73, 0x81, 0x8A, 0xDB,
+0x34, 0x1C, 0xDC, 0xCE, 0x5D, 0xBE, 0x1E, 0xCE, 0x5C, 0xBA, 0x1E, 0xC6, 0x11, 0x40, 0xC1, 0x64,
+0xC4, 0x34, 0xC3, 0x7A, 0x3E, 0x3A, 0xAD, 0xAA, 0x8E, 0xBD, 0x55, 0x22, 0x60, 0x35, 0x17, 0x9D,
+0x6C, 0x44, 0x91, 0x3B, 0xE2, 0x09, 0xA7, 0x8B, 0x31, 0xB1, 0xB1, 0x9C, 0xA8, 0x75, 0x24, 0x77,
+0x78, 0x9B, 0x09, 0x88, 0x9F, 0x45, 0x2A, 0x93, 0xBF, 0xFD, 0x85, 0x27, 0xC2, 0x97, 0x1F, 0xBB,
+0x4F, 0xF6, 0xC4, 0x2C, 0x47, 0x41, 0xE0, 0x4E, 0x47, 0xA0, 0xF8, 0xD6, 0xDD, 0xE9, 0x33, 0xA0,
+0xF4, 0xBF, 0x20, 0x50, 0x10, 0xA8, 0x87, 0x40, 0x21, 0x76, 0x2B, 0x98, 0x17, 0x8C, 0x86, 0x3D,
+0x76, 0xEE, 0x72, 0x38, 0x06, 0xFF, 0xBA, 0x49, 0x90, 0x3C, 0xD9, 0x65, 0x22, 0x06, 0x4E, 0x64,
+0x15, 0x2D, 0xB2, 0xC5, 0x91, 0xC4, 0x48, 0xF0, 0xA8, 0x17, 0x61, 0x91, 0x5D, 0x3E, 0x8F, 0x1C,
+0x75, 0x4C, 0x6B, 0x32, 0x07, 0x85, 0x90, 0xDB, 0x26, 0xDD, 0xBB, 0x67, 0x1B, 0x12, 0x10, 0xEF,
+0x0F, 0x8F, 0x1E, 0xDA, 0x23, 0x39, 0xEA, 0xB8, 0x17, 0x6C, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xD4, 0x22, 0x50, 0x88, 0xDD, 0x0A, 0xE6, 0x04,
+0x77, 0x9B, 0x78, 0xE7, 0xC4, 0xF9, 0xF0, 0xDE, 0xC9, 0x0B, 0x16, 0x38, 0x41, 0xFF, 0x1E, 0x15,
+0xE9, 0x44, 0xB5, 0xF3, 0x40, 0x08, 0xCB, 0x45, 0x97, 0x78, 0x1C, 0xDF, 0x55, 0x9F, 0x3A, 0x1E,
+0xF2, 0x9C, 0xBE, 0x41, 0x4E, 0xF2, 0xAC, 0x0D, 0xBA, 0xAF, 0x2C, 0x76, 0x98, 0x80, 0x5F, 0x9D,
+0xA4, 0x39, 0x41, 0x05, 0xDC, 0xDF, 0xF5, 0x6B, 0x4F, 0x3F, 0x24, 0xA4, 0xAE, 0xAF, 0xA7, 0x6B,
+0x05, 0xAD, 0x2D, 0x45, 0x0B, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8,
+0xD3, 0x10, 0x28, 0xC4, 0x6E, 0x05, 0x23, 0x3E, 0x36, 0x31, 0x85, 0xDD, 0x26, 0xAE, 0x86, 0x93,
+0x97, 0x06, 0xB1, 0xE3, 0x84, 0x07, 0x48, 0x54, 0xF3, 0xD7, 0x29, 0x57, 0xF3, 0xF4, 0xC4, 0xB9,
+0x61, 0x36, 0xCF, 0x50, 0x97, 0x79, 0xDC, 0xD5, 0x38, 0xDF, 0xCD, 0x81, 0xD0, 0xCD, 0xC3, 0xAF,
+0x8E, 0x6A, 0x5D, 0x27, 0xD2, 0x9A, 0x3C, 0xB4, 0x6F, 0x47, 0x78, 0xEA, 0xDE, 0x7D, 0xE2, 0x53,
+0xC7, 0xAD, 0xC3, 0xCA, 0x51, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40,
+0x41, 0x60, 0x31, 0x04, 0x0A, 0xB1, 0x6B, 0x60, 0x6E, 0xD0, 0x97, 0x87, 0xFB, 0xB2, 0x8E, 0x80,
+0xD8, 0x5D, 0x18, 0x1C, 0x0D, 0x97, 0x47, 0xE0, 0xFF, 0x46, 0xE5, 0x2D, 0x0B, 0x9C, 0xD0, 0x4D,
+0x24, 0x4C, 0x93, 0xB3, 0x50, 0x58, 0x9E, 0xD3, 0xF3, 0xDC, 0x4D, 0x42, 0x5D, 0xE9, 0xC4, 0xBF,
+0x8E, 0x7B, 0xC0, 0xDA, 0x7D, 0x95, 0xD7, 0xD9, 0xBF, 0x20, 0x8B, 0x0C, 0x98, 0x20, 0xA9, 0x63,
+0x4D, 0xF4, 0xA5, 0xFB, 0xFA, 0x67, 0x1E, 0x0A, 0xFB, 0xB6, 0x6F, 0x82, 0x9F, 0x5D, 0x19, 0xAA,
+0x06, 0x86, 0xAA, 0x14, 0xB9, 0x83, 0x10, 0x28, 0xD1, 0xB0, 0x77, 0xD0, 0x60, 0x97, 0xAE, 0x16,
+0x04, 0x0A, 0x02, 0x0D, 0x23, 0x50, 0xD8, 0x42, 0x83, 0x50, 0x31, 0x70, 0xE2, 0xFC, 0x95, 0xC1,
+0x70, 0x1D, 0xC9, 0x89, 0xA7, 0x90, 0x98, 0x58, 0x4C, 0xA9, 0x0B, 0x7C, 0xE9, 0x9C, 0xA6, 0xB9,
+0xD1, 0x55, 0x2B, 0x17, 0x4D, 0x2F, 0x0F, 0x82, 0xCD, 0xEE, 0x99, 0x04, 0x3B, 0x28, 0x7A, 0x20,
+0x74, 0x73, 0xB8, 0xCF, 0x3C, 0x92, 0x11, 0x77, 0x40, 0x9D, 0x7B, 0x68, 0xFF, 0x4E, 0x49, 0x6F,
+0xB2, 0xA1, 0xBF, 0x57, 0x12, 0x21, 0x97, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0x52, 0x08, 0x14, 0x62, 0xD7, 0xE0, 0xFC, 0x18, 0xC7, 0xDE, 0xB0,
+0x1F, 0x9C, 0xB9, 0x14, 0x18, 0x40, 0xD1, 0x89, 0xE0, 0x85, 0x56, 0x06, 0x4E, 0x38, 0xD9, 0xC2,
+0x8E, 0x10, 0x2E, 0xC1, 0xA9, 0x32, 0x07, 0xD2, 0xC7, 0xB4, 0x25, 0x54, 0xE8, 0x6A, 0xD5, 0x39,
+0x57, 0xED, 0x4C, 0xA7, 0x93, 0xFD, 0x62, 0x51, 0x08, 0x5C, 0x4E, 0x4C, 0xB0, 0xF3, 0xF3, 0xB3,
+0x50, 0x07, 0x03, 0xFC, 0xE9, 0xBA, 0xC3, 0xD7, 0x9E, 0x7A, 0x00, 0x09, 0x88, 0x07, 0x4A, 0x9E,
+0xAE, 0x06, 0xC7, 0xA8, 0x14, 0xBB, 0x73, 0x10, 0x28, 0x11, 0xB1, 0x77, 0xCE, 0x58, 0x97, 0x9E,
+0x16, 0x04, 0x0A, 0x02, 0x2B, 0x43, 0xA0, 0x10, 0xBB, 0x06, 0xF1, 0x9A, 0x98, 0x46, 0x44, 0xEC,
+0xF9, 0xAB, 0x61, 0x7C, 0x7A, 0x16, 0x6A, 0x5A, 0xBB, 0x46, 0xC4, 0xAA, 0x16, 0xE7, 0x96, 0xD4,
+0x65, 0x6B, 0x5A, 0x98, 0xCB, 0x8E, 0x97, 0x58, 0x88, 0x2C, 0xB7, 0x0C, 0x9B, 0x23, 0xB1, 0x9B,
+0x93, 0xF4, 0x26, 0xF7, 0xEE, 0xDE, 0x16, 0x1E, 0x3D, 0xB8, 0x5B, 0x02, 0x26, 0x8A, 0x58, 0xB7,
+0x2C, 0xB4, 0xA5, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x40,
+0xA0, 0x10, 0xBB, 0x65, 0xA6, 0x01, 0x95, 0x01, 0x2A, 0x70, 0x93, 0x20, 0x74, 0xA7, 0xAE, 0x0C,
+0x85, 0x49, 0x98, 0x61, 0xDB, 0x60, 0x26, 0x6D, 0x69, 0xA5, 0x2A, 0x67, 0xB2, 0x9C, 0xF9, 0xC8,
+0xF1, 0x8F, 0xFA, 0xD1, 0x31, 0xEA, 0x95, 0xFE, 0x75, 0xB8, 0x96, 0xCF, 0xC5, 0x63, 0xCE, 0x4C,
+0xA9, 0xD9, 0xAE, 0x14, 0x7A, 0x6B, 0xFA, 0xDF, 0xD1, 0x87, 0x8F, 0xC4, 0x8E, 0x91, 0xB0, 0x2D,
+0xB2, 0xA3, 0xC4, 0x57, 0x1E, 0xBB, 0x27, 0x6C, 0x59, 0xDF, 0x87, 0x3C, 0x79, 0xC5, 0x04, 0x5B,
+0x3E, 0xA9, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x34, 0x86, 0x40,
+0x21, 0x76, 0x0D, 0xE0, 0xC4, 0x3D, 0x61, 0xAF, 0x0E, 0x8F, 0x85, 0xAB, 0x23, 0x13, 0x61, 0x06,
+0x26, 0xD3, 0xB6, 0xB8, 0x8D, 0x98, 0xA5, 0x38, 0x89, 0x26, 0x59, 0xAB, 0x2C, 0xE6, 0x39, 0x51,
+0x35, 0x2E, 0x8F, 0x87, 0x8D, 0xCE, 0x76, 0xD9, 0x7D, 0xA9, 0xD2, 0x09, 0xA9, 0x43, 0xC9, 0x56,
+0x04, 0x49, 0xEC, 0xDF, 0xB6, 0x29, 0x3C, 0x72, 0x60, 0x47, 0x49, 0x6F, 0xD2, 0xC0, 0xD8, 0x94,
+0x22, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x24, 0x04, 0x0A, 0xB1,
+0x6B, 0x60, 0x36, 0x4C, 0xC2, 0x0C, 0xFB, 0xD1, 0xC5, 0x6B, 0x96, 0x94, 0x58, 0x73, 0xD7, 0xB5,
+0xFA, 0x2E, 0x12, 0x12, 0xFA, 0x5A, 0x55, 0xD5, 0xA8, 0xCE, 0x79, 0x12, 0x14, 0xD5, 0xEA, 0xF4,
+0x15, 0xF3, 0xD7, 0x69, 0x16, 0x3B, 0xD3, 0xEA, 0x28, 0xF8, 0xC1, 0xA1, 0x8E, 0xDB, 0x86, 0x49,
+0x9A, 0x13, 0xBC, 0x6E, 0x6F, 0x6B, 0x0F, 0x4F, 0x63, 0xEB, 0xB0, 0xED, 0x9B, 0xD6, 0x81, 0x40,
+0x16, 0xB5, 0xAE, 0x81, 0xE1, 0x29, 0x45, 0xEE, 0x30, 0x04, 0x5C, 0x45, 0xBF, 0xC3, 0xBA, 0x5D,
+0xBA, 0x5B, 0x10, 0x28, 0x08, 0x14, 0x04, 0x1A, 0x42, 0xA0, 0x10, 0xBB, 0x06, 0x60, 0x22, 0xB1,
+0x3B, 0x0E, 0xFF, 0xBA, 0x29, 0x28, 0x77, 0x4C, 0x71, 0x42, 0x0B, 0x76, 0x95, 0x72, 0x45, 0xAA,
+0xD6, 0x40, 0x6D, 0xB9, 0x54, 0x67, 0xFB, 0xC2, 0x8A, 0x29, 0x96, 0xE7, 0x5B, 0xC2, 0xA6, 0x81,
+0x5E, 0x44, 0xC3, 0xEE, 0x08, 0xEB, 0xFB, 0x7A, 0x4A, 0xD0, 0xC4, 0xCA, 0xD0, 0x2C, 0xA5, 0x0B,
+0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xC7, 0x23, 0x50, 0x88, 0xDD, 0x32, 0x53,
+0x80, 0xFE, 0x75, 0xDC, 0x17, 0xF6, 0xF0, 0xD9, 0xAB, 0x61, 0x1A, 0x5B, 0x41, 0x30, 0x68, 0xC2,
+0x0F, 0xDD, 0x74, 0x82, 0xB2, 0x9B, 0x3D, 0xC4, 0xC1, 0x4E, 0x4E, 0x8A, 0xDF, 0x9C, 0x44, 0xC7,
+0x8A, 0x56, 0xA7, 0x7A, 0x5D, 0x7A, 0xA5, 0x35, 0xCC, 0x43, 0xED, 0xA3, 0x6F, 0x1D, 0xDF, 0x67,
+0x5E, 0xBC, 0x56, 0x04, 0x4D, 0x1C, 0x40, 0xCE, 0xBA, 0x83, 0x3B, 0xB9, 0x6D, 0x58, 0x49, 0x46,
+0x7C, 0xC7, 0x7F, 0x3A, 0x0B, 0x00, 0x75, 0x11, 0x28, 0xF9, 0xEB, 0xCA, 0xC4, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x8B, 0x23, 0x50, 0x88, 0xDD, 0x32, 0xB3, 0x83, 0x89, 0x89, 0x87, 0xC7, 0x27,
+0xC3, 0xB9, 0x6B, 0x23, 0x30, 0x97, 0xC2, 0x07, 0x4E, 0xD2, 0x97, 0xB8, 0x59, 0x35, 0xBF, 0xD8,
+0x54, 0x3B, 0xFF, 0xE3, 0x89, 0xEB, 0x94, 0xE7, 0xC5, 0xC3, 0x78, 0x9F, 0xBD, 0x4E, 0xFE, 0x77,
+0x2C, 0xCE, 0x3D, 0x60, 0x1F, 0xDC, 0xBF, 0x1D, 0x29, 0x4E, 0xFA, 0x61, 0x86, 0x2D, 0x43, 0x53,
+0x3E, 0xB8, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xAC, 0x0C, 0x81,
+0xC2, 0x1E, 0x96, 0xC0, 0x8B, 0xAA, 0xDB, 0xAC, 0x04, 0x4E, 0x8C, 0x87, 0x21, 0xE4, 0xB1, 0xA3,
+0x2F, 0x1D, 0x01, 0x93, 0xDD, 0x24, 0xA8, 0xB8, 0xC9, 0x3F, 0xE6, 0x33, 0xA7, 0x2F, 0xAA, 0x81,
+0x12, 0x56, 0xB7, 0xEF, 0x4A, 0x91, 0xAB, 0x78, 0x49, 0xE8, 0xD3, 0x08, 0x5A, 0xD6, 0xDD, 0xDF,
+0xDD, 0x05, 0xFF, 0xBA, 0x3D, 0xA1, 0xBF, 0xEC, 0x09, 0xBB, 0xB2, 0x59, 0x5C, 0x4A, 0xDF, 0x31,
+0x08, 0x94, 0xFC, 0x75, 0x77, 0xCC, 0x50, 0x97, 0x8E, 0x16, 0x04, 0x0A, 0x02, 0x37, 0x88, 0x40,
+0x21, 0x76, 0xCB, 0x00, 0xC7, 0x34, 0x27, 0x67, 0x2E, 0x0F, 0x05, 0xE6, 0xB1, 0x53, 0xD3, 0x2A,
+0xD5, 0x3A, 0x66, 0x13, 0x4E, 0xE9, 0xEB, 0xCC, 0x3D, 0x2E, 0xAB, 0x69, 0x61, 0xC6, 0x3A, 0x5E,
+0x57, 0x59, 0x94, 0xA2, 0x05, 0xB7, 0x45, 0x22, 0x6D, 0x3B, 0xA0, 0xD6, 0xED, 0xDF, 0xB6, 0x31,
+0xEC, 0xDF, 0xBE, 0xB1, 0xEC, 0x09, 0x7B, 0x83, 0x93, 0xB9, 0x5C, 0x56, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x3B, 0x1D, 0x81, 0x42, 0xEC, 0x96, 0x99, 0x01, 0x13, 0x53, 0xD3,
+0xE1, 0xF0, 0xB9, 0x2B, 0x61, 0x1A, 0xE4, 0x4B, 0xFC, 0xEB, 0xE0, 0x13, 0xD7, 0xC2, 0x6D, 0x22,
+0xC4, 0xBE, 0x9A, 0x25, 0x32, 0xB1, 0xC8, 0xD8, 0x2C, 0xE6, 0x35, 0xD6, 0x9C, 0x76, 0x9F, 0xD0,
+0x77, 0x35, 0xCF, 0x9D, 0xAA, 0x7B, 0xA8, 0x0D, 0xD1, 0xB6, 0x73, 0xA2, 0xD2, 0x3D, 0x71, 0x70,
+0x07, 0x54, 0xBB, 0xCE, 0x3B, 0x7D, 0x4E, 0x96, 0xFE, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x70, 0x83, 0x08, 0x14, 0x62, 0xD7, 0x80, 0x62, 0x77, 0xE2, 0xD2, 0x20,
+0x4C, 0xB2, 0xBA, 0xFF, 0xAB, 0x26, 0x25, 0xB6, 0xE7, 0xA2, 0xDE, 0x29, 0xC1, 0xAB, 0x1E, 0xF5,
+0xF7, 0x98, 0x88, 0xBE, 0x76, 0xE6, 0x7F, 0xC7, 0xFD, 0x66, 0xC9, 0x10, 0x3B, 0x10, 0x34, 0xB1,
+0x19, 0xFB, 0xC1, 0xDE, 0xB7, 0x7B, 0x6B, 0xE8, 0xE9, 0x6C, 0xBF, 0xC1, 0xA1, 0x2C, 0x97, 0x15,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xA7, 0x23, 0x50, 0x88, 0xDD,
+0x22, 0x33, 0x40, 0xFC, 0xE1, 0xA8, 0xA6, 0xC1, 0x14, 0x7B, 0xEE, 0xDA, 0x28, 0xA2, 0x57, 0x2D,
+0x60, 0xC2, 0x88, 0x9D, 0xBE, 0xAF, 0xC2, 0x9D, 0x44, 0xBB, 0x56, 0xB8, 0x5C, 0x4D, 0x32, 0x14,
+0x33, 0xDB, 0x56, 0x82, 0x28, 0x64, 0x47, 0x0A, 0x44, 0xC2, 0x22, 0x1A, 0x63, 0x3D, 0xD4, 0xBA,
+0x9D, 0x1B, 0xFA, 0xC3, 0x9E, 0xAD, 0xEB, 0xB1, 0x5D, 0x59, 0x89, 0x86, 0xBD, 0xD3, 0x3F, 0x94,
+0xA5, 0xFF, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8, 0x51, 0x04, 0x0A, 0xB1,
+0x5B, 0x02, 0xB9, 0x69, 0x6C, 0x1F, 0x76, 0x71, 0x70, 0x34, 0x0C, 0x8D, 0x4F, 0x69, 0x16, 0x13,
+0x9A, 0x61, 0x8D, 0xC1, 0x65, 0x41, 0xAF, 0x5A, 0x43, 0x7D, 0x91, 0x2E, 0xBE, 0xA7, 0x29, 0x4F,
+0xB2, 0xA2, 0x50, 0xEB, 0xE6, 0x61, 0xDA, 0xE5, 0xBE, 0xB0, 0x77, 0xC1, 0xB7, 0xEE, 0x9E, 0x5D,
+0x9B, 0xC3, 0x66, 0xE4, 0xB0, 0x2B, 0xD1, 0xB0, 0x37, 0x3A, 0x95, 0xCB, 0x75, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x62, 0xB7, 0xC4, 0x1C, 0x98, 0x40, 0xFE,
+0xBA, 0x23, 0xE7, 0xAE, 0x86, 0x19, 0x92, 0x3A, 0xEE, 0x0D, 0x8B, 0xDD, 0x21, 0x2C, 0x93, 0xB0,
+0xEE, 0x09, 0x6B, 0x34, 0xAF, 0x42, 0xD8, 0x2A, 0xF5, 0x39, 0x9D, 0x4B, 0x7B, 0xC5, 0x6A, 0xA0,
+0x85, 0x92, 0x3A, 0x3E, 0xEF, 0x6C, 0x6F, 0x87, 0x6F, 0xDD, 0xCE, 0xF0, 0xA9, 0x43, 0xBB, 0x43,
+0x5F, 0x77, 0x47, 0x99, 0x91, 0x05, 0x81, 0x82, 0xC0, 0x22, 0x08, 0x94, 0x1D, 0x27, 0xCA, 0xD4,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xCB, 0x23, 0x50, 0x88, 0xDD, 0x52, 0xC4, 0x0E, 0x91, 0xB0,
+0x47, 0x2F, 0x5C, 0x47, 0xD4, 0x2A, 0xF3, 0xD7, 0x91, 0xC9, 0x31, 0x8D, 0x70, 0x22, 0x6B, 0xB5,
+0x42, 0xDD, 0xC2, 0x0D, 0xC0, 0xAC, 0xAC, 0xE5, 0x47, 0xC9, 0x45, 0x3D, 0xFA, 0xD7, 0x31, 0xCA,
+0xB6, 0x0F, 0xC1, 0x12, 0xF7, 0xEC, 0xDC, 0x14, 0x0E, 0xED, 0xD8, 0x28, 0x79, 0xEC, 0xCA, 0x51,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x46, 0x11, 0x28,
+0xC4, 0x6E, 0x11, 0xE4, 0x48, 0xBA, 0x26, 0xE0, 0x5F, 0x77, 0xFC, 0x32, 0x02, 0x27, 0x40, 0xEC,
+0x64, 0x07, 0x09, 0x2A, 0x76, 0x62, 0x83, 0xD5, 0xA4, 0x27, 0xBE, 0xCB, 0x04, 0xCF, 0x49, 0x2E,
+0x3A, 0x96, 0xF1, 0xAD, 0x26, 0x48, 0xE6, 0x34, 0x41, 0x9D, 0x2A, 0x74, 0xFA, 0x4C, 0x89, 0x21,
+0x49, 0x22, 0x73, 0xE2, 0x41, 0xB5, 0xDB, 0xD0, 0xD7, 0x2D, 0x09, 0x89, 0x37, 0xAF, 0xEB, 0xC5,
+0x3E, 0xB1, 0x65, 0x38, 0x6E, 0x74, 0x22, 0x97, 0xEB, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0xE0, 0xA6, 0xA7, 0xE5, 0xA8, 0x8B, 0x00, 0x77, 0x99, 0x18, 0x1C, 0x9D,
+0x0C, 0x97, 0x91, 0x9C, 0x58, 0x02, 0x27, 0x24, 0xCD, 0x49, 0x8D, 0x23, 0x9D, 0xBD, 0x5C, 0xA8,
+0xD4, 0x59, 0x95, 0x99, 0x63, 0x5D, 0x25, 0x70, 0x42, 0x4C, 0xB1, 0x2D, 0xF0, 0xAF, 0x6B, 0x0D,
+0xBB, 0x36, 0xF5, 0x63, 0x7F, 0xD8, 0x9E, 0xD0, 0xD3, 0xD5, 0xAE, 0xAA, 0x60, 0x39, 0x0A, 0x02,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x20, 0x02, 0x85, 0xD8,
+0xD5, 0x01, 0x8E, 0xBE, 0x3C, 0x53, 0x33, 0xB3, 0xE1, 0xFC, 0xF5, 0xD1, 0x30, 0xC6, 0x04, 0x76,
+0xD4, 0xDA, 0x66, 0x67, 0xEA, 0xC6, 0x47, 0x88, 0x16, 0x27, 0xEA, 0x9C, 0xA9, 0x71, 0x92, 0xB4,
+0x4E, 0x7D, 0xEA, 0xE2, 0x3E, 0x14, 0x46, 0xF0, 0x62, 0x3E, 0x3B, 0xF3, 0xCF, 0x63, 0x04, 0xEC,
+0x3D, 0x3B, 0x36, 0x85, 0x75, 0x65, 0xA7, 0x89, 0x1B, 0x9C, 0xBE, 0xE5, 0xB2, 0x3B, 0x09, 0x81,
+0xB2, 0x47, 0xEC, 0x9D, 0x34, 0xDA, 0xA5, 0xAF, 0x05, 0x81, 0x82, 0xC0, 0x8D, 0x22, 0x50, 0x88,
+0xDD, 0x22, 0xC8, 0x4D, 0x82, 0xD8, 0x9D, 0xC2, 0x8E, 0x13, 0xFC, 0x2B, 0xC7, 0x1C, 0x43, 0x28,
+0x92, 0x41, 0x35, 0x5D, 0x96, 0x87, 0x4E, 0x54, 0xBC, 0xE8, 0xA2, 0x37, 0x9E, 0x94, 0xCD, 0x8B,
+0xB5, 0x20, 0xA5, 0x09, 0xD4, 0x39, 0x12, 0xBB, 0x03, 0xDB, 0x37, 0x94, 0xA4, 0xC4, 0x37, 0x3A,
+0x7B, 0xCB, 0x75, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x54, 0x10,
+0x28, 0xC4, 0xAE, 0xCE, 0x84, 0x10, 0xFF, 0x3A, 0x44, 0xC4, 0x1E, 0xBE, 0x70, 0x4D, 0x02, 0x27,
+0x64, 0x2B, 0x31, 0xA4, 0x3E, 0xA9, 0x9F, 0x8C, 0x98, 0xA4, 0x8D, 0x2A, 0x9D, 0xFE, 0x15, 0x6B,
+0xAA, 0xE5, 0xA8, 0xA3, 0x6A, 0x57, 0x31, 0xAE, 0x9A, 0x29, 0x57, 0x76, 0xB0, 0x60, 0x62, 0xE2,
+0xD6, 0xB6, 0xB0, 0x7B, 0xF3, 0xBA, 0xD0, 0x5B, 0xA2, 0x61, 0xCB, 0xC7, 0xB2, 0x20, 0xB0, 0x24,
+0x02, 0x65, 0x8F, 0xD8, 0x32, 0x41, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x63, 0x08, 0x14, 0x62,
+0x57, 0x07, 0x27, 0xF2, 0xAF, 0x31, 0x10, 0xBB, 0xD3, 0xD7, 0xC6, 0x02, 0x36, 0x9C, 0x50, 0xDF,
+0xBA, 0x39, 0xDD, 0x1F, 0xD6, 0x0F, 0x4F, 0x4E, 0xCC, 0xD7, 0x1A, 0xF4, 0xEA, 0xE6, 0x58, 0x57,
+0xE7, 0x52, 0x61, 0x29, 0x2B, 0xFF, 0xB0, 0x32, 0x94, 0x6C, 0x6D, 0x45, 0x62, 0xE2, 0xD6, 0xB0,
+0xAE, 0xB7, 0x2B, 0x6C, 0x44, 0xF0, 0x44, 0x47, 0x09, 0x9A, 0x68, 0x6C, 0xB6, 0x96, 0x52, 0x05,
+0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x2C, 0x89, 0x40, 0x21, 0x76, 0x35,
+0xF0, 0x50, 0x19, 0x98, 0x43, 0xA0, 0xC4, 0x08, 0x92, 0x12, 0x5F, 0x45, 0xF0, 0x84, 0x88, 0x6C,
+0x88, 0x86, 0xA5, 0xBF, 0x9C, 0x64, 0x3C, 0xF1, 0x3D, 0x61, 0x2D, 0x12, 0x36, 0x06, 0xBF, 0xC6,
+0xD4, 0xC5, 0x22, 0xC6, 0x81, 0xC3, 0x99, 0x8A, 0xA7, 0x2F, 0x55, 0xD4, 0x13, 0x4B, 0x2E, 0x9F,
+0x68, 0x62, 0xE2, 0x1D, 0xD8, 0x6D, 0xA2, 0xEC, 0x34, 0x51, 0x3E, 0xA1, 0x05, 0x81, 0xE5, 0x11,
+0x28, 0xFE, 0x75, 0xCB, 0x63, 0x54, 0x4A, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x01, 0x22, 0x50, 0x88,
+0x5D, 0x9D, 0x79, 0x30, 0x3D, 0x33, 0x17, 0xCE, 0x21, 0x70, 0x62, 0x74, 0x52, 0x52, 0x13, 0x23,
+0x70, 0x62, 0x3A, 0x05, 0x47, 0x98, 0x20, 0xA7, 0x7A, 0x5C, 0x4D, 0x94, 0xEC, 0x72, 0x73, 0xCA,
+0x48, 0x9D, 0xEE, 0x38, 0x81, 0x88, 0x58, 0xA4, 0x39, 0xE9, 0x6C, 0x2F, 0x43, 0xB0, 0x1C, 0x6C,
+0xE5, 0xFD, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x1A, 0x43, 0xA0,
+0xB0, 0x8A, 0x3A, 0x38, 0x8D, 0x23, 0x31, 0xF1, 0x91, 0x0B, 0x83, 0x61, 0x06, 0xAA, 0x1C, 0x53,
+0x90, 0xB4, 0x80, 0xD8, 0x49, 0xF4, 0x6B, 0xCE, 0xE3, 0x20, 0xBF, 0x69, 0x4A, 0x3B, 0xF3, 0xA3,
+0x63, 0x4A, 0x14, 0x77, 0xA8, 0xB3, 0x18, 0x0B, 0xAA, 0x7F, 0x9E, 0xF1, 0x84, 0xE6, 0x5C, 0xB9,
+0x9C, 0x3B, 0x4E, 0xA0, 0x60, 0x3B, 0xFC, 0xEB, 0x76, 0x6D, 0x1C, 0x00, 0xB1, 0x2B, 0x7B, 0xC3,
+0x36, 0x36, 0x55, 0x4B, 0xA9, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x96, 0x43, 0xA0, 0x10, 0xBB, 0x3A, 0x08, 0x4D, 0x32, 0x31, 0xF1, 0xA5, 0xE1, 0x30, 0x43, 0x07,
+0x3B, 0xB2, 0x37, 0xA4, 0x3A, 0x91, 0xBF, 0x0B, 0x04, 0xBA, 0xEC, 0x44, 0x5D, 0xF1, 0x4E, 0x69,
+0x9D, 0xFC, 0xE7, 0x39, 0xF0, 0x2C, 0x70, 0xA2, 0x1D, 0x4A, 0xDD, 0x8E, 0x0D, 0x7D, 0x85, 0xD8,
+0x2D, 0x37, 0x43, 0xCB, 0xFB, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x34, 0x8C, 0x40, 0x21, 0x76, 0x06, 0x95, 0xA8, 0x6B, 0xA2, 0xBA, 0xB5, 0x20, 0xC5, 0xC9, 0x5C,
+0x38, 0x79, 0x6D, 0x14, 0x8A, 0x1D, 0xFD, 0xE2, 0xB8, 0x3F, 0xAC, 0xA5, 0x3C, 0x51, 0x6F, 0x39,
+0x7D, 0x88, 0xD3, 0x9C, 0xC7, 0xC9, 0xDA, 0xCE, 0x14, 0xF6, 0x9E, 0xF8, 0xE1, 0x59, 0x5D, 0x52,
+0xC2, 0x7D, 0xEB, 0xF8, 0x14, 0xBE, 0x75, 0x9E, 0xEA, 0x64, 0xDB, 0xFA, 0x9E, 0x12, 0x38, 0xD1,
+0xF0, 0x54, 0x2D, 0x05, 0xEF, 0x54, 0x04, 0x4A, 0x44, 0xEC, 0x9D, 0x3A, 0xF2, 0xA5, 0xDF, 0x05,
+0x81, 0x82, 0xC0, 0x8D, 0x20, 0x50, 0x88, 0x5D, 0x0D, 0x6A, 0x33, 0xB3, 0x73, 0xE1, 0xEA, 0xC8,
+0x44, 0xB8, 0x36, 0x36, 0x85, 0x20, 0x0A, 0xBC, 0x09, 0x33, 0xEC, 0xBC, 0xEC, 0x11, 0xEB, 0x87,
+0x49, 0x73, 0x95, 0x3F, 0x66, 0x66, 0x35, 0x62, 0xA7, 0x64, 0x2E, 0x97, 0xF0, 0x94, 0xF8, 0x49,
+0xFA, 0x13, 0x2A, 0x76, 0x78, 0x74, 0xB6, 0xB7, 0x4B, 0x62, 0xE2, 0xB6, 0xD6, 0xB2, 0xDB, 0xC4,
+0x8D, 0x4C, 0xDC, 0x72, 0x4D, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02,
+0x0B, 0x11, 0x28, 0xC4, 0xAE, 0x06, 0x13, 0x26, 0x24, 0x3E, 0x79, 0x79, 0x44, 0xCC, 0xB0, 0x54,
+0xEF, 0xE6, 0x67, 0xA6, 0xE2, 0x56, 0x62, 0xE6, 0x3A, 0x57, 0x93, 0x9B, 0x2E, 0x6E, 0x1F, 0xAB,
+0xFB, 0xC7, 0x66, 0xB9, 0xEB, 0xA2, 0x7F, 0x9D, 0x47, 0xD2, 0xF2, 0x5D, 0x28, 0x76, 0xAD, 0x20,
+0x73, 0xDD, 0x20, 0x76, 0x8C, 0x88, 0x2D, 0xD1, 0x7E, 0xE5, 0x63, 0x59, 0x10, 0x58, 0x1C, 0x01,
+0x57, 0xD1, 0x0B, 0x46, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xD0, 0x18, 0x02, 0xF0, 0xE9,
+0xAF, 0xDD, 0x00, 0xB5, 0xB1, 0x0B, 0xD7, 0x5A, 0x29, 0x87, 0xE1, 0x1A, 0x52, 0x9C, 0xFC, 0xF6,
+0x73, 0x1F, 0x86, 0xFF, 0xF5, 0xD5, 0xE3, 0x61, 0x72, 0x12, 0xE9, 0x4E, 0xAE, 0x9D, 0x0F, 0x61,
+0x72, 0x4C, 0xF3, 0xCF, 0xCD, 0xB7, 0x42, 0x6C, 0xF3, 0xC8, 0x08, 0x90, 0x3E, 0x10, 0xB4, 0x56,
+0x98, 0x64, 0xE7, 0x19, 0x48, 0x21, 0x4A, 0x1C, 0x5E, 0x4B, 0x30, 0x05, 0xCE, 0xD1, 0xB4, 0x8B,
+0x5C, 0x75, 0x3C, 0x24, 0xC1, 0xB1, 0xE4, 0x40, 0xC1, 0xEB, 0x81, 0x8D, 0x61, 0xBE, 0xBD, 0x23,
+0x3C, 0xB8, 0x63, 0x43, 0xF8, 0xBF, 0xFD, 0xFA, 0x33, 0x61, 0xEF, 0xE6, 0xFE, 0xA6, 0x42, 0xC9,
+0x7D, 0x6F, 0xC7, 0xA7, 0x66, 0xC3, 0xE8, 0xC4, 0x14, 0x92, 0x2F, 0xE7, 0x4A, 0xA4, 0xA6, 0x65,
+0xF1, 0x43, 0xF5, 0x46, 0x0B, 0x0C, 0xF9, 0xD8, 0xA2, 0xA2, 0x56, 0x10, 0xAB, 0x59, 0x71, 0x7D,
+0x59, 0x54, 0x8A, 0x99, 0xB9, 0x35, 0xF7, 0x4C, 0x6A, 0xAF, 0xBF, 0x5C, 0x71, 0xD5, 0x4D, 0x45,
+0xBF, 0x7A, 0x33, 0x12, 0xFC, 0x75, 0x48, 0x4E, 0xCD, 0x00, 0x9A, 0x66, 0xB7, 0x9B, 0xF3, 0x73,
+0x7C, 0x72, 0x3A, 0x0C, 0x8D, 0x4F, 0x86, 0x69, 0xDF, 0x5D, 0xC5, 0x9B, 0xE7, 0x01, 0x41, 0x79,
+0x73, 0x6B, 0xCF, 0xC5, 0x48, 0xA1, 0x2C, 0x09, 0xB7, 0x75, 0x42, 0xFE, 0xA4, 0x7F, 0x6C, 0xEE,
+0xD7, 0x00, 0x5D, 0x53, 0x1F, 0x6B, 0xE9, 0xE9, 0x6C, 0x0B, 0x7D, 0x35, 0x7B, 0x26, 0x17, 0x62,
+0x77, 0x0B, 0x27, 0x68, 0xB9, 0x75, 0x41, 0xA0, 0x20, 0xF0, 0x89, 0x44, 0xA0, 0x10, 0xBB, 0x9A,
+0x61, 0x3B, 0x8B, 0x34, 0x27, 0xFF, 0xF5, 0x9F, 0xBF, 0x16, 0x5E, 0x3A, 0x71, 0x39, 0xCC, 0x4E,
+0x4D, 0x86, 0xB9, 0xCB, 0xA7, 0x11, 0x15, 0x3B, 0x85, 0x52, 0x4A, 0xDC, 0x48, 0xE2, 0x94, 0xE5,
+0x61, 0x29, 0xA2, 0x19, 0x95, 0x7E, 0x78, 0xF8, 0x3B, 0x47, 0x9F, 0x3B, 0x14, 0x41, 0xEA, 0x61,
+0xF5, 0xBD, 0x63, 0x31, 0xD3, 0x43, 0xA9, 0xE4, 0x91, 0xF0, 0xCD, 0x23, 0x12, 0xB6, 0x65, 0xDD,
+0xE6, 0xD0, 0xDA, 0xDE, 0x19, 0x3E, 0x73, 0x60, 0x6B, 0xF8, 0xCF, 0x7E, 0xF1, 0x89, 0xB0, 0x13,
+0x01, 0x14, 0xCD, 0x3C, 0xA6, 0x61, 0x6A, 0x3E, 0x7B, 0x75, 0x24, 0x1C, 0xBD, 0x70, 0x3D, 0x8C,
+0x4C, 0xB2, 0x5F, 0x71, 0x35, 0x4F, 0xB9, 0x6F, 0x22, 0x67, 0x5A, 0x8A, 0xD8, 0xA9, 0xBF, 0x61,
+0x5C, 0xD6, 0x6D, 0x51, 0x97, 0xBE, 0xA6, 0x2A, 0xED, 0xD9, 0x72, 0xC4, 0x8E, 0xA4, 0xD7, 0x83,
+0x53, 0x78, 0xB5, 0x6A, 0x9F, 0x72, 0xC8, 0x4B, 0xAF, 0x91, 0x60, 0xDB, 0x7D, 0x17, 0x10, 0x3B,
+0x89, 0x5B, 0x5E, 0x48, 0x90, 0x64, 0xBC, 0x70, 0xFD, 0x52, 0x81, 0x2F, 0xCD, 0x1C, 0x80, 0xEC,
+0x5E, 0x5D, 0x1D, 0x6D, 0xE1, 0x01, 0x10, 0xFC, 0x2D, 0xFD, 0x5D, 0xA2, 0xE2, 0x36, 0xF3, 0x98,
+0xC1, 0x4E, 0x2A, 0xA7, 0x2F, 0x0D, 0x86, 0xF7, 0xCE, 0x5C, 0x0C, 0xD7, 0x47, 0xC6, 0x2D, 0x77,
+0x36, 0xE7, 0xB7, 0xCE, 0xEB, 0x34, 0x86, 0x74, 0x1F, 0xB0, 0x07, 0x1B, 0x28, 0x29, 0x7B, 0xF2,
+0xD7, 0x54, 0x9D, 0xB5, 0xE5, 0xFA, 0x17, 0x9F, 0x00, 0x62, 0x2E, 0xFD, 0xD1, 0xCF, 0x42, 0x9B,
+0x5C, 0xA3, 0x3F, 0x70, 0x78, 0xC8, 0xAC, 0x89, 0xF7, 0xD0, 0x73, 0x2C, 0xB3, 0x77, 0x53, 0x5F,
+0xB8, 0x6B, 0x0B, 0x23, 0xC5, 0x93, 0x21, 0xA1, 0x10, 0xBB, 0x66, 0xCE, 0x8A, 0x72, 0xAF, 0x82,
+0x40, 0x41, 0x60, 0x2D, 0x20, 0x50, 0x88, 0x5D, 0x36, 0x8A, 0xB3, 0x70, 0xAA, 0x3B, 0x7A, 0x71,
+0x28, 0xFC, 0x57, 0x7F, 0xF0, 0x52, 0x38, 0x71, 0x65, 0x24, 0xCC, 0x43, 0xA9, 0x13, 0x62, 0xC7,
+0x00, 0x0A, 0x61, 0x6D, 0x89, 0xD8, 0xCD, 0x83, 0xC8, 0x71, 0x31, 0x96, 0x85, 0x07, 0xCA, 0x1C,
+0x5F, 0x8B, 0x68, 0x07, 0x12, 0x42, 0x25, 0xCF, 0xF9, 0x84, 0x2C, 0x64, 0x5C, 0xE7, 0x58, 0xA6,
+0xAD, 0x3D, 0x84, 0x75, 0x5B, 0x42, 0x47, 0x47, 0x67, 0xF8, 0xEA, 0x03, 0xBB, 0xC2, 0x3F, 0xF9,
+0xEA, 0xC3, 0x61, 0xDB, 0xBA, 0x9E, 0xA6, 0xCC, 0x23, 0xF2, 0x1A, 0x6E, 0x93, 0x76, 0xF2, 0xF2,
+0x60, 0x38, 0x7C, 0xFE, 0x7A, 0x38, 0x06, 0x62, 0x37, 0x3A, 0x85, 0xFC, 0x7C, 0xF1, 0xA8, 0x12,
+0x32, 0x57, 0xEC, 0x64, 0x89, 0x5D, 0xC0, 0x39, 0x74, 0x71, 0x77, 0x62, 0x57, 0xE5, 0x58, 0xB6,
+0xAD, 0x5A, 0xDE, 0x2B, 0x89, 0x04, 0x76, 0x43, 0xB5, 0xC5, 0x9D, 0x54, 0x2A, 0xB5, 0x85, 0x3F,
+0x0B, 0x32, 0xA9, 0x12, 0xBB, 0xAC, 0x01, 0x91, 0xD8, 0xE5, 0x64, 0xCD, 0xC7, 0xA0, 0xA6, 0xA9,
+0xBC, 0x0C, 0x03, 0x91, 0xF5, 0x4C, 0x09, 0xC8, 0x52, 0x88, 0xE7, 0x6F, 0x66, 0xED, 0xB9, 0xA9,
+0x83, 0x64, 0x24, 0xB3, 0x0B, 0x0A, 0xD5, 0x63, 0xBB, 0x37, 0x86, 0x47, 0xF7, 0x6C, 0x0A, 0xDD,
+0x20, 0x79, 0xCD, 0x3A, 0xA8, 0xD4, 0x9D, 0xBC, 0x74, 0x2D, 0xBC, 0xFB, 0xD1, 0xF9, 0xF0, 0xDE,
+0xE9, 0x4B, 0x61, 0x70, 0x8C, 0xC4, 0x4E, 0xC9, 0x1A, 0x27, 0x31, 0xE7, 0xB5, 0x93, 0x30, 0x27,
+0x75, 0xF1, 0x1C, 0xDE, 0x8F, 0x44, 0x8F, 0xE5, 0xF9, 0x63, 0xC5, 0xD4, 0x37, 0xE1, 0x72, 0xBC,
+0x5E, 0x38, 0x1D, 0xEB, 0xD0, 0x40, 0x21, 0xFA, 0x91, 0xB2, 0x0C, 0x3F, 0x03, 0xF2, 0x79, 0x88,
+0xC4, 0x8E, 0x9F, 0x19, 0x3D, 0xD7, 0x86, 0x6B, 0xF6, 0x43, 0xBD, 0xE6, 0x0F, 0x9E, 0x8D, 0x7D,
+0x20, 0xBA, 0x4E, 0x02, 0x2D, 0x08, 0xA9, 0x59, 0xD8, 0x94, 0xFB, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x4F, 0x3A, 0x02, 0x85, 0xD8, 0x71, 0xA1, 0xB1, 0xC5, 0x63, 0x02, 0x69, 0x4E, 0xDE, 0xF8,
+0xE8, 0x4A, 0xF8, 0xA7, 0x7F, 0xFA, 0x6A, 0xB8, 0x82, 0x00, 0x8A, 0x30, 0x7A, 0x2D, 0xCC, 0x5D,
+0xBF, 0x68, 0x3E, 0x76, 0x5C, 0xC4, 0x94, 0xCC, 0x90, 0x1A, 0x88, 0xB2, 0x61, 0x24, 0x83, 0xA4,
+0x8F, 0xAF, 0x45, 0xC0, 0x13, 0x73, 0xAD, 0x97, 0x33, 0xE5, 0xC1, 0x59, 0x1E, 0x94, 0xBA, 0x96,
+0xF5, 0x5B, 0x43, 0x57, 0x67, 0x47, 0xF8, 0xD5, 0xC7, 0xF7, 0x85, 0x7F, 0xF8, 0xEC, 0x7D, 0x61,
+0x53, 0x7F, 0x77, 0x53, 0xE6, 0x10, 0x4D, 0xB0, 0xE7, 0x10, 0xE9, 0xFB, 0xA7, 0x2F, 0x7D, 0x10,
+0x3E, 0x38, 0x7F, 0x0D, 0xE6, 0xD8, 0x69, 0xD9, 0x25, 0x2D, 0x97, 0xD7, 0x84, 0xD3, 0xB8, 0xFA,
+0x22, 0xE6, 0x64, 0xB5, 0x1E, 0x8B, 0x49, 0xB6, 0xD6, 0xC1, 0x30, 0x9A, 0xA5, 0x55, 0x89, 0x91,
+0xB2, 0x5E, 0x41, 0x24, 0x47, 0xB9, 0xE2, 0xA7, 0xCA, 0x99, 0x50, 0x3C, 0xE1, 0x71, 0x35, 0x0C,
+0x8A, 0x84, 0x41, 0xEE, 0x61, 0x44, 0xCC, 0xDF, 0xCE, 0x1A, 0xA5, 0x4F, 0x95, 0x4C, 0xB7, 0x0A,
+0x8B, 0x76, 0x61, 0x34, 0x36, 0x34, 0xAA, 0x76, 0x7E, 0x99, 0xDE, 0xD5, 0x89, 0xA8, 0x95, 0x97,
+0xE1, 0xC9, 0xEE, 0xEF, 0x8D, 0xE2, 0xD5, 0x52, 0xAD, 0x4B, 0xAD, 0xA9, 0xDE, 0x0A, 0x19, 0x5C,
+0x8C, 0x19, 0x46, 0xF3, 0xA4, 0x0E, 0xA9, 0xCF, 0x82, 0x0C, 0x56, 0x39, 0x1F, 0x33, 0xDF, 0xA0,
+0xC0, 0xBE, 0x8D, 0x7D, 0xE1, 0xEF, 0x3E, 0x75, 0x20, 0x6C, 0x06, 0x99, 0x69, 0xD6, 0x71, 0xFA,
+0xD2, 0xF5, 0xF0, 0xE7, 0x2F, 0xBC, 0x13, 0x5E, 0x38, 0x7C, 0x32, 0x0C, 0xC3, 0x14, 0x3B, 0xC7,
+0xFD, 0x90, 0x49, 0xD0, 0xD8, 0x66, 0xFA, 0x80, 0x0A, 0x61, 0xD3, 0x11, 0x12, 0xEC, 0x40, 0xBE,
+0xDA, 0xF0, 0x90, 0xF9, 0xCE, 0xBF, 0x44, 0x08, 0x09, 0xB6, 0x85, 0xD0, 0xD9, 0x79, 0x39, 0x67,
+0xC4, 0x50, 0x76, 0xC8, 0x03, 0xA9, 0x6B, 0x01, 0x5B, 0x23, 0x96, 0x5E, 0x96, 0xC4, 0x4E, 0x05,
+0x3F, 0x57, 0x01, 0xE9, 0x6F, 0xAA, 0x58, 0x73, 0x2A, 0x6E, 0xEA, 0xED, 0x0C, 0xBF, 0xF2, 0xD8,
+0xBE, 0x70, 0x70, 0xEB, 0x40, 0xE8, 0x2A, 0xF9, 0x1D, 0x9B, 0x35, 0x1D, 0xCA, 0x7D, 0x0A, 0x02,
+0x05, 0x81, 0x35, 0x86, 0x40, 0x21, 0x76, 0xB2, 0xD0, 0x6A, 0xA0, 0x04, 0xFD, 0xEB, 0xFE, 0xFA,
+0xBD, 0x73, 0xE1, 0xBF, 0xFF, 0xDE, 0xBB, 0x61, 0x04, 0x3E, 0x68, 0xF3, 0x83, 0x17, 0xC2, 0xFC,
+0xC8, 0x35, 0xA3, 0x20, 0x46, 0x0E, 0x8C, 0xC1, 0xE4, 0xC4, 0x8E, 0x64, 0x4E, 0x15, 0x0A, 0x56,
+0x96, 0x11, 0x3B, 0x9E, 0x97, 0xD5, 0x52, 0x36, 0x24, 0x0B, 0x2D, 0x9D, 0xDD, 0x30, 0xC5, 0x6E,
+0x0D, 0xBD, 0x5D, 0x1D, 0xE1, 0xEF, 0x7F, 0xE6, 0x50, 0xF8, 0x8D, 0x4F, 0x1F, 0x0A, 0xEB, 0xB1,
+0x98, 0xAD, 0xF6, 0x41, 0x72, 0x43, 0x9F, 0xBA, 0x17, 0x0F, 0x9F, 0x09, 0x7F, 0xF8, 0xC2, 0x07,
+0xE1, 0xD4, 0xB5, 0x61, 0x31, 0x7D, 0xC9, 0xD2, 0x9D, 0xAC, 0x5E, 0xF2, 0xDA, 0x49, 0x97, 0x92,
+0x12, 0xF6, 0x49, 0x19, 0x5D, 0xC6, 0xD5, 0xAC, 0xB9, 0xDA, 0x5F, 0x21, 0x4E, 0x4C, 0xBA, 0x5C,
+0x97, 0xD8, 0xD9, 0x95, 0x72, 0x71, 0xA4, 0x58, 0x6A, 0x96, 0xD3, 0x7F, 0x94, 0xE8, 0xF0, 0x4E,
+0x24, 0x76, 0xF6, 0x4A, 0x22, 0x87, 0xFD, 0xC8, 0xC8, 0x52, 0x7E, 0x4D, 0xE5, 0xB9, 0xB3, 0xB8,
+0x5A, 0x12, 0xC8, 0x3A, 0xFC, 0x5E, 0x89, 0xB1, 0x2A, 0xB9, 0xC8, 0x89, 0xA5, 0x5C, 0x47, 0x62,
+0x59, 0x43, 0xEC, 0xD4, 0xCE, 0x2E, 0x2D, 0x49, 0x5C, 0x4E, 0xDB, 0x9D, 0xE3, 0x91, 0x4C, 0xC0,
+0x76, 0x36, 0xFB, 0xE3, 0x16, 0xE0, 0xFC, 0x7A, 0x7F, 0x4E, 0xB2, 0xBD, 0xB9, 0xAF, 0x33, 0xFC,
+0x93, 0x2F, 0x3D, 0x10, 0x76, 0x6D, 0xE8, 0x5D, 0xED, 0x69, 0x10, 0xA6, 0x90, 0x78, 0xFB, 0x02,
+0xC6, 0xFE, 0xBD, 0x93, 0xE7, 0xC3, 0x1F, 0xFD, 0xF8, 0xAD, 0xF0, 0xD6, 0xC9, 0x73, 0x82, 0x7B,
+0x3B, 0x02, 0x79, 0x5A, 0x41, 0xEC, 0x94, 0xC3, 0x51, 0x71, 0xB3, 0xF9, 0x6C, 0x23, 0x4F, 0xF2,
+0xA6, 0xA4, 0x0C, 0xA8, 0x81, 0xF8, 0x09, 0xE1, 0x73, 0xA5, 0xCE, 0xCF, 0x47, 0xB2, 0xA6, 0x4A,
+0x36, 0xD5, 0x3A, 0x0A, 0x76, 0xAD, 0xFC, 0x6B, 0x65, 0x84, 0x1C, 0x56, 0xD4, 0x40, 0x7D, 0x4F,
+0x94, 0x6F, 0xD4, 0xD9, 0xDB, 0xD1, 0x1E, 0xFE, 0xEE, 0xA7, 0x0E, 0x84, 0x47, 0xA0, 0x62, 0xD2,
+0xD7, 0xAE, 0x1C, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xB0, 0x72, 0x04, 0xB2, 0x15, 0x74,
+0xE5, 0x17, 0xAF, 0xB5, 0x2B, 0x86, 0x26, 0xA6, 0xC3, 0x61, 0x98, 0x62, 0x99, 0xBF, 0x4E, 0x44,
+0xB7, 0xE9, 0x89, 0x2C, 0xB1, 0x70, 0x64, 0x1A, 0xF6, 0x04, 0x85, 0x74, 0xEB, 0x89, 0x48, 0x48,
+0x54, 0x2E, 0xE2, 0x3F, 0xBE, 0xD4, 0xA7, 0xE7, 0x4A, 0x44, 0xDA, 0x24, 0xC8, 0x82, 0x8B, 0x59,
+0x1F, 0x9C, 0xE6, 0x9B, 0xE5, 0x57, 0x35, 0x0F, 0x45, 0xE6, 0xCA, 0xD0, 0x58, 0xF8, 0x9B, 0x77,
+0x4E, 0x84, 0xCB, 0x43, 0x23, 0xA1, 0xBD, 0x65, 0x0E, 0xAD, 0x99, 0x43, 0x7A, 0xBE, 0x19, 0x64,
+0x73, 0x99, 0xD5, 0xC7, 0x0C, 0x9E, 0xC3, 0x89, 0x3E, 0xFF, 0x3B, 0x07, 0x3F, 0xAC, 0x78, 0x8E,
+0xCF, 0xFD, 0x35, 0xFC, 0xF4, 0xD2, 0xF3, 0xD9, 0x30, 0xC3, 0xEB, 0xFC, 0xFD, 0x78, 0x4D, 0xCD,
+0x39, 0xBB, 0x86, 0xBE, 0x5D, 0x2C, 0xCB, 0xBF, 0xFE, 0x98, 0x45, 0x04, 0xB2, 0x9E, 0x43, 0xBD,
+0x00, 0x9F, 0x7F, 0xE5, 0x81, 0x7C, 0x82, 0x5A, 0x2F, 0xFF, 0xF2, 0xB5, 0x95, 0x41, 0xF9, 0xF8,
+0x5C, 0xCE, 0xE1, 0x7A, 0x29, 0xCB, 0x3E, 0xCD, 0xCA, 0x43, 0xEE, 0x23, 0xE7, 0xB4, 0x6E, 0xED,
+0x87, 0xD5, 0x35, 0xED, 0xF5, 0x66, 0x75, 0xC7, 0xF6, 0xE7, 0xEF, 0xD5, 0xF6, 0xA1, 0xFE, 0x6B,
+0xBF, 0x67, 0xED, 0x5F, 0xDE, 0x77, 0x5E, 0x1E, 0xD8, 0x7F, 0x98, 0x6D, 0x43, 0xDA, 0x1C, 0x8E,
+0x85, 0x52, 0x66, 0xA8, 0x8E, 0x78, 0xCC, 0x42, 0x36, 0x65, 0x5B, 0x9B, 0x11, 0xC3, 0x34, 0x02,
+0x75, 0xEE, 0x47, 0x6F, 0x1F, 0x0D, 0xDF, 0x7B, 0xFD, 0x83, 0x70, 0xFA, 0xF2, 0x35, 0x31, 0x7F,
+0x76, 0xE0, 0x1F, 0xEE, 0x5B, 0x1C, 0x1F, 0x46, 0xE2, 0x48, 0xFC, 0x85, 0xE4, 0xF1, 0xBD, 0x8C,
+0xBC, 0x49, 0x70, 0x50, 0x8D, 0x39, 0xD6, 0x03, 0x86, 0xF4, 0xA7, 0x82, 0xFD, 0x27, 0xBF, 0x0C,
+0x54, 0xE9, 0x25, 0x61, 0x16, 0xD2, 0xCC, 0x80, 0x22, 0xF4, 0x9F, 0x78, 0xC4, 0x71, 0x91, 0xBE,
+0xCF, 0xC9, 0x0F, 0x0D, 0x7E, 0x1E, 0xA8, 0x9A, 0xD3, 0x25, 0x82, 0x47, 0x33, 0x30, 0x59, 0x6B,
+0xDF, 0x61, 0xA5, 0x3F, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x10, 0x3B, 0x9B, 0x03, 0x54, 0x4F,
+0x46, 0x40, 0xEC, 0x4E, 0x5D, 0x1B, 0xC3, 0xC2, 0x82, 0x93, 0x4C, 0x4A, 0x0C, 0xB2, 0x53, 0xCD,
+0x47, 0x97, 0x4F, 0x18, 0x27, 0x76, 0x7A, 0x8E, 0x0B, 0xB5, 0x70, 0x3A, 0x5D, 0x92, 0x6A, 0xFE,
+0x5A, 0x19, 0x53, 0x9F, 0xB8, 0x30, 0xF6, 0xC0, 0x1C, 0xEB, 0x7E, 0x44, 0xAB, 0x3D, 0x0D, 0x27,
+0xD1, 0x8F, 0x23, 0x67, 0x2F, 0xCB, 0x63, 0x74, 0x62, 0x22, 0xCC, 0x60, 0xF1, 0x9C, 0xC4, 0x3E,
+0xB8, 0x13, 0x30, 0xC7, 0xFA, 0x23, 0xBE, 0x96, 0xF3, 0x33, 0x88, 0x98, 0xD4, 0xBF, 0x13, 0xD9,
+0x6B, 0x9E, 0x1B, 0xE7, 0x39, 0x44, 0xD5, 0xF2, 0xC1, 0xE8, 0xDA, 0x89, 0xA9, 0x39, 0xFB, 0xAB,
+0xAF, 0x17, 0x7F, 0xCC, 0x69, 0xD9, 0xE9, 0xF9, 0x30, 0x36, 0x85, 0x88, 0x4C, 0xFC, 0x1D, 0xE7,
+0x5F, 0x7B, 0xCE, 0x73, 0x63, 0x7C, 0x8F, 0xE7, 0xE5, 0x6F, 0xB0, 0x47, 0x3A, 0x3F, 0x06, 0xD2,
+0x97, 0xCE, 0xDB, 0xFB, 0x18, 0xA2, 0x71, 0x2B, 0xCB, 0xBF, 0x52, 0xAF, 0x3F, 0xF0, 0x1E, 0x86,
+0x54, 0xDE, 0xF7, 0xF7, 0xD2, 0xEB, 0x54, 0x6E, 0x02, 0xE5, 0xF9, 0x18, 0x47, 0xFD, 0xFA, 0x1C,
+0x6D, 0xC5, 0x63, 0x12, 0xAF, 0x27, 0xF9, 0xD7, 0x5F, 0xCB, 0x39, 0x7D, 0x9D, 0x1E, 0x2C, 0xE3,
+0x8F, 0xDA, 0xF7, 0x16, 0xBE, 0x9E, 0x32, 0xF2, 0x39, 0x8F, 0xF9, 0x45, 0x42, 0xD3, 0x1E, 0x4D,
+0xFA, 0xAB, 0x3B, 0x0B, 0x38, 0xBF, 0xAF, 0x8F, 0x8E, 0x87, 0xB7, 0x3F, 0x3A, 0x17, 0xDE, 0x81,
+0x6F, 0x1D, 0xFD, 0xEA, 0x5A, 0x11, 0x9D, 0xDD, 0xDA, 0xD5, 0x1F, 0x5A, 0xBA, 0x10, 0xC0, 0xD3,
+0xD9, 0x1B, 0x5A, 0x3A, 0xF0, 0xB7, 0xA3, 0x37, 0xCC, 0xF3, 0xD1, 0xDE, 0x03, 0x9F, 0xD0, 0x9E,
+0x30, 0xD7, 0xD6, 0x1D, 0x66, 0xF1, 0x98, 0x69, 0xEB, 0x0A, 0x33, 0xAD, 0x78, 0xB4, 0x74, 0x86,
+0xE9, 0xD6, 0xCE, 0x30, 0x15, 0xDA, 0xE5, 0x31, 0x39, 0xDF, 0x26, 0x8F, 0x29, 0xA8, 0xD3, 0x13,
+0x73, 0x78, 0xCC, 0xB6, 0x86, 0xF1, 0xD9, 0x16, 0x60, 0xC9, 0x07, 0x70, 0x97, 0x31, 0x9B, 0x87,
+0x3F, 0xE7, 0x1C, 0x82, 0x75, 0x66, 0xF1, 0x98, 0xC1, 0xE7, 0xCC, 0x1F, 0xD3, 0x61, 0x64, 0x7C,
+0x4A, 0x08, 0x39, 0x89, 0x1F, 0x3F, 0x0F, 0x5D, 0x1D, 0x54, 0xF0, 0x56, 0x17, 0x8B, 0x52, 0x7B,
+0x41, 0xA0, 0x20, 0x50, 0x10, 0x58, 0xCB, 0x08, 0xDC, 0xF1, 0xA6, 0x58, 0x55, 0x05, 0x5A, 0x44,
+0x25, 0x78, 0x15, 0xFE, 0x75, 0xFF, 0xCD, 0xB7, 0xDF, 0x09, 0x27, 0xAF, 0x8E, 0x62, 0x45, 0x1A,
+0x0C, 0xB3, 0x97, 0x4E, 0xC2, 0xFF, 0x68, 0x56, 0x35, 0x08, 0x75, 0x0E, 0x8A, 0x94, 0x4D, 0xCD,
+0x96, 0x7A, 0x5E, 0x83, 0x23, 0xF8, 0x97, 0x91, 0xAF, 0xEE, 0x49, 0xC6, 0x6A, 0xDD, 0xE8, 0xA6,
+0xD7, 0xB6, 0xF6, 0x0C, 0x84, 0xB9, 0xFE, 0xCD, 0x30, 0xBF, 0x76, 0x85, 0xFF, 0xEB, 0xCF, 0x3E,
+0x18, 0xBE, 0x74, 0xDF, 0xCE, 0xD0, 0x0D, 0x07, 0xFA, 0xD5, 0x3E, 0x2E, 0x0D, 0x8E, 0x86, 0x7F,
+0xF5, 0xED, 0x17, 0xC5, 0x14, 0x3B, 0x0D, 0x85, 0x88, 0x44, 0x84, 0x24, 0x8B, 0x8B, 0xBD, 0x4A,
+0x93, 0x54, 0x55, 0xD4, 0x2C, 0xAB, 0x7D, 0xD0, 0xC0, 0x04, 0x51, 0x14, 0xC5, 0x4C, 0x2D, 0x4E,
+0x53, 0x4A, 0x59, 0xA5, 0x2B, 0x42, 0x63, 0xE5, 0x8C, 0x63, 0xA0, 0x56, 0x50, 0x2F, 0x93, 0xFA,
+0xED, 0x8E, 0xF5, 0x52, 0xCE, 0x30, 0xD3, 0xA2, 0x1A, 0x50, 0xA1, 0x76, 0x4D, 0x96, 0xD7, 0xC0,
+0x14, 0xFA, 0x64, 0x79, 0xFD, 0xDA, 0x30, 0x43, 0xC7, 0x09, 0x90, 0xDA, 0x7E, 0xE5, 0x52, 0xA9,
+0x91, 0x78, 0x93, 0x63, 0xA7, 0xD3, 0x72, 0x89, 0x5A, 0x57, 0xA9, 0x18, 0xB1, 0x0C, 0x0B, 0xE8,
+0xD8, 0x89, 0x99, 0x50, 0xCA, 0xE7, 0x49, 0xA3, 0xF9, 0x4A, 0x53, 0xD9, 0x48, 0x79, 0xB9, 0x25,
+0xC8, 0x86, 0x56, 0x62, 0x0D, 0xB0, 0x48, 0x5D, 0x6B, 0x6B, 0x8C, 0xC1, 0xAD, 0x5A, 0x5F, 0xB5,
+0xAC, 0x9D, 0xF3, 0x1E, 0x5A, 0x05, 0xF2, 0x87, 0xAE, 0x63, 0x03, 0xED, 0xF3, 0xD8, 0x2B, 0x58,
+0x53, 0xE4, 0x30, 0x60, 0xE0, 0x3F, 0xFC, 0xC2, 0x03, 0x61, 0xFB, 0xFA, 0xD5, 0x35, 0xC5, 0x32,
+0xA5, 0xC9, 0xEB, 0x47, 0x4E, 0x87, 0x7F, 0xFE, 0xE7, 0x3F, 0x10, 0x53, 0x6C, 0x3B, 0xCC, 0x9E,
+0x1D, 0xBD, 0xEB, 0x43, 0xDB, 0xC0, 0x36, 0x44, 0x2E, 0x74, 0x08, 0x1E, 0x82, 0xA8, 0x42, 0x15,
+0x0F, 0x99, 0x23, 0x04, 0x19, 0x7F, 0xF9, 0x7B, 0xC7, 0xCD, 0xF5, 0x92, 0xBD, 0x5B, 0x26, 0x80,
+0x0E, 0x9F, 0xE8, 0x90, 0xF6, 0x4F, 0x9A, 0x1D, 0x8A, 0xA1, 0x88, 0x75, 0x3A, 0xC2, 0x5A, 0x2F,
+0x95, 0x3B, 0xF9, 0x8B, 0x5B, 0xA3, 0xEA, 0xBD, 0x5B, 0xFA, 0x42, 0x77, 0x57, 0x67, 0x58, 0xDF,
+0xD3, 0x19, 0xFE, 0xE3, 0x2F, 0xDC, 0x87, 0xC8, 0xD8, 0x7E, 0xE0, 0x43, 0xF3, 0xBE, 0xBA, 0x48,
+0x94, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x1A, 0x47, 0xA0, 0xFC, 0x36, 0x06, 0x56,
+0x34, 0xFB, 0x5D, 0x1E, 0x9E, 0x08, 0xE7, 0x87, 0x26, 0xC2, 0x10, 0x54, 0x05, 0x59, 0x9F, 0xA6,
+0x91, 0xC3, 0x8E, 0x8B, 0x97, 0x91, 0x80, 0x05, 0xCA, 0x5D, 0x54, 0xE7, 0x74, 0x85, 0x92, 0x6B,
+0x1C, 0x77, 0x33, 0x3B, 0xE5, 0xC3, 0x20, 0xB4, 0x20, 0x33, 0x61, 0x75, 0x4B, 0x72, 0xE2, 0xC6,
+0x07, 0xEA, 0x46, 0x4B, 0xD2, 0x31, 0xFE, 0xFA, 0xC8, 0x58, 0x38, 0x76, 0xEE, 0x4A, 0x98, 0x9C,
+0x82, 0x3A, 0x82, 0x05, 0x7E, 0x12, 0xAA, 0xDB, 0x24, 0xFC, 0xAD, 0xA6, 0xA0, 0x3E, 0xD5, 0x7F,
+0xCC, 0xC6, 0xF3, 0x54, 0xAD, 0xA8, 0x32, 0xB1, 0xDC, 0x24, 0xFE, 0xF2, 0x21, 0xD7, 0xC4, 0x73,
+0x50, 0xAB, 0xE4, 0x35, 0xCA, 0x51, 0xE1, 0xC2, 0xDF, 0xF8, 0xF0, 0xD7, 0x52, 0x07, 0xCB, 0xD5,
+0xBE, 0x8F, 0x14, 0x81, 0x10, 0x46, 0xE3, 0x03, 0x0A, 0x8F, 0x3C, 0xF7, 0xBF, 0x60, 0x12, 0x93,
+0x50, 0x7F, 0x52, 0x19, 0x3C, 0x9F, 0xE3, 0x6B, 0xFB, 0xBB, 0xD4, 0x73, 0x79, 0x0F, 0xD7, 0xA3,
+0x8E, 0x29, 0xAB, 0x63, 0x0A, 0xE7, 0x20, 0x2A, 0xEA, 0x39, 0xBE, 0x6F, 0x65, 0xC0, 0x71, 0xF1,
+0x3A, 0x95, 0xF3, 0xF7, 0xFD, 0x3A, 0xD6, 0xC3, 0xEB, 0xB4, 0x8C, 0xF6, 0x25, 0xD6, 0x83, 0xE7,
+0xD3, 0xD6, 0x67, 0x7F, 0x6F, 0x1A, 0xFD, 0xE4, 0x23, 0xBE, 0xB6, 0x6B, 0x20, 0x94, 0xAA, 0x79,
+0x18, 0x0A, 0xEA, 0x0C, 0xF0, 0x9F, 0x87, 0x29, 0x7C, 0x0B, 0x7C, 0x2C, 0xF3, 0xF4, 0x1E, 0x37,
+0x3A, 0xCE, 0xCB, 0x5D, 0x37, 0x85, 0x7B, 0x9E, 0x46, 0x24, 0xEC, 0xD5, 0xE1, 0x31, 0x8C, 0x3F,
+0x24, 0x4C, 0x12, 0xD8, 0x0E, 0x44, 0x64, 0x43, 0xA9, 0x0B, 0xF8, 0x3B, 0xDF, 0xDE, 0x1D, 0xE6,
+0xDA, 0xBB, 0xF4, 0x01, 0x65, 0x6E, 0xB6, 0xF2, 0xE8, 0x14, 0xA5, 0x4E, 0xD4, 0xBA, 0x96, 0x8E,
+0x30, 0x1D, 0x3A, 0x54, 0xAD, 0xA3, 0x6A, 0x47, 0xC5, 0x6E, 0xCE, 0x1F, 0x8A, 0xE9, 0x04, 0x1F,
+0x54, 0x4B, 0xD1, 0xDF, 0xA4, 0xA0, 0xCE, 0x41, 0xA9, 0xD5, 0xC7, 0xB8, 0xA9, 0xBC, 0x54, 0x7F,
+0xA7, 0x00, 0x8A, 0x98, 0x67, 0xF1, 0x99, 0xE9, 0x45, 0x64, 0x70, 0x7F, 0x77, 0xBB, 0x90, 0xBA,
+0x72, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x8D, 0x21, 0x50, 0xBE, 0x41, 0x81, 0xDB,
+0x04, 0xC8, 0xCE, 0xE1, 0x0B, 0x43, 0xE1, 0x08, 0xFC, 0xEB, 0xA6, 0x19, 0x21, 0x48, 0x12, 0x36,
+0x39, 0x01, 0xF5, 0x02, 0x2B, 0xB9, 0xCB, 0x3F, 0x26, 0x4B, 0xB8, 0x0F, 0x51, 0x46, 0xE3, 0x54,
+0x55, 0x10, 0x75, 0x41, 0xD9, 0x5D, 0xAE, 0x78, 0xC8, 0xB0, 0x98, 0xDF, 0x9D, 0x9C, 0xA7, 0xF2,
+0x04, 0xD5, 0xA8, 0x13, 0x52, 0x45, 0x33, 0x4C, 0xB1, 0xF4, 0xDF, 0xBA, 0x34, 0x38, 0x12, 0x06,
+0x47, 0xC7, 0x60, 0x59, 0x26, 0xA1, 0x53, 0x3F, 0x35, 0x57, 0x21, 0x53, 0x84, 0xA2, 0xAA, 0x23,
+0x6C, 0x1B, 0x7D, 0xAF, 0x28, 0x8A, 0x31, 0x70, 0x42, 0x82, 0x2C, 0x4C, 0x54, 0x63, 0x7B, 0xE5,
+0x81, 0xAB, 0xFD, 0x3C, 0xCB, 0xC6, 0xBA, 0xA8, 0x82, 0xE1, 0x7D, 0xBE, 0xA7, 0x0F, 0x55, 0x73,
+0x58, 0x97, 0x5E, 0xAB, 0x6A, 0x9F, 0x3E, 0x78, 0x8E, 0xE6, 0x37, 0x5E, 0xA3, 0x7F, 0x59, 0xAF,
+0xFE, 0x35, 0x1F, 0x34, 0x96, 0x01, 0x64, 0xF2, 0xA0, 0x32, 0x24, 0xE6, 0x3A, 0x3E, 0xD7, 0xBF,
+0xBC, 0x4E, 0x7C, 0xB8, 0xEC, 0x3E, 0x06, 0x6F, 0xAA, 0x5B, 0xC6, 0x44, 0xC9, 0x39, 0xDF, 0x93,
+0x7B, 0xD9, 0x38, 0x69, 0x9B, 0xFC, 0x5A, 0xB6, 0x27, 0xBD, 0xA7, 0x22, 0xA2, 0xB5, 0xD3, 0xDA,
+0x92, 0xAB, 0xB6, 0x69, 0x4A, 0xE8, 0xCD, 0xF3, 0x3C, 0x6F, 0xFA, 0x5E, 0xA6, 0x4E, 0xE6, 0xEF,
+0x4B, 0x7F, 0xE8, 0x43, 0x46, 0xE2, 0x0C, 0xE6, 0x03, 0xF5, 0x74, 0x17, 0xF2, 0x18, 0x32, 0x41,
+0xF1, 0x6A, 0x1F, 0x13, 0x48, 0x71, 0x72, 0x04, 0x39, 0xEB, 0x26, 0x10, 0x44, 0xD3, 0x4E, 0x99,
+0x8C, 0xCA, 0x65, 0x97, 0xA9, 0x84, 0x48, 0xE7, 0x53, 0xF1, 0x83, 0x63, 0x7A, 0x1F, 0x7F, 0xC8,
+0x84, 0x56, 0x1F, 0x40, 0x51, 0xDC, 0xCC, 0x5F, 0xCE, 0xCB, 0x73, 0x2C, 0xDC, 0x5F, 0xD0, 0xC7,
+0xC5, 0xC7, 0x26, 0xFA, 0xDE, 0xA1, 0xDF, 0xF0, 0x2E, 0x95, 0x39, 0x90, 0xCF, 0x0D, 0x96, 0xEB,
+0x42, 0xCE, 0xBA, 0x36, 0xFA, 0xF9, 0xE1, 0xFD, 0xCD, 0x20, 0xB9, 0x1D, 0xA6, 0xD4, 0x15, 0xB5,
+0x6E, 0xB5, 0x67, 0x44, 0xA9, 0xBF, 0x20, 0x50, 0x10, 0x58, 0xAB, 0x08, 0x14, 0x62, 0x47, 0x62,
+0x07, 0xB2, 0xF3, 0xE1, 0xC5, 0x61, 0x04, 0x4E, 0x8C, 0x80, 0xD8, 0x89, 0xB1, 0x49, 0x14, 0xBB,
+0xA5, 0x55, 0xBA, 0x9A, 0x29, 0x61, 0x72, 0x5D, 0xCC, 0xB3, 0x5B, 0x79, 0x5B, 0xF5, 0x3C, 0xDF,
+0x27, 0x96, 0x11, 0x83, 0x1D, 0x8C, 0x2E, 0x6C, 0x82, 0x62, 0x47, 0x12, 0x77, 0x05, 0xC4, 0x6E,
+0x1C, 0xBB, 0x68, 0xCC, 0x42, 0x21, 0x92, 0x80, 0x04, 0x21, 0xAF, 0x46, 0x6A, 0x84, 0x88, 0x54,
+0xF9, 0x6B, 0xDE, 0xAC, 0xCA, 0x7B, 0x56, 0x4E, 0xB8, 0xAA, 0xF5, 0xCF, 0xDF, 0xF7, 0x73, 0x4B,
+0x95, 0x17, 0x72, 0x65, 0x8F, 0x54, 0x3E, 0x11, 0x39, 0xAD, 0x53, 0xB1, 0x52, 0x72, 0x57, 0x6D,
+0x5B, 0x7E, 0x8D, 0x97, 0x5D, 0x1C, 0x42, 0xBF, 0xDA, 0x4C, 0xA8, 0x52, 0x97, 0x91, 0x93, 0xAC,
+0x5E, 0xBF, 0xA3, 0x8C, 0x8F, 0x69, 0xAE, 0x79, 0x9F, 0xF2, 0x7E, 0xF9, 0x90, 0x26, 0x83, 0x7C,
+0x45, 0xB6, 0x5D, 0xF2, 0x3B, 0x22, 0xB6, 0x17, 0xA4, 0x8E, 0x41, 0x2B, 0x24, 0xD9, 0xEC, 0xE3,
+0x76, 0xE4, 0x31, 0xEC, 0x90, 0xFC, 0x20, 0xAB, 0x7B, 0x4C, 0x4C, 0x23, 0x77, 0xDD, 0xC5, 0x2B,
+0x50, 0xCB, 0xA6, 0x34, 0xAF, 0x1C, 0xA3, 0x5A, 0xA1, 0xCE, 0x49, 0xFF, 0x65, 0x2F, 0x64, 0xD7,
+0x9C, 0xCD, 0x6E, 0x5A, 0x95, 0xA0, 0x13, 0x76, 0x4E, 0xF0, 0x2A, 0xE3, 0xA3, 0xD8, 0xE9, 0xC3,
+0xE7, 0x46, 0x36, 0x7E, 0x24, 0xCA, 0x1C, 0xF7, 0x9C, 0x80, 0xB3, 0x1C, 0x3E, 0x00, 0xF4, 0xA9,
+0x13, 0x62, 0x88, 0x0F, 0xCE, 0xF6, 0x81, 0xEE, 0xA6, 0x60, 0xB1, 0xBA, 0x48, 0x97, 0xDA, 0x0B,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0xAD, 0x45, 0x60, 0xF5, 0x57, 0x94, 0x5B, 0xDB, 0xBF, 0x65, 0xEF,
+0xCE, 0xC5, 0x85, 0xA6, 0xC4, 0xC3, 0x97, 0x46, 0xC2, 0x91, 0xCB, 0xA3, 0x12, 0xA5, 0xD8, 0x3A,
+0x07, 0x35, 0x65, 0xD6, 0x93, 0xF7, 0xBA, 0x4F, 0x96, 0x52, 0x80, 0x7C, 0xBD, 0x53, 0x97, 0x22,
+0x5D, 0xDC, 0xCD, 0xE3, 0xCC, 0x9E, 0x3B, 0x1D, 0xB0, 0xDB, 0x47, 0x55, 0x49, 0x57, 0x36, 0xAA,
+0x62, 0xED, 0x50, 0x2A, 0x9A, 0xE1, 0x3F, 0x44, 0xC5, 0xEE, 0xEA, 0xF0, 0xA8, 0x10, 0x89, 0x39,
+0xF4, 0x4D, 0x22, 0x0E, 0x4D, 0x5A, 0x94, 0x45, 0xD8, 0x14, 0x18, 0xFA, 0xC0, 0x89, 0xB2, 0xA5,
+0x9D, 0x52, 0x15, 0xCC, 0xB6, 0x4B, 0x93, 0x4E, 0x0B, 0x33, 0x51, 0x55, 0x4B, 0xB6, 0x50, 0x93,
+0xC2, 0xBC, 0x46, 0xCB, 0xEA, 0x19, 0xA3, 0x59, 0x6E, 0x8A, 0xD6, 0xB7, 0xC5, 0x0F, 0x4F, 0xF3,
+0xA1, 0xA4, 0xFB, 0x49, 0x94, 0xA4, 0xB4, 0x43, 0xFD, 0xE0, 0x54, 0x27, 0xD5, 0x3A, 0xD4, 0x6C,
+0xAD, 0xF9, 0xEA, 0xE2, 0x4E, 0x1F, 0x72, 0x4A, 0x4D, 0x76, 0xF1, 0xBE, 0x76, 0x85, 0xA3, 0x2D,
+0xFE, 0x7F, 0xE6, 0xD0, 0x25, 0xF5, 0x10, 0x6B, 0xE9, 0x83, 0x5F, 0xA2, 0xE7, 0xA4, 0x5E, 0x15,
+0x9F, 0xBC, 0x2A, 0x2D, 0x27, 0x51, 0x9C, 0xD6, 0x47, 0x85, 0x41, 0xC7, 0x88, 0xD7, 0x78, 0x17,
+0xAC, 0x3F, 0x7A, 0x2F, 0x3D, 0xA9, 0x73, 0x80, 0x6D, 0xB5, 0xFA, 0xD9, 0x4E, 0xEF, 0xBB, 0xDD,
+0x47, 0xEA, 0xE2, 0x3F, 0xD8, 0xC5, 0x64, 0x06, 0x24, 0x8B, 0x24, 0x9B, 0xEE, 0x95, 0xCC, 0x63,
+0x28, 0x0A, 0xDA, 0x2A, 0x1E, 0x6C, 0x1F, 0xCD, 0xAF, 0xE7, 0xAF, 0x0E, 0x85, 0x29, 0x10, 0x3B,
+0x49, 0x5D, 0x82, 0x9C, 0x8A, 0xF4, 0xF1, 0x13, 0x9C, 0xB2, 0x36, 0x46, 0xA5, 0xCC, 0xFA, 0xA2,
+0x78, 0x2A, 0x33, 0x53, 0x3C, 0x7C, 0xA4, 0x7D, 0xBC, 0xF4, 0xB5, 0xFB, 0xE8, 0x09, 0x0E, 0x32,
+0x5F, 0xD2, 0xF8, 0xE9, 0x38, 0x26, 0x6C, 0x63, 0xFA, 0x1F, 0x14, 0xA3, 0x62, 0x37, 0x8F, 0x79,
+0xC9, 0x99, 0xC0, 0x94, 0x2F, 0xCD, 0x30, 0x4B, 0xAF, 0x22, 0xD4, 0xA5, 0xEA, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x70, 0xCB, 0x11, 0x58, 0xDD, 0x15, 0xE5, 0x96, 0x77, 0x6F, 0xF9, 0x06, 0xD0, 0x07,
+0x6D, 0x10, 0x21, 0x93, 0x17, 0x86, 0x27, 0xC3, 0x35, 0x84, 0x5C, 0xCA, 0xA2, 0x24, 0xFE, 0x75,
+0x20, 0x77, 0x7E, 0x54, 0x84, 0x99, 0xF4, 0x82, 0x8B, 0x51, 0x35, 0x25, 0xC3, 0x22, 0x0A, 0x8E,
+0x9C, 0xD6, 0xC5, 0xD1, 0xCD, 0x76, 0x54, 0x4D, 0x9A, 0x71, 0x90, 0xC8, 0x8D, 0x49, 0xE4, 0x21,
+0xD3, 0x99, 0x80, 0xDC, 0x89, 0xE2, 0x92, 0x75, 0xCC, 0x88, 0xA9, 0x9C, 0xF1, 0xE6, 0x67, 0x7F,
+0x65, 0xC1, 0xCE, 0xBB, 0x65, 0x24, 0x46, 0x15, 0xAE, 0xFC, 0xC8, 0x5E, 0x67, 0x75, 0x0A, 0x31,
+0x90, 0xBA, 0xFD, 0xAF, 0xDD, 0xA8, 0xCE, 0x7D, 0xCD, 0xA5, 0x5E, 0x8A, 0x47, 0xD2, 0x59, 0x73,
+0x8F, 0x78, 0x59, 0x7A, 0x52, 0x1D, 0xA6, 0xAC, 0xAD, 0xC6, 0x51, 0x93, 0x16, 0x15, 0xFB, 0x65,
+0xC4, 0x2E, 0xEF, 0xB2, 0x77, 0x93, 0x24, 0xC4, 0x3A, 0x5C, 0x3B, 0x9A, 0xB1, 0xEB, 0x76, 0x9D,
+0xBC, 0xEF, 0xAC, 0x28, 0x5E, 0xB5, 0x70, 0x54, 0x63, 0x3B, 0x60, 0xD2, 0xA4, 0x5A, 0x37, 0x3D,
+0x33, 0x2D, 0x66, 0xFE, 0x0D, 0xDD, 0x9D, 0xA1, 0x1F, 0x39, 0x0D, 0x57, 0xDB, 0x24, 0x4F, 0xD5,
+0xF6, 0x22, 0xF2, 0xD7, 0x0D, 0x22, 0x2A, 0x96, 0x44, 0x5F, 0xD2, 0x95, 0xC0, 0xA7, 0xCE, 0x73,
+0xF4, 0x45, 0x62, 0xE7, 0x43, 0x93, 0xF5, 0x4F, 0xE6, 0x77, 0x65, 0x08, 0x13, 0x3E, 0xF9, 0xC4,
+0x48, 0x63, 0x67, 0xE6, 0xF1, 0x38, 0xE6, 0x66, 0xE2, 0xCE, 0xA7, 0x9C, 0x91, 0x3F, 0x7E, 0x16,
+0xB8, 0xE1, 0x06, 0xEF, 0xD1, 0x09, 0x73, 0xEC, 0x66, 0x90, 0xDC, 0x66, 0xA8, 0x97, 0xCD, 0xF8,
+0xDC, 0x95, 0x7B, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x5B, 0x85, 0xC0, 0x1D, 0x4D, 0xEC, 0xB8,
+0xA0, 0x70, 0xEF, 0xD4, 0x4B, 0x08, 0x9C, 0x98, 0x84, 0x9F, 0x1D, 0x7D, 0xB6, 0x99, 0xE3, 0x2D,
+0x60, 0x2B, 0xB1, 0x64, 0x86, 0x55, 0x15, 0x49, 0x49, 0x8C, 0x9B, 0x97, 0x44, 0x92, 0x30, 0x6D,
+0xA9, 0x42, 0x93, 0x4C, 0xD9, 0x50, 0xC5, 0x66, 0xC1, 0x41, 0x1F, 0x23, 0x10, 0x3A, 0xF1, 0x3D,
+0xB2, 0xCC, 0xFE, 0xCD, 0x18, 0x78, 0xFA, 0x74, 0x31, 0x57, 0x1D, 0xF3, 0xAC, 0xE9, 0x22, 0x4E,
+0xE9, 0xC5, 0xEE, 0xEC, 0xF6, 0x60, 0x95, 0x94, 0x74, 0x49, 0x37, 0x75, 0x45, 0x5F, 0x2B, 0x21,
+0xCD, 0x25, 0xAE, 0xA8, 0xAA, 0x99, 0x12, 0x23, 0xAA, 0x9D, 0x28, 0x64, 0x66, 0xCE, 0x8C, 0x75,
+0x1A, 0x91, 0x55, 0xA9, 0xC7, 0x6E, 0xA8, 0xEA, 0x4D, 0x54, 0x74, 0xA4, 0x0E, 0x5B, 0xFC, 0x5D,
+0xD5, 0x11, 0x7B, 0x36, 0x95, 0x40, 0x55, 0x79, 0x54, 0xE1, 0xE1, 0x39, 0x91, 0xC9, 0xA2, 0x6A,
+0x67, 0xC2, 0x50, 0x6A, 0x1A, 0x9B, 0x49, 0xA5, 0x48, 0x9A, 0x6B, 0x3A, 0x92, 0xA9, 0x78, 0x32,
+0x8A, 0xA6, 0x3A, 0x99, 0x1C, 0xA9, 0x7A, 0x9F, 0x13, 0x17, 0xBE, 0x27, 0x0F, 0x55, 0xEE, 0xD4,
+0xA7, 0x2C, 0x75, 0x5B, 0x95, 0x2C, 0x2B, 0x93, 0x41, 0xA5, 0x6A, 0x5E, 0x52, 0xFB, 0x54, 0xC1,
+0xD3, 0xFB, 0x8B, 0xBA, 0xE9, 0x0F, 0xDE, 0x4B, 0xC8, 0xF5, 0x34, 0x54, 0xB3, 0x69, 0x84, 0x1D,
+0xB4, 0x84, 0x1D, 0xEB, 0xFB, 0x42, 0x47, 0x33, 0xFC, 0xEB, 0x70, 0xBF, 0xA3, 0xA7, 0x2F, 0xCA,
+0x7D, 0x69, 0x76, 0x95, 0xD1, 0xEA, 0x20, 0xB1, 0xB3, 0x7E, 0x9A, 0x22, 0xA9, 0x6A, 0x6C, 0xC2,
+0x4F, 0xFA, 0xE2, 0x6A, 0xA5, 0xCC, 0x04, 0xFB, 0x2C, 0xD8, 0x38, 0xC8, 0x19, 0xF7, 0x61, 0x8C,
+0x63, 0x93, 0xFC, 0x15, 0x5D, 0x31, 0x8D, 0x91, 0xD1, 0x32, 0xBB, 0xB4, 0x0E, 0x3E, 0xA3, 0x50,
+0x29, 0xE9, 0x5E, 0x70, 0x9F, 0x5E, 0xE0, 0xD0, 0x07, 0x92, 0x5B, 0xD9, 0xAE, 0xAC, 0x19, 0x1F,
+0x8E, 0x72, 0x8F, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xB0, 0xC6, 0x10, 0xB8, 0xA3, 0x89, 0x1D, 0xC7,
+0x92, 0x66, 0xD8, 0x33, 0xC8, 0x5D, 0xC7, 0xBC, 0x64, 0x8C, 0xC6, 0xA3, 0x71, 0x6A, 0x6E, 0x7A,
+0xBC, 0x42, 0xEC, 0xAA, 0x63, 0x5E, 0x91, 0xAF, 0x2A, 0x6F, 0x45, 0xEA, 0x52, 0x23, 0x72, 0x79,
+0x21, 0xBE, 0x4F, 0xF2, 0x68, 0x59, 0x44, 0x2A, 0x42, 0xD8, 0x6A, 0xCD, 0x2B, 0x92, 0x11, 0x3A,
+0xA4, 0x7B, 0xB2, 0xE1, 0x79, 0x3A, 0xC2, 0xD7, 0xBD, 0x99, 0x91, 0xBA, 0x8A, 0x6C, 0x57, 0xBF,
+0xAF, 0xB5, 0x4A, 0x9D, 0x2B, 0x37, 0xAA, 0xDA, 0xD4, 0x48, 0x66, 0xBC, 0x57, 0xAE, 0xCE, 0x65,
+0xEF, 0xBB, 0x09, 0x53, 0xAE, 0xF1, 0x32, 0x26, 0x8B, 0x25, 0x41, 0x4E, 0xEB, 0x93, 0x7B, 0x0A,
+0x1F, 0x35, 0x53, 0x5F, 0xA4, 0x89, 0x7A, 0x3E, 0x5E, 0xEE, 0x7D, 0xF3, 0x7A, 0x72, 0x92, 0x67,
+0x75, 0x68, 0x11, 0x23, 0x7E, 0x99, 0x22, 0x55, 0xB9, 0xD4, 0x15, 0x38, 0xEB, 0x52, 0x5E, 0xCC,
+0xAA, 0xAE, 0x76, 0x35, 0xC9, 0x72, 0xD6, 0x1E, 0x27, 0x8D, 0x4E, 0xF4, 0x70, 0x7A, 0x06, 0x66,
+0x58, 0x10, 0xBB, 0xC9, 0xC9, 0x29, 0x8C, 0x49, 0x08, 0x7B, 0x36, 0xF5, 0x37, 0x65, 0xEB, 0x2C,
+0xE6, 0x2A, 0x3C, 0x7A, 0xEE, 0x12, 0x94, 0xC2, 0x19, 0xC5, 0x91, 0xBB, 0x4C, 0x50, 0xB1, 0x33,
+0x02, 0xEB, 0x23, 0x56, 0x0F, 0xC3, 0xF8, 0x5E, 0xC4, 0xCC, 0x87, 0x58, 0x81, 0x89, 0xA3, 0x2D,
+0x4F, 0xD2, 0xC4, 0x8F, 0x4A, 0x76, 0x65, 0xB2, 0x19, 0xE6, 0x1C, 0x4F, 0x10, 0xC2, 0x0E, 0x34,
+0x46, 0x8C, 0xC1, 0xB8, 0xF1, 0xE6, 0xBE, 0x6E, 0xE4, 0x76, 0x24, 0xDD, 0x2D, 0x47, 0x41, 0xA0,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x7C, 0x1C, 0x04, 0xEE, 0x68, 0x62, 0x47, 0x75, 0x80, 0x09, 0x53,
+0xDF, 0x3E, 0x3B, 0x28, 0x01, 0x14, 0xDD, 0xF0, 0xF7, 0x69, 0x85, 0x6F, 0xDD, 0xEC, 0xC4, 0xA8,
+0xEC, 0x12, 0x80, 0x38, 0x0A, 0x59, 0xFC, 0x44, 0xA9, 0xE1, 0xC6, 0xAA, 0xA2, 0x3A, 0xD9, 0xD2,
+0x03, 0x65, 0x6F, 0x0E, 0x05, 0x5C, 0x99, 0x9B, 0xA3, 0xD2, 0x27, 0x81, 0x17, 0x5E, 0x02, 0x2B,
+0x1A, 0xAF, 0xC9, 0x08, 0x0B, 0xCD, 0x6F, 0x12, 0xF9, 0x89, 0x32, 0xD3, 0x4C, 0xF3, 0x50, 0x21,
+0x3C, 0x1F, 0x67, 0x18, 0x17, 0xBF, 0x96, 0x8A, 0xD0, 0xB6, 0x8D, 0x03, 0x92, 0x70, 0x99, 0xBE,
+0x5D, 0x0C, 0x0A, 0x69, 0x91, 0x4D, 0x62, 0x71, 0x30, 0xCD, 0x44, 0xB6, 0x38, 0xCF, 0x69, 0xD8,
+0x2E, 0x3B, 0x6B, 0xBD, 0x40, 0x7F, 0xAC, 0x68, 0xBC, 0x83, 0x90, 0x2B, 0x5E, 0xCB, 0x22, 0xEC,
+0xA3, 0xA9, 0x7A, 0x84, 0x07, 0xFD, 0xD7, 0x3A, 0x24, 0xC3, 0x73, 0xF6, 0x50, 0x15, 0x88, 0x3E,
+0x7E, 0xA2, 0x06, 0xDA, 0x7D, 0xB5, 0x4E, 0x47, 0x8C, 0x65, 0x98, 0xF7, 0x0C, 0xAF, 0x05, 0x57,
+0xEE, 0xD2, 0xC0, 0x31, 0xE0, 0x6B, 0xE2, 0x88, 0xD7, 0x86, 0x31, 0x1B, 0x25, 0xBA, 0x13, 0xCE,
+0xCF, 0xF3, 0x9E, 0x3C, 0x6F, 0xC5, 0x9C, 0x18, 0xF0, 0x3A, 0xBE, 0xA7, 0x43, 0xA8, 0xFD, 0x60,
+0xFD, 0x3A, 0x4E, 0x7C, 0x6E, 0x7E, 0x7D, 0x78, 0x8F, 0xE7, 0x64, 0x7C, 0xBD, 0x5B, 0x02, 0x81,
+0xEC, 0xCD, 0xA1, 0xED, 0x30, 0x10, 0x22, 0xF5, 0x8D, 0xEA, 0x9E, 0x36, 0x4D, 0x42, 0x0F, 0x5C,
+0xED, 0x33, 0x85, 0x8B, 0xFD, 0x94, 0x36, 0x44, 0x35, 0x0C, 0x8A, 0x29, 0x94, 0xE0, 0xE9, 0x29,
+0x98, 0xF9, 0xA1, 0xDC, 0xAD, 0x43, 0x5A, 0x8F, 0x7B, 0x77, 0x6D, 0x96, 0x44, 0xD5, 0xAB, 0x79,
+0x48, 0x62, 0x62, 0xF8, 0x58, 0xBE, 0x7B, 0xE2, 0xAC, 0x44, 0xE2, 0xB6, 0x42, 0xA9, 0x63, 0x9A,
+0x13, 0xF1, 0xB1, 0x33, 0x6C, 0x94, 0x7B, 0xA5, 0xB9, 0xC0, 0x79, 0x29, 0xA3, 0x47, 0xDC, 0xBC,
+0x71, 0x3A, 0xBD, 0x75, 0x3E, 0x38, 0x1E, 0x9C, 0x0B, 0x02, 0x9B, 0x3D, 0xB1, 0x02, 0x82, 0x73,
+0x9C, 0x59, 0x3A, 0x0F, 0xE8, 0xF2, 0x20, 0xA3, 0xED, 0xE3, 0x89, 0x9A, 0xB9, 0x6B, 0xD8, 0x1C,
+0x7E, 0x68, 0xB4, 0xE3, 0x97, 0xCE, 0xFD, 0x3B, 0x37, 0x0A, 0xB1, 0x2B, 0x47, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x7C, 0x3C, 0x04, 0xEE, 0x58, 0x62, 0xC7, 0xC5, 0x8B, 0xFE, 0x67, 0x83,
+0xF0, 0x3F, 0x3B, 0x7D, 0x1D, 0xBB, 0x4D, 0xE0, 0x75, 0x27, 0x93, 0xC6, 0x4E, 0x8D, 0x82, 0xFC,
+0x4C, 0x69, 0x1A, 0x0D, 0xFE, 0x27, 0xE6, 0xC8, 0x64, 0xB9, 0x74, 0x51, 0xAA, 0xA2, 0x65, 0x89,
+0xD9, 0x2E, 0xEA, 0x75, 0x95, 0x94, 0xB6, 0xE9, 0x6A, 0x2D, 0xD1, 0xC1, 0x74, 0x22, 0x78, 0xCC,
+0x90, 0x94, 0x54, 0xD4, 0x8C, 0x8F, 0x37, 0x90, 0x8B, 0x5D, 0xDD, 0x0D, 0xE2, 0x70, 0x70, 0xD7,
+0x56, 0x98, 0xFC, 0x5A, 0xA1, 0xD8, 0x20, 0x32, 0x76, 0x12, 0xFD, 0xC3, 0x5F, 0xBF, 0xB7, 0xF6,
+0xD3, 0xCC, 0x63, 0xC2, 0x82, 0x78, 0x22, 0xE9, 0x26, 0x99, 0xC6, 0xA2, 0xB7, 0x30, 0x33, 0xA9,
+0x04, 0x50, 0x08, 0xE9, 0xD5, 0xAB, 0xC5, 0x44, 0x6A, 0x66, 0x52, 0x35, 0x65, 0x92, 0x05, 0x18,
+0x03, 0xB2, 0xF3, 0x9E, 0x16, 0xC6, 0x2C, 0x71, 0xE9, 0x3E, 0x72, 0x4F, 0x44, 0x46, 0x4A, 0x10,
+0x85, 0xDF, 0x43, 0xAF, 0x97, 0x33, 0x46, 0xA8, 0x25, 0x58, 0x41, 0xCC, 0xB6, 0xAC, 0x57, 0xCF,
+0x6B, 0x9A, 0x12, 0x37, 0x29, 0x26, 0x75, 0x4C, 0x7A, 0x60, 0xC5, 0x84, 0xB4, 0x48, 0x5B, 0x74,
+0x1C, 0x85, 0x7B, 0x1A, 0x4B, 0x93, 0x6A, 0xC4, 0xA4, 0xA8, 0x75, 0x88, 0xF9, 0x31, 0x96, 0x51,
+0xF2, 0xA7, 0x81, 0x18, 0x8A, 0x8D, 0x9A, 0x78, 0xE3, 0xE5, 0x6E, 0xD5, 0x75, 0x58, 0xA2, 0x19,
+0x56, 0xCA, 0x68, 0xB7, 0xE4, 0x9E, 0x73, 0x0C, 0x9A, 0xC0, 0x0F, 0x86, 0x79, 0x90, 0xEB, 0xED,
+0xEB, 0x7A, 0xC3, 0xDE, 0xCD, 0xEB, 0xC2, 0x86, 0xBE, 0x9E, 0x55, 0xDF, 0x56, 0x8E, 0xFB, 0xC3,
+0x9E, 0x38, 0x7F, 0x19, 0x7B, 0xC4, 0x22, 0xE1, 0x36, 0xE6, 0x7B, 0x5B, 0xF7, 0x40, 0x68, 0xED,
+0x5E, 0x87, 0xFC, 0x23, 0xED, 0xD2, 0x2F, 0xC1, 0x49, 0xFA, 0x45, 0x6C, 0xF9, 0xD4, 0x4C, 0xE0,
+0x32, 0x0C, 0x46, 0xF9, 0xF8, 0xBE, 0xE3, 0x6E, 0xE6, 0xF9, 0x68, 0x6A, 0x8E, 0x53, 0xC5, 0x4D,
+0xF1, 0x69, 0xEC, 0x99, 0xFE, 0xC4, 0xE7, 0x80, 0x07, 0xBE, 0x78, 0xFD, 0x6D, 0xA8, 0xA7, 0xAB,
+0x0D, 0xF5, 0xE2, 0x73, 0xC0, 0x80, 0x89, 0x83, 0xDB, 0x37, 0x84, 0x1E, 0x24, 0x4D, 0x6E, 0x46,
+0x40, 0xD1, 0xEA, 0x7C, 0xD2, 0x4A, 0xAD, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0xF6, 0x40, 0xE0,
+0x8E, 0x25, 0x76, 0x84, 0x9F, 0x4E, 0xE5, 0x97, 0x86, 0x26, 0x45, 0xAD, 0xA3, 0xCF, 0x1B, 0x0C,
+0x96, 0x61, 0x6E, 0x82, 0xFE, 0x75, 0x96, 0xBF, 0x2E, 0x27, 0x74, 0x3E, 0x5E, 0x19, 0x19, 0x73,
+0xAD, 0xC9, 0x95, 0x37, 0x57, 0x3E, 0x16, 0x1B, 0x5A, 0xDF, 0x36, 0x89, 0x8B, 0x17, 0xF3, 0xE5,
+0x35, 0x81, 0xD7, 0xC9, 0x3E, 0x9F, 0x9B, 0xD7, 0xF5, 0x85, 0x3D, 0x5B, 0x36, 0xC8, 0xBE, 0xA5,
+0xB3, 0x20, 0xAD, 0xB3, 0xDC, 0x03, 0x17, 0xAA, 0x51, 0x24, 0x6A, 0xB2, 0xB8, 0x5B, 0xAB, 0x17,
+0xDA, 0xE3, 0x94, 0xB8, 0xC5, 0xC6, 0x2A, 0xF9, 0x11, 0xC2, 0x55, 0x73, 0x4D, 0x2C, 0x57, 0x61,
+0xBD, 0x56, 0x79, 0x4D, 0x59, 0x27, 0x3C, 0x72, 0x57, 0xB7, 0x6D, 0x1A, 0x09, 0xCA, 0x4D, 0x7A,
+0xD9, 0x8D, 0xED, 0xB4, 0xDD, 0x37, 0xB7, 0x87, 0x3A, 0x49, 0x63, 0x4B, 0x6B, 0x40, 0x4D, 0xDD,
+0x31, 0x92, 0xA9, 0x2D, 0x4F, 0x8F, 0xAC, 0xBC, 0x13, 0xBB, 0x38, 0x7E, 0x59, 0x41, 0xED, 0x9B,
+0x3D, 0x6A, 0xBA, 0xA4, 0x7D, 0xC8, 0x46, 0xDD, 0x8B, 0xC5, 0xEB, 0xA1, 0x61, 0x41, 0xA9, 0x9B,
+0xE1, 0x0F, 0x06, 0x14, 0xDC, 0xBB, 0x79, 0x20, 0xEC, 0xDF, 0xBA, 0x3E, 0x74, 0x32, 0x72, 0x60,
+0x95, 0x0F, 0x46, 0xC3, 0x7E, 0x74, 0xEE, 0xB2, 0x98, 0x7F, 0xC9, 0xDC, 0x5A, 0x91, 0xBB, 0xAE,
+0xB5, 0x1B, 0xF9, 0xEB, 0x8C, 0x90, 0x3B, 0x01, 0x8D, 0x73, 0xD8, 0xFB, 0x18, 0x49, 0x5D, 0x75,
+0x7C, 0x12, 0x72, 0xDA, 0x67, 0xA3, 0xE2, 0x3A, 0x95, 0x0C, 0x84, 0x38, 0x06, 0x95, 0xB9, 0xE4,
+0x83, 0xA4, 0x1E, 0x76, 0x24, 0x76, 0x4C, 0x71, 0xC2, 0x4A, 0xD6, 0xF5, 0x74, 0xE0, 0xD1, 0xB9,
+0xEA, 0x24, 0x77, 0x95, 0xA1, 0x2E, 0xD5, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x02, 0x81,
+0x3B, 0x9A, 0xD8, 0x4D, 0xC0, 0xBF, 0xEE, 0xC4, 0x15, 0xA8, 0x28, 0x58, 0x6A, 0xDA, 0xA1, 0x60,
+0xD0, 0x54, 0x3A, 0x03, 0x62, 0x27, 0xDB, 0x28, 0x71, 0xA1, 0x92, 0xBF, 0xAA, 0x48, 0x19, 0x95,
+0xB1, 0xE7, 0xAA, 0x75, 0x24, 0x3D, 0xC7, 0x64, 0x0B, 0x51, 0xB3, 0x92, 0xBA, 0x43, 0x91, 0x48,
+0xDF, 0xE1, 0x79, 0x35, 0x27, 0x3A, 0x19, 0xE4, 0x0E, 0x0E, 0x7E, 0x9F, 0xD5, 0x9E, 0x09, 0xFD,
+0x3D, 0x5D, 0xE1, 0xC9, 0xBB, 0xF7, 0x89, 0xCD, 0x70, 0x9A, 0xA9, 0x36, 0xD0, 0xC7, 0x59, 0xFA,
+0x11, 0x4A, 0xE3, 0x74, 0xFB, 0x30, 0x3E, 0x77, 0xE7, 0x79, 0x7D, 0x6D, 0x18, 0x44, 0xD5, 0x2D,
+0x6F, 0xA5, 0xF6, 0xDE, 0x65, 0xAA, 0xA8, 0xDA, 0x99, 0x14, 0xA7, 0x29, 0x4A, 0x8C, 0xDD, 0x18,
+0x26, 0x51, 0xB1, 0x31, 0x35, 0x30, 0x26, 0x04, 0x16, 0x35, 0x48, 0x55, 0x1E, 0x0F, 0xA2, 0xB0,
+0x50, 0x0C, 0xC5, 0x9A, 0xAA, 0xA0, 0xA1, 0xAF, 0xA3, 0x60, 0xE5, 0xA2, 0xC2, 0xA6, 0x6D, 0xD5,
+0x34, 0x1C, 0xFA, 0x9E, 0x53, 0x66, 0x21, 0x8F, 0x2E, 0xEE, 0xB1, 0x45, 0x76, 0x1F, 0x0F, 0x6A,
+0x10, 0x82, 0x6A, 0xEF, 0xAB, 0xB8, 0x94, 0x94, 0x3B, 0xE9, 0x81, 0x29, 0x58, 0x1A, 0x00, 0xE1,
+0x66, 0x55, 0x55, 0xF6, 0x52, 0x70, 0x84, 0xF1, 0xBD, 0xAC, 0x1E, 0xDD, 0x3E, 0x2D, 0x09, 0x96,
+0xA2, 0x0E, 0x4F, 0x21, 0x22, 0x95, 0xD1, 0xB0, 0x18, 0x84, 0x43, 0x3B, 0x37, 0x85, 0xBB, 0x77,
+0x6D, 0xC1, 0x76, 0x72, 0xAB, 0x6F, 0x7A, 0x1C, 0x47, 0x62, 0xE2, 0xF7, 0xB1, 0x3F, 0x2C, 0x95,
+0xBB, 0x16, 0xFA, 0x90, 0x82, 0xD4, 0xF1, 0x21, 0x48, 0xBA, 0x02, 0xE9, 0xE2, 0xAA, 0xF7, 0x51,
+0x54, 0xC9, 0x5A, 0xD4, 0x7D, 0xBC, 0xD9, 0x7F, 0x1B, 0x5E, 0x51, 0xF1, 0x32, 0xC2, 0x6B, 0xF5,
+0x45, 0xF9, 0x32, 0x82, 0x6F, 0xF8, 0xC9, 0xF8, 0x28, 0x50, 0x4C, 0x48, 0x4C, 0x53, 0x3A, 0xBF,
+0x80, 0xB6, 0x0F, 0xF4, 0x4A, 0x34, 0x6C, 0x33, 0x5C, 0x13, 0x56, 0xFB, 0xB3, 0x56, 0xEA, 0x2F,
+0x08, 0x14, 0x04, 0x0A, 0x02, 0xB7, 0x1A, 0x81, 0x3B, 0x9A, 0xD8, 0x4D, 0x21, 0x12, 0xF6, 0x0C,
+0xCC, 0xB0, 0x5C, 0x50, 0x5A, 0x19, 0x54, 0x40, 0x35, 0x0B, 0x89, 0x7C, 0xD5, 0x86, 0x66, 0x84,
+0x2C, 0x52, 0x3B, 0x13, 0x65, 0xA2, 0xE9, 0xC9, 0xDF, 0xAF, 0x4A, 0x35, 0xB2, 0xCE, 0x45, 0x5E,
+0x64, 0xEF, 0x45, 0xE5, 0x02, 0x0B, 0x19, 0x10, 0xE7, 0xDA, 0xC6, 0x1D, 0x20, 0x9A, 0x45, 0xEC,
+0xB8, 0x0F, 0xE7, 0x83, 0x77, 0xED, 0x0A, 0xBB, 0x37, 0xAF, 0x47, 0xDA, 0x13, 0xF8, 0xDA, 0x4D,
+0x4D, 0x08, 0xB9, 0x9B, 0x03, 0xD1, 0xD0, 0x55, 0x3A, 0x33, 0xC9, 0xA5, 0x6E, 0xA7, 0xB9, 0x99,
+0x77, 0xB1, 0x32, 0x63, 0x93, 0x82, 0x65, 0xC6, 0xDC, 0x44, 0x64, 0x9D, 0xD8, 0x45, 0x65, 0xCF,
+0x80, 0x89, 0xD7, 0x57, 0x5F, 0x2B, 0x6E, 0xB9, 0xE2, 0xA6, 0x37, 0x8D, 0xE7, 0xB3, 0xFB, 0x46,
+0x65, 0x28, 0xD6, 0x9D, 0x37, 0xDA, 0xAE, 0xB3, 0xF2, 0xAE, 0x48, 0xC5, 0x12, 0x91, 0x87, 0x64,
+0x26, 0xD5, 0xD4, 0x0D, 0xD5, 0x9C, 0x5C, 0xAD, 0xCA, 0xFB, 0x5A, 0xC1, 0x40, 0x99, 0x4D, 0x6C,
+0xAF, 0x11, 0x1D, 0x2F, 0x5E, 0x0B, 0x17, 0xCD, 0x8D, 0x8E, 0x37, 0x77, 0x1C, 0xD9, 0xB5, 0x69,
+0x7D, 0xD8, 0x85, 0xB1, 0x60, 0x92, 0xEA, 0xD5, 0x3C, 0x38, 0xAF, 0x47, 0xC7, 0x27, 0xC3, 0xA9,
+0x0B, 0x57, 0x45, 0x9D, 0x6E, 0xC5, 0x9E, 0xB0, 0xAD, 0x48, 0x4A, 0xDC, 0x82, 0xBF, 0x11, 0x5B,
+0x1B, 0x86, 0x8A, 0x2A, 0x9B, 0x75, 0xA0, 0xD2, 0x47, 0x1B, 0x53, 0xC5, 0xC8, 0xFE, 0xC9, 0x25,
+0x52, 0xE7, 0xF2, 0x24, 0x6D, 0x35, 0x6A, 0x5D, 0x45, 0x49, 0xC5, 0xFC, 0x97, 0xBD, 0x72, 0xCD,
+0xE7, 0x74, 0x17, 0x7C, 0x40, 0x9B, 0xB1, 0xFB, 0xC6, 0x6A, 0x62, 0x5D, 0xEA, 0x2E, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0xB7, 0x0B, 0x02, 0x77, 0x24, 0xB1, 0x73, 0x3F, 0x1F, 0xEE, 0xF1, 0x79, 0x61,
+0x64, 0x42, 0x02, 0x25, 0x02, 0xFD, 0xCF, 0xA0, 0xAA, 0xCC, 0x21, 0x72, 0x31, 0x2E, 0x66, 0xA2,
+0xF0, 0x18, 0xC7, 0x33, 0x1F, 0x2B, 0x4F, 0xC7, 0x20, 0x03, 0xE8, 0x0E, 0x5B, 0xFE, 0x9E, 0xD1,
+0x9A, 0xF8, 0x96, 0xAF, 0x7F, 0x4E, 0x32, 0xB0, 0xC0, 0xFB, 0x56, 0x5C, 0x34, 0xFF, 0x9A, 0x3F,
+0xF9, 0xAA, 0xCF, 0x05, 0x2E, 0x9A, 0x87, 0x76, 0x6F, 0x0F, 0x4F, 0xDF, 0x77, 0x40, 0xBC, 0xFD,
+0x99, 0xF6, 0x62, 0x66, 0x7C, 0x34, 0x4C, 0x8F, 0x0F, 0xCB, 0x6B, 0x9A, 0xA1, 0x95, 0x8D, 0x3A,
+0x6B, 0xCD, 0x09, 0xA9, 0x27, 0xA7, 0x70, 0x22, 0x93, 0x94, 0x3A, 0x21, 0x5D, 0xA6, 0xC0, 0xD0,
+0xCF, 0x4D, 0xD5, 0x48, 0xF7, 0x36, 0x34, 0x75, 0xC6, 0x55, 0x3C, 0x53, 0x38, 0x13, 0x71, 0xB2,
+0x7A, 0x8C, 0x04, 0xB8, 0xAF, 0x5C, 0xBD, 0x94, 0x2B, 0xEA, 0xB3, 0xC7, 0xE6, 0x99, 0x1A, 0xE7,
+0x3E, 0x75, 0xE2, 0x93, 0xE7, 0xEA, 0x19, 0x15, 0x28, 0x02, 0xAE, 0x65, 0x55, 0x55, 0x73, 0x32,
+0x9E, 0x54, 0x36, 0x0F, 0x72, 0xB0, 0xB0, 0x0A, 0xBD, 0xDE, 0x94, 0x55, 0xE7, 0x67, 0xEE, 0x6F,
+0x17, 0xD3, 0x7F, 0x88, 0x2F, 0x5F, 0xB2, 0xC4, 0x7A, 0x32, 0xE3, 0xA8, 0x10, 0x4A, 0xBB, 0x92,
+0x91, 0xD2, 0xDC, 0x10, 0xA3, 0xB2, 0xC7, 0x88, 0xE4, 0x19, 0x04, 0x4E, 0x90, 0x54, 0xF7, 0x76,
+0x74, 0x84, 0x4D, 0x03, 0x7D, 0xF0, 0xAF, 0xEB, 0xC5, 0x56, 0x5A, 0xAB, 0xFB, 0xF1, 0x63, 0xC0,
+0xC2, 0x30, 0x72, 0xD7, 0x5D, 0x1D, 0x1E, 0x11, 0xFF, 0xBA, 0x56, 0xEE, 0x0B, 0xDB, 0x0A, 0x95,
+0xD0, 0xC6, 0x4A, 0x94, 0x45, 0x3E, 0xA2, 0x22, 0xE9, 0x53, 0xDA, 0x55, 0x6A, 0xF3, 0xC2, 0xB3,
+0xF9, 0x2D, 0x54, 0xCE, 0x54, 0xBA, 0xE4, 0x73, 0xA7, 0xD7, 0x48, 0x11, 0x53, 0x71, 0x65, 0x2E,
+0x64, 0x6A, 0x9D, 0x02, 0x9C, 0xD3, 0xDD, 0x79, 0xA4, 0x39, 0x31, 0x62, 0x07, 0x82, 0xB7, 0x7F,
+0xEB, 0x00, 0x76, 0xA0, 0x58, 0x5D, 0x92, 0xBB, 0xEA, 0x1F, 0xB2, 0x72, 0x83, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x70, 0x9B, 0x20, 0xB0, 0xBA, 0x2B, 0xCB, 0x6D, 0xD2, 0xC9, 0x7A, 0xCD, 0xF0, 0xC0,
+0x89, 0xE1, 0x09, 0xEE, 0x30, 0x01, 0x53, 0xD9, 0xE4, 0x38, 0x88, 0x0E, 0xD4, 0x3B, 0x44, 0x8F,
+0x46, 0x33, 0xA2, 0x89, 0x12, 0x4E, 0xD4, 0xA4, 0x9E, 0x8A, 0xF4, 0x90, 0x31, 0xB7, 0x1A, 0x95,
+0x67, 0x81, 0x6A, 0x23, 0x8B, 0x27, 0x54, 0x13, 0x2E, 0x8C, 0xB8, 0x6C, 0x8C, 0xC4, 0xAE, 0x49,
+0xCC, 0x8E, 0x3B, 0x0D, 0x6C, 0x81, 0x2A, 0xF2, 0xF8, 0x7D, 0xFB, 0xC3, 0xFE, 0xED, 0x9B, 0xA5,
+0x1D, 0x33, 0xF4, 0xF9, 0x82, 0x6A, 0x37, 0x23, 0x64, 0x56, 0x31, 0x48, 0xFD, 0x74, 0x62, 0xE7,
+0xC8, 0x19, 0xA9, 0x8B, 0x78, 0x28, 0x63, 0xD2, 0xB5, 0x5A, 0x65, 0x9A, 0xCA, 0xBA, 0x6D, 0x97,
+0x25, 0x0C, 0xB4, 0xCF, 0x7A, 0x28, 0x11, 0xF3, 0xE7, 0x09, 0x6B, 0x67, 0x61, 0x6E, 0xF4, 0x4E,
+0x58, 0x27, 0xC8, 0xB5, 0x1E, 0xAD, 0x4B, 0xCB, 0xC7, 0x60, 0x86, 0xBC, 0x4A, 0xBD, 0x8B, 0x97,
+0x4A, 0xF7, 0x5A, 0xA0, 0xC4, 0x25, 0x7F, 0xBB, 0xD8, 0x3C, 0x2F, 0x6D, 0x26, 0xC6, 0x9C, 0xB0,
+0xC5, 0xE1, 0x8F, 0x2A, 0x97, 0xDF, 0xC7, 0xDA, 0x62, 0x28, 0x26, 0x45, 0x4B, 0x2B, 0x9B, 0x45,
+0x24, 0x32, 0xF1, 0x26, 0x89, 0xDE, 0xB6, 0xA1, 0x5F, 0x82, 0x26, 0xBA, 0x60, 0x86, 0x5D, 0xED,
+0xC4, 0xC4, 0x8C, 0x82, 0x3D, 0x7B, 0xF9, 0x5A, 0x18, 0x19, 0x1B, 0x17, 0x3C, 0x5A, 0xBB, 0x7A,
+0x24, 0xD5, 0x49, 0xCC, 0xDD, 0x97, 0x86, 0x24, 0x91, 0xE0, 0xAC, 0x0F, 0xD1, 0xA4, 0x9D, 0x21,
+0xE9, 0xCA, 0x5E, 0xC5, 0xC7, 0x32, 0xEF, 0x77, 0xAE, 0xA2, 0xC6, 0xF9, 0x51, 0xF5, 0xC5, 0x63,
+0x8A, 0x93, 0x36, 0x46, 0x1B, 0x03, 0xE3, 0x1E, 0x10, 0xBA, 0xCD, 0xFD, 0xBD, 0xAB, 0xBE, 0xFB,
+0x46, 0xED, 0xF8, 0x96, 0xD7, 0x05, 0x81, 0x82, 0x40, 0x41, 0x60, 0xAD, 0x22, 0x70, 0xC7, 0x12,
+0x3B, 0x9A, 0x61, 0xCF, 0x0D, 0xAA, 0x3F, 0x1D, 0xB5, 0x82, 0x99, 0x31, 0xEC, 0x13, 0x3B, 0x36,
+0x0C, 0x62, 0x27, 0xD2, 0x95, 0xFA, 0x5B, 0x91, 0xB0, 0xA8, 0x14, 0xA1, 0x84, 0x22, 0x9A, 0x97,
+0x9C, 0x9C, 0x38, 0x31, 0x70, 0x43, 0xA4, 0xAB, 0x17, 0x39, 0xA9, 0xD0, 0xFA, 0x78, 0xCC, 0x81,
+0x34, 0x4A, 0x94, 0x2D, 0x5E, 0x8E, 0x4D, 0x21, 0x90, 0xA1, 0x96, 0x24, 0xAE, 0xE2, 0x2C, 0xEB,
+0xEA, 0xEC, 0x0C, 0x8F, 0xDE, 0xBD, 0x3F, 0x7C, 0xF1, 0xF1, 0xFB, 0x61, 0x06, 0x6B, 0x93, 0xA8,
+0xDC, 0x99, 0xC9, 0x89, 0x30, 0x35, 0x3A, 0x08, 0x42, 0x3B, 0x12, 0xC9, 0x56, 0xD5, 0xCF, 0x4E,
+0x09, 0x94, 0x21, 0x62, 0x7E, 0x63, 0xE6, 0x2F, 0x25, 0x2A, 0x97, 0xB3, 0x29, 0x8D, 0x4E, 0x15,
+0xC2, 0x60, 0x3E, 0x75, 0x4A, 0xFC, 0x94, 0xF4, 0x69, 0xA2, 0x5A, 0x01, 0xD0, 0xD4, 0x34, 0x93,
+0xBF, 0x22, 0x4D, 0xAB, 0xFA, 0x73, 0x79, 0x7E, 0x35, 0x89, 0x7A, 0xB5, 0x3A, 0x93, 0x32, 0x67,
+0x54, 0xCB, 0x23, 0x64, 0x73, 0x65, 0x48, 0x34, 0x23, 0x7F, 0xB8, 0xCF, 0x9E, 0x29, 0x69, 0x1E,
+0xC1, 0xCB, 0x31, 0x65, 0xAF, 0x24, 0x78, 0x80, 0xF5, 0xAB, 0x0F, 0x5F, 0x0C, 0xB4, 0xD5, 0x26,
+0x47, 0x7F, 0xBB, 0xB8, 0xC5, 0x98, 0x10, 0x73, 0x2B, 0xC7, 0xE6, 0xFB, 0xBC, 0xB0, 0x08, 0x60,
+0x4D, 0xD4, 0x6B, 0xFD, 0x95, 0x72, 0xA6, 0xE2, 0x81, 0x44, 0x33, 0x7D, 0x0E, 0x53, 0xCD, 0x30,
+0x60, 0xE0, 0xE0, 0x8E, 0x2D, 0xA1, 0xBF, 0x57, 0xF7, 0x68, 0x5D, 0xED, 0x63, 0x02, 0xFE, 0x75,
+0x87, 0x4F, 0x9E, 0x83, 0x5F, 0x25, 0xF3, 0xD7, 0x21, 0x1A, 0xBB, 0xAB, 0x4F, 0x12, 0x29, 0x32,
+0x19, 0x89, 0xEE, 0x0E, 0xEB, 0x7D, 0x52, 0x45, 0xD2, 0x85, 0x39, 0xF5, 0x1F, 0xE4, 0x70, 0xE9,
+0x67, 0x40, 0x4A, 0xFA, 0xE7, 0x21, 0xFA, 0x42, 0xBA, 0x3F, 0xA3, 0x95, 0x89, 0x63, 0xAF, 0x73,
+0xC0, 0xE7, 0x82, 0xAB, 0x9A, 0x8E, 0xA3, 0xFC, 0x95, 0x69, 0xA5, 0xFE, 0xA6, 0x1B, 0x91, 0xBF,
+0xAE, 0x1B, 0x7B, 0xAB, 0xC9, 0xE7, 0x2B, 0x2A, 0xC6, 0xAB, 0x8D, 0x4C, 0xA9, 0xBF, 0x20, 0x50,
+0x10, 0x28, 0x08, 0xAC, 0x5D, 0x04, 0xEE, 0x5C, 0x62, 0x07, 0x9F, 0xA3, 0xD3, 0x48, 0x4C, 0x4C,
+0x72, 0xC5, 0xA0, 0x89, 0x69, 0x9A, 0x26, 0x99, 0x8E, 0x82, 0xB9, 0xD4, 0x8C, 0xAF, 0x28, 0xEF,
+0x72, 0x25, 0xA9, 0x3A, 0x09, 0x22, 0xC9, 0x13, 0xDA, 0xE6, 0xDA, 0x86, 0x97, 0xA9, 0x7D, 0x6D,
+0xE7, 0x49, 0x1A, 0x6D, 0x61, 0x1B, 0x85, 0x39, 0xB4, 0x59, 0x8A, 0x1D, 0xEF, 0xCE, 0xFD, 0x48,
+0x77, 0x6D, 0xDD, 0x18, 0x9E, 0xBA, 0xFF, 0x60, 0x38, 0xB4, 0x67, 0x3B, 0x1A, 0xDD, 0x2A, 0xBB,
+0x20, 0xD0, 0xFC, 0x3C, 0x0B, 0x33, 0x21, 0x53, 0xA0, 0x24, 0x63, 0xA2, 0x3D, 0xAD, 0x33, 0xEF,
+0x17, 0xF6, 0x2C, 0x93, 0xCA, 0x22, 0xF1, 0xF5, 0xAA, 0x8C, 0xEC, 0x18, 0x8C, 0xFC, 0x93, 0x94,
+0x3D, 0xBF, 0x4E, 0x6F, 0xA2, 0x3C, 0xC9, 0x81, 0x4F, 0x24, 0xDA, 0x89, 0x80, 0x92, 0x81, 0xAC,
+0xA2, 0xCA, 0xF3, 0xBC, 0xAE, 0xF4, 0xDC, 0xD5, 0xA5, 0x4A, 0xB3, 0x48, 0xBA, 0xF2, 0xEE, 0x65,
+0xC3, 0x1B, 0x87, 0x3B, 0x35, 0x43, 0xC9, 0x8F, 0xAB, 0x8C, 0x0B, 0x14, 0x3F, 0x03, 0x28, 0x56,
+0x98, 0x88, 0x9D, 0x4B, 0x60, 0xFC, 0xA1, 0xC0, 0x34, 0x27, 0x0C, 0x9C, 0xA0, 0x42, 0x77, 0xD7,
+0xF6, 0x4D, 0xA1, 0xBF, 0xBB, 0x49, 0xC4, 0x0E, 0xFB, 0xC2, 0x1E, 0x3D, 0x73, 0x01, 0x81, 0x13,
+0x08, 0xDA, 0x80, 0x3F, 0x5F, 0x0B, 0x15, 0x3B, 0xEE, 0x0F, 0x1B, 0xFB, 0x61, 0xED, 0xCD, 0xC7,
+0x39, 0x9F, 0xF3, 0xD2, 0x2F, 0x05, 0x23, 0x6A, 0xB6, 0xE4, 0x6D, 0xF1, 0x33, 0x91, 0xCD, 0x06,
+0x39, 0x9F, 0xC6, 0xD7, 0xD5, 0x5C, 0xA3, 0x85, 0x71, 0x6A, 0x71, 0x3C, 0xDB, 0x48, 0x2B, 0x2D,
+0x70, 0x82, 0xBB, 0x6F, 0x74, 0x21, 0xCD, 0x49, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xE0, 0xE6, 0x20, 0x70, 0x47, 0x12, 0x3B, 0x2A, 0x03, 0xDC, 0x71, 0xE2, 0x94, 0x11, 0xBB, 0xF9,
+0xF9, 0x99, 0x30, 0xC5, 0xE4, 0xB1, 0x13, 0x13, 0x46, 0xBC, 0x2A, 0xEE, 0xF9, 0xD1, 0x8F, 0x4C,
+0x55, 0x0B, 0x63, 0x05, 0x99, 0x5B, 0x9A, 0x47, 0x5F, 0xAA, 0xB4, 0xC5, 0xC5, 0xD2, 0xE4, 0x8F,
+0xA8, 0x68, 0xD9, 0xD2, 0x48, 0x7F, 0x36, 0x49, 0x84, 0x3B, 0x1F, 0x46, 0xC6, 0xB1, 0xBD, 0x54,
+0x93, 0x4C, 0xB1, 0x3E, 0x55, 0x3A, 0x61, 0xFE, 0x7B, 0xE0, 0xE0, 0x9E, 0xF0, 0xD3, 0x4F, 0x3F,
+0x1C, 0x3A, 0xB0, 0x98, 0xD2, 0xE8, 0xCC, 0x3D, 0x64, 0x67, 0x60, 0x86, 0x9E, 0x82, 0x62, 0xE9,
+0xDB, 0x4D, 0xF9, 0x52, 0xAE, 0xA4, 0x36, 0xA9, 0x71, 0x1E, 0x1D, 0xAA, 0xEA, 0x8E, 0xAA, 0x94,
+0x1E, 0xA5, 0xEA, 0x39, 0xED, 0x54, 0xEE, 0x32, 0xD5, 0x86, 0x3D, 0x75, 0x1F, 0xAE, 0x2C, 0x3A,
+0x56, 0xD5, 0xBD, 0x8A, 0xD3, 0x9A, 0x28, 0x73, 0x1E, 0x29, 0x2B, 0xEA, 0x97, 0x47, 0xBD, 0xDA,
+0xF5, 0xAA, 0xDC, 0x11, 0x7F, 0xA7, 0xD1, 0x02, 0x76, 0x6C, 0x45, 0x24, 0x5F, 0xAE, 0xFA, 0x88,
+0x7A, 0xE6, 0xAA, 0x92, 0x29, 0x85, 0xC2, 0x20, 0x93, 0xC2, 0xE4, 0xD1, 0xAD, 0x71, 0x0B, 0xB1,
+0x5C, 0x91, 0xB3, 0x71, 0xF6, 0x9C, 0x7C, 0x1E, 0x31, 0x9B, 0xA2, 0x40, 0x5D, 0xA0, 0x73, 0x75,
+0x4E, 0xF1, 0xD0, 0x84, 0xC4, 0xA6, 0x1B, 0xCA, 0xBD, 0xE0, 0xD3, 0x08, 0x5F, 0x46, 0x92, 0x68,
+0xEE, 0x00, 0xB2, 0x17, 0xC4, 0xAE, 0x0F, 0x51, 0xCA, 0xCD, 0x38, 0xB8, 0xE3, 0xC4, 0x89, 0xF3,
+0xD8, 0x71, 0x02, 0xBE, 0x7D, 0xAD, 0x1D, 0x5D, 0x70, 0xAF, 0xB3, 0x2D, 0xBB, 0x4C, 0x7D, 0x4C,
+0xF9, 0xFB, 0x5C, 0xD5, 0x54, 0x45, 0x52, 0x94, 0x33, 0x75, 0x58, 0x4C, 0xBE, 0x72, 0xF2, 0x03,
+0xC8, 0x55, 0x50, 0xED, 0xB3, 0xF4, 0x52, 0x88, 0xB2, 0xBD, 0x96, 0x31, 0x74, 0xA5, 0x5B, 0xC7,
+0x47, 0x3F, 0x30, 0x8A, 0x87, 0xD6, 0x47, 0x62, 0x47, 0xFF, 0x52, 0xBA, 0x25, 0x84, 0xB0, 0x0F,
+0xF9, 0xFC, 0xBA, 0x9A, 0xB0, 0xAD, 0x5A, 0x33, 0xF0, 0x2E, 0xF7, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0x02, 0xB7, 0x03, 0x02, 0x77, 0x24, 0xB1, 0xE3, 0x82, 0x3E, 0x86, 0x1D, 0x27, 0xAE, 0x8E, 0x22,
+0xB7, 0x17, 0xD6, 0x1D, 0xF1, 0x37, 0xC3, 0x83, 0x1B, 0xB4, 0x2F, 0xF0, 0xA1, 0x33, 0x72, 0x96,
+0xF2, 0x7C, 0x99, 0x70, 0x94, 0x8F, 0x9E, 0x8B, 0x44, 0x99, 0xDA, 0xE1, 0x7E, 0x60, 0x51, 0xE9,
+0xB0, 0xF2, 0xDC, 0xD2, 0x8B, 0xC7, 0xE8, 0x14, 0x88, 0x9D, 0x4B, 0x49, 0x4D, 0x9A, 0x09, 0xCC,
+0x69, 0xB7, 0x1D, 0x11, 0x99, 0x4F, 0x3D, 0x70, 0x30, 0xDC, 0xBF, 0x7F, 0x17, 0x54, 0xBC, 0x0E,
+0x51, 0x0D, 0x49, 0xEE, 0x24, 0x70, 0x04, 0x51, 0xC1, 0xC2, 0x7D, 0xE4, 0x5F, 0x67, 0x36, 0xF6,
+0x5C, 0xC8, 0x80, 0x9D, 0xB6, 0xF7, 0x73, 0xBF, 0xB9, 0xC8, 0x61, 0xB3, 0x3E, 0x25, 0x21, 0xCB,
+0x94, 0x1D, 0xC7, 0xC7, 0xB5, 0xB9, 0xBC, 0xFF, 0xAE, 0x92, 0x65, 0xE7, 0x72, 0xD3, 0x77, 0x84,
+0xC8, 0xEA, 0xF0, 0x7B, 0xE7, 0x14, 0xBC, 0x02, 0xA7, 0x10, 0xBB, 0xAC, 0x1F, 0x59, 0xD3, 0x63,
+0xBE, 0x3A, 0x23, 0x25, 0x4A, 0x60, 0xAD, 0x7F, 0x7E, 0xA3, 0x48, 0xEC, 0xD2, 0xE0, 0x68, 0x75,
+0x5A, 0xD6, 0x2E, 0xA9, 0xA8, 0x5F, 0x35, 0xF0, 0xC8, 0x1D, 0x99, 0x37, 0x50, 0x7C, 0x37, 0x41,
+0xAE, 0xE8, 0x5B, 0xB7, 0x11, 0x39, 0x05, 0x9B, 0xB1, 0x3F, 0x2C, 0xA3, 0x60, 0xAF, 0x5C, 0x1F,
+0x0E, 0x97, 0x07, 0x41, 0x2A, 0x99, 0x98, 0x98, 0x81, 0x13, 0x48, 0xE9, 0xA3, 0x87, 0xCE, 0x4A,
+0x47, 0x67, 0xC1, 0x70, 0x57, 0xC1, 0x4E, 0x38, 0x66, 0xF3, 0x3B, 0x5E, 0xEB, 0x73, 0xDF, 0xB1,
+0xE1, 0xFC, 0xC9, 0x27, 0x0A, 0xC9, 0x5E, 0x9C, 0x53, 0xFA, 0x5E, 0x1B, 0x23, 0xD0, 0xF1, 0x03,
+0x87, 0x29, 0x4E, 0x76, 0x94, 0x88, 0xD8, 0x26, 0x7D, 0xFA, 0xCB, 0x6D, 0x0A, 0x02, 0x05, 0x81,
+0x3B, 0x05, 0x81, 0x3B, 0x8E, 0xD8, 0x71, 0x51, 0x9F, 0xC1, 0x42, 0x37, 0x84, 0xA0, 0x09, 0xE6,
+0x92, 0x13, 0x33, 0xEC, 0x28, 0xD4, 0x2A, 0x3E, 0x87, 0x99, 0x4A, 0xD5, 0x0A, 0x5B, 0x9C, 0x44,
+0xFD, 0x71, 0x85, 0xC8, 0xA3, 0x3D, 0x7D, 0xF9, 0x4E, 0xAF, 0x93, 0xBB, 0xBF, 0xA9, 0x36, 0xAA,
+0xDD, 0xA8, 0xFF, 0x96, 0x0A, 0x47, 0x69, 0x39, 0xC5, 0x96, 0x65, 0x7C, 0xC9, 0x7B, 0xDF, 0x8A,
+0xBC, 0x5D, 0x24, 0x15, 0x77, 0xEF, 0xDD, 0x11, 0xBE, 0xFE, 0xD9, 0xC7, 0x42, 0x1F, 0x4C, 0x82,
+0xB3, 0xA2, 0x80, 0xC1, 0xEF, 0x0A, 0x8E, 0xF6, 0x33, 0x63, 0xA3, 0x1A, 0x25, 0x2B, 0xCA, 0x95,
+0x3A, 0x92, 0x69, 0x4E, 0x3A, 0x91, 0x71, 0x54, 0x80, 0xE1, 0x7F, 0x42, 0x82, 0x54, 0xC9, 0x13,
+0x42, 0xA4, 0xC6, 0x39, 0xA5, 0x4E, 0x31, 0x7C, 0x54, 0x95, 0x1F, 0xAF, 0x4B, 0x4A, 0x44, 0x30,
+0x4C, 0x05, 0x14, 0x65, 0xCB, 0xC8, 0x52, 0x7E, 0x1F, 0x23, 0x06, 0xAE, 0xFE, 0x78, 0xB4, 0xAE,
+0xC0, 0xE8, 0x6A, 0x9F, 0x29, 0x4A, 0xB1, 0x8D, 0x35, 0xCA, 0xA2, 0xF8, 0xE7, 0xB9, 0x4A, 0xE8,
+0x4A, 0x93, 0xDF, 0xCA, 0x55, 0x35, 0xFB, 0x1B, 0xDD, 0x02, 0x5D, 0x6D, 0x62, 0x39, 0xED, 0x7E,
+0x0C, 0x14, 0x76, 0x9E, 0x18, 0x15, 0x39, 0x2A, 0x56, 0x6C, 0x8B, 0x89, 0x52, 0x29, 0x2A, 0xD8,
+0xCC, 0xCA, 0x38, 0x4F, 0xFF, 0xCD, 0x69, 0x06, 0xA8, 0x40, 0x09, 0x26, 0x0E, 0x7B, 0xB7, 0x6E,
+0x80, 0x3A, 0xD5, 0x1C, 0xB3, 0x23, 0x13, 0x13, 0x1F, 0x3F, 0x73, 0x31, 0x4C, 0x4A, 0x70, 0x10,
+0xFC, 0xEB, 0x7A, 0xB1, 0xAD, 0x1C, 0xC7, 0x49, 0x86, 0xCC, 0x14, 0x45, 0x0E, 0x89, 0x42, 0x1A,
+0xA9, 0x9E, 0xCC, 0x76, 0x67, 0xC8, 0x86, 0x87, 0xFA, 0xDC, 0xB9, 0x8A, 0xA7, 0x9F, 0x09, 0xD1,
+0xDF, 0x32, 0x05, 0x2F, 0x2A, 0xAA, 0x32, 0x1B, 0xBC, 0x7E, 0x9D, 0x0F, 0x3A, 0x07, 0x5C, 0x0D,
+0x84, 0x52, 0x07, 0x85, 0x9C, 0x9F, 0xBB, 0x6E, 0x6C, 0x98, 0xBB, 0x09, 0xBB, 0x70, 0xB4, 0x63,
+0x4E, 0x16, 0xFF, 0xBA, 0x3B, 0x65, 0xC9, 0x29, 0xFD, 0x2C, 0x08, 0x14, 0x04, 0x56, 0x1B, 0x81,
+0x3B, 0x8E, 0xD8, 0x11, 0x50, 0xD9, 0x71, 0x62, 0x18, 0x09, 0x63, 0xCD, 0x2C, 0x3A, 0x05, 0x42,
+0xC3, 0x94, 0x14, 0x95, 0xC5, 0x25, 0x57, 0x8E, 0xA2, 0xBE, 0x61, 0xE4, 0xA5, 0x32, 0x2A, 0x99,
+0x9F, 0x91, 0x19, 0x9C, 0x9C, 0xE6, 0x44, 0x15, 0xCB, 0x2F, 0x43, 0x9D, 0x24, 0x50, 0xE4, 0x3E,
+0xD3, 0xB8, 0xF7, 0x04, 0x02, 0x38, 0x9A, 0x4D, 0xEE, 0x24, 0x42, 0x76, 0xFD, 0x40, 0x78, 0x1A,
+0xBE, 0x76, 0x0F, 0x1E, 0xD8, 0x0D, 0x72, 0xD7, 0x2D, 0x04, 0x84, 0xFB, 0xB8, 0x32, 0xBF, 0xDD,
+0x1C, 0x22, 0x38, 0x63, 0x9B, 0x64, 0xE1, 0x4F, 0x92, 0x4C, 0xAD, 0x92, 0x27, 0x3D, 0x37, 0x9C,
+0x6A, 0xF4, 0x9F, 0x0C, 0xA1, 0x5C, 0x1B, 0x72, 0x15, 0x4D, 0x01, 0x89, 0x35, 0x67, 0x0A, 0x8F,
+0xDC, 0x23, 0xAF, 0xB3, 0x22, 0xC3, 0x19, 0x90, 0x99, 0x72, 0x24, 0x56, 0x5B, 0x21, 0xD1, 0x56,
+0x67, 0xAE, 0x20, 0x49, 0xFB, 0x94, 0x6F, 0xD6, 0x2A, 0x54, 0x55, 0x75, 0xCD, 0x5B, 0x6F, 0x4A,
+0x9C, 0xB5, 0xBE, 0x8E, 0x18, 0x15, 0xFB, 0xE5, 0x4A, 0xAC, 0x37, 0x25, 0xBB, 0x55, 0x2A, 0x03,
+0x4C, 0x19, 0x98, 0xC2, 0xFD, 0x61, 0x19, 0x09, 0x7A, 0x00, 0x81, 0x13, 0xDC, 0xE2, 0xAD, 0x19,
+0xC7, 0x84, 0xF8, 0xD7, 0x5D, 0xD4, 0xFD, 0x61, 0xE1, 0x5F, 0xD7, 0xD6, 0xDD, 0x67, 0x66, 0x55,
+0xC5, 0xC3, 0x61, 0xF6, 0x3E, 0xC6, 0xD1, 0x10, 0x60, 0x52, 0xCF, 0x15, 0x27, 0x1F, 0xB7, 0xFC,
+0x7C, 0xAD, 0xC2, 0x99, 0x6A, 0xF2, 0xFE, 0x09, 0x21, 0xCC, 0x3E, 0x32, 0xDC, 0x62, 0xAC, 0x95,
+0x41, 0x13, 0x50, 0xEC, 0x88, 0xC7, 0xE6, 0xFE, 0x9E, 0x30, 0x00, 0xB3, 0xF4, 0x6A, 0x47, 0x07,
+0x37, 0x03, 0xEF, 0x72, 0x8F, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xBB, 0x20, 0x70, 0xC7, 0x11,
+0x3B, 0xF7, 0xAF, 0x3B, 0x7D, 0x1D, 0xA6, 0x47, 0x8C, 0x02, 0xD5, 0x84, 0x49, 0x21, 0x76, 0x30,
+0xC3, 0x8A, 0x2A, 0x95, 0x0C, 0x8C, 0x4E, 0x32, 0xAA, 0xDA, 0x5C, 0xA2, 0x37, 0xEE, 0x3F, 0x14,
+0x17, 0x32, 0xF7, 0x07, 0x8B, 0xFE, 0x61, 0xFA, 0x8E, 0xAA, 0x19, 0xBA, 0x60, 0xCE, 0xD2, 0x91,
+0x1D, 0x2C, 0x84, 0x64, 0x6A, 0x04, 0x6A, 0x4A, 0xB3, 0xFD, 0xEC, 0xD8, 0x1E, 0xE6, 0x4F, 0xDB,
+0xBB, 0x63, 0x73, 0xF8, 0xF9, 0x67, 0x1E, 0x0D, 0xDB, 0x36, 0xAD, 0x13, 0x82, 0x2B, 0x5B, 0xB5,
+0xCF, 0xC1, 0xD7, 0x70, 0x82, 0xBE, 0x76, 0x30, 0x17, 0x4B, 0x9B, 0xCD, 0xAF, 0x4A, 0x9E, 0xAA,
+0x3F, 0x95, 0xFB, 0xB9, 0x45, 0x3F, 0x39, 0xC7, 0xCB, 0x95, 0x34, 0x57, 0xED, 0xAC, 0xBF, 0xA2,
+0xD8, 0x88, 0x0A, 0xE4, 0x06, 0x39, 0x67, 0x5A, 0x46, 0x0A, 0xAD, 0x4E, 0x51, 0x81, 0x54, 0x4E,
+0x52, 0x85, 0x47, 0x94, 0x40, 0x57, 0x7F, 0xCC, 0x74, 0x28, 0xEF, 0x27, 0x9F, 0x3F, 0x57, 0x82,
+0xDC, 0x3F, 0x2F, 0xAA, 0x88, 0xAE, 0x3A, 0x59, 0x1F, 0x48, 0x4D, 0xA4, 0x15, 0xDE, 0x07, 0x8E,
+0x49, 0xF6, 0x88, 0x11, 0xB2, 0x1C, 0x22, 0xE9, 0x07, 0x9B, 0xE1, 0x5E, 0x61, 0xC6, 0x0D, 0x4D,
+0xB0, 0xB2, 0x26, 0xAA, 0x9A, 0x29, 0xB5, 0x52, 0xD5, 0x34, 0x85, 0xCF, 0xDB, 0x2D, 0x6D, 0xD7,
+0x3A, 0x18, 0x75, 0x3C, 0x03, 0x95, 0x96, 0xFE, 0x64, 0xF7, 0xEE, 0xDB, 0x19, 0x7A, 0x90, 0x2C,
+0xBA, 0x19, 0x07, 0x77, 0x9C, 0x38, 0x8C, 0xC0, 0x09, 0xFE, 0x80, 0x68, 0xED, 0xC0, 0x76, 0x5D,
+0x1E, 0x38, 0x41, 0x6C, 0x64, 0x6C, 0x14, 0x00, 0x8D, 0xF4, 0x4D, 0x38, 0x0B, 0x8D, 0xB3, 0x68,
+0x58, 0xC7, 0x4B, 0x23, 0xB9, 0xD3, 0x78, 0xF9, 0x9E, 0xC0, 0x3A, 0x3F, 0x8C, 0xD0, 0xB9, 0xDA,
+0x69, 0xF5, 0x69, 0x54, 0x6C, 0x8A, 0x6A, 0xE6, 0x2D, 0xA9, 0xD4, 0xB5, 0x62, 0x8E, 0xF1, 0x47,
+0x04, 0xC9, 0xDC, 0xBE, 0x2D, 0xEB, 0xC5, 0xBF, 0xAE, 0xD9, 0x3F, 0x6E, 0x9A, 0x81, 0x7F, 0xB9,
+0x47, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8, 0x55, 0x08, 0xDC, 0x71, 0xC4, 0x8E, 0x40, 0x4F, 0x8B,
+0x62, 0x87, 0xFD, 0x52, 0xB1, 0xF8, 0x30, 0x21, 0xF1, 0x34, 0x76, 0x9B, 0x90, 0x34, 0x27, 0x19,
+0xA9, 0x8B, 0x03, 0x92, 0xA9, 0x17, 0xB9, 0x7A, 0x95, 0xAB, 0x39, 0x4E, 0x12, 0xE4, 0x1A, 0x2F,
+0x5F, 0x91, 0x7B, 0x7C, 0x5D, 0x84, 0x19, 0x98, 0xC4, 0x4E, 0xD6, 0xD5, 0xF9, 0x70, 0x6D, 0x0C,
+0x1B, 0xC3, 0x37, 0x39, 0x80, 0x82, 0x4D, 0xE4, 0xA2, 0xBA, 0x01, 0xDB, 0x38, 0x3D, 0x89, 0xBC,
+0x76, 0x4F, 0xDF, 0x7F, 0x20, 0xDC, 0xBB, 0x77, 0x67, 0xE8, 0x84, 0x92, 0xC4, 0x88, 0x60, 0xDD,
+0x4B, 0xD6, 0x77, 0xA4, 0x30, 0x02, 0x90, 0xF5, 0x2B, 0x29, 0x30, 0xA9, 0x83, 0xDA, 0xFF, 0x5C,
+0xC1, 0xA9, 0x55, 0x6F, 0xEA, 0xBD, 0x97, 0x61, 0xE5, 0x60, 0x0B, 0x6B, 0xD2, 0x17, 0x9E, 0x9F,
+0x8E, 0xCF, 0xCD, 0xB0, 0xA7, 0xD8, 0x66, 0x55, 0xC7, 0x32, 0x95, 0xDB, 0xE9, 0x0B, 0xF9, 0x37,
+0x36, 0xD1, 0xCE, 0xC9, 0xD8, 0xE4, 0x0A, 0x6B, 0xFA, 0xD8, 0x55, 0x87, 0x4B, 0xEF, 0x93, 0x9F,
+0xF3, 0xEA, 0xAC, 0x8A, 0xCA, 0xFB, 0x46, 0x3B, 0x95, 0xA0, 0x44, 0xE6, 0x87, 0xA7, 0x50, 0x81,
+0x19, 0x6D, 0xCD, 0xF3, 0x7D, 0x3D, 0xDD, 0x61, 0x27, 0x88, 0x4C, 0x47, 0x13, 0x12, 0xF1, 0xF2,
+0x47, 0xC3, 0xF0, 0xD8, 0x44, 0x38, 0x7B, 0x65, 0x88, 0x31, 0xDE, 0x48, 0x73, 0x82, 0x6D, 0xC4,
+0xDA, 0x3B, 0x5D, 0xBC, 0x4C, 0xD3, 0xD4, 0x08, 0x6C, 0x42, 0x24, 0x01, 0xA9, 0x48, 0xE5, 0x18,
+0xEA, 0xF3, 0xF8, 0xB3, 0xC6, 0x88, 0x6F, 0xAE, 0xEE, 0x29, 0x31, 0x4F, 0xE3, 0x97, 0xAB, 0x75,
+0x2C, 0x47, 0x52, 0xD7, 0x82, 0x07, 0x03, 0x4A, 0xDA, 0xC0, 0x74, 0xF7, 0x62, 0xFF, 0xE2, 0x12,
+0x11, 0x9B, 0xE6, 0x60, 0x79, 0x56, 0x10, 0x28, 0x08, 0x14, 0x04, 0x6E, 0x06, 0x02, 0x77, 0x14,
+0xB1, 0x53, 0xDF, 0xB0, 0x00, 0xF3, 0xD4, 0x6C, 0xB8, 0x3E, 0x81, 0x40, 0x01, 0xEE, 0xC2, 0x00,
+0xC7, 0x76, 0x46, 0x2C, 0x52, 0xB1, 0xCA, 0x97, 0x79, 0xF7, 0x1B, 0xF3, 0x05, 0xCE, 0xFD, 0xB5,
+0xD4, 0xCF, 0xCC, 0x0E, 0xF1, 0x27, 0x23, 0x1F, 0x4C, 0xCA, 0x85, 0xBF, 0x67, 0x5E, 0x48, 0x42,
+0x23, 0xA4, 0x0E, 0x53, 0xB0, 0xA6, 0x61, 0x22, 0x23, 0xB1, 0xE2, 0xB9, 0x2B, 0xA3, 0x93, 0x42,
+0x32, 0x6F, 0xC5, 0xC1, 0x36, 0x30, 0xFD, 0xC9, 0x6F, 0x7C, 0xE5, 0xA9, 0xF0, 0xAB, 0xCF, 0x3E,
+0x19, 0x36, 0x20, 0x49, 0x2C, 0x36, 0xE2, 0x10, 0xA7, 0xF6, 0xD9, 0x49, 0x92, 0x11, 0x9A, 0x89,
+0x55, 0xC1, 0x52, 0xFF, 0x38, 0x5D, 0xD2, 0xAB, 0xEA, 0x98, 0x29, 0x5B, 0xA2, 0x84, 0x69, 0x2E,
+0xB4, 0xC8, 0x78, 0x78, 0xCE, 0xFC, 0xED, 0x44, 0x0F, 0x8A, 0x0A, 0x5E, 0x2A, 0xE3, 0xA6, 0xEF,
+0x68, 0xD2, 0x15, 0xC5, 0x94, 0xC8, 0x98, 0x72, 0xEA, 0x6A, 0x92, 0xD4, 0xCF, 0xB6, 0x24, 0xD9,
+0xAC, 0x12, 0xA5, 0xEA, 0x7E, 0x7D, 0xA2, 0xB6, 0xE9, 0xC3, 0x7D, 0xFB, 0x5C, 0x39, 0x12, 0x25,
+0xD0, 0x7D, 0xEB, 0x6C, 0x1E, 0x38, 0x0F, 0xD1, 0xF2, 0x6C, 0xB9, 0xFA, 0xA0, 0xE9, 0xBD, 0x5C,
+0xB9, 0x33, 0xAE, 0x6E, 0x84, 0x2D, 0xAA, 0x73, 0x99, 0x82, 0x27, 0xEA, 0x9D, 0xB5, 0x2F, 0x45,
+0xC5, 0x22, 0xE2, 0x18, 0x3F, 0x1A, 0x66, 0x69, 0x86, 0xA5, 0xF9, 0x7B, 0xC3, 0xBA, 0xD0, 0xD7,
+0x0B, 0x82, 0x55, 0xEF, 0xC7, 0xC3, 0x4D, 0x9E, 0x00, 0xB3, 0x98, 0x53, 0x57, 0x87, 0x46, 0x41,
+0xEE, 0x90, 0xC2, 0xA6, 0xA5, 0x3D, 0x74, 0xF4, 0xC0, 0xBF, 0xAE, 0x85, 0xCA, 0x58, 0xE2, 0x9D,
+0xAE, 0xBA, 0xE9, 0x18, 0xA9, 0xB2, 0x26, 0x7E, 0x74, 0x56, 0x28, 0x29, 0xB4, 0x3A, 0x1E, 0xAA,
+0xEC, 0xB9, 0xAA, 0xAA, 0xE3, 0x13, 0x31, 0x36, 0xCA, 0x28, 0x73, 0xDE, 0xC6, 0xC2, 0xFD, 0x2B,
+0xCD, 0x46, 0xCE, 0x89, 0x05, 0xC5, 0x0E, 0xCA, 0xE5, 0xFC, 0x94, 0x28, 0x76, 0xED, 0x8C, 0x10,
+0xA6, 0xCF, 0x61, 0x13, 0x88, 0xEE, 0x4D, 0x86, 0xB7, 0x54, 0x57, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x6E, 0x6B, 0x04, 0xEE, 0x28, 0x62, 0xC7, 0x91, 0x98, 0xC5, 0xA2, 0x72, 0x7D, 0x7C, 0x2A, 0x70,
+0x4B, 0x2F, 0x2E, 0xE5, 0xE2, 0x5F, 0xE7, 0xBB, 0x4D, 0xC4, 0xA1, 0xAA, 0xAF, 0xEA, 0x2C, 0x90,
+0x70, 0xB2, 0xF2, 0xB9, 0x72, 0x91, 0x13, 0x44, 0x21, 0x43, 0x72, 0x27, 0x25, 0x1C, 0xCC, 0x67,
+0x46, 0x42, 0xC9, 0x5D, 0xCC, 0xAE, 0x8C, 0x20, 0x1A, 0x57, 0xFC, 0xFC, 0x9A, 0x7F, 0x70, 0xE1,
+0x5D, 0xD7, 0xDB, 0x1D, 0x1E, 0x46, 0xFA, 0x93, 0xCF, 0x3E, 0x74, 0x30, 0x3C, 0x76, 0x68, 0x6F,
+0xE8, 0xED, 0x52, 0x7F, 0x3B, 0xAA, 0x76, 0xF9, 0x6E, 0x14, 0x15, 0xED, 0x2A, 0x57, 0xBD, 0xA2,
+0xA4, 0x53, 0x23, 0x6F, 0x55, 0xE4, 0xAF, 0xEC, 0x45, 0x94, 0xBB, 0xAA, 0xFD, 0x75, 0x6C, 0xF4,
+0x6C, 0x2A, 0xEF, 0x66, 0x3E, 0xB9, 0xCC, 0x70, 0xD4, 0x22, 0xB5, 0x75, 0xA6, 0x73, 0x51, 0x3D,
+0xB5, 0x26, 0x25, 0x7F, 0x41, 0xBD, 0x46, 0x48, 0x76, 0xA6, 0x2C, 0xB9, 0x32, 0xE7, 0x35, 0x2A,
+0xAF, 0x49, 0x65, 0xD3, 0x10, 0x1B, 0x2B, 0xB2, 0x13, 0x5A, 0x8F, 0x57, 0x58, 0x6D, 0x92, 0xB7,
+0x71, 0x16, 0x09, 0xA0, 0x69, 0xE2, 0x6F, 0x47, 0x34, 0xEA, 0xFE, 0x1D, 0x5B, 0x25, 0x58, 0xA5,
+0x19, 0x41, 0x02, 0x93, 0x48, 0x48, 0x7C, 0xFA, 0xE2, 0xB5, 0x30, 0x8E, 0xC8, 0xEB, 0x56, 0xDC,
+0xBB, 0xAD, 0xA7, 0x3F, 0x12, 0xAE, 0x24, 0xDB, 0xF9, 0x4F, 0x0E, 0x87, 0xDC, 0xC7, 0xD0, 0x3A,
+0xE5, 0x7D, 0xB3, 0xF1, 0x48, 0x63, 0x91, 0xA9, 0xAF, 0x24, 0x83, 0x71, 0x5C, 0xEA, 0x8D, 0x49,
+0x1A, 0x4F, 0x25, 0x8A, 0xF8, 0xCC, 0xF1, 0xB3, 0x86, 0xE7, 0x03, 0x3D, 0x9D, 0x61, 0x13, 0x7E,
+0x4C, 0xB4, 0x21, 0x59, 0x76, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0xE6, 0x21,
+0x70, 0xC7, 0x11, 0xBB, 0x29, 0xE4, 0xAF, 0x3B, 0x4B, 0xFF, 0x3A, 0x2C, 0x2E, 0x74, 0xE0, 0x9E,
+0x18, 0xC1, 0x6E, 0x13, 0x92, 0x05, 0xDF, 0xA4, 0x38, 0x5B, 0xD0, 0xA2, 0xFA, 0x64, 0xC6, 0x27,
+0xA7, 0x67, 0x0B, 0x16, 0x7A, 0x59, 0xDD, 0xA3, 0x31, 0x52, 0x55, 0x1F, 0xAE, 0x95, 0x26, 0x7E,
+0x44, 0x01, 0xCA, 0x42, 0x63, 0xE7, 0xA0, 0xA6, 0x50, 0x21, 0xA4, 0xD9, 0x53, 0x15, 0xBB, 0x9C,
+0x05, 0xDD, 0xBC, 0x81, 0x6D, 0xA4, 0x26, 0x92, 0x0C, 0x46, 0x24, 0xEE, 0xDF, 0xB9, 0x25, 0xFC,
+0xF2, 0xE7, 0x1F, 0xC7, 0x76, 0x57, 0x03, 0x91, 0xF8, 0x30, 0xB7, 0x1D, 0x03, 0x4A, 0xD2, 0xD2,
+0xED, 0x2B, 0x7D, 0x8A, 0x78, 0x14, 0x1F, 0x38, 0x01, 0xCA, 0xA2, 0x67, 0x45, 0x09, 0x73, 0xD5,
+0xCD, 0x88, 0x90, 0x2B, 0x3B, 0xA6, 0xF8, 0x44, 0x62, 0x11, 0x1D, 0xBD, 0xCC, 0x8F, 0xCF, 0x55,
+0x37, 0x51, 0x7D, 0x92, 0x3F, 0x9F, 0x4A, 0x68, 0x8A, 0xA9, 0xE7, 0x4C, 0x73, 0x55, 0x48, 0xA8,
+0x49, 0xF4, 0x67, 0x4C, 0xAA, 0x93, 0x2B, 0x6E, 0xEE, 0x13, 0x68, 0x72, 0x9A, 0x10, 0x0A, 0x55,
+0x1C, 0xB5, 0xBD, 0x19, 0xB5, 0x31, 0xA1, 0x2A, 0x53, 0xF5, 0x5C, 0xA5, 0x92, 0x3E, 0xD9, 0x7D,
+0xBC, 0x8D, 0xF1, 0x9C, 0xFA, 0xAB, 0xC5, 0x08, 0xDA, 0xC8, 0x89, 0x50, 0x3F, 0xD5, 0x60, 0xE4,
+0x06, 0xA4, 0xA5, 0xBD, 0x13, 0xBB, 0x7E, 0xDC, 0x7F, 0xD7, 0xAE, 0xD0, 0xDB, 0xDD, 0x2C, 0xFF,
+0xBA, 0xA9, 0xF0, 0xFE, 0xC9, 0x0B, 0xF2, 0xA3, 0xA1, 0x15, 0x51, 0xB8, 0xED, 0x42, 0xEC, 0x38,
+0xDB, 0x4D, 0x89, 0x34, 0x9F, 0x3A, 0x57, 0x54, 0x75, 0x0F, 0xDE, 0x2C, 0x02, 0x5A, 0xC6, 0xC0,
+0x19, 0x9B, 0xF9, 0x26, 0x46, 0x85, 0x8E, 0x18, 0x25, 0x45, 0x54, 0x09, 0x1B, 0xC7, 0xC6, 0x30,
+0xCD, 0x95, 0x3D, 0x9F, 0xFC, 0x46, 0xEA, 0x5A, 0x38, 0x9F, 0x24, 0x48, 0x29, 0x84, 0xAD, 0x48,
+0xFB, 0xD2, 0x29, 0x6A, 0x9D, 0xCF, 0xA1, 0x46, 0x66, 0x6C, 0x29, 0x53, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0xCB, 0x21, 0x70, 0xE7, 0x11, 0x3B, 0x10, 0xAB, 0x0B, 0x43, 0x1A, 0x38, 0x31,
+0x0F, 0x7F, 0x9F, 0xC9, 0x31, 0xEE, 0x0F, 0x1B, 0x65, 0x07, 0xC5, 0x2B, 0x2A, 0x44, 0x55, 0xD2,
+0xA5, 0xC6, 0x48, 0x3B, 0xA2, 0x6A, 0x94, 0x29, 0x4C, 0x66, 0x76, 0x8D, 0x55, 0xE4, 0x97, 0xDB,
+0x73, 0xEE, 0x45, 0x3B, 0xC3, 0x7C, 0x71, 0xB8, 0x7E, 0x18, 0x0E, 0xEE, 0xE3, 0xDC, 0x33, 0x36,
+0x57, 0xA0, 0x96, 0x1B, 0xB1, 0x9B, 0xFC, 0xBE, 0xF8, 0xDB, 0x41, 0x39, 0x79, 0xEC, 0xD0, 0x1E,
+0x51, 0xED, 0xFA, 0xE1, 0x0B, 0xC6, 0x65, 0x7E, 0x16, 0x0E, 0xFF, 0x73, 0xB3, 0x6C, 0xA7, 0x2B,
+0x8A, 0xB5, 0x04, 0xB4, 0xAA, 0x6A, 0xAA, 0x39, 0xD5, 0x95, 0x2B, 0xEF, 0x6C, 0x04, 0x2B, 0x09,
+0x71, 0x95, 0x6A, 0x6A, 0xCA, 0xE5, 0x98, 0x92, 0x2C, 0x08, 0x90, 0xB9, 0x12, 0xA4, 0xFE, 0x76,
+0x3A, 0x46, 0x29, 0xB8, 0x21, 0x96, 0xC9, 0x95, 0x38, 0x97, 0xE2, 0xE2, 0x80, 0xA6, 0xEB, 0x74,
+0x7C, 0xD2, 0x6B, 0x21, 0x3C, 0xF2, 0xD2, 0xCC, 0xE6, 0xD9, 0x18, 0x7B, 0x10, 0x47, 0x14, 0xB0,
+0x44, 0x79, 0xD5, 0x39, 0xB2, 0x40, 0xD7, 0xF5, 0x42, 0x7C, 0x8F, 0x51, 0xC6, 0xD8, 0x71, 0x82,
+0x47, 0x37, 0x02, 0x26, 0x0E, 0xEC, 0xDC, 0x86, 0xFD, 0x61, 0x9B, 0x15, 0x11, 0x3B, 0x1D, 0x3E,
+0xBA, 0x78, 0x25, 0xCC, 0xA0, 0xA1, 0x6D, 0x48, 0x4C, 0xDC, 0xD2, 0xD9, 0x5D, 0x41, 0xA1, 0xD2,
+0xEE, 0xCA, 0x3C, 0xCE, 0xA9, 0x6E, 0x9A, 0x68, 0x29, 0x9F, 0x60, 0x9D, 0xF9, 0x2F, 0x24, 0x37,
+0x0D, 0x53, 0x1E, 0x51, 0x1D, 0x07, 0x9D, 0x63, 0x25, 0xBE, 0x75, 0xDC, 0x1F, 0x79, 0x56, 0xB6,
+0x56, 0xDB, 0xB3, 0x79, 0x3D, 0xD2, 0x9D, 0x34, 0x27, 0xF5, 0xCB, 0x4D, 0xFE, 0xC8, 0x94, 0xEA,
+0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x6D, 0x8D, 0xC0, 0x1D, 0x45, 0xEC, 0xA8, 0x50, 0x30, 0x4A,
+0xF0, 0x22, 0x02, 0x27, 0xE8, 0xE7, 0xC3, 0x34, 0x14, 0x53, 0x08, 0x9C, 0x90, 0x05, 0x48, 0xFC,
+0xB7, 0x9C, 0x92, 0x69, 0x24, 0xA7, 0x26, 0x32, 0xD3, 0x55, 0xCB, 0x34, 0x23, 0x2D, 0x2B, 0xFA,
+0x86, 0x51, 0x0C, 0xB5, 0xB3, 0xAA, 0x5B, 0x98, 0x55, 0xE3, 0x2B, 0xBF, 0x47, 0xD3, 0xE6, 0x94,
+0x41, 0x22, 0x25, 0x99, 0xD7, 0x0C, 0x27, 0x19, 0x38, 0x31, 0x8C, 0xC8, 0xD8, 0x5B, 0xA9, 0xDA,
+0xF9, 0xEC, 0x64, 0x30, 0xC5, 0xCF, 0x7F, 0xE6, 0xE1, 0xB0, 0x03, 0x09, 0x8C, 0x65, 0x17, 0x4F,
+0xB4, 0x73, 0x8E, 0x49, 0x8B, 0xA1, 0xB0, 0x28, 0x07, 0x32, 0x5A, 0x6B, 0x6A, 0x4D, 0xCC, 0x51,
+0x17, 0x57, 0x75, 0x25, 0x05, 0x1E, 0x2D, 0xAB, 0x42, 0xA6, 0xAA, 0x5D, 0xEA, 0xDF, 0x96, 0x94,
+0x2F, 0x77, 0x64, 0x4B, 0xEF, 0x99, 0x1A, 0xE7, 0x91, 0x97, 0xE2, 0x93, 0x67, 0xD7, 0xB9, 0x3A,
+0x26, 0x4A, 0x90, 0xA9, 0x7B, 0xA6, 0xE2, 0x79, 0x14, 0x6D, 0xC5, 0x5F, 0x4C, 0x54, 0x22, 0x63,
+0x1A, 0xAE, 0x2C, 0xD9, 0xB5, 0x15, 0x7F, 0x3B, 0x91, 0xD9, 0x4C, 0x6D, 0xE3, 0x15, 0xD2, 0x3E,
+0x53, 0x5B, 0xFD, 0x72, 0x51, 0x0A, 0xF5, 0x21, 0x63, 0x68, 0xE7, 0xDD, 0x8F, 0x4E, 0x9B, 0x68,
+0xCA, 0x9F, 0xDC, 0x23, 0xAB, 0x0F, 0x04, 0x86, 0xBE, 0x8A, 0xBC, 0xB2, 0x17, 0x26, 0xD8, 0xED,
+0x08, 0x14, 0x68, 0x46, 0x62, 0x62, 0xB6, 0x71, 0x12, 0x26, 0xD8, 0xF3, 0xD7, 0xA0, 0x44, 0x43,
+0x93, 0x6E, 0xEB, 0xEE, 0x85, 0x58, 0xD7, 0xAE, 0xB3, 0xD6, 0xC8, 0x70, 0x52, 0xA7, 0x6D, 0xC2,
+0x1A, 0xC6, 0x56, 0x28, 0xCE, 0x79, 0x76, 0x58, 0xAE, 0x89, 0x63, 0xA7, 0xF3, 0x5E, 0xCE, 0xDB,
+0xF8, 0xB8, 0xDF, 0x63, 0x8A, 0x94, 0x4D, 0x91, 0xB0, 0x32, 0x67, 0x38, 0x8F, 0x08, 0xDE, 0x1C,
+0x7D, 0xEB, 0xF0, 0xA3, 0x06, 0x9F, 0xBB, 0x36, 0xE0, 0x7A, 0x70, 0xE7, 0x66, 0x10, 0xDD, 0x42,
+0xEC, 0x6E, 0xEB, 0xD5, 0xA1, 0x34, 0xAE, 0x20, 0x50, 0x10, 0xF8, 0x44, 0x22, 0x70, 0x47, 0x11,
+0x3B, 0x4D, 0x31, 0x32, 0x13, 0x06, 0x11, 0x38, 0x41, 0x62, 0x47, 0xB5, 0x8E, 0x66, 0xD1, 0x8A,
+0x2A, 0x24, 0x24, 0xCF, 0x08, 0x9E, 0xA9, 0x38, 0xC9, 0x99, 0xCA, 0x89, 0x9F, 0x8E, 0xB5, 0x69,
+0x3E, 0x0B, 0xD5, 0xA8, 0x48, 0x04, 0xD3, 0x9C, 0x90, 0xA8, 0x51, 0xAE, 0x6F, 0x50, 0xC0, 0x26,
+0xC7, 0x95, 0xD8, 0x31, 0xD5, 0xC9, 0x95, 0xD1, 0x09, 0x6C, 0x6F, 0xA6, 0xBB, 0x51, 0xDC, 0xCA,
+0x83, 0xF9, 0xD5, 0x1E, 0x3A, 0xB0, 0x4B, 0x94, 0xBB, 0x75, 0xBD, 0x3D, 0xB2, 0xA0, 0x93, 0xD4,
+0xCD, 0x41, 0xB9, 0xA3, 0xA9, 0x3A, 0x1D, 0x22, 0x55, 0x19, 0x00, 0xA6, 0xF0, 0x18, 0x64, 0xAE,
+0xA6, 0xA9, 0x6A, 0x63, 0x04, 0xD8, 0x9F, 0x1A, 0xD9, 0x52, 0x48, 0xAD, 0x82, 0x1C, 0x40, 0x21,
+0x48, 0xD9, 0x7B, 0xB9, 0xE2, 0x16, 0x55, 0x25, 0xBB, 0x75, 0xBC, 0x5E, 0xCD, 0x80, 0x7E, 0x59,
+0xAE, 0x44, 0xF9, 0x79, 0xE7, 0x78, 0xD2, 0xD2, 0xCA, 0xFD, 0x6A, 0xD1, 0xD6, 0x7E, 0x65, 0xB7,
+0xB2, 0x1E, 0x78, 0x5F, 0x33, 0x62, 0x97, 0x5F, 0x1A, 0xFB, 0x57, 0x3D, 0xC9, 0xC0, 0x09, 0xFA,
+0x29, 0xCA, 0x6E, 0x1F, 0x1B, 0xD7, 0x87, 0x8D, 0x20, 0xCE, 0x7C, 0xBE, 0xDA, 0xC7, 0x0C, 0xC6,
+0xEC, 0xD2, 0xF5, 0x91, 0x30, 0x34, 0x8E, 0x1F, 0x2C, 0xB8, 0x5F, 0xBB, 0x10, 0x3B, 0x35, 0x79,
+0x56, 0x0E, 0x9F, 0xDB, 0x36, 0x91, 0x5D, 0x71, 0xD5, 0x1F, 0x2D, 0xA9, 0xCF, 0x69, 0xAC, 0xAD,
+0xA0, 0xFD, 0x89, 0xBF, 0x81, 0xF2, 0x9A, 0x8D, 0x38, 0xDA, 0x40, 0xC6, 0x71, 0x11, 0xD5, 0x97,
+0xF3, 0x08, 0xC4, 0x8E, 0xF8, 0x32, 0x49, 0xB3, 0xEE, 0x38, 0x51, 0x88, 0xDD, 0x6A, 0xCF, 0x87,
+0x52, 0x7F, 0x41, 0xA0, 0x20, 0x70, 0xE7, 0x21, 0xB0, 0xFA, 0x2B, 0xCD, 0x6D, 0x82, 0xA9, 0x04,
+0x2E, 0x30, 0x5A, 0x10, 0x44, 0x6A, 0x02, 0x7E, 0x76, 0xB3, 0xF0, 0x6D, 0x1B, 0x1D, 0x82, 0x0F,
+0x14, 0x77, 0x5A, 0x88, 0xD1, 0x7E, 0xAA, 0xDA, 0xA4, 0x95, 0xCD, 0x3D, 0xEB, 0xDC, 0x8F, 0xCC,
+0x16, 0x7E, 0x53, 0x7A, 0xD4, 0xE7, 0x2B, 0x19, 0x68, 0x5D, 0xC7, 0x8B, 0x7E, 0x69, 0x51, 0xE4,
+0x32, 0x3F, 0x22, 0x2A, 0x40, 0x20, 0x73, 0x13, 0xE3, 0xE3, 0x42, 0x9C, 0xB8, 0xA5, 0xD8, 0xD9,
+0xEB, 0x63, 0xE2, 0xE4, 0x7E, 0x3B, 0x1C, 0xDC, 0xF2, 0xEA, 0x67, 0x9F, 0x7A, 0x00, 0x69, 0x28,
+0x36, 0x8A, 0xDA, 0xC3, 0x45, 0x98, 0x09, 0x8B, 0x99, 0xDF, 0x4E, 0xE5, 0x2A, 0xB6, 0x32, 0xF9,
+0xC0, 0x49, 0x94, 0xA4, 0xF9, 0x63, 0xA9, 0x5A, 0xA9, 0xFE, 0x58, 0xAA, 0xF4, 0xF0, 0x8F, 0x96,
+0x75, 0x3C, 0xF2, 0x9D, 0x28, 0x84, 0x40, 0x58, 0x84, 0x68, 0xCA, 0x79, 0x46, 0x3F, 0x2D, 0x55,
+0x79, 0xFC, 0x3E, 0x72, 0x0F, 0xB9, 0x8F, 0xA9, 0x63, 0xA6, 0x20, 0xB9, 0xEA, 0x97, 0xEF, 0x2F,
+0x5B, 0x21, 0x94, 0xD1, 0xF7, 0x4E, 0xEF, 0xA3, 0x51, 0xBB, 0xA6, 0x1A, 0xB2, 0xFE, 0x4C, 0xD9,
+0x13, 0x3F, 0x31, 0xF3, 0x31, 0xD3, 0xD6, 0x7A, 0x39, 0x15, 0x72, 0x9D, 0xD2, 0xA8, 0x22, 0x67,
+0x8A, 0x95, 0xF7, 0x31, 0x53, 0xF5, 0x1C, 0x22, 0x12, 0xE1, 0x99, 0x09, 0xAA, 0x9D, 0x88, 0xFE,
+0xEC, 0xE8, 0x08, 0x77, 0xEF, 0xD9, 0xD6, 0xC4, 0xC4, 0xC4, 0xD3, 0xE1, 0xC8, 0xD9, 0x4B, 0x98,
+0xEB, 0x30, 0xC3, 0x32, 0x70, 0xA2, 0x9B, 0xFE, 0x75, 0x0A, 0xA9, 0xAA, 0xD0, 0xF6, 0xC8, 0xB0,
+0x48, 0x51, 0xC4, 0xAA, 0x88, 0xAA, 0xE9, 0xD5, 0x14, 0x52, 0x57, 0x32, 0x4D, 0x2D, 0x75, 0xB5,
+0x2E, 0xC7, 0xD3, 0x23, 0x68, 0xAB, 0x91, 0xB0, 0x49, 0xD9, 0x93, 0xA0, 0x09, 0x12, 0x3B, 0x04,
+0x92, 0xD0, 0xD3, 0xAF, 0x1F, 0x81, 0x13, 0x0C, 0xDC, 0xA1, 0x1B, 0x40, 0x33, 0x82, 0x49, 0x6E,
+0x87, 0xCF, 0x56, 0x69, 0x43, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x68, 0x16, 0x02, 0x77, 0x0C, 0xB1,
+0x23, 0xA0, 0x4C, 0x2D, 0x72, 0x61, 0x90, 0x0A, 0x19, 0x89, 0xDD, 0x6C, 0x18, 0x1B, 0x61, 0x32,
+0xDE, 0x8A, 0xE4, 0x53, 0x15, 0xEF, 0xB2, 0x51, 0x70, 0x61, 0x46, 0x08, 0x8C, 0xD2, 0x0E, 0x25,
+0x30, 0x0B, 0x46, 0x4A, 0xCF, 0x24, 0xBA, 0xA7, 0xE5, 0xFC, 0x1C, 0x9F, 0x4E, 0x21, 0xE5, 0xC9,
+0x0C, 0xB6, 0x7C, 0xA2, 0x62, 0x77, 0x71, 0x78, 0x32, 0x8C, 0xD8, 0xBE, 0xB1, 0x0B, 0xEB, 0x6A,
+0xD6, 0x34, 0xD0, 0xFB, 0xD0, 0x34, 0xF6, 0xE0, 0xFE, 0x9D, 0x50, 0xED, 0x76, 0x8B, 0xDF, 0x1D,
+0xDB, 0xC3, 0xA8, 0x4E, 0x2A, 0x4F, 0x24, 0xC0, 0xA9, 0xB7, 0x75, 0x64, 0x2A, 0x6B, 0xBC, 0x92,
+0x24, 0x75, 0xAE, 0xAF, 0x2A, 0x9D, 0xD6, 0x97, 0x88, 0x59, 0xEA, 0x6D, 0x54, 0xC9, 0x8C, 0x3B,
+0xC6, 0x31, 0x59, 0xA0, 0x32, 0x65, 0xAA, 0x5B, 0x0E, 0x56, 0x1C, 0xC2, 0xAA, 0x8F, 0x58, 0xF4,
+0x0D, 0x73, 0x66, 0x66, 0x3D, 0xD0, 0xFB, 0x59, 0x1F, 0x62, 0x3B, 0x85, 0xCA, 0xC4, 0xF3, 0x9E,
+0x1A, 0xC7, 0x47, 0x20, 0x4E, 0x13, 0x1B, 0xF7, 0x48, 0x5E, 0xF3, 0x21, 0x92, 0xCB, 0x95, 0xBC,
+0xCF, 0xC0, 0x8C, 0xCD, 0xFA, 0x3A, 0xE1, 0x47, 0x76, 0xF7, 0xEE, 0xED, 0x4D, 0x24, 0x76, 0x33,
+0xE1, 0xE8, 0xF9, 0x2B, 0x61, 0x1A, 0x0D, 0x6E, 0x05, 0xA9, 0x6C, 0x15, 0xFF, 0x3A, 0x35, 0x3B,
+0x47, 0x49, 0xD2, 0x3A, 0x13, 0x89, 0xA8, 0xBD, 0xA5, 0xC4, 0x2F, 0xCD, 0x57, 0xED, 0x9A, 0x9D,
+0xAB, 0xBC, 0x57, 0x7B, 0x2E, 0xBB, 0x26, 0x62, 0xAB, 0x44, 0x5C, 0xE6, 0x00, 0xE6, 0x10, 0x49,
+0x1D, 0xD5, 0xC4, 0x0E, 0xEC, 0x82, 0xB1, 0x9D, 0xA9, 0x5F, 0x24, 0x42, 0xB8, 0xB9, 0xF3, 0xBB,
+0xDC, 0xAD, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x09, 0x08, 0xDC, 0x31, 0xC4, 0xCE, 0x77, 0x9C,
+0x38, 0x79, 0x6D, 0x54, 0x08, 0x1E, 0x89, 0xDD, 0x04, 0x88, 0x1D, 0x55, 0x15, 0x59, 0x8B, 0xA2,
+0x8F, 0x9D, 0x2D, 0x52, 0xAE, 0xDC, 0x91, 0xC8, 0x89, 0x5C, 0xA4, 0x8B, 0x9C, 0x69, 0x54, 0xAA,
+0x20, 0xC5, 0x19, 0xA2, 0x84, 0xC0, 0xBC, 0xCC, 0xE2, 0x7B, 0xEE, 0xA1, 0xE5, 0xAA, 0x9E, 0x13,
+0x8D, 0x59, 0x6C, 0xF3, 0x34, 0x0E, 0xD5, 0x6E, 0x06, 0x04, 0xF3, 0x2A, 0x22, 0x63, 0x47, 0xE9,
+0x67, 0x77, 0x0B, 0xB6, 0x17, 0xAB, 0x37, 0xC1, 0xD7, 0xF5, 0x75, 0x87, 0x9F, 0x7A, 0xE2, 0xFE,
+0x70, 0x10, 0xDB, 0x5F, 0xCD, 0x33, 0x92, 0x12, 0x1D, 0x15, 0x62, 0xC7, 0xC5, 0x99, 0xA9, 0x59,
+0x14, 0x2C, 0x01, 0x45, 0x55, 0x34, 0x5B, 0xFC, 0xAD, 0xD7, 0xAE, 0xAE, 0x59, 0xB0, 0xAC, 0x94,
+0x4D, 0x0B, 0x38, 0x55, 0x20, 0xCB, 0x89, 0x66, 0x51, 0xC2, 0x56, 0x9B, 0xE2, 0x17, 0x7D, 0xE2,
+0x4C, 0xED, 0xE1, 0xB5, 0x4E, 0x0E, 0x44, 0xA9, 0x33, 0x05, 0x30, 0xFA, 0x3E, 0xDA, 0x28, 0xB8,
+0xCA, 0x27, 0x7F, 0x35, 0xA7, 0x9C, 0x2B, 0x82, 0x51, 0xC5, 0xCB, 0x7C, 0xF6, 0xB4, 0xB8, 0x91,
+0x44, 0xA9, 0x53, 0xEF, 0xA7, 0xFE, 0x63, 0x3A, 0x6A, 0xD9, 0x69, 0x55, 0xBB, 0x4C, 0xC8, 0x95,
+0x3B, 0x9A, 0xD2, 0x94, 0xFA, 0x62, 0x2A, 0x9F, 0x31, 0x7E, 0xCE, 0x03, 0xC9, 0x05, 0x48, 0x62,
+0x07, 0x13, 0x37, 0x15, 0xBB, 0xA6, 0xED, 0x38, 0x81, 0x54, 0x27, 0x47, 0xCE, 0x5F, 0x83, 0x2F,
+0x29, 0xDA, 0x84, 0x1D, 0x27, 0x5A, 0x90, 0x98, 0x58, 0xA7, 0x37, 0x41, 0xB1, 0xBE, 0xDA, 0x18,
+0x24, 0xA5, 0x4D, 0xC7, 0xC5, 0x23, 0x5B, 0x23, 0x1E, 0x82, 0x91, 0x8F, 0x8B, 0x45, 0xCD, 0x3A,
+0xC6, 0x99, 0x92, 0x57, 0x51, 0x32, 0xB3, 0x48, 0x58, 0x51, 0x37, 0x89, 0x26, 0x82, 0x70, 0xF8,
+0x79, 0x9B, 0x46, 0xDB, 0xBA, 0x11, 0x09, 0x7B, 0x08, 0xBB, 0x9E, 0x74, 0x17, 0xFF, 0xBA, 0x3B,
+0x61, 0x7D, 0x29, 0x7D, 0x2C, 0x08, 0x14, 0x04, 0x6E, 0x01, 0x02, 0x77, 0x0C, 0xB1, 0xE3, 0xB2,
+0xC6, 0xDC, 0x75, 0x97, 0x90, 0x3B, 0x8E, 0xC1, 0x0A, 0x93, 0x08, 0x60, 0x98, 0x42, 0x9E, 0x31,
+0x59, 0x78, 0xA2, 0x64, 0xE4, 0x23, 0x90, 0xC9, 0x41, 0xFE, 0x94, 0x8B, 0x7B, 0x1D, 0x7D, 0x4E,
+0xAF, 0xC8, 0x0A, 0x59, 0x15, 0x7A, 0x26, 0x97, 0x95, 0xD2, 0xE8, 0x32, 0x81, 0xEC, 0xD8, 0x28,
+0x36, 0x87, 0xC7, 0xDF, 0xE1, 0xC9, 0x19, 0x49, 0xBF, 0x72, 0x61, 0x68, 0x42, 0xCC, 0x67, 0xB7,
+0xFA, 0xE0, 0x4E, 0x00, 0xF7, 0xEF, 0xDB, 0x16, 0x1E, 0x87, 0xAF, 0xDD, 0x66, 0xA4, 0xA4, 0xA0,
+0x49, 0x96, 0xB9, 0xFF, 0x44, 0xB9, 0x63, 0xBA, 0x8A, 0x5A, 0xAC, 0x32, 0x85, 0x66, 0xB1, 0xFE,
+0x26, 0x8C, 0xA2, 0xB4, 0xB6, 0x88, 0x32, 0xEA, 0x4A, 0x10, 0xA1, 0xCB, 0x54, 0xA1, 0x0C, 0x14,
+0x35, 0x93, 0x1A, 0xB6, 0xD9, 0xBD, 0x53, 0xE4, 0x66, 0x4E, 0xB2, 0xAD, 0x9E, 0x1C, 0xD4, 0xD8,
+0x04, 0x53, 0x93, 0x6A, 0x14, 0xDB, 0x2A, 0x61, 0xB7, 0x66, 0x58, 0xD1, 0x7C, 0x76, 0xE8, 0x5D,
+0x5C, 0x95, 0x72, 0xB5, 0x4F, 0xCB, 0x73, 0x3F, 0xE0, 0x59, 0x98, 0xB0, 0x99, 0x98, 0x78, 0x43,
+0x7F, 0x5F, 0xD8, 0xB6, 0x71, 0x1D, 0x72, 0xD9, 0xAD, 0xFE, 0x47, 0x8D, 0xF3, 0x69, 0x70, 0x64,
+0x3C, 0x5C, 0x1C, 0x1C, 0x0B, 0x73, 0x20, 0xE5, 0xAD, 0x1D, 0x3D, 0xC8, 0x4B, 0xEC, 0x7E, 0x6C,
+0x09, 0xFB, 0x8A, 0xD2, 0x9C, 0x8F, 0x9F, 0x99, 0x60, 0xAD, 0x67, 0xD2, 0x99, 0x5C, 0x4D, 0xF5,
+0xF3, 0xEA, 0xBF, 0xA8, 0xE3, 0xE3, 0xBE, 0xA3, 0x69, 0xBA, 0xDB, 0xCC, 0xCF, 0x71, 0x9D, 0xA5,
+0x39, 0x1F, 0x81, 0x13, 0x68, 0x1F, 0x7D, 0x39, 0xF7, 0x6D, 0xDB, 0x58, 0x76, 0x9C, 0xB8, 0xD5,
+0x1F, 0xF4, 0x72, 0xFF, 0x82, 0x40, 0x41, 0x60, 0xCD, 0x22, 0xB0, 0xFA, 0xAB, 0xCD, 0x2D, 0x86,
+0x4E, 0x95, 0x19, 0x3C, 0xA0, 0x60, 0xD0, 0x97, 0x6D, 0x08, 0xEA, 0x18, 0x4D, 0x42, 0x63, 0xC3,
+0xC3, 0x62, 0x5E, 0xCC, 0xED, 0x41, 0xAA, 0x69, 0x98, 0x4F, 0x98, 0x58, 0xAF, 0x92, 0x0F, 0x9D,
+0x3E, 0xA3, 0x6A, 0x91, 0x16, 0x74, 0xCF, 0x03, 0xE6, 0x75, 0x98, 0xA0, 0x64, 0xC1, 0xB4, 0xAE,
+0xE0, 0xA5, 0xA8, 0x42, 0xB7, 0xE1, 0xB2, 0x3D, 0xA3, 0x50, 0x0B, 0x67, 0xE1, 0x8B, 0x35, 0x85,
+0xC5, 0xEE, 0xC3, 0x8B, 0x43, 0xE1, 0x83, 0xF3, 0x43, 0x92, 0xFA, 0xE4, 0x76, 0x38, 0xB8, 0x31,
+0xFB, 0x17, 0x1F, 0x3D, 0x18, 0xEE, 0x83, 0x09, 0x51, 0x7D, 0xED, 0x5A, 0x62, 0x20, 0x85, 0x26,
+0x73, 0x8E, 0xAC, 0xC6, 0x22, 0x5F, 0x55, 0x49, 0xF3, 0x4D, 0x48, 0x75, 0xEF, 0x55, 0x9E, 0x32,
+0x62, 0x10, 0xCD, 0x9D, 0x66, 0xA6, 0x15, 0xC5, 0xAB, 0xC6, 0xDF, 0x8D, 0x8A, 0x99, 0x48, 0x63,
+0xAE, 0x7E, 0x79, 0xDC, 0xB1, 0x39, 0x88, 0x59, 0x1D, 0x5E, 0x26, 0xE6, 0xCB, 0xF3, 0xF3, 0xB5,
+0xBE, 0x6F, 0xA2, 0xDC, 0x65, 0x26, 0x61, 0x29, 0xE7, 0xED, 0x54, 0x5F, 0x32, 0xE1, 0x26, 0x36,
+0x3F, 0xDC, 0xF7, 0x2C, 0x46, 0xDA, 0x8A, 0x72, 0xA7, 0x6A, 0x95, 0x47, 0x7C, 0xE6, 0xE6, 0x59,
+0xAD, 0xDB, 0xFC, 0x0A, 0x85, 0x6C, 0x6A, 0x9F, 0x19, 0x1C, 0xC3, 0x2D, 0xD9, 0xE6, 0xA1, 0xC0,
+0xB6, 0xC3, 0xEC, 0xB8, 0x93, 0x69, 0x3D, 0x90, 0xEE, 0xA4, 0x19, 0xBE, 0x64, 0x13, 0x30, 0xEF,
+0x9F, 0x47, 0xE0, 0x04, 0xE7, 0x51, 0x0B, 0x76, 0x9A, 0x68, 0x93, 0xFD, 0x61, 0x75, 0xB0, 0xE4,
+0x3F, 0xFF, 0x2C, 0xF8, 0x78, 0x64, 0x7D, 0x4B, 0xBE, 0x73, 0x86, 0x89, 0xCC, 0x75, 0x53, 0x66,
+0xA3, 0x6A, 0xA7, 0x63, 0xEA, 0x91, 0xCF, 0xEE, 0xDF, 0xA8, 0xE3, 0x9C, 0xE9, 0xD5, 0x52, 0xDE,
+0xF3, 0x0A, 0xE2, 0x39, 0xD2, 0xFB, 0x50, 0xED, 0x65, 0x99, 0x1E, 0x10, 0xBB, 0xDD, 0x88, 0x10,
+0xA6, 0x89, 0xBA, 0x19, 0x98, 0xDC, 0x0E, 0x9F, 0xA7, 0xD2, 0x86, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0xD0, 0x4C, 0x04, 0xD6, 0x3C, 0xB1, 0x73, 0x30, 0x99, 0xE6, 0xE4, 0x32, 0xD4, 0xBA, 0x31, 0x2C,
+0x7A, 0x54, 0x0E, 0xE8, 0x5F, 0x27, 0xC4, 0x6E, 0xC1, 0xC1, 0x05, 0xCA, 0x8F, 0x5C, 0x41, 0xAB,
+0x51, 0xD3, 0x72, 0x45, 0x22, 0xAF, 0xC3, 0x8B, 0xC9, 0x42, 0x17, 0x19, 0x90, 0x31, 0x21, 0xE7,
+0x44, 0x08, 0xA0, 0x80, 0x62, 0x38, 0x8D, 0x85, 0x98, 0x66, 0xE1, 0xD3, 0xD7, 0xC6, 0xC2, 0x47,
+0x57, 0x47, 0xC3, 0x28, 0xF2, 0xDA, 0xD5, 0x0A, 0x62, 0xCD, 0x9C, 0x0C, 0x7E, 0x2F, 0xF5, 0x0B,
+0xDB, 0x1A, 0x9E, 0x80, 0xAF, 0x1D, 0x93, 0x16, 0x33, 0xB9, 0x2D, 0x09, 0xCB, 0x1C, 0xB7, 0x19,
+0x93, 0xC8, 0x46, 0xC3, 0x2D, 0x62, 0x60, 0x8A, 0x55, 0x45, 0xBD, 0xF3, 0x2E, 0xD7, 0x28, 0x63,
+0x19, 0xB6, 0xA9, 0xAF, 0xA6, 0xCE, 0x65, 0xD7, 0x47, 0x35, 0x2C, 0x62, 0x68, 0x17, 0x66, 0xC2,
+0x53, 0x85, 0x60, 0x1A, 0x91, 0x8C, 0x6A, 0x13, 0x6F, 0x5F, 0x19, 0x3E, 0xBB, 0x47, 0x4D, 0x7D,
+0x4A, 0x48, 0xD2, 0xE1, 0x63, 0x26, 0xDC, 0x27, 0x1B, 0x3F, 0x2D, 0x95, 0xDA, 0x29, 0x75, 0xFB,
+0x23, 0x8E, 0x2E, 0xFD, 0xEB, 0x80, 0xD3, 0x34, 0xF6, 0x21, 0xE6, 0xB6, 0x59, 0x50, 0xCB, 0xEE,
+0xDA, 0xBE, 0x19, 0x66, 0xD8, 0xE6, 0xE4, 0xAF, 0xE3, 0xFC, 0x39, 0x75, 0x69, 0x10, 0x5B, 0xE6,
+0x21, 0x20, 0xA8, 0x0D, 0xFE, 0x75, 0x1D, 0xE6, 0x5F, 0x97, 0xF5, 0x44, 0xBB, 0x94, 0xB0, 0x10,
+0xEB, 0xB1, 0xF2, 0x69, 0x23, 0x7F, 0x0E, 0x9C, 0x76, 0xCE, 0x7D, 0x49, 0x79, 0x99, 0x97, 0x49,
+0x10, 0xE6, 0x98, 0xDA, 0x5C, 0x37, 0xB2, 0x1C, 0x3F, 0x41, 0x9C, 0x2F, 0x30, 0xE5, 0x93, 0xF6,
+0xAE, 0x47, 0xB4, 0xF5, 0xD6, 0xF5, 0xFD, 0xB2, 0x4F, 0x71, 0x33, 0x22, 0x84, 0x6F, 0xC5, 0x67,
+0xA7, 0xDC, 0xB3, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x6A, 0x04, 0xEE, 0x18, 0x62, 0x37, 0x39,
+0x3D, 0x27, 0xE4, 0x89, 0x04, 0x8F, 0x84, 0x6E, 0x5C, 0x76, 0x9C, 0xB0, 0x85, 0x4B, 0xD4, 0x1E,
+0x0B, 0x94, 0x74, 0x5B, 0x9C, 0x28, 0x32, 0xEE, 0x1F, 0xA6, 0xFE, 0x5D, 0x5A, 0xDE, 0x1F, 0xA6,
+0xED, 0xC9, 0x79, 0x5D, 0xD9, 0x3D, 0x6F, 0x5D, 0xF4, 0xC3, 0x92, 0xF3, 0xEE, 0xB3, 0xA5, 0xE5,
+0x5C, 0xDD, 0xA0, 0xBF, 0x11, 0xA3, 0x63, 0x49, 0x32, 0x2F, 0x8F, 0x4E, 0x85, 0xF3, 0x48, 0x9A,
+0x7C, 0x7D, 0x0C, 0xBE, 0x48, 0x95, 0xD4, 0x22, 0xB7, 0x6E, 0x7A, 0xF4, 0x61, 0x97, 0x84, 0xCF,
+0x3E, 0xB8, 0x3F, 0x3C, 0xB2, 0x7F, 0x87, 0xA4, 0xCD, 0x90, 0xDC, 0x76, 0x50, 0xEF, 0xA8, 0xD8,
+0xCD, 0x73, 0x7F, 0x5B, 0xE9, 0x8C, 0xF5, 0xC7, 0xD4, 0x37, 0x57, 0xED, 0xCC, 0xD5, 0x2C, 0xD1,
+0x22, 0x53, 0x7E, 0x44, 0x65, 0x23, 0x7E, 0x02, 0x98, 0xA9, 0x67, 0x42, 0x96, 0xFC, 0xB9, 0x5D,
+0xE9, 0xBE, 0x76, 0xEE, 0xDC, 0x98, 0xF9, 0x3F, 0x3A, 0xD9, 0x72, 0xC5, 0x2F, 0x3A, 0xC3, 0xB1,
+0x5E, 0xF3, 0x7D, 0x53, 0xB2, 0xA2, 0x03, 0x1A, 0xA3, 0x6C, 0x23, 0x7B, 0xC9, 0xEE, 0xC7, 0xFB,
+0x98, 0xB2, 0x14, 0xF3, 0xD1, 0x49, 0xFB, 0x54, 0x51, 0x54, 0x1F, 0x34, 0xF5, 0x3D, 0xE3, 0x7D,
+0x64, 0xE4, 0x25, 0xCA, 0xD7, 0x54, 0x2B, 0x57, 0x6F, 0x2D, 0x38, 0x41, 0xDA, 0x06, 0x7C, 0x84,
+0xD8, 0xE1, 0x69, 0x3B, 0x08, 0xF2, 0xBD, 0xFB, 0xB6, 0x8B, 0x4A, 0xD5, 0x8C, 0x63, 0x08, 0x7B,
+0xC3, 0x1E, 0x3E, 0x7F, 0x15, 0x89, 0x89, 0x31, 0x52, 0x20, 0x95, 0xAD, 0x4C, 0x4E, 0x2C, 0x3C,
+0xCD, 0x15, 0x4A, 0x9F, 0xA8, 0xDA, 0x7E, 0x8F, 0x80, 0x55, 0xDC, 0xF4, 0xB5, 0x2A, 0x94, 0x49,
+0x6D, 0xF3, 0xDD, 0x3B, 0x64, 0xDE, 0xBA, 0x5F, 0x9D, 0xAB, 0x76, 0x2E, 0x41, 0xFB, 0x67, 0xC2,
+0x3E, 0x08, 0x71, 0x4F, 0x59, 0x22, 0xC5, 0x44, 0xD7, 0x88, 0xAA, 0x66, 0xEE, 0xBA, 0xFD, 0xDB,
+0x36, 0x09, 0xD1, 0xA5, 0xB9, 0x7F, 0x81, 0x49, 0xBF, 0x19, 0x00, 0x95, 0x7B, 0x14, 0x04, 0x0A,
+0x02, 0x05, 0x81, 0x3B, 0x00, 0x81, 0x3B, 0x86, 0xD8, 0xD1, 0xE4, 0x79, 0x76, 0x70, 0x5C, 0xFC,
+0xEB, 0x66, 0x10, 0x95, 0x3A, 0x35, 0x8E, 0x1D, 0x27, 0x40, 0xA2, 0xA2, 0x62, 0xB3, 0x40, 0xB6,
+0xA9, 0xA3, 0xE3, 0xC8, 0xA9, 0x45, 0xCE, 0xE7, 0xA7, 0xA3, 0x5C, 0xA1, 0x4F, 0x2A, 0x6F, 0x99,
+0x8C, 0x44, 0x7F, 0xB5, 0x71, 0xF8, 0xD9, 0xD1, 0xDF, 0x6E, 0x02, 0x66, 0xBB, 0x2B, 0x20, 0x75,
+0xA7, 0xA0, 0xDC, 0x51, 0x6D, 0xB9, 0x1D, 0x8E, 0x4E, 0x6C, 0x35, 0x76, 0x60, 0xC7, 0x26, 0x51,
+0xED, 0x76, 0x6D, 0x5A, 0x07, 0xA2, 0xD0, 0x26, 0x09, 0x95, 0xE7, 0xF8, 0xA0, 0x72, 0x17, 0x15,
+0x2C, 0xEB, 0x9D, 0x63, 0x53, 0x83, 0x43, 0xE4, 0xC9, 0x42, 0xB6, 0x84, 0x65, 0x64, 0xDD, 0xAB,
+0xB9, 0x36, 0xBE, 0x93, 0x94, 0xA0, 0x85, 0x7A, 0x9A, 0x91, 0x71, 0x23, 0x2C, 0xA9, 0xB2, 0x9A,
+0x1B, 0x0B, 0xEF, 0xF4, 0xFA, 0xB3, 0xF7, 0xA2, 0x5A, 0x95, 0x9F, 0x4B, 0xE2, 0x9B, 0xDC, 0x2F,
+0x57, 0x63, 0x17, 0x56, 0x6B, 0x7D, 0xB7, 0x3B, 0xE7, 0x5D, 0x20, 0xAF, 0x63, 0x62, 0x62, 0x24,
+0xBE, 0x26, 0xB9, 0xE9, 0x41, 0xE4, 0xE7, 0x9E, 0xAD, 0x1B, 0xC5, 0xEC, 0xB8, 0x9A, 0x07, 0x9B,
+0xCB, 0x1F, 0x08, 0xCC, 0x5D, 0x77, 0xFA, 0x0A, 0x5C, 0x0C, 0x70, 0x33, 0x46, 0xC4, 0xE6, 0xFE,
+0x75, 0xDA, 0xAF, 0x9A, 0x56, 0x64, 0xE3, 0x91, 0xDE, 0xAF, 0xC1, 0xCA, 0x67, 0x70, 0x65, 0x7C,
+0xBD, 0x4C, 0xBD, 0x49, 0x9F, 0x0F, 0x2F, 0x6A, 0x9D, 0x81, 0x7F, 0x1D, 0xE6, 0x7A, 0x3B, 0x7E,
+0x1C, 0x1C, 0xC4, 0xD6, 0x75, 0x87, 0x76, 0x6D, 0x2D, 0xFE, 0x75, 0xAB, 0x39, 0x19, 0x4A, 0xDD,
+0x05, 0x81, 0x82, 0xC0, 0x1D, 0x8F, 0xC0, 0x9A, 0x26, 0x76, 0xA2, 0x54, 0x98, 0x8A, 0x23, 0xA9,
+0x4E, 0xB0, 0xE3, 0x04, 0xA3, 0x4F, 0xA7, 0x90, 0x63, 0x8C, 0x7E, 0x50, 0x3C, 0x54, 0xB1, 0xA1,
+0x68, 0xA4, 0x4A, 0x8C, 0xEA, 0x6E, 0xA2, 0xC9, 0x44, 0xFF, 0x24, 0x8D, 0xB4, 0xD4, 0xBA, 0xEC,
+0xA4, 0xFE, 0x89, 0xEB, 0x1A, 0x59, 0x84, 0x12, 0x82, 0xE8, 0x8F, 0x65, 0x6F, 0x6B, 0x8D, 0xFA,
+0x42, 0x55, 0x0F, 0xAD, 0x9F, 0xAA, 0xE1, 0x28, 0xFC, 0xFC, 0x18, 0x98, 0xC0, 0x45, 0x6F, 0x04,
+0x66, 0xB4, 0x77, 0xCE, 0x5D, 0x0F, 0x63, 0x53, 0xB7, 0x87, 0x9F, 0x1D, 0x9B, 0xDC, 0x0B, 0x13,
+0xE2, 0xD3, 0xF7, 0xEE, 0x0E, 0x4F, 0xDD, 0xBD, 0x4B, 0x16, 0x63, 0x06, 0x9F, 0x90, 0x34, 0x90,
+0xDC, 0x69, 0x84, 0x6C, 0xF2, 0xC1, 0x12, 0x45, 0xCB, 0x14, 0x1F, 0xF7, 0x57, 0x13, 0x7F, 0x39,
+0x51, 0x8B, 0x8C, 0x2C, 0x89, 0xD9, 0x53, 0x7D, 0xE6, 0x92, 0x8A, 0xE4, 0x7E, 0x6E, 0xC9, 0xFF,
+0xCD, 0xA4, 0x4D, 0x53, 0x37, 0x6B, 0x7C, 0xEC, 0x32, 0x85, 0x4D, 0xEF, 0xA9, 0x75, 0xF1, 0x1A,
+0xCF, 0xBF, 0x26, 0x46, 0xC5, 0xFC, 0xDE, 0xA6, 0xC8, 0x7A, 0xBD, 0xBE, 0x6B, 0x42, 0xA5, 0x9D,
+0x99, 0xEA, 0x14, 0xEB, 0x74, 0x95, 0xCF, 0xC9, 0x9E, 0xDD, 0x43, 0x94, 0x2D, 0x9B, 0x25, 0x69,
+0xDE, 0xE8, 0xFC, 0xA1, 0xA9, 0x7A, 0x0E, 0xC9, 0x89, 0x39, 0x57, 0x68, 0x7A, 0xDC, 0x34, 0xD0,
+0x87, 0x7C, 0x72, 0xAB, 0xFB, 0x31, 0x63, 0x7B, 0x27, 0x10, 0x84, 0x33, 0x04, 0xE5, 0x97, 0xFB,
+0x0F, 0x6B, 0xE0, 0x44, 0x97, 0x98, 0xD0, 0x55, 0x44, 0x33, 0x0C, 0x35, 0xEA, 0x41, 0x66, 0xA4,
+0x60, 0x66, 0xFD, 0x8B, 0xBE, 0x77, 0x39, 0x66, 0xFA, 0xE1, 0x30, 0xB3, 0xAD, 0x96, 0xCD, 0xC7,
+0x37, 0xFA, 0x2F, 0x66, 0xD7, 0x78, 0x94, 0xB0, 0xA6, 0xBC, 0xE1, 0x7D, 0x31, 0x47, 0xA6, 0x91,
+0xCF, 0x0F, 0x98, 0xB4, 0xB7, 0xB5, 0x84, 0x7B, 0x11, 0x1D, 0x7C, 0xFF, 0xDE, 0xE6, 0xA5, 0x7E,
+0xB9, 0xE3, 0xBF, 0xDD, 0x0B, 0x00, 0x05, 0x81, 0x82, 0xC0, 0x1D, 0x89, 0xC0, 0xEA, 0xAE, 0x38,
+0xB7, 0x09, 0xA4, 0x24, 0x75, 0x34, 0x73, 0x0E, 0x8E, 0x21, 0x70, 0x02, 0x8A, 0xD8, 0xE4, 0xE8,
+0x28, 0x52, 0x6B, 0x31, 0x29, 0x70, 0x92, 0x5B, 0x74, 0xA9, 0xF6, 0xA3, 0xC6, 0xCF, 0x4E, 0x16,
+0xC7, 0x85, 0x9D, 0xC9, 0xCB, 0xCB, 0xBB, 0x6E, 0x8A, 0xB2, 0x85, 0xAD, 0x72, 0x89, 0x2B, 0x1E,
+0x46, 0xF2, 0xB8, 0x30, 0x4E, 0xC2, 0x14, 0x3B, 0x35, 0xA1, 0x5B, 0x9A, 0x4D, 0xC1, 0x7E, 0x76,
+0x1A, 0xD1, 0xB1, 0x34, 0xC9, 0x72, 0xDB, 0xA5, 0xDB, 0xE1, 0xE0, 0x16, 0x58, 0xFB, 0x11, 0xC1,
+0xF8, 0xF8, 0xA1, 0x5D, 0xE1, 0x5E, 0xF8, 0xDC, 0x6D, 0xDD, 0xD0, 0x0F, 0xAE, 0x40, 0x7F, 0x3B,
+0xAA, 0x76, 0xAA, 0x76, 0xA6, 0x7E, 0x2B, 0x46, 0x55, 0x65, 0x28, 0x53, 0xBF, 0x5C, 0xE1, 0xD3,
+0x0B, 0xBC, 0xB0, 0xE1, 0x9A, 0xF9, 0x23, 0x46, 0xAC, 0x4D, 0x61, 0x4A, 0x7F, 0x2A, 0x4A, 0x9A,
+0x70, 0x12, 0x81, 0x9C, 0x84, 0xC3, 0xD0, 0xCA, 0x31, 0xCE, 0x6E, 0x93, 0xDF, 0x92, 0xCF, 0x9D,
+0x68, 0xA7, 0x26, 0xA5, 0x79, 0x10, 0xFB, 0x90, 0xCD, 0x85, 0xCA, 0xE0, 0x9B, 0xE2, 0xE7, 0xCD,
+0x34, 0x3A, 0x27, 0xA5, 0x35, 0x1A, 0x96, 0xA9, 0x61, 0xB0, 0x1F, 0x2A, 0x14, 0xCE, 0x5D, 0x9B,
+0x36, 0x84, 0x01, 0x4B, 0xC4, 0xBB, 0x9A, 0xE3, 0x39, 0x8D, 0xFB, 0x9D, 0x1F, 0x1C, 0x0D, 0x67,
+0xAE, 0x8D, 0x84, 0x51, 0xFE, 0x30, 0x00, 0xA1, 0x6B, 0x69, 0x27, 0xB1, 0x33, 0x02, 0x67, 0xE3,
+0x92, 0xE6, 0xAB, 0x99, 0xAA, 0x7D, 0x24, 0xF2, 0x89, 0x2A, 0x1D, 0xCB, 0x4E, 0xC4, 0xD7, 0x3A,
+0x10, 0xA2, 0x82, 0xC6, 0xCE, 0xE7, 0xE5, 0x4C, 0xC3, 0xCD, 0x06, 0x43, 0xFC, 0x0D, 0xA1, 0x5E,
+0x82, 0xD9, 0x85, 0x3E, 0x04, 0x90, 0xEC, 0xDA, 0xB2, 0x3E, 0x6C, 0xC7, 0x96, 0x75, 0xCD, 0xD8,
+0x5A, 0x6D, 0x35, 0xF1, 0x2E, 0x75, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x19, 0x81, 0x3B,
+0x82, 0xD8, 0x8D, 0x63, 0xB1, 0x3B, 0x87, 0x1D, 0x1E, 0x68, 0xE6, 0xE4, 0x62, 0xE3, 0xFE, 0x75,
+0xF4, 0x19, 0xF3, 0xF5, 0xDF, 0xB5, 0x38, 0x59, 0x97, 0x7C, 0x05, 0x4C, 0x02, 0x87, 0xEB, 0x33,
+0x15, 0x22, 0x21, 0x7E, 0x77, 0xA6, 0xF2, 0xF9, 0x20, 0x4B, 0x9E, 0x3B, 0x53, 0x3A, 0x52, 0xD4,
+0x9F, 0x2D, 0xFF, 0xA2, 0xF8, 0x71, 0x5D, 0xD4, 0xBF, 0x92, 0x24, 0x79, 0x78, 0x08, 0x7F, 0x91,
+0x23, 0x0E, 0xA7, 0xB8, 0x6F, 0xEC, 0x87, 0xE7, 0x07, 0xC3, 0xC4, 0x6D, 0xA4, 0xDA, 0x31, 0xDF,
+0xD8, 0xE3, 0x07, 0x76, 0x86, 0x9F, 0x79, 0xF4, 0x50, 0x78, 0x1A, 0x29, 0x50, 0xDA, 0xB1, 0x0D,
+0x94, 0xE4, 0xB7, 0x23, 0x91, 0x31, 0x22, 0x2B, 0x39, 0xED, 0x4C, 0xAD, 0x74, 0x3F, 0xC3, 0x34,
+0xE9, 0x35, 0x92, 0x98, 0x17, 0xCC, 0x99, 0x5A, 0xA9, 0x00, 0x9B, 0x42, 0x97, 0xF9, 0x74, 0xC5,
+0x9D, 0x2A, 0x04, 0x3F, 0x7D, 0xBF, 0x12, 0x91, 0xEA, 0x0A, 0x52, 0xF4, 0x09, 0x53, 0x25, 0x29,
+0xEE, 0x4F, 0xAB, 0xD2, 0x6B, 0x45, 0x1D, 0x4D, 0x4A, 0xAA, 0xAA, 0xB2, 0x7C, 0xDF, 0xFD, 0xC6,
+0xA4, 0x5D, 0xA6, 0x44, 0x69, 0x64, 0xB3, 0x2A, 0xAA, 0xB1, 0x3F, 0xC2, 0x4B, 0x5D, 0x5D, 0x34,
+0x92, 0x6A, 0xE5, 0x62, 0x0E, 0x38, 0xF3, 0xC1, 0x63, 0xB9, 0xD9, 0x29, 0xEC, 0x41, 0x4C, 0x33,
+0x2C, 0x6A, 0xEA, 0x80, 0x29, 0xF4, 0x9E, 0x3D, 0x5B, 0x9B, 0x12, 0x38, 0xC1, 0xF9, 0xFD, 0xFE,
+0x99, 0x2B, 0xE1, 0x83, 0x73, 0xD7, 0xC4, 0x5C, 0x4E, 0xFF, 0xBA, 0x36, 0xE4, 0xB0, 0x33, 0x20,
+0x62, 0xBF, 0xA3, 0x42, 0xE9, 0xEA, 0xB3, 0xF7, 0x2D, 0xF3, 0xB7, 0x13, 0x32, 0x58, 0xA3, 0xD4,
+0xB9, 0x1A, 0x2B, 0x7E, 0x78, 0x36, 0x76, 0x92, 0x17, 0xCF, 0xCA, 0x09, 0xCF, 0xCB, 0xE7, 0xBC,
+0xD5, 0x4B, 0xFF, 0x3A, 0xD9, 0xB2, 0x0F, 0xC7, 0x26, 0xA4, 0xCE, 0x59, 0x87, 0x9D, 0x4D, 0xBA,
+0xA1, 0x02, 0x97, 0x1D, 0x27, 0x6E, 0xE7, 0x25, 0xA1, 0xB4, 0xAD, 0x20, 0x50, 0x10, 0xF8, 0xA4,
+0x23, 0x70, 0x47, 0x10, 0xBB, 0x31, 0xA4, 0x39, 0x61, 0xE4, 0x29, 0xFD, 0xEC, 0x48, 0xA2, 0xA6,
+0xC6, 0xB8, 0xE3, 0x04, 0xC2, 0x01, 0x8C, 0xB8, 0xE5, 0x4A, 0x46, 0x45, 0x99, 0xCB, 0x95, 0x0C,
+0x1F, 0x69, 0x27, 0x33, 0xF6, 0x3A, 0xFA, 0x71, 0xD5, 0xCC, 0x84, 0x6A, 0x6E, 0xBC, 0xA4, 0xEB,
+0x28, 0xA5, 0x51, 0xC9, 0x43, 0xFD, 0xEC, 0x10, 0xD0, 0x81, 0xE8, 0x58, 0x9A, 0x66, 0x69, 0xEA,
+0x3C, 0x76, 0x79, 0x24, 0x5C, 0x85, 0xBA, 0xA8, 0xA4, 0xE9, 0xD6, 0x1F, 0xCC, 0xBF, 0xB6, 0x7B,
+0xF3, 0xBA, 0xF0, 0xE4, 0xC1, 0x5D, 0x30, 0xC9, 0xEE, 0x0E, 0x77, 0x41, 0xC1, 0xA3, 0xBF, 0x1D,
+0x83, 0x29, 0x5C, 0xB8, 0x51, 0xB6, 0xBA, 0x78, 0x7B, 0x2B, 0xF8, 0x2E, 0x06, 0x70, 0x54, 0xDE,
+0x32, 0xF5, 0xCC, 0x29, 0x70, 0x45, 0x41, 0xF2, 0xFB, 0xB8, 0x82, 0xA4, 0x18, 0x69, 0x91, 0xAA,
+0x82, 0xE4, 0x34, 0x3A, 0x9D, 0xD6, 0x6B, 0xAA, 0x91, 0xB0, 0x34, 0xE1, 0xC6, 0xC1, 0x4D, 0x9C,
+0x3E, 0x0A, 0x53, 0xD5, 0x3A, 0xAB, 0x6A, 0x96, 0x15, 0x92, 0x5B, 0x53, 0x9D, 0x02, 0xB1, 0x9B,
+0xD1, 0xC0, 0x89, 0xCE, 0xF6, 0x0E, 0xD9, 0xE8, 0xBE, 0x7B, 0x95, 0xFD, 0xEB, 0x78, 0xEB, 0x09,
+0x04, 0xE2, 0x1C, 0x3E, 0x7F, 0x3D, 0x1C, 0xBD, 0x70, 0x5D, 0x02, 0x27, 0xB8, 0x95, 0x18, 0xFD,
+0xEB, 0x34, 0x99, 0xB6, 0x9B, 0x45, 0x17, 0x8E, 0x51, 0x65, 0xC8, 0x64, 0x30, 0xB5, 0xAF, 0x71,
+0xBC, 0x72, 0x4C, 0xE3, 0xF3, 0x0C, 0xFF, 0x6C, 0xDC, 0xF5, 0xED, 0x2A, 0x56, 0x34, 0x49, 0xFB,
+0x7E, 0xB9, 0x7B, 0xB0, 0x4D, 0x1D, 0xF7, 0x20, 0x6E, 0x46, 0x3E, 0xBF, 0x5B, 0xFF, 0xA9, 0x29,
+0x2D, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xB7, 0x0E, 0x81, 0x35, 0x4D, 0xEC, 0x5C, 0x31, 0x1B,
+0x05, 0xB1, 0xFB, 0x08, 0x3B, 0x4E, 0x4C, 0x81, 0x48, 0xCD, 0xC0, 0x54, 0x36, 0x33, 0x8E, 0xC4,
+0xC4, 0x62, 0x2E, 0x75, 0xBD, 0x8D, 0x0B, 0x52, 0x95, 0x7E, 0xA8, 0x10, 0xC7, 0x85, 0xDB, 0xE4,
+0x26, 0xD3, 0x2A, 0xD2, 0xD2, 0x95, 0x11, 0x0B, 0x73, 0x45, 0x4A, 0x0A, 0x86, 0xFA, 0x92, 0xB9,
+0x0A, 0x28, 0x26, 0x2C, 0xF3, 0xF3, 0x92, 0x85, 0xD6, 0x94, 0x3B, 0x92, 0xB7, 0xF1, 0xB1, 0x71,
+0x44, 0xC7, 0x22, 0x39, 0x31, 0x54, 0x17, 0x26, 0x28, 0xFE, 0xE8, 0xEA, 0x18, 0x4C, 0x6A, 0x63,
+0x92, 0x06, 0xE5, 0x76, 0x39, 0xBA, 0xB0, 0x5B, 0xC0, 0xBE, 0xED, 0x1B, 0x40, 0xEC, 0x76, 0x86,
+0x67, 0x1F, 0xD8, 0x87, 0x6D, 0xA1, 0xDA, 0x41, 0x3C, 0x55, 0xD9, 0x11, 0x02, 0x2A, 0xFE, 0x5A,
+0xA6, 0xDA, 0x99, 0x72, 0xA7, 0x26, 0x59, 0x55, 0xDD, 0x34, 0xF7, 0x99, 0xF9, 0x2E, 0xFA, 0xB9,
+0x64, 0xCF, 0x8B, 0x6A, 0x68, 0xCC, 0x8F, 0x26, 0x80, 0xE9, 0xF5, 0x8E, 0x57, 0x34, 0xBB, 0xBA,
+0x9A, 0x64, 0x8A, 0x9F, 0xFA, 0xBB, 0x69, 0xF9, 0x4A, 0x9E, 0x36, 0xBB, 0xAF, 0x9C, 0x8B, 0x7E,
+0x60, 0x49, 0x05, 0xCC, 0x7D, 0xFF, 0x2A, 0x39, 0xF5, 0xA2, 0x0A, 0x99, 0xA2, 0x62, 0x23, 0x19,
+0x64, 0x5D, 0xF6, 0x9F, 0xF7, 0x59, 0x54, 0x40, 0x29, 0x00, 0x62, 0xC7, 0x40, 0x01, 0x90, 0x19,
+0xCE, 0xA5, 0x4E, 0x28, 0x53, 0x92, 0x88, 0xB7, 0x09, 0x3B, 0x2C, 0x4C, 0xC2, 0x6F, 0xF4, 0xD8,
+0xE5, 0xA1, 0x70, 0x1C, 0x81, 0x13, 0x24, 0x76, 0x42, 0xEA, 0x4C, 0x4D, 0x8E, 0xFD, 0xCC, 0x14,
+0x36, 0xF7, 0x71, 0x54, 0x5C, 0x16, 0xFA, 0xDB, 0x45, 0x5F, 0x45, 0x1B, 0x03, 0xC7, 0xD0, 0xFD,
+0x23, 0x5D, 0x05, 0x95, 0x7A, 0x5C, 0xA9, 0xCB, 0x54, 0x40, 0xA5, 0xD8, 0xF8, 0xE1, 0xC2, 0x6D,
+0xD5, 0xE8, 0x5F, 0xD7, 0xDA, 0x02, 0xF5, 0x72, 0x1B, 0x14, 0x3B, 0xA6, 0x5F, 0x29, 0x47, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xAC, 0x26, 0x02, 0x6B, 0x9A, 0xD8, 0x91, 0x74, 0x4C, 0x42,
+0x05, 0x1B, 0x84, 0x02, 0x76, 0x09, 0x7B, 0xB2, 0x92, 0x2C, 0x4D, 0x4F, 0x22, 0x70, 0x42, 0x16,
+0x5F, 0x2E, 0x4A, 0x0E, 0x6D, 0xA6, 0x34, 0x54, 0x4E, 0xB9, 0x22, 0x53, 0xE7, 0x7D, 0x5D, 0xBD,
+0xE2, 0x91, 0x44, 0x1F, 0x25, 0x8C, 0x95, 0xA3, 0x22, 0x72, 0xD8, 0x0B, 0xE3, 0x03, 0x33, 0x30,
+0xDD, 0x8D, 0x23, 0xA7, 0xDE, 0xC4, 0xD8, 0xA8, 0x44, 0x36, 0x52, 0xAD, 0x3B, 0x72, 0x69, 0x18,
+0x66, 0x59, 0x98, 0x67, 0x17, 0xB9, 0xED, 0x6A, 0x4E, 0x88, 0x7A, 0x75, 0x33, 0xE7, 0xD8, 0x86,
+0xBE, 0xAE, 0xB0, 0x6F, 0xEB, 0xFA, 0xF0, 0xE4, 0x81, 0x1D, 0xE1, 0xEE, 0x9D, 0x9B, 0xC4, 0x87,
+0x4C, 0x55, 0x3B, 0x33, 0xB5, 0x0A, 0x1E, 0x46, 0xF2, 0xEA, 0x62, 0x68, 0xCB, 0xBD, 0x40, 0xEA,
+0xB8, 0xD6, 0xDE, 0xCD, 0xFD, 0xE5, 0x32, 0x8C, 0x6A, 0x54, 0x38, 0x81, 0x2D, 0xF3, 0xE3, 0x12,
+0x4E, 0x67, 0xAA, 0x54, 0xBD, 0xDB, 0xBB, 0x2F, 0x9E, 0x92, 0xAF, 0xEC, 0x7E, 0x86, 0xBF, 0x9E,
+0xD3, 0x37, 0x34, 0x96, 0x40, 0x9F, 0xC7, 0x7F, 0x9D, 0xB7, 0xD9, 0xE5, 0x4A, 0xEC, 0xAC, 0xAF,
+0xCA, 0xF8, 0xB4, 0xBC, 0xA4, 0x81, 0x51, 0xFF, 0x3A, 0xEE, 0x38, 0xB1, 0x19, 0x41, 0x13, 0x34,
+0x3F, 0xAE, 0x76, 0xBE, 0x36, 0xEE, 0x37, 0x7C, 0x0D, 0xF9, 0x19, 0x39, 0xBF, 0x07, 0xC7, 0x31,
+0x67, 0xE0, 0x5E, 0xC0, 0x1C, 0x76, 0xF4, 0xB3, 0x8B, 0x1D, 0xA9, 0x99, 0xA7, 0xB5, 0xF8, 0xD5,
+0xFA, 0xD4, 0xA5, 0xE2, 0xDA, 0xE9, 0x98, 0x16, 0x28, 0xEB, 0xAF, 0x3F, 0xCD, 0xE7, 0x7D, 0x02,
+0x4E, 0x71, 0x99, 0xB7, 0x7C, 0x7E, 0xF4, 0xA9, 0xDB, 0x8B, 0x54, 0x27, 0x4C, 0xA1, 0x53, 0x8E,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x58, 0x5D, 0x04, 0xD6, 0x2C, 0xB1, 0x13, 0x9F, 0x27,
+0x2C, 0x7A, 0xD7, 0x11, 0x30, 0x71, 0x65, 0x64, 0x0A, 0x51, 0xA7, 0x70, 0x6C, 0x07, 0x71, 0x9A,
+0x02, 0x89, 0x92, 0x88, 0x4E, 0x51, 0x7C, 0x2C, 0xAA, 0xB2, 0x36, 0xFA, 0xCF, 0x4C, 0x58, 0x6A,
+0xC4, 0xE2, 0xD2, 0xC5, 0xB2, 0xB6, 0xC0, 0xB9, 0x9F, 0x9C, 0x2B, 0x53, 0x51, 0x55, 0x52, 0x52,
+0xA2, 0x82, 0x94, 0xE6, 0x05, 0x73, 0xA2, 0xA3, 0x7B, 0x66, 0xF2, 0x76, 0x1A, 0x59, 0x18, 0x19,
+0x06, 0x9E, 0xD2, 0x04, 0x3B, 0x72, 0xFD, 0x5A, 0x18, 0xC6, 0x83, 0xDB, 0x76, 0x91, 0x7C, 0xBE,
+0x79, 0xE6, 0x7A, 0xB8, 0x88, 0x20, 0x8A, 0xDB, 0x25, 0xA7, 0x9D, 0x4F, 0x41, 0xFA, 0xDB, 0xDD,
+0xBD, 0x6B, 0x53, 0xF8, 0xCA, 0x43, 0xFB, 0xA1, 0x44, 0x75, 0x28, 0x31, 0x86, 0x1A, 0x43, 0x9F,
+0xBB, 0x48, 0x70, 0xB2, 0x48, 0x55, 0x8D, 0x56, 0x35, 0x5F, 0x3A, 0x31, 0xB5, 0xA6, 0x1D, 0x27,
+0x54, 0x35, 0x4A, 0xFE, 0x70, 0x9A, 0x27, 0xD0, 0xA4, 0xCF, 0x3C, 0x8A, 0x33, 0x9E, 0x33, 0xD5,
+0xCF, 0x70, 0x4F, 0xD8, 0x66, 0x91, 0xB7, 0xE6, 0x7B, 0x27, 0xD4, 0x51, 0xEA, 0xF7, 0x7C, 0x6D,
+0xFA, 0xDC, 0x95, 0xA6, 0x98, 0x93, 0x4D, 0x7C, 0xF8, 0x8C, 0x28, 0x5A, 0xD9, 0x6A, 0xC4, 0xAC,
+0xB5, 0xDD, 0xFC, 0xF8, 0x54, 0x91, 0x55, 0xF2, 0x97, 0x47, 0xE3, 0x72, 0x57, 0x93, 0x39, 0xA8,
+0x66, 0x90, 0x2F, 0x05, 0x87, 0x76, 0x10, 0x99, 0x7D, 0x5B, 0x37, 0x20, 0x92, 0xB8, 0x6D, 0x75,
+0x3F, 0xBD, 0xA8, 0x9D, 0x3F, 0x5C, 0x4E, 0x5F, 0x19, 0x45, 0x34, 0x35, 0x68, 0x76, 0x6B, 0x9B,
+0xA8, 0x75, 0xAD, 0xF0, 0x83, 0x54, 0x92, 0xC5, 0xC6, 0x26, 0xD5, 0x34, 0xE6, 0xEA, 0xCB, 0xD4,
+0x4D, 0xF5, 0x51, 0xF4, 0x20, 0x0B, 0xF7, 0x57, 0xCC, 0xD4, 0x4F, 0x53, 0xFA, 0x5C, 0xF9, 0x53,
+0x85, 0x8E, 0xC3, 0xCA, 0x71, 0xCF, 0x22, 0x91, 0x7D, 0xBE, 0xBB, 0x5D, 0x9B, 0x81, 0x13, 0xD8,
+0xB2, 0x8F, 0x9F, 0x35, 0x46, 0x54, 0x6F, 0xC5, 0xB6, 0x6A, 0x5D, 0x9D, 0xBE, 0x6F, 0x6D, 0x8D,
+0x3A, 0xBE, 0xEA, 0x28, 0x95, 0x1B, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x3B, 0x07, 0x81, 0x35,
+0x4B, 0xEC, 0x38, 0x84, 0x0C, 0x96, 0x38, 0x8B, 0xA0, 0x09, 0xFA, 0xD7, 0x8D, 0x63, 0xE1, 0x13,
+0x62, 0x37, 0xAA, 0xFE, 0x75, 0x49, 0x7C, 0x70, 0x75, 0x48, 0xA5, 0x99, 0x14, 0x1D, 0x6B, 0xCA,
+0x4C, 0x8D, 0x62, 0xE4, 0x53, 0x43, 0x85, 0x9A, 0x5C, 0x61, 0xF2, 0xF2, 0xB1, 0x44, 0x24, 0x3B,
+0x69, 0x3A, 0x19, 0xF9, 0xF3, 0x3A, 0xD5, 0xBE, 0x08, 0x15, 0x71, 0x22, 0x4C, 0x42, 0xB1, 0x9B,
+0x44, 0x6E, 0x3D, 0xAA, 0x76, 0xDC, 0x3B, 0xF6, 0xC3, 0x0B, 0xB7, 0x97, 0x6A, 0xC7, 0x3E, 0xD0,
+0x3F, 0x6A, 0xCB, 0xBA, 0xDE, 0xF0, 0xC4, 0x81, 0xED, 0xE1, 0xFE, 0x5D, 0x9B, 0xC5, 0x24, 0x2B,
+0x81, 0x14, 0xEE, 0x70, 0xAF, 0x14, 0x38, 0x11, 0xDA, 0xA8, 0x92, 0xA9, 0xF2, 0x13, 0x7D, 0xD9,
+0x04, 0xEA, 0x5C, 0x46, 0xCA, 0x34, 0x22, 0x92, 0x0E, 0xAF, 0x43, 0x21, 0xAE, 0x29, 0x9B, 0x38,
+0x4B, 0x1C, 0x1A, 0x53, 0xD5, 0xA2, 0x4F, 0x9D, 0x8D, 0x8B, 0xF0, 0xCA, 0x58, 0x87, 0x8D, 0x82,
+0x95, 0xCD, 0x46, 0xC9, 0xDA, 0x6B, 0xB7, 0xE2, 0x1C, 0x30, 0xF2, 0x56, 0x51, 0xF8, 0xF2, 0xB9,
+0x61, 0xF5, 0xAA, 0xF2, 0x65, 0xC6, 0x59, 0xA8, 0x75, 0x42, 0x56, 0x69, 0x86, 0x05, 0xB1, 0x3A,
+0x84, 0x1C, 0x80, 0xCD, 0xF0, 0xAF, 0xA3, 0x19, 0xF6, 0x04, 0x4C, 0xB0, 0xE3, 0xF8, 0xDB, 0x0A,
+0x42, 0x49, 0xB5, 0xB0, 0xB5, 0x95, 0xFE, 0x75, 0xB9, 0xFA, 0xE8, 0x40, 0x64, 0x5F, 0x6C, 0xF9,
+0x78, 0x48, 0x59, 0xC3, 0xDA, 0xC6, 0xCC, 0xD5, 0x4F, 0xED, 0x51, 0xEC, 0xB0, 0x8D, 0x6F, 0x3E,
+0xC7, 0xAB, 0x75, 0xF2, 0x15, 0xEF, 0x4D, 0x93, 0xF4, 0x34, 0x7C, 0x0E, 0x19, 0x20, 0xC4, 0x94,
+0x2F, 0xEB, 0xFB, 0x7B, 0x8B, 0x7F, 0x5D, 0x06, 0x55, 0x79, 0x5A, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x56, 0x0B, 0x81, 0x35, 0x4D, 0xEC, 0xB8, 0xE8, 0x1D, 0xBE, 0x38, 0x1C, 0x8E, 0xC2, 0xB4, 0x49,
+0x25, 0x8C, 0xF9, 0xB4, 0x26, 0xC7, 0xB0, 0xE3, 0x04, 0x54, 0x04, 0x11, 0x32, 0x64, 0x11, 0x4F,
+0x41, 0x00, 0xEA, 0x17, 0xE7, 0x79, 0xED, 0x6C, 0xA1, 0xAB, 0x98, 0x6B, 0x73, 0xA5, 0xC1, 0x3C,
+0xE8, 0x5C, 0x85, 0x33, 0x65, 0x49, 0x3C, 0xEB, 0x62, 0x31, 0x53, 0xEA, 0x22, 0x51, 0x71, 0x25,
+0x4F, 0xCB, 0xA8, 0x72, 0xA4, 0xC5, 0x99, 0xD4, 0x76, 0x6C, 0x70, 0x50, 0xF6, 0xB4, 0x9D, 0xC0,
+0x2E, 0x19, 0xCF, 0x1F, 0xBF, 0x14, 0x2E, 0x20, 0xA1, 0xF2, 0xEC, 0xED, 0x62, 0x8F, 0xB5, 0x19,
+0x48, 0x72, 0x77, 0x17, 0x4C, 0xB2, 0x3F, 0xFB, 0xC8, 0x01, 0xE4, 0xB9, 0xEB, 0x04, 0xA6, 0xAA,
+0xD8, 0xCD, 0x43, 0x2D, 0xF2, 0x3E, 0xA5, 0x1D, 0x20, 0x54, 0xD5, 0x89, 0xBE, 0x76, 0xA6, 0x14,
+0x89, 0x42, 0x64, 0x3E, 0x79, 0xB5, 0x7E, 0x5A, 0x0B, 0x54, 0xD4, 0xC8, 0x38, 0x4C, 0x01, 0xF5,
+0x31, 0xA3, 0x70, 0xE4, 0x4A, 0x53, 0xA6, 0x4A, 0x45, 0xC3, 0xAC, 0x9D, 0xF3, 0xDC, 0x6B, 0xAE,
+0xA0, 0xD6, 0xEE, 0xAC, 0xE0, 0xF7, 0xD7, 0xF7, 0xA5, 0x52, 0xDD, 0x85, 0xC1, 0x14, 0xA9, 0xDC,
+0x6F, 0x4F, 0x09, 0x1F, 0x8B, 0xB8, 0xCF, 0xA0, 0xCD, 0x01, 0xB4, 0x69, 0x8E, 0xC4, 0x4E, 0x14,
+0xCC, 0x56, 0x44, 0xC4, 0x62, 0xC7, 0x09, 0x04, 0x4E, 0x34, 0x63, 0xC7, 0x09, 0x0F, 0xB8, 0x99,
+0x80, 0x73, 0x1D, 0x09, 0x25, 0x23, 0x62, 0x99, 0x92, 0x46, 0xE7, 0x76, 0x55, 0x79, 0x4B, 0x91,
+0xBC, 0xA6, 0x64, 0x8A, 0x92, 0x9C, 0x94, 0xCD, 0x4A, 0xF4, 0xAB, 0x74, 0x4D, 0xFB, 0x57, 0xBB,
+0x8B, 0x87, 0x47, 0x2A, 0xEB, 0x8E, 0x1C, 0x4E, 0xCA, 0x4D, 0x19, 0x94, 0x79, 0x82, 0x24, 0xE0,
+0x70, 0x79, 0x18, 0x9F, 0x9C, 0x0C, 0xFC, 0x0C, 0xEE, 0x03, 0xC9, 0xF5, 0xDD, 0x26, 0x92, 0x19,
+0x78, 0xB5, 0xBE, 0xD2, 0x4A, 0xBD, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0xCE, 0x46, 0x60, 0x6D,
+0x13, 0x3B, 0x98, 0xA9, 0x4E, 0x5C, 0x19, 0xD1, 0xAD, 0xC4, 0x18, 0x11, 0x8B, 0xCD, 0xC8, 0x67,
+0xB0, 0xD8, 0xB8, 0xD2, 0xE2, 0x26, 0xD1, 0x1A, 0x11, 0xC7, 0x4F, 0xA7, 0xBF, 0xB6, 0x58, 0xD5,
+0x9F, 0x2A, 0xD5, 0xA8, 0xCA, 0x45, 0xA7, 0x53, 0xE6, 0x17, 0x26, 0x16, 0x32, 0x5D, 0xFF, 0xE2,
+0x3D, 0x68, 0xCA, 0x9B, 0x40, 0xB4, 0xEE, 0x34, 0xF7, 0x90, 0x05, 0xF1, 0x3C, 0x71, 0x79, 0x2C,
+0xBC, 0x7B, 0x76, 0x28, 0x5C, 0x47, 0xD2, 0xD9, 0xDB, 0x25, 0x42, 0x96, 0x4D, 0x66, 0xAA, 0x8A,
+0x8D, 0x03, 0xDD, 0x48, 0x81, 0xB2, 0x35, 0x3C, 0xB0, 0x7B, 0xB3, 0xEC, 0xAA, 0xA0, 0xC4, 0x0E,
+0x53, 0xC9, 0xFD, 0xBA, 0x32, 0x10, 0x92, 0x3F, 0x9D, 0x12, 0x80, 0x4A, 0xB4, 0x70, 0xEE, 0xCF,
+0x66, 0xF2, 0x9A, 0x3B, 0xEE, 0x57, 0x54, 0x3B, 0xAF, 0xCF, 0x41, 0xCB, 0xC4, 0xBE, 0xA4, 0xFC,
+0x25, 0x79, 0xCE, 0x55, 0x57, 0x09, 0xAB, 0xA8, 0x94, 0x8D, 0xB4, 0x2F, 0xAA, 0x8A, 0xA9, 0x3D,
+0xAE, 0x14, 0xFA, 0xC0, 0xE8, 0x4D, 0x9D, 0xBA, 0xE5, 0xFC, 0x32, 0xFA, 0x50, 0xFA, 0xF8, 0x51,
+0x01, 0xC6, 0xB6, 0x59, 0x7C, 0xD9, 0x02, 0xDF, 0xC3, 0xFE, 0x9E, 0xEE, 0xB0, 0x73, 0xD3, 0x00,
+0x88, 0xD6, 0xEA, 0x7E, 0xBC, 0x38, 0x8F, 0x99, 0xD8, 0xFA, 0x1C, 0xCC, 0xF6, 0xD3, 0xF8, 0x41,
+0xD0, 0x8E, 0x7B, 0x53, 0xB1, 0x13, 0x82, 0x26, 0xFF, 0x45, 0x31, 0x52, 0x3B, 0x63, 0xC4, 0x34,
+0x72, 0x31, 0x9F, 0x80, 0x02, 0x9D, 0x01, 0x15, 0x25, 0x4E, 0xEF, 0xBB, 0x13, 0x6A, 0x1B, 0x04,
+0x51, 0x25, 0xF3, 0x8A, 0xD5, 0x61, 0xC1, 0x7F, 0xCB, 0xF0, 0x87, 0xC8, 0x14, 0xF2, 0xF9, 0x8D,
+0xE3, 0x07, 0xD4, 0x24, 0x76, 0x78, 0x21, 0x09, 0x3C, 0xB4, 0x7B, 0x5B, 0xE8, 0x6E, 0xD2, 0xB6,
+0x6A, 0x77, 0xF6, 0xD7, 0x79, 0xE9, 0x7D, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xF0, 0x44, 0x6E, 0x6B,
+0x0C, 0x09, 0x57, 0x05, 0xA8, 0x66, 0x9C, 0x81, 0xEA, 0x75, 0x6E, 0x68, 0x52, 0x4C, 0x9C, 0x33,
+0x30, 0x75, 0xC2, 0x36, 0x24, 0xAA, 0x9C, 0xAE, 0x4D, 0xA6, 0x38, 0x88, 0x7F, 0x95, 0x9F, 0xA3,
+0x8A, 0xE6, 0x31, 0xAD, 0xB2, 0x54, 0xA7, 0x45, 0x51, 0x04, 0x0E, 0x5D, 0xE8, 0x44, 0xE1, 0xC9,
+0x0E, 0x29, 0x99, 0xF9, 0x2A, 0x09, 0x85, 0xA0, 0x00, 0x64, 0x8B, 0x60, 0xCC, 0x0D, 0x16, 0xFD,
+0xF6, 0x74, 0x81, 0x34, 0x97, 0x25, 0x04, 0x22, 0xC0, 0x27, 0x10, 0xC4, 0x73, 0x6C, 0x04, 0xAA,
+0x1D, 0xEA, 0x1F, 0x87, 0x19, 0xF9, 0xB9, 0x63, 0x97, 0xC2, 0x49, 0x44, 0xF3, 0x32, 0x5A, 0xF6,
+0x76, 0x3A, 0x5A, 0x41, 0xE0, 0x76, 0x6E, 0xEC, 0x0F, 0x3F, 0xF7, 0xD8, 0x5D, 0xD8, 0x5D, 0xA1,
+0x1B, 0x6D, 0x27, 0x99, 0x68, 0x0B, 0xF3, 0x50, 0x8B, 0x0C, 0x58, 0x35, 0x4B, 0x8A, 0x0F, 0x96,
+0x62, 0xEC, 0xFE, 0x73, 0x31, 0xC7, 0x9F, 0xBD, 0x2F, 0xA6, 0x3E, 0xF7, 0x05, 0x8B, 0xE6, 0x4E,
+0xCF, 0x8B, 0x47, 0x00, 0xC9, 0x46, 0x7C, 0x0C, 0xEC, 0x79, 0xC5, 0xB7, 0xCB, 0xCA, 0x08, 0xDE,
+0xC9, 0xDF, 0xCE, 0xC2, 0x3A, 0xEC, 0xDE, 0x46, 0x4E, 0xAC, 0x3D, 0x29, 0x8F, 0x9D, 0xEE, 0x05,
+0xEC, 0x3B, 0x63, 0x68, 0xF4, 0xAE, 0xB6, 0xD5, 0x77, 0x56, 0x88, 0x2A, 0x97, 0x29, 0x80, 0x1E,
+0xE5, 0x2B, 0xA3, 0x67, 0x12, 0x1E, 0x15, 0x60, 0x96, 0x67, 0x30, 0x49, 0x07, 0x54, 0xB3, 0x2D,
+0xD8, 0xE4, 0xBE, 0xAF, 0x07, 0xFB, 0xB4, 0xD6, 0x21, 0xBA, 0x37, 0x73, 0x1C, 0xE9, 0x43, 0xCA,
+0xA4, 0xDB, 0x43, 0x13, 0x50, 0xA3, 0x31, 0x06, 0xAD, 0xF4, 0xB1, 0xC3, 0x38, 0x88, 0xE5, 0x54,
+0x94, 0xC5, 0xB4, 0x07, 0x6C, 0x52, 0xDD, 0x6C, 0xD2, 0x99, 0x52, 0xE7, 0x0A, 0x65, 0xF4, 0x19,
+0x14, 0x53, 0x78, 0x75, 0xAF, 0xD8, 0x3C, 0xF2, 0x95, 0xD1, 0xD0, 0x1E, 0xE5, 0xAC, 0x58, 0x24,
+0xF2, 0xCB, 0x3A, 0x98, 0x52, 0x68, 0x18, 0xE9, 0x7B, 0x86, 0x87, 0x07, 0xC3, 0x14, 0x88, 0x5D,
+0x17, 0x88, 0xE6, 0x03, 0xFB, 0x76, 0x89, 0xBA, 0x5B, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50,
+0x10, 0x58, 0x7D, 0x04, 0x56, 0x57, 0x52, 0x58, 0xFD, 0xF6, 0x2F, 0x7A, 0x07, 0xEE, 0x09, 0x7B,
+0x0E, 0x5B, 0x88, 0x9D, 0x46, 0xB4, 0xE0, 0x05, 0x24, 0xFE, 0x1D, 0x46, 0xAE, 0x2F, 0x26, 0x26,
+0xA6, 0x39, 0xD6, 0x0F, 0xE5, 0x66, 0xF5, 0x14, 0x09, 0x27, 0x52, 0x75, 0x08, 0x55, 0x26, 0x01,
+0x39, 0xED, 0xCB, 0x15, 0x0B, 0x0D, 0x18, 0xA8, 0xB9, 0xCE, 0x5F, 0x67, 0xAA, 0x5D, 0x55, 0x0E,
+0xD4, 0x1A, 0x18, 0x51, 0x39, 0x09, 0x1F, 0x40, 0x9A, 0xB1, 0x66, 0xD0, 0xCE, 0x13, 0xC8, 0x69,
+0xF7, 0x2E, 0x02, 0x29, 0x64, 0x9B, 0x28, 0x3A, 0xE6, 0xDF, 0x26, 0x07, 0x39, 0xCE, 0xBA, 0x9E,
+0xCE, 0xF0, 0xD8, 0xBE, 0x2D, 0xE1, 0xA1, 0xBD, 0xB6, 0xA9, 0xBB, 0x10, 0x1F, 0x10, 0x3B, 0x9A,
+0x64, 0x6B, 0x0E, 0x57, 0x8F, 0x22, 0x2E, 0xD1, 0xF9, 0xCD, 0x44, 0xCB, 0xD8, 0xB5, 0x28, 0x81,
+0x99, 0xBF, 0x1A, 0x87, 0x27, 0xEB, 0x77, 0x8E, 0x5F, 0x54, 0x96, 0x2C, 0x30, 0xC2, 0xEF, 0x59,
+0x83, 0xBD, 0x72, 0x71, 0x91, 0xA4, 0xD2, 0x61, 0x65, 0x5C, 0x65, 0x52, 0x32, 0x6A, 0x0F, 0xD3,
+0xBA, 0x52, 0xF5, 0xFA, 0x46, 0xC5, 0x83, 0xD2, 0xC8, 0x8C, 0x5E, 0x87, 0x17, 0x8C, 0x88, 0xC5,
+0x1F, 0xF2, 0x6F, 0x06, 0x08, 0xEC, 0xC1, 0x0E, 0x0B, 0xDC, 0x8E, 0xCD, 0xF9, 0xE8, 0x6A, 0x0D,
+0x1B, 0x49, 0xD4, 0x39, 0xF8, 0x63, 0xF2, 0x47, 0x00, 0x55, 0x53, 0x06, 0x4F, 0xE8, 0x4D, 0x73,
+0xFF, 0x50, 0xEB, 0x7B, 0x4D, 0x9F, 0x55, 0xFC, 0x8C, 0x9D, 0xAE, 0x19, 0x08, 0x3B, 0x9F, 0xCF,
+0xE5, 0x9A, 0x71, 0xF0, 0x39, 0x4F, 0x85, 0x8E, 0x0A, 0xF3, 0x24, 0xE6, 0xEE, 0x04, 0xF3, 0x32,
+0x32, 0xE9, 0x36, 0x08, 0x1D, 0xFD, 0x45, 0xE7, 0xF1, 0x7C, 0x63, 0x7F, 0x0F, 0xD4, 0xCB, 0x0D,
+0x42, 0x78, 0xCB, 0x51, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xAB, 0x8F, 0xC0, 0x9A, 0x25,
+0x76, 0xE3, 0x50, 0xEB, 0xDE, 0x46, 0x00, 0xC2, 0xE9, 0xF1, 0xA9, 0x70, 0x19, 0x0B, 0xE0, 0xC5,
+0xC9, 0x29, 0x51, 0x11, 0x48, 0xEC, 0x74, 0x7F, 0x58, 0x55, 0x6B, 0x78, 0x68, 0xB6, 0xB4, 0xFC,
+0x50, 0x15, 0x48, 0x15, 0x38, 0x27, 0x06, 0xBA, 0x60, 0xBA, 0x82, 0xE7, 0x4A, 0x93, 0x5F, 0x6B,
+0xD9, 0xD4, 0xAC, 0x42, 0xBB, 0xDE, 0x14, 0x28, 0x35, 0x00, 0xAA, 0x12, 0x62, 0x37, 0xA4, 0x9C,
+0x22, 0x55, 0x79, 0xB4, 0xA6, 0x66, 0xF5, 0x87, 0x6A, 0x87, 0x7D, 0x6C, 0x27, 0x86, 0xAE, 0xAB,
+0xAF, 0x1D, 0x98, 0xC2, 0xF3, 0xC7, 0x2F, 0x87, 0x63, 0xF0, 0x13, 0xBC, 0x9D, 0xF2, 0xDA, 0x09,
+0x66, 0x88, 0x86, 0xDD, 0xB6, 0xBE, 0x2F, 0x7C, 0xED, 0xD1, 0xFD, 0x61, 0x13, 0xF2, 0x93, 0x51,
+0xC9, 0xA1, 0x7F, 0xD9, 0x3C, 0x12, 0xF3, 0x8A, 0x49, 0x96, 0xF8, 0x89, 0xDA, 0x66, 0x3E, 0x5C,
+0xAE, 0xBC, 0x19, 0xAE, 0xB5, 0x11, 0xAA, 0x51, 0x99, 0x8B, 0x11, 0xB1, 0x4A, 0x3C, 0xF2, 0x9D,
+0x27, 0x52, 0xFE, 0x34, 0x57, 0x5A, 0x55, 0x6D, 0xF3, 0x32, 0xAD, 0x2A, 0x53, 0x45, 0x92, 0x12,
+0x55, 0xB7, 0x5C, 0x8D, 0xB5, 0xF2, 0x31, 0xCA, 0xD3, 0xC7, 0xD7, 0x7C, 0xEA, 0x54, 0x88, 0x33,
+0xFF, 0x34, 0xB6, 0x5D, 0xCC, 0x9A, 0x16, 0x3D, 0xCD, 0x6B, 0xAD, 0x4F, 0xB9, 0xCA, 0xC7, 0x39,
+0xC5, 0x32, 0xE0, 0x57, 0xA2, 0x4C, 0xDD, 0x23, 0xFE, 0x75, 0xAB, 0x4F, 0x64, 0xE8, 0x8B, 0x79,
+0xF4, 0x32, 0xB6, 0xC7, 0xC3, 0xBD, 0xE9, 0x5B, 0x27, 0xF8, 0x4B, 0x7B, 0x75, 0xAA, 0xAA, 0xF9,
+0xD8, 0x54, 0xC8, 0x6C, 0x1C, 0xDC, 0xF7, 0xAE, 0x1A, 0x0D, 0x9B, 0xED, 0x98, 0x22, 0x24, 0x8E,
+0x18, 0xEB, 0x43, 0xCB, 0x2B, 0x06, 0xAD, 0xE2, 0x5F, 0x68, 0xB8, 0xA3, 0xD8, 0x14, 0xE6, 0xE9,
+0x08, 0x4C, 0xAF, 0x43, 0xC8, 0x0F, 0x79, 0x1D, 0x4A, 0xDD, 0x28, 0x7E, 0x40, 0x31, 0x68, 0x02,
+0x89, 0x19, 0x91, 0xEA, 0xA5, 0x05, 0xDB, 0x88, 0x6D, 0x0C, 0x9D, 0xC0, 0x42, 0x66, 0xBF, 0x28,
+0x88, 0x15, 0x3A, 0xBD, 0xFA, 0xDF, 0x70, 0xE5, 0x0E, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x0E,
+0x43, 0x60, 0x4D, 0x13, 0xBB, 0x77, 0x41, 0x88, 0x2E, 0x41, 0xAD, 0x1B, 0xC3, 0xE2, 0x33, 0x0C,
+0x15, 0x61, 0x0C, 0x8A, 0xDD, 0x24, 0x16, 0x1E, 0x49, 0x54, 0xCC, 0xBD, 0x4E, 0x8D, 0xA8, 0x45,
+0x4B, 0x5F, 0x3E, 0xF8, 0xA6, 0x50, 0xA8, 0xD8, 0xE3, 0xB4, 0xAF, 0x22, 0xFB, 0x54, 0x55, 0xA0,
+0x1A, 0x6A, 0xA8, 0x55, 0x55, 0xCB, 0xE7, 0xAF, 0x5C, 0xF1, 0xA8, 0xEE, 0x50, 0xA1, 0xFB, 0x8D,
+0x32, 0x72, 0x77, 0x06, 0x04, 0x8F, 0xE6, 0xE3, 0x8F, 0xAE, 0x8C, 0x85, 0xB7, 0xCF, 0x0E, 0x22,
+0xFD, 0x89, 0xE6, 0xE1, 0xBB, 0x5D, 0x0E, 0xB6, 0xBF, 0x1F, 0xAA, 0xD4, 0x23, 0x7B, 0xB6, 0x84,
+0x87, 0xA1, 0xDA, 0x51, 0xA1, 0xE2, 0xE6, 0xF3, 0xF3, 0x88, 0xC8, 0x0C, 0x24, 0x19, 0x15, 0xB3,
+0xAC, 0x12, 0x0C, 0x85, 0x24, 0xC3, 0x32, 0x53, 0xDD, 0xD2, 0xFB, 0x19, 0x6E, 0xB5, 0x97, 0x78,
+0xE7, 0x6B, 0x86, 0xC1, 0xAF, 0xA8, 0x3A, 0xE6, 0xBB, 0x52, 0x95, 0x5F, 0xA4, 0xE7, 0x5C, 0xA7,
+0x4A, 0x04, 0x48, 0x2B, 0x8C, 0x94, 0x23, 0x2A, 0x7C, 0x59, 0x49, 0x3B, 0xB7, 0x40, 0xFC, 0xE3,
+0x85, 0x59, 0xFA, 0x1C, 0xE6, 0x6A, 0xDB, 0xB7, 0x05, 0xA9, 0x3D, 0x9A, 0xB2, 0xE3, 0xC4, 0x6C,
+0x38, 0x85, 0x88, 0x6F, 0x92, 0xCA, 0x36, 0x04, 0xB5, 0xE4, 0xA6, 0xDF, 0xDC, 0x27, 0x30, 0xF6,
+0x2D, 0xEF, 0x8E, 0xCF, 0xCD, 0x5C, 0x95, 0x8B, 0xE0, 0x54, 0x10, 0xD2, 0x31, 0x53, 0x89, 0x4F,
+0x70, 0x12, 0x3F, 0x3A, 0xEE, 0x94, 0x62, 0x0A, 0x1D, 0x23, 0x72, 0xF9, 0x98, 0x60, 0xD4, 0x39,
+0x48, 0xAE, 0xA6, 0x39, 0x99, 0x45, 0xD4, 0x74, 0x1B, 0xFC, 0xEB, 0xB6, 0x63, 0x1B, 0xB1, 0x62,
+0x86, 0xBD, 0x5D, 0x3E, 0xB7, 0xA5, 0x1D, 0x05, 0x81, 0x82, 0xC0, 0xDA, 0x47, 0x60, 0x4D, 0x12,
+0x3B, 0xAA, 0x02, 0x5C, 0x68, 0xDE, 0x87, 0x9A, 0x31, 0xCC, 0xFC, 0x5E, 0x58, 0x94, 0x98, 0x08,
+0x78, 0x62, 0x7C, 0x14, 0x9B, 0xA4, 0x4F, 0x86, 0x11, 0x9A, 0x8A, 0x90, 0x33, 0x8E, 0x79, 0xE2,
+0x84, 0x60, 0x65, 0xBE, 0x59, 0xEE, 0xF4, 0xE6, 0xE9, 0xE6, 0xD4, 0x97, 0x4E, 0xD5, 0xB5, 0x4C,
+0xB0, 0x53, 0x05, 0x43, 0xED, 0x7C, 0xEA, 0x6F, 0x67, 0x17, 0x44, 0xF5, 0xCF, 0x22, 0x0A, 0x65,
+0x39, 0xCC, 0x7C, 0xCD, 0x94, 0xC0, 0x68, 0x7D, 0xAA, 0x05, 0xD9, 0x8E, 0x0C, 0x52, 0xBD, 0x9E,
+0x9F, 0x81, 0xE2, 0x31, 0x39, 0x7C, 0x4D, 0x4C, 0x7C, 0x54, 0x44, 0x5E, 0x38, 0x81, 0x7D, 0x40,
+0xB1, 0x87, 0xEC, 0xD8, 0x64, 0x32, 0x23, 0xDF, 0x16, 0x53, 0x13, 0x6D, 0xDD, 0xD8, 0xDF, 0x15,
+0xBE, 0xF6, 0xC8, 0xBE, 0xB0, 0x15, 0x69, 0x50, 0x04, 0x4D, 0xFA, 0x79, 0x75, 0x76, 0x87, 0x96,
+0x8E, 0x2E, 0x0D, 0xA8, 0x10, 0x85, 0xCC, 0x3D, 0xDE, 0x48, 0x10, 0x54, 0xCD, 0x74, 0x45, 0x48,
+0xFD, 0xB9, 0x34, 0x4A, 0x36, 0x12, 0x08, 0x7B, 0x9E, 0xEF, 0x01, 0x2B, 0x8A, 0x67, 0x25, 0xBF,
+0x1D, 0x31, 0xD7, 0xFA, 0x7C, 0xF7, 0x04, 0xEE, 0x45, 0xAB, 0xCA, 0xA8, 0xD6, 0x2F, 0xEA, 0x90,
+0x8D, 0xAD, 0xE6, 0x12, 0x4C, 0x7E, 0x78, 0x95, 0x3C, 0x77, 0xB1, 0x4D, 0xAE, 0xC8, 0x79, 0x39,
+0x1D, 0xDF, 0xD8, 0x07, 0x51, 0xF0, 0x92, 0x7A, 0x15, 0xDF, 0x23, 0xB1, 0x43, 0x1D, 0xDC, 0x47,
+0xB7, 0x1F, 0xBE, 0x75, 0xDB, 0x37, 0xF6, 0x81, 0xD4, 0xAC, 0xFE, 0x47, 0x8B, 0xE9, 0x7C, 0x2E,
+0x21, 0x39, 0x31, 0x9B, 0xA8, 0xFB, 0xAF, 0xDA, 0x9C, 0xCA, 0x55, 0xBA, 0xA8, 0xD4, 0x59, 0x0E,
+0xC1, 0xD8, 0x07, 0xED, 0xAB, 0xEF, 0x8D, 0xEB, 0x7D, 0xC9, 0xF7, 0x80, 0x95, 0x7E, 0x5B, 0x19,
+0x9E, 0x87, 0x00, 0x27, 0xD8, 0xD2, 0x04, 0x3C, 0x84, 0x1F, 0x48, 0xD7, 0xA0, 0x82, 0x8F, 0xC8,
+0x0F, 0x25, 0x04, 0x26, 0x61, 0x9E, 0x0A, 0xC2, 0xFC, 0xC1, 0x34, 0x35, 0x26, 0x29, 0xFD, 0xB8,
+0x5F, 0xEE, 0x43, 0x07, 0xF7, 0x86, 0xDE, 0xEE, 0xAE, 0xDB, 0x62, 0xBA, 0x96, 0x46, 0x14, 0x04,
+0x0A, 0x02, 0x05, 0x81, 0x3B, 0x01, 0x81, 0xD5, 0x5F, 0x7D, 0x6E, 0x01, 0x8A, 0x5C, 0x64, 0xAE,
+0x20, 0x9A, 0xF4, 0x2C, 0x7C, 0xEC, 0x26, 0xF0, 0x9C, 0xCE, 0xED, 0x73, 0x20, 0x75, 0xB3, 0xD3,
+0x54, 0xBD, 0xE0, 0xC7, 0x06, 0x52, 0xC7, 0x34, 0x0C, 0x93, 0x54, 0xC7, 0xA8, 0xDE, 0xF1, 0x7D,
+0x2E, 0x60, 0xD6, 0x56, 0x57, 0xD3, 0xA2, 0x4D, 0xCB, 0xFB, 0x90, 0x29, 0x45, 0x31, 0x76, 0x42,
+0x48, 0x8A, 0xC9, 0x40, 0x56, 0x43, 0x2E, 0x28, 0xC5, 0xEE, 0x8B, 0xE8, 0x61, 0x64, 0x24, 0x3F,
+0x29, 0xCF, 0xD5, 0x0C, 0xEB, 0x6A, 0x90, 0x24, 0x2A, 0x46, 0x7B, 0xD5, 0xD7, 0x6E, 0x2E, 0x9C,
+0x82, 0x1F, 0xD5, 0x5B, 0x67, 0x06, 0x25, 0xC2, 0xF7, 0x0A, 0x16, 0x72, 0x6E, 0xF4, 0x7E, 0xBB,
+0x1C, 0x34, 0x39, 0x3E, 0xBC, 0x67, 0x13, 0x94, 0xBB, 0xCD, 0xA1, 0x9F, 0x3B, 0x0B, 0x50, 0xB5,
+0xE3, 0xCE, 0x07, 0xED, 0x9D, 0x92, 0x2C, 0x37, 0x31, 0xE2, 0x4C, 0xF9, 0x8C, 0xAA, 0x9D, 0xBE,
+0xEB, 0x58, 0x46, 0xC5, 0x4D, 0x20, 0x5D, 0x88, 0xAB, 0x4A, 0x6D, 0xD6, 0xF7, 0x5C, 0x69, 0x22,
+0xB6, 0xB9, 0x12, 0x58, 0x01, 0xC7, 0xC7, 0x46, 0x71, 0xCE, 0xAB, 0xD6, 0x62, 0x5E, 0x9F, 0x99,
+0x60, 0xED, 0x75, 0x14, 0xA8, 0xAC, 0x5E, 0x57, 0xF3, 0x2A, 0x46, 0x7B, 0x19, 0x4E, 0x55, 0x51,
+0xA9, 0x98, 0x6D, 0xC5, 0x4E, 0x13, 0xBB, 0x10, 0x54, 0xB2, 0xBE, 0xB7, 0x0B, 0x56, 0xD1, 0xD5,
+0x35, 0x39, 0xCA, 0x2E, 0x25, 0xF0, 0xBD, 0x1C, 0xC6, 0x76, 0x79, 0x24, 0x74, 0xF2, 0x41, 0x26,
+0xA1, 0xCB, 0xE7, 0xA8, 0xA1, 0x9F, 0xA6, 0x5D, 0x7A, 0xD3, 0xCB, 0x69, 0x2B, 0x0D, 0xA3, 0x6C,
+0x5C, 0x1C, 0x1B, 0xFD, 0x3D, 0x83, 0xF4, 0x25, 0x78, 0x6F, 0x12, 0xF7, 0xA4, 0x0F, 0x5D, 0xFE,
+0xA0, 0x7F, 0x1D, 0x93, 0x6C, 0xFB, 0xEE, 0x14, 0x1C, 0x87, 0x39, 0x04, 0x01, 0x91, 0x30, 0xF6,
+0x61, 0x6F, 0xD8, 0xBB, 0x76, 0x6E, 0x6D, 0x8A, 0x7A, 0x79, 0xBB, 0x7C, 0x1E, 0x4A, 0x3B, 0x0A,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0xAD, 0x46, 0x60, 0xCD, 0x11, 0x3B, 0x2E, 0x30, 0x93, 0x50, 0x32,
+0x4E, 0x21, 0x31, 0xB1, 0xA8, 0x09, 0x40, 0x78, 0x96, 0x39, 0xC6, 0xC6, 0x86, 0x52, 0x34, 0x1F,
+0x88, 0xD1, 0x14, 0x88, 0xDD, 0x28, 0x52, 0x45, 0x8C, 0x40, 0x75, 0x18, 0x07, 0xC1, 0x9B, 0x86,
+0x3A, 0x36, 0x2B, 0x26, 0x35, 0xF3, 0x23, 0xF2, 0x04, 0x73, 0x71, 0xED, 0x37, 0x95, 0xC9, 0x0C,
+0x79, 0x4E, 0xFE, 0x74, 0xA9, 0x74, 0x85, 0xC7, 0x95, 0x3D, 0x23, 0x70, 0xC6, 0xD4, 0x3C, 0xB7,
+0x9D, 0x0A, 0x7B, 0xEE, 0xB3, 0x24, 0x2F, 0x92, 0x9A, 0x27, 0xD5, 0x27, 0x6A, 0x39, 0x07, 0x55,
+0x71, 0x6A, 0xF8, 0xBA, 0x98, 0xF9, 0x68, 0xFA, 0x7A, 0xE5, 0xF4, 0xB5, 0xF0, 0xE2, 0xF1, 0x2B,
+0xE1, 0x30, 0xFC, 0x06, 0x19, 0xED, 0x7B, 0x3B, 0x1D, 0xEB, 0x11, 0x48, 0xF1, 0xD5, 0x87, 0xF6,
+0x84, 0xDD, 0x1B, 0xFA, 0x55, 0x01, 0x62, 0x57, 0xA8, 0xDC, 0x75, 0x40, 0xB9, 0xE3, 0x5F, 0x11,
+0xD6, 0x34, 0x42, 0x56, 0x15, 0x20, 0x25, 0x6D, 0x79, 0xE4, 0xAA, 0xFB, 0xE3, 0xE5, 0x0A, 0x99,
+0xAA, 0x6E, 0xE6, 0xEF, 0x66, 0xD7, 0xC5, 0x9D, 0x21, 0xCC, 0xFF, 0x4B, 0xD5, 0x34, 0x55, 0x4D,
+0xA3, 0xBF, 0x9D, 0x90, 0x64, 0x27, 0xD1, 0x99, 0x6A, 0xE7, 0x64, 0xD1, 0xFD, 0xE9, 0x8C, 0xF1,
+0x78, 0x9B, 0x5C, 0x3F, 0x75, 0x52, 0x29, 0xF7, 0xF2, 0xFE, 0x08, 0x69, 0x4A, 0x8F, 0x58, 0xC6,
+0x7E, 0x10, 0x30, 0x38, 0xE0, 0x9E, 0x1D, 0x1B, 0x91, 0xBF, 0xAE, 0x59, 0x89, 0x89, 0xE7, 0xC2,
+0x49, 0xA4, 0xF1, 0xE1, 0x9C, 0x6D, 0x13, 0xC5, 0x91, 0x49, 0xB7, 0xE9, 0x5E, 0xA0, 0x04, 0x2F,
+0x45, 0xF5, 0x66, 0x4A, 0x9D, 0x2B, 0x70, 0xA2, 0xE8, 0xA5, 0xC8, 0x57, 0x55, 0x3E, 0xAD, 0xAF,
+0xDE, 0x47, 0xC2, 0x66, 0x7D, 0x97, 0xAD, 0xF9, 0xA2, 0x4A, 0x37, 0x83, 0xCF, 0xD5, 0xAC, 0x04,
+0x4C, 0xF0, 0x7D, 0xF1, 0x6B, 0x34, 0xDF, 0x39, 0x19, 0x43, 0x10, 0x3F, 0x6E, 0xAD, 0x46, 0xB3,
+0xF0, 0xBA, 0x81, 0xFE, 0xB0, 0x69, 0xFD, 0x80, 0xEC, 0xC4, 0x51, 0x7C, 0xEB, 0x6E, 0xA7, 0x4F,
+0x6C, 0x69, 0x4B, 0x41, 0xA0, 0x20, 0xB0, 0x96, 0x11, 0x58, 0x73, 0xC4, 0x8E, 0x83, 0x35, 0xC1,
+0xC4, 0xC4, 0x88, 0x28, 0x1D, 0x9F, 0xD2, 0x68, 0xC5, 0x79, 0x10, 0xB7, 0x96, 0xF1, 0x11, 0x23,
+0x12, 0xCA, 0xD4, 0xA8, 0x32, 0x90, 0xCC, 0x4D, 0x45, 0xF5, 0x8E, 0x4A, 0x1E, 0x1F, 0x38, 0xCF,
+0x64, 0xC6, 0x51, 0xA9, 0x89, 0xC9, 0x51, 0x54, 0x5E, 0x8A, 0xBA, 0x9E, 0x4E, 0x8B, 0xA4, 0x81,
+0x64, 0xCA, 0x50, 0xAE, 0x2A, 0xE5, 0x25, 0xBC, 0xB0, 0x90, 0x01, 0x2F, 0xAF, 0x7F, 0x9D, 0x28,
+0xCA, 0xFA, 0x8A, 0xFF, 0xE8, 0x90, 0x3F, 0x43, 0x95, 0x71, 0x02, 0x66, 0x2D, 0xB4, 0xE7, 0x0C,
+0x54, 0xBB, 0x37, 0x4F, 0x5F, 0x0F, 0x6F, 0x9C, 0xBA, 0x16, 0x4E, 0x5D, 0x1D, 0xBB, 0xAD, 0xFC,
+0xED, 0xB8, 0x75, 0xD6, 0x83, 0xBB, 0x36, 0x84, 0x47, 0xF6, 0x6E, 0x42, 0xB4, 0x2C, 0xCC, 0x6E,
+0x58, 0xD4, 0xE9, 0x6F, 0x17, 0xDA, 0xA0, 0xE0, 0x75, 0xE0, 0x21, 0x36, 0x3C, 0x57, 0x85, 0x6A,
+0x30, 0x33, 0xA2, 0x1C, 0x3F, 0x64, 0x26, 0xA9, 0x25, 0xBD, 0x2B, 0xE1, 0xAA, 0x74, 0xB0, 0x66,
+0x08, 0x72, 0x45, 0x2D, 0x53, 0xAB, 0x22, 0xC1, 0xC9, 0x3E, 0xBD, 0x42, 0xCC, 0xEA, 0x7D, 0x9A,
+0x63, 0xA5, 0x99, 0xA2, 0x57, 0x33, 0xBA, 0xF1, 0xA5, 0x37, 0xC2, 0xEE, 0xE5, 0xA6, 0x4A, 0x12,
+0xBB, 0x7B, 0x77, 0x6C, 0x08, 0xF7, 0xED, 0xDC, 0x80, 0x9C, 0x6D, 0x4D, 0xD8, 0x4A, 0x0C, 0x3F,
+0x5E, 0x4E, 0x62, 0x1E, 0x70, 0x9E, 0x8A, 0xD5, 0x97, 0xA4, 0x4E, 0x7E, 0x98, 0x28, 0xB1, 0x8B,
+0x22, 0x9C, 0xE1, 0x6B, 0xB0, 0x46, 0xD3, 0x72, 0x2C, 0xE7, 0xE5, 0xF1, 0xD7, 0xB1, 0x61, 0x2D,
+0x54, 0x85, 0xE9, 0x47, 0xC7, 0xCF, 0x03, 0x3F, 0x4F, 0xD1, 0x8F, 0x0E, 0xCF, 0x45, 0xA5, 0xCB,
+0x71, 0xCF, 0x06, 0x6F, 0x7E, 0x66, 0x5A, 0xFC, 0xEB, 0xB8, 0x0B, 0xC6, 0x9E, 0x6D, 0x9B, 0xC3,
+0xBA, 0xBE, 0x1E, 0x31, 0x13, 0x97, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x9A, 0x83,
+0xC0, 0x9A, 0x23, 0x76, 0x54, 0x06, 0xC6, 0x18, 0x11, 0x7B, 0x7E, 0x48, 0xD2, 0x40, 0xB4, 0x61,
+0x81, 0x6A, 0x83, 0x69, 0xA8, 0x0D, 0x04, 0xA9, 0x85, 0x26, 0x23, 0x2E, 0x60, 0x54, 0x18, 0x44,
+0x0D, 0xE2, 0xF6, 0x9E, 0x48, 0xD7, 0x40, 0xF3, 0x12, 0xC8, 0xDF, 0x28, 0x22, 0xFB, 0x86, 0x91,
+0xC0, 0x78, 0x04, 0x7F, 0x49, 0xF2, 0xD4, 0xBC, 0x64, 0x8A, 0x87, 0x2B, 0x78, 0xBE, 0xB0, 0x8B,
+0x8D, 0xCA, 0x23, 0x67, 0xB5, 0x9C, 0xAE, 0xF5, 0xE9, 0x5C, 0x0C, 0xBB, 0x75, 0xA2, 0x67, 0x9C,
+0x44, 0xDA, 0x60, 0xCB, 0xA8, 0x54, 0x23, 0xBE, 0x4B, 0x5A, 0x5F, 0x52, 0xB3, 0x6C, 0x5B, 0xA6,
+0x91, 0xEB, 0x92, 0x06, 0x85, 0xAA, 0xDD, 0x7B, 0x17, 0x87, 0xC2, 0x8F, 0xE1, 0x6F, 0xF7, 0xEA,
+0xC9, 0x6B, 0x42, 0x5A, 0x6F, 0xA7, 0x63, 0xA0, 0xA7, 0x23, 0x7C, 0xE9, 0xFE, 0x1D, 0x61, 0x2F,
+0xFC, 0xCB, 0x48, 0xEC, 0xE0, 0xDA, 0xA8, 0xBB, 0x51, 0x74, 0xF4, 0x00, 0x06, 0x8D, 0x8A, 0x94,
+0x08, 0x59, 0x51, 0xEA, 0x34, 0xDA, 0x58, 0x39, 0x47, 0xF2, 0x7D, 0xF3, 0xFE, 0x2B, 0xFD, 0x32,
+0xD5, 0x4D, 0xFC, 0x0E, 0x8D, 0x18, 0xD8, 0x78, 0x78, 0x14, 0xAC, 0x2B, 0x4D, 0xA2, 0xD4, 0x49,
+0xB9, 0xAA, 0xAA, 0x96, 0xEF, 0x1A, 0xE1, 0x63, 0xB5, 0x40, 0x75, 0x73, 0xCC, 0x2B, 0x6A, 0x96,
+0xD6, 0xE3, 0xEA, 0xA1, 0x9A, 0x38, 0xCD, 0xBF, 0xCE, 0xD5, 0xBE, 0x18, 0x9D, 0xC0, 0xC1, 0x6C,
+0x95, 0x44, 0xCD, 0xF7, 0xEE, 0xDC, 0x18, 0xEE, 0x83, 0x6A, 0xD7, 0xAC, 0xAD, 0xC4, 0xA8, 0x4A,
+0x9B, 0x7B, 0x5F, 0x24, 0x76, 0xAE, 0x7C, 0xAA, 0x7F, 0x62, 0x7A, 0x28, 0x56, 0x36, 0xF7, 0xA3,
+0x3F, 0xA3, 0xF5, 0x31, 0x53, 0xEF, 0xA8, 0xB8, 0x4E, 0xA3, 0xEC, 0x18, 0x08, 0xDC, 0x08, 0xE6,
+0xD8, 0x75, 0xA8, 0xDA, 0x7C, 0x8C, 0xE2, 0x35, 0x5D, 0x1C, 0xF8, 0x85, 0xE1, 0xEA, 0x6B, 0x54,
+0xFA, 0xD2, 0x60, 0x22, 0xF8, 0x67, 0x12, 0x51, 0xBA, 0xF4, 0xAF, 0xEB, 0x0C, 0x0F, 0xEC, 0xDF,
+0x2D, 0x51, 0xC2, 0x65, 0xB7, 0x89, 0xDB, 0xE9, 0x93, 0x5A, 0xDA, 0x52, 0x10, 0x28, 0x08, 0xAC,
+0x75, 0x04, 0xD6, 0x1C, 0xB1, 0xE3, 0x1A, 0x33, 0x82, 0x48, 0xD8, 0x93, 0x57, 0x47, 0x24, 0xC2,
+0xB4, 0x7D, 0x7A, 0x22, 0xB4, 0x4F, 0x82, 0xD4, 0xC1, 0xBF, 0xCE, 0x17, 0x68, 0x0E, 0x6A, 0xF4,
+0xA3, 0xC3, 0x73, 0xE6, 0x88, 0xA3, 0x2F, 0x1B, 0x09, 0x1E, 0x4D, 0xB4, 0xF4, 0xBF, 0x63, 0xC4,
+0x1F, 0x1F, 0xB9, 0x0F, 0x9E, 0x2A, 0x6B, 0x4E, 0xC9, 0x94, 0x88, 0x29, 0x1F, 0x4B, 0xFE, 0x79,
+0xAE, 0x47, 0xE5, 0x8B, 0x59, 0xD5, 0x9F, 0xA9, 0x56, 0xF3, 0xCB, 0xA6, 0x98, 0xD7, 0xE3, 0xF5,
+0xD2, 0x0C, 0x4B, 0xC5, 0x0E, 0xED, 0xA7, 0x6A, 0x77, 0x75, 0x7C, 0x3A, 0x9C, 0x80, 0xF9, 0xED,
+0xCD, 0x33, 0xD7, 0x24, 0xC7, 0xDD, 0xED, 0x14, 0x25, 0xDB, 0x05, 0x85, 0xE6, 0xBE, 0xED, 0xEB,
+0xC3, 0xA3, 0xBB, 0x37, 0x86, 0xED, 0xEB, 0x7A, 0x42, 0x0F, 0x1C, 0xE7, 0x25, 0xED, 0x09, 0x16,
+0x78, 0x06, 0x52, 0x68, 0xE2, 0xDC, 0xA8, 0xB9, 0x2D, 0x54, 0xDE, 0x94, 0x9A, 0x19, 0x35, 0x56,
+0x82, 0x9C, 0x8B, 0xA3, 0xEA, 0x8B, 0xE7, 0x92, 0x9C, 0xFA, 0x23, 0xC6, 0xFA, 0xF2, 0xA2, 0x35,
+0x8A, 0x9A, 0x0D, 0x50, 0x22, 0x17, 0x99, 0x72, 0xE8, 0x62, 0xA1, 0x0B, 0x76, 0x4A, 0x84, 0xB2,
+0x36, 0xE4, 0x75, 0x59, 0xA1, 0x7C, 0xDE, 0x48, 0x49, 0xFA, 0xB7, 0x81, 0xC0, 0x6E, 0x40, 0xA2,
+0xE6, 0x9D, 0x48, 0xFF, 0xB2, 0x75, 0xA0, 0x27, 0x74, 0x30, 0x68, 0x64, 0x15, 0x0F, 0xFE, 0x18,
+0x19, 0xC6, 0x1C, 0xBF, 0x06, 0x3F, 0x52, 0xC5, 0x89, 0x7E, 0xA4, 0x06, 0x42, 0xFE, 0x23, 0x42,
+0xDE, 0xD2, 0xF3, 0xAA, 0x04, 0x67, 0x1D, 0x52, 0x9E, 0xE7, 0x14, 0x5A, 0x7D, 0xE8, 0x24, 0xC5,
+0x8E, 0xA9, 0x73, 0xE6, 0x4B, 0xC7, 0xD7, 0xA2, 0x62, 0x67, 0x2A, 0x5D, 0xED, 0xE7, 0x47, 0xC7,
+0x86, 0x1F, 0x24, 0x28, 0xE1, 0x48, 0x73, 0xC2, 0x91, 0xEC, 0x44, 0x3E, 0xBF, 0x7B, 0xF6, 0xEE,
+0x28, 0x11, 0xB1, 0xAB, 0x38, 0x0F, 0x4A, 0xD5, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x1E, 0x02,
+0xAB, 0xBB, 0x02, 0x35, 0x19, 0x73, 0x2E, 0x62, 0xF4, 0x39, 0x1A, 0x1C, 0x9B, 0x0A, 0xD7, 0x46,
+0xC6, 0x43, 0x1B, 0xCC, 0x42, 0x5D, 0x63, 0x83, 0xA1, 0x03, 0x8F, 0x16, 0x6E, 0xF9, 0x24, 0x4A,
+0x9D, 0xF1, 0x05, 0x15, 0x78, 0x2A, 0xFE, 0x41, 0xB2, 0xF0, 0xB5, 0x30, 0xC2, 0x0F, 0x4E, 0xE2,
+0xCC, 0xCD, 0x05, 0xF5, 0x8E, 0x0F, 0x3E, 0x77, 0xFF, 0xBB, 0x98, 0x8B, 0x4B, 0xFC, 0xBA, 0xDC,
+0x67, 0xCC, 0x28, 0x89, 0x47, 0x4C, 0xAA, 0x2E, 0x98, 0x2D, 0xA3, 0x16, 0x1C, 0x91, 0x93, 0x42,
+0x69, 0x87, 0x96, 0x73, 0x5F, 0x33, 0x6F, 0x9D, 0xAA, 0x4F, 0xFA, 0x8A, 0x7B, 0x90, 0x4E, 0x8B,
+0x6A, 0x37, 0x1D, 0x3A, 0xDB, 0xA0, 0xA6, 0x60, 0x91, 0x7D, 0x17, 0x6A, 0xE4, 0xF3, 0xF0, 0xB7,
+0x1B, 0x99, 0x9C, 0x69, 0x32, 0xC2, 0x4B, 0xDF, 0x6E, 0xA0, 0xBB, 0x23, 0x3C, 0x7B, 0xEF, 0x8E,
+0xF0, 0x88, 0x90, 0xBB, 0x6E, 0xED, 0x1B, 0x08, 0x5D, 0x6B, 0x57, 0x2F, 0x72, 0x17, 0x77, 0xA8,
+0x00, 0x66, 0x98, 0xA5, 0xDD, 0x26, 0x58, 0xA7, 0xBC, 0xA1, 0xE5, 0x45, 0x59, 0xD2, 0xC8, 0x53,
+0xDF, 0xDF, 0xB5, 0x56, 0x65, 0xF3, 0xF7, 0x3C, 0xD2, 0x35, 0x46, 0xBE, 0x52, 0x59, 0xB3, 0xE8,
+0x50, 0xF7, 0x8F, 0x73, 0x53, 0x69, 0x8A, 0xBA, 0x35, 0xBF, 0x46, 0xF3, 0xCB, 0x8B, 0xB9, 0xF1,
+0xDC, 0x67, 0x4F, 0x1C, 0x21, 0xCD, 0x47, 0xCD, 0xD4, 0x39, 0xDD, 0x5F, 0xB6, 0x8E, 0x1A, 0x28,
+0xF3, 0x05, 0xD1, 0xB0, 0xB0, 0x85, 0xEE, 0x44, 0x54, 0x70, 0x2F, 0xFA, 0xAF, 0x92, 0xD6, 0xEA,
+0x0E, 0x0B, 0x77, 0x22, 0x61, 0x10, 0x0D, 0x55, 0x65, 0x9A, 0x39, 0x69, 0xFA, 0x74, 0xF6, 0xA6,
+0x81, 0xC3, 0x3A, 0x2F, 0x3D, 0xC2, 0x55, 0x31, 0x51, 0x1F, 0x47, 0x57, 0x21, 0x7D, 0x3F, 0x5C,
+0x57, 0xAD, 0x99, 0xAA, 0x64, 0x10, 0x3E, 0xA9, 0x57, 0xE1, 0x73, 0x3A, 0x68, 0x7E, 0xA7, 0x4C,
+0x5D, 0xA2, 0x19, 0xFA, 0xA0, 0xD4, 0x49, 0x57, 0x8D, 0x21, 0x8A, 0x2A, 0xED, 0xBE, 0x8F, 0x3E,
+0x7F, 0xD9, 0x04, 0xEE, 0x99, 0xCB, 0xAD, 0xD5, 0x5A, 0x24, 0x51, 0xF3, 0xC1, 0xDD, 0x5B, 0x65,
+0x2B, 0xB1, 0xE2, 0x5F, 0xB7, 0xBA, 0xF3, 0xA1, 0xD4, 0x5E, 0x10, 0x28, 0x08, 0x14, 0x04, 0x72,
+0x04, 0xD6, 0x14, 0xB1, 0x63, 0xC7, 0x98, 0x02, 0xE2, 0xD4, 0xB5, 0x11, 0xA8, 0x76, 0x53, 0xA1,
+0x05, 0x64, 0xA8, 0x1D, 0x41, 0x13, 0x6D, 0xE3, 0x43, 0x62, 0xAA, 0xF2, 0xA3, 0xDE, 0xBA, 0xEB,
+0xEA, 0x85, 0x90, 0x29, 0x2C, 0x50, 0x54, 0xF0, 0xA8, 0xD6, 0x89, 0xDF, 0x1D, 0x15, 0x3C, 0x7B,
+0xF0, 0xB5, 0x2C, 0x78, 0x54, 0x27, 0x4C, 0x52, 0x4A, 0xD7, 0x72, 0xB1, 0x53, 0x4A, 0x17, 0x09,
+0xA4, 0xDC, 0x34, 0x29, 0x55, 0x7C, 0x95, 0x94, 0xA9, 0xA4, 0x40, 0xE5, 0x83, 0xE2, 0x67, 0xA5,
+0x24, 0x7D, 0xA7, 0xA0, 0xD8, 0xCD, 0x23, 0x42, 0xB6, 0x8D, 0xAA, 0x09, 0x16, 0xE0, 0x4B, 0x43,
+0x13, 0xE1, 0xAD, 0xD3, 0x57, 0xC3, 0x51, 0xE4, 0xE9, 0x63, 0x7F, 0x6F, 0x97, 0x83, 0x7B, 0xA3,
+0xDE, 0xBD, 0x7D, 0x20, 0x3C, 0xB9, 0x0F, 0x51, 0xB2, 0xF0, 0xB9, 0xDB, 0x86, 0x3D, 0x65, 0x49,
+0x3C, 0x5A, 0xA1, 0xDA, 0xB5, 0x75, 0x42, 0xB5, 0xA3, 0x33, 0x98, 0x91, 0xA6, 0x28, 0x8D, 0x45,
+0x7C, 0xAC, 0x17, 0x51, 0x05, 0x75, 0xE2, 0x5B, 0xA7, 0x77, 0xA6, 0x9E, 0x45, 0xD1, 0xCE, 0xA5,
+0xBD, 0x4C, 0xAD, 0x72, 0xC3, 0xB8, 0xAA, 0x7C, 0xEE, 0x3B, 0x67, 0xAA, 0x56, 0x4D, 0x95, 0xAA,
+0xA8, 0x2A, 0x81, 0x91, 0xB1, 0x49, 0x15, 0x2F, 0xB8, 0xB9, 0x15, 0x55, 0xF5, 0x57, 0x4A, 0xB7,
+0x4A, 0x70, 0xC0, 0xBE, 0x2D, 0x03, 0x92, 0xD7, 0xAF, 0x19, 0x24, 0x86, 0xE9, 0x45, 0x2E, 0x60,
+0x0E, 0xCC, 0x82, 0xE0, 0xD1, 0x7D, 0xD1, 0xA3, 0x52, 0x63, 0x63, 0x5D, 0xA9, 0x8B, 0x2A, 0xA8,
+0xF6, 0x2B, 0xCD, 0x7B, 0xFC, 0x00, 0x42, 0xFB, 0x99, 0x4A, 0x67, 0x9C, 0x91, 0xAE, 0x98, 0xDB,
+0x63, 0xDC, 0x31, 0xC2, 0xD4, 0xBA, 0x49, 0xCC, 0x33, 0xFA, 0xD8, 0x71, 0x8E, 0xFB, 0x7C, 0xCD,
+0xD5, 0xD4, 0x58, 0x8F, 0x60, 0xE0, 0xF5, 0x52, 0x35, 0xC4, 0xE7, 0x82, 0x5B, 0xF6, 0x41, 0xC1,
+0xDC, 0xBA, 0x71, 0x5D, 0xD8, 0xBA, 0x01, 0x81, 0x13, 0x4D, 0x48, 0xFB, 0x72, 0xBB, 0xCC, 0xFF,
+0xD2, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0x3B, 0x20, 0xB0, 0xE6, 0x88, 0xDD, 0x18, 0x54,
+0x87, 0x77, 0xCE, 0x5D, 0x03, 0x11, 0x83, 0x9A, 0x45, 0x25, 0x83, 0xD1, 0xB0, 0xD8, 0x90, 0x3C,
+0x12, 0x09, 0xF1, 0x27, 0xB2, 0xA5, 0x5E, 0x7C, 0x8D, 0x7C, 0x25, 0xD7, 0x25, 0xCA, 0x44, 0x3C,
+0x89, 0xF6, 0x13, 0x9F, 0x74, 0xFC, 0x47, 0x32, 0x47, 0xBF, 0xBB, 0x41, 0x51, 0xF0, 0xA6, 0x90,
+0x0B, 0x4F, 0xD3, 0xA5, 0x70, 0x71, 0x74, 0x05, 0x4F, 0x1D, 0xF3, 0x3D, 0x97, 0x98, 0x08, 0x39,
+0xC9, 0x4F, 0x4B, 0xEE, 0xA3, 0xEF, 0xB9, 0xAF, 0x97, 0x2A, 0x2A, 0xAA, 0xAC, 0xC4, 0x25, 0xD7,
+0xDE, 0x4F, 0x2A, 0x12, 0xEB, 0x40, 0x19, 0xE6, 0xDC, 0x1B, 0x83, 0x6A, 0x37, 0x35, 0x0E, 0x41,
+0x91, 0xBE, 0x7F, 0x73, 0xE1, 0xF0, 0xA5, 0xA1, 0xF0, 0xA3, 0xC3, 0x17, 0x65, 0x13, 0xF8, 0xDB,
+0xE9, 0xE8, 0xEB, 0x6A, 0x0F, 0x9F, 0x39, 0xB8, 0x39, 0xFC, 0xD4, 0x03, 0x3B, 0xC2, 0x83, 0x3B,
+0xD6, 0x05, 0x70, 0x3D, 0x49, 0xFD, 0xD1, 0x0E, 0xD5, 0xAE, 0xB5, 0x1D, 0xE4, 0xCE, 0xFA, 0xAB,
+0xB9, 0xED, 0x3C, 0x88, 0x24, 0xF3, 0x69, 0x33, 0xFF, 0x2F, 0xF7, 0x11, 0x73, 0xF3, 0xB9, 0xFA,
+0xB8, 0xA9, 0xE2, 0xA4, 0xFE, 0x6F, 0xA6, 0x96, 0x0A, 0x51, 0x4C, 0xE7, 0x63, 0x7E, 0x3A, 0x29,
+0x43, 0x8C, 0xD3, 0x38, 0x78, 0xA4, 0x6C, 0xC5, 0x7F, 0x4E, 0xC6, 0xCC, 0xCA, 0x7A, 0xDD, 0x54,
+0xA3, 0xD8, 0x36, 0x7B, 0xED, 0xE5, 0x5D, 0x09, 0xD3, 0xBD, 0x84, 0x13, 0x15, 0x6C, 0x47, 0x5A,
+0x97, 0xBB, 0x61, 0x86, 0xA6, 0x9F, 0x61, 0x33, 0x0E, 0xBA, 0x0B, 0x9C, 0x46, 0x62, 0x62, 0x52,
+0x7A, 0x5A, 0x7D, 0x49, 0xA6, 0xE6, 0x24, 0x2A, 0xD6, 0x54, 0x45, 0x8B, 0x70, 0x95, 0x19, 0xE9,
+0x38, 0xB8, 0xE2, 0x86, 0x6B, 0x98, 0xE7, 0x5A, 0xF6, 0x74, 0x85, 0x2F, 0xEA, 0x55, 0xCC, 0x9F,
+0xAB, 0x50, 0x7E, 0xE9, 0x43, 0xC7, 0x14, 0x2A, 0x54, 0xE6, 0x24, 0x27, 0x1E, 0x67, 0x65, 0x86,
+0x87, 0xA8, 0x96, 0xF2, 0x43, 0x23, 0x29, 0x97, 0xA2, 0x2A, 0xCB, 0x6B, 0x14, 0x26, 0x19, 0x94,
+0xDC, 0x90, 0xF3, 0x92, 0xCF, 0xEF, 0xD0, 0xAE, 0x6D, 0xA2, 0xD6, 0x15, 0xFF, 0xBA, 0x66, 0xCC,
+0x88, 0x72, 0x8F, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x90, 0x10, 0x58, 0x73, 0xC4, 0x6E, 0x1C, 0xC4,
+0xEE, 0xC3, 0x0B, 0xD7, 0xC3, 0x34, 0x88, 0x58, 0x0B, 0x1C, 0xB9, 0x5B, 0x91, 0x2C, 0xB5, 0x05,
+0x7E, 0x76, 0x71, 0x31, 0x77, 0x1E, 0x17, 0x55, 0x9E, 0x78, 0xA2, 0x32, 0x2F, 0x5C, 0x89, 0xD0,
+0x35, 0xCB, 0xF6, 0xC3, 0x14, 0xD5, 0x0E, 0x7B, 0xCE, 0xE2, 0xA1, 0x0A, 0x9E, 0x12, 0x3C, 0xFA,
+0xE6, 0xD1, 0xE1, 0x3C, 0xE6, 0xF2, 0x72, 0x6D, 0x24, 0x53, 0x90, 0xFC, 0x76, 0xC9, 0x89, 0x4B,
+0xD5, 0x90, 0x05, 0x0B, 0x9F, 0x28, 0x7E, 0xC2, 0x1A, 0xD2, 0xC1, 0x45, 0x1B, 0xA4, 0x6E, 0x7E,
+0x62, 0x04, 0x7F, 0xC7, 0xD0, 0x20, 0x2C, 0xC6, 0x23, 0x13, 0x88, 0x92, 0xBD, 0x12, 0x3E, 0x44,
+0xE2, 0x62, 0xB6, 0xE1, 0x76, 0x39, 0x3A, 0xA1, 0xD0, 0xEC, 0xDE, 0xD0, 0x1B, 0x1E, 0x00, 0xA9,
+0x7B, 0x74, 0xF7, 0x86, 0xB0, 0x03, 0xFE, 0x76, 0x4C, 0xC7, 0xD1, 0x06, 0xD5, 0xAE, 0xA3, 0x0B,
+0xF9, 0xDD, 0x40, 0x82, 0x92, 0x91, 0x3A, 0xEF, 0xA3, 0x92, 0x5E, 0x1E, 0x95, 0xDD, 0x38, 0x4C,
+0x7D, 0x8A, 0x70, 0xE4, 0xAA, 0x5C, 0x54, 0xA6, 0x12, 0x5C, 0x39, 0x6C, 0x09, 0x43, 0x23, 0x1F,
+0x39, 0xAE, 0xF9, 0xD8, 0xE8, 0x48, 0x98, 0x99, 0xB2, 0x16, 0x7B, 0x3F, 0x6F, 0x6A, 0x9F, 0xDF,
+0x40, 0x26, 0x88, 0xEE, 0xF6, 0xD0, 0x03, 0xA5, 0x6E, 0x17, 0x82, 0x46, 0x9A, 0xB1, 0x8D, 0x18,
+0x5B, 0xCA, 0x74, 0x3E, 0x17, 0x31, 0xFE, 0x6E, 0x56, 0x55, 0x52, 0x97, 0xB0, 0xF4, 0xB9, 0xAB,
+0xB9, 0xED, 0x7C, 0xA7, 0x08, 0xFA, 0xCF, 0xA5, 0x3C, 0x74, 0xA2, 0xD0, 0x99, 0x52, 0xC7, 0xF3,
+0xEA, 0x43, 0xA7, 0xF5, 0xA8, 0xEA, 0x5C, 0x9D, 0x87, 0x15, 0x35, 0x53, 0x27, 0xAE, 0x91, 0x3F,
+0xBD, 0xAF, 0xAA, 0xDC, 0x20, 0x76, 0x78, 0xDE, 0x09, 0xFF, 0xCA, 0xFB, 0xF7, 0x6E, 0x07, 0x1E,
+0xCD, 0x21, 0xBA, 0xB7, 0xCB, 0xDC, 0x2F, 0xED, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xB7, 0x03,
+0x02, 0x6B, 0x86, 0xD8, 0xB9, 0x02, 0x36, 0x09, 0x15, 0xE2, 0xA3, 0x4B, 0xD7, 0x91, 0x8C, 0x18,
+0x91, 0xB0, 0x54, 0xB8, 0xE0, 0xCC, 0xAD, 0xD1, 0xB0, 0xA6, 0x38, 0x28, 0x73, 0x10, 0xC5, 0x47,
+0x89, 0x84, 0x3D, 0x37, 0x73, 0xA9, 0x7A, 0x0C, 0xA9, 0x8A, 0xA6, 0xFE, 0x60, 0x54, 0x25, 0x4C,
+0xD5, 0xC1, 0x79, 0xFA, 0x1C, 0x4D, 0xD3, 0x84, 0x85, 0x45, 0x71, 0x10, 0x6A, 0x07, 0xB3, 0xEF,
+0x0F, 0x63, 0x8F, 0x4C, 0x26, 0x6D, 0x8D, 0xA6, 0x2B, 0xF3, 0xD7, 0xD2, 0xE8, 0x5B, 0x5B, 0x73,
+0x5D, 0x15, 0xB2, 0xBF, 0x22, 0x25, 0x99, 0xA2, 0xE4, 0x4E, 0xFB, 0x1A, 0x39, 0xAA, 0x2A, 0x48,
+0xCA, 0xD7, 0xC6, 0x53, 0x28, 0xCB, 0x14, 0x2C, 0x50, 0x1E, 0xE7, 0x46, 0x61, 0x56, 0x96, 0x40,
+0x90, 0x39, 0x04, 0x50, 0x0C, 0x87, 0xEF, 0xBF, 0x77, 0x36, 0x0C, 0x23, 0xA8, 0xE2, 0x76, 0x3B,
+0xD6, 0x43, 0xBD, 0x7A, 0x72, 0xFF, 0x46, 0x98, 0x64, 0xD7, 0x43, 0xB5, 0x83, 0x39, 0x16, 0x7D,
+0xE8, 0xEA, 0xEE, 0x05, 0xB9, 0xA3, 0xEF, 0x9D, 0x12, 0x83, 0x4A, 0xD4, 0xA6, 0xF8, 0xB1, 0x39,
+0x26, 0xAE, 0x04, 0xA9, 0x3F, 0x9C, 0xEF, 0x7F, 0x1A, 0x73, 0xDD, 0xF9, 0x58, 0x99, 0xCF, 0x57,
+0xAC, 0x47, 0xF0, 0xD6, 0x31, 0x8D, 0xB9, 0xE9, 0x9C, 0x70, 0xBB, 0x4F, 0x64, 0x8C, 0x16, 0xF5,
+0xC8, 0x5C, 0x57, 0xEB, 0x28, 0xED, 0xF9, 0x68, 0xE9, 0xF8, 0x47, 0x3F, 0x40, 0xF1, 0xB5, 0x53,
+0x1F, 0xB3, 0x14, 0x6D, 0x8A, 0x22, 0x90, 0xCB, 0x68, 0x5E, 0x5E, 0x8F, 0xC4, 0xCC, 0x1B, 0xFB,
+0x3A, 0xE1, 0x03, 0xB9, 0xFA, 0x1F, 0x27, 0xF6, 0x6B, 0x02, 0xD1, 0xAA, 0x43, 0x08, 0x9E, 0x60,
+0x3F, 0x69, 0x9A, 0x17, 0x2F, 0x03, 0x27, 0x64, 0xA6, 0xA8, 0xB5, 0xE1, 0x04, 0x55, 0xE7, 0x39,
+0xB4, 0x59, 0xF7, 0x73, 0xC5, 0x5C, 0xC5, 0x3C, 0xA5, 0x42, 0xC7, 0xBF, 0x54, 0xEB, 0xA8, 0x44,
+0xF3, 0x42, 0x29, 0x2B, 0xCA, 0x65, 0xF2, 0xF7, 0x94, 0x31, 0x52, 0xB9, 0x53, 0x94, 0x3A, 0xF9,
+0x0C, 0x44, 0xB5, 0x4E, 0x3F, 0x1B, 0x71, 0x9E, 0x12, 0x75, 0x12, 0x3B, 0x28, 0x76, 0x4C, 0x73,
+0xD3, 0x0B, 0x42, 0xF7, 0xD0, 0xFE, 0x1D, 0x12, 0x11, 0x5B, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x68, 0x2E, 0x02, 0xAB, 0xBF, 0x12, 0x35, 0xB1, 0x3F, 0x0C, 0x2C, 0xB8, 0x38, 0x38,
+0x16, 0xAE, 0x0C, 0x43, 0xDD, 0x82, 0x9A, 0xD6, 0x3A, 0x31, 0x1A, 0x5A, 0x99, 0xC3, 0xCE, 0xD5,
+0x85, 0xD8, 0x16, 0x97, 0x37, 0x8C, 0xD8, 0x2D, 0x90, 0xC8, 0xB2, 0x46, 0x5B, 0x51, 0x55, 0x30,
+0x94, 0x0C, 0x70, 0x2B, 0x32, 0xF1, 0xC1, 0x63, 0x9E, 0x2F, 0xC9, 0xF1, 0x45, 0x15, 0x8F, 0x0A,
+0x88, 0xFE, 0xE5, 0x82, 0x49, 0x05, 0x84, 0x66, 0x29, 0xC9, 0xF7, 0x55, 0x7B, 0x7F, 0x57, 0x8B,
+0xEC, 0xAF, 0x98, 0xF8, 0x94, 0xED, 0x98, 0x5A, 0xE7, 0x84, 0x33, 0x93, 0x61, 0x48, 0x50, 0x18,
+0x71, 0x38, 0x3D, 0x0E, 0xC9, 0x06, 0x84, 0x15, 0xFE, 0x83, 0x83, 0x63, 0x50, 0xED, 0x4E, 0x5D,
+0x09, 0xEF, 0x9D, 0xBD, 0x86, 0x3D, 0x70, 0x6F, 0x1F, 0xD5, 0x8E, 0x3D, 0x61, 0x6E, 0xBB, 0x3D,
+0x9B, 0xFA, 0x10, 0x48, 0xB1, 0x3E, 0xEC, 0x5E, 0xDF, 0x23, 0xE4, 0xAE, 0x1D, 0x0B, 0x7E, 0x67,
+0x77, 0xB7, 0x98, 0xEA, 0x5C, 0x6D, 0x32, 0x8E, 0xE7, 0x46, 0xD9, 0xA8, 0xDA, 0xA9, 0xC9, 0x4F,
+0x31, 0xA9, 0xA7, 0xD6, 0xF9, 0x08, 0xB9, 0xF5, 0xBA, 0x1A, 0x99, 0x9C, 0x8F, 0x9F, 0x29, 0x6D,
+0x76, 0x4A, 0xAB, 0x34, 0x9F, 0x3B, 0xE5, 0x43, 0xAA, 0x9A, 0x1A, 0xE4, 0x5A, 0xCC, 0xEE, 0xE8,
+0xC4, 0xBF, 0xFA, 0xA6, 0x96, 0x97, 0x80, 0x84, 0x56, 0xD9, 0x0F, 0x75, 0x07, 0x14, 0xCA, 0x7E,
+0x04, 0x4E, 0xAC, 0xF6, 0x6E, 0x13, 0x6C, 0x19, 0x7D, 0xDF, 0xAE, 0x61, 0xC7, 0x09, 0xAA, 0xC5,
+0x2D, 0xC0, 0x94, 0x66, 0xD8, 0x7C, 0x7E, 0x89, 0x72, 0x86, 0x07, 0xFD, 0x40, 0xE3, 0x5E, 0xAE,
+0xE6, 0x3F, 0x37, 0x06, 0xA5, 0x6F, 0x4C, 0x54, 0x3B, 0x9D, 0xBB, 0xA2, 0xD0, 0xC9, 0xBC, 0xCE,
+0xFC, 0x0B, 0xE5, 0x87, 0x4E, 0xFE, 0xA1, 0xCD, 0xFC, 0x0E, 0xAD, 0xAC, 0x5E, 0x93, 0xC1, 0x64,
+0x44, 0x5A, 0xE6, 0x3A, 0x30, 0x19, 0xC0, 0x8E, 0x13, 0x7B, 0xB6, 0x6C, 0x84, 0x72, 0xB7, 0xFA,
+0xF9, 0xFC, 0xF2, 0x96, 0x96, 0xE7, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x60, 0x3B, 0x11,
+0xAD, 0x15, 0x20, 0x26, 0xE0, 0xFB, 0x76, 0xF8, 0xFC, 0xB5, 0x30, 0x45, 0x33, 0x2C, 0xCC, 0x42,
+0x2D, 0x0C, 0x3A, 0xA0, 0x4F, 0x1A, 0x4D, 0x66, 0xF2, 0x5F, 0xB6, 0x66, 0xC9, 0xCA, 0xC4, 0x15,
+0xCA, 0xFC, 0xEC, 0xFC, 0xB5, 0x2C, 0x6A, 0x99, 0x07, 0x95, 0xF9, 0x53, 0xC9, 0xDB, 0xEE, 0x53,
+0xC4, 0x85, 0x10, 0xE7, 0x35, 0xF1, 0x2A, 0x4D, 0x50, 0x50, 0x51, 0xA8, 0xE0, 0x89, 0x22, 0x32,
+0x29, 0x79, 0xBF, 0xC6, 0xD1, 0x06, 0x2E, 0xAE, 0x5C, 0x64, 0x95, 0x08, 0xB8, 0xE2, 0xA3, 0xCA,
+0x48, 0xBC, 0x77, 0xC5, 0x5B, 0xCB, 0x14, 0x27, 0x53, 0x0A, 0x63, 0x24, 0xA7, 0x97, 0xE1, 0x75,
+0xEC, 0xCF, 0xE4, 0x28, 0xCC, 0xCB, 0x50, 0x22, 0xE7, 0x67, 0xC3, 0x99, 0x6B, 0xC3, 0xE1, 0xBB,
+0x6F, 0x9F, 0x0A, 0x83, 0xE3, 0x4C, 0x7D, 0x71, 0x7B, 0x1D, 0xDD, 0x58, 0xD8, 0x1F, 0xDE, 0xB5,
+0x31, 0x3C, 0xB9, 0x77, 0x43, 0xE8, 0x6C, 0x87, 0x39, 0x16, 0xE3, 0xD0, 0xDD, 0x0B, 0xD5, 0x0E,
+0xE4, 0xCE, 0x0F, 0x21, 0xCC, 0x22, 0xD4, 0xE5, 0x7D, 0x57, 0xE2, 0xA4, 0x44, 0xD7, 0x94, 0x21,
+0x51, 0x31, 0x59, 0x50, 0x55, 0x24, 0x57, 0xFC, 0x64, 0x54, 0xCD, 0xA7, 0xCC, 0xFD, 0xE2, 0x94,
+0xE4, 0x99, 0xFA, 0x24, 0x04, 0x2C, 0x53, 0x67, 0x65, 0xEC, 0x54, 0x81, 0x8D, 0x5E, 0x7E, 0xA2,
+0xC8, 0x99, 0xBF, 0x9F, 0x10, 0x1B, 0x53, 0xFD, 0xE4, 0x32, 0xF7, 0xB5, 0xB3, 0x3A, 0x44, 0x65,
+0x45, 0x5F, 0x10, 0x20, 0x40, 0xB2, 0xCA, 0x3E, 0xDE, 0xB3, 0x75, 0x40, 0xFE, 0x36, 0xE3, 0xF0,
+0x5D, 0x55, 0xD8, 0x44, 0xFA, 0xD7, 0xCD, 0x30, 0x58, 0x01, 0x37, 0x6E, 0x15, 0x65, 0x53, 0x49,
+0x1D, 0xD5, 0xE3, 0x41, 0x10, 0xFD, 0xCB, 0x98, 0x83, 0x57, 0x30, 0x17, 0x87, 0xE1, 0x9E, 0xC0,
+0x94, 0x25, 0xFC, 0xA1, 0xA1, 0xD3, 0x58, 0xFD, 0x3D, 0x65, 0xD7, 0x08, 0xC3, 0x35, 0xF9, 0xD3,
+0x99, 0x4A, 0x67, 0xFD, 0x76, 0x3F, 0x3D, 0xC7, 0x27, 0xDF, 0x57, 0x39, 0x11, 0x62, 0x2A, 0xE2,
+0xF4, 0xF3, 0x43, 0x69, 0x38, 0x55, 0x6E, 0xDC, 0x38, 0x80, 0xED, 0xC4, 0x98, 0xE2, 0x26, 0x9B,
+0xEB, 0xCD, 0x00, 0xA7, 0xDC, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x74, 0x8B, 0xC9,
+0xB5, 0x72, 0xD0, 0xBF, 0xEE, 0xFD, 0xB3, 0x57, 0xC3, 0x24, 0x08, 0x56, 0x0B, 0x15, 0x0D, 0x2A,
+0x5B, 0x54, 0x25, 0x18, 0x3A, 0xE8, 0x64, 0xCA, 0x3A, 0x1B, 0x79, 0x1D, 0x5F, 0xE7, 0x0A, 0x85,
+0x72, 0x30, 0x3B, 0x59, 0x91, 0x2E, 0x2A, 0x64, 0x44, 0x16, 0x48, 0x2B, 0xE7, 0x51, 0xB4, 0x8C,
+0x26, 0xD4, 0x0C, 0xFD, 0xAA, 0xDC, 0xA5, 0xE7, 0xEA, 0x93, 0x47, 0x87, 0x75, 0xD9, 0x97, 0xD6,
+0x94, 0xB9, 0xC4, 0x2D, 0x6B, 0x1A, 0xC0, 0xBA, 0x5D, 0x38, 0x71, 0x75, 0xCF, 0xEF, 0x2E, 0xCA,
+0x1D, 0xCC, 0x70, 0x30, 0xC7, 0x92, 0xBC, 0x0E, 0x8F, 0x4F, 0x86, 0xB7, 0x4E, 0x5D, 0x0E, 0xEF,
+0xC0, 0xDF, 0xEE, 0x76, 0xDB, 0x6A, 0x8C, 0xC4, 0x67, 0xE7, 0x86, 0x1E, 0x90, 0xBB, 0x0D, 0x92,
+0xB8, 0xB8, 0x1D, 0xE9, 0x5A, 0x3A, 0x90, 0xF6, 0xA4, 0xA7, 0x07, 0x0A, 0x1E, 0xFC, 0xB0, 0x54,
+0x6D, 0x73, 0x75, 0x2C, 0x1B, 0x88, 0xD8, 0xE7, 0x08, 0x82, 0x61, 0xED, 0x63, 0x65, 0x04, 0xC5,
+0x89, 0x8A, 0x2B, 0x9D, 0x99, 0xB2, 0xE6, 0x0A, 0x68, 0x1C, 0xB4, 0xBC, 0xCE, 0xDA, 0x01, 0xB7,
+0x42, 0x46, 0xE7, 0x6A, 0xE6, 0x43, 0x8D, 0x9A, 0x27, 0x4A, 0x22, 0xCC, 0x97, 0x30, 0xBB, 0x52,
+0xA1, 0xEB, 0x46, 0x44, 0xEC, 0x5D, 0x5B, 0xFA, 0x02, 0xF3, 0xF8, 0x35, 0xE3, 0x60, 0xE0, 0xC4,
+0xF9, 0xC1, 0x71, 0x21, 0x51, 0x7C, 0x70, 0xCE, 0xAB, 0x32, 0x07, 0x35, 0x4E, 0x54, 0x63, 0x46,
+0xB7, 0xDA, 0x73, 0xEE, 0x1A, 0x61, 0xEA, 0x1C, 0x7F, 0x7C, 0xA8, 0x0F, 0x68, 0x52, 0xE7, 0x54,
+0x85, 0x76, 0xF5, 0x2D, 0x57, 0xEA, 0xCC, 0x7F, 0x4E, 0x86, 0xC4, 0x89, 0xAE, 0xCF, 0xF7, 0xFC,
+0xF3, 0xA2, 0x88, 0x51, 0xF9, 0xA3, 0x1F, 0x2A, 0x8F, 0x4E, 0xA8, 0xB1, 0x07, 0xB6, 0x73, 0xDF,
+0x60, 0x10, 0xBB, 0x66, 0x00, 0x52, 0xEE, 0x51, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x15,
+0x04, 0xD6, 0x0C, 0xB1, 0xA3, 0x3A, 0x30, 0x0E, 0xC5, 0xEE, 0xFD, 0x73, 0x57, 0x60, 0x1E, 0x45,
+0x44, 0x2C, 0xF7, 0xAB, 0x44, 0xF0, 0x04, 0x24, 0x2E, 0xED, 0xB0, 0x28, 0x13, 0xBA, 0x28, 0xAB,
+0xDF, 0x9C, 0xA9, 0x44, 0x76, 0x3E, 0x6E, 0xFF, 0xE0, 0x4A, 0x8E, 0xB0, 0x0E, 0xF7, 0xD9, 0x52,
+0xED, 0x48, 0x75, 0xA0, 0x14, 0x11, 0xA9, 0x3E, 0x72, 0xAA, 0x4A, 0xB4, 0xA2, 0x2C, 0x83, 0x04,
+0xF8, 0x1F, 0x7D, 0xED, 0xB8, 0xD8, 0x32, 0x7A, 0x76, 0x48, 0xFC, 0xF0, 0xCC, 0x17, 0x8F, 0x8B,
+0xB0, 0xED, 0xB3, 0x99, 0xCC, 0x67, 0x5E, 0x87, 0xB5, 0x51, 0xCC, 0xB2, 0x69, 0x01, 0x8E, 0xCB,
+0xA9, 0xF9, 0x3B, 0xB1, 0xE1, 0xD8, 0x70, 0x2C, 0xCC, 0xC3, 0x7F, 0x30, 0xC0, 0x34, 0x4B, 0xD5,
+0xE5, 0xE2, 0xE0, 0x68, 0xF8, 0xCE, 0x5B, 0x27, 0x60, 0x9A, 0x65, 0x7F, 0x6F, 0xAF, 0x83, 0x29,
+0x50, 0xEE, 0x41, 0x20, 0xC5, 0x53, 0xFB, 0x36, 0x82, 0xFC, 0xB4, 0xCA, 0xF6, 0x57, 0x24, 0x76,
+0xDD, 0xE6, 0x6B, 0x27, 0xDB, 0x60, 0x89, 0x40, 0x47, 0x62, 0x60, 0x91, 0xAE, 0xD1, 0x0F, 0x51,
+0x89, 0x83, 0x9A, 0xD2, 0x6D, 0x04, 0xC4, 0x47, 0x4E, 0xD5, 0x33, 0x8F, 0x2A, 0x96, 0xF7, 0x84,
+0x80, 0xA8, 0x4F, 0x24, 0x9F, 0xFA, 0x38, 0x7B, 0x24, 0x6C, 0xF4, 0x69, 0x94, 0x71, 0x37, 0xB2,
+0x62, 0x24, 0x2D, 0x45, 0xBD, 0x1A, 0xF2, 0xEE, 0xEB, 0x17, 0xC7, 0x97, 0x4D, 0x4B, 0x2A, 0x21,
+0x11, 0x66, 0x8A, 0x13, 0x8E, 0x77, 0x0F, 0x4D, 0xCE, 0x1B, 0x7B, 0xA5, 0x6F, 0xCD, 0x38, 0x48,
+0xD0, 0x2E, 0x8D, 0x4E, 0x08, 0x99, 0xE2, 0x3C, 0x17, 0x95, 0x18, 0xCA, 0xDC, 0x25, 0xFC, 0xBD,
+0x82, 0xC7, 0x75, 0xCC, 0x31, 0x46, 0xB8, 0xD2, 0x15, 0x80, 0x40, 0x48, 0xFE, 0x39, 0x51, 0x29,
+0xED, 0xF7, 0x4D, 0xD6, 0x67, 0xF7, 0x93, 0x4B, 0xBE, 0x84, 0xAA, 0x5A, 0x56, 0x09, 0xA0, 0x9A,
+0xC4, 0xAB, 0xFE, 0x75, 0x56, 0xC6, 0xFC, 0x15, 0x19, 0x4D, 0xAB, 0xFE, 0xA5, 0xAD, 0xA1, 0x0F,
+0x41, 0x32, 0x8F, 0x8B, 0x7F, 0x5D, 0x09, 0x9C, 0x68, 0xC6, 0x7C, 0x28, 0xF7, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0xB5, 0x08, 0x34, 0x67, 0x35, 0x6A, 0x02, 0xEE, 0x54, 0x0C, 0x06, 0xB1, 0xE0,
+0x9D, 0xB9, 0x36, 0x14, 0xA6, 0x49, 0xEC, 0x40, 0xEA, 0x5A, 0xE0, 0xCC, 0xAD, 0x66, 0x35, 0xE1,
+0x07, 0xB2, 0xC0, 0xA9, 0x02, 0xA1, 0xA7, 0x84, 0x4B, 0x18, 0x69, 0x48, 0x22, 0x8E, 0xA9, 0x41,
+0x76, 0x8D, 0x37, 0x5D, 0x95, 0x8D, 0xA4, 0xAC, 0xC5, 0xBA, 0xE4, 0xBC, 0xD5, 0x67, 0x7F, 0xB9,
+0x38, 0x72, 0xA1, 0x13, 0x1F, 0x3C, 0x3C, 0x24, 0x1A, 0xD1, 0xD4, 0x94, 0xA4, 0xE4, 0x51, 0x65,
+0x71, 0x15, 0x4F, 0xCB, 0xFB, 0xFE, 0x9B, 0xDA, 0xB8, 0x25, 0x40, 0x63, 0x17, 0x40, 0x5C, 0x03,
+0xCC, 0xB1, 0x34, 0xCD, 0x8E, 0x22, 0x67, 0xDF, 0x9B, 0x27, 0x2F, 0x85, 0xB7, 0xF1, 0x20, 0xB9,
+0xBD, 0x9D, 0x8E, 0x36, 0xA8, 0x5A, 0x5B, 0x07, 0xBA, 0xC2, 0x03, 0x3B, 0xD7, 0x43, 0xB5, 0x43,
+0x84, 0x2C, 0x54, 0x3B, 0x46, 0x4D, 0xF6, 0xC0, 0x0F, 0xAB, 0x83, 0xAA, 0x1D, 0xCD, 0xA0, 0x3E,
+0x40, 0x79, 0xC3, 0x13, 0xD4, 0x95, 0xEE, 0x28, 0xF1, 0xD0, 0x71, 0x13, 0x2A, 0xA8, 0xDC, 0x2F,
+0x22, 0x1F, 0x15, 0x26, 0x7B, 0x5F, 0x8B, 0xA6, 0x39, 0x20, 0xC3, 0x9A, 0xCD, 0x81, 0xFC, 0xD6,
+0x95, 0x9C, 0x77, 0xF9, 0x75, 0x79, 0xF5, 0x78, 0x2E, 0xE9, 0x5B, 0xC0, 0x50, 0x3B, 0x60, 0x5E,
+0xDE, 0x84, 0xA0, 0x89, 0x8D, 0xBD, 0xC8, 0xD3, 0x47, 0x55, 0x78, 0x95, 0x0F, 0x99, 0xE3, 0x30,
+0xB9, 0x5F, 0xC5, 0x63, 0x82, 0x01, 0x11, 0xF8, 0xC1, 0xC0, 0x34, 0x3C, 0x54, 0xE9, 0x38, 0x97,
+0xF8, 0xA0, 0xC9, 0x55, 0xFD, 0xE7, 0x94, 0xA4, 0xC5, 0x68, 0x56, 0x9B, 0x52, 0x32, 0x8F, 0xA3,
+0x7A, 0xA9, 0x38, 0xE6, 0xF8, 0x49, 0x2F, 0x2A, 0xD8, 0xA7, 0xCF, 0x83, 0xCE, 0x79, 0xFE, 0x6F,
+0x63, 0x60, 0xFD, 0xA5, 0x06, 0x2D, 0x2A, 0x34, 0xC6, 0xB2, 0x0F, 0x91, 0xCF, 0x77, 0xEF, 0xD8,
+0xAC, 0x3B, 0x8F, 0x94, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x9A, 0x8E, 0xC0, 0x9A,
+0x20, 0x76, 0x5C, 0xA8, 0xC7, 0xA1, 0x56, 0xBC, 0x77, 0xE6, 0x52, 0xB8, 0x3C, 0x34, 0x1C, 0x66,
+0x40, 0x78, 0x5A, 0x63, 0xEE, 0x3A, 0x5F, 0x70, 0x55, 0x11, 0x4A, 0x26, 0xD9, 0x39, 0x35, 0x05,
+0xF2, 0xD4, 0x9C, 0xFC, 0x23, 0x0B, 0x96, 0xD0, 0x37, 0x2C, 0x9A, 0xF2, 0x9E, 0xA9, 0x7D, 0x73,
+0x78, 0x8F, 0x4F, 0xD5, 0x9F, 0x4B, 0xD7, 0x3D, 0x9E, 0x12, 0x9F, 0x3B, 0x2C, 0xA2, 0x62, 0xEE,
+0xA5, 0x7A, 0x21, 0x1B, 0x77, 0xB2, 0x5E, 0xF3, 0xE1, 0xB2, 0xDB, 0xB9, 0xC9, 0x91, 0x09, 0x8F,
+0x47, 0x40, 0x3A, 0xA9, 0xE0, 0x5D, 0x1A, 0x9F, 0x90, 0x87, 0x67, 0xFA, 0x1F, 0x96, 0x05, 0x7A,
+0x46, 0x92, 0x22, 0x93, 0xE4, 0x49, 0xE0, 0x05, 0x03, 0x30, 0xB8, 0x64, 0x46, 0x85, 0x89, 0x37,
+0xB7, 0x07, 0x5B, 0x31, 0x35, 0x11, 0x5A, 0x11, 0x4C, 0xD1, 0x3A, 0x3F, 0x13, 0x2E, 0xC0, 0xD7,
+0xEE, 0xB7, 0x7F, 0xF0, 0x76, 0x78, 0xEB, 0xA3, 0x8B, 0x50, 0x05, 0x99, 0xFD, 0xFF, 0xF6, 0x39,
+0x18, 0x2D, 0x7A, 0x1F, 0x54, 0xBB, 0xAF, 0xDE, 0xBF, 0x33, 0x6C, 0xED, 0xEF, 0x82, 0xDA, 0x05,
+0x07, 0xFB, 0x75, 0xFD, 0x78, 0x0C, 0x84, 0x5E, 0x10, 0x3C, 0x99, 0x84, 0xB2, 0x25, 0x96, 0x91,
+0x11, 0x3E, 0x17, 0xCC, 0xD1, 0x57, 0xC1, 0xD4, 0xD8, 0x1B, 0xCF, 0x73, 0x6C, 0xCC, 0x9F, 0x4C,
+0xCC, 0x7F, 0x3A, 0x10, 0x3A, 0x76, 0xF6, 0x9E, 0xBF, 0xCF, 0xD7, 0x1C, 0x13, 0x46, 0x86, 0x4A,
+0xFD, 0x1C, 0x44, 0x8C, 0x95, 0x90, 0x49, 0x1F, 0x6F, 0xDE, 0x43, 0xD8, 0x8A, 0x9E, 0x6F, 0x61,
+0x1D, 0x76, 0x9D, 0xC2, 0xAE, 0xEA, 0x94, 0x10, 0x25, 0x5C, 0x43, 0xFE, 0xD6, 0x01, 0x73, 0x63,
+0x27, 0x14, 0xBB, 0xBE, 0xCE, 0x76, 0x98, 0x99, 0xD7, 0x23, 0x0A, 0x14, 0xC1, 0x20, 0x4D, 0x38,
+0xF8, 0xA3, 0xE0, 0x03, 0xEC, 0x17, 0xCC, 0xF9, 0x33, 0x02, 0xE5, 0xF7, 0x3C, 0x82, 0x84, 0xC6,
+0x10, 0x21, 0x4B, 0x1C, 0x08, 0x83, 0xA8, 0xC6, 0x68, 0x87, 0x6E, 0x7E, 0x91, 0x29, 0x6D, 0x7C,
+0xDF, 0x95, 0x3A, 0x21, 0x60, 0x2C, 0x8F, 0xFE, 0x0A, 0x7E, 0xD9, 0xDC, 0xF7, 0x72, 0xA6, 0x6C,
+0x0B, 0x16, 0xA2, 0x6E, 0xAB, 0xFA, 0xC7, 0x87, 0xFC, 0xF8, 0x30, 0x9C, 0xE7, 0x88, 0x9D, 0x2B,
+0xA5, 0xB8, 0x63, 0x5B, 0x5B, 0x47, 0xD8, 0xB1, 0x69, 0x7D, 0xB8, 0x6B, 0xBB, 0x06, 0x4E, 0x34,
+0x23, 0x59, 0xF3, 0x6A, 0xC1, 0x4E, 0x68, 0x46, 0xA6, 0xE7, 0xC2, 0xE5, 0x89, 0xD9, 0x70, 0x0D,
+0x0F, 0xE4, 0x82, 0xBE, 0xA1, 0x83, 0x3E, 0x8F, 0x13, 0xB8, 0x78, 0x12, 0x0F, 0xB3, 0x56, 0xDF,
+0x50, 0x3D, 0xE5, 0xA2, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xD0, 0x28, 0x02, 0x6B, 0x82, 0xD8, 0x71,
+0x01, 0x19, 0x82, 0x8A, 0xF1, 0x37, 0xEF, 0x9D, 0x84, 0xA2, 0x81, 0xFC, 0x5E, 0x73, 0x53, 0xD8,
+0x1F, 0x76, 0x44, 0x17, 0xA4, 0xC8, 0xC4, 0x8C, 0xE0, 0x71, 0x81, 0xE3, 0x06, 0x08, 0x46, 0xD2,
+0x92, 0x33, 0xBE, 0xBE, 0x2F, 0xA4, 0x4D, 0x82, 0x17, 0x34, 0x51, 0xAB, 0x32, 0x24, 0x5B, 0xFC,
+0xA5, 0x44, 0x4E, 0x14, 0xF5, 0x6D, 0x4F, 0xB6, 0xAB, 0x86, 0xD8, 0x5A, 0xFD, 0xCE, 0xAE, 0x36,
+0xF3, 0x9E, 0x64, 0xA6, 0x40, 0xE5, 0xDC, 0xA2, 0x6C, 0x0A, 0x5F, 0xF6, 0x4C, 0xA8, 0x3C, 0x82,
+0x07, 0x53, 0xA6, 0x5C, 0xC7, 0xE3, 0xF2, 0x04, 0x09, 0xDF, 0xA4, 0x10, 0xBE, 0x11, 0xBC, 0x9E,
+0x84, 0xEA, 0xC8, 0x3C, 0x79, 0x9E, 0x23, 0x4F, 0x76, 0x72, 0x80, 0x7D, 0xAD, 0x55, 0x3A, 0x81,
+0xC5, 0x19, 0xBE, 0x76, 0xAD, 0x30, 0xC9, 0xCE, 0x80, 0x18, 0xBE, 0x73, 0xEA, 0x62, 0xF8, 0x37,
+0xDF, 0x7F, 0x2B, 0x9C, 0x46, 0x1A, 0x14, 0x92, 0xC2, 0xDB, 0xE5, 0x20, 0x9E, 0xEB, 0x90, 0xFE,
+0xE4, 0xF1, 0xBD, 0x1B, 0xC3, 0xA7, 0xF7, 0x6F, 0x86, 0x5F, 0x1A, 0xB7, 0x9C, 0xEA, 0x08, 0x5B,
+0x10, 0x39, 0xB9, 0x69, 0xF3, 0x46, 0xF8, 0xDB, 0xB5, 0x2B, 0xCC, 0xA6, 0x9E, 0x46, 0xC3, 0xAB,
+0x05, 0x45, 0x24, 0x33, 0xB9, 0x8F, 0x09, 0x49, 0x06, 0x09, 0x89, 0x92, 0x2E, 0x37, 0x1D, 0xC6,
+0x61, 0xF2, 0x31, 0xCB, 0xAE, 0x57, 0x05, 0x2B, 0x91, 0x62, 0x37, 0xED, 0x3A, 0x69, 0x54, 0x52,
+0x4F, 0xA2, 0xC3, 0x21, 0x76, 0xF3, 0xB8, 0x92, 0x19, 0x69, 0x97, 0x5D, 0xCF, 0xB1, 0xEE, 0x46,
+0x04, 0x2C, 0xD5, 0x3A, 0x12, 0x3B, 0xF6, 0x89, 0x49, 0x99, 0x9B, 0x71, 0xD0, 0xB4, 0xFF, 0xE6,
+0xB9, 0xEB, 0xE2, 0xAF, 0xC9, 0xC8, 0xEC, 0x21, 0xCC, 0x75, 0x4F, 0xB1, 0xA3, 0x6D, 0xB6, 0x07,
+0xE7, 0x85, 0xB5, 0x59, 0xA7, 0x2C, 0x5D, 0x05, 0xBC, 0x2F, 0x32, 0x61, 0x35, 0x10, 0xC5, 0x02,
+0x46, 0x88, 0x0B, 0xDF, 0xF7, 0x54, 0x2E, 0x9E, 0xDA, 0x44, 0x92, 0x74, 0xF3, 0xBA, 0x88, 0xB3,
+0x7E, 0x0E, 0xA2, 0x09, 0x5C, 0x08, 0x37, 0xDE, 0x06, 0xDB, 0xE5, 0xB9, 0x1E, 0x6C, 0x23, 0xF6,
+0xA9, 0x03, 0xBB, 0xC2, 0xE6, 0x7E, 0x6C, 0x21, 0xD7, 0x0C, 0x40, 0x56, 0xF1, 0x1E, 0x24, 0x62,
+0x6F, 0x5D, 0x99, 0x0A, 0x7F, 0x76, 0x62, 0x34, 0x7C, 0xEF, 0xF4, 0x38, 0x3E, 0x8B, 0x2B, 0xFF,
+0x3C, 0x91, 0xC8, 0x0D, 0x4F, 0xCE, 0x85, 0x93, 0xC3, 0xD3, 0xE1, 0xF4, 0x28, 0x03, 0x58, 0x6E,
+0x90, 0x1D, 0xAE, 0x62, 0x3F, 0x4B, 0xD5, 0x05, 0x81, 0x82, 0xC0, 0xDA, 0x43, 0x60, 0x4D, 0x10,
+0x3B, 0x7E, 0x5D, 0x8E, 0x82, 0x08, 0x1D, 0xBD, 0x00, 0xFF, 0x3A, 0x90, 0xA4, 0x16, 0x04, 0x17,
+0xB4, 0x32, 0xC0, 0xA0, 0xD6, 0xE4, 0x56, 0x67, 0xFC, 0x6C, 0x6D, 0xD2, 0x35, 0x3D, 0xFF, 0xDE,
+0x75, 0x73, 0x95, 0xAD, 0xF5, 0xBA, 0xF0, 0xDB, 0xBA, 0x1F, 0xEB, 0x51, 0x65, 0x2F, 0x51, 0x42,
+0x7B, 0x23, 0xD6, 0xA3, 0x14, 0xA5, 0xC6, 0xB6, 0x95, 0x5D, 0x93, 0x6F, 0x5F, 0x46, 0xA2, 0x07,
+0xB3, 0x2D, 0x52, 0x52, 0xC4, 0xA0, 0x0B, 0xDB, 0xE2, 0x49, 0x92, 0x21, 0xE3, 0xB9, 0x3C, 0x2C,
+0x08, 0x83, 0xA9, 0x5D, 0x18, 0x88, 0x31, 0x4B, 0x73, 0x33, 0x1E, 0xAD, 0x30, 0xC9, 0x32, 0x68,
+0xE4, 0x9D, 0x93, 0x17, 0xC2, 0x1B, 0xC7, 0xCF, 0x87, 0xCB, 0x48, 0xFB, 0x42, 0x47, 0xFB, 0xDB,
+0x25, 0xF3, 0x3F, 0x09, 0xE9, 0x7A, 0x98, 0x2C, 0xEF, 0x46, 0x04, 0xE9, 0x26, 0x44, 0x4C, 0x4A,
+0x44, 0x29, 0xF2, 0x9C, 0xF5, 0x41, 0xB1, 0xEB, 0xE9, 0xE9, 0xB6, 0xC8, 0x55, 0x61, 0x77, 0x19,
+0xBA, 0xAA, 0xE0, 0x2D, 0x90, 0x1F, 0x85, 0xB4, 0x18, 0x61, 0x36, 0xBE, 0x12, 0x0B, 0x65, 0x63,
+0x18, 0x03, 0x05, 0x94, 0x35, 0xD6, 0x19, 0x89, 0xC5, 0x3E, 0xD0, 0xD9, 0x98, 0xF9, 0x53, 0x23,
+0x90, 0x54, 0xEC, 0xBA, 0x40, 0x44, 0xDB, 0x11, 0x92, 0xDA, 0x0F, 0x42, 0xB7, 0x0D, 0x66, 0xE6,
+0x8E, 0x26, 0x98, 0x61, 0x39, 0x1D, 0xC7, 0xB0, 0x43, 0xC4, 0x85, 0xE1, 0x09, 0x89, 0xC2, 0x9E,
+0xE6, 0x4E, 0x11, 0xB2, 0x9D, 0x5C, 0xF2, 0x3F, 0x74, 0x0C, 0xDC, 0xD4, 0x1A, 0xE7, 0xA6, 0xF4,
+0xC1, 0x70, 0xCC, 0xF8, 0xAB, 0xFD, 0xBC, 0x31, 0xFF, 0x44, 0xE7, 0xB4, 0xCB, 0xCF, 0x69, 0x05,
+0x52, 0x2B, 0x12, 0x3F, 0x3D, 0xFE, 0xC8, 0x80, 0x56, 0x48, 0x5C, 0x1E, 0xDC, 0x05, 0x33, 0x6C,
+0x93, 0x14, 0xCC, 0xA5, 0xBE, 0x8E, 0x67, 0xD0, 0xBC, 0x73, 0x63, 0xB3, 0xE1, 0x95, 0x4B, 0x13,
+0xE1, 0xC5, 0x0B, 0xD5, 0xC7, 0xEB, 0x97, 0xB9, 0xFF, 0xF3, 0xD2, 0x24, 0x8B, 0xB9, 0x2A, 0x3F,
+0x02, 0x21, 0x7B, 0xF9, 0x22, 0x82, 0x93, 0xAE, 0x22, 0xBD, 0xCC, 0x0A, 0x48, 0x19, 0x8B, 0x5E,
+0x1C, 0x9F, 0x0D, 0x6F, 0x5C, 0x9E, 0x08, 0xCF, 0x5F, 0x18, 0x0F, 0xCF, 0x9D, 0x1B, 0xC7, 0xF3,
+0x49, 0xFC, 0x80, 0xF3, 0x6F, 0x91, 0xB5, 0xB7, 0x90, 0x94, 0x1E, 0x15, 0x04, 0x3E, 0x0E, 0x02,
+0xB3, 0xDC, 0x26, 0xF1, 0xE2, 0xB5, 0xF0, 0xFC, 0xF3, 0x6F, 0xC9, 0x83, 0xCF, 0x79, 0xEE, 0x93,
+0x7C, 0x8C, 0x21, 0x1D, 0xD9, 0x8B, 0x2F, 0xBE, 0x13, 0x7E, 0xF8, 0xDC, 0x1B, 0xE1, 0xBD, 0x0F,
+0x4E, 0x86, 0x51, 0xBC, 0x6E, 0xD6, 0xF1, 0x89, 0x27, 0x76, 0xA2, 0xD8, 0xE0, 0x4B, 0x78, 0x7C,
+0x62, 0x32, 0x5C, 0xBA, 0x36, 0x88, 0xC5, 0x0E, 0x66, 0x58, 0xFA, 0xD7, 0x89, 0xD2, 0xE0, 0x4A,
+0x9B, 0x2E, 0x42, 0xE2, 0xFF, 0x6E, 0x4E, 0xF0, 0xAA, 0xC0, 0xE8, 0xA2, 0xC8, 0x7F, 0xA3, 0x2F,
+0x92, 0x91, 0x00, 0x4F, 0x8E, 0xE2, 0x65, 0xD4, 0xF9, 0x5E, 0x79, 0x87, 0xD7, 0xA3, 0x7F, 0xF5,
+0xBC, 0x90, 0x3B, 0xB1, 0x4C, 0x69, 0x01, 0xF9, 0x23, 0xA7, 0x54, 0x1D, 0xF1, 0x2D, 0xB1, 0x94,
+0x3C, 0xDA, 0x3D, 0xA9, 0xB0, 0x88, 0xD9, 0xD6, 0x1E, 0x54, 0x48, 0xCC, 0x8C, 0x4B, 0x53, 0x2C,
+0xFD, 0xA5, 0xE8, 0x08, 0x4F, 0x33, 0xAD, 0x07, 0x60, 0x5C, 0x9B, 0xC2, 0x26, 0xED, 0x20, 0x70,
+0xF4, 0xAD, 0x22, 0xC9, 0xA3, 0x0F, 0x9F, 0x90, 0x3B, 0x10, 0x3B, 0x26, 0x9A, 0x1D, 0x85, 0xDA,
+0xF7, 0xAD, 0xD7, 0x8E, 0x84, 0xC3, 0x67, 0xAF, 0xC8, 0xF3, 0xA8, 0xE8, 0x34, 0x6B, 0x46, 0x2D,
+0x71, 0x9F, 0x0E, 0x98, 0x64, 0x99, 0xDB, 0x6E, 0x3F, 0x1E, 0x7C, 0xDE, 0x8A, 0xF6, 0x76, 0x77,
+0xB6, 0x85, 0x0D, 0x30, 0xCB, 0x92, 0x1B, 0x29, 0x89, 0x53, 0x33, 0xB6, 0xA8, 0x70, 0xBE, 0x6D,
+0x98, 0x29, 0x4B, 0x51, 0x3D, 0x53, 0x6F, 0xFE, 0x38, 0xC6, 0x5A, 0xDE, 0xCD, 0x82, 0xCA, 0xF4,
+0x5C, 0x61, 0x13, 0xE5, 0x2A, 0x2A, 0x59, 0x24, 0x22, 0xAE, 0xF2, 0xA9, 0x2A, 0xEB, 0x66, 0xEE,
+0xB8, 0x33, 0x89, 0x2B, 0x5B, 0xCE, 0x31, 0xED, 0x5E, 0x2A, 0xF0, 0x22, 0x1A, 0x16, 0x0D, 0x65,
+0x8E, 0x3E, 0xF1, 0xAF, 0xEB, 0xEF, 0x40, 0x90, 0x00, 0x76, 0xD2, 0x68, 0x02, 0xB1, 0xE3, 0x7C,
+0x18, 0x9A, 0x80, 0xB2, 0x8B, 0xC4, 0xC4, 0xD3, 0x60, 0x0E, 0xF4, 0xAB, 0xE4, 0xD6, 0x72, 0x29,
+0xA8, 0xC1, 0xE6, 0x25, 0xE7, 0xB5, 0xCC, 0x37, 0x9D, 0x73, 0x4E, 0xFC, 0x64, 0xDE, 0x9B, 0x09,
+0x5B, 0x27, 0xB0, 0x7F, 0x26, 0xCC, 0x4C, 0x4B, 0xF4, 0xE5, 0x23, 0x63, 0x73, 0x55, 0x48, 0x5B,
+0xC2, 0x2A, 0xF9, 0xA7, 0x26, 0xD5, 0x4E, 0x86, 0x1A, 0xA4, 0xAE, 0x15, 0xA9, 0x5F, 0xA8, 0x20,
+0xD3, 0xAF, 0xEE, 0xC1, 0xDD, 0x9B, 0x9B, 0x66, 0x9A, 0x5E, 0x6A, 0x4A, 0xF3, 0xB3, 0xF3, 0x1A,
+0x48, 0xDD, 0xFF, 0xF0, 0xF6, 0xF5, 0xF0, 0xFF, 0x79, 0xE3, 0x5A, 0xF8, 0x67, 0x6F, 0xEA, 0x83,
+0xCF, 0xFF, 0xCD, 0x7B, 0x83, 0x50, 0xC4, 0x97, 0xCE, 0xFB, 0x48, 0xF2, 0x7C, 0x1E, 0x2A, 0xDB,
+0xFB, 0xD7, 0x26, 0xC3, 0xD1, 0xA1, 0x29, 0xF9, 0x9C, 0x35, 0x7A, 0xF0, 0xDE, 0x6F, 0x5F, 0x9D,
+0x08, 0xFF, 0xF6, 0x83, 0xA1, 0xF0, 0x2F, 0xDF, 0x1D, 0x0C, 0xBF, 0xF5, 0xC1, 0x70, 0xF8, 0xCE,
+0xA9, 0x31, 0x7C, 0x86, 0xF9, 0x43, 0xAB, 0xD1, 0x5A, 0x4A, 0xB9, 0x82, 0xC0, 0x9D, 0x83, 0xC0,
+0x14, 0x04, 0x99, 0x37, 0xDF, 0x3E, 0x16, 0xFE, 0xDF, 0xFF, 0xED, 0xBF, 0x93, 0x07, 0x9F, 0xF3,
+0xDC, 0x27, 0xF9, 0xB8, 0x7C, 0xF9, 0x7A, 0xF8, 0x67, 0xFF, 0xEC, 0x77, 0xC3, 0xFF, 0xF3, 0xBF,
+0xFE, 0xAD, 0xF0, 0x47, 0x7F, 0xF6, 0x5C, 0xB8, 0x88, 0x8D, 0x13, 0x9A, 0x75, 0x7C, 0xE2, 0x89,
+0x1D, 0x81, 0x62, 0xB0, 0xC4, 0xD9, 0x2B, 0x83, 0x61, 0x70, 0x04, 0x91, 0xA2, 0x50, 0xB5, 0xDA,
+0x18, 0x54, 0xE0, 0xE9, 0xF8, 0xA3, 0x4E, 0xA3, 0x8A, 0x85, 0x10, 0xB0, 0xA8, 0x38, 0x38, 0xCC,
+0xE9, 0xDB, 0x56, 0x97, 0x2D, 0x7F, 0xED, 0x8A, 0x9B, 0x96, 0xB3, 0xB5, 0x30, 0x8D, 0x8D, 0x15,
+0xCB, 0x95, 0x3E, 0x5F, 0x4C, 0xFD, 0x5E, 0x49, 0x35, 0xB1, 0xC2, 0x46, 0xEC, 0xAC, 0xC6, 0x05,
+0xE3, 0xEC, 0xEA, 0x9F, 0x64, 0xF2, 0xC7, 0x83, 0xD1, 0x8D, 0x12, 0x84, 0x21, 0x6A, 0x1D, 0xD3,
+0xA6, 0x20, 0x95, 0x0A, 0x88, 0x9C, 0xFE, 0x75, 0x15, 0x0F, 0x66, 0x1E, 0xE6, 0xCD, 0x83, 0x4A,
+0x39, 0x34, 0x39, 0x11, 0x5E, 0xFB, 0xE8, 0x5C, 0xF8, 0xC1, 0xFB, 0x1F, 0x85, 0x57, 0x8E, 0x9D,
+0x43, 0xB2, 0x66, 0xEC, 0x29, 0x7A, 0x9B, 0x38, 0xF7, 0x90, 0x14, 0x6D, 0xEE, 0xEB, 0x0A, 0x07,
+0xB6, 0xF4, 0xC3, 0x8C, 0xA9, 0x51, 0xA5, 0x4C, 0xF0, 0xDB, 0xD7, 0xD7, 0x1D, 0xBA, 0x10, 0x45,
+0x99, 0x02, 0x52, 0x12, 0xFE, 0x09, 0x74, 0x63, 0xD5, 0xF9, 0xCA, 0x48, 0xD2, 0xA6, 0x23, 0x93,
+0x8D, 0x8D, 0x8E, 0xB3, 0x12, 0x70, 0x7B, 0x12, 0x87, 0x39, 0xAF, 0x57, 0xCB, 0xC4, 0xE1, 0xC8,
+0xDE, 0xCA, 0xA7, 0x4C, 0x3E, 0x40, 0xBC, 0x17, 0x7D, 0xEB, 0x3A, 0xE0, 0x23, 0xC8, 0x28, 0xD8,
+0x1D, 0xEB, 0xBA, 0x25, 0x2A, 0xB6, 0x19, 0x66, 0x47, 0x2A, 0xB4, 0x17, 0x86, 0xD4, 0xA7, 0x8E,
+0x51, 0xA8, 0x63, 0x20, 0x78, 0xFC, 0x41, 0x53, 0x3B, 0x8F, 0x16, 0xA8, 0x74, 0x56, 0xA2, 0xD6,
+0x41, 0x40, 0x89, 0xAC, 0xBE, 0x99, 0x14, 0x3E, 0x23, 0x7C, 0x39, 0xF9, 0x88, 0xCF, 0xF5, 0x89,
+0x7E, 0x7E, 0xF4, 0x39, 0xC9, 0xF4, 0x1C, 0x94, 0xCB, 0x59, 0x90, 0xBA, 0x36, 0xE0, 0xB2, 0xB9,
+0xBF, 0x07, 0xC9, 0x9A, 0x41, 0xDA, 0x9B, 0x94, 0xFA, 0x65, 0xC1, 0x87, 0x27, 0x3B, 0xC1, 0x1F,
+0xFB, 0xE7, 0xC7, 0x66, 0xC2, 0xCB, 0x50, 0xEB, 0x5E, 0x80, 0x6A, 0xF6, 0xD2, 0xC5, 0x09, 0x79,
+0xBC, 0x0C, 0xB2, 0xF7, 0xE6, 0x15, 0x26, 0x78, 0x5E, 0x9A, 0x61, 0x11, 0xDA, 0x51, 0x28, 0xA2,
+0xF4, 0xAF, 0x1B, 0x14, 0x3F, 0xC6, 0xA5, 0xEE, 0x96, 0xDE, 0xE3, 0x2E, 0x1F, 0xC7, 0x87, 0x66,
+0xC2, 0x4B, 0x17, 0x26, 0xA1, 0xF6, 0xE1, 0xB3, 0x88, 0xC7, 0x9B, 0x50, 0xEE, 0x8E, 0x0E, 0xD2,
+0x87, 0xB6, 0xC1, 0x4A, 0x1A, 0xBB, 0x55, 0x29, 0x55, 0x10, 0x58, 0x33, 0x08, 0x50, 0x9D, 0xBB,
+0x78, 0x09, 0x8A, 0xDD, 0x0B, 0xEF, 0xC8, 0x83, 0xCF, 0xD7, 0x84, 0x62, 0xF7, 0xD2, 0xBB, 0xE1,
+0x87, 0xCF, 0xBF, 0x1D, 0xDE, 0x3F, 0x72, 0xBA, 0x28, 0x76, 0x2B, 0x9D, 0xAD, 0x63, 0x34, 0x41,
+0x9E, 0xBE, 0x88, 0x45, 0x8F, 0x89, 0x89, 0xE7, 0x42, 0x07, 0x93, 0xF7, 0x8A, 0x0E, 0xA7, 0x4B,
+0x51, 0x34, 0x2E, 0x89, 0x5B, 0x11, 0x15, 0x34, 0x57, 0x35, 0x9C, 0xE9, 0xB1, 0x98, 0x95, 0x76,
+0xC5, 0x46, 0xE5, 0xB8, 0xE8, 0x4F, 0x24, 0x35, 0x55, 0x6C, 0xB5, 0xEA, 0xA3, 0xE4, 0xDB, 0x2A,
+0xA9, 0x77, 0x5D, 0xA6, 0xFD, 0x99, 0x8A, 0xA4, 0xCA, 0x1D, 0xFF, 0x31, 0x05, 0xC5, 0xCE, 0x6B,
+0xA2, 0x57, 0x91, 0x81, 0xA2, 0x9F, 0x98, 0xF8, 0xEA, 0xD9, 0x79, 0xDF, 0xC6, 0xCC, 0xFF, 0x4A,
+0x2A, 0x3E, 0x6B, 0x1B, 0x55, 0x38, 0x2E, 0xF4, 0x24, 0x76, 0xA3, 0xF4, 0xCF, 0x03, 0xA9, 0x1B,
+0x92, 0xC4, 0xC8, 0x78, 0x40, 0xD1, 0x3B, 0x3B, 0x3C, 0x1A, 0x7E, 0xEF, 0x85, 0x77, 0xC3, 0xFF,
+0xF2, 0xDC, 0x5B, 0xE1, 0x08, 0xD2, 0xBF, 0x90, 0x08, 0xDC, 0x2E, 0x07, 0xD5, 0xAE, 0x43, 0x5B,
+0xD7, 0x85, 0x0D, 0xF0, 0xB9, 0x63, 0x82, 0x5D, 0xAA, 0x5D, 0x34, 0xC9, 0xF6, 0xF7, 0xF5, 0xA4,
+0x08, 0x59, 0x57, 0x9B, 0x4C, 0x7D, 0xD2, 0x14, 0x26, 0x7C, 0x28, 0x8E, 0x06, 0x5A, 0xC4, 0x54,
+0xD4, 0x3D, 0x53, 0xA3, 0x84, 0x8A, 0x4B, 0x11, 0x57, 0x63, 0x55, 0x75, 0x8A, 0x6C, 0xCF, 0x30,
+0xD4, 0x39, 0x60, 0x8A, 0x94, 0xCD, 0x07, 0x57, 0x5B, 0x55, 0x9D, 0x75, 0x7F, 0x35, 0x53, 0xB4,
+0x44, 0x4D, 0x45, 0xAA, 0x16, 0x10, 0x50, 0x9A, 0x61, 0xBB, 0x40, 0x48, 0xEF, 0xDA, 0xD4, 0xDF,
+0xB4, 0xFC, 0x75, 0x4C, 0x93, 0x73, 0xFC, 0xEA, 0x88, 0xF8, 0x65, 0x72, 0xFC, 0x45, 0xB1, 0xB3,
+0x20, 0x9F, 0xEA, 0x76, 0x5F, 0xD6, 0xDE, 0x88, 0x47, 0x6A, 0xBF, 0xAA, 0xD6, 0x69, 0xCE, 0x3A,
+0xF9, 0x4D, 0x69, 0x4F, 0x14, 0xE3, 0x94, 0x78, 0xD8, 0x82, 0x80, 0x78, 0xCE, 0xFE, 0xAB, 0x6C,
+0xAB, 0x06, 0x9C, 0x66, 0xA0, 0xD6, 0xF1, 0xD3, 0xD6, 0x09, 0x9F, 0xC9, 0xBD, 0x5B, 0xD6, 0x21,
+0x68, 0x02, 0xFE, 0x92, 0x82, 0x5D, 0x33, 0xE8, 0xEE, 0xD2, 0xB3, 0x9A, 0x43, 0xCD, 0x50, 0x26,
+0xF9, 0xFC, 0x8B, 0x6F, 0x2A, 0xA2, 0x99, 0xF1, 0x68, 0x28, 0x82, 0x19, 0x97, 0xD0, 0x7D, 0x40,
+0x76, 0x4C, 0x11, 0x7F, 0xC4, 0xC6, 0x3E, 0x41, 0xA3, 0x30, 0xB7, 0xFE, 0xF0, 0xEC, 0x58, 0xF8,
+0xE1, 0x99, 0xF1, 0x30, 0x34, 0x45, 0x1C, 0x18, 0xD4, 0xA2, 0x8F, 0x06, 0xAB, 0x68, 0xEC, 0x46,
+0xA5, 0x54, 0x41, 0x60, 0x0D, 0x21, 0x20, 0x9F, 0x13, 0xD9, 0xA2, 0x11, 0xD1, 0xF4, 0x78, 0xB4,
+0xF0, 0xF9, 0x27, 0xFE, 0x03, 0xC3, 0xEF, 0x0D, 0x58, 0x74, 0xF0, 0xDD, 0xC8, 0x1F, 0xBE, 0xCD,
+0xFC, 0x4E, 0x5C, 0x13, 0x8A, 0xDD, 0x38, 0xA2, 0x04, 0xDF, 0x3B, 0x75, 0x41, 0x54, 0xAB, 0x76,
+0x9A, 0x24, 0x63, 0x9A, 0x93, 0x4C, 0x65, 0xF0, 0x0F, 0x81, 0x11, 0xAD, 0xEA, 0x9C, 0xC9, 0x7E,
+0xBD, 0x47, 0x45, 0x28, 0x57, 0x34, 0x8C, 0x9C, 0x45, 0x25, 0xCF, 0xBF, 0xA4, 0x55, 0xE1, 0xC8,
+0x15, 0x3E, 0xA5, 0x92, 0x56, 0xBE, 0x46, 0xED, 0x88, 0xB2, 0x92, 0xCB, 0x44, 0xF6, 0xBE, 0xEE,
+0x94, 0xE0, 0x02, 0x8A, 0xDE, 0x37, 0x2A, 0x2F, 0xE4, 0x18, 0xD6, 0x76, 0xAF, 0x97, 0xA5, 0x69,
+0x9A, 0xD3, 0xAD, 0xA3, 0x54, 0xCD, 0x63, 0x4E, 0x33, 0x3E, 0xA8, 0xE4, 0x0D, 0xC2, 0x2C, 0xFD,
+0xCE, 0xD9, 0xCB, 0xE1, 0xF9, 0xC3, 0xA7, 0xC2, 0x0B, 0x1F, 0x9E, 0x0A, 0x17, 0xAE, 0x0F, 0x4B,
+0xB0, 0xC6, 0xED, 0x70, 0x70, 0xA1, 0xDC, 0x0E, 0xA5, 0x6B, 0x1F, 0xCC, 0xB1, 0x8C, 0x96, 0x25,
+0x49, 0xE1, 0x07, 0x9A, 0xBE, 0x76, 0x6D, 0x64, 0x7A, 0x2E, 0xA3, 0x09, 0x20, 0xAE, 0x0C, 0xE9,
+0x53, 0x15, 0x99, 0x6C, 0x5C, 0x7C, 0x9C, 0x88, 0x55, 0x86, 0x73, 0x55, 0x87, 0x31, 0x4A, 0x1F,
+0xC1, 0x4D, 0xEF, 0xD6, 0x2A, 0x58, 0x82, 0x8D, 0x8D, 0x8B, 0x16, 0xD7, 0x08, 0x50, 0xE2, 0xCC,
+0x36, 0xD2, 0x34, 0x47, 0xE3, 0x5D, 0x07, 0x88, 0x0B, 0xBF, 0x71, 0x68, 0x8A, 0xDD, 0x81, 0xAD,
+0xD2, 0x68, 0x52, 0x6E, 0xC6, 0x41, 0xFF, 0xCB, 0x93, 0xD7, 0xE0, 0x37, 0xC9, 0x74, 0x26, 0x50,
+0x7E, 0xE8, 0x4B, 0x2A, 0xE4, 0xD3, 0xDB, 0xED, 0x78, 0xA5, 0x89, 0x94, 0x9A, 0x95, 0xF1, 0xDA,
+0xA8, 0x66, 0x46, 0xB9, 0xD2, 0xE7, 0x6A, 0x9C, 0x8C, 0x35, 0x2A, 0x66, 0xFA, 0x1C, 0x68, 0x85,
+0x69, 0xAE, 0xCE, 0x63, 0xBC, 0xB8, 0xAB, 0x0B, 0xC5, 0x2F, 0x92, 0xF3, 0x43, 0xDB, 0x36, 0x62,
+0x07, 0x8E, 0xE6, 0x04, 0x92, 0x2C, 0x87, 0x39, 0x7F, 0x08, 0xAD, 0xEB, 0x6C, 0x0D, 0xFB, 0xD7,
+0xB5, 0xE3, 0xD1, 0x11, 0xB6, 0xF5, 0xB4, 0x85, 0x75, 0xF8, 0x51, 0x41, 0x52, 0xDE, 0xD0, 0x88,
+0xA1, 0x4F, 0xF4, 0x95, 0xF3, 0x08, 0xF5, 0xE5, 0xEE, 0xC7, 0xF7, 0x59, 0xFE, 0x92, 0xF8, 0xD6,
+0x4D, 0x89, 0x7F, 0x1E, 0x15, 0xE9, 0x07, 0x36, 0x74, 0x85, 0xCF, 0xEE, 0xE8, 0x09, 0x8F, 0x6D,
+0xE9, 0x0A, 0xFD, 0x1D, 0x0D, 0xDD, 0xB9, 0x91, 0x5B, 0x95, 0x32, 0x05, 0x81, 0xB5, 0x87, 0x80,
+0xFC, 0x80, 0x22, 0xA1, 0x6B, 0x2E, 0x09, 0x5A, 0x55, 0x20, 0xD1, 0x17, 0xA4, 0x0B, 0x10, 0xA2,
+0xDA, 0xCC, 0xA3, 0xB9, 0x77, 0xBB, 0xC9, 0x3D, 0x73, 0x65, 0x80, 0xA9, 0x4E, 0x3E, 0x00, 0xB1,
+0x9B, 0x81, 0x5A, 0x45, 0x52, 0xC7, 0x40, 0x02, 0xF1, 0xB9, 0xC2, 0xE1, 0x3F, 0xB6, 0x95, 0x07,
+0xE8, 0x0A, 0x27, 0xEA, 0x1A, 0xD7, 0x2B, 0x2A, 0x64, 0x5A, 0x2A, 0x31, 0x87, 0xE8, 0x4B, 0xA7,
+0x8A, 0x9C, 0x94, 0xB7, 0xA7, 0x52, 0xD6, 0x58, 0x84, 0x5C, 0x6F, 0xB5, 0xE9, 0xF5, 0x6A, 0x9A,
+0x12, 0xC5, 0x4D, 0x94, 0x11, 0xBD, 0xC8, 0xFD, 0xC6, 0xB4, 0x74, 0x4E, 0xCD, 0x5C, 0x9D, 0x53,
+0x75, 0xC3, 0x44, 0x26, 0x55, 0x17, 0x54, 0x4A, 0x49, 0x8A, 0x9E, 0xD4, 0xC8, 0x73, 0x7A, 0x3D,
+0xEB, 0xE6, 0x16, 0x52, 0x92, 0xD6, 0xC2, 0x08, 0x0E, 0x6B, 0xA0, 0xCF, 0x1A, 0xA3, 0x18, 0x67,
+0xB1, 0xD5, 0x18, 0xAB, 0x39, 0x3F, 0x38, 0x1C, 0xBE, 0xF1, 0xD2, 0x7B, 0x12, 0x50, 0xC1, 0x40,
+0x8A, 0xDB, 0xE5, 0x60, 0x7A, 0x90, 0x87, 0x76, 0x6E, 0x08, 0xBD, 0x20, 0x01, 0x54, 0xA2, 0x68,
+0xF6, 0xEA, 0x45, 0xD2, 0x62, 0xFE, 0xAA, 0x51, 0x47, 0x2F, 0x7F, 0x98, 0x0A, 0xEA, 0x3E, 0x72,
+0x32, 0x4C, 0xA6, 0x28, 0x71, 0xEC, 0xAC, 0xAC, 0x6F, 0x19, 0x26, 0x97, 0xD9, 0x98, 0x69, 0xB9,
+0x84, 0x95, 0x47, 0x2C, 0x0B, 0x6E, 0x22, 0xC0, 0x10, 0x3F, 0x53, 0xE5, 0x0C, 0x3B, 0x75, 0xC9,
+0xD4, 0x7A, 0x85, 0xD0, 0x91, 0x3C, 0x9B, 0x29, 0x7C, 0x82, 0x7F, 0x61, 0xDE, 0x6F, 0x45, 0x1B,
+0xF9, 0xB7, 0x05, 0xF9, 0xF8, 0x36, 0x20, 0x18, 0x84, 0xBB, 0x69, 0x34, 0xE3, 0x20, 0x99, 0x3B,
+0x3B, 0x34, 0x21, 0xC4, 0x8E, 0x41, 0x32, 0xB2, 0x47, 0xAC, 0xF5, 0x23, 0xE1, 0xA5, 0xB8, 0xC5,
+0xED, 0xBF, 0xB2, 0xB9, 0x14, 0x7D, 0x4B, 0x65, 0x86, 0xE9, 0xDC, 0xAA, 0xDD, 0x1E, 0xCC, 0x95,
+0xCF, 0x58, 0x87, 0x29, 0x9A, 0xAA, 0x7E, 0x9A, 0xEF, 0x9D, 0xE0, 0x6A, 0x3D, 0xE6, 0x9E, 0xBF,
+0x46, 0xEC, 0xFA, 0xBB, 0x3B, 0x11, 0x38, 0xB1, 0xE9, 0xB6, 0xF0, 0xAF, 0x63, 0xEB, 0xF8, 0x03,
+0x62, 0xFF, 0x40, 0x47, 0xF8, 0xF2, 0xAE, 0xDE, 0xF0, 0xE5, 0xDD, 0xBD, 0xE1, 0xC1, 0x8D, 0x5D,
+0x61, 0x47, 0x2F, 0x88, 0x9D, 0x0D, 0xD7, 0x72, 0xA3, 0xC6, 0x2E, 0x4A, 0xD4, 0x3A, 0x58, 0x2B,
+0xCD, 0xB6, 0x8D, 0x78, 0x33, 0xB0, 0xFC, 0x09, 0x10, 0xBA, 0xE3, 0x78, 0x70, 0x4E, 0x6E, 0xEE,
+0x6E, 0x0B, 0xBF, 0x7C, 0xB0, 0x3F, 0xFC, 0xA7, 0x8F, 0x6F, 0x0C, 0x7F, 0xFF, 0xBE, 0x01, 0xDC,
+0xBF, 0x5D, 0xE6, 0x5E, 0x39, 0x0A, 0x02, 0x05, 0x81, 0xC5, 0x10, 0xB0, 0xF5, 0x6F, 0xAD, 0x00,
+0x94, 0x5B, 0x02, 0x9B, 0xD8, 0xA7, 0x4F, 0x34, 0xB1, 0x23, 0x4E, 0x34, 0x33, 0x5E, 0x1E, 0x1C,
+0x41, 0x1E, 0xB7, 0x41, 0x6C, 0xB5, 0x35, 0x13, 0xDA, 0x91, 0xB8, 0xB7, 0x95, 0x0B, 0x6F, 0xD4,
+0xB9, 0x0C, 0xCD, 0x8C, 0xD8, 0xE5, 0xF8, 0x3A, 0xDD, 0x4A, 0xBA, 0x58, 0xE4, 0x73, 0x4A, 0xB0,
+0xBC, 0x1E, 0x5F, 0xCC, 0xFC, 0x62, 0xAE, 0xA1, 0xF6, 0x5C, 0x49, 0x19, 0x17, 0xCB, 0xAA, 0xB2,
+0x17, 0x95, 0xBC, 0x78, 0xEF, 0xEC, 0x62, 0xA9, 0x59, 0xD9, 0x61, 0xFC, 0xAE, 0x8F, 0x64, 0xD1,
+0xEE, 0x5B, 0xF9, 0x93, 0x94, 0x12, 0x57, 0xA8, 0x6A, 0xD7, 0x08, 0x12, 0x15, 0x06, 0x50, 0x90,
+0xDC, 0xB5, 0xA1, 0xD0, 0x18, 0x4C, 0xB3, 0xEF, 0x9C, 0xBE, 0x10, 0x5E, 0xF8, 0xE0, 0xA3, 0x70,
+0xE6, 0x32, 0x02, 0x4B, 0x6E, 0x13, 0x93, 0x2C, 0x55, 0xAE, 0x5D, 0xF0, 0xC5, 0xDA, 0xBE, 0xAE,
+0x37, 0x0C, 0x40, 0xE9, 0x21, 0x51, 0xE0, 0x16, 0x63, 0x5D, 0xDC, 0x86, 0xCA, 0xCC, 0xA0, 0x8E,
+0x7B, 0x66, 0x48, 0x4F, 0x03, 0xE9, 0x63, 0xB1, 0x00, 0x57, 0x16, 0x51, 0x32, 0x1D, 0xD5, 0xB6,
+0x9C, 0xA4, 0x09, 0x51, 0x53, 0xBF, 0x45, 0x62, 0xC1, 0x07, 0x4D, 0xDA, 0x74, 0x76, 0xD7, 0x87,
+0xFA, 0x2C, 0x8A, 0xEF, 0x62, 0x96, 0xF4, 0xD7, 0x5F, 0xCB, 0xAE, 0xAC, 0x68, 0x3B, 0x7F, 0x10,
+0xAC, 0x03, 0x91, 0x61, 0x54, 0xAC, 0xEE, 0x17, 0xBC, 0xBA, 0x07, 0xDB, 0x7C, 0x79, 0x14, 0x66,
+0x76, 0xA4, 0xF4, 0x99, 0x01, 0x79, 0xE0, 0x0F, 0x19, 0xF1, 0x9B, 0xCC, 0xA6, 0x67, 0x6A, 0x81,
+0xBB, 0x20, 0x28, 0x16, 0xD9, 0x4F, 0x97, 0xA8, 0x80, 0x7A, 0x59, 0xF5, 0x69, 0x74, 0xCC, 0xD2,
+0xDB, 0xFE, 0xD5, 0x2A, 0xD5, 0xC7, 0x79, 0xAF, 0x65, 0x5D, 0x9F, 0xE6, 0xE9, 0xD9, 0x36, 0x10,
+0x3B, 0x98, 0x62, 0x3B, 0xF0, 0x77, 0x03, 0xFC, 0x24, 0xF7, 0x6D, 0x1E, 0x68, 0x9A, 0x69, 0x7A,
+0x39, 0xC4, 0x49, 0xE0, 0x76, 0xF6, 0xB5, 0x87, 0xA7, 0xB6, 0x75, 0x87, 0xA7, 0xB6, 0x22, 0x69,
+0xF2, 0x86, 0x8E, 0xB0, 0x15, 0xC4, 0xAE, 0xD1, 0x1F, 0xCE, 0x24, 0x86, 0x7B, 0xFB, 0xDB, 0xC3,
+0x13, 0x50, 0xDA, 0x1E, 0xDC, 0xD4, 0x19, 0xBA, 0x1B, 0x20, 0xF0, 0x4C, 0x67, 0x72, 0x0C, 0xBE,
+0x74, 0x57, 0xE1, 0x97, 0xC7, 0x94, 0x3E, 0x8F, 0x6E, 0xEE, 0x0C, 0xCF, 0x6C, 0xEF, 0x09, 0x9F,
+0xDF, 0xD9, 0x13, 0x1E, 0x45, 0x3D, 0x7D, 0x1D, 0xAB, 0x3F, 0x57, 0x96, 0xC3, 0xA5, 0xBC, 0x5F,
+0x10, 0xB8, 0xBD, 0x11, 0x50, 0xF1, 0x62, 0xED, 0x1D, 0xB5, 0x04, 0x62, 0x75, 0x7B, 0xF8, 0x89,
+0x27, 0x76, 0x34, 0xBF, 0x7E, 0x74, 0x41, 0xF7, 0x87, 0x65, 0xC0, 0x84, 0x98, 0x61, 0x6D, 0x6A,
+0xE4, 0x4B, 0x5C, 0x54, 0xCC, 0x6C, 0xD5, 0x52, 0x41, 0x4D, 0xFD, 0x8D, 0xD4, 0xC6, 0x97, 0xA8,
+0xA0, 0x46, 0xB2, 0x1A, 0xE5, 0xB3, 0x2D, 0xBE, 0x54, 0xE2, 0xAB, 0xB2, 0xBA, 0x5C, 0xF5, 0x50,
+0xA5, 0x4E, 0xA7, 0xA4, 0xA8, 0x85, 0xA6, 0x72, 0xA4, 0x45, 0x54, 0xDF, 0x74, 0x3F, 0x31, 0xCD,
+0xBD, 0x96, 0x96, 0x50, 0xF5, 0xC3, 0x73, 0xFF, 0x27, 0x16, 0xB4, 0x3A, 0x72, 0x73, 0x64, 0x9C,
+0x0B, 0x5C, 0x5E, 0xA5, 0x32, 0x51, 0xF1, 0xA2, 0x6F, 0x18, 0xCE, 0xD1, 0xFC, 0xD3, 0x49, 0xDF,
+0x20, 0x60, 0xC1, 0xEC, 0x70, 0xF4, 0x3B, 0xFC, 0xEE, 0x6B, 0x1F, 0x86, 0xD7, 0xE1, 0xBC, 0x39,
+0x41, 0x8C, 0x6E, 0x83, 0x83, 0x5C, 0xA8, 0x07, 0xC1, 0x13, 0xF7, 0x20, 0xF5, 0xC9, 0x81, 0xCD,
+0xFD, 0xD2, 0x22, 0x1A, 0x8A, 0xFB, 0x7A, 0x7B, 0x25, 0xBA, 0xD2, 0xC9, 0xB6, 0x12, 0x66, 0x55,
+0x8A, 0x9C, 0x38, 0x0B, 0x0D, 0x31, 0x1C, 0x45, 0x9D, 0x73, 0xDF, 0xBB, 0x8C, 0xC0, 0x09, 0xA9,
+0xA3, 0xE9, 0x34, 0x06, 0x9E, 0x98, 0xB9, 0x1A, 0x84, 0x6D, 0x0C, 0x0A, 0xE1, 0xA8, 0x3C, 0xB0,
+0xF5, 0x96, 0x3D, 0x98, 0x43, 0xF0, 0x9A, 0x3C, 0xA6, 0x24, 0xFA, 0xF8, 0x3A, 0x1E, 0x8C, 0x3C,
+0x1E, 0xC4, 0xFB, 0x43, 0x28, 0xCB, 0x64, 0xC0, 0x24, 0x77, 0x94, 0xD4, 0x99, 0x93, 0x97, 0xE4,
+0x60, 0xD7, 0x86, 0x5E, 0x09, 0xA4, 0x68, 0xC6, 0x31, 0x49, 0xFF, 0xBA, 0xCB, 0x23, 0x30, 0xB5,
+0x73, 0xEB, 0x2E, 0xA4, 0xC4, 0x41, 0x6A, 0x1F, 0x8F, 0xF6, 0x75, 0x75, 0x4E, 0x39, 0x9E, 0x79,
+0x79, 0x66, 0xF3, 0xBA, 0x12, 0x35, 0x6B, 0x7E, 0x9E, 0x95, 0xED, 0xC1, 0x4C, 0xD9, 0x14, 0x1F,
+0x50, 0x51, 0x98, 0x75, 0x5E, 0xC5, 0xCF, 0x85, 0xA8, 0xDA, 0x99, 0x2F, 0x62, 0xE6, 0xEB, 0x38,
+0xDB, 0x0A, 0x7F, 0x18, 0x10, 0xBB, 0x75, 0x3D, 0x5D, 0x61, 0x0B, 0x02, 0x27, 0x36, 0xF5, 0x77,
+0x8B, 0xFF, 0x5A, 0x33, 0x7D, 0x49, 0x16, 0xC3, 0x9F, 0x9F, 0x03, 0x2A, 0x66, 0x0F, 0x6C, 0xEC,
+0x0C, 0xF7, 0xE2, 0xB1, 0x07, 0x24, 0x6D, 0x53, 0x37, 0xCC, 0xB0, 0xA2, 0x72, 0x2E, 0x7F, 0x90,
+0x84, 0xFD, 0xD4, 0x9E, 0x9E, 0xF0, 0x4F, 0x1E, 0x59, 0x1F, 0x7E, 0xF3, 0xDE, 0xF5, 0x61, 0x63,
+0xD7, 0xF2, 0x5F, 0x95, 0x4C, 0x89, 0xC2, 0x20, 0x09, 0x72, 0xEE, 0x8D, 0xB8, 0xF7, 0xCF, 0xED,
+0xEF, 0x0B, 0x77, 0xC1, 0x0C, 0xDC, 0xD9, 0x00, 0x29, 0x5C, 0xBE, 0x45, 0xA5, 0x44, 0x41, 0xE0,
+0x4E, 0x40, 0xA0, 0xB9, 0x04, 0x68, 0xD5, 0x11, 0xB5, 0x35, 0x5A, 0xAD, 0x2B, 0xCD, 0x3B, 0x96,
+0xFF, 0xB6, 0x6A, 0x5E, 0x5B, 0x6E, 0xE8, 0x4E, 0x24, 0x2B, 0x47, 0xCE, 0xC0, 0xD4, 0x88, 0x45,
+0xB9, 0x15, 0x26, 0xC8, 0xD6, 0x39, 0xDF, 0x46, 0xAC, 0x76, 0x82, 0x64, 0xAF, 0xA3, 0xE2, 0xA3,
+0x4F, 0x2A, 0xAA, 0x46, 0x46, 0x9E, 0xE4, 0xA9, 0xA9, 0x14, 0xFE, 0xBC, 0xD2, 0x48, 0x57, 0x8C,
+0x72, 0xC2, 0x27, 0x64, 0xC4, 0x2E, 0x94, 0xBA, 0xAB, 0x87, 0xE7, 0x95, 0x8B, 0x7F, 0x6B, 0x65,
+0x17, 0x97, 0x48, 0xAC, 0x0E, 0x35, 0x9B, 0x69, 0x1D, 0x2E, 0xD0, 0x24, 0x25, 0xD0, 0x7D, 0xC8,
+0x92, 0x74, 0xC3, 0xFB, 0xB5, 0x83, 0x1C, 0xD1, 0xE1, 0x9B, 0x3E, 0x6B, 0x24, 0x02, 0x1F, 0x9E,
+0xB9, 0x18, 0x5E, 0x78, 0xFF, 0x44, 0x38, 0x89, 0x48, 0x23, 0x26, 0x3B, 0xBE, 0x1D, 0x8E, 0x6E,
+0xF8, 0x3B, 0xED, 0xDF, 0xDC, 0x07, 0x5F, 0xBB, 0x5E, 0x01, 0x89, 0x9B, 0xD8, 0x43, 0xB6, 0x0B,
+0xA4, 0x9E, 0xCC, 0xE5, 0xE7, 0xF9, 0xFC, 0x34, 0x7F, 0x9F, 0x6E, 0x74, 0x2F, 0xE9, 0x5D, 0x32,
+0x65, 0x4D, 0xA2, 0x84, 0x45, 0x61, 0xB3, 0xF7, 0x25, 0x5A, 0xD8, 0xCB, 0xA5, 0xBC, 0x7F, 0x7E,
+0x6E, 0xF1, 0xBF, 0xF4, 0x4F, 0x4C, 0xE5, 0xF9, 0x5C, 0x7D, 0x17, 0xA1, 0xE8, 0xE1, 0xEF, 0x34,
+0x4C, 0xFB, 0x34, 0xCB, 0xB6, 0xA3, 0xCD, 0xFC, 0x4B, 0x42, 0xBE, 0x67, 0x3D, 0x89, 0x5D, 0x73,
+0x3E, 0x3E, 0x6C, 0xF7, 0xB1, 0x2B, 0xA3, 0xB2, 0x35, 0x1D, 0xD5, 0xBB, 0x09, 0xFC, 0x98, 0x51,
+0x0A, 0xE6, 0xF3, 0xD7, 0x8D, 0xFC, 0x36, 0xDF, 0xA2, 0xCC, 0x96, 0x26, 0x8E, 0x52, 0x3E, 0x9B,
+0x27, 0x49, 0x86, 0x33, 0xD2, 0x96, 0x94, 0x66, 0x57, 0x9F, 0xD3, 0x1C, 0xD1, 0x3A, 0x62, 0x3E,
+0x44, 0xFD, 0xFD, 0x81, 0x68, 0x58, 0x98, 0xA4, 0xA1, 0xD4, 0xB5, 0xC2, 0x1C, 0xBB, 0x77, 0x63,
+0x3F, 0x08, 0xFA, 0x80, 0x24, 0xA1, 0x6E, 0x82, 0x80, 0xD9, 0xD0, 0xF4, 0x65, 0x3B, 0x7A, 0xA1,
+0x9A, 0x6D, 0x81, 0x6F, 0x1D, 0x09, 0xDE, 0x00, 0xFC, 0xED, 0xBA, 0xA1, 0xB6, 0xFA, 0x4F, 0xA9,
+0xE5, 0x2A, 0xE9, 0x04, 0x03, 0x3C, 0x00, 0x52, 0xF6, 0x19, 0xF3, 0x8F, 0xEB, 0x6E, 0x60, 0xAC,
+0x99, 0xFB, 0xEE, 0xE2, 0x38, 0x7F, 0x58, 0xCE, 0x8B, 0x4F, 0x1F, 0x09, 0xE5, 0x06, 0x10, 0xC2,
+0xC2, 0xEB, 0x96, 0x43, 0xBB, 0xBC, 0x5F, 0x10, 0xB8, 0x03, 0x10, 0x68, 0x22, 0xB3, 0x6B, 0xCE,
+0xCA, 0xB4, 0x4A, 0x63, 0x46, 0x65, 0x60, 0x0C, 0xEA, 0xCA, 0xBB, 0x27, 0xCE, 0x21, 0xE7, 0x0D,
+0x9C, 0x95, 0xA1, 0xFB, 0xD0, 0x0C, 0x2B, 0x06, 0x23, 0x15, 0xBC, 0x32, 0x3A, 0x54, 0x45, 0xD5,
+0xB4, 0x0D, 0x8B, 0xC4, 0x34, 0x7F, 0x23, 0x61, 0x71, 0xEA, 0xA3, 0xA4, 0x4A, 0x90, 0xB2, 0xB4,
+0xA4, 0xAC, 0xB9, 0x29, 0x2A, 0x11, 0x29, 0xF7, 0x89, 0x93, 0x33, 0x72, 0x4F, 0xF7, 0x5D, 0x4A,
+0x4A, 0x53, 0x52, 0xFF, 0x54, 0x61, 0x73, 0xA5, 0x4D, 0x44, 0x3A, 0x51, 0xDC, 0xEC, 0x5E, 0x6C,
+0xAE, 0x29, 0x70, 0x1A, 0xB1, 0x19, 0x35, 0x40, 0x69, 0x83, 0x47, 0x26, 0x7A, 0x84, 0x6D, 0x8C,
+0x66, 0x14, 0x55, 0xC5, 0xEA, 0x45, 0x9D, 0x12, 0xCD, 0x87, 0x45, 0xB7, 0x03, 0x8B, 0x2F, 0x4D,
+0xB3, 0x53, 0x20, 0x40, 0x3F, 0x7C, 0xFB, 0x48, 0x78, 0x19, 0x49, 0x12, 0x19, 0x68, 0x72, 0x3B,
+0x1C, 0x34, 0xC7, 0xEE, 0xDE, 0xD8, 0x2B, 0xCA, 0x17, 0xFD, 0xB4, 0x98, 0xE3, 0x6B, 0x14, 0xFD,
+0x1D, 0x45, 0xFB, 0x19, 0xD9, 0xAB, 0x79, 0xFB, 0x26, 0xED, 0xAF, 0xE6, 0xF1, 0xBB, 0x8E, 0x31,
+0x1E, 0xA4, 0x9A, 0x66, 0x0F, 0x57, 0xD7, 0xA8, 0xB0, 0xF1, 0x39, 0xCF, 0x53, 0x7D, 0x93, 0x87,
+0xEC, 0xE8, 0x31, 0x1D, 0xC6, 0xF1, 0xD7, 0xF7, 0xE9, 0x55, 0x62, 0xA8, 0xFB, 0xF3, 0xFA, 0x83,
+0x21, 0xF5, 0x9A, 0x33, 0x2F, 0xF9, 0x9D, 0x51, 0x87, 0xA3, 0x7A, 0xD5, 0x46, 0x2C, 0xF9, 0x1C,
+0x0F, 0x2A, 0x3D, 0x3D, 0x30, 0x1B, 0xCF, 0x42, 0xB2, 0xE3, 0xBC, 0xD8, 0x8B, 0xB6, 0x77, 0x35,
+0x49, 0xB1, 0x23, 0xC9, 0x3D, 0x76, 0x45, 0x15, 0x3B, 0x12, 0xF3, 0x19, 0x8C, 0xA7, 0xED, 0xCE,
+0x1A, 0xD5, 0xB5, 0xA4, 0xC2, 0x99, 0xBA, 0x66, 0xFD, 0xF1, 0xBC, 0x80, 0xF2, 0x97, 0x73, 0xDB,
+0xE6, 0xA9, 0xE7, 0xEF, 0x8B, 0xFE, 0x79, 0xA6, 0x5C, 0xC7, 0xFC, 0x8F, 0x11, 0x13, 0xAD, 0x2F,
+0xFA, 0x31, 0xAA, 0xBF, 0x41, 0x98, 0x25, 0x09, 0xE7, 0x0F, 0x08, 0xF8, 0x49, 0x3E, 0xB2, 0x67,
+0x53, 0x78, 0x0C, 0x8F, 0x9E, 0xDB, 0x24, 0x70, 0xA2, 0x76, 0x7E, 0xB3, 0xCF, 0x54, 0xD1, 0x56,
+0x1A, 0x3E, 0xC4, 0x3E, 0xF3, 0xB3, 0x44, 0xF5, 0xAF, 0x91, 0xEF, 0x64, 0x2A, 0xC5, 0x63, 0xD8,
+0x86, 0x8C, 0x09, 0x70, 0xF6, 0x20, 0xC7, 0x61, 0x57, 0x71, 0xA8, 0xBB, 0x1D, 0xBE, 0x6A, 0x4A,
+0x1B, 0x0A, 0x02, 0xB7, 0x10, 0x01, 0x5B, 0x97, 0x9B, 0xDC, 0x82, 0x4F, 0x34, 0xB1, 0xE3, 0x82,
+0x33, 0x32, 0x36, 0x1E, 0x4E, 0x5D, 0xB8, 0x1C, 0x66, 0x49, 0xEC, 0xB0, 0xE8, 0x29, 0xB1, 0x8B,
+0xAE, 0x43, 0xFE, 0xAC, 0xCE, 0x17, 0x73, 0x94, 0xD9, 0x0C, 0xF2, 0x4C, 0x16, 0x33, 0x95, 0xAC,
+0x56, 0x79, 0x73, 0xD5, 0x63, 0xE1, 0x97, 0x7C, 0x66, 0xF4, 0xCD, 0xD4, 0xBA, 0x18, 0x05, 0x1B,
+0x6D, 0xB8, 0x56, 0xAE, 0xA2, 0xCA, 0x29, 0x01, 0xAD, 0xD4, 0x99, 0x99, 0x5F, 0x85, 0xEB, 0x65,
+0xD7, 0x47, 0xD5, 0x2E, 0xD6, 0x61, 0x8A, 0x0A, 0x7B, 0x2A, 0x8B, 0xB3, 0x92, 0xC5, 0x36, 0xE6,
+0x16, 0x83, 0x62, 0xE7, 0xAA, 0xDD, 0xB1, 0xF3, 0x57, 0xC2, 0x8B, 0xEF, 0x1F, 0x0F, 0xC7, 0xCE,
+0x5D, 0x96, 0x5D, 0x0B, 0x6E, 0xF5, 0x41, 0x93, 0xDD, 0x00, 0xB6, 0xE6, 0xDA, 0x36, 0xD0, 0x13,
+0xB6, 0xE3, 0x41, 0x35, 0x6A, 0x82, 0x79, 0xD1, 0x40, 0x48, 0xA9, 0x94, 0x8D, 0x4B, 0x84, 0xAF,
+0xF9, 0xBA, 0x65, 0x3B, 0x6F, 0x90, 0xDC, 0x44, 0x55, 0xCE, 0xD5, 0x39, 0x12, 0x36, 0x46, 0x8A,
+0x66, 0xFE, 0x72, 0xF4, 0x9D, 0x23, 0x79, 0x53, 0xC5, 0x4D, 0x77, 0xE9, 0xE0, 0x43, 0xF6, 0xDF,
+0xA5, 0x99, 0x16, 0x58, 0x71, 0x21, 0x96, 0xAD, 0xC6, 0x9C, 0xD4, 0x00, 0x3C, 0x09, 0xA8, 0x50,
+0x3E, 0x9F, 0x1E, 0x78, 0x4D, 0x1C, 0xB9, 0x47, 0xAC, 0x04, 0x7A, 0x40, 0xB9, 0xDB, 0xD4, 0x83,
+0xC0, 0x89, 0x26, 0x2C, 0xDC, 0x6C, 0xEB, 0x20, 0x7C, 0xEB, 0xCE, 0x8D, 0x4C, 0x88, 0x3F, 0xE0,
+0x34, 0x88, 0xEA, 0x2C, 0x14, 0x44, 0x65, 0x68, 0x66, 0x32, 0xAD, 0x33, 0x98, 0x42, 0x46, 0xE3,
+0xDC, 0xD1, 0x79, 0xE1, 0xBE, 0x04, 0xF9, 0x14, 0x8D, 0x97, 0xDA, 0xDC, 0x49, 0xA5, 0xAC, 0xB8,
+0x91, 0x41, 0xFD, 0x50, 0xD9, 0xEC, 0xE3, 0x8F, 0x93, 0x8E, 0x4E, 0x00, 0xD4, 0x26, 0xE9, 0x4D,
+0xEE, 0xDF, 0xB1, 0x01, 0x8F, 0xF5, 0x62, 0x5E, 0xBF, 0x2D, 0x8F, 0xBC, 0xFB, 0xB5, 0x1F, 0xFB,
+0x25, 0x1A, 0xEC, 0x84, 0xBE, 0x51, 0x15, 0x92, 0x73, 0x83, 0xE6, 0x58, 0x4E, 0x8B, 0x2D, 0x50,
+0xEA, 0x1A, 0x10, 0xF9, 0x6E, 0x4B, 0xB8, 0x4A, 0xA3, 0x0A, 0x02, 0xB7, 0x02, 0x01, 0xA6, 0x23,
+0xD2, 0x5F, 0xD1, 0x74, 0x77, 0x69, 0xE4, 0xA7, 0xD4, 0xAD, 0x68, 0xE5, 0x27, 0xE3, 0x9E, 0x9F,
+0x48, 0x62, 0xE7, 0x91, 0x91, 0x54, 0x5B, 0xAE, 0x23, 0x01, 0xEF, 0x35, 0x44, 0x7F, 0xB6, 0x80,
+0x08, 0xB4, 0xB9, 0x19, 0x56, 0x7E, 0x61, 0x9B, 0x64, 0x27, 0x0E, 0x59, 0x2E, 0x94, 0xF1, 0x1B,
+0x3E, 0x3B, 0x2F, 0x76, 0x19, 0x0F, 0x4A, 0x30, 0xFA, 0x64, 0xD1, 0xA8, 0xFC, 0x32, 0xF7, 0x1D,
+0x0D, 0x5C, 0xE9, 0x90, 0x73, 0x71, 0x31, 0x55, 0x36, 0xA6, 0x91, 0x98, 0x49, 0x9D, 0x13, 0xE1,
+0x2C, 0xF7, 0x7F, 0x53, 0x9A, 0x10, 0x55, 0x3A, 0xD1, 0xDD, 0x44, 0xB5, 0x63, 0x53, 0xF8, 0x0F,
+0xD5, 0x10, 0x35, 0x93, 0xB9, 0xB9, 0xAB, 0xBA, 0x17, 0xA7, 0x2A, 0x49, 0x1E, 0xE5, 0xC9, 0xB5,
+0x15, 0x1A, 0x93, 0x74, 0xC8, 0xD5, 0x15, 0x5D, 0xE3, 0xAD, 0x5E, 0xAB, 0x53, 0xDA, 0x46, 0x62,
+0x07, 0x32, 0xC2, 0xCF, 0x08, 0x55, 0xBB, 0x1F, 0xBF, 0x7D, 0x34, 0xFC, 0xE8, 0xAD, 0xA3, 0x61,
+0x04, 0xE9, 0x50, 0x6E, 0x97, 0x63, 0x43, 0x6F, 0x47, 0x78, 0x78, 0xD7, 0x7A, 0xD9, 0x71, 0x83,
+0x66, 0xC6, 0x2E, 0x44, 0xC7, 0xE6, 0x0B, 0xA9, 0x05, 0x37, 0xAB, 0x1B, 0xA4, 0x61, 0xE6, 0xF9,
+0x04, 0x65, 0x94, 0x25, 0xCA, 0x55, 0xF5, 0x4C, 0xF9, 0x9B, 0x29, 0x4D, 0xAE, 0x9E, 0x0A, 0x5C,
+0x4E, 0x84, 0xC4, 0x97, 0x4C, 0xC7, 0x56, 0xEE, 0x23, 0x0A, 0xA9, 0x0D, 0x4F, 0x7E, 0xAD, 0x5D,
+0xE4, 0xBE, 0x90, 0x6D, 0x34, 0x3B, 0xCA, 0xD6, 0x59, 0x21, 0x6C, 0xC6, 0x96, 0x68, 0xCD, 0x4A,
+0x73, 0x42, 0xB3, 0xF0, 0x25, 0x90, 0xBA, 0x41, 0x6C, 0x27, 0x46, 0x53, 0x1F, 0x7D, 0x49, 0x53,
+0xFE, 0x3A, 0x57, 0x1A, 0x6B, 0xFE, 0x52, 0x69, 0xAA, 0x28, 0x6E, 0x36, 0x3F, 0x6C, 0x1E, 0x45,
+0xFF, 0x3C, 0x57, 0x29, 0x09, 0x80, 0x82, 0x62, 0xF3, 0xCC, 0xB4, 0x61, 0xAA, 0xC6, 0x3E, 0xCF,
+0xAC, 0x8C, 0xF3, 0xA2, 0x96, 0xF6, 0x4E, 0xF1, 0xA7, 0xEB, 0x46, 0x84, 0xF3, 0x41, 0xF8, 0x4A,
+0x1E, 0xDA, 0xA2, 0x81, 0x13, 0xB7, 0x83, 0x7F, 0x5D, 0xBD, 0xB9, 0xDD, 0x8C, 0x65, 0x82, 0xD8,
+0x30, 0x05, 0x11, 0x31, 0xE8, 0x43, 0x6A, 0x13, 0x2A, 0x7D, 0xE5, 0xB8, 0xBD, 0x11, 0x88, 0x51,
+0xF6, 0xB7, 0x77, 0x33, 0xD7, 0x7C, 0xEB, 0xF8, 0x99, 0x61, 0xB2, 0x7A, 0xDD, 0x85, 0x09, 0x3F,
+0x8A, 0x6E, 0xE3, 0xEF, 0x92, 0x95, 0x0D, 0x86, 0x4B, 0x31, 0xFE, 0xB3, 0x7A, 0x65, 0x57, 0xDF,
+0x68, 0xE9, 0xB6, 0x7F, 0x8A, 0xE3, 0x46, 0x2F, 0xBE, 0xD5, 0xD7, 0xD1, 0xBF, 0xEE, 0xA5, 0xF7,
+0x8E, 0x85, 0x6F, 0x3E, 0xFF, 0x3A, 0x16, 0xBC, 0xA9, 0xD0, 0xC1, 0xC5, 0x5D, 0xBE, 0x58, 0xBD,
+0x65, 0x4E, 0xE4, 0x74, 0x01, 0x37, 0xDB, 0xAA, 0xAE, 0xF2, 0x42, 0xF0, 0x12, 0xE1, 0x4A, 0x7D,
+0xE1, 0x40, 0xD8, 0x7B, 0x66, 0x0E, 0xD5, 0xC0, 0x06, 0x23, 0x8B, 0xF6, 0xB6, 0x14, 0xE1, 0x4F,
+0x0B, 0x7F, 0xED, 0x0A, 0x1A, 0x17, 0x7F, 0xB9, 0xBF, 0x5F, 0x93, 0xDD, 0x5B, 0x1A, 0xA6, 0xDE,
+0x51, 0x9E, 0x28, 0x59, 0x89, 0x21, 0xCB, 0xB3, 0x2D, 0x76, 0x5F, 0x23, 0x6A, 0xDE, 0x0C, 0xCD,
+0xB8, 0xEB, 0xED, 0x32, 0x52, 0x22, 0x75, 0xA4, 0x05, 0xD9, 0xCD, 0xBB, 0x12, 0x7A, 0x20, 0xE6,
+0x60, 0x25, 0x9C, 0xA2, 0xF7, 0x81, 0xF0, 0xCE, 0x61, 0x57, 0x8A, 0x91, 0xD1, 0x71, 0x6C, 0x81,
+0xD5, 0x11, 0x0E, 0xED, 0xDA, 0x1A, 0xB6, 0x6D, 0x18, 0x40, 0x2C, 0xC0, 0xAD, 0xE7, 0xF5, 0x24,
+0x63, 0x4C, 0xE5, 0xF1, 0xFC, 0x89, 0x2B, 0x30, 0x9F, 0x22, 0xF5, 0x09, 0xDA, 0x3F, 0x36, 0x32,
+0x22, 0xCA, 0x9A, 0xA0, 0x28, 0xB8, 0x2B, 0x3E, 0x4E, 0xD6, 0xFD, 0xB5, 0xB4, 0x3E, 0x33, 0x95,
+0xE7, 0xA4, 0x22, 0x5E, 0x63, 0xD8, 0xFA, 0x94, 0xF0, 0x32, 0x95, 0x3A, 0x6D, 0xF0, 0x53, 0x02,
+0x6A, 0xC5, 0x4F, 0x1B, 0x40, 0xC2, 0x88, 0xED, 0xB2, 0xB0, 0x9F, 0x6D, 0x7F, 0x5F, 0x2F, 0x4C,
+0xDC, 0xAD, 0xE1, 0x89, 0xDD, 0x1B, 0xC3, 0x13, 0x7B, 0x69, 0x7A, 0x5C, 0x7D, 0x85, 0xEA, 0xFA,
+0xD8, 0x54, 0x78, 0xF9, 0xD4, 0xB5, 0xF0, 0xA3, 0x8F, 0xAE, 0x0A, 0x4E, 0x13, 0xE3, 0x63, 0x61,
+0x86, 0x09, 0xB8, 0x85, 0xAC, 0x9A, 0x02, 0x5C, 0x21, 0x10, 0xEA, 0x3A, 0x10, 0xE7, 0x86, 0xFC,
+0x60, 0x48, 0xA6, 0x44, 0xED, 0x96, 0x92, 0x0F, 0x99, 0x3E, 0xF6, 0x5A, 0x71, 0x56, 0x86, 0x2B,
+0xB5, 0xFA, 0x1C, 0xF6, 0xBA, 0xFC, 0x1C, 0xEF, 0xC9, 0x68, 0xD8, 0xDE, 0x01, 0xC4, 0x4D, 0xB4,
+0x85, 0x83, 0x30, 0x49, 0xFF, 0xEA, 0x43, 0xBB, 0xC2, 0x3D, 0xD8, 0x4D, 0xA4, 0x19, 0x11, 0xC2,
+0x37, 0xF2, 0x9D, 0x43, 0x15, 0xED, 0xD4, 0xC8, 0x4C, 0x38, 0x83, 0x2D, 0xC2, 0x18, 0xDC, 0xC0,
+0x08, 0xD7, 0x5F, 0xB8, 0xAB, 0x5F, 0x02, 0x1C, 0xF2, 0x83, 0xC4, 0xF9, 0x32, 0xF2, 0xD0, 0x31,
+0xAA, 0x75, 0x08, 0x89, 0x86, 0x87, 0xA6, 0xE6, 0xE4, 0x31, 0x8C, 0x07, 0xD5, 0x38, 0x06, 0x41,
+0xD4, 0x72, 0x35, 0x46, 0xC2, 0x5E, 0x1A, 0xC7, 0x0F, 0x4C, 0x94, 0x39, 0x8B, 0xFA, 0xBF, 0x77,
+0x1A, 0xB9, 0x06, 0x81, 0xD1, 0xFD, 0xF0, 0xAF, 0xDB, 0x8E, 0xF4, 0x26, 0x7C, 0x9F, 0xAA, 0x2B,
+0x31, 0x15, 0x93, 0xEE, 0x32, 0x5C, 0x8F, 0x9F, 0x72, 0x6C, 0x74, 0x81, 0xFA, 0xD8, 0x8E, 0x39,
+0x04, 0xF1, 0x50, 0xBD, 0xA6, 0xBB, 0x00, 0x44, 0x52, 0x09, 0x4C, 0xB9, 0x11, 0x04, 0x3E, 0xFE,
+0x35, 0x24, 0x40, 0xA3, 0x63, 0x93, 0xE1, 0x23, 0x24, 0x82, 0x3F, 0x76, 0xE2, 0x6C, 0x38, 0xF1,
+0xD1, 0xF9, 0x70, 0xFC, 0xF8, 0x39, 0xFC, 0xE5, 0xE3, 0x42, 0x38, 0x8D, 0x2D, 0x0C, 0x87, 0xF1,
+0xFD, 0xD2, 0x8E, 0x39, 0xC1, 0x5D, 0x64, 0x78, 0xD0, 0x32, 0xC0, 0x73, 0x67, 0xCF, 0x5F, 0xC5,
+0x8F, 0xEF, 0x11, 0xF9, 0xBE, 0x61, 0x1E, 0x48, 0xFF, 0x0C, 0xF2, 0x87, 0xF9, 0xD5, 0x6B, 0xC3,
+0xE1, 0x02, 0xB6, 0x5A, 0xBA, 0x7C, 0x65, 0x28, 0x0C, 0x8F, 0x8C, 0xC9, 0xE7, 0x8C, 0x9F, 0xB1,
+0x46, 0x0E, 0x6E, 0x39, 0x75, 0x1A, 0xF9, 0x3A, 0xAF, 0x5C, 0x1D, 0x12, 0x57, 0x1C, 0xE6, 0x52,
+0x64, 0x4E, 0xCC, 0xC5, 0x0E, 0x7E, 0xA7, 0x0C, 0x0E, 0x8D, 0x86, 0x63, 0x68, 0xFB, 0x07, 0x47,
+0x4E, 0x85, 0x63, 0xC7, 0xB4, 0x1F, 0x7C, 0x9C, 0x44, 0xBF, 0x2E, 0xA3, 0x1E, 0x96, 0x61, 0x1B,
+0xA8, 0xD0, 0x53, 0x1D, 0x3F, 0x87, 0xC0, 0xBC, 0x4B, 0xC8, 0x28, 0xC0, 0x7D, 0x3E, 0xBB, 0x90,
+0x68, 0x96, 0x84, 0x43, 0xBF, 0x16, 0xF0, 0x3D, 0x05, 0x3C, 0xCE, 0xC0, 0x02, 0xC2, 0xBE, 0x09,
+0x11, 0xC1, 0x7F, 0x67, 0x60, 0x19, 0x39, 0x7A, 0xE2, 0x3C, 0x30, 0x22, 0x3E, 0x5A, 0xFF, 0x29,
+0xB4, 0x91, 0xDF, 0xBD, 0x1D, 0xF8, 0xBE, 0x60, 0x1D, 0xB5, 0x3F, 0x7E, 0x66, 0x80, 0xD3, 0xB9,
+0x0B, 0xD7, 0xC2, 0xE1, 0x63, 0x67, 0xC2, 0x91, 0x23, 0x67, 0xC2, 0x71, 0xB8, 0x16, 0x9D, 0x3C,
+0x75, 0x31, 0x5C, 0x41, 0xFE, 0x51, 0x1E, 0x3D, 0x88, 0xC0, 0x5F, 0xAA, 0x5F, 0x8B, 0xF5, 0x97,
+0x3F, 0x02, 0x89, 0xCF, 0x87, 0xAC, 0xF7, 0xE8, 0x99, 0x70, 0x02, 0x6D, 0xFA, 0x08, 0x63, 0x75,
+0x0E, 0xFB, 0xB0, 0x0E, 0x0E, 0x8D, 0x61, 0x1B, 0xCE, 0x29, 0x69, 0x37, 0xDB, 0xB5, 0xD8, 0x0F,
+0x32, 0xF6, 0x93, 0x38, 0x8F, 0x60, 0x57, 0xA7, 0xB3, 0xC0, 0xE2, 0xBA, 0xF4, 0x55, 0x2D, 0x41,
+0xAC, 0xE3, 0x28, 0xFA, 0xF8, 0x01, 0xF2, 0xA5, 0x1E, 0xC7, 0x2E, 0x47, 0x82, 0x25, 0x52, 0x6B,
+0x9D, 0x3A, 0x73, 0x59, 0x70, 0x6E, 0xB3, 0xB9, 0xB0, 0x98, 0xFA, 0x36, 0x09, 0xD7, 0x19, 0x62,
+0x73, 0xF5, 0xEA, 0x70, 0xB8, 0x82, 0xF1, 0x7F, 0x07, 0xD9, 0x1B, 0xBE, 0x8F, 0x7D, 0x55, 0xF9,
+0x59, 0x7B, 0xF2, 0xC9, 0x7B, 0xC3, 0xFA, 0x75, 0x7D, 0x61, 0x78, 0x78, 0x3C, 0x5C, 0xBB, 0x3E,
+0x22, 0x18, 0x4F, 0x4D, 0xCD, 0x2C, 0x39, 0xC6, 0xEC, 0xEF, 0x85, 0x8B, 0xD7, 0xA5, 0x4D, 0x87,
+0x11, 0x2C, 0x48, 0x1C, 0xD9, 0x26, 0x9F, 0x9B, 0x6C, 0x0F, 0x2D, 0x0C, 0x37, 0x82, 0x25, 0x31,
+0x26, 0x0E, 0x1C, 0xEF, 0xC3, 0x98, 0x37, 0xC4, 0xD3, 0xEB, 0x3F, 0x81, 0xB1, 0x3A, 0x83, 0x8D,
+0x00, 0x06, 0xB1, 0x31, 0x80, 0x6C, 0x39, 0x29, 0xF3, 0xB0, 0x25, 0x5C, 0xC6, 0xBC, 0xF9, 0xDD,
+0xDF, 0xFB, 0x2B, 0x6C, 0x03, 0x39, 0x15, 0x1E, 0x7A, 0xE0, 0xAE, 0xF0, 0xD9, 0x4F, 0x3F, 0x18,
+0xB6, 0x6D, 0xD9, 0xD0, 0xC8, 0xD4, 0xFE, 0xD8, 0x65, 0xF0, 0xFD, 0xEF, 0x8C, 0xE4, 0x63, 0xD7,
+0xD5, 0xB4, 0x0A, 0xBC, 0xC9, 0x97, 0x31, 0xF1, 0xFF, 0xBB, 0xDF, 0xFB, 0x56, 0xF8, 0x37, 0xDF,
+0xFC, 0xA1, 0x4C, 0xD2, 0x2E, 0xAA, 0x37, 0xE2, 0x49, 0x13, 0x57, 0x65, 0x7C, 0x00, 0x8D, 0x68,
+0xC9, 0x5A, 0x05, 0x53, 0x1F, 0x17, 0xB3, 0x28, 0xF3, 0xE2, 0x75, 0x24, 0x0E, 0xDA, 0x7C, 0xBE,
+0x56, 0x35, 0x4C, 0x49, 0x85, 0x32, 0x24, 0x7E, 0xDD, 0x32, 0xCD, 0x05, 0x3F, 0xD0, 0xBA, 0xE8,
+0xC9, 0xC2, 0x28, 0x8B, 0x1E, 0x1D, 0xC9, 0xD5, 0xFF, 0xAD, 0x05, 0xF7, 0x9A, 0xE7, 0x97, 0x2F,
+0xEF, 0x23, 0x84, 0x43, 0xBF, 0x64, 0x78, 0xB5, 0xD4, 0x2B, 0x2D, 0x63, 0xC4, 0x2D, 0x2B, 0xC2,
+0xFF, 0x2C, 0x4B, 0xE2, 0x90, 0x7D, 0x19, 0x31, 0x51, 0x8B, 0xFC, 0xCF, 0xFB, 0xE0, 0x7D, 0x71,
+0xF7, 0x16, 0x5E, 0x87, 0x3B, 0x30, 0x21, 0xAC, 0xD5, 0xE1, 0x65, 0x54, 0x44, 0xD2, 0xFB, 0xB1,
+0x8D, 0xCC, 0xD3, 0xC6, 0x76, 0xC4, 0x84, 0x59, 0xB8, 0x6E, 0x16, 0xA4, 0x6E, 0x66, 0x74, 0x48,
+0xD2, 0xC1, 0xEC, 0xDE, 0xB4, 0x3E, 0xFC, 0x6F, 0x7F, 0xE6, 0x99, 0xF0, 0x1F, 0xFF, 0xE2, 0xB3,
+0x61, 0x33, 0xF6, 0x68, 0xBD, 0xD5, 0x07, 0x4D, 0xA1, 0xC7, 0xE1, 0x3F, 0xF6, 0x7F, 0xFF, 0xD6,
+0xBB, 0xE1, 0xED, 0x8B, 0xC3, 0x58, 0x0C, 0xA6, 0xC2, 0xD5, 0x73, 0x67, 0xC2, 0xE4, 0x04, 0x37,
+0x4C, 0x46, 0xBF, 0xA4, 0x7B, 0x46, 0x56, 0x84, 0x7A, 0x70, 0x8C, 0x53, 0x56, 0x72, 0xA3, 0x23,
+0x36, 0x1E, 0x4E, 0x66, 0x15, 0x73, 0x1B, 0x35, 0xF9, 0x05, 0xA8, 0x87, 0x9F, 0x51, 0x3F, 0x44,
+0x3F, 0x93, 0x66, 0x8B, 0x3D, 0x93, 0x39, 0x62, 0x57, 0x60, 0xC2, 0x30, 0x15, 0xCB, 0xFA, 0x0D,
+0xEB, 0xF0, 0x45, 0x33, 0x20, 0xE6, 0xE3, 0x7F, 0xFC, 0xB9, 0x43, 0xE1, 0xA7, 0xEF, 0xDD, 0xD1,
+0x94, 0x9C, 0x6D, 0x87, 0x2F, 0x0D, 0x87, 0x7F, 0xFD, 0x93, 0xE3, 0xE1, 0x5B, 0x1F, 0x5E, 0xD0,
+0x85, 0xF2, 0x1A, 0x76, 0x12, 0xC1, 0x8F, 0x18, 0xA3, 0xEC, 0x36, 0x07, 0xD9, 0x2F, 0x3F, 0x74,
+0x86, 0xCC, 0x93, 0x18, 0x7B, 0x1F, 0x85, 0x9C, 0x56, 0x47, 0x7A, 0xE1, 0xC7, 0x3E, 0x29, 0xC6,
+0x11, 0x98, 0xEC, 0x89, 0xE8, 0xDA, 0x46, 0x04, 0x5B, 0xBB, 0xA1, 0xAA, 0x6E, 0xD8, 0x2A, 0x51,
+0xC2, 0x5F, 0xBB, 0x67, 0x5B, 0xF8, 0x3F, 0x3F, 0x7B, 0x77, 0x78, 0x70, 0xFB, 0xBA, 0xE4, 0x8B,
+0x77, 0xAB, 0x27, 0x55, 0xCD, 0xFD, 0xAF, 0x4F, 0xCE, 0x85, 0xE7, 0xCE, 0x8F, 0x87, 0x17, 0xB1,
+0xBD, 0xD8, 0x77, 0x4E, 0x8E, 0x86, 0xF5, 0x08, 0xA4, 0xF8, 0xFF, 0x7E, 0x69, 0x7B, 0x38, 0xB8,
+0x5E, 0x09, 0x88, 0x1F, 0x24, 0x71, 0x2F, 0xA0, 0x0C, 0x03, 0x20, 0x9C, 0x84, 0xF1, 0xDB, 0x91,
+0x26, 0xD5, 0xBB, 0xD7, 0x77, 0x0A, 0x59, 0xAB, 0xA6, 0x3D, 0x41, 0xB0, 0xC4, 0xD8, 0x2C, 0xB6,
+0x2A, 0x9B, 0x84, 0x3F, 0xE7, 0x5C, 0xB8, 0x82, 0xBD, 0x7C, 0x7F, 0xEF, 0xF0, 0x30, 0x82, 0x79,
+0x02, 0x52, 0x9C, 0x74, 0x87, 0x27, 0x90, 0x66, 0xA5, 0x17, 0x0B, 0xE7, 0x3E, 0xE4, 0xD3, 0xDB,
+0x8E, 0x60, 0x0A, 0xE6, 0xD1, 0x5B, 0x2E, 0x42, 0x96, 0xBB, 0x8E, 0x5D, 0x43, 0x7B, 0xB9, 0x47,
+0xED, 0x05, 0x6C, 0x89, 0xC6, 0xF9, 0x3F, 0x00, 0xF5, 0x8F, 0x81, 0x1C, 0x07, 0x6F, 0x61, 0x84,
+0x2D, 0xC9, 0xC7, 0x71, 0x2C, 0xDA, 0x7F, 0xF1, 0xDD, 0x97, 0xC2, 0x6B, 0x6F, 0x1C, 0x0E, 0x57,
+0xB0, 0x0F, 0xE6, 0xF8, 0xF5, 0x31, 0x90, 0x56, 0x04, 0x8B, 0xC0, 0x97, 0xB7, 0x77, 0x7D, 0x7F,
+0x78, 0xEA, 0xC9, 0xFB, 0xC2, 0x2F, 0xFC, 0xEC, 0xA7, 0xC3, 0x63, 0x0F, 0x1D, 0x80, 0xA5, 0xA0,
+0x15, 0x8B, 0xF2, 0x18, 0x16, 0xF9, 0x4B, 0xE1, 0x85, 0x57, 0x3E, 0x14, 0x97, 0x87, 0x2F, 0x7C,
+0xE6, 0xC1, 0x70, 0xCF, 0xA1, 0xDD, 0xB2, 0xB8, 0xF2, 0x18, 0xC3, 0x5E, 0xD6, 0xAF, 0xA0, 0xAE,
+0x0F, 0x40, 0x66, 0x48, 0x1C, 0x36, 0xAC, 0xEF, 0x0B, 0xBF, 0xF8, 0x73, 0xCF, 0x84, 0x2D, 0x9B,
+0x06, 0x1A, 0x9A, 0x41, 0x5C, 0xF0, 0xBF, 0xF1, 0xED, 0x17, 0xC2, 0x10, 0x16, 0xFF, 0xBB, 0xF6,
+0x6F, 0x0F, 0xCF, 0x3E, 0xF3, 0x70, 0x18, 0x40, 0x74, 0xF6, 0x62, 0x07, 0x17, 0xFE, 0x77, 0xDF,
+0x3F, 0x19, 0xFE, 0xEC, 0x5B, 0x2F, 0x84, 0x17, 0x5E, 0x7E, 0x2F, 0x8C, 0x5D, 0x1B, 0xC1, 0xE7,
+0x44, 0xDD, 0x52, 0x3A, 0xB0, 0x18, 0xEF, 0x3F, 0xB4, 0x2B, 0xFC, 0xEC, 0x4F, 0x3D, 0x15, 0xBE,
+0xF6, 0xD3, 0x4F, 0x85, 0x75, 0x03, 0xBD, 0x42, 0x4E, 0xBE, 0xFD, 0xFD, 0xD7, 0xC2, 0x25, 0x10,
+0xCF, 0x4D, 0xF8, 0x21, 0xFC, 0xC5, 0xCF, 0x3F, 0x12, 0x76, 0xED, 0xD8, 0x24, 0xE5, 0x89, 0xC7,
+0x47, 0xC0, 0xE3, 0x7B, 0x3F, 0x7A, 0x53, 0xE6, 0xFD, 0x97, 0x3E, 0xF7, 0x48, 0xD8, 0xB2, 0x79,
+0x7D, 0xF8, 0xCE, 0xF7, 0x5F, 0x0D, 0x3F, 0xF8, 0xF1, 0xDB, 0xE1, 0x1C, 0xC8, 0xCD, 0x30, 0xB6,
+0xB9, 0x9C, 0x85, 0x6B, 0x50, 0xCF, 0x86, 0xFE, 0xF0, 0xF4, 0x13, 0xF7, 0x85, 0x5F, 0xFE, 0xFA,
+0x33, 0xE1, 0x61, 0x2C, 0xF0, 0x24, 0x77, 0xF9, 0x31, 0x8C, 0xBE, 0x7F, 0xF7, 0x6F, 0x5E, 0x0B,
+0xDF, 0xFA, 0xAB, 0x97, 0xC2, 0xB1, 0x0F, 0x4E, 0x85, 0x69, 0xB4, 0xB3, 0x03, 0xDF, 0x33, 0xF7,
+0xDC, 0x77, 0x57, 0xF8, 0xDA, 0xCF, 0x3C, 0x1D, 0xBE, 0xF2, 0x85, 0x47, 0x65, 0x67, 0x9E, 0x95,
+0x1C, 0x6C, 0xD3, 0xD5, 0x6B, 0x43, 0xC0, 0xE7, 0xA5, 0xF0, 0xBD, 0x1F, 0xBE, 0x16, 0xCE, 0x1C,
+0x3F, 0x8F, 0x1F, 0x84, 0x70, 0x55, 0xC2, 0x1A, 0xB2, 0x79, 0xC7, 0xE6, 0x70, 0xEF, 0x3D, 0x7B,
+0xC2, 0xBD, 0x77, 0xEF, 0x0E, 0x9F, 0x7F, 0xE6, 0xC1, 0xB0, 0x7F, 0xEF, 0x76, 0x21, 0xE4, 0xF5,
+0x0E, 0xF6, 0x93, 0x16, 0x31, 0x12, 0xB0, 0x97, 0xB1, 0x07, 0x39, 0x57, 0xA0, 0x67, 0x3F, 0xF7,
+0x70, 0xD8, 0xBD, 0x73, 0x0B, 0x08, 0xDD, 0xE9, 0xF0, 0x47, 0x7F, 0xFE, 0xA3, 0xF0, 0xCA, 0xAB,
+0xEF, 0x87, 0x09, 0x8C, 0x81, 0x7E, 0xBD, 0x62, 0x57, 0x1E, 0xB8, 0xD6, 0x3C, 0xF6, 0xC8, 0xA1,
+0xF0, 0x4B, 0x5F, 0x7B, 0x26, 0x7C, 0xEA, 0xF1, 0x7B, 0x84, 0x98, 0xD6, 0x1E, 0x4C, 0xD7, 0x44,
+0xC2, 0xFC, 0xE7, 0xDF, 0x79, 0x11, 0x3F, 0x56, 0x75, 0x4F, 0xF3, 0xB7, 0xDF, 0x3B, 0x1E, 0xFE,
+0xE0, 0x8F, 0x7F, 0x20, 0xEB, 0xDD, 0xAF, 0xFD, 0xAD, 0x2F, 0x86, 0x47, 0x80, 0x95, 0xB8, 0xBF,
+0xE0, 0xBB, 0x8C, 0xD6, 0xA7, 0x83, 0x77, 0xED, 0x08, 0x9F, 0xC7, 0x1C, 0x5A, 0x0C, 0x0B, 0x12,
+0xF3, 0xE7, 0xB0, 0x1D, 0xD9, 0x77, 0xBF, 0xF7, 0x4A, 0x38, 0x0C, 0x7F, 0xF2, 0x29, 0xB1, 0x4C,
+0xB5, 0x84, 0x5E, 0x8C, 0xDD, 0x53, 0x20, 0x8A, 0x5F, 0x07, 0x96, 0x0F, 0xDD, 0xBF, 0x7F, 0xC5,
+0x58, 0xB2, 0xED, 0xFC, 0x1E, 0x20, 0x0E, 0x7F, 0xF9, 0x9D, 0x97, 0xC2, 0x5F, 0xFF, 0xF0, 0xCD,
+0x70, 0x12, 0xE4, 0x71, 0x9A, 0xF5, 0xF3, 0x3B, 0xB6, 0xB3, 0x33, 0x0C, 0x60, 0xFE, 0x3F, 0xFC,
+0xC0, 0xFE, 0xF0, 0xF3, 0x98, 0x3F, 0x4F, 0x3D, 0x81, 0x3E, 0xC3, 0x55, 0xE7, 0x7D, 0x6C, 0xEB,
+0xF9, 0xAB, 0xBF, 0xFE, 0x5F, 0x86, 0x33, 0xE0, 0x29, 0xBF, 0xF1, 0xB7, 0xBF, 0x18, 0xFE, 0x2F,
+0xFF, 0xE4, 0xD7, 0xC3, 0x43, 0xF7, 0xED, 0x5F, 0xC9, 0x30, 0xDE, 0x70, 0xD9, 0x4F, 0xB4, 0x62,
+0x77, 0x65, 0x68, 0x24, 0xFC, 0xDE, 0x77, 0x9F, 0x0F, 0xC7, 0x10, 0x15, 0x4B, 0xE4, 0x99, 0xDE,
+0x23, 0xAA, 0x5F, 0x06, 0x89, 0x9A, 0xEB, 0x54, 0xE5, 0x92, 0x05, 0xCF, 0xD4, 0x0A, 0x65, 0x56,
+0x4A, 0xB2, 0x3C, 0xC9, 0xAF, 0x9B, 0xA3, 0x52, 0x2E, 0x35, 0x27, 0x76, 0x1C, 0x59, 0x25, 0x78,
+0x5E, 0x9F, 0xDE, 0xC8, 0x68, 0x45, 0xFC, 0x19, 0xED, 0xA4, 0xD0, 0x15, 0x0F, 0x27, 0x0A, 0xA6,
+0xAC, 0x89, 0xC2, 0x62, 0x65, 0xD8, 0x12, 0x23, 0x95, 0xE9, 0xD7, 0x92, 0xAB, 0x6D, 0xD6, 0x56,
+0x69, 0x1B, 0xDB, 0x6F, 0x0B, 0xB7, 0x91, 0x53, 0x6D, 0xB7, 0x51, 0x3C, 0x53, 0x1F, 0x53, 0xE0,
+0x86, 0x76, 0x3C, 0xD6, 0x29, 0x2A, 0x01, 0xCA, 0x23, 0x62, 0x94, 0xC4, 0x6E, 0x14, 0x3E, 0x89,
+0x94, 0xBC, 0xEF, 0xDD, 0xB3, 0x3D, 0x6C, 0x07, 0xC9, 0x6B, 0xF4, 0xD7, 0xF1, 0x0D, 0xCF, 0xB0,
+0x65, 0x2E, 0x64, 0xDB, 0x18, 0x10, 0xFB, 0x21, 0x08, 0xCC, 0x61, 0xA4, 0xF4, 0xA0, 0x39, 0x76,
+0x0A, 0xFB, 0xDD, 0xCE, 0x4C, 0x99, 0xB9, 0xD8, 0x89, 0xB4, 0x22, 0xAF, 0x1C, 0xDB, 0xC6, 0x54,
+0xC9, 0xB4, 0xB0, 0x5E, 0xED, 0xAF, 0x99, 0xC1, 0xFC, 0x96, 0x32, 0x42, 0x02, 0x7D, 0x62, 0x35,
+0x4A, 0xC6, 0x73, 0x55, 0xD7, 0xD5, 0x2C, 0x0F, 0x56, 0x71, 0xFC, 0xE4, 0xE3, 0xAC, 0xF3, 0x0A,
+0x5F, 0x2E, 0x7D, 0xFD, 0xFD, 0x62, 0xD6, 0x66, 0xEE, 0xBA, 0xAF, 0x3F, 0xB8, 0x2B, 0xEC, 0x46,
+0x54, 0x6C, 0x43, 0x5B, 0x53, 0x7D, 0x0C, 0xE0, 0xF8, 0xE5, 0xF7, 0x11, 0x76, 0x9B, 0xF8, 0xC6,
+0x7B, 0xE7, 0xB0, 0x4D, 0xDC, 0x04, 0x92, 0x12, 0x23, 0x7A, 0x77, 0x74, 0x0C, 0xBF, 0x12, 0xF0,
+0x45, 0x27, 0x73, 0xC1, 0xC8, 0x96, 0x2B, 0xB7, 0x72, 0x2F, 0x9D, 0x2B, 0xAA, 0xC6, 0x71, 0x9E,
+0xE8, 0xB9, 0xDA, 0x5F, 0xE4, 0x31, 0x20, 0xA2, 0x72, 0x8D, 0xCE, 0xD3, 0x88, 0x96, 0x54, 0xA5,
+0xE7, 0x9C, 0xD8, 0xF1, 0x79, 0x47, 0x4F, 0x5F, 0x20, 0xB9, 0xE3, 0x2E, 0x13, 0x3F, 0x7F, 0xEF,
+0xF6, 0xF0, 0xA9, 0x3D, 0x1B, 0x91, 0xD7, 0x4F, 0x17, 0xAB, 0xDB, 0xD1, 0x14, 0x4B, 0xC5, 0xEE,
+0xA4, 0x29, 0x76, 0xCC, 0x33, 0xB7, 0x98, 0x62, 0x77, 0x1D, 0x01, 0x3C, 0xDF, 0x3B, 0x33, 0x16,
+0xDE, 0xC2, 0x5E, 0xB2, 0x54, 0xDF, 0xCE, 0x82, 0x58, 0x9D, 0x19, 0x9D, 0x95, 0x3D, 0x67, 0x49,
+0x06, 0x99, 0xF0, 0xB8, 0x96, 0x98, 0x9D, 0xC3, 0xFB, 0xDF, 0x3B, 0x35, 0x1E, 0x0E, 0x0F, 0x4E,
+0x89, 0x22, 0xC8, 0xD7, 0xA4, 0x0A, 0x14, 0x9D, 0x86, 0xA1, 0xFA, 0x5D, 0x62, 0x4E, 0x3B, 0xBC,
+0xE8, 0x45, 0xFA, 0x14, 0x2A, 0x84, 0x54, 0xDD, 0x6A, 0x0F, 0xFE, 0xD8, 0x1C, 0x02, 0x31, 0x3C,
+0x35, 0x32, 0x2D, 0x09, 0x8E, 0x3F, 0xB8, 0x3E, 0x85, 0xDD, 0x2B, 0x26, 0xF0, 0x17, 0x8A, 0xCB,
+0xE8, 0xB4, 0x28, 0x82, 0xA3, 0x48, 0x92, 0x0C, 0xDE, 0x29, 0x04, 0xA9, 0xD9, 0x66, 0x5E, 0x2A,
+0x2B, 0xEF, 0x7D, 0xF8, 0x51, 0xF8, 0xC9, 0x8B, 0xEF, 0x86, 0xEF, 0xFC, 0xF5, 0x2B, 0xE1, 0x79,
+0x24, 0x3D, 0x7F, 0xEF, 0xBD, 0x8F, 0xC2, 0x11, 0xEC, 0x6A, 0x73, 0x9C, 0xEA, 0xDD, 0x49, 0x28,
+0x16, 0x17, 0xA9, 0x28, 0xA3, 0xAF, 0x50, 0x7F, 0xBA, 0xB1, 0xA8, 0xAD, 0xC7, 0x8F, 0x46, 0xAA,
+0x5C, 0x47, 0xA1, 0x6E, 0x7C, 0x1B, 0x64, 0xF0, 0x24, 0x48, 0xD0, 0x81, 0xFD, 0x3B, 0xC3, 0xDE,
+0x5D, 0x5B, 0x74, 0xF7, 0x16, 0x1C, 0x7C, 0xFF, 0x47, 0x58, 0x88, 0x7F, 0xFC, 0xFC, 0x3B, 0xA8,
+0xEF, 0x44, 0x18, 0xC2, 0xF7, 0xF9, 0xA7, 0x9F, 0xBA, 0x4F, 0xAE, 0x6D, 0x44, 0x99, 0xBC, 0x8A,
+0x85, 0xFC, 0xF7, 0xFE, 0xE0, 0x6F, 0x84, 0xAC, 0x31, 0xB9, 0xF9, 0x23, 0x0F, 0xDE, 0x85, 0x94,
+0x49, 0xDD, 0x0B, 0xF0, 0xE5, 0x67, 0x81, 0xF7, 0x7A, 0xFB, 0xDD, 0xE3, 0xE1, 0x39, 0xEC, 0xDB,
+0xF9, 0x2D, 0xF4, 0xE1, 0xC7, 0xF8, 0x7B, 0x18, 0x24, 0xEA, 0x23, 0xA8, 0x3A, 0x54, 0xB1, 0x4E,
+0x82, 0xB8, 0x0C, 0x42, 0x31, 0xE4, 0xCE, 0x24, 0x7D, 0x70, 0xB5, 0x18, 0xE8, 0xEF, 0x15, 0xB1,
+0xE0, 0x4F, 0xFE, 0xE2, 0xC7, 0xE1, 0xF5, 0x37, 0x8E, 0x88, 0xF2, 0xF8, 0xE0, 0xFD, 0xFB, 0xC2,
+0xD6, 0x2D, 0xEB, 0xA5, 0x7E, 0xFE, 0xC8, 0x3A, 0x82, 0xBE, 0xFD, 0xE9, 0x37, 0x9E, 0x0B, 0xA7,
+0xA0, 0xD8, 0xEC, 0xD8, 0xBE, 0x09, 0xCA, 0xE4, 0x95, 0xF0, 0xED, 0xBF, 0x7A, 0x39, 0xFC, 0x0D,
+0xC8, 0xDE, 0xDB, 0xD8, 0xC4, 0xFE, 0x43, 0xB4, 0x8B, 0xAA, 0xCE, 0x19, 0x28, 0x64, 0x24, 0x6B,
+0xB4, 0x96, 0xF4, 0x20, 0x35, 0xD0, 0xA6, 0x8D, 0x54, 0xBB, 0x5B, 0x45, 0x81, 0xBA, 0x02, 0xF2,
+0xF5, 0xEA, 0x9B, 0x47, 0x70, 0xDD, 0x2B, 0xE1, 0xAF, 0xFE, 0xE6, 0xD5, 0xF0, 0xDA, 0xAB, 0x1F,
+0x86, 0x63, 0x20, 0x0D, 0xA7, 0xCE, 0x5E, 0xC2, 0x3D, 0x27, 0xC5, 0xE5, 0x83, 0x7D, 0x22, 0x99,
+0x51, 0xB5, 0x49, 0xBF, 0xCF, 0x97, 0x3A, 0xC6, 0x41, 0x38, 0x3E, 0x42, 0xC2, 0xFE, 0x57, 0x5E,
+0xFD, 0x00, 0x64, 0xF1, 0x65, 0x10, 0x91, 0x37, 0xC2, 0x5B, 0x6F, 0x1C, 0x15, 0x85, 0x92, 0xE7,
+0x2F, 0x42, 0x25, 0x25, 0x99, 0x1C, 0x86, 0xC2, 0xD4, 0xC2, 0x1F, 0xAE, 0x08, 0x84, 0xDA, 0x00,
+0x62, 0xE2, 0x6A, 0x64, 0x5E, 0x37, 0xFB, 0x49, 0xC2, 0x74, 0x18, 0x0A, 0xD5, 0x5F, 0xA1, 0x8D,
+0xA7, 0x41, 0xD4, 0xF7, 0xEF, 0xDB, 0x21, 0xA4, 0xFD, 0xB9, 0x1F, 0xBF, 0x15, 0xFE, 0x02, 0x44,
+0x87, 0x7B, 0xBB, 0x1E, 0xF9, 0xF0, 0xB4, 0xA8, 0x75, 0x27, 0xA0, 0x7C, 0x9E, 0x06, 0x0E, 0x13,
+0xD8, 0xCB, 0xBA, 0x07, 0xDF, 0x95, 0xBD, 0xC0, 0x72, 0x0B, 0xD7, 0x99, 0x9A, 0x40, 0x33, 0x7E,
+0xB7, 0x5D, 0xC0, 0x9C, 0xF9, 0xFD, 0x3F, 0xF8, 0x7E, 0x78, 0x0F, 0x24, 0x8C, 0x0A, 0xE5, 0x51,
+0x60, 0x45, 0x35, 0x51, 0x76, 0x23, 0x42, 0x1F, 0x39, 0xBE, 0x27, 0xD1, 0xDE, 0xE3, 0x50, 0x85,
+0x4F, 0xA3, 0x5E, 0x7E, 0x0F, 0x93, 0x18, 0xB3, 0x4E, 0x3F, 0x54, 0xED, 0xBC, 0x1A, 0xDE, 0xFF,
+0xF0, 0x64, 0x78, 0x03, 0x98, 0xFF, 0xE0, 0x47, 0x6F, 0x85, 0xEF, 0x81, 0x24, 0xBF, 0x0A, 0x1C,
+0x8F, 0x52, 0xA5, 0x84, 0x62, 0x77, 0x96, 0xF8, 0x43, 0x6D, 0x63, 0x7A, 0x2A, 0xAA, 0x6E, 0x4C,
+0x17, 0xC5, 0x71, 0x20, 0x9E, 0xCB, 0x61, 0x29, 0x63, 0x8D, 0x6B, 0x22, 0x9E, 0x20, 0x8D, 0xDF,
+0xFF, 0xE1, 0x5B, 0xE1, 0x8D, 0x37, 0x30, 0x4E, 0x47, 0x39, 0xF7, 0xD1, 0x67, 0x90, 0x78, 0xB6,
+0x7B, 0x0C, 0x73, 0x8C, 0xE3, 0xD5, 0x89, 0x71, 0xDE, 0x80, 0x3C, 0xAD, 0xC3, 0xF8, 0x61, 0xF0,
+0xBB, 0xBF, 0xFF, 0x3D, 0x53, 0xEC, 0xF6, 0x87, 0xCF, 0x3E, 0xDD, 0x3C, 0xC5, 0xEE, 0x13, 0x47,
+0xEC, 0x7C, 0x41, 0xE2, 0x80, 0x5C, 0x44, 0x52, 0xE2, 0xDF, 0xFE, 0xCB, 0x1F, 0x84, 0x4B, 0xF8,
+0x70, 0xF0, 0xFB, 0x92, 0x49, 0x79, 0xB3, 0x65, 0x49, 0x7F, 0x40, 0x38, 0x79, 0x32, 0xE5, 0x4B,
+0x4A, 0x18, 0x29, 0x93, 0x65, 0x4B, 0x78, 0x96, 0x7D, 0x50, 0x8C, 0x04, 0x19, 0x55, 0x10, 0xD5,
+0x46, 0xD4, 0x35, 0x5B, 0xB0, 0xD4, 0xFE, 0xEF, 0x74, 0xCE, 0x7D, 0xF2, 0x94, 0x70, 0xE8, 0xE2,
+0xA7, 0xF5, 0xE9, 0xAD, 0x94, 0xDC, 0xE9, 0x39, 0x6D, 0x95, 0xFE, 0xD5, 0x3A, 0xBC, 0xDE, 0xDC,
+0x7C, 0x25, 0xF5, 0x67, 0xEF, 0xCB, 0x9D, 0xFD, 0x1F, 0x7F, 0xCF, 0xEE, 0x21, 0x0B, 0x2D, 0xCE,
+0x51, 0xD1, 0x53, 0x8E, 0xA7, 0x7F, 0x5D, 0x65, 0x8C, 0x1F, 0x7D, 0xB9, 0x8E, 0x0A, 0x17, 0xCE,
+0x4C, 0x4F, 0x08, 0xC1, 0x1B, 0x1B, 0xA7, 0x49, 0xB6, 0x33, 0x3C, 0x76, 0xF7, 0xBE, 0xD0, 0x87,
+0xA4, 0xC0, 0xB7, 0xFA, 0x90, 0x5F, 0x43, 0x30, 0x39, 0x3E, 0x7F, 0xF2, 0xAA, 0xA4, 0x39, 0x99,
+0xC5, 0x07, 0x69, 0x7A, 0x82, 0xBF, 0x00, 0xAB, 0x44, 0x5D, 0xA0, 0x4D, 0xB6, 0x6B, 0x55, 0xAB,
+0xB2, 0xF1, 0x8B, 0x79, 0xD8, 0x0C, 0x36, 0xC1, 0xDC, 0x88, 0xA1, 0xF6, 0x31, 0x11, 0x73, 0xA3,
+0xCA, 0x3A, 0x2E, 0x52, 0xDE, 0x48, 0x50, 0x1C, 0x3F, 0x57, 0xFD, 0x10, 0x61, 0x0C, 0xC5, 0xAE,
+0xB7, 0x1F, 0x64, 0x06, 0x5F, 0xFA, 0x5B, 0xF1, 0x05, 0xFB, 0xF3, 0x0F, 0xEE, 0x0C, 0x9B, 0xFB,
+0x2C, 0x99, 0xF2, 0x2A, 0x81, 0xC7, 0x05, 0x7C, 0x1A, 0x58, 0x1C, 0x81, 0x9A, 0xF9, 0xA7, 0xEF,
+0x5D, 0x90, 0x00, 0x8A, 0x39, 0x98, 0x9B, 0x66, 0x1D, 0x17, 0xD3, 0x24, 0xDD, 0xA5, 0x32, 0x35,
+0xC3, 0x7F, 0x6C, 0xF8, 0xDC, 0x21, 0xB9, 0xF5, 0x5E, 0x66, 0xA5, 0x8C, 0x08, 0x3B, 0x2E, 0x3A,
+0x85, 0x94, 0xF4, 0xC6, 0x43, 0xE6, 0x29, 0xC9, 0xB3, 0x62, 0x27, 0x07, 0xCA, 0xF4, 0x0C, 0xAC,
+0x0B, 0x6D, 0x9D, 0x50, 0xA3, 0xE0, 0x5F, 0xF7, 0x1F, 0x3C, 0xB6, 0x47, 0xF2, 0x11, 0x7A, 0xEA,
+0x97, 0x46, 0xBE, 0x28, 0x57, 0x09, 0xB2, 0x45, 0xAB, 0x6D, 0x94, 0xD8, 0x5D, 0x06, 0x09, 0xFB,
+0x93, 0x63, 0xA3, 0xE1, 0x95, 0x4B, 0x93, 0xE1, 0x3C, 0x64, 0xB7, 0xF3, 0x50, 0xE3, 0xCE, 0x83,
+0xA8, 0x5D, 0xC1, 0xF9, 0x5D, 0x48, 0x76, 0xCC, 0x44, 0xC5, 0x3D, 0x95, 0x88, 0x88, 0x16, 0x6C,
+0x1D, 0x36, 0x13, 0xFE, 0xF8, 0xF8, 0x88, 0x90, 0x30, 0x12, 0xB0, 0x09, 0x9A, 0x5D, 0x81, 0x37,
+0x77, 0xAC, 0xB8, 0x88, 0x3A, 0x58, 0xE7, 0x66, 0xA8, 0x75, 0xCC, 0x83, 0xC7, 0x9D, 0x27, 0xBA,
+0xEA, 0xE4, 0x3E, 0x99, 0x06, 0xE6, 0x34, 0x11, 0x7F, 0xEB, 0xE4, 0x58, 0xF8, 0x6B, 0xEC, 0x31,
+0xFB, 0xDC, 0xB9, 0xF1, 0xF0, 0xEE, 0xB5, 0x29, 0x31, 0x1F, 0x9F, 0xC5, 0xFD, 0x4F, 0x83, 0xF0,
+0x1D, 0xC1, 0xFB, 0x87, 0xF1, 0xE0, 0x67, 0xE2, 0xE0, 0x3A, 0x28, 0x87, 0xBE, 0x85, 0x46, 0x13,
+0xC0, 0xA4, 0xB9, 0xF4, 0xB7, 0xFE, 0xDD, 0xB7, 0xC2, 0x1F, 0xFD, 0xC1, 0x5F, 0xC3, 0x5C, 0x76,
+0x0A, 0x64, 0x04, 0x11, 0xDA, 0x58, 0xB8, 0xE7, 0xF8, 0x8B, 0x4C, 0xBF, 0x64, 0x25, 0xBF, 0xE3,
+0x28, 0x15, 0x3A, 0x2C, 0xCE, 0xC3, 0x58, 0xE0, 0x1E, 0x7D, 0xF8, 0x10, 0x92, 0x69, 0xCF, 0x86,
+0x0F, 0x40, 0x08, 0xFF, 0xFC, 0x4F, 0xBE, 0x1F, 0xCE, 0x9D, 0xBE, 0x14, 0x1E, 0x7B, 0xF4, 0x9E,
+0x70, 0xCF, 0x3D, 0x7B, 0xA3, 0x62, 0x45, 0x72, 0xF1, 0xED, 0xEF, 0xBD, 0x1C, 0x7E, 0x00, 0x55,
+0xEC, 0x43, 0x10, 0xBB, 0x19, 0x2C, 0xB8, 0x3F, 0x4F, 0xC5, 0x6E, 0xF3, 0xBA, 0x86, 0x16, 0xDC,
+0x8B, 0x58, 0x4C, 0xFF, 0xE5, 0xBF, 0xFA, 0xD3, 0xF0, 0x3E, 0x48, 0x66, 0x2F, 0x14, 0xB6, 0x2F,
+0x42, 0x35, 0xA3, 0xD2, 0x56, 0x7B, 0xCC, 0x43, 0x35, 0xA3, 0x49, 0xF2, 0x5F, 0xFE, 0xCF, 0x7F,
+0x11, 0xFE, 0x02, 0x0A, 0xD3, 0x11, 0x98, 0x90, 0xA9, 0x10, 0xCE, 0x79, 0xEA, 0x27, 0x5A, 0x5C,
+0x30, 0xAF, 0xB9, 0xE8, 0x9F, 0x3F, 0x77, 0x55, 0x88, 0xDA, 0xDE, 0x3D, 0xDB, 0x90, 0x30, 0xBD,
+0x23, 0xFC, 0xF6, 0xEF, 0xFE, 0x55, 0x78, 0x1D, 0x24, 0x81, 0xDB, 0x35, 0x7E, 0xE1, 0xB3, 0x0F,
+0x87, 0x3D, 0x20, 0xA6, 0x3C, 0xB8, 0xD8, 0xBF, 0x8B, 0x36, 0xFF, 0xEE, 0xEF, 0x7C, 0x27, 0x9C,
+0x45, 0xDF, 0x36, 0x6F, 0xDB, 0x14, 0xBE, 0x09, 0x12, 0xF5, 0x3C, 0xC8, 0xCE, 0x39, 0x10, 0x1B,
+0x9A, 0x69, 0x65, 0x13, 0x7B, 0xAE, 0x0B, 0x24, 0x96, 0x20, 0x8D, 0xA7, 0x40, 0x32, 0xF8, 0xFD,
+0xF6, 0x04, 0xD4, 0xAC, 0x6E, 0xA8, 0x58, 0xD7, 0x07, 0x47, 0x85, 0x8C, 0xB0, 0x5D, 0xCF, 0x81,
+0x7C, 0x9D, 0x83, 0xC9, 0x7A, 0x92, 0x7B, 0x40, 0xEB, 0x17, 0x92, 0x10, 0x90, 0x73, 0x68, 0xF7,
+0xB9, 0x4B, 0x83, 0xA2, 0xAA, 0x51, 0x35, 0xE4, 0x9E, 0xCC, 0xCB, 0x05, 0x16, 0x5C, 0x84, 0xC2,
+0xF8, 0x17, 0x50, 0x32, 0xFF, 0xED, 0x6F, 0x7F, 0x27, 0xBC, 0xF2, 0xFA, 0x61, 0x51, 0xC6, 0x98,
+0x0E, 0x4C, 0x7F, 0xED, 0x61, 0x0B, 0x40, 0xFC, 0x30, 0xA4, 0xD9, 0xFB, 0x1C, 0xC8, 0x23, 0xC9,
+0x39, 0x83, 0xCC, 0x1E, 0x79, 0xF8, 0x40, 0x5D, 0x52, 0x4C, 0xF2, 0x79, 0x1E, 0x38, 0x13, 0xE3,
+0x6F, 0x82, 0xC4, 0x5E, 0x00, 0x3E, 0xF7, 0x81, 0x40, 0xBF, 0x04, 0x15, 0xF6, 0x4F, 0xA1, 0xAE,
+0x7D, 0x00, 0xB2, 0x38, 0x06, 0xD2, 0x2B, 0x16, 0x00, 0x2E, 0xC2, 0x12, 0x00, 0x81, 0xF9, 0x0F,
+0x15, 0xEE, 0xEC, 0xC9, 0xF3, 0x61, 0x08, 0x73, 0xE1, 0xA9, 0xC7, 0xEF, 0x5D, 0xA0, 0xA4, 0x52,
+0x85, 0x3B, 0x83, 0xFB, 0xFF, 0xCF, 0xFF, 0xD3, 0x9F, 0x84, 0x77, 0xDE, 0x3B, 0x09, 0xE2, 0x76,
+0x29, 0x5C, 0x84, 0x0A, 0x4C, 0x9F, 0x62, 0xB6, 0x73, 0x68, 0x70, 0x2C, 0x9C, 0x47, 0xDF, 0x4F,
+0x83, 0xD8, 0x9D, 0x06, 0x79, 0xBA, 0x00, 0x53, 0x27, 0x55, 0xB1, 0x2F, 0x40, 0x2D, 0xCC, 0xC7,
+0x78, 0x0C, 0xDF, 0x8B, 0x3F, 0x04, 0xE6, 0xBF, 0xF5, 0xEF, 0xBF, 0x13, 0xBE, 0xF1, 0xCD, 0x9F,
+0x84, 0x37, 0x40, 0x92, 0x49, 0xB0, 0x27, 0x6C, 0x2F, 0x6D, 0xB6, 0x87, 0x70, 0x8E, 0xC0, 0x4F,
+0xF9, 0x23, 0x10, 0xE6, 0x77, 0x8F, 0x9E, 0x0E, 0x97, 0x31, 0x9F, 0x0F, 0xEE, 0xDF, 0x11, 0x36,
+0x92, 0x60, 0x37, 0xF0, 0x0B, 0x82, 0x58, 0xFD, 0x39, 0xEA, 0xFE, 0x37, 0xBF, 0xF5, 0x4D, 0xA8,
+0x96, 0x1F, 0x86, 0x8B, 0x57, 0xAE, 0x41, 0x7C, 0xE0, 0x38, 0xA5, 0x3E, 0xD3, 0x42, 0x32, 0xC2,
+0x31, 0xC6, 0xFC, 0xBF, 0x00, 0xB3, 0x32, 0x95, 0x41, 0xFA, 0x42, 0xFF, 0xFE, 0xFF, 0xFA, 0xD7,
+0x4A, 0xEC, 0xF0, 0xBA, 0x99, 0xA6, 0xD8, 0xC6, 0x9C, 0x19, 0x9A, 0xF0, 0xE5, 0xB1, 0xD2, 0x5B,
+0x50, 0x56, 0xBF, 0x08, 0x46, 0x7F, 0x15, 0x13, 0x80, 0x00, 0x2F, 0x1B, 0x44, 0x63, 0x8B, 0x53,
+0xF5, 0xB7, 0x0E, 0x17, 0xFA, 0x6C, 0x21, 0xF3, 0x46, 0x88, 0xB2, 0x66, 0xEB, 0x98, 0xA8, 0x42,
+0x79, 0xEB, 0x84, 0xAA, 0x45, 0x27, 0xFD, 0xCA, 0x9A, 0x67, 0x8B, 0xAD, 0x2A, 0x3D, 0x69, 0x31,
+0x94, 0xBA, 0xAC, 0x4E, 0xAD, 0xCA, 0x2A, 0xB4, 0x45, 0x54, 0x1C, 0x78, 0xD3, 0xD9, 0x74, 0x33,
+0x3B, 0x9F, 0x57, 0x17, 0x09, 0x89, 0xD5, 0xAF, 0x55, 0x68, 0x7B, 0xF3, 0xBE, 0x54, 0x4C, 0x6D,
+0xFC, 0xAC, 0xE1, 0x57, 0x19, 0x1D, 0xDE, 0x59, 0xEE, 0x22, 0x88, 0xF0, 0x4B, 0xEF, 0x1E, 0x0D,
+0xEF, 0x1C, 0x3B, 0x15, 0x46, 0xC6, 0x69, 0xF2, 0xBC, 0xB5, 0x47, 0x17, 0x16, 0xCB, 0xBD, 0xF8,
+0x85, 0x43, 0xF5, 0x10, 0xFB, 0xA6, 0x87, 0x79, 0x89, 0xB8, 0xD4, 0x2F, 0xC4, 0x88, 0x55, 0xCD,
+0x53, 0x79, 0x53, 0xFE, 0xD7, 0xFF, 0xEA, 0x0D, 0xA3, 0x55, 0x10, 0x3B, 0xE7, 0xD5, 0x29, 0xD6,
+0xD9, 0x48, 0x58, 0x5D, 0xC6, 0xE9, 0x6C, 0xEC, 0xF5, 0x7D, 0xFE, 0xB2, 0xE6, 0x36, 0x62, 0x73,
+0xF8, 0x42, 0xA4, 0x99, 0x7C, 0x2B, 0x08, 0x5D, 0x1F, 0x08, 0x4D, 0x23, 0x5F, 0x08, 0x1F, 0x07,
+0xD5, 0x69, 0xA8, 0x4C, 0x67, 0x06, 0xC7, 0xC3, 0x09, 0x28, 0x76, 0x57, 0xB0, 0x88, 0x4E, 0x31,
+0x92, 0x17, 0x26, 0x75, 0x26, 0xE1, 0xB6, 0x9F, 0x10, 0x5A, 0x7D, 0x9C, 0x43, 0xFA, 0x54, 0xBB,
+0x92, 0x4F, 0x58, 0xEB, 0x67, 0x36, 0xC7, 0x62, 0xCF, 0xE3, 0xB9, 0xEC, 0x0A, 0xC3, 0xA2, 0xD2,
+0xF6, 0x6C, 0x72, 0xD2, 0x24, 0xD2, 0x81, 0xF1, 0xA1, 0xF2, 0xB4, 0xA9, 0xBB, 0x1D, 0xCA, 0x65,
+0x4F, 0x53, 0x7C, 0x0D, 0x3F, 0x0E, 0x96, 0x8D, 0x5E, 0x4B, 0xE5, 0x8C, 0xC9, 0xA8, 0x69, 0xBA,
+0xF5, 0x07, 0xCD, 0xB2, 0xDC, 0xFF, 0x75, 0x18, 0x8A, 0x1A, 0xDF, 0xAF, 0x3D, 0xE8, 0x97, 0xC7,
+0x54, 0x3D, 0x54, 0xE6, 0xF8, 0x77, 0xCE, 0x7E, 0x48, 0x8C, 0x62, 0x01, 0x27, 0xA9, 0x23, 0x29,
+0x64, 0x9D, 0xF4, 0xB5, 0xAB, 0x73, 0xB9, 0x04, 0xC4, 0x9C, 0x18, 0x82, 0xAF, 0x30, 0x4C, 0xC0,
+0x34, 0x15, 0xBF, 0x7C, 0x71, 0x22, 0xBC, 0x0E, 0xB5, 0xEE, 0x38, 0x48, 0x1C, 0xAF, 0x65, 0x9D,
+0x24, 0x77, 0xEF, 0x5E, 0x85, 0xAF, 0x25, 0x4C, 0xBE, 0x2F, 0xD8, 0xFB, 0x6C, 0x13, 0xEB, 0xAC,
+0xD7, 0xA6, 0x46, 0xFB, 0xBB, 0x5C, 0x39, 0x4E, 0x05, 0x92, 0xAF, 0x17, 0x5E, 0x7E, 0x1F, 0xE6,
+0xC5, 0xB7, 0xC2, 0xCB, 0x20, 0x38, 0x5C, 0x6C, 0x19, 0x0D, 0xBE, 0x19, 0xE4, 0xEB, 0x20, 0x4C,
+0x79, 0x0F, 0x3F, 0x7C, 0x30, 0xDC, 0x77, 0x9F, 0x2A, 0x59, 0x34, 0x8D, 0xBE, 0xF9, 0x16, 0x54,
+0x13, 0xA8, 0x61, 0x3F, 0x79, 0xE5, 0x7D, 0xF1, 0x77, 0xA2, 0xB2, 0x73, 0x01, 0xFE, 0x63, 0x17,
+0x40, 0x5A, 0xA8, 0x9A, 0xE5, 0xDF, 0x4B, 0xCC, 0xB1, 0x39, 0x08, 0x72, 0x73, 0x01, 0x0B, 0xF1,
+0x59, 0x2C, 0xF2, 0x17, 0xA1, 0xBC, 0x90, 0x30, 0x35, 0x7A, 0x50, 0xAD, 0xA1, 0xEA, 0xC3, 0x85,
+0x9C, 0xE4, 0x53, 0x88, 0x54, 0xCD, 0xC1, 0x7B, 0x5C, 0x04, 0xB1, 0x79, 0xFE, 0x27, 0xEF, 0x48,
+0x1F, 0x5E, 0x7F, 0xF3, 0xA8, 0x98, 0x28, 0x69, 0x36, 0xBD, 0x1F, 0x8B, 0xED, 0xC3, 0x20, 0x59,
+0x0F, 0x3D, 0x74, 0x30, 0x1C, 0xB8, 0x6B, 0xA7, 0xF8, 0x8D, 0xD1, 0x6F, 0xF0, 0x47, 0x3F, 0x79,
+0x1B, 0x2A, 0xD4, 0xDB, 0x50, 0xA7, 0x2E, 0x87, 0x4B, 0x30, 0xA7, 0xD2, 0x6F, 0x8E, 0x64, 0x49,
+0x92, 0xE0, 0xDB, 0x41, 0x6C, 0xC6, 0x41, 0x2A, 0xD8, 0x66, 0xAA, 0x58, 0x34, 0x29, 0x3F, 0x0F,
+0x45, 0x93, 0x7E, 0x6C, 0xFC, 0x1E, 0x61, 0xFD, 0x87, 0xEE, 0xDE, 0x23, 0xD8, 0xEC, 0x84, 0x9A,
+0x47, 0x7F, 0xB4, 0x37, 0x41, 0xE2, 0x7E, 0x08, 0x6C, 0x5E, 0x03, 0x46, 0x34, 0xEF, 0xBE, 0x06,
+0xD2, 0xF5, 0xFD, 0x1F, 0xBC, 0x2E, 0xAA, 0x25, 0xD5, 0x25, 0xFE, 0x28, 0xBA, 0x0B, 0xED, 0xB8,
+0x1F, 0xCA, 0xE0, 0x7E, 0x10, 0x0F, 0xAA, 0x5A, 0x87, 0x61, 0xEE, 0x7C, 0x0E, 0xED, 0xF9, 0xFE,
+0x0F, 0xA0, 0x42, 0xBD, 0xFE, 0xA1, 0x98, 0x87, 0x17, 0xF3, 0x9E, 0xA2, 0xC2, 0xF8, 0x2E, 0xCC,
+0x7F, 0x3F, 0x66, 0x5F, 0x9F, 0x7B, 0x13, 0xED, 0x79, 0x07, 0x64, 0xF2, 0x82, 0x10, 0xE9, 0x83,
+0x07, 0x76, 0xA3, 0x9F, 0x07, 0xC2, 0xDD, 0xF7, 0xEE, 0x0E, 0xEB, 0xD6, 0xF5, 0x40, 0x1D, 0x1D,
+0x16, 0x35, 0x91, 0x63, 0x4A, 0x85, 0xF1, 0x85, 0x57, 0x3E, 0x10, 0x7F, 0xB6, 0xFC, 0x77, 0x9D,
+0x7E, 0xBD, 0xF0, 0x07, 0x26, 0x7C, 0xEC, 0x40, 0xDE, 0xD8, 0x57, 0x92, 0xB1, 0x37, 0xDE, 0x39,
+0x86, 0x36, 0xBF, 0x8D, 0xB1, 0x3E, 0x2A, 0x04, 0x71, 0xFB, 0xF6, 0xCD, 0xD2, 0x4F, 0xB6, 0xFB,
+0xD0, 0xC1, 0xDD, 0x50, 0x24, 0xD7, 0x87, 0x41, 0xCC, 0x85, 0xB7, 0x40, 0x7C, 0xD9, 0xDF, 0x97,
+0x40, 0x86, 0x48, 0xF4, 0x16, 0x7C, 0x76, 0x30, 0x7E, 0x57, 0xAF, 0x0F, 0x41, 0x11, 0x1C, 0xC4,
+0x8F, 0x85, 0x41, 0x51, 0x45, 0x25, 0x53, 0x01, 0x86, 0x91, 0x24, 0x89, 0xBE, 0x93, 0x54, 0x0B,
+0xF9, 0xB8, 0x82, 0x32, 0xBC, 0x97, 0xFB, 0x5E, 0xB3, 0x2E, 0x8E, 0x07, 0x95, 0xBA, 0x1F, 0xA2,
+0xFD, 0xF4, 0xCD, 0x23, 0xFE, 0x47, 0xE1, 0x5B, 0xC7, 0x32, 0xFB, 0xF6, 0x6D, 0x97, 0xFE, 0x72,
+0x8C, 0xB7, 0x6E, 0xDD, 0x10, 0xAE, 0xC3, 0x1C, 0xFA, 0x16, 0xF0, 0xFF, 0x11, 0xB0, 0xF9, 0x3E,
+0x48, 0x34, 0xE7, 0x03, 0x7F, 0x18, 0xD4, 0x9B, 0x33, 0x79, 0x3B, 0x87, 0x30, 0x7F, 0x5F, 0x43,
+0x3F, 0x05, 0x4F, 0x8C, 0x13, 0x15, 0x5E, 0xF2, 0x81, 0xBD, 0xB0, 0x78, 0xDD, 0x0F, 0xD3, 0xEB,
+0x7D, 0xE8, 0xF3, 0x01, 0xDC, 0x6B, 0x33, 0x72, 0x79, 0x92, 0xBC, 0xBF, 0x0B, 0x73, 0x32, 0x89,
+0xE6, 0x4F, 0x5E, 0x78, 0x57, 0xDA, 0xCC, 0xFE, 0xE8, 0xF7, 0x74, 0xA3, 0xB3, 0xFA, 0xE6, 0x94,
+0xFB, 0xC4, 0x12, 0xBB, 0x21, 0x4C, 0x82, 0x0F, 0x21, 0xD1, 0x32, 0x49, 0x2D, 0x7D, 0x3C, 0x44,
+0xB9, 0xA9, 0x01, 0x4F, 0xB5, 0x0B, 0x5B, 0xF8, 0x3D, 0x10, 0x82, 0x2A, 0x84, 0xAF, 0x80, 0xA2,
+0x50, 0x98, 0x99, 0xC9, 0x99, 0xBB, 0xFC, 0xAA, 0xF1, 0x2B, 0x93, 0x29, 0x4F, 0xC9, 0x03, 0x1F,
+0x2A, 0xC3, 0x45, 0xA5, 0x88, 0x8B, 0x23, 0xEB, 0xC6, 0x78, 0x68, 0x1B, 0x54, 0x75, 0xF3, 0x5C,
+0x78, 0x22, 0x30, 0x71, 0x5C, 0x5D, 0x0D, 0x31, 0xD3, 0x69, 0x8C, 0x68, 0x25, 0xE1, 0x73, 0x45,
+0xCF, 0xEA, 0x92, 0xE0, 0x07, 0x7B, 0x9E, 0xFF, 0x55, 0x53, 0xB0, 0xB6, 0x43, 0xD5, 0x15, 0xBD,
+0x8F, 0xD7, 0x5D, 0x2F, 0x82, 0x51, 0xFB, 0x4A, 0xD3, 0x1D, 0x74, 0xBB, 0x6E, 0x98, 0x0F, 0x61,
+0x86, 0x6D, 0x65, 0xD2, 0xE2, 0x93, 0x67, 0xC3, 0x5F, 0x3E, 0xFF, 0x46, 0x38, 0x8F, 0x5F, 0x49,
+0xB7, 0xFA, 0xA0, 0x49, 0x93, 0xD1, 0xB1, 0xBD, 0x48, 0x97, 0x41, 0x53, 0x2C, 0x53, 0x9E, 0xF0,
+0x97, 0xA5, 0xF0, 0x89, 0xC8, 0x56, 0x08, 0xA4, 0xF9, 0x81, 0x09, 0x36, 0x54, 0xEB, 0xF8, 0x5A,
+0xCD, 0x53, 0x9A, 0xF7, 0xCF, 0xC7, 0xC8, 0xFE, 0x12, 0x2F, 0x93, 0xB4, 0x62, 0x54, 0xB1, 0x95,
+0x8B, 0xB9, 0x03, 0x65, 0xBC, 0xF5, 0xFA, 0x6A, 0x2E, 0x38, 0xA5, 0x79, 0x6D, 0x50, 0xEB, 0x5A,
+0x41, 0x8A, 0xE9, 0xFB, 0xC4, 0xD7, 0x07, 0x36, 0xF5, 0x41, 0x2D, 0x59, 0xFD, 0xA0, 0x89, 0x31,
+0xFC, 0x52, 0x7E, 0xED, 0x1C, 0xBE, 0xFC, 0xCF, 0xC3, 0x71, 0x9B, 0x69, 0x4E, 0xD0, 0xCE, 0x19,
+0x28, 0x76, 0x0C, 0x2E, 0x71, 0x5F, 0xCF, 0xB8, 0x37, 0xB1, 0xF7, 0x33, 0xF6, 0x57, 0x26, 0xB9,
+0xCE, 0x13, 0xEB, 0x5F, 0xBE, 0x2F, 0xAC, 0xCC, 0x29, 0xC1, 0x4C, 0xF1, 0x15, 0x15, 0x3C, 0x9E,
+0xB3, 0x0F, 0x52, 0x86, 0xA5, 0xCF, 0x31, 0x8E, 0x07, 0xE7, 0x4F, 0x07, 0x30, 0xE9, 0x04, 0xE1,
+0xDD, 0x89, 0x9D, 0x26, 0xFA, 0xBA, 0xF4, 0xB3, 0x57, 0x35, 0xED, 0xDE, 0xEA, 0x19, 0x75, 0x63,
+0xF7, 0xA7, 0x98, 0x46, 0x93, 0xEB, 0x16, 0xEC, 0x50, 0xB1, 0x05, 0xFD, 0xDA, 0x84, 0x07, 0x4D,
+0xAF, 0x24, 0x32, 0x8B, 0xE5, 0xB2, 0x93, 0xFC, 0x86, 0x50, 0xCF, 0xFA, 0xF0, 0xE3, 0x84, 0x26,
+0x5E, 0xDD, 0xB1, 0x83, 0x81, 0x16, 0x4C, 0x90, 0x4C, 0x13, 0x2C, 0x4C, 0x33, 0x28, 0x44, 0x81,
+0xAD, 0xFA, 0xA3, 0x52, 0xDB, 0x38, 0x0A, 0x73, 0xED, 0x73, 0x67, 0xC7, 0xC3, 0x37, 0x4E, 0x8C,
+0x84, 0xE3, 0x20, 0x78, 0x0C, 0x94, 0x10, 0x8D, 0x1D, 0x85, 0xD7, 0xA1, 0x2D, 0x1B, 0xD1, 0x06,
+0xAA, 0x7C, 0xC4, 0x9E, 0xE9, 0x7C, 0xDE, 0xBA, 0x3C, 0x15, 0x7E, 0xFF, 0xF0, 0x48, 0x78, 0xE7,
+0x2A, 0xB6, 0x98, 0x03, 0xE9, 0x63, 0xDA, 0x9E, 0xD5, 0x3A, 0xA8, 0x74, 0x9D, 0x85, 0xB3, 0xF8,
+0x6F, 0xFD, 0xFB, 0xEF, 0x86, 0x77, 0x60, 0x56, 0x9C, 0xC6, 0x84, 0xA1, 0x1B, 0xC7, 0xAE, 0x9D,
+0x9B, 0x85, 0xD0, 0xFD, 0xEC, 0x57, 0x9F, 0x0E, 0x7F, 0xE7, 0x37, 0x7E, 0x2A, 0xFC, 0xF2, 0x2F,
+0x7D, 0x21, 0x3C, 0x01, 0x55, 0xA6, 0x1B, 0x26, 0x43, 0x9A, 0xA1, 0x8F, 0xC1, 0x9F, 0xEB, 0xDF,
+0xFE, 0xEE, 0xF7, 0xE0, 0x3B, 0x77, 0x1A, 0x8B, 0x2F, 0x66, 0x6C, 0x1B, 0xCC, 0xF4, 0xFC, 0x1C,
+0xD5, 0xF8, 0x71, 0x11, 0x0F, 0x9A, 0x50, 0x5B, 0x60, 0xB2, 0x83, 0x5D, 0x4C, 0xCA, 0x24, 0xFF,
+0xE7, 0x06, 0x7A, 0xC5, 0x0A, 0x60, 0x9E, 0x6B, 0xC1, 0x0F, 0x2D, 0x26, 0x0F, 0xAF, 0x27, 0xBE,
+0x90, 0x28, 0xBE, 0x07, 0xB2, 0xF3, 0xEF, 0x7F, 0xE7, 0xDB, 0xE2, 0x13, 0x47, 0x74, 0xD9, 0xCE,
+0xC7, 0xE1, 0xFB, 0xF5, 0xB7, 0xD0, 0xEE, 0xBF, 0xF7, 0x77, 0x7F, 0x3A, 0xFC, 0xC6, 0x6F, 0x7C,
+0x25, 0x7C, 0x15, 0x7E, 0x75, 0xFB, 0xF6, 0x6E, 0x0B, 0xDC, 0xF5, 0x4D, 0x7C, 0xDE, 0xBE, 0xFB,
+0x22, 0x4C, 0x84, 0x1F, 0x89, 0xF9, 0xAF, 0x1D, 0xCA, 0x5D, 0x3B, 0x06, 0xB4, 0xF6, 0xC7, 0x9C,
+0x98, 0x45, 0xF1, 0x3E, 0x62, 0x5C, 0x84, 0xBC, 0xD0, 0x74, 0x48, 0x7C, 0xF6, 0xED, 0xDB, 0x19,
+0x9E, 0x80, 0xBF, 0xE1, 0xD7, 0xBE, 0xF6, 0x99, 0xF0, 0x4B, 0xBF, 0xF8, 0xF9, 0xF0, 0x19, 0xF8,
+0x85, 0x51, 0x51, 0x9C, 0x41, 0x03, 0x8F, 0x42, 0x31, 0xFA, 0xE3, 0x6F, 0xFC, 0x48, 0x02, 0x0E,
+0xFE, 0xF0, 0x0F, 0xFF, 0x3A, 0xFC, 0x31, 0x54, 0xAF, 0xEB, 0x50, 0x40, 0x69, 0xAA, 0xDC, 0xBD,
+0x67, 0x6B, 0xF8, 0xA9, 0x9F, 0x7A, 0x32, 0xFC, 0xF2, 0x2F, 0x3F, 0x1B, 0xBE, 0xFC, 0xA5, 0x27,
+0xC2, 0x76, 0xF8, 0xF3, 0x91, 0x6C, 0x5E, 0x05, 0x41, 0xF8, 0x7D, 0x98, 0xF4, 0x7E, 0xE7, 0x77,
+0xBE, 0x1B, 0xCE, 0x61, 0x3C, 0x64, 0x3B, 0xC1, 0x3A, 0xC7, 0x35, 0x90, 0xDB, 0xDF, 0xFF, 0xD3,
+0xE7, 0xC2, 0xBF, 0xFE, 0xB7, 0xDF, 0x0A, 0x2F, 0xBC, 0xF8, 0x9E, 0xA4, 0x8C, 0xA2, 0x69, 0xF0,
+0xD0, 0x81, 0x5D, 0xE1, 0x67, 0xBE, 0xFA, 0x54, 0xF8, 0xF5, 0x5F, 0xFB, 0x72, 0xF8, 0x3A, 0x14,
+0xD1, 0x07, 0x69, 0xCE, 0xA4, 0xDF, 0x1B, 0x49, 0x1B, 0x1E, 0xEF, 0x00, 0x9F, 0xDF, 0x42, 0xDD,
+0x24, 0xC8, 0x1C, 0xF3, 0xFC, 0x30, 0x7B, 0x8F, 0xAA, 0x84, 0x18, 0x9F, 0x11, 0xCC, 0xC1, 0xEF,
+0xC3, 0xDC, 0xF9, 0xCE, 0xBB, 0x1F, 0x49, 0x12, 0xF7, 0x01, 0xF8, 0x45, 0x3E, 0xFD, 0xF4, 0xFD,
+0xE8, 0xE7, 0xE7, 0x64, 0x1E, 0xFC, 0x0C, 0xE6, 0xC4, 0x43, 0x20, 0x3C, 0x5D, 0x98, 0xF7, 0xB3,
+0xB8, 0x84, 0xA6, 0xCA, 0xDF, 0x81, 0xB9, 0x9C, 0x24, 0xAD, 0xF6, 0xE0, 0x0F, 0xE6, 0xEE, 0x75,
+0xEB, 0xC3, 0x06, 0x10, 0xAF, 0x4D, 0x5B, 0x37, 0x86, 0x81, 0x01, 0x58, 0x45, 0x6C, 0x1D, 0xED,
+0x87, 0xAB, 0xCB, 0xA6, 0x6D, 0x38, 0xBF, 0x6D, 0x23, 0xDE, 0xDF, 0x18, 0xD6, 0xE3, 0xEF, 0x00,
+0x7E, 0xFC, 0xE7, 0xFE, 0xE8, 0x24, 0x5D, 0xDF, 0x84, 0x8F, 0xDE, 0x5F, 0x7D, 0xF7, 0x65, 0xD4,
+0x8F, 0x40, 0x13, 0x7E, 0x4E, 0x51, 0xC1, 0x0E, 0xCC, 0xCF, 0x2F, 0x7D, 0xE9, 0x71, 0xF4, 0xF7,
+0x2B, 0xE1, 0x57, 0x7E, 0xE9, 0xD9, 0xF0, 0x29, 0x8C, 0x45, 0x0F, 0xB6, 0x3C, 0xA4, 0xAA, 0x4C,
+0x82, 0xF9, 0x21, 0x4C, 0xBF, 0xBF, 0xFB, 0xBB, 0xDF, 0x85, 0x69, 0xFE, 0x84, 0xA8, 0xB4, 0x4B,
+0x1D, 0x54, 0x7A, 0x7F, 0xEF, 0x8F, 0x7E, 0x00, 0xB2, 0xFC, 0xB6, 0xE4, 0x43, 0xE5, 0x77, 0xC4,
+0x4E, 0xF8, 0x28, 0x3E, 0xFB, 0xEC, 0xA3, 0xE1, 0x57, 0xFF, 0xD6, 0xB3, 0xA8, 0xFF, 0x0B, 0xE1,
+0x2B, 0x18, 0xAB, 0x47, 0x1F, 0xB9, 0x1B, 0xE6, 0x57, 0xFA, 0x86, 0xB6, 0xE0, 0x87, 0xCC, 0x55,
+0x8C, 0xED, 0xF7, 0xC5, 0x0D, 0xA1, 0xF1, 0x9F, 0x29, 0x0D, 0xCC, 0xF7, 0x15, 0x14, 0xF9, 0xC4,
+0x99, 0x62, 0x65, 0x79, 0xC5, 0x07, 0xE4, 0xDC, 0x95, 0xEB, 0xE1, 0xDB, 0x2F, 0xE0, 0x17, 0xD8,
+0x91, 0x93, 0xBA, 0x2B, 0x00, 0xCF, 0x1B, 0x29, 0xCB, 0xFB, 0x2F, 0x7E, 0x58, 0xF1, 0x84, 0x99,
+0x61, 0xFD, 0xCB, 0x50, 0x6D, 0xA2, 0xC6, 0x08, 0xAD, 0x94, 0x33, 0x34, 0x59, 0x40, 0x93, 0x99,
+0x53, 0x8B, 0xC9, 0x9B, 0xFA, 0x0D, 0x2D, 0xC5, 0xA9, 0x2A, 0x19, 0x11, 0x8C, 0xC4, 0x90, 0xEF,
+0x7B, 0x30, 0x85, 0x97, 0xF5, 0xBA, 0x75, 0x31, 0x15, 0xD3, 0x98, 0x9B, 0x14, 0x8D, 0xA4, 0x49,
+0x13, 0xA5, 0x2E, 0x7B, 0xDF, 0xD8, 0xA3, 0x9B, 0x57, 0xD5, 0x2F, 0x2C, 0xD5, 0x63, 0xF6, 0x5C,
+0xA9, 0x47, 0xA8, 0xA4, 0x93, 0x1D, 0xEB, 0x9B, 0x97, 0xD5, 0x74, 0x1D, 0x38, 0x44, 0x22, 0xC7,
+0x6A, 0x03, 0xD5, 0xA7, 0x05, 0x01, 0x0A, 0xA3, 0x50, 0xEA, 0xE8, 0x38, 0xBC, 0x15, 0xBF, 0xAE,
+0xE8, 0x6B, 0xD0, 0xCF, 0x68, 0xB4, 0x26, 0x10, 0x96, 0x7A, 0x73, 0x93, 0x6D, 0xA5, 0x89, 0xE2,
+0x85, 0x93, 0xD7, 0xA0, 0x54, 0x8C, 0x8B, 0x8A, 0x31, 0x3F, 0x31, 0x82, 0x2C, 0xB8, 0x33, 0x4A,
+0x8A, 0xD9, 0x3F, 0x85, 0xD5, 0x21, 0x8A, 0xA6, 0x6C, 0xED, 0xAE, 0x13, 0x5D, 0x1D, 0x13, 0x1B,
+0x99, 0x38, 0x46, 0xAE, 0x9E, 0x46, 0x33, 0xB7, 0x90, 0x63, 0x35, 0x8F, 0xDB, 0x30, 0xEA, 0x3D,
+0xE2, 0xF7, 0xA5, 0x13, 0x75, 0x2C, 0xC8, 0xDD, 0xDD, 0xA1, 0x15, 0x66, 0xC7, 0x79, 0x7C, 0x61,
+0xD3, 0x7F, 0xE8, 0x17, 0x60, 0x86, 0xBD, 0x7F, 0xFB, 0xC0, 0xAA, 0xA7, 0x3B, 0xB9, 0x0A, 0x35,
+0xE0, 0x2F, 0x3F, 0xB8, 0x18, 0x5E, 0x3C, 0x73, 0x1D, 0xA6, 0x38, 0xFC, 0xDA, 0xC5, 0x58, 0xB5,
+0x22, 0x22, 0x96, 0x7F, 0xD9, 0x6A, 0x6F, 0xAB, 0x6F, 0x65, 0x27, 0xE7, 0x0C, 0x5C, 0x9D, 0x46,
+0x3A, 0xF3, 0xBD, 0x7F, 0x3A, 0xBF, 0xD2, 0x27, 0x41, 0xDE, 0x15, 0x40, 0x0D, 0x3F, 0xBF, 0x5A,
+0xA6, 0xAC, 0x7D, 0x6A, 0x64, 0xBA, 0xDB, 0x9C, 0xB7, 0xBA, 0xBB, 0x80, 0x47, 0xDF, 0xC0, 0x7A,
+0x38, 0x35, 0xB7, 0x85, 0x4F, 0xED, 0xDE, 0x10, 0xBE, 0x70, 0x68, 0x6B, 0xE8, 0xC7, 0xC2, 0xEA,
+0x9F, 0xCB, 0x7A, 0xE3, 0x7B, 0xAB, 0xCF, 0xD5, 0x9A, 0x62, 0x49, 0x94, 0x7E, 0xB1, 0x4E, 0x54,
+0x2C, 0x7D, 0xD8, 0xA8, 0x84, 0xD1, 0x87, 0x8D, 0x01, 0x0F, 0x9B, 0x7A, 0x5A, 0xC5, 0x1C, 0xCB,
+0x8F, 0xCE, 0xC3, 0x9B, 0xBA, 0xC2, 0xE3, 0xD8, 0xEF, 0xB5, 0x6A, 0x8A, 0xA5, 0xC2, 0x37, 0x27,
+0x26, 0x58, 0xFA, 0xCF, 0x91, 0x08, 0x5E, 0xC3, 0x2A, 0x4F, 0x98, 0xF7, 0x0D, 0xB4, 0x63, 0x7F,
+0xDA, 0xCE, 0x70, 0x17, 0xEA, 0x79, 0x08, 0x41, 0x17, 0x7B, 0x91, 0xB0, 0x98, 0xBB, 0x51, 0x74,
+0x64, 0xA6, 0xD8, 0x29, 0x28, 0x6E, 0xEF, 0xC3, 0xE4, 0xFA, 0x97, 0x27, 0xC6, 0xC4, 0xFC, 0xCB,
+0x76, 0xB2, 0xFE, 0x5D, 0x7D, 0x70, 0x9C, 0x47, 0xA0, 0xC4, 0x7D, 0xB8, 0x8E, 0xED, 0xD8, 0x0C,
+0x65, 0x94, 0x84, 0x93, 0x43, 0x44, 0x15, 0x90, 0x6A, 0xA2, 0xF8, 0xD9, 0xE1, 0xD4, 0x7A, 0x98,
+0x78, 0x79, 0x4D, 0x03, 0x16, 0xA5, 0x15, 0x0F, 0xC3, 0xE8, 0xE8, 0x44, 0xF8, 0x2B, 0x04, 0x03,
+0xD0, 0xCC, 0x45, 0x85, 0x69, 0xDB, 0xF6, 0x8D, 0xE1, 0x49, 0x10, 0xBA, 0x27, 0x3F, 0x75, 0x3F,
+0x4C, 0x77, 0x87, 0xC4, 0x31, 0xFE, 0x11, 0xA8, 0x22, 0xBB, 0x60, 0x9E, 0xEC, 0xC5, 0xF7, 0x07,
+0x4D, 0xB3, 0xB3, 0x30, 0x6F, 0x72, 0x11, 0x67, 0x14, 0xE3, 0x3A, 0x2C, 0xD4, 0x54, 0xD2, 0xDE,
+0x02, 0x71, 0x20, 0x41, 0xE1, 0x02, 0x48, 0x07, 0x73, 0x8F, 0x9A, 0xA5, 0x82, 0xF7, 0x63, 0xA8,
+0x2C, 0xEF, 0xC0, 0xCC, 0x47, 0x32, 0xB5, 0x65, 0xD3, 0xBA, 0xF0, 0x77, 0xB0, 0x18, 0x6F, 0xC3,
+0x42, 0xDF, 0x88, 0x49, 0x9F, 0x91, 0xB4, 0xBF, 0xFB, 0x47, 0x7F, 0x13, 0x06, 0xF1, 0x23, 0xFF,
+0x9E, 0x43, 0x7B, 0xC2, 0xCF, 0xFD, 0xD4, 0xA7, 0x24, 0x92, 0xD2, 0x0F, 0xAA, 0x31, 0x57, 0xA0,
+0xD6, 0x7D, 0xE3, 0x9B, 0xCF, 0x87, 0x3F, 0xFA, 0xD3, 0x1F, 0xCA, 0x3D, 0xF6, 0xC2, 0xA4, 0x49,
+0x12, 0xFA, 0x95, 0x2F, 0x3E, 0x1E, 0x3E, 0x03, 0x42, 0x72, 0xDF, 0xBD, 0x7B, 0x41, 0xE8, 0xA0,
+0xB8, 0xE0, 0xDE, 0x6C, 0x23, 0xBF, 0x47, 0xAF, 0x82, 0x30, 0x5C, 0x87, 0x52, 0xD7, 0x8F, 0xBA,
+0x24, 0x6A, 0x13, 0x7D, 0xD9, 0x8A, 0x68, 0xC6, 0xAF, 0x83, 0xB4, 0xEC, 0x83, 0x89, 0x96, 0x87,
+0xFB, 0xD8, 0xD1, 0x37, 0x6E, 0x10, 0x64, 0x61, 0x10, 0xD7, 0xD0, 0xD1, 0x9F, 0xF8, 0x3C, 0xF3,
+0xCC, 0x43, 0x30, 0x3B, 0xDF, 0x1D, 0x9E, 0x78, 0xEC, 0xEE, 0x70, 0x37, 0x02, 0x32, 0xE8, 0xBF,
+0xC6, 0x0C, 0x0E, 0x24, 0x22, 0x54, 0x35, 0xB9, 0x73, 0x4C, 0x2F, 0x5C, 0x60, 0xBE, 0x0B, 0xD3,
+0xAD, 0xF8, 0x07, 0xE2, 0x7B, 0xE5, 0x3E, 0xA8, 0x7B, 0x9F, 0x87, 0x29, 0xF9, 0x8B, 0x5F, 0x78,
+0x2C, 0x3C, 0x08, 0xF5, 0x6B, 0x1B, 0xC8, 0x8C, 0xEC, 0x0B, 0x0D, 0x8C, 0xAE, 0x42, 0x6D, 0x3A,
+0x0F, 0xD2, 0x45, 0x12, 0x72, 0x10, 0x8A, 0xD8, 0xDD, 0x0C, 0x40, 0xA9, 0x09, 0xC0, 0xA0, 0x5A,
+0xF7, 0xFC, 0x4B, 0xEF, 0x86, 0xDF, 0x85, 0xCF, 0xDA, 0xCB, 0xF0, 0xAD, 0xBB, 0x8A, 0x7E, 0xAF,
+0x87, 0xA9, 0xF1, 0x49, 0x28, 0x92, 0x9F, 0x45, 0xBD, 0x9F, 0x43, 0x60, 0xC9, 0xC3, 0x30, 0xA1,
+0xEE, 0x00, 0x59, 0xA4, 0x19, 0xB8, 0x07, 0xD7, 0xAF, 0x43, 0xFF, 0xB8, 0xC6, 0x31, 0x7A, 0x93,
+0x69, 0xC3, 0xEE, 0x47, 0x40, 0xC5, 0xDD, 0x20, 0x81, 0x79, 0xDD, 0xD3, 0x50, 0x9B, 0x49, 0x9A,
+0xE8, 0x87, 0xF8, 0x02, 0x7C, 0x2B, 0x07, 0x71, 0x9F, 0x21, 0xF8, 0xE6, 0xD1, 0xEC, 0xBE, 0x67,
+0xF7, 0xB6, 0xF0, 0x34, 0xE6, 0xC2, 0x97, 0x9F, 0x7D, 0x4C, 0xE6, 0x02, 0x55, 0x4F, 0x92, 0x9E,
+0x7E, 0xFC, 0xE0, 0x9B, 0xC3, 0x75, 0x34, 0xC3, 0x0E, 0xC2, 0xA2, 0x36, 0x0A, 0x7C, 0x9E, 0x7C,
+0xEC, 0x1E, 0x60, 0xB7, 0x35, 0x8B, 0x2A, 0x56, 0x92, 0x75, 0x12, 0x26, 0x56, 0x5E, 0x73, 0x17,
+0x54, 0x2F, 0xFA, 0x36, 0x5E, 0x84, 0xBA, 0xCB, 0x71, 0x78, 0xFC, 0x91, 0x83, 0x12, 0x49, 0xCA,
+0x3A, 0xA9, 0x5E, 0x1E, 0x38, 0xB0, 0x23, 0x3C, 0x8E, 0x39, 0xF7, 0xE4, 0x63, 0x87, 0x30, 0xD7,
+0xBA, 0x60, 0x5A, 0x9E, 0x0E, 0x6F, 0xBD, 0x73, 0x3C, 0xFC, 0x7B, 0x10, 0xDE, 0x57, 0x5F, 0x3B,
+0x2C, 0x16, 0x8D, 0x0D, 0x08, 0x52, 0x79, 0x08, 0xA6, 0xFE, 0x4F, 0x23, 0xFA, 0x94, 0x38, 0x3E,
+0x8E, 0x31, 0xD8, 0xB3, 0x1B, 0x73, 0x93, 0x3F, 0x38, 0x98, 0x88, 0x1E, 0x44, 0x94, 0x91, 0xDD,
+0xF4, 0xE5, 0x1C, 0xC2, 0x38, 0xEC, 0x41, 0x76, 0x88, 0xFB, 0xEE, 0xDD, 0x27, 0xFE, 0x8B, 0xB5,
+0xF3, 0x8D, 0x78, 0x32, 0xB2, 0xF6, 0xC7, 0x20, 0xC8, 0x7F, 0xF8, 0x67, 0xCF, 0x09, 0x21, 0xEF,
+0x03, 0x5E, 0x8F, 0xA1, 0x4D, 0xAC, 0xFF, 0x0B, 0xC0, 0xF4, 0x31, 0xB4, 0x91, 0x26, 0x72, 0x2A,
+0x82, 0x9C, 0x3F, 0xE2, 0x3B, 0x8A, 0xAF, 0x4B, 0x2A, 0x8C, 0xD7, 0x31, 0xEF, 0xD7, 0xA3, 0x3D,
+0x6F, 0x63, 0x7C, 0xA7, 0xF0, 0x99, 0x68, 0xB6, 0x29, 0xF6, 0x13, 0x47, 0xEC, 0x7C, 0x00, 0x8E,
+0x41, 0x12, 0xFE, 0xFD, 0xEF, 0xC3, 0x29, 0x17, 0xDB, 0x64, 0xF1, 0x4B, 0x8D, 0x7B, 0xA3, 0xA6,
+0xA5, 0x2D, 0x7D, 0x87, 0xC5, 0xE5, 0x9B, 0xEB, 0x93, 0x44, 0xAC, 0x2A, 0x31, 0x94, 0xF5, 0x4C,
+0x54, 0x1F, 0x5F, 0xFC, 0xF4, 0x9C, 0xFB, 0x5A, 0xE9, 0x9A, 0x67, 0x44, 0xD0, 0xD6, 0xBF, 0xE8,
+0x9B, 0xA7, 0x95, 0xC4, 0x3A, 0x94, 0x48, 0x58, 0x20, 0x86, 0xAF, 0x9D, 0x59, 0xDD, 0xCA, 0x15,
+0xF5, 0x8D, 0x79, 0x0B, 0xB7, 0xE4, 0x2F, 0x53, 0x25, 0x16, 0xEE, 0xE0, 0xAE, 0x65, 0x9C, 0x7C,
+0x54, 0xEB, 0xB3, 0x76, 0x38, 0x69, 0xB1, 0xB6, 0x59, 0x67, 0xB4, 0xDF, 0xFE, 0xCD, 0x6E, 0xF7,
+0x8D, 0x1C, 0xA5, 0xE6, 0x3C, 0x23, 0x19, 0xE1, 0xC9, 0x2B, 0x79, 0xFF, 0xC6, 0xE0, 0x64, 0x7B,
+0x71, 0x70, 0x48, 0x3E, 0x78, 0xF7, 0xC3, 0xB1, 0x79, 0xA0, 0x77, 0x65, 0x91, 0x57, 0x2B, 0x5E,
+0x29, 0x96, 0xB8, 0x80, 0xA6, 0xC7, 0xE3, 0x57, 0xC7, 0xC2, 0xCB, 0xE7, 0xA0, 0x50, 0x81, 0xE4,
+0xB5, 0x4E, 0x4F, 0x86, 0x56, 0x10, 0x50, 0x7E, 0xF1, 0x38, 0x1F, 0xF1, 0xB1, 0x53, 0x45, 0x55,
+0x0F, 0xE9, 0x5E, 0xD6, 0xC7, 0xC8, 0xD6, 0xF4, 0x8D, 0xC4, 0x7F, 0x05, 0x17, 0xBB, 0xC6, 0xCE,
+0x27, 0x66, 0x67, 0x14, 0xC8, 0x99, 0x9E, 0x95, 0x65, 0x34, 0x6D, 0x1B, 0xF6, 0xAF, 0x6D, 0xE9,
+0xE8, 0x82, 0x12, 0xD1, 0x22, 0x01, 0x02, 0xFF, 0x9B, 0x27, 0xF6, 0x86, 0x3D, 0xD8, 0x2D, 0x63,
+0xB5, 0x4D, 0xB1, 0x97, 0x46, 0xA6, 0xC2, 0xEF, 0xBC, 0x71, 0x3A, 0xBC, 0x0C, 0x62, 0x37, 0x06,
+0x3C, 0x98, 0xA3, 0xB1, 0x7D, 0x02, 0xCE, 0xCE, 0x42, 0x4A, 0xA3, 0x2B, 0x0B, 0x88, 0x6E, 0x9C,
+0x45, 0xD2, 0x9D, 0xF8, 0xBB, 0xC4, 0xFB, 0xEB, 0x27, 0x4D, 0xE9, 0xF3, 0x3E, 0xA7, 0x60, 0x13,
+0xFB, 0x3C, 0x88, 0xDA, 0xA7, 0x3C, 0xCE, 0x34, 0x6E, 0x65, 0xBD, 0xE6, 0x9F, 0xE7, 0x73, 0xB8,
+0xBF, 0x7F, 0x00, 0x8A, 0x47, 0x2F, 0xC8, 0x44, 0x5B, 0xF8, 0xD9, 0xFB, 0xB6, 0x4B, 0x0E, 0x42,
+0x9A, 0xD2, 0x75, 0x2C, 0x12, 0x71, 0xBC, 0x99, 0x73, 0xE3, 0xE3, 0xD6, 0x95, 0x13, 0x3B, 0x9A,
+0x38, 0x17, 0x0B, 0x9E, 0xA0, 0x32, 0xB7, 0xAD, 0x07, 0xBE, 0x74, 0x20, 0x54, 0x8F, 0x82, 0xC4,
+0xED, 0xC0, 0xF3, 0xE7, 0xCF, 0x23, 0x68, 0x05, 0x9D, 0x7F, 0x04, 0xC4, 0xEE, 0xB1, 0x3A, 0xC4,
+0x8E, 0x24, 0x91, 0xFB, 0xD0, 0x3E, 0xBA, 0xA5, 0x5B, 0xFE, 0xBE, 0x7C, 0x09, 0x3F, 0x98, 0x00,
+0xDC, 0x57, 0xF7, 0xF6, 0x86, 0x5F, 0xDC, 0x8F, 0x68, 0xC8, 0x6D, 0xDD, 0xE1, 0x3E, 0x10, 0xBC,
+0x1D, 0xF0, 0xD1, 0xA3, 0x82, 0x97, 0xCF, 0x1B, 0xA6, 0x32, 0xF9, 0xB3, 0x13, 0xA3, 0xE1, 0x47,
+0x88, 0xD8, 0x1D, 0x81, 0x72, 0xC7, 0xFB, 0xEF, 0x84, 0x72, 0xFD, 0x33, 0xB8, 0xF6, 0x97, 0x0F,
+0xF4, 0xC7, 0xED, 0xCC, 0x1E, 0x47, 0xDD, 0xF7, 0xA0, 0x0E, 0x92, 0x48, 0xFA, 0xDB, 0x91, 0x80,
+0x32, 0x48, 0xE3, 0xFA, 0xE4, 0xBC, 0x04, 0x74, 0x6C, 0x43, 0xB4, 0xED, 0x6A, 0xE4, 0xCC, 0xA3,
+0xAF, 0xD8, 0x7F, 0xFB, 0xCF, 0xFE, 0x00, 0x8B, 0x13, 0x94, 0x2B, 0x68, 0x5D, 0x9F, 0x05, 0x39,
+0xF8, 0xC7, 0xFF, 0xD1, 0x2F, 0x87, 0x9F, 0x06, 0x41, 0x7B, 0x0C, 0x04, 0xE6, 0xD0, 0x5D, 0xBB,
+0x60, 0x66, 0xDC, 0x28, 0x44, 0xEC, 0x2E, 0x38, 0xD4, 0x33, 0xD2, 0x92, 0x3E, 0x59, 0x47, 0xA0,
+0x74, 0x8D, 0x22, 0xE0, 0x82, 0x66, 0x4C, 0xA6, 0x16, 0xB9, 0x82, 0x45, 0x8E, 0xF9, 0x0E, 0xBF,
+0xF2, 0xC5, 0x27, 0x54, 0xCD, 0xB1, 0x74, 0x28, 0x1A, 0x3C, 0x01, 0x62, 0x07, 0xE5, 0x84, 0x26,
+0xDB, 0x2D, 0x1B, 0x6F, 0x80, 0xD8, 0x41, 0x19, 0x21, 0xA9, 0x62, 0xB4, 0x6D, 0x2D, 0xB1, 0xE3,
+0xE2, 0xFF, 0xC1, 0xE1, 0x93, 0xE1, 0x5F, 0xFD, 0xEB, 0x3F, 0x0D, 0x47, 0xE1, 0x37, 0x47, 0xA5,
+0xFD, 0xEB, 0x3F, 0xFF, 0xD9, 0xF0, 0x8F, 0x7E, 0xF3, 0xE7, 0xC4, 0x91, 0xFD, 0x00, 0x16, 0x65,
+0xB6, 0x7D, 0x2B, 0xCC, 0xA6, 0x24, 0x17, 0xF7, 0x82, 0x5C, 0xED, 0xDA, 0xBD, 0x35, 0xBC, 0x0D,
+0xBF, 0xC0, 0x4B, 0xF0, 0x6B, 0xBB, 0x72, 0x7D, 0x54, 0x48, 0xDD, 0x04, 0xFA, 0x44, 0x62, 0xF7,
+0xF3, 0x54, 0xF5, 0x2A, 0xC4, 0xEE, 0x4C, 0xF8, 0x36, 0x82, 0x07, 0x46, 0xD0, 0x57, 0x7E, 0xAF,
+0xEF, 0x00, 0x16, 0xFF, 0xE9, 0x3F, 0xFE, 0x95, 0xF0, 0x73, 0x20, 0x80, 0x8F, 0x82, 0xF0, 0x1E,
+0x00, 0x21, 0xD9, 0x8D, 0x7A, 0xF7, 0xE3, 0x1A, 0xFA, 0xEC, 0x31, 0xA5, 0x0A, 0x15, 0x20, 0xF6,
+0x9B, 0x7F, 0xCF, 0x32, 0xE0, 0x04, 0x24, 0x6F, 0x03, 0x02, 0x35, 0xFE, 0xDE, 0xDF, 0xF9, 0xE9,
+0xF0, 0xEB, 0xBF, 0xF2, 0xC5, 0xF0, 0xE8, 0x83, 0x07, 0x84, 0x70, 0xF0, 0x41, 0xB2, 0x23, 0x7D,
+0x00, 0xFE, 0x4C, 0xCA, 0x3E, 0x83, 0x8F, 0x17, 0x15, 0xFB, 0x67, 0x3F, 0xFB, 0x48, 0x85, 0xC0,
+0xF2, 0xF3, 0x41, 0x53, 0xF1, 0xBF, 0xF8, 0x1F, 0xFF, 0x2C, 0xFC, 0x04, 0xD1, 0xBE, 0xD7, 0x41,
+0x5A, 0x98, 0xA2, 0xE9, 0xD1, 0x47, 0x0F, 0x85, 0xFF, 0xD3, 0x3F, 0xFE, 0x55, 0x21, 0xD4, 0xF7,
+0x81, 0xF8, 0x32, 0xA2, 0x77, 0x07, 0xCC, 0xA6, 0x87, 0x0E, 0xEC, 0x0C, 0x9F, 0x7A, 0xE2, 0xDE,
+0x70, 0xCF, 0xDD, 0x7B, 0x85, 0xEC, 0x9E, 0x44, 0x00, 0xCC, 0x38, 0xEE, 0x43, 0x75, 0x93, 0x7E,
+0x8A, 0x24, 0xA2, 0x7E, 0x28, 0xB1, 0x1B, 0x02, 0xB1, 0x3B, 0x2F, 0xC1, 0x33, 0x23, 0x20, 0x3C,
+0x92, 0x12, 0x06, 0x73, 0xF9, 0xE7, 0xA1, 0x48, 0xFE, 0xC3, 0xBF, 0xFF, 0xB3, 0xE1, 0x33, 0x4F,
+0xDE, 0x8F, 0x80, 0x8A, 0xED, 0xC0, 0x70, 0x93, 0x44, 0xCB, 0x1E, 0x3A, 0xB8, 0x0B, 0x51, 0xCA,
+0x3B, 0xC2, 0x61, 0xF8, 0xB4, 0xD1, 0x04, 0x3F, 0x03, 0x52, 0xD5, 0x07, 0xC5, 0xEC, 0x69, 0x28,
+0x67, 0x1E, 0xD1, 0xCA, 0xAF, 0x0A, 0xCE, 0x83, 0xBB, 0x30, 0x06, 0x4F, 0xA3, 0x2D, 0x4F, 0x82,
+0x84, 0xF5, 0x81, 0xB0, 0xBD, 0x0C, 0xB3, 0x7F, 0x07, 0xEA, 0xFE, 0x87, 0xFF, 0xC1, 0xCF, 0x86,
+0x5F, 0xF9, 0xFA, 0xE7, 0xC2, 0xE7, 0x40, 0xA2, 0x9E, 0x01, 0x79, 0xFC, 0xCC, 0xA7, 0xEE, 0x43,
+0x70, 0xCC, 0x01, 0xA4, 0x0B, 0x59, 0x2F, 0x56, 0x03, 0xFA, 0x27, 0xFE, 0xC1, 0x9F, 0xFC, 0x30,
+0x7C, 0x07, 0xF8, 0x5F, 0x83, 0x09, 0xB4, 0x0B, 0xA4, 0x90, 0x24, 0xED, 0x1F, 0xFD, 0xFD, 0x9F,
+0x93, 0xC8, 0x6A, 0xFE, 0x80, 0x20, 0xF6, 0xDB, 0x41, 0x90, 0xF7, 0xEF, 0xDB, 0x26, 0xA4, 0x95,
+0xE4, 0x8E, 0x41, 0x3C, 0x9C, 0x6B, 0xFC, 0x3E, 0x9B, 0xC6, 0xBA, 0xF7, 0x04, 0xEE, 0xBD, 0x13,
+0x0A, 0x5F, 0x6D, 0xEA, 0x2F, 0xFE, 0x90, 0xF9, 0x6D, 0x90, 0xC6, 0xBF, 0xF8, 0xF6, 0x8B, 0xE1,
+0x43, 0x10, 0x3C, 0x8E, 0xC3, 0xDD, 0xC0, 0xEB, 0x3F, 0xF9, 0x0F, 0x7F, 0x39, 0x7C, 0x0D, 0x91,
+0xDF, 0xAC, 0x7F, 0x2F, 0xC6, 0x68, 0x07, 0x7C, 0x2B, 0x49, 0x1E, 0x49, 0x88, 0x1F, 0x00, 0x21,
+0xA7, 0x5F, 0x26, 0x95, 0x40, 0xFA, 0x99, 0x5E, 0xC2, 0xBC, 0xBF, 0x06, 0xD3, 0x39, 0xD7, 0x7A,
+0x92, 0xF5, 0xE2, 0x63, 0xB7, 0xC4, 0x37, 0x39, 0x27, 0x15, 0x59, 0x37, 0x53, 0x9D, 0x9C, 0xBD,
+0x7A, 0x5D, 0xCC, 0x70, 0xAA, 0x58, 0x2D, 0xFD, 0xF5, 0x9F, 0x74, 0x87, 0x54, 0x30, 0x2E, 0x43,
+0x76, 0x2A, 0x5F, 0x96, 0x4C, 0xC8, 0x48, 0x95, 0xD6, 0x31, 0x79, 0x70, 0x91, 0x8D, 0x5C, 0x40,
+0xC5, 0x36, 0x5D, 0x5A, 0x6B, 0xDA, 0x92, 0x3B, 0xA4, 0xC7, 0x32, 0x5E, 0xB6, 0xF2, 0xD7, 0x56,
+0x66, 0xAB, 0xA0, 0xB6, 0x7D, 0x79, 0x13, 0xD4, 0xC4, 0xAB, 0x37, 0xF2, 0xDB, 0xC5, 0xBC, 0x66,
+0x72, 0xB2, 0xE6, 0x3D, 0xEB, 0x89, 0xF8, 0xD9, 0x75, 0x76, 0x43, 0xBC, 0x6B, 0xC3, 0x2F, 0xDD,
+0xB1, 0xF0, 0xFA, 0xE1, 0x8F, 0xC2, 0x8F, 0xDE, 0xFC, 0x20, 0xBC, 0x01, 0xE5, 0x73, 0x1C, 0x0E,
+0xA1, 0xB7, 0xEA, 0xE0, 0x17, 0xC5, 0xA1, 0xCD, 0x30, 0x15, 0xA3, 0xD3, 0xD1, 0x1C, 0x6B, 0xBD,
+0x73, 0x1C, 0xDC, 0x17, 0xD1, 0xDB, 0xE8, 0x6A, 0x9D, 0x76, 0xD7, 0xFB, 0xAB, 0x6A, 0x9B, 0x3C,
+0x8C, 0xA4, 0x24, 0x84, 0x78, 0xA2, 0x3A, 0x3E, 0x5E, 0x2E, 0x0D, 0x5B, 0xBC, 0x5A, 0xD2, 0xD1,
+0xCC, 0xC2, 0x2C, 0x3C, 0x05, 0x53, 0x3F, 0xBD, 0x6B, 0xD6, 0x23, 0xDA, 0x6F, 0x13, 0x7C, 0xEC,
+0x56, 0x3B, 0x1A, 0x96, 0x51, 0x61, 0x97, 0x11, 0x11, 0x47, 0x1F, 0xBB, 0x4B, 0xF8, 0xCB, 0x9D,
+0x33, 0x90, 0x5F, 0x61, 0x41, 0xDB, 0xD9, 0x6F, 0x99, 0xF7, 0x79, 0x87, 0xE3, 0x00, 0xFA, 0xC9,
+0xF4, 0x7E, 0x5E, 0x54, 0xA1, 0xCD, 0x27, 0xAA, 0xE1, 0x67, 0xF0, 0xC4, 0xAB, 0x0D, 0x20, 0x57,
+0xA6, 0xF9, 0x6B, 0x9F, 0xFD, 0xA7, 0xD9, 0x7C, 0x9F, 0x6C, 0xAB, 0xF6, 0x89, 0xF5, 0xE6, 0x58,
+0x30, 0xD5, 0x49, 0xD2, 0x0E, 0x21, 0x05, 0x0A, 0x49, 0xDD, 0x23, 0x9B, 0xBB, 0x44, 0x71, 0x23,
+0xD9, 0x5A, 0xCA, 0xDA, 0xD9, 0x0F, 0xE5, 0xEC, 0x41, 0x90, 0xBE, 0x27, 0x70, 0xCD, 0x03, 0xF8,
+0x4B, 0x45, 0x8E, 0xF3, 0x75, 0x17, 0xC8, 0xD6, 0xA3, 0xA8, 0x83, 0x64, 0x70, 0x2F, 0xC8, 0xD7,
+0x06, 0xA8, 0x79, 0xF9, 0xBC, 0xA1, 0x69, 0xFF, 0x2C, 0xD4, 0x40, 0x9A, 0x56, 0x2F, 0x41, 0xE5,
+0xE3, 0xFB, 0x54, 0x05, 0x9F, 0xDE, 0xDE, 0x1D, 0x3E, 0x83, 0xC7, 0xA7, 0xF1, 0xE0, 0xB5, 0xAC,
+0xE3, 0x53, 0x48, 0x9B, 0xE2, 0xE7, 0x48, 0x3A, 0xA9, 0x20, 0x9E, 0x40, 0xD0, 0xC6, 0x9B, 0x97,
+0x27, 0x25, 0x82, 0x77, 0x1C, 0x81, 0x1A, 0x37, 0xFB, 0xA0, 0xF3, 0xF9, 0x9B, 0x58, 0xA0, 0x5E,
+0x83, 0x33, 0xFA, 0x2C, 0xE6, 0xDE, 0x41, 0x90, 0x38, 0xAA, 0x3E, 0xCF, 0x22, 0xF5, 0xC6, 0x93,
+0x50, 0x67, 0x1E, 0x80, 0xD2, 0xB5, 0x17, 0x0B, 0x1A, 0x7D, 0xC9, 0xE8, 0x43, 0xC6, 0x85, 0xF3,
+0x0B, 0x9F, 0x79, 0x08, 0x29, 0x41, 0x1E, 0x95, 0x34, 0x15, 0xFC, 0x2E, 0x3A, 0x6E, 0x79, 0xCD,
+0xE8, 0x0B, 0xD7, 0x18, 0xE5, 0x6F, 0xAC, 0x54, 0xA3, 0x7D, 0x65, 0xCE, 0x35, 0x06, 0x0F, 0x30,
+0xEA, 0x92, 0xDF, 0x96, 0x0F, 0x22, 0xD5, 0xC4, 0xB3, 0x20, 0x2E, 0x5F, 0x40, 0x3F, 0xD8, 0x5E,
+0x12, 0x31, 0xAA, 0x84, 0x24, 0x76, 0x54, 0x93, 0x9E, 0x00, 0x11, 0xFA, 0x22, 0x4C, 0x6C, 0xCF,
+0x3C, 0xFD, 0x00, 0xD4, 0xBA, 0xFE, 0x70, 0x12, 0xBE, 0x73, 0xF4, 0xEB, 0xE2, 0xE7, 0x6B, 0xA9,
+0x96, 0xF1, 0xB3, 0x41, 0xE2, 0xCA, 0x34, 0x2F, 0x9F, 0x07, 0xE9, 0x7A, 0x02, 0x24, 0x85, 0x0A,
+0xDC, 0x1E, 0x90, 0x1C, 0x62, 0x73, 0x37, 0x88, 0xCE, 0xE7, 0x41, 0x50, 0x3E, 0x0D, 0x82, 0x42,
+0x73, 0xE3, 0x10, 0xEA, 0x7C, 0x0F, 0x84, 0x93, 0xEE, 0x44, 0xDD, 0x20, 0x33, 0x54, 0x7D, 0x3E,
+0x0B, 0x73, 0x2D, 0xC9, 0x0D, 0x89, 0xE3, 0x0E, 0x98, 0x1D, 0xF7, 0xC3, 0x2C, 0xCC, 0xB4, 0x19,
+0xCF, 0xE0, 0xFC, 0x2E, 0x10, 0x88, 0x4E, 0x28, 0x7C, 0x83, 0x20, 0x61, 0x24, 0xC1, 0x24, 0x71,
+0xB9, 0x6F, 0x18, 0x95, 0xBC, 0x23, 0x20, 0x51, 0xE2, 0xD8, 0x0F, 0xBF, 0x31, 0x4E, 0x58, 0xAA,
+0xA8, 0x9F, 0xC3, 0x78, 0x7C, 0x01, 0xFD, 0x21, 0x09, 0xDF, 0x8B, 0xFE, 0x91, 0x9C, 0xEE, 0x06,
+0x89, 0x79, 0xE8, 0xFE, 0xBB, 0x64, 0x2C, 0xBF, 0x0C, 0xD5, 0xF2, 0x59, 0x04, 0x84, 0xDC, 0x0B,
+0x15, 0x70, 0x96, 0xAE, 0x1F, 0x18, 0x6B, 0x9A, 0x65, 0x19, 0xB4, 0xB1, 0xD8, 0xC1, 0x6F, 0x57,
+0x06, 0xEC, 0xB1, 0xCD, 0x9F, 0x47, 0x1D, 0x9F, 0x03, 0x41, 0x26, 0xA9, 0x66, 0x3F, 0x49, 0x72,
+0xF6, 0x82, 0x18, 0x33, 0xA5, 0x07, 0x15, 0xAD, 0xCF, 0x3C, 0x75, 0xBF, 0xA8, 0x68, 0x54, 0xE6,
+0xDE, 0x84, 0x6F, 0x23, 0x73, 0xD5, 0xB9, 0x19, 0x99, 0x3F, 0x02, 0x49, 0xF2, 0x9E, 0x84, 0xAA,
+0xF9, 0x0C, 0xCA, 0x3D, 0x85, 0x39, 0x75, 0x10, 0xEA, 0x5C, 0x07, 0x7D, 0x78, 0x25, 0xB5, 0xC9,
+0x4E, 0x39, 0x47, 0x42, 0xC7, 0xC7, 0xA7, 0x91, 0x2E, 0xE6, 0x1E, 0xE0, 0x48, 0x35, 0x91, 0x7D,
+0xBF, 0x80, 0x7E, 0xBE, 0xCA, 0xFE, 0xC2, 0x95, 0x88, 0xCA, 0x18, 0xE7, 0xE4, 0x97, 0x31, 0x37,
+0xA9, 0xD4, 0x3D, 0x05, 0xB2, 0x46, 0xC2, 0x48, 0xBF, 0x4F, 0x8E, 0xB1, 0xA8, 0xA1, 0x9C, 0x9B,
+0x78, 0x8F, 0xE4, 0xEA, 0x01, 0x10, 0x40, 0x9A, 0x96, 0x39, 0x06, 0xAF, 0xBC, 0x7E, 0x44, 0xA2,
+0x59, 0xF3, 0x83, 0x04, 0x97, 0x73, 0xF7, 0x05, 0xFC, 0xE8, 0xE0, 0x3D, 0x48, 0x04, 0xB7, 0x82,
+0x20, 0x72, 0x5E, 0x68, 0xFD, 0x50, 0x27, 0x41, 0x5C, 0xB7, 0x63, 0x9C, 0x58, 0x3F, 0xB1, 0xB8,
+0x1F, 0x9F, 0x07, 0xBE, 0xFF, 0x25, 0xA8, 0x97, 0x4F, 0xA3, 0xBD, 0xDC, 0x43, 0xFB, 0x18, 0x48,
+0xE4, 0x24, 0x88, 0x71, 0x3D, 0xC1, 0xA9, 0xD1, 0x39, 0x7C, 0xA3, 0xE5, 0x3E, 0x51, 0xDF, 0xCA,
+0xEA, 0xC8, 0x09, 0x87, 0x59, 0xF8, 0x1C, 0x9C, 0xC3, 0x80, 0x72, 0x9F, 0x58, 0x2A, 0x3A, 0xF4,
+0xC6, 0x5A, 0xF6, 0xAB, 0xCD, 0xEC, 0x78, 0xE2, 0x97, 0x24, 0x9F, 0x54, 0xCA, 0x5E, 0x7E, 0x5D,
+0x32, 0xCB, 0x45, 0xB5, 0x42, 0x54, 0x9D, 0xCC, 0x6F, 0xCB, 0xCD, 0x56, 0xD9, 0x4A, 0x2A, 0xA4,
+0xCE, 0xAB, 0x12, 0x1F, 0x2D, 0x59, 0x6A, 0xD5, 0x5F, 0xCB, 0x74, 0x8F, 0x64, 0x10, 0xF3, 0x67,
+0x6A, 0x02, 0x53, 0x7F, 0x30, 0xF3, 0x91, 0xCB, 0xBE, 0x36, 0xE2, 0x1E, 0xB1, 0xE6, 0xF3, 0xA5,
+0xAA, 0xA1, 0xF9, 0x41, 0xF9, 0xBD, 0x2D, 0x05, 0x8A, 0x98, 0x74, 0x85, 0xAB, 0xC0, 0x2F, 0x8D,
+0x24, 0x93, 0x2A, 0x0D, 0xFB, 0x44, 0xB2, 0x2B, 0x7E, 0x7A, 0xBA, 0x78, 0x6B, 0xDE, 0x3C, 0xEB,
+0x2B, 0xEF, 0xDD, 0x8D, 0x74, 0x02, 0x9D, 0x3D, 0xF2, 0xCB, 0x67, 0x02, 0x18, 0x7E, 0x88, 0xE8,
+0xA5, 0x3F, 0xF9, 0xC1, 0x2B, 0xE1, 0x1A, 0x24, 0xF6, 0x5B, 0x75, 0x90, 0x20, 0xDC, 0x45, 0xA2,
+0xC0, 0xA6, 0xD2, 0xCF, 0xAE, 0xC5, 0xCC, 0x7B, 0xD2, 0x17, 0xF3, 0x01, 0x33, 0xDC, 0xDC, 0x97,
+0x2E, 0xEE, 0x0C, 0x62, 0x7D, 0x77, 0x5F, 0x31, 0xC7, 0x40, 0xE5, 0x27, 0xC5, 0x48, 0x75, 0x28,
+0x55, 0x55, 0xDD, 0x57, 0x2F, 0x96, 0x17, 0x55, 0xD0, 0xFC, 0xCE, 0x38, 0x26, 0xB6, 0x92, 0xCF,
+0x01, 0x1F, 0xE8, 0x86, 0x61, 0x8C, 0xBC, 0x0A, 0xD7, 0xEE, 0x5A, 0xDF, 0x2D, 0xBE, 0x65, 0xAB,
+0x7D, 0x30, 0x32, 0xEC, 0x23, 0x44, 0xC3, 0x52, 0x49, 0xA5, 0x27, 0xB1, 0x24, 0xDD, 0x9E, 0x85,
+0x09, 0x3D, 0x6A, 0x69, 0xDE, 0x56, 0xF5, 0x21, 0x14, 0x1C, 0x32, 0x3F, 0x41, 0xF7, 0xAF, 0x73,
+0xFF, 0x39, 0xF7, 0x91, 0x73, 0x9F, 0x3B, 0xF5, 0x03, 0xD3, 0x89, 0x9B, 0xFB, 0x25, 0xAA, 0xDF,
+0x5D, 0xAA, 0x3B, 0xBE, 0x36, 0x75, 0x9A, 0x6A, 0x53, 0x37, 0x4C, 0xB1, 0x24, 0x2F, 0xFD, 0x20,
+0x76, 0xDB, 0x06, 0xF8, 0x5C, 0x23, 0xAE, 0x6F, 0x57, 0xB5, 0xAE, 0x76, 0xAC, 0x96, 0xFD, 0x9E,
+0xA8, 0x33, 0xB8, 0x19, 0x45, 0x5E, 0x72, 0xE8, 0x05, 0x52, 0x23, 0xC6, 0xE4, 0x5A, 0x4B, 0xDD,
+0x8B, 0x5B, 0xE8, 0x7D, 0xC0, 0xC8, 0x57, 0xA4, 0x37, 0xE1, 0xF7, 0xC8, 0x5D, 0xEB, 0xDA, 0xC3,
+0xAF, 0x1D, 0xEA, 0x0F, 0x7F, 0xE7, 0xEE, 0x7E, 0xC9, 0x97, 0x97, 0x9B, 0x6C, 0x39, 0x65, 0xE9,
+0x6F, 0xF7, 0x85, 0x9D, 0x3D, 0xE1, 0x97, 0x0F, 0x22, 0xB1, 0x32, 0xCC, 0xAF, 0xB0, 0xCE, 0x22,
+0x45, 0xCA, 0x6C, 0xF8, 0x31, 0xD4, 0xBE, 0x21, 0x66, 0x34, 0xBE, 0xC9, 0x07, 0x4D, 0xA9, 0xDF,
+0x82, 0x99, 0xF1, 0xDA, 0x10, 0x22, 0xE8, 0xB1, 0x98, 0x7E, 0x09, 0xAA, 0x0F, 0x73, 0xBC, 0x2D,
+0x95, 0x27, 0x8E, 0x29, 0x24, 0xB8, 0xB8, 0xD1, 0x47, 0x6C, 0x3D, 0xF2, 0xC9, 0x71, 0xBE, 0x30,
+0xF8, 0x48, 0xFC, 0xE6, 0x16, 0x53, 0x73, 0x09, 0x92, 0x7C, 0x26, 0xF9, 0xB8, 0xB9, 0x9D, 0x60,
+0xD2, 0xD8, 0x6F, 0x7E, 0xEF, 0xD5, 0x70, 0x1D, 0x6E, 0x0D, 0x03, 0x30, 0x15, 0x7F, 0x1D, 0x0A,
+0xD0, 0x67, 0xB1, 0xC0, 0xB3, 0x9D, 0xF5, 0x0E, 0x2A, 0xF4, 0x24, 0x27, 0xBF, 0x86, 0xF6, 0x1F,
+0x84, 0x09, 0x95, 0x7E, 0x7B, 0xD2, 0xBC, 0xA5, 0x9A, 0xC5, 0x37, 0xF1, 0x19, 0x5D, 0xDF, 0xD3,
+0x81, 0x1C, 0x66, 0x9F, 0xC2, 0x62, 0xBF, 0xA1, 0x6E, 0xD4, 0x2A, 0x23, 0x39, 0x49, 0x3C, 0xB6,
+0x83, 0x00, 0xD1, 0xAF, 0xB0, 0x0D, 0x3F, 0x16, 0xE7, 0x30, 0x49, 0x06, 0x10, 0x6D, 0xFF, 0x04,
+0x88, 0xC0, 0xDD, 0x20, 0x1F, 0xB5, 0xE6, 0x55, 0x26, 0x5C, 0xA6, 0xF9, 0xF4, 0x21, 0x10, 0xB3,
+0x7E, 0xE4, 0x86, 0xA3, 0x79, 0x73, 0x14, 0x6A, 0xDC, 0x19, 0xA8, 0x7D, 0xB9, 0x6F, 0x18, 0x23,
+0x7C, 0x19, 0xE0, 0x72, 0x09, 0xBE, 0x5D, 0xB3, 0xF8, 0x3E, 0x1F, 0x80, 0x3A, 0xF6, 0x24, 0xC8,
+0xCD, 0x2F, 0xFC, 0xDC, 0x67, 0xC2, 0x86, 0x25, 0x72, 0x95, 0xD2, 0x7C, 0x48, 0x35, 0xEF, 0xA7,
+0xD0, 0x6E, 0x06, 0x84, 0x91, 0x08, 0x7F, 0x1B, 0xA6, 0x77, 0xAA, 0x61, 0x8B, 0x1E, 0xF8, 0x6E,
+0x26, 0x89, 0x7D, 0xFA, 0xD3, 0x0F, 0x81, 0xE0, 0xC0, 0x77, 0x6D, 0x11, 0x2C, 0x99, 0x93, 0xF0,
+0x6B, 0x3F, 0xFD, 0x74, 0xD8, 0x0B, 0x25, 0x8F, 0xDF, 0x35, 0x97, 0xE0, 0x1B, 0x48, 0xD2, 0x49,
+0x92, 0x5F, 0xEF, 0xE0, 0x67, 0x87, 0x84, 0x8A, 0xDF, 0xFD, 0x7C, 0xC8, 0xF3, 0x45, 0x3E, 0x40,
+0xEC, 0xFB, 0x31, 0x04, 0x31, 0x1C, 0x46, 0xE0, 0x04, 0x77, 0x7A, 0xA1, 0xB9, 0xF6, 0x1F, 0xC0,
+0x57, 0xF2, 0x37, 0xE1, 0xEF, 0x49, 0x62, 0x59, 0x2F, 0x6A, 0x98, 0x3F, 0x48, 0x3F, 0x0D, 0x65,
+0xF1, 0x7F, 0xF7, 0x9B, 0x5F, 0x0B, 0x7F, 0x9B, 0xF3, 0x93, 0x79, 0x0A, 0xC7, 0xA7, 0xC3, 0xB7,
+0xFF, 0x7A, 0x61, 0x7F, 0x29, 0x1C, 0xBD, 0x8E, 0x80, 0x09, 0x46, 0xE4, 0x8E, 0x42, 0x71, 0xE3,
+0x8F, 0x3B, 0xAA, 0x71, 0xBF, 0x06, 0x7F, 0xBA, 0x1D, 0x3B, 0x36, 0x2E, 0xFA, 0x5D, 0x47, 0x97,
+0x26, 0xAA, 0x8A, 0xBF, 0xF9, 0x77, 0xBF, 0x2A, 0x91, 0xDD, 0xE2, 0x0F, 0x68, 0xDF, 0x9D, 0x37,
+0x77, 0x66, 0x2F, 0x5F, 0xDB, 0xEA, 0xAF, 0x52, 0xCB, 0xB7, 0x61, 0x45, 0x25, 0x28, 0x8B, 0x1F,
+0x39, 0x73, 0x31, 0x1C, 0x81, 0x29, 0x96, 0x1B, 0xBC, 0x33, 0x21, 0xA2, 0x2B, 0x67, 0xCB, 0x55,
+0xA4, 0x04, 0x41, 0x17, 0x79, 0x27, 0x65, 0xB5, 0xD7, 0x78, 0x5D, 0xA6, 0x5F, 0xE8, 0x87, 0xDA,
+0x67, 0x98, 0x5D, 0xBB, 0xE8, 0x7D, 0x6C, 0x22, 0xBA, 0x92, 0x56, 0x2D, 0xE7, 0xBE, 0x7E, 0xF6,
+0x37, 0x2A, 0x47, 0xB5, 0xB3, 0x97, 0x0B, 0xAB, 0xB6, 0x51, 0x16, 0x62, 0xAB, 0xA4, 0x12, 0x09,
+0x15, 0xDF, 0x37, 0x6B, 0x99, 0x2C, 0x22, 0x46, 0xDC, 0xB2, 0x6B, 0x84, 0xBF, 0xC6, 0xB6, 0xFB,
+0x7D, 0xB0, 0x08, 0x23, 0xA1, 0x22, 0x7E, 0x2A, 0x4A, 0xA4, 0x2C, 0xD5, 0xA1, 0xAB, 0xF0, 0x39,
+0x78, 0x05, 0xFB, 0xC8, 0xBE, 0x0A, 0x13, 0xCA, 0x18, 0x7E, 0xA9, 0xDF, 0x8A, 0x83, 0xF9, 0xA3,
+0x36, 0x33, 0xFF, 0x15, 0xBC, 0xCC, 0xDB, 0xE6, 0xF1, 0xE1, 0x37, 0x53, 0x6A, 0x94, 0xDE, 0x4C,
+0x96, 0x52, 0x22, 0xA2, 0xF0, 0x28, 0x46, 0xF6, 0xD7, 0x4F, 0x79, 0xE3, 0x23, 0x99, 0x33, 0xA2,
+0x22, 0xEF, 0x67, 0x58, 0x7B, 0x1D, 0x95, 0x6F, 0x0F, 0x3D, 0x29, 0xFF, 0xE1, 0xE9, 0xAC, 0x10,
+0x3B, 0xF8, 0xFF, 0x91, 0x5C, 0x61, 0xE2, 0x1C, 0x42, 0xE0, 0x44, 0x33, 0x76, 0x9B, 0x18, 0xC7,
+0x17, 0xF8, 0x91, 0x0B, 0x83, 0xF8, 0xA5, 0x8B, 0xDD, 0x54, 0x70, 0xEF, 0x76, 0xF8, 0xD5, 0xB5,
+0xD1, 0x37, 0xD2, 0xC6, 0xD3, 0xCD, 0xB1, 0x09, 0x0A, 0x6B, 0xB3, 0x43, 0xE1, 0x7D, 0x37, 0x32,
+0x1F, 0x7B, 0xED, 0x84, 0x2E, 0xEB, 0xB3, 0x92, 0x3F, 0x87, 0xD4, 0xD4, 0x4E, 0x81, 0x41, 0xE7,
+0x5F, 0x9A, 0x35, 0xF3, 0xE2, 0x8B, 0xC9, 0x07, 0xC9, 0xDC, 0x8E, 0xFE, 0xAE, 0xB0, 0x0E, 0x8B,
+0xD9, 0x6A, 0x9B, 0xA4, 0x6F, 0xC5, 0x5C, 0xFC, 0xB8, 0xF7, 0x24, 0x66, 0x0B, 0xE3, 0x33, 0xAB,
+0xB5, 0x4E, 0x60, 0x51, 0x7F, 0x0F, 0x91, 0xAE, 0x4C, 0x46, 0x4C, 0xD5, 0x8F, 0x2A, 0xE1, 0x53,
+0xDB, 0xBA, 0xC2, 0x43, 0x48, 0xA9, 0xB2, 0x05, 0xBE, 0x78, 0xB5, 0x59, 0x51, 0xA8, 0x26, 0xD2,
+0xDF, 0xEE, 0x53, 0x5B, 0xBB, 0x45, 0x21, 0x5C, 0x07, 0x62, 0x3D, 0x0E, 0x1B, 0xF1, 0x51, 0x04,
+0x5C, 0x1C, 0xC3, 0x83, 0xFE, 0x7A, 0x37, 0xEB, 0xA0, 0x55, 0x84, 0x7E, 0x57, 0x6F, 0xBE, 0x75,
+0x44, 0x4C, 0x85, 0x24, 0x23, 0x9F, 0x7E, 0xEA, 0x81, 0x70, 0x1F, 0x54, 0xAE, 0xDA, 0xE4, 0xBA,
+0xF9, 0x3D, 0xE9, 0x77, 0x49, 0xC5, 0xE9, 0xD3, 0x20, 0x77, 0x34, 0x4D, 0xD1, 0x8F, 0x4B, 0xC2,
+0x76, 0x6F, 0x5E, 0xD3, 0x1A, 0xEA, 0xA2, 0xEC, 0x18, 0x01, 0x13, 0xE0, 0x87, 0x48, 0x7C, 0x4C,
+0xB5, 0x8E, 0xC1, 0xB2, 0x34, 0x15, 0x7F, 0x1A, 0xEA, 0x12, 0xD5, 0x15, 0xB6, 0xB3, 0xDE, 0xC1,
+0xAF, 0x9C, 0x7E, 0x92, 0x22, 0x28, 0x67, 0x54, 0x5D, 0xE8, 0x9B, 0x15, 0xBF, 0xA6, 0x17, 0xB9,
+0xB3, 0xFC, 0x5C, 0xC4, 0x75, 0x1B, 0x41, 0x64, 0xB8, 0xA8, 0x73, 0x77, 0x9A, 0x7A, 0x3F, 0x72,
+0x68, 0x76, 0xBC, 0x17, 0xCA, 0x16, 0xCD, 0x94, 0x92, 0x3F, 0x8D, 0x1F, 0x31, 0xF8, 0x5E, 0x91,
+0x00, 0x3F, 0x06, 0xA5, 0x90, 0x2A, 0x5D, 0xAD, 0x39, 0x90, 0x3E, 0xCF, 0x34, 0xC9, 0x32, 0xD9,
+0xEF, 0x7A, 0xA8, 0x5B, 0x73, 0xE8, 0x97, 0xF8, 0xA5, 0xC1, 0xA4, 0x4B, 0xD3, 0xA0, 0x2F, 0x4D,
+0x54, 0x15, 0x39, 0x56, 0x34, 0xAB, 0x92, 0x1C, 0xD2, 0xDC, 0xFA, 0x34, 0x54, 0x30, 0xE6, 0x7C,
+0xEB, 0x36, 0xB3, 0x77, 0xBD, 0xE6, 0xD3, 0x57, 0x8D, 0x6A, 0x1B, 0xC7, 0x76, 0x17, 0xCC, 0x96,
+0x53, 0x20, 0x85, 0x54, 0xD6, 0x38, 0xF6, 0x79, 0xF4, 0x69, 0x7E, 0x2D, 0xF1, 0xE8, 0x81, 0xCB,
+0xCE, 0x13, 0x50, 0xC8, 0xA8, 0x2A, 0x2E, 0x86, 0x25, 0x49, 0x29, 0xFD, 0xCA, 0x98, 0x5B, 0x90,
+0x3F, 0xDA, 0xE9, 0xD7, 0x76, 0x12, 0xEB, 0xB6, 0xB7, 0xBB, 0xB6, 0x3D, 0xC4, 0x51, 0x54, 0x48,
+0x03, 0x5C, 0x7C, 0xE2, 0x16, 0x99, 0x38, 0xC4, 0x80, 0xFE, 0x75, 0xE7, 0x41, 0x64, 0xBB, 0x40,
+0xD8, 0x98, 0x7C, 0x98, 0x6A, 0x31, 0xCD, 0xD8, 0x24, 0xD0, 0xF5, 0xF0, 0x17, 0x2C, 0xA1, 0x30,
+0x7F, 0x06, 0x73, 0xF3, 0xF3, 0x9F, 0x7D, 0x48, 0xE6, 0x32, 0xA7, 0xE6, 0xFB, 0x48, 0xDF, 0xC3,
+0x1C, 0x7A, 0x79, 0x34, 0xF6, 0x38, 0xFC, 0xCF, 0xDF, 0xC2, 0xF6, 0x9B, 0x97, 0x20, 0x1E, 0xD1,
+0x8C, 0xDC, 0x8F, 0x3A, 0xE9, 0x4B, 0x48, 0x9F, 0xBA, 0x7A, 0xFE, 0x78, 0xDE, 0x17, 0x8E, 0x1F,
+0x55, 0x3C, 0xFA, 0x6E, 0xD2, 0x1F, 0x90, 0x04, 0x38, 0x4E, 0xFE, 0x26, 0xBB, 0xA9, 0x7C, 0xA2,
+0x88, 0x1D, 0x07, 0x6C, 0x0C, 0xF9, 0x78, 0x5E, 0x3F, 0x7E, 0x2A, 0xBC, 0x79, 0xE2, 0x8C, 0xF8,
+0x9A, 0xF0, 0x57, 0x56, 0x54, 0x20, 0x96, 0xF8, 0xD8, 0xCB, 0x07, 0xC9, 0x7E, 0x14, 0x0A, 0xA9,
+0x93, 0xD7, 0xAA, 0x04, 0xE9, 0xCF, 0x6C, 0x23, 0x52, 0xA6, 0x7A, 0xE9, 0x1A, 0x69, 0x7E, 0x59,
+0xA6, 0x78, 0x69, 0x19, 0x53, 0x80, 0x6C, 0x02, 0xC6, 0xFD, 0x5E, 0x39, 0x0D, 0xA9, 0x76, 0xB0,
+0x6E, 0x53, 0x7D, 0x92, 0xD2, 0xA4, 0xD7, 0xB9, 0xC2, 0x14, 0xD5, 0x12, 0xBD, 0x43, 0x66, 0x4E,
+0x33, 0xA5, 0x4D, 0x54, 0x13, 0xFD, 0x15, 0x2B, 0xEA, 0x93, 0x7C, 0x79, 0xA8, 0xBA, 0xE2, 0x2A,
+0x8A, 0x07, 0x7D, 0x68, 0x50, 0x85, 0xD6, 0x2F, 0x77, 0xF7, 0xF6, 0xBB, 0x82, 0x63, 0x0A, 0x8C,
+0xEC, 0xB0, 0x21, 0x0B, 0xBA, 0x91, 0xDA, 0xAE, 0xDE, 0x30, 0x47, 0xD5, 0x8E, 0x69, 0x50, 0x80,
+0xE1, 0x39, 0xA4, 0x00, 0xF8, 0x43, 0xF8, 0x2C, 0x5E, 0x46, 0xF8, 0x79, 0xB3, 0xBF, 0x88, 0x65,
+0xD8, 0xD0, 0xDD, 0x0E, 0x90, 0x3A, 0x46, 0x23, 0x76, 0xC2, 0x9F, 0xAC, 0x8D, 0xD1, 0x59, 0xA2,
+0x04, 0xF1, 0x3D, 0xA5, 0xDB, 0x31, 0x92, 0xD8, 0x15, 0xAA, 0xD8, 0x77, 0x57, 0x29, 0x93, 0xDA,
+0xA4, 0xAA, 0x1C, 0x87, 0x55, 0xB1, 0xAC, 0x55, 0xF3, 0x64, 0xDC, 0xEC, 0x11, 0x15, 0x40, 0xC7,
+0x17, 0xE5, 0xB9, 0x30, 0x4F, 0xB6, 0x74, 0x84, 0x49, 0x9C, 0x63, 0xE2, 0x55, 0x26, 0x8A, 0x79,
+0x78, 0xDB, 0x3A, 0x44, 0x39, 0xAE, 0x7E, 0x44, 0xEC, 0x38, 0x7E, 0xBC, 0xBC, 0x77, 0x0E, 0x09,
+0x2F, 0x27, 0x27, 0xA1, 0x60, 0xCE, 0x29, 0x1E, 0xCC, 0xF0, 0xEF, 0xE3, 0x6B, 0x2A, 0xAE, 0x2B,
+0xB9, 0x15, 0xD5, 0x2D, 0x62, 0xA3, 0x2A, 0x9A, 0xCF, 0xC1, 0xF8, 0xE3, 0xC4, 0xD5, 0x91, 0x38,
+0xDF, 0x5D, 0xA5, 0x23, 0x46, 0x09, 0x63, 0x57, 0xE1, 0xFC, 0xB3, 0xC5, 0xD7, 0xDD, 0x5D, 0x34,
+0x35, 0x22, 0x88, 0x04, 0x5F, 0xD4, 0x07, 0xB0, 0x85, 0x18, 0xFF, 0x56, 0x7E, 0x70, 0x34, 0xB4,
+0xEC, 0x7E, 0xF2, 0x0A, 0xAD, 0x44, 0x48, 0x4A, 0x24, 0x7A, 0xE9, 0x7E, 0xD2, 0x6F, 0xF2, 0x9D,
+0xAB, 0x48, 0xC4, 0x8D, 0x71, 0xD8, 0xD1, 0xAB, 0x6A, 0xDC, 0x56, 0xF8, 0xF4, 0x2D, 0x75, 0x50,
+0xF8, 0x62, 0x2E, 0xBC, 0xAF, 0xEE, 0xE9, 0x45, 0xE4, 0x6E, 0x9B, 0x10, 0x16, 0x46, 0xD5, 0xBE,
+0x82, 0x14, 0x28, 0xF4, 0xBF, 0xBB, 0x59, 0x07, 0xAD, 0x22, 0x5C, 0x34, 0x2F, 0x41, 0xF1, 0xA2,
+0xF9, 0xF8, 0x5E, 0xA6, 0x05, 0xC1, 0x02, 0x5D, 0x6F, 0x07, 0x81, 0xDA, 0x7B, 0x72, 0x01, 0x65,
+0x30, 0x02, 0x03, 0x08, 0x36, 0x40, 0x65, 0x9A, 0x95, 0x7C, 0x5F, 0x6C, 0x9B, 0xFF, 0x92, 0xAA,
+0x5E, 0x21, 0x9F, 0xEF, 0xF8, 0x83, 0xE3, 0xE6, 0xF4, 0x80, 0x8A, 0x0B, 0xD3, 0x8F, 0xBC, 0x82,
+0xF4, 0x20, 0xA3, 0xB0, 0x42, 0xF4, 0x60, 0x81, 0xA5, 0x2A, 0x76, 0x00, 0x3B, 0x17, 0x70, 0xFB,
+0xAC, 0xE5, 0x0E, 0xAA, 0x4D, 0x3F, 0xF7, 0x95, 0x4F, 0x89, 0x19, 0x71, 0x59, 0x4E, 0xCA, 0xAF,
+0x11, 0x7C, 0x26, 0x36, 0x41, 0xE9, 0xDB, 0xC4, 0x00, 0x8C, 0x25, 0x14, 0x7D, 0x26, 0x1A, 0x7E,
+0x02, 0xEA, 0x5B, 0x2F, 0x7E, 0x58, 0x0B, 0x26, 0xC0, 0x79, 0x03, 0x08, 0xDB, 0xC3, 0x30, 0x5D,
+0x92, 0x64, 0xD5, 0x3B, 0xE8, 0x9B, 0xC6, 0xC0, 0x84, 0x4D, 0xDC, 0x79, 0x02, 0xC4, 0x8E, 0x6A,
+0xFE, 0x31, 0x58, 0x58, 0xDC, 0x5C, 0xCA, 0xCF, 0xDF, 0x08, 0x54, 0xA5, 0x23, 0x8C, 0x5A, 0x66,
+0x00, 0x01, 0xCC, 0xAD, 0x87, 0x40, 0x5A, 0x68, 0xDE, 0x6C, 0x64, 0xB7, 0x0A, 0x12, 0xCE, 0xFB,
+0xA1, 0x46, 0xDD, 0xF7, 0xD0, 0x5D, 0x32, 0xD6, 0x17, 0x40, 0x1A, 0xCF, 0x5F, 0xB8, 0x22, 0x96,
+0xB1, 0xBA, 0x07, 0x06, 0xAC, 0x7F, 0x5D, 0xAF, 0xCC, 0x87, 0xC5, 0xDA, 0xEC, 0xD7, 0x91, 0x64,
+0x3D, 0x8B, 0x79, 0x30, 0x00, 0xFF, 0x37, 0x46, 0x94, 0xD2, 0x5C, 0xBC, 0xBC, 0xBB, 0x8F, 0x4C,
+0x88, 0x25, 0x87, 0x48, 0x92, 0x23, 0xC3, 0xDF, 0x6F, 0x18, 0xDF, 0x93, 0xCC, 0x45, 0xC7, 0xA0,
+0x16, 0x9A, 0x98, 0x97, 0x3B, 0x38, 0x36, 0xFD, 0x20, 0xD2, 0x07, 0xF1, 0xA3, 0xE3, 0xD9, 0xCF,
+0x3F, 0x1E, 0x06, 0xD0, 0xF7, 0xB1, 0xD1, 0xD1, 0xF0, 0x16, 0x12, 0x57, 0xE7, 0xE9, 0x58, 0x18,
+0x34, 0xF4, 0x2E, 0xCE, 0x31, 0x28, 0x87, 0x11, 0xD1, 0x4C, 0xE7, 0xF2, 0x95, 0x2F, 0x3E, 0x06,
+0x95, 0x2F, 0x05, 0xE6, 0x2C, 0x76, 0x2F, 0xB6, 0x7E, 0x33, 0x7C, 0x45, 0x7F, 0xE1, 0x67, 0x9F,
+0x0E, 0x1B, 0x38, 0xA6, 0x96, 0x4C, 0x5E, 0xD6, 0xB2, 0xE5, 0x1A, 0x78, 0x13, 0xDF, 0xFF, 0x44,
+0x11, 0x3B, 0x7E, 0xFE, 0x39, 0x00, 0x87, 0x91, 0xCC, 0xF0, 0x28, 0xA4, 0x5D, 0xFA, 0x62, 0x09,
+0x5C, 0x15, 0xD5, 0x65, 0x71, 0x74, 0xEA, 0x4E, 0x17, 0x53, 0x37, 0x2A, 0x73, 0x89, 0x84, 0xA1,
+0xA6, 0x1A, 0x57, 0xFA, 0xD2, 0x69, 0xFD, 0x25, 0x9A, 0x14, 0x3D, 0x23, 0x60, 0xB1, 0x40, 0xFA,
+0xA5, 0xEA, 0xB7, 0x10, 0x52, 0x65, 0x6A, 0x88, 0xD6, 0xAF, 0x2D, 0x72, 0x0B, 0x6B, 0xFA, 0x79,
+0xE8, 0xAA, 0x9D, 0x16, 0x89, 0xBE, 0x74, 0xB9, 0x02, 0x93, 0xB5, 0x3B, 0x2A, 0x38, 0xDE, 0x09,
+0xC3, 0xC3, 0xFB, 0x50, 0xAB, 0xDA, 0xC9, 0x79, 0x49, 0x13, 0x00, 0x73, 0x09, 0x16, 0x6B, 0x30,
+0x2A, 0x38, 0x00, 0x4F, 0x85, 0x97, 0x3E, 0x3C, 0x11, 0x5E, 0x86, 0x72, 0x37, 0x84, 0xDD, 0x29,
+0x1A, 0x84, 0xF4, 0x26, 0x4E, 0x45, 0x38, 0xD3, 0x52, 0x09, 0x42, 0x44, 0x60, 0x27, 0x14, 0x3B,
+0xA6, 0x64, 0xD1, 0x1F, 0x39, 0x86, 0x51, 0x7A, 0x6A, 0xF7, 0x4C, 0x4A, 0x53, 0x5C, 0x33, 0x6A,
+0xD6, 0x0E, 0x85, 0x5A, 0xAF, 0xD7, 0xB7, 0x32, 0x45, 0x2A, 0x5F, 0x68, 0xFC, 0x3A, 0x23, 0x82,
+0xDA, 0x79, 0x33, 0x0F, 0x61, 0xF5, 0x6C, 0xC3, 0x2F, 0xEB, 0x75, 0x20, 0x31, 0xBB, 0x91, 0xFF,
+0x69, 0xB5, 0x4D, 0xB1, 0xF4, 0x19, 0x1D, 0x82, 0x52, 0x77, 0x0A, 0x0E, 0xCB, 0x13, 0xF8, 0x11,
+0x43, 0xA7, 0xF5, 0x76, 0x44, 0x07, 0x13, 0x0F, 0x6B, 0x7D, 0xEC, 0x8B, 0xF4, 0xCB, 0xDB, 0x1C,
+0x51, 0xC9, 0x96, 0x50, 0x9B, 0x6B, 0x69, 0x30, 0x2B, 0x1D, 0xCD, 0x94, 0xBA, 0x6C, 0x6D, 0xAD,
+0x1D, 0x78, 0x23, 0xBB, 0xFC, 0xA2, 0xE0, 0x17, 0x39, 0x95, 0xD5, 0x2E, 0x2C, 0xDE, 0x07, 0x36,
+0xF7, 0xAD, 0x29, 0xFF, 0xBA, 0x7A, 0x13, 0x39, 0xFF, 0x0E, 0x68, 0xF4, 0x4B, 0x79, 0x59, 0x22,
+0x80, 0x1B, 0xF1, 0x7B, 0x8B, 0xD1, 0xB6, 0xE7, 0xB0, 0xA3, 0x05, 0xCD, 0x46, 0x0F, 0xC0, 0xF4,
+0xCA, 0x28, 0xD8, 0xDE, 0x65, 0x92, 0x0E, 0xB3, 0x0D, 0x54, 0xF7, 0x1E, 0xD8, 0xD8, 0x25, 0xDB,
+0xA1, 0x31, 0x68, 0x82, 0x19, 0x01, 0x3E, 0xC4, 0x4E, 0x15, 0x24, 0x8A, 0x37, 0xEB, 0xA0, 0x7B,
+0x06, 0x77, 0x01, 0x60, 0xCE, 0xB4, 0x6E, 0x28, 0x40, 0x8C, 0x2E, 0xDC, 0x8B, 0x08, 0xC8, 0x46,
+0xA2, 0xE6, 0xD9, 0x9F, 0xCD, 0xD8, 0x12, 0x8C, 0x2A, 0x93, 0x46, 0x9A, 0xBA, 0xB9, 0xBF, 0x91,
+0xD6, 0x35, 0x82, 0xDE, 0xF2, 0xF5, 0x8C, 0x41, 0x71, 0x79, 0x1D, 0x39, 0xCB, 0xF8, 0x60, 0x74,
+0x23, 0x09, 0x15, 0xA3, 0x54, 0xE9, 0x63, 0xC6, 0x88, 0xCB, 0xE5, 0x0E, 0xAA, 0x4D, 0x74, 0x76,
+0xA7, 0x9A, 0x45, 0x75, 0x7A, 0xB9, 0x2F, 0xC3, 0x76, 0x98, 0x55, 0x77, 0xEC, 0xD8, 0x82, 0xDD,
+0x69, 0xF0, 0x7D, 0x4A, 0xF6, 0xBD, 0xC8, 0x41, 0x73, 0x20, 0xFD, 0xD9, 0xBA, 0xF1, 0xDD, 0xCB,
+0xEF, 0x17, 0xEE, 0xD0, 0xB1, 0x01, 0xF9, 0xCF, 0xE8, 0xA7, 0xE5, 0xBB, 0x71, 0xD4, 0x5E, 0x4A,
+0x85, 0x74, 0x0F, 0x48, 0x0B, 0x49, 0x52, 0x3B, 0xBE, 0xA7, 0x49, 0xDE, 0xB8, 0xF7, 0x2E, 0x83,
+0x54, 0x78, 0x50, 0x69, 0xE2, 0xB6, 0x6D, 0xCC, 0x31, 0xC7, 0x1F, 0x5D, 0x0F, 0xC0, 0x7F, 0xEE,
+0x53, 0x30, 0x91, 0xD2, 0xAF, 0xAF, 0xD3, 0xA2, 0xD5, 0x97, 0xEA, 0x2F, 0xB7, 0x12, 0xDB, 0xB5,
+0x6B, 0x73, 0x78, 0x1C, 0xBE, 0x6E, 0xEC, 0x37, 0xA3, 0x76, 0x99, 0xC0, 0x99, 0x73, 0xA0, 0xF6,
+0xE0, 0xE8, 0xB4, 0x41, 0x39, 0xA6, 0x2A, 0x45, 0x85, 0x6F, 0xB1, 0x36, 0xFB, 0x75, 0xEC, 0x2F,
+0x31, 0xE4, 0xDE, 0xBB, 0x93, 0x98, 0x9F, 0xDC, 0x95, 0x82, 0xBB, 0x98, 0x7C, 0x9C, 0x83, 0x79,
+0x09, 0x99, 0x1F, 0x8E, 0xFB, 0xF0, 0xB2, 0x3D, 0xF4, 0xC5, 0xA3, 0xEF, 0x24, 0x77, 0x0A, 0x59,
+0xEE, 0xE0, 0x8F, 0xD3, 0x2E, 0x60, 0xC2, 0xF6, 0x53, 0x25, 0x5D, 0x0F, 0x02, 0xCF, 0xF9, 0xC1,
+0xE0, 0x20, 0x27, 0x76, 0x0C, 0x16, 0x21, 0xBE, 0x4C, 0xF3, 0xC3, 0x64, 0xD1, 0x24, 0xC7, 0x42,
+0x7C, 0x99, 0x58, 0x7B, 0x09, 0xF5, 0x33, 0xBF, 0xB7, 0xCC, 0x37, 0x10, 0x78, 0xAA, 0xB0, 0xB4,
+0x68, 0xDC, 0x8A, 0x1F, 0xBF, 0xCB, 0xCF, 0xF2, 0xE5, 0xD0, 0x6A, 0xD2, 0xFB, 0xAE, 0x56, 0xD1,
+0x54, 0x78, 0x16, 0x12, 0xE9, 0x79, 0x26, 0xA4, 0x34, 0xD2, 0x23, 0xC4, 0xA6, 0x9E, 0xD4, 0x99,
+0xAD, 0x63, 0x6C, 0xA6, 0x46, 0x9A, 0x9A, 0x1A, 0x66, 0x6A, 0x59, 0xA4, 0x0D, 0xC6, 0xAE, 0x44,
+0xD9, 0x11, 0xA5, 0x43, 0xCD, 0x98, 0x6E, 0xAA, 0x12, 0xC5, 0xCC, 0x55, 0x33, 0xD5, 0xE5, 0xA4,
+0xE7, 0x7E, 0x6F, 0x51, 0xD8, 0xA2, 0xCF, 0x9B, 0xBF, 0x13, 0xA9, 0x84, 0xA9, 0x79, 0x59, 0x94,
+0xA6, 0x37, 0x59, 0xAA, 0x72, 0x3F, 0x29, 0xFD, 0xB5, 0xA2, 0x74, 0xD5, 0x1A, 0x2F, 0xAA, 0xA2,
+0xAA, 0x71, 0x1E, 0xC1, 0x9B, 0x54, 0x3B, 0x69, 0xA4, 0xBC, 0xEF, 0xFC, 0x56, 0xFA, 0x13, 0xDB,
+0xAF, 0xDF, 0x49, 0xEA, 0x8B, 0xE7, 0xCA, 0x8C, 0x93, 0x46, 0xDC, 0xA3, 0xAB, 0x27, 0xCC, 0x43,
+0xB9, 0x6B, 0x41, 0x3A, 0x0F, 0x6E, 0x97, 0x75, 0x69, 0x18, 0x5B, 0xB4, 0x41, 0xB5, 0xA3, 0xFF,
+0x62, 0x6D, 0x3E, 0xA3, 0x66, 0x0C, 0x33, 0x77, 0x2F, 0xD8, 0x03, 0x3F, 0xB6, 0x0E, 0x9A, 0x62,
+0xA1, 0x50, 0xF9, 0x8F, 0x79, 0xD5, 0xEB, 0x92, 0x0F, 0xA1, 0xAA, 0x98, 0xD9, 0x78, 0x88, 0xB2,
+0xA7, 0xFD, 0xCB, 0x31, 0x72, 0x85, 0xCF, 0x73, 0xB8, 0xB9, 0x72, 0x17, 0x31, 0xB3, 0x31, 0x4B,
+0x3E, 0x6A, 0x99, 0xAF, 0x18, 0xEA, 0xE4, 0xD7, 0x6F, 0x07, 0x48, 0x55, 0x1F, 0x62, 0x62, 0xB7,
+0x63, 0x11, 0xED, 0x87, 0x63, 0xD3, 0x6A, 0xFB, 0x92, 0xD1, 0x34, 0x7E, 0x0D, 0x59, 0xD2, 0xAF,
+0x22, 0x59, 0x28, 0x9D, 0xD6, 0x5B, 0x60, 0x86, 0xA5, 0x7F, 0x9D, 0xF8, 0x9E, 0xC4, 0xF9, 0x98,
+0x9E, 0xAB, 0x8F, 0x9D, 0xAA, 0x6D, 0xAE, 0xB8, 0x69, 0x10, 0x8D, 0xCE, 0x3D, 0x0D, 0x9A, 0xD5,
+0xF1, 0x97, 0x59, 0xE5, 0x75, 0xC8, 0x7C, 0xCE, 0xD4, 0xCC, 0x4C, 0xC1, 0xD4, 0x1F, 0x0A, 0xF6,
+0xF0, 0x6B, 0xF1, 0x97, 0x5F, 0x58, 0xFC, 0xD5, 0xCB, 0x2D, 0xB2, 0x9A, 0x95, 0xCF, 0xAF, 0x19,
+0xF3, 0x6E, 0xA9, 0x7B, 0x34, 0x4A, 0xE8, 0x56, 0xD2, 0x4E, 0x9A, 0x50, 0x3F, 0xC0, 0x16, 0x64,
+0xB4, 0x38, 0xF4, 0x81, 0xCC, 0x7D, 0x6E, 0x47, 0x4F, 0x18, 0x60, 0x3A, 0x93, 0x06, 0x0E, 0x0E,
+0xC7, 0x06, 0xF8, 0xD8, 0x3D, 0x89, 0x80, 0x0A, 0x06, 0x57, 0xB4, 0xE3, 0x04, 0x23, 0x64, 0x19,
+0x40, 0x71, 0xB3, 0x7E, 0x8C, 0xD1, 0x99, 0xFC, 0x0D, 0xAA, 0x18, 0x20, 0x0D, 0x03, 0x48, 0x5D,
+0x41, 0xC7, 0xFF, 0x01, 0xA8, 0x6F, 0x8D, 0x1E, 0x24, 0x08, 0x5C, 0xD0, 0xB7, 0x22, 0x4A, 0xB2,
+0x8B, 0x7B, 0xB7, 0x8A, 0xE2, 0xAE, 0xDF, 0x89, 0xB5, 0xC7, 0xCD, 0xA1, 0x72, 0xD5, 0x5A, 0x99,
+0x38, 0xF8, 0x2D, 0x04, 0x19, 0x70, 0xC1, 0x66, 0x34, 0x29, 0xF3, 0x9F, 0x3D, 0xFC, 0xE0, 0xE2,
+0xAA, 0x58, 0xBD, 0x7E, 0x0D, 0x80, 0x48, 0x7D, 0xFE, 0x29, 0xEC, 0x4B, 0x0A, 0x62, 0x25, 0xFB,
+0x2E, 0x2F, 0xA2, 0x22, 0x11, 0x73, 0x7E, 0x6F, 0x31, 0x90, 0x64, 0x29, 0x33, 0x35, 0xEF, 0x41,
+0x33, 0xE9, 0xEE, 0x9D, 0x9B, 0xE4, 0xC7, 0x21, 0xFD, 0xAF, 0x36, 0x22, 0x22, 0x97, 0x0F, 0x7E,
+0xF7, 0x2E, 0x75, 0xF0, 0xFD, 0x6E, 0x90, 0x90, 0x2E, 0x3C, 0xA8, 0xA3, 0x5D, 0x46, 0xFA, 0x11,
+0x57, 0xD4, 0x48, 0x62, 0x99, 0x4E, 0x66, 0x14, 0x44, 0x6F, 0x1D, 0x88, 0xD4, 0xCF, 0x40, 0x59,
+0xFA, 0xEA, 0x97, 0x9F, 0xA8, 0xBB, 0x03, 0xC7, 0x62, 0xF7, 0x18, 0x00, 0x79, 0x79, 0xE6, 0x53,
+0x0F, 0x88, 0x6F, 0xDE, 0x18, 0xBE, 0x73, 0x64, 0xEC, 0x6B, 0x02, 0x0A, 0xE4, 0x5A, 0x74, 0xB6,
+0x03, 0xC1, 0x64, 0x07, 0x60, 0xD6, 0x5E, 0xCA, 0xC4, 0xEB, 0xF7, 0xE1, 0x77, 0x05, 0x09, 0x69,
+0x07, 0x14, 0xBB, 0x69, 0x7C, 0x8F, 0x9D, 0xC5, 0xAE, 0x15, 0x4E, 0x48, 0x1B, 0x9D, 0x4B, 0xB5,
+0xE5, 0xA6, 0xD1, 0x4F, 0x9A, 0xD9, 0xB9, 0x37, 0x6D, 0x1F, 0x88, 0x16, 0x77, 0xB5, 0x68, 0x44,
+0x99, 0xCC, 0xEB, 0xE1, 0x0F, 0x54, 0x26, 0x30, 0xDE, 0x08, 0x7F, 0x48, 0x26, 0xF9, 0x66, 0x8E,
+0x46, 0xEE, 0x14, 0xC2, 0x83, 0x99, 0x22, 0xDE, 0x45, 0x54, 0xF4, 0x18, 0x92, 0xC2, 0xCF, 0x83,
+0xE4, 0x6D, 0x45, 0x84, 0xF0, 0xE7, 0x3F, 0xFD, 0x40, 0x58, 0xB7, 0xC4, 0x1E, 0xC4, 0xB5, 0x6D,
+0x64, 0xBF, 0x37, 0x61, 0x1B, 0xB5, 0xFD, 0x07, 0xF7, 0xA4, 0x1F, 0x43, 0x37, 0xEB, 0xC3, 0xD9,
+0x20, 0x70, 0x8D, 0x7D, 0x9B, 0x34, 0x58, 0xD9, 0x6A, 0x17, 0x9B, 0xC2, 0xA4, 0x3B, 0x83, 0x10,
+0xFA, 0xCB, 0x18, 0xD4, 0x51, 0x38, 0x0C, 0xF3, 0x4B, 0xA1, 0x95, 0x92, 0xF6, 0x0A, 0xBE, 0x1D,
+0x84, 0x12, 0x48, 0xF9, 0xDA, 0x8B, 0x94, 0x48, 0x25, 0x75, 0x4B, 0x27, 0xB2, 0x10, 0x0A, 0x2B,
+0x2A, 0x6B, 0x24, 0xCF, 0x39, 0x61, 0xD4, 0xD9, 0xAE, 0xDD, 0x76, 0x1E, 0xC6, 0x32, 0xF6, 0x70,
+0x8D, 0xC8, 0xFD, 0xF6, 0x2A, 0x5F, 0x6B, 0x42, 0x4A, 0xFD, 0xC7, 0x60, 0xDE, 0x16, 0x7F, 0xAE,
+0xFA, 0x8C, 0x54, 0x5C, 0xDB, 0x5E, 0x9F, 0x24, 0x7E, 0xDE, 0xEA, 0x62, 0xE9, 0xF8, 0x15, 0x94,
+0xB5, 0x59, 0xAB, 0xB1, 0xDA, 0x64, 0xC1, 0xD6, 0x2A, 0x5B, 0xF0, 0x21, 0x25, 0xA9, 0x0B, 0x50,
+0xEE, 0x5A, 0x90, 0x7C, 0x92, 0xBE, 0x5D, 0xAF, 0x20, 0x52, 0xE8, 0xC5, 0x0F, 0x8E, 0x87, 0xEB,
+0xF0, 0xDB, 0x68, 0xF6, 0x2F, 0x0D, 0x7E, 0xE1, 0xED, 0x82, 0x43, 0x7E, 0x3B, 0x88, 0x1D, 0xF7,
+0xB5, 0x75, 0x24, 0x72, 0x3C, 0x5D, 0x21, 0x95, 0xF6, 0x5B, 0xBF, 0xD2, 0x70, 0x64, 0x38, 0xCA,
+0xC9, 0xFC, 0xB5, 0x75, 0x5A, 0xFE, 0xD8, 0x22, 0x68, 0x17, 0xEA, 0x9F, 0x44, 0xC2, 0x95, 0xAC,
+0xE3, 0x7F, 0xE6, 0x8C, 0x63, 0xCE, 0x29, 0x0C, 0xF8, 0x7E, 0x10, 0xCE, 0x3E, 0xF8, 0x35, 0xD5,
+0xFB, 0xFD, 0x70, 0x33, 0xE7, 0xFD, 0x14, 0xC6, 0xE0, 0xA3, 0xCB, 0x48, 0x41, 0x33, 0x81, 0x48,
+0x2D, 0x28, 0x85, 0xF4, 0x37, 0x6C, 0x95, 0xDC, 0x75, 0x19, 0xB1, 0x93, 0xB6, 0xD6, 0xCE, 0x60,
+0x76, 0xCC, 0x1F, 0xA9, 0x45, 0xB1, 0x64, 0xA6, 0xF6, 0x7A, 0x5F, 0x13, 0x0E, 0x8A, 0x93, 0xFE,
+0xAC, 0xC8, 0x8E, 0xEC, 0x45, 0x3B, 0x16, 0xAF, 0x1E, 0x44, 0xE6, 0xD1, 0x92, 0xB5, 0x1E, 0x26,
+0x43, 0x6E, 0xA9, 0x76, 0xAB, 0xF7, 0x19, 0xBE, 0x99, 0xB8, 0x2F, 0x57, 0x57, 0x05, 0x97, 0x25,
+0x0A, 0x37, 0x42, 0x04, 0xE9, 0x5F, 0x77, 0x02, 0x69, 0x57, 0x68, 0x4A, 0xDD, 0x04, 0x92, 0x76,
+0x70, 0x7D, 0xA7, 0xA8, 0xD5, 0x8D, 0x1C, 0xAA, 0xDA, 0x21, 0xC2, 0x13, 0xBE, 0x78, 0x0C, 0xB2,
+0x68, 0x87, 0x82, 0x32, 0x08, 0x3F, 0xBD, 0xAB, 0xC8, 0x6F, 0x47, 0xB3, 0xEE, 0xCD, 0x38, 0x18,
+0x11, 0x7B, 0x0C, 0x3B, 0x28, 0x30, 0x01, 0xED, 0xC6, 0x0D, 0xEB, 0x24, 0xED, 0xC6, 0x72, 0xA4,
+0x25, 0xBF, 0x2F, 0x95, 0x3D, 0xAA, 0x22, 0xCC, 0xB9, 0xB6, 0x1B, 0xCE, 0xEC, 0xB2, 0xC1, 0x7C,
+0x43, 0x6D, 0x6B, 0x04, 0xBD, 0xEC, 0x4E, 0xE9, 0x8B, 0x21, 0x9E, 0xE4, 0x77, 0xD6, 0x28, 0x4C,
+0x68, 0xE7, 0xCF, 0x51, 0xC5, 0xBA, 0x22, 0xE7, 0x77, 0x21, 0x3A, 0x55, 0x15, 0xA6, 0xE5, 0xCD,
+0xB0, 0x5E, 0x11, 0x17, 0x7F, 0xA6, 0xB4, 0xA0, 0xF9, 0x39, 0x7D, 0x3A, 0xEA, 0xA3, 0x4B, 0x55,
+0x92, 0xDB, 0x7D, 0x2D, 0xA7, 0x68, 0xF2, 0xF3, 0xB2, 0x1E, 0x66, 0x4C, 0xFA, 0x4F, 0x52, 0xD9,
+0x1B, 0x80, 0xA9, 0x97, 0xB9, 0xE6, 0xDA, 0x96, 0x89, 0x2C, 0x27, 0x51, 0x60, 0x82, 0xE3, 0x5E,
+0xA8, 0x52, 0xEC, 0x1F, 0x7D, 0xEA, 0x3C, 0x2A, 0x56, 0xF2, 0xAD, 0x1D, 0x3B, 0x27, 0x8A, 0x18,
+0x55, 0x2B, 0x46, 0x2B, 0x33, 0xE2, 0x97, 0x6A, 0x59, 0xA3, 0x07, 0x09, 0xA7, 0xE4, 0x63, 0xC3,
+0x98, 0xC1, 0xB2, 0x0F, 0x35, 0x0C, 0xA6, 0xDE, 0x7A, 0xBE, 0xD6, 0xF8, 0x95, 0xC8, 0xFD, 0x56,
+0x99, 0x46, 0xA4, 0x13, 0xEB, 0xC5, 0x72, 0x07, 0xD5, 0x2A, 0xAA, 0x75, 0xDC, 0x0A, 0x8C, 0x18,
+0x5E, 0x87, 0x15, 0x62, 0x86, 0xD1, 0xFD, 0x1F, 0xE3, 0x98, 0x04, 0xB1, 0xE3, 0x8E, 0x20, 0x6C,
+0x1F, 0x7D, 0x38, 0x6B, 0xF7, 0x8E, 0x6D, 0xA4, 0x6A, 0x2A, 0x8D, 0x54, 0x6F, 0xEF, 0x42, 0x8A,
+0x2F, 0xEE, 0xA4, 0xC3, 0x9D, 0x4F, 0x64, 0x8B, 0x39, 0xFC, 0x78, 0x66, 0xBD, 0xA2, 0x58, 0x52,
+0x11, 0x45, 0xFB, 0x49, 0x4C, 0x89, 0x27, 0xBF, 0xFB, 0x1A, 0x3D, 0xF8, 0x43, 0x9B, 0xF9, 0x14,
+0x99, 0xFE, 0xA7, 0x13, 0xA4, 0xBC, 0xA1, 0xA9, 0xDF, 0x68, 0xE5, 0x0D, 0x96, 0x6B, 0xEC, 0xDB,
+0xA4, 0xC1, 0xCA, 0x56, 0xBB, 0xD8, 0x38, 0x37, 0xA3, 0x46, 0xA4, 0xCA, 0x30, 0x16, 0xDB, 0x56,
+0x48, 0xAA, 0x2D, 0xFC, 0xE5, 0x43, 0x93, 0xDD, 0x62, 0x37, 0xF6, 0x0F, 0xBE, 0x17, 0xF0, 0xD5,
+0x50, 0x05, 0x0C, 0x3D, 0xC4, 0x3F, 0xCD, 0x17, 0x34, 0x53, 0x6C, 0x54, 0xE6, 0xF2, 0x02, 0xB6,
+0xE0, 0x99, 0x6F, 0x1A, 0x2F, 0xC1, 0x43, 0xDE, 0x75, 0xDF, 0x36, 0x51, 0xF9, 0x12, 0x3D, 0x50,
+0x85, 0x48, 0x85, 0x12, 0xF5, 0xA1, 0x4B, 0xBE, 0x4E, 0x4A, 0x96, 0x32, 0x65, 0xCE, 0xEA, 0x10,
+0x2E, 0x21, 0xAA, 0x9A, 0x49, 0xB7, 0x51, 0xC2, 0x55, 0x65, 0x45, 0x7D, 0xE8, 0x8C, 0x90, 0xB9,
+0x72, 0x28, 0x2C, 0x83, 0x37, 0x71, 0x5F, 0x41, 0xD5, 0x69, 0x74, 0x77, 0x02, 0x5D, 0xBE, 0x7D,
+0x77, 0x8A, 0xA8, 0xEA, 0x98, 0x52, 0xE3, 0xFE, 0x76, 0x48, 0xA9, 0x2E, 0x26, 0xD9, 0xD0, 0x01,
+0x42, 0x05, 0xA2, 0x37, 0x84, 0x5F, 0x2C, 0x7F, 0xF4, 0xDC, 0xEB, 0xE1, 0x14, 0x23, 0xAC, 0xE4,
+0x97, 0x6A, 0xF3, 0x0E, 0x71, 0xCA, 0x87, 0xB9, 0x93, 0x44, 0x66, 0x16, 0x2A, 0x15, 0xCD, 0x4C,
+0x49, 0x35, 0x55, 0x62, 0xA3, 0x18, 0x29, 0x81, 0x71, 0xFF, 0x31, 0xFE, 0x95, 0xAD, 0x5B, 0x4C,
+0xD9, 0x54, 0x75, 0xD3, 0x14, 0xBC, 0x5A, 0x85, 0x4A, 0x54, 0x2A, 0xC3, 0xC7, 0x30, 0xD2, 0x7A,
+0x15, 0x7F, 0x25, 0xF3, 0x32, 0xB8, 0x10, 0x0D, 0xE1, 0x94, 0x3E, 0x35, 0x19, 0x20, 0xD6, 0x85,
+0x07, 0x90, 0x94, 0xB8, 0x87, 0xDB, 0x09, 0xAC, 0xF2, 0x31, 0x06, 0xA7, 0xE8, 0x77, 0xF1, 0xC5,
+0x45, 0xA7, 0x75, 0x9A, 0x61, 0x69, 0x06, 0x6E, 0x81, 0x6A, 0x28, 0x3F, 0x3A, 0x44, 0x99, 0x34,
+0xF5, 0xCD, 0xE7, 0x4B, 0x24, 0x73, 0x36, 0x3B, 0x64, 0xD2, 0x25, 0xAC, 0x22, 0x7E, 0x72, 0x99,
+0x12, 0x5A, 0x2A, 0x7B, 0x8A, 0x97, 0xCE, 0xE1, 0x54, 0xA7, 0xCD, 0x97, 0xAC, 0x4E, 0xB9, 0x06,
+0xC5, 0x3A, 0xB1, 0x8D, 0x58, 0x37, 0x83, 0x27, 0xB0, 0x08, 0xED, 0x00, 0xF9, 0xE6, 0x17, 0xBC,
+0xAB, 0xDB, 0xAB, 0x0C, 0xC9, 0x2D, 0xAD, 0x7E, 0xA5, 0x54, 0xA9, 0x11, 0x6A, 0xC2, 0x64, 0xAA,
+0x67, 0xA0, 0xB2, 0xF1, 0xD8, 0x81, 0xC9, 0x45, 0xD5, 0x6E, 0x25, 0x3F, 0x18, 0x18, 0x48, 0x71,
+0x37, 0x4C, 0xB1, 0x7C, 0xF0, 0x39, 0x23, 0x70, 0xCF, 0xC1, 0xB4, 0xCB, 0x5C, 0x90, 0x37, 0xE3,
+0x60, 0xE4, 0xE2, 0x65, 0xA4, 0xD4, 0x60, 0x5F, 0xB8, 0xD8, 0xD3, 0x04, 0xB8, 0xD2, 0x83, 0xD1,
+0x92, 0x4C, 0xFF, 0x41, 0x87, 0x76, 0x09, 0xA2, 0x58, 0xE4, 0x5B, 0x5A, 0xBF, 0x66, 0xEB, 0x30,
+0xB4, 0x46, 0x6F, 0x58, 0x03, 0x38, 0x09, 0x0F, 0x7D, 0xB0, 0xA6, 0xA1, 0xC0, 0xCC, 0x4F, 0xCE,
+0xC8, 0x9C, 0xBD, 0x07, 0x11, 0xA7, 0x2B, 0x59, 0x98, 0x79, 0x6B, 0x31, 0x81, 0x42, 0x85, 0x63,
+0x9A, 0x11, 0x1E, 0x8B, 0x92, 0x3B, 0x7C, 0x3E, 0x84, 0xC0, 0x80, 0x48, 0x2D, 0xB7, 0x87, 0x2B,
+0x3F, 0x67, 0x24, 0xB9, 0x6E, 0x7D, 0x60, 0xA0, 0x05, 0xD5, 0xA6, 0xE5, 0xCC, 0xC3, 0xAD, 0x18,
+0x63, 0xAA, 0x6A, 0x7C, 0xF0, 0x18, 0xC7, 0x77, 0xB4, 0x07, 0x37, 0x70, 0x5B, 0xAD, 0x93, 0x67,
+0xE1, 0xFC, 0x0F, 0x81, 0xA3, 0x1F, 0x24, 0x91, 0xBB, 0x1F, 0x34, 0x52, 0x67, 0x2D, 0xBC, 0x9D,
+0x50, 0x59, 0xF7, 0xED, 0xDF, 0x25, 0xF9, 0x10, 0x2F, 0x21, 0x37, 0xEC, 0x0C, 0x7E, 0x60, 0x56,
+0x0E, 0x1B, 0x22, 0xD9, 0x4E, 0x0E, 0x26, 0xF6, 0xE5, 0x48, 0xAC, 0x5F, 0x4B, 0x32, 0xBD, 0x8D,
+0x26, 0x70, 0xF8, 0x71, 0x4F, 0x72, 0x4F, 0xD9, 0x86, 0xD6, 0x94, 0xC5, 0x3F, 0x45, 0x93, 0x70,
+0x4F, 0xF9, 0x08, 0x41, 0x18, 0x93, 0xF8, 0x5E, 0xE4, 0xD8, 0x1E, 0x82, 0x29, 0x96, 0x0A, 0xF1,
+0x4A, 0x0F, 0x26, 0x43, 0x66, 0xAE, 0x41, 0x46, 0x03, 0xCF, 0x42, 0xF5, 0x1C, 0x82, 0xDB, 0x01,
+0xE7, 0x8E, 0xE0, 0xC9, 0xE0, 0x14, 0x7E, 0xEF, 0xC2, 0xBF, 0xAE, 0x07, 0x04, 0x6D, 0xEB, 0x16,
+0x9A, 0xCA, 0x57, 0xF6, 0xDD, 0xCF, 0xF9, 0xFF, 0x10, 0xB6, 0x1B, 0x63, 0x5A, 0x28, 0x35, 0x9B,
+0xB9, 0x6A, 0xBD, 0xD2, 0x96, 0xDE, 0x58, 0xF9, 0x4F, 0x16, 0xB1, 0x63, 0xB2, 0x46, 0xF8, 0x13,
+0x50, 0x76, 0xE6, 0xB6, 0x46, 0xD8, 0xE4, 0x45, 0x88, 0xDD, 0x4A, 0x29, 0xB1, 0xCC, 0xD1, 0xF8,
+0x1D, 0x18, 0x59, 0x5D, 0x42, 0xB0, 0x0E, 0xC5, 0xAE, 0x1D, 0x16, 0x9D, 0x7A, 0x7A, 0x6D, 0x1E,
+0x94, 0xA0, 0xD5, 0xA6, 0x3A, 0x55, 0x55, 0xE2, 0x43, 0x17, 0xDE, 0xCA, 0x7D, 0xF3, 0xB2, 0xB1,
+0x8C, 0x97, 0xD5, 0xBF, 0x4E, 0x17, 0x85, 0x78, 0xB0, 0xDD, 0xD6, 0xCA, 0xAA, 0x9A, 0x66, 0xF7,
+0x93, 0x9B, 0x27, 0xED, 0xC9, 0xAB, 0x8F, 0x6D, 0xB7, 0x3E, 0x4B, 0xAD, 0x56, 0x56, 0x82, 0x4F,
+0x5A, 0x41, 0x92, 0x91, 0x84, 0xB7, 0x15, 0x24, 0x8F, 0x1B, 0x42, 0xBF, 0x7E, 0xEC, 0x74, 0x78,
+0xE1, 0xFD, 0x13, 0x88, 0x96, 0x1D, 0x4D, 0x7B, 0xDD, 0xDD, 0xD8, 0xFC, 0x5A, 0xD1, 0x55, 0xF4,
+0x11, 0xD9, 0x04, 0x73, 0x40, 0x2B, 0x54, 0xAA, 0x39, 0x2C, 0x2E, 0x79, 0x1F, 0xB5, 0xB9, 0x86,
+0xB7, 0xE3, 0x50, 0x59, 0xC7, 0x94, 0x94, 0x19, 0xBD, 0x91, 0xFB, 0xD6, 0x62, 0x1F, 0xDF, 0xCB,
+0xE0, 0xCA, 0xCB, 0x47, 0xC5, 0xCB, 0x81, 0xE3, 0xCE, 0x17, 0x20, 0x77, 0xEB, 0xA0, 0x90, 0x1C,
+0xDC, 0xCC, 0x60, 0x81, 0x95, 0x7D, 0xB8, 0x57, 0xD4, 0x79, 0x2B, 0xCC, 0x48, 0xEF, 0x23, 0x30,
+0x35, 0xD0, 0x77, 0x46, 0x14, 0x43, 0x06, 0x4D, 0x44, 0xE7, 0xF3, 0x38, 0xF8, 0xFA, 0xA4, 0xD2,
+0xF8, 0xFC, 0x84, 0x76, 0xD0, 0xB9, 0x5B, 0xD4, 0x7E, 0xFD, 0x5C, 0x3E, 0xD7, 0xBC, 0x91, 0xA9,
+0xB0, 0xCD, 0x21, 0x9F, 0xB6, 0x3A, 0xF1, 0xB8, 0x70, 0xF1, 0xCB, 0x9C, 0x39, 0xA6, 0x76, 0x23,
+0x2D, 0xCD, 0x6A, 0xFB, 0x1A, 0xDE, 0x08, 0x76, 0xAB, 0x75, 0xCD, 0x02, 0x98, 0x3F, 0xE6, 0x8D,
+0xE8, 0x63, 0x47, 0x85, 0x8D, 0x07, 0x4D, 0xB0, 0x63, 0x20, 0x64, 0xDC, 0x17, 0x96, 0xBB, 0x4A,
+0x34, 0xF2, 0x60, 0x62, 0x63, 0xFE, 0x60, 0xA4, 0x49, 0x9C, 0xC4, 0x8E, 0xB6, 0x8B, 0x8B, 0xD8,
+0x31, 0xE3, 0x66, 0xC4, 0x4F, 0xF0, 0x33, 0xC7, 0xE8, 0xC8, 0x51, 0xEC, 0x6D, 0xCA, 0x24, 0xB7,
+0xDC, 0x6D, 0x62, 0x39, 0x5F, 0xAA, 0x7A, 0x70, 0x70, 0xB1, 0xBD, 0x9B, 0xBB, 0x24, 0xC0, 0x51,
+0x9D, 0x3E, 0x99, 0xCD, 0x52, 0xFF, 0x67, 0xB0, 0x20, 0x5F, 0x47, 0x04, 0x26, 0x37, 0x69, 0xE7,
+0x2E, 0x2D, 0xBC, 0x37, 0x73, 0x9A, 0x35, 0xEA, 0x1F, 0xE5, 0x7D, 0xA1, 0x4A, 0x26, 0x24, 0x89,
+0x51, 0x96, 0xF4, 0x9B, 0xAB, 0x7C, 0xD7, 0x54, 0x7B, 0xCC, 0x45, 0x94, 0xA6, 0xC9, 0x46, 0x22,
+0xC4, 0xDD, 0x95, 0x83, 0xB9, 0x1C, 0xA8, 0xAA, 0xF1, 0xB1, 0x1C, 0x21, 0xE4, 0x38, 0x50, 0x55,
+0x23, 0xD9, 0xE4, 0x0F, 0x00, 0xEE, 0xEE, 0xE1, 0x07, 0x09, 0xD8, 0x55, 0xB8, 0xCE, 0xCC, 0xE1,
+0x3B, 0x62, 0x0E, 0xED, 0xE4, 0x4E, 0x19, 0xDC, 0x2F, 0xF6, 0x35, 0x44, 0xB7, 0xBE, 0xFA, 0xC6,
+0x91, 0x86, 0x1F, 0xEF, 0x63, 0x8B, 0x33, 0xF7, 0x26, 0xE2, 0xAE, 0x12, 0x24, 0x38, 0x0B, 0xC6,
+0x0C, 0x18, 0x50, 0x9D, 0xA4, 0x79, 0x7E, 0xA9, 0x20, 0x91, 0x1C, 0x1D, 0x12, 0x59, 0xAA, 0x57,
+0x24, 0x8C, 0xB3, 0xAC, 0xF3, 0x63, 0x6E, 0x6E, 0xCC, 0xEF, 0x45, 0x06, 0xF6, 0x30, 0xB7, 0x27,
+0x03, 0x02, 0x99, 0xC7, 0xEE, 0x4D, 0x44, 0xC8, 0xAE, 0xA4, 0xAF, 0x2C, 0xCB, 0x68, 0x69, 0xFA,
+0xD3, 0x11, 0x4F, 0xFE, 0x90, 0xB9, 0x86, 0xBC, 0xB8, 0x9C, 0x3B, 0xAC, 0xFF, 0x22, 0x88, 0x2D,
+0x45, 0x85, 0x3E, 0x28, 0xA0, 0xEB, 0xA1, 0x36, 0x32, 0xC5, 0x4F, 0xBE, 0x95, 0x59, 0x23, 0x1F,
+0x7F, 0xFA, 0xF2, 0x31, 0x81, 0x71, 0x57, 0x6E, 0x66, 0x6F, 0xE4, 0x57, 0x5F, 0x23, 0x95, 0x37,
+0x50, 0xE6, 0x13, 0x41, 0xEC, 0x5C, 0x19, 0x98, 0x60, 0xFE, 0x1A, 0xC8, 0xEB, 0x34, 0x57, 0x75,
+0x61, 0xC2, 0x30, 0xCB, 0x90, 0xC4, 0x2F, 0xD6, 0xFE, 0xDC, 0x5D, 0xEC, 0x43, 0x48, 0x31, 0x43,
+0x98, 0x73, 0x52, 0x29, 0x5C, 0x3D, 0xF3, 0x98, 0x15, 0x5D, 0x04, 0x53, 0x19, 0x99, 0xDC, 0xEE,
+0xE7, 0x66, 0xCC, 0x5B, 0x48, 0x83, 0xA8, 0x1F, 0xA6, 0x96, 0xA9, 0x2E, 0x27, 0x57, 0x29, 0xB1,
+0xD2, 0x5F, 0xE0, 0x9E, 0x4B, 0x4E, 0x14, 0x26, 0x79, 0x47, 0xCB, 0xE4, 0xFE, 0x62, 0x5E, 0x87,
+0x32, 0x3E, 0x7F, 0x5F, 0x15, 0xBD, 0x98, 0xEF, 0x4E, 0xEA, 0x4B, 0x0A, 0x95, 0xDD, 0xC1, 0xF8,
+0xA2, 0x11, 0x9A, 0xF8, 0xBE, 0xFA, 0x5A, 0x51, 0xB5, 0x73, 0xE5, 0x2E, 0xE6, 0xB6, 0xCB, 0xEB,
+0xF0, 0x85, 0xDC, 0xFC, 0x47, 0x5A, 0xB8, 0x9F, 0x23, 0x13, 0x17, 0x23, 0x4A, 0x76, 0x18, 0x5F,
+0x8A, 0x7F, 0x82, 0x7D, 0x64, 0x8F, 0xC3, 0x9C, 0x91, 0x7F, 0x89, 0x34, 0x30, 0x9F, 0x3E, 0x56,
+0x11, 0x3A, 0xE6, 0x6E, 0xE8, 0x43, 0x02, 0x5C, 0x2C, 0x55, 0x33, 0x50, 0xEC, 0xB8, 0x45, 0x91,
+0x02, 0xA7, 0x7D, 0x94, 0x2F, 0xC5, 0xBC, 0x0F, 0x2E, 0x8B, 0xDA, 0xFB, 0xB5, 0x3E, 0x68, 0xBE,
+0x75, 0x5B, 0x45, 0xE1, 0x13, 0x26, 0x6E, 0xD1, 0x9F, 0x42, 0x04, 0x33, 0x13, 0xA7, 0xA8, 0x99,
+0xE6, 0x9D, 0x06, 0x72, 0x49, 0xDF, 0xB6, 0x0E, 0x2C, 0x0E, 0xEB, 0xE0, 0xB0, 0xBE, 0x7B, 0x63,
+0x9F, 0xA8, 0x54, 0xAB, 0x7D, 0x4C, 0xC1, 0xC5, 0xE0, 0x24, 0xBE, 0xAC, 0xA6, 0x41, 0x28, 0xB9,
+0xE5, 0x9B, 0xFC, 0x32, 0xF7, 0x94, 0x11, 0x19, 0x0E, 0x3E, 0x2F, 0x55, 0x35, 0x76, 0x35, 0xD9,
+0x7D, 0xE8, 0x28, 0x5E, 0x9A, 0x2A, 0x69, 0x11, 0xC1, 0xB9, 0x4A, 0x59, 0xAB, 0xD2, 0x09, 0x21,
+0xB6, 0xF2, 0x51, 0xFD, 0x25, 0x2E, 0xA6, 0x68, 0x72, 0xC1, 0xEA, 0xEB, 0xA1, 0x5A, 0x80, 0x54,
+0x34, 0x18, 0xA3, 0x03, 0x9B, 0x40, 0x72, 0x57, 0xF8, 0x0B, 0x76, 0xB5, 0x71, 0x6B, 0xB4, 0xFE,
+0x95, 0x7E, 0xB7, 0xAE, 0x54, 0x4B, 0xD2, 0x4F, 0xF1, 0x62, 0xFA, 0x94, 0xB6, 0x92, 0x8B, 0x06,
+0xF7, 0x84, 0x95, 0xEF, 0x11, 0xFC, 0x77, 0x6A, 0x64, 0x46, 0x72, 0xDA, 0xF9, 0x83, 0xDB, 0x8C,
+0xF9, 0x23, 0x3F, 0xC7, 0xE7, 0x3C, 0xFF, 0x01, 0x82, 0x25, 0x98, 0xE6, 0xE4, 0x32, 0xC8, 0x5C,
+0xB7, 0xEC, 0x60, 0xD3, 0x82, 0xB4, 0x29, 0x37, 0xC7, 0x14, 0xCB, 0x79, 0xC2, 0x88, 0xCB, 0x39,
+0x28, 0xC6, 0x9D, 0xF8, 0x8E, 0xDD, 0x89, 0x68, 0x4F, 0xA6, 0xE7, 0x58, 0xE9, 0x41, 0x32, 0xB8,
+0x0B, 0xD1, 0x84, 0xBB, 0x70, 0x7D, 0x0A, 0x40, 0x58, 0xF8, 0xC5, 0x2C, 0x3E, 0xA0, 0x1F, 0xE7,
+0xA8, 0xA9, 0x52, 0x16, 0x69, 0xEC, 0xBD, 0xCA, 0x48, 0x76, 0x7E, 0xCE, 0xC5, 0x0A, 0x00, 0x5F,
+0xAA, 0x1B, 0x21, 0xA7, 0x24, 0x25, 0x1B, 0x68, 0x2A, 0x95, 0x80, 0x8B, 0xC5, 0xE9, 0x3D, 0x17,
+0x7D, 0x92, 0xAE, 0xE5, 0x08, 0x5A, 0xEC, 0xA6, 0x7D, 0x5E, 0xD9, 0x36, 0xA6, 0x0B, 0x69, 0xC4,
+0x6F, 0x97, 0xE4, 0xCE, 0xCB, 0xE5, 0xF1, 0x95, 0x73, 0x20, 0x23, 0x13, 0x20, 0xE1, 0xFC, 0x0C,
+0x5F, 0x83, 0x8F, 0xF4, 0x5F, 0x62, 0x8F, 0xDB, 0xFF, 0xF1, 0xDF, 0x7E, 0x13, 0xFB, 0xC5, 0xFE,
+0x65, 0xF8, 0x57, 0xBF, 0xDD, 0xF8, 0x83, 0x5B, 0xB3, 0x31, 0x29, 0x2F, 0xBF, 0x6F, 0xE8, 0x06,
+0x33, 0x41, 0x55, 0x30, 0x17, 0x38, 0xA2, 0x10, 0xA0, 0xBE, 0x82, 0x8D, 0xF6, 0x95, 0xE5, 0x1A,
+0x51, 0x33, 0xD3, 0x14, 0x58, 0xFA, 0x67, 0x14, 0xC7, 0xF7, 0x0A, 0x48, 0x18, 0xD3, 0xFE, 0x32,
+0x2A, 0xF6, 0x8F, 0xFF, 0xE2, 0x79, 0xF4, 0xF5, 0x9B, 0x2B, 0xEA, 0xEB, 0xBF, 0xFE, 0xED, 0x6F,
+0x86, 0xDF, 0xC6, 0x5E, 0xC6, 0x3F, 0x79, 0xE5, 0x7D, 0x89, 0xD6, 0xA5, 0xE2, 0xCD, 0xDD, 0x51,
+0x58, 0xF7, 0x2C, 0x3E, 0x97, 0xD7, 0xB1, 0x0D, 0x1A, 0x31, 0x66, 0xF2, 0x6A, 0x3E, 0x1A, 0x55,
+0x27, 0xF3, 0x69, 0xCC, 0x1C, 0xB1, 0x62, 0x76, 0x8F, 0xC1, 0x37, 0x4B, 0xFC, 0x32, 0xF8, 0x38,
+0xF3, 0x7F, 0x91, 0x6B, 0x3F, 0x11, 0xC4, 0x8E, 0x6D, 0x67, 0x3E, 0x19, 0x2A, 0x48, 0x97, 0x91,
+0x3C, 0x91, 0x16, 0x07, 0x7E, 0xE8, 0xD4, 0xBF, 0x6E, 0xE5, 0x80, 0xB9, 0x82, 0x91, 0xCC, 0x6E,
+0xA9, 0x8E, 0xF8, 0x9E, 0xFF, 0x44, 0x33, 0xA5, 0x2D, 0xA9, 0x6E, 0x86, 0xA4, 0x13, 0xA3, 0xCA,
+0x4F, 0x39, 0x25, 0x6D, 0xB5, 0x47, 0x32, 0xA2, 0xEA, 0xA4, 0x4D, 0x0A, 0x9A, 0x9B, 0xFD, 0xF2,
+0x6B, 0xFC, 0xB9, 0xFD, 0x8D, 0xFD, 0xE3, 0x02, 0xAE, 0x35, 0xFB, 0xF5, 0x4E, 0x17, 0xE3, 0x79,
+0x2F, 0x6B, 0x1F, 0xC2, 0xF4, 0x45, 0xE2, 0x0B, 0x4D, 0xAA, 0xC3, 0xC9, 0xA6, 0xE3, 0xD7, 0x82,
+0xC8, 0x2E, 0x92, 0x3A, 0x6E, 0x78, 0x4F, 0x53, 0xD1, 0x5B, 0x1F, 0x9D, 0x0B, 0x2F, 0xBE, 0x77,
+0x02, 0x09, 0x4A, 0xC7, 0x9A, 0xA6, 0xDA, 0x49, 0x02, 0x5C, 0xFC, 0xD2, 0x01, 0x8F, 0x12, 0x53,
+0xEC, 0x9C, 0xF8, 0x96, 0x11, 0xB2, 0x7C, 0x7C, 0xF4, 0x3B, 0x56, 0x15, 0x4C, 0xC7, 0x48, 0x5F,
+0xA7, 0xB1, 0xE3, 0x25, 0x66, 0x76, 0xF4, 0xAF, 0xE4, 0xBA, 0xE3, 0xE5, 0xC2, 0xA5, 0x92, 0x3B,
+0x3F, 0x48, 0x88, 0x49, 0x68, 0x5B, 0x40, 0xEE, 0xB6, 0x21, 0x4A, 0x77, 0xCF, 0xFA, 0x9E, 0xA6,
+0xEC, 0x38, 0x31, 0x8D, 0x39, 0x7E, 0x1E, 0x5F, 0x5A, 0x57, 0x90, 0xA2, 0x61, 0x86, 0xE6, 0x57,
+0x99, 0xDF, 0xE6, 0x35, 0xB9, 0xE0, 0xFB, 0x2E, 0xEB, 0xAD, 0x0D, 0xAB, 0x14, 0xA9, 0x51, 0x2D,
+0x7D, 0xFA, 0xC6, 0x71, 0xCE, 0x27, 0x67, 0xA6, 0xD2, 0x79, 0xF5, 0x5A, 0x47, 0x55, 0xA0, 0xA0,
+0x19, 0x85, 0x89, 0x89, 0x39, 0x5B, 0xA9, 0x5A, 0x6E, 0x97, 0xC4, 0xC4, 0x1F, 0x77, 0x45, 0x5E,
+0x85, 0x6F, 0xB3, 0x55, 0xAC, 0xB2, 0xD1, 0xDE, 0x2E, 0xBD, 0x2C, 0x69, 0x03, 0xF9, 0xFD, 0xC5,
+0xBC, 0x73, 0x1C, 0xD9, 0x2B, 0xF0, 0x8F, 0x7B, 0xED, 0xE2, 0x64, 0xF8, 0x09, 0xB6, 0x2E, 0x5B,
+0xE9, 0xE3, 0x5D, 0x90, 0x3C, 0x3A, 0x7F, 0x4B, 0x24, 0x35, 0x54, 0x3C, 0xFF, 0x1D, 0xF4, 0x71,
+0x60, 0xA0, 0x9F, 0x11, 0xA3, 0x01, 0xE7, 0xB9, 0xE1, 0x39, 0xC6, 0x98, 0xFB, 0x89, 0x2E, 0xE7,
+0x03, 0x56, 0xEF, 0x7E, 0xF4, 0x27, 0xDB, 0x88, 0x88, 0xCF, 0x4D, 0x78, 0xAC, 0x9A, 0x2F, 0x66,
+0x04, 0x3B, 0x8D, 0xCE, 0x1C, 0xF0, 0xE0, 0x96, 0x5D, 0x5C, 0x2F, 0xF8, 0x0D, 0xC1, 0x28, 0x6E,
+0x26, 0xE9, 0xA5, 0x8F, 0xE8, 0x4A, 0x0F, 0x2E, 0xCA, 0x54, 0xA7, 0x54, 0x89, 0x5B, 0x7A, 0x9D,
+0x61, 0xD9, 0x15, 0x25, 0xB4, 0x40, 0x95, 0xBC, 0xA6, 0x51, 0x25, 0x48, 0x7E, 0x2C, 0xF0, 0x77,
+0x6D, 0x4D, 0x27, 0xA8, 0x80, 0xCD, 0x50, 0x9D, 0x44, 0xF3, 0x68, 0x82, 0x7E, 0x15, 0x3B, 0x29,
+0x7C, 0xFF, 0x07, 0x6F, 0x2C, 0xF3, 0x78, 0xBD, 0xFA, 0xFE, 0x0F, 0xDF, 0x08, 0xCF, 0xBF, 0xF0,
+0x0E, 0x82, 0x1B, 0xAE, 0x80, 0xD8, 0x80, 0xDC, 0x40, 0x38, 0x61, 0xF0, 0x44, 0xFC, 0x61, 0xED,
+0xF7, 0x94, 0xEF, 0x5C, 0xC5, 0x74, 0xE9, 0x9F, 0x2E, 0xA9, 0x91, 0x24, 0xA3, 0x9D, 0xF8, 0x11,
+0xD8, 0xE8, 0xE7, 0x67, 0xB9, 0x31, 0xE2, 0xB8, 0x0E, 0xC3, 0xC7, 0x9E, 0xBF, 0x75, 0x99, 0x16,
+0xEA, 0x45, 0x24, 0x66, 0xD6, 0xFE, 0xB2, 0x4F, 0xDE, 0xAF, 0xBC, 0x7F, 0x0B, 0xFB, 0xFA, 0xFD,
+0x1F, 0xBE, 0x1E, 0x9E, 0xFB, 0xF1, 0x9B, 0xE1, 0x83, 0x0F, 0xB1, 0x55, 0x18, 0x7E, 0xC0, 0xF0,
+0xBB, 0x9E, 0x11, 0xE0, 0xFC, 0x4B, 0xE5, 0x93, 0x91, 0xBB, 0x6C, 0x37, 0xFD, 0xEB, 0x64, 0xFE,
+0x37, 0xE8, 0xFF, 0x9A, 0xB7, 0x9D, 0x84, 0xB6, 0x0B, 0xAA, 0x75, 0x2B, 0xDC, 0x9B, 0xE2, 0x1A,
+0xB6, 0x72, 0xAA, 0xB2, 0x1C, 0x1C, 0x8B, 0xBE, 0xBF, 0xF2, 0xD9, 0x7E, 0xC3, 0xB7, 0xFA, 0x78,
+0x17, 0x32, 0xDB, 0xF4, 0x49, 0x6C, 0x10, 0x3C, 0x21, 0xF2, 0x29, 0x3E, 0x10, 0x9C, 0x62, 0x5C,
+0x7C, 0xEB, 0x55, 0xDB, 0xC0, 0xB7, 0xAB, 0x14, 0x31, 0xE5, 0x46, 0x55, 0x1A, 0xFD, 0xE8, 0xCA,
+0x87, 0x33, 0xFA, 0xB4, 0x25, 0x8D, 0xCD, 0x15, 0xB5, 0xF4, 0xCB, 0xCD, 0x22, 0x31, 0xA5, 0xBC,
+0xE9, 0x74, 0x52, 0x9F, 0xAA, 0x41, 0xB2, 0xEC, 0xDA, 0x4F, 0x77, 0xD1, 0xE1, 0x62, 0xB5, 0x5A,
+0x46, 0x4B, 0x68, 0x1D, 0x91, 0xA2, 0xC8, 0xF7, 0x87, 0xD5, 0xEB, 0xB9, 0xD7, 0x5C, 0x5D, 0xB2,
+0xFB, 0xB0, 0xBB, 0xEA, 0x37, 0x97, 0x54, 0x43, 0xEF, 0x87, 0x2B, 0x51, 0xA2, 0xEE, 0x19, 0x32,
+0xAA, 0xDA, 0x59, 0x9B, 0xEC, 0x3A, 0xCF, 0x91, 0xE7, 0xEA, 0xA4, 0x43, 0x48, 0xD5, 0xAE, 0xB5,
+0x1D, 0x11, 0xB2, 0xF8, 0x3B, 0x86, 0x0F, 0xCD, 0x5F, 0xE2, 0xC3, 0x7E, 0x92, 0xBE, 0x76, 0x37,
+0x63, 0xC5, 0x68, 0x70, 0xF8, 0xF9, 0xE5, 0xC5, 0x7C, 0x76, 0xAA, 0x56, 0x19, 0xB9, 0x11, 0x8C,
+0xC8, 0x36, 0x32, 0x5F, 0x42, 0xF7, 0x2B, 0x14, 0x25, 0x2F, 0xF9, 0x9F, 0xA5, 0xDC, 0x81, 0x50,
+0x2D, 0xA3, 0xAF, 0x99, 0xFA, 0xA6, 0xF9, 0xAE, 0x0A, 0x31, 0xEF, 0xA1, 0xD5, 0x57, 0x89, 0x78,
+0xC6, 0x39, 0x2A, 0x2A, 0x53, 0x34, 0xC3, 0x62, 0xE9, 0xBD, 0x6F, 0xFB, 0xBA, 0xF0, 0xC0, 0xCE,
+0x0D, 0x4D, 0x51, 0xA8, 0xE8, 0x43, 0xFA, 0x2E, 0x5C, 0x0D, 0xC6, 0xB0, 0x97, 0x2F, 0x0C, 0x0D,
+0xD2, 0x67, 0x0F, 0xE4, 0x30, 0x27, 0xC0, 0xA8, 0x5E, 0xEA, 0xA4, 0x53, 0x4C, 0x5C, 0x59, 0xD3,
+0x39, 0xE7, 0xAA, 0x9D, 0x92, 0x55, 0xC7, 0x46, 0x56, 0x05, 0xEF, 0xAF, 0x90, 0x5E, 0xBD, 0xCE,
+0xEB, 0xF5, 0xDC, 0x8B, 0x24, 0x09, 0x3E, 0x5F, 0x34, 0xBA, 0x16, 0x0B, 0x10, 0x16, 0xC5, 0x4E,
+0x26, 0xB5, 0xC6, 0xAB, 0x3E, 0x28, 0x31, 0xFD, 0x5D, 0xED, 0xB2, 0xD8, 0x35, 0xA2, 0x34, 0x34,
+0x38, 0xEC, 0xB7, 0x6D, 0x31, 0x8D, 0x2A, 0x6E, 0x74, 0x19, 0x5B, 0xBE, 0x1B, 0x1C, 0xB2, 0x59,
+0x23, 0x75, 0x14, 0xED, 0x0E, 0x43, 0x7D, 0xFB, 0xF6, 0xA9, 0xB1, 0xF0, 0xCD, 0x93, 0xA3, 0xF1,
+0xF1, 0x97, 0x35, 0xCF, 0xFD, 0x75, 0xFC, 0xFB, 0xD1, 0x28, 0xF6, 0x98, 0x1D, 0x09, 0x3F, 0x38,
+0x3B, 0x16, 0x2E, 0x8D, 0xCF, 0x88, 0x6F, 0x1D, 0xA3, 0x62, 0x35, 0x9C, 0xEC, 0xE3, 0x1D, 0x24,
+0x76, 0x74, 0xC8, 0x97, 0x9D, 0x6C, 0x50, 0x15, 0x7D, 0x8B, 0x6E, 0x64, 0x9C, 0x55, 0xA9, 0xE9,
+0xC0, 0x0F, 0x02, 0x98, 0x0F, 0x63, 0x8A, 0x91, 0x45, 0xDA, 0xE7, 0x12, 0xE7, 0x4A, 0x57, 0x7F,
+0x67, 0x3B, 0xF2, 0x29, 0xD1, 0x8B, 0x39, 0xAF, 0x69, 0x62, 0x13, 0x8B, 0x1F, 0xC7, 0x0D, 0xF3,
+0x94, 0x66, 0x58, 0x2A, 0x5E, 0x2B, 0x3D, 0x68, 0x82, 0x15, 0xF3, 0xA7, 0x98, 0x62, 0x97, 0x6A,
+0x5C, 0xD5, 0x05, 0xA4, 0xB1, 0xFB, 0xF8, 0x8F, 0xC9, 0x46, 0xC7, 0x4C, 0x45, 0x8C, 0xFA, 0x4B,
+0x1B, 0x3F, 0xF3, 0x20, 0x76, 0x08, 0x00, 0x38, 0x8B, 0xC4, 0xFD, 0x27, 0xA1, 0xBC, 0x9D, 0xC6,
+0x76, 0x56, 0x67, 0xE0, 0x8F, 0xDE, 0xD0, 0x03, 0x79, 0xF1, 0xCE, 0x20, 0x49, 0xEF, 0x75, 0x04,
+0x26, 0x4E, 0xC3, 0x5C, 0x3A, 0x0B, 0x6B, 0xC1, 0x08, 0x03, 0x34, 0xEA, 0xF9, 0xC3, 0xC9, 0x8F,
+0xBE, 0x06, 0x16, 0x58, 0x03, 0x81, 0xA8, 0x35, 0xAA, 0xEE, 0xE9, 0x25, 0x3E, 0x19, 0xEA, 0xA3,
+0xE8, 0xF3, 0x93, 0x1D, 0x9E, 0x01, 0x27, 0x38, 0x03, 0x7F, 0xBB, 0xD3, 0xD2, 0xFE, 0x45, 0xFA,
+0x5A, 0x07, 0x07, 0xEE, 0x28, 0x71, 0xFA, 0xE4, 0xC5, 0x70, 0x19, 0x6B, 0xDB, 0x0C, 0xFC, 0x30,
+0xB9, 0x9D, 0x1A, 0x73, 0xD7, 0xC5, 0x75, 0x0E, 0x75, 0x8B, 0xDF, 0x24, 0xFC, 0xF0, 0xBA, 0x7B,
+0x69, 0x2A, 0x5F, 0xF9, 0xDC, 0xD1, 0xAE, 0x70, 0x31, 0xA3, 0x95, 0x67, 0xA5, 0x13, 0xBB, 0xB1,
+0x19, 0xB4, 0x54, 0xA9, 0x1B, 0x6C, 0xF1, 0xC7, 0xBF, 0xF1, 0x4A, 0x6B, 0x60, 0x94, 0xCA, 0xD1,
+0xB3, 0x48, 0x9C, 0xC8, 0xBC, 0x62, 0x00, 0x5A, 0x22, 0x8B, 0xA8, 0xE8, 0x64, 0x4A, 0x4B, 0xAC,
+0xB3, 0x01, 0x1C, 0xE3, 0xF4, 0xB1, 0xC5, 0xAB, 0x3A, 0x9D, 0xCC, 0x99, 0x7E, 0x81, 0x1A, 0x27,
+0x5F, 0x1D, 0x59, 0xD3, 0xEB, 0x3C, 0xB7, 0xC5, 0xB6, 0xB6, 0x7F, 0xD2, 0x24, 0x6F, 0xAB, 0x70,
+0xBE, 0xAA, 0x5A, 0x17, 0x9B, 0x2C, 0x55, 0xCA, 0xA7, 0x27, 0x2B, 0x5F, 0xF3, 0xE1, 0x37, 0xCE,
+0x28, 0x1F, 0xF4, 0x4A, 0x51, 0x23, 0x3F, 0x59, 0x1B, 0x8D, 0x62, 0xEA, 0x22, 0xBF, 0xE0, 0x63,
+0x93, 0x7D, 0x44, 0x9D, 0x1C, 0x99, 0x6A, 0x47, 0xAD, 0xEC, 0xBD, 0xD3, 0x17, 0xC2, 0xAB, 0x47,
+0x4E, 0x21, 0xA9, 0xE4, 0xC7, 0xCB, 0x3D, 0xB4, 0x92, 0xB1, 0x96, 0x0F, 0x14, 0x88, 0x44, 0x0B,
+0x48, 0x1D, 0xC9, 0x5D, 0xEA, 0xB9, 0xF6, 0xAD, 0x32, 0xDE, 0xF1, 0xFB, 0xC5, 0xCC, 0xDB, 0x19,
+0xC6, 0x09, 0x4F, 0x05, 0x48, 0xEB, 0x71, 0xB0, 0x6C, 0x18, 0x73, 0x8C, 0x63, 0x23, 0x55, 0xAD,
+0xA3, 0x29, 0xB8, 0x03, 0x98, 0x3C, 0xB0, 0x6B, 0x53, 0x78, 0x68, 0xCF, 0x66, 0x73, 0x00, 0x5F,
+0x49, 0x4F, 0x56, 0x5E, 0x56, 0x02, 0x27, 0x90, 0xA3, 0x71, 0x1C, 0xBF, 0x22, 0x55, 0x41, 0xF4,
+0x39, 0x92, 0x66, 0x9D, 0x9D, 0xB6, 0xAF, 0xD6, 0x34, 0x7E, 0xF9, 0x57, 0x6D, 0x0C, 0x32, 0xB1,
+0x26, 0x24, 0x98, 0x6A, 0xFA, 0x9F, 0xBD, 0x9F, 0x63, 0x1B, 0x31, 0x37, 0x22, 0xC8, 0x08, 0xB8,
+0x56, 0x28, 0xBA, 0x3C, 0xB6, 0xE0, 0xCB, 0xAE, 0xD7, 0x32, 0xE7, 0xAF, 0xBC, 0x87, 0x9F, 0xBC,
+0x2B, 0x96, 0x5E, 0x66, 0x56, 0xDE, 0x1F, 0x62, 0xCB, 0xCF, 0x96, 0xD2, 0x76, 0x24, 0x97, 0x85,
+0x63, 0xDC, 0x45, 0x90, 0x33, 0xFA, 0xC8, 0xD5, 0x7B, 0x5C, 0xC0, 0x79, 0x3E, 0xF8, 0x5E, 0xFE,
+0xF7, 0xDC, 0xE8, 0x8C, 0xF8, 0xE5, 0xF1, 0x43, 0xDD, 0x85, 0x1F, 0x42, 0x4B, 0xA4, 0x4F, 0x5B,
+0x61, 0x23, 0xED, 0x3B, 0xC5, 0xBE, 0x63, 0x54, 0x87, 0x6A, 0xE0, 0x0B, 0x75, 0xC1, 0x5D, 0xD0,
+0x26, 0xCC, 0x99, 0x56, 0x06, 0x0B, 0xC8, 0xE5, 0x37, 0x1B, 0x49, 0xBF, 0xE1, 0xC2, 0xCF, 0x89,
+0x7F, 0x76, 0xF4, 0xAE, 0x6C, 0x07, 0xB7, 0x76, 0x5A, 0x21, 0x0C, 0xD6, 0x62, 0xF9, 0x01, 0xD3,
+0xD0, 0xA5, 0x8D, 0x12, 0xB4, 0x86, 0x2A, 0xBB, 0x81, 0x42, 0x48, 0x45, 0x02, 0xBC, 0x19, 0x24,
+0xC2, 0xB4, 0x44, 0x8C, 0xEA, 0xAD, 0xFF, 0xE0, 0x7B, 0xF5, 0x1E, 0x5D, 0xE2, 0x0B, 0xC7, 0x68,
+0xD1, 0x8D, 0xBE, 0x1D, 0x56, 0xDD, 0x2E, 0xE9, 0xFC, 0x68, 0xF8, 0xB0, 0x1F, 0x80, 0x8D, 0xA2,
+0xB8, 0x7C, 0xBD, 0x54, 0xA8, 0x35, 0xA7, 0x27, 0xE7, 0x3C, 0xCD, 0xBC, 0xD5, 0xFE, 0xB0, 0xDF,
+0xF5, 0xFB, 0xA7, 0x78, 0xF8, 0x7B, 0x5D, 0xE2, 0x3B, 0xC7, 0x7D, 0x82, 0x37, 0xA3, 0xBF, 0x9D,
+0xF8, 0xB1, 0x5A, 0xF9, 0x01, 0x83, 0xBA, 0x85, 0x67, 0xDC, 0xE0, 0xDC, 0x91, 0x7E, 0xC8, 0x94,
+0xD7, 0x6D, 0xC5, 0x6E, 0x68, 0x02, 0x2E, 0x0F, 0xC6, 0xA2, 0x25, 0x3E, 0x11, 0xC4, 0x8E, 0x80,
+0x8F, 0x63, 0xD1, 0x7B, 0x1F, 0xEC, 0x9C, 0xAC, 0x9A, 0x0E, 0xDC, 0xBE, 0x7F, 0xE6, 0x82, 0x59,
+0xC6, 0x49, 0xB7, 0x0C, 0x8E, 0xEA, 0xC9, 0xA6, 0x64, 0x20, 0x6A, 0x72, 0xB6, 0x88, 0xF9, 0x9C,
+0xF5, 0x2A, 0xA2, 0x32, 0xE6, 0xEA, 0x9A, 0x28, 0x69, 0xBC, 0x07, 0x27, 0x78, 0xF2, 0xD5, 0x8A,
+0x2A, 0x9C, 0xF9, 0x7D, 0xB9, 0x2A, 0x24, 0x5F, 0x32, 0xF6, 0x25, 0x99, 0x14, 0x42, 0xF3, 0x97,
+0xCB, 0xEA, 0x70, 0x3F, 0x38, 0x57, 0x0B, 0x53, 0x7E, 0x32, 0x55, 0x50, 0xD2, 0x97, 0x15, 0x2B,
+0xD3, 0xEB, 0xD3, 0x9E, 0xB4, 0xF6, 0x83, 0x52, 0xDA, 0xC5, 0x36, 0x71, 0xD5, 0x30, 0xC5, 0xC6,
+0xD5, 0x41, 0x53, 0x6C, 0x7C, 0x01, 0x4F, 0xD1, 0x92, 0xB6, 0xEC, 0x7B, 0x3B, 0xF1, 0xE5, 0xD0,
+0x86, 0x20, 0x8A, 0x76, 0x38, 0x7D, 0x8E, 0xE3, 0x17, 0xDB, 0x77, 0xDF, 0x3C, 0x1C, 0xAE, 0x23,
+0x9A, 0xA9, 0x59, 0x07, 0x9D, 0x73, 0xFB, 0xF1, 0x2B, 0x87, 0xDB, 0x68, 0xE1, 0xA7, 0xA3, 0x91,
+0x39, 0xEB, 0x4F, 0xF4, 0x1B, 0x33, 0x82, 0x27, 0xB6, 0x09, 0x3E, 0x57, 0x7C, 0x54, 0xDD, 0x52,
+0xF5, 0x35, 0x46, 0xCC, 0x5A, 0x19, 0x2A, 0x51, 0xA2, 0xA6, 0xFA, 0x35, 0x99, 0x5A, 0x15, 0x95,
+0x40, 0x63, 0x4D, 0x33, 0x20, 0x95, 0xCC, 0x21, 0xD7, 0x83, 0x32, 0x8F, 0x22, 0x32, 0xEE, 0x51,
+0x6C, 0x9D, 0xD3, 0xDB, 0x40, 0xB2, 0xCF, 0x8F, 0x8B, 0x11, 0x89, 0xDD, 0x3B, 0x20, 0xD3, 0xFC,
+0x4B, 0x13, 0x2C, 0x3F, 0x9C, 0x62, 0x06, 0x72, 0x85, 0xCD, 0xC6, 0xBC, 0x76, 0x5F, 0xDB, 0x5A,
+0xDF, 0x42, 0xB5, 0xD9, 0xB8, 0x4A, 0x6B, 0xEA, 0x1C, 0xFB, 0x9F, 0x2B, 0x74, 0x32, 0x87, 0x32,
+0x75, 0x8F, 0x9F, 0x04, 0xBB, 0x46, 0x15, 0x67, 0x25, 0x93, 0x3C, 0xC7, 0xC5, 0x42, 0xE6, 0x2E,
+0xAA, 0xDD, 0xBB, 0x01, 0xFB, 0xF9, 0xDE, 0x80, 0x59, 0xEB, 0xE3, 0x62, 0x73, 0xB3, 0xAE, 0xCF,
+0x09, 0x70, 0x43, 0x75, 0xFA, 0xC7, 0xA3, 0xA1, 0xC2, 0xA9, 0xD0, 0x52, 0x6B, 0x1F, 0xBF, 0x5B,
+0xF4, 0x9B, 0x87, 0x7B, 0xC0, 0x22, 0x7D, 0x44, 0x5F, 0xF5, 0xB1, 0x17, 0xAF, 0xF7, 0xD8, 0x83,
+0xCF, 0xFD, 0x75, 0x7E, 0x9E, 0xEF, 0xF3, 0xBA, 0xED, 0xD8, 0x7E, 0x6C, 0x5B, 0x0F, 0x32, 0xEA,
+0x63, 0x4C, 0x6E, 0x86, 0xC1, 0x4B, 0x4C, 0x67, 0x68, 0x93, 0x24, 0x56, 0x45, 0xFB, 0x18, 0xE8,
+0x71, 0x23, 0x81, 0x0F, 0xEC, 0x1F, 0x9D, 0xD1, 0xE9, 0xB7, 0x94, 0xBE, 0xBB, 0x16, 0xA1, 0x48,
+0x3E, 0x28, 0xF6, 0x3D, 0xD9, 0x30, 0xD4, 0xF6, 0x3D, 0xC7, 0x86, 0x72, 0xBF, 0x70, 0x59, 0x4B,
+0xF9, 0x83, 0x3F, 0x53, 0x58, 0xD8, 0x0E, 0xFA, 0x4D, 0xAD, 0x88, 0x8C, 0x58, 0x03, 0x5C, 0xFD,
+0x13, 0x87, 0xFF, 0x48, 0x4E, 0x6B, 0x5A, 0x97, 0xFD, 0x58, 0x6F, 0xB8, 0xDD, 0xBE, 0x40, 0x35,
+0xC6, 0x18, 0xAD, 0x5A, 0x5D, 0x91, 0xEA, 0xD3, 0x6C, 0x55, 0x98, 0x36, 0x6F, 0x1E, 0x08, 0x0F,
+0x61, 0x47, 0x88, 0x27, 0xB1, 0xCB, 0xC6, 0xE3, 0xD8, 0x66, 0xEB, 0x31, 0x6C, 0x56, 0xDF, 0xF0,
+0xE3, 0x31, 0x94, 0x7D, 0xEC, 0x50, 0x78, 0x14, 0x89, 0x7B, 0xEF, 0x79, 0xE0, 0x80, 0x04, 0x0D,
+0xAC, 0x4C, 0x69, 0x5B, 0xBC, 0xF7, 0xBE, 0xD2, 0xEA, 0x00, 0x2D, 0x87, 0xD2, 0xD2, 0x9F, 0x50,
+0xCE, 0x4F, 0xE6, 0xD2, 0xE3, 0xD1, 0x8D, 0xEF, 0xA5, 0x87, 0xB1, 0x75, 0xD7, 0x13, 0xE8, 0xEB,
+0xE3, 0xE8, 0x2B, 0x1F, 0x8F, 0x61, 0x8F, 0xDC, 0x25, 0xFB, 0x2C, 0xFD, 0x34, 0x5C, 0x90, 0x94,
+0x99, 0xFD, 0xBD, 0x9F, 0xC9, 0x84, 0xB1, 0x6D, 0x9E, 0xF8, 0xD2, 0xC5, 0xB5, 0x73, 0x4E, 0x14,
+0xC1, 0x59, 0x6E, 0x5B, 0x7A, 0xA3, 0x01, 0x1F, 0xAC, 0x2B, 0xE6, 0x40, 0x5C, 0xB6, 0xE3, 0xCB,
+0x01, 0xB3, 0xA2, 0xF7, 0x3F, 0x11, 0xC4, 0x8E, 0x1F, 0xB0, 0x11, 0xEC, 0x38, 0x71, 0x0A, 0x52,
+0x31, 0x17, 0x68, 0x7E, 0x88, 0x25, 0x62, 0x90, 0x89, 0x6C, 0x6F, 0xF0, 0x50, 0x25, 0xCB, 0xBF,
+0x7E, 0x95, 0x7C, 0xD5, 0x3B, 0x2A, 0x4A, 0x5B, 0x92, 0x7E, 0xE4, 0xAB, 0x59, 0x08, 0x14, 0x6B,
+0x89, 0x73, 0xD1, 0xFD, 0xE7, 0x6A, 0x26, 0xA7, 0xD5, 0x5D, 0xAB, 0xDA, 0x55, 0x94, 0xB9, 0x78,
+0x7F, 0x6F, 0x8B, 0x9D, 0xB0, 0x45, 0xB6, 0x2A, 0xC3, 0x6B, 0x99, 0x7C, 0xAA, 0xF8, 0x77, 0x9C,
+0xF4, 0x21, 0x57, 0x7B, 0xA4, 0xA8, 0xF5, 0xD4, 0x54, 0xBB, 0xA8, 0x5F, 0xD9, 0xAD, 0xB4, 0xB5,
+0xAC, 0x90, 0x0F, 0x7C, 0x75, 0x30, 0x30, 0x05, 0xE6, 0x58, 0x1A, 0xBA, 0x3F, 0x40, 0xE8, 0xF7,
+0x29, 0x44, 0x09, 0x49, 0x5E, 0x9F, 0x26, 0x1C, 0xB2, 0xC3, 0x01, 0x7C, 0x1A, 0xDA, 0x98, 0xC6,
+0x46, 0xCC, 0xA1, 0x69, 0x60, 0x5C, 0xE5, 0x8C, 0xDB, 0x64, 0x69, 0x67, 0x33, 0x25, 0x4F, 0x7B,
+0x22, 0xD7, 0x18, 0x20, 0xE9, 0x7A, 0x2D, 0xB7, 0xE8, 0xD7, 0x86, 0x57, 0xC3, 0x85, 0x8C, 0x89,
+0x81, 0x71, 0xEF, 0x0D, 0xF8, 0x15, 0xB7, 0x07, 0x81, 0x02, 0x3B, 0x90, 0xE0, 0x54, 0x1C, 0xC0,
+0x57, 0xF1, 0xA0, 0xD3, 0x32, 0x73, 0x07, 0x9E, 0xC5, 0x1C, 0x67, 0xAE, 0xA7, 0x05, 0x63, 0xAB,
+0x3D, 0x4D, 0x0F, 0x7B, 0xE1, 0x3E, 0x75, 0x0B, 0x9B, 0xE6, 0x1D, 0xB2, 0x8B, 0xAC, 0x40, 0xA5,
+0xFF, 0x52, 0x24, 0x9B, 0xF8, 0xF6, 0xE3, 0x46, 0xFD, 0x17, 0xF5, 0xC1, 0x05, 0xA3, 0xB3, 0xAB,
+0x5B, 0x14, 0x26, 0x46, 0xB6, 0xED, 0x16, 0x62, 0xB7, 0xFA, 0x41, 0x24, 0xAB, 0x08, 0xF5, 0xF2,
+0x6B, 0x4B, 0x9D, 0x9B, 0x2F, 0xF2, 0xF5, 0xB0, 0xE2, 0x66, 0x0A, 0xF1, 0xE0, 0x03, 0xAD, 0x20,
+0x9E, 0x7B, 0xFA, 0xDB, 0xB1, 0x47, 0x6C, 0x77, 0x78, 0x66, 0xC7, 0xCA, 0x1F, 0x9F, 0xD9, 0xDE,
+0x1D, 0x3E, 0x8D, 0xC7, 0x53, 0xD8, 0x3F, 0xF6, 0x1E, 0xA4, 0x3E, 0xE9, 0xBC, 0x09, 0x7E, 0x8F,
+0x24, 0x45, 0x1A, 0xA9, 0xD9, 0x2A, 0xFB, 0x48, 0x33, 0x01, 0xEE, 0x62, 0xFB, 0x86, 0x2E, 0xD5,
+0x79, 0xF1, 0x75, 0x83, 0x79, 0x8B, 0x8F, 0x05, 0xBE, 0x5A, 0xD9, 0x85, 0x37, 0x42, 0xB8, 0xD2,
+0xE5, 0x36, 0xC7, 0xF5, 0x8B, 0x58, 0x0E, 0x31, 0xBD, 0xC2, 0xFC, 0xEB, 0x01, 0x0F, 0x74, 0xAB,
+0x18, 0xA9, 0xE7, 0x2F, 0xD6, 0xC0, 0xC8, 0x51, 0x44, 0xA0, 0xBF, 0x9E, 0xF2, 0xBA, 0x45, 0x16,
+0xE6, 0xA6, 0xAD, 0xD7, 0xFA, 0x63, 0x6D, 0xC1, 0xC1, 0x73, 0xA2, 0x8A, 0xB6, 0x20, 0xE7, 0xE0,
+0x40, 0x78, 0x12, 0xC4, 0xE6, 0x4B, 0x5F, 0x7C, 0x3C, 0x7C, 0xE9, 0xD9, 0xC5, 0x1E, 0x8F, 0xD9,
+0x7B, 0xFC, 0xEB, 0x0F, 0x94, 0x45, 0x62, 0xE3, 0x2F, 0x7D, 0x41, 0x1F, 0xCF, 0x3C, 0xF3, 0x70,
+0xD8, 0x0C, 0xE5, 0x6E, 0xA1, 0x09, 0xF2, 0x66, 0x7D, 0x0A, 0x1A, 0x00, 0x7F, 0x91, 0x22, 0x6C,
+0x13, 0x95, 0x37, 0x7E, 0x1B, 0x73, 0xAB, 0x38, 0xEE, 0x89, 0xCB, 0x7E, 0x7C, 0x19, 0xFD, 0xE5,
+0x43, 0xFB, 0xE4, 0x7F, 0xF1, 0x5C, 0xB0, 0xF0, 0x73, 0xD6, 0x4F, 0xF6, 0xD5, 0xFB, 0xFE, 0x85,
+0x47, 0xC3, 0xE7, 0x3F, 0xF7, 0x30, 0x72, 0xDA, 0x61, 0xBB, 0x39, 0x0B, 0x64, 0x61, 0xA0, 0x0D,
+0x45, 0x1B, 0x8E, 0xFD, 0xC8, 0xE8, 0xA4, 0x7C, 0x0E, 0x6E, 0xE4, 0x90, 0xD4, 0x2E, 0x8C, 0x60,
+0xBE, 0xB1, 0xCB, 0x6F, 0xE4, 0x96, 0xF1, 0x9A, 0xD5, 0x5D, 0xAD, 0x3E, 0x56, 0xD3, 0xF4, 0x62,
+0x2E, 0x3C, 0x04, 0x76, 0x10, 0xFE, 0x03, 0xD7, 0x01, 0xB4, 0x7C, 0x11, 0x60, 0xD1, 0x9D, 0x87,
+0xA9, 0xCC, 0x24, 0x85, 0xEA, 0x5D, 0x1A, 0xFC, 0xA0, 0xE9, 0x07, 0x35, 0x29, 0x3E, 0x26, 0x73,
+0x19, 0x49, 0x48, 0xE7, 0xA5, 0x94, 0xAB, 0x1F, 0xA4, 0x0C, 0xD1, 0xDF, 0x4B, 0x15, 0x8C, 0xE8,
+0x93, 0x27, 0x97, 0x68, 0xAD, 0x22, 0x7E, 0xB9, 0xCA, 0xC6, 0xF6, 0xDA, 0xAF, 0x3D, 0x55, 0x94,
+0x4C, 0x41, 0x11, 0x25, 0x26, 0xF9, 0xD8, 0x69, 0x73, 0xBC, 0xB0, 0xFE, 0x95, 0x5F, 0xF5, 0xAE,
+0xD8, 0xC4, 0xFA, 0xAC, 0x8C, 0x2B, 0x2E, 0xA6, 0xDE, 0xE5, 0xF9, 0xDD, 0xB4, 0x5B, 0xAA, 0xDC,
+0xA9, 0xFF, 0x95, 0xD6, 0x15, 0x55, 0x1C, 0x57, 0xEF, 0x6A, 0xD5, 0x20, 0x9B, 0x81, 0x6C, 0x3B,
+0x64, 0x3B, 0x7C, 0x39, 0xB6, 0x89, 0xAF, 0xDD, 0xDB, 0x27, 0xCE, 0x62, 0xDF, 0x3C, 0x44, 0x5E,
+0x35, 0xE1, 0x10, 0x53, 0x2C, 0x16, 0xA8, 0x56, 0xEE, 0x3C, 0xE1, 0x8A, 0x9D, 0xA0, 0xA1, 0xFD,
+0x51, 0xD5, 0x8D, 0xB8, 0xE8, 0xDC, 0xD0, 0xDD, 0x25, 0xEC, 0x4B, 0x5D, 0xCA, 0x64, 0x6A, 0xA8,
+0x61, 0x9D, 0x2B, 0x72, 0xB5, 0xEA, 0x96, 0xEE, 0x18, 0xA2, 0xE3, 0xC2, 0x07, 0x17, 0x31, 0xE6,
+0xAF, 0x23, 0xB1, 0xDC, 0x8E, 0xA8, 0xA6, 0x7E, 0xA6, 0xF9, 0xA0, 0x63, 0x74, 0xBD, 0x2F, 0xD5,
+0x9B, 0x88, 0x07, 0xA3, 0xF8, 0x2E, 0x80, 0xD4, 0x4D, 0x62, 0x3B, 0x37, 0xBA, 0x18, 0x70, 0xE1,
+0xE7, 0xB8, 0x49, 0x40, 0x6C, 0xA6, 0xD8, 0x55, 0x22, 0x9C, 0xCD, 0x7C, 0xEE, 0xFD, 0x8B, 0xEF,
+0x59, 0x79, 0x51, 0x76, 0xFD, 0x21, 0x93, 0xD2, 0xC8, 0x2D, 0xFE, 0xAA, 0x2F, 0x5D, 0xA6, 0xD2,
+0x71, 0xDE, 0xF2, 0x21, 0xCA, 0x9C, 0xE1, 0x4A, 0x2C, 0xC1, 0x42, 0x3A, 0xB0, 0xED, 0x1C, 0xDB,
+0x41, 0xA7, 0x69, 0xE6, 0x19, 0x24, 0xC9, 0x5D, 0x6D, 0x3C, 0x6E, 0x22, 0xB4, 0x95, 0xAA, 0x1A,
+0xFC, 0x7A, 0x48, 0xD7, 0xE8, 0xC7, 0xF4, 0x86, 0xC8, 0x60, 0xBD, 0x3E, 0xF0, 0xFE, 0xCC, 0x05,
+0xC6, 0x1D, 0x23, 0x28, 0x7C, 0x3E, 0xB8, 0xB1, 0x23, 0xFC, 0xD2, 0x81, 0xFE, 0xF0, 0xEB, 0x87,
+0x06, 0x6E, 0xF8, 0xF1, 0x6B, 0xB8, 0xF6, 0xD9, 0xDD, 0x3D, 0xF0, 0x7F, 0x5C, 0x71, 0xEF, 0x16,
+0x34, 0x51, 0x7C, 0xE3, 0xB8, 0x70, 0xA2, 0x71, 0x33, 0xF8, 0x0C, 0x5C, 0x45, 0xB4, 0xE0, 0xA2,
+0xFB, 0x86, 0x2E, 0x31, 0x48, 0x92, 0x0B, 0xEF, 0xCA, 0x10, 0xB6, 0x7F, 0x42, 0x52, 0x5A, 0xFA,
+0xE8, 0xD6, 0x6B, 0x9A, 0x4C, 0xB8, 0x7C, 0xD5, 0xBB, 0x31, 0x75, 0x50, 0xBE, 0x2B, 0xED, 0xF3,
+0x29, 0xFB, 0x81, 0x22, 0xDF, 0x9B, 0x38, 0xF8, 0xCB, 0x76, 0xAC, 0x73, 0xD8, 0xA9, 0x61, 0x08,
+0x7D, 0x58, 0xF9, 0x0F, 0x53, 0x89, 0xC0, 0xC4, 0x1E, 0xDA, 0xC4, 0x61, 0xD1, 0x9F, 0x84, 0x1F,
+0xE7, 0x7B, 0x61, 0x25, 0x0B, 0xBE, 0x2D, 0x57, 0x95, 0x1F, 0x66, 0xC4, 0x9F, 0x51, 0xD1, 0x70,
+0xD2, 0xE7, 0x1C, 0x5D, 0x8F, 0x20, 0x91, 0xCF, 0x7F, 0xE6, 0xA1, 0xF0, 0xCB, 0x5F, 0x7B, 0x26,
+0xFC, 0xCA, 0xD7, 0x3F, 0x1B, 0x7E, 0xF5, 0x17, 0x3E, 0xB7, 0xE2, 0xC7, 0xDF, 0xFE, 0xC5, 0xCF,
+0x87, 0x5F, 0xF8, 0x99, 0x4F, 0x23, 0xA2, 0x79, 0xD3, 0xE2, 0x41, 0x03, 0x2B, 0x9E, 0x66, 0x71,
+0x11, 0x6C, 0x90, 0xE4, 0x2C, 0x7E, 0x03, 0x7E, 0x17, 0xAF, 0xC3, 0xF7, 0xB2, 0x10, 0x3B, 0x3C,
+0xFF, 0xF2, 0x67, 0x1F, 0x0E, 0x7F, 0x0B, 0x7D, 0xFD, 0x5B, 0xE8, 0x2B, 0x1F, 0x2B, 0xED, 0x33,
+0xFB, 0xFB, 0x4B, 0xC0, 0xEB, 0x81, 0x7B, 0xF7, 0x69, 0xB4, 0x2F, 0xEA, 0xEC, 0x81, 0x29, 0x9B,
+0x23, 0x7E, 0x15, 0xD1, 0xD5, 0x9C, 0xFF, 0x54, 0x9E, 0x57, 0x7A, 0xF0, 0x3B, 0x9B, 0x73, 0x8F,
+0x22, 0x41, 0xFA, 0x39, 0xBE, 0xD2, 0x5A, 0x6E, 0xBC, 0xFC, 0x6D, 0x4F, 0xEC, 0xD8, 0x35, 0x06,
+0x4E, 0x9C, 0xBE, 0x3C, 0x18, 0x46, 0xB9, 0xA1, 0x34, 0x61, 0x9A, 0xC1, 0x5F, 0x38, 0x98, 0x7F,
+0xBC, 0x5F, 0x7B, 0xC6, 0x0B, 0xA3, 0x0A, 0x67, 0x1F, 0x99, 0x58, 0x29, 0x17, 0xC1, 0x0C, 0x58,
+0x53, 0x7B, 0xA2, 0x6F, 0x5C, 0xBD, 0x0F, 0xA5, 0x9D, 0x33, 0x1A, 0x65, 0x4B, 0x73, 0xF5, 0x8B,
+0x8B, 0x35, 0xBA, 0xA9, 0x4B, 0xEB, 0x4F, 0xEF, 0x57, 0xD4, 0x25, 0x21, 0x33, 0xF6, 0x5E, 0x94,
+0xFB, 0x6B, 0xEA, 0xF2, 0x97, 0xF6, 0x05, 0x29, 0xCA, 0x5C, 0x7E, 0x2E, 0xAF, 0x03, 0xEF, 0x89,
+0x5F, 0x4F, 0x56, 0x97, 0x72, 0x49, 0x33, 0xEB, 0xC6, 0xB6, 0xE8, 0x87, 0x90, 0x0E, 0xCF, 0x24,
+0x76, 0xFC, 0x52, 0xFF, 0x10, 0x7E, 0x5F, 0x43, 0xF8, 0xE5, 0xDD, 0x8C, 0x83, 0x6A, 0x06, 0x77,
+0x57, 0x22, 0xB1, 0x63, 0x0E, 0xB7, 0x9A, 0xEF, 0xFD, 0x05, 0x0B, 0x41, 0x1C, 0x3E, 0x81, 0xD2,
+0x48, 0x9D, 0x35, 0x54, 0xBF, 0x1E, 0x74, 0x1C, 0x5D, 0x5D, 0x8D, 0x7D, 0x10, 0x92, 0x13, 0xB9,
+0x4E, 0x1C, 0x8A, 0x39, 0x92, 0x49, 0x10, 0x3B, 0x50, 0x99, 0x70, 0x08, 0x69, 0x12, 0xD6, 0xC3,
+0xA7, 0xAC, 0x19, 0x24, 0x66, 0x12, 0x73, 0xFC, 0x28, 0xD2, 0xCB, 0x4C, 0x4C, 0x4E, 0x0A, 0xA9,
+0x54, 0x13, 0x6C, 0x22, 0x75, 0xB9, 0x69, 0x7F, 0xC1, 0xD4, 0xB3, 0xBE, 0x54, 0x24, 0xBD, 0x9A,
+0x9F, 0x89, 0x89, 0xD7, 0xD9, 0xE2, 0x59, 0x33, 0xB7, 0x75, 0x5E, 0xBA, 0x52, 0xA7, 0x9F, 0x05,
+0xE2, 0xC7, 0xB0, 0x7D, 0x46, 0x4A, 0xF3, 0xD5, 0x3A, 0x28, 0x21, 0xEB, 0x7B, 0xA8, 0x86, 0xAC,
+0xF8, 0x9B, 0xBD, 0x19, 0x53, 0xE7, 0x13, 0x73, 0x0F, 0x92, 0x3A, 0xE6, 0x9F, 0x23, 0x8A, 0x54,
+0xD9, 0x0E, 0x62, 0x9F, 0xD8, 0x07, 0x37, 0x75, 0xDD, 0xF0, 0xE3, 0x01, 0x5C, 0xBB, 0x6F, 0xA0,
+0x03, 0x2E, 0x2A, 0x1F, 0x7F, 0x5C, 0x44, 0xF1, 0xC2, 0x02, 0xD7, 0x8D, 0xC5, 0x4D, 0xF6, 0xB4,
+0xBD, 0x78, 0x4D, 0x72, 0x7B, 0xAD, 0xF4, 0x98, 0x84, 0x9F, 0xE8, 0x49, 0xB8, 0x15, 0x7C, 0xC4,
+0xFD, 0x41, 0x17, 0xD9, 0x50, 0x5E, 0x12, 0xF6, 0x7A, 0xBA, 0x0F, 0xCE, 0x75, 0xA8, 0x7C, 0xFC,
+0xBE, 0x69, 0xE4, 0x7B, 0x5D, 0x16, 0x4E, 0x9A, 0x58, 0x4D, 0x4D, 0xF1, 0xE9, 0xCC, 0xFA, 0x36,
+0x62, 0x47, 0x07, 0x4F, 0xD1, 0xC2, 0x1F, 0x4C, 0xA7, 0x11, 0x90, 0xB4, 0xD2, 0xAD, 0xAC, 0xF8,
+0x03, 0x8F, 0xC1, 0x08, 0x8C, 0x34, 0x95, 0xB4, 0x1F, 0x1F, 0x1F, 0xDA, 0x85, 0x10, 0x2E, 0x60,
+0x69, 0x2B, 0x45, 0x59, 0x3F, 0x9F, 0xFD, 0x30, 0x9B, 0x4A, 0x03, 0x41, 0x40, 0x76, 0x82, 0x90,
+0x71, 0x3B, 0xB7, 0xFB, 0xB1, 0xB7, 0xE9, 0x4A, 0x1E, 0xCC, 0x37, 0xB8, 0x09, 0xA9, 0x5D, 0x36,
+0xC2, 0xCF, 0x8E, 0x29, 0x3E, 0x48, 0xEE, 0x6F, 0xCA, 0xF7, 0xDE, 0x4A, 0xFB, 0x68, 0x04, 0x76,
+0x31, 0x24, 0x3A, 0xE0, 0x22, 0xB4, 0x75, 0xCB, 0x7A, 0xF9, 0x0E, 0xE2, 0xF7, 0xD5, 0xA6, 0x8D,
+0xEB, 0xC2, 0x3D, 0xC8, 0x97, 0xB8, 0x92, 0xBE, 0xB2, 0x2C, 0x73, 0x2C, 0x6E, 0x81, 0x7F, 0x1D,
+0x23, 0xA6, 0x37, 0xAD, 0x47, 0x62, 0x67, 0x8B, 0x7E, 0x95, 0xF9, 0x03, 0x1C, 0xF8, 0xC3, 0x7A,
+0x18, 0x19, 0x38, 0x86, 0x90, 0xA5, 0x40, 0xA2, 0xC4, 0x1B, 0x99, 0x94, 0x59, 0xA3, 0x39, 0x8F,
+0x2F, 0x33, 0x18, 0xC5, 0xF7, 0x70, 0x5E, 0xE1, 0xF5, 0x2B, 0x9F, 0x09, 0xD5, 0x2B, 0x3E, 0x11,
+0xC4, 0x6E, 0x8C, 0x3B, 0x4E, 0xE0, 0x4B, 0x62, 0x06, 0x1F, 0x7C, 0x51, 0xC4, 0xE8, 0x5C, 0x8E,
+0x47, 0x6E, 0xA6, 0x5B, 0x00, 0xC4, 0x0A, 0x26, 0x54, 0x4E, 0xAD, 0x54, 0xC5, 0xE3, 0x4D, 0x44,
+0xF6, 0x92, 0x95, 0x5F, 0xDE, 0x37, 0xD5, 0xCE, 0x7D, 0x1C, 0xF4, 0x1A, 0x25, 0x07, 0xAE, 0x84,
+0x24, 0xFF, 0x38, 0x53, 0x8E, 0x44, 0xFD, 0x60, 0x11, 0x2F, 0x67, 0xFE, 0x5F, 0xF1, 0x5B, 0x42,
+0x3D, 0xFC, 0x34, 0x8A, 0xD5, 0x7C, 0x9E, 0xEC, 0x5E, 0xEA, 0x33, 0x26, 0x0D, 0xD1, 0x32, 0xFC,
+0x6B, 0xBF, 0x0E, 0x75, 0x92, 0x59, 0xFB, 0xE4, 0xD7, 0xAA, 0x91, 0x31, 0x7F, 0xEE, 0x6D, 0x97,
+0x3A, 0xFD, 0xA1, 0x75, 0x79, 0x3F, 0x62, 0x7F, 0xA4, 0x8D, 0xAC, 0x4B, 0x29, 0xAB, 0x46, 0x52,
+0xB2, 0xFB, 0xF0, 0x63, 0xC4, 0xAF, 0x17, 0xDE, 0xEA, 0x04, 0xA2, 0x91, 0x87, 0xEB, 0x6D, 0x31,
+0xF3, 0x71, 0x67, 0x5F, 0x9D, 0xEB, 0xD9, 0x4A, 0x0A, 0x0F, 0x6D, 0x20, 0x75, 0xAD, 0x54, 0x66,
+0x49, 0x47, 0xBD, 0x0F, 0x2A, 0x91, 0x1A, 0x17, 0xB6, 0xB1, 0x91, 0xD7, 0xDA, 0x2F, 0x8D, 0xF4,
+0xB4, 0x59, 0x21, 0xD7, 0x70, 0x1C, 0x0C, 0x27, 0x9E, 0xF7, 0x31, 0xB4, 0xF2, 0xAC, 0x8B, 0xD8,
+0x79, 0xF4, 0xAC, 0x5C, 0x3F, 0x3D, 0x19, 0x5A, 0x67, 0xB0, 0xDB, 0x44, 0xCB, 0x5C, 0x78, 0x0C,
+0x89, 0x4D, 0x37, 0x5A, 0xB6, 0xF7, 0x55, 0xE8, 0x6A, 0xA5, 0xCA, 0x51, 0xE0, 0xFB, 0x16, 0x36,
+0x5E, 0x9F, 0xC0, 0x0F, 0x16, 0xE6, 0x67, 0x64, 0x8A, 0x91, 0x28, 0x06, 0xD8, 0x18, 0xD5, 0x46,
+0xEF, 0xAA, 0xFF, 0xA6, 0xCE, 0x8B, 0x98, 0xB7, 0xCE, 0x94, 0x47, 0xE9, 0xB7, 0x8D, 0xA7, 0x47,
+0xC0, 0x0A, 0x36, 0xB1, 0xAE, 0xE4, 0x7B, 0xE7, 0xBE, 0x9A, 0x3E, 0x0F, 0x7D, 0x3E, 0xCB, 0xC2,
+0xCB, 0xAD, 0x83, 0x5A, 0xD4, 0x01, 0x7E, 0x17, 0xD4, 0x3A, 0x26, 0x26, 0x5E, 0xE9, 0x97, 0xDC,
+0x6A, 0x63, 0xB7, 0x9A, 0xF5, 0xCB, 0x47, 0x6D, 0x01, 0x93, 0xFE, 0x78, 0x77, 0x24, 0x69, 0xEF,
+0x47, 0x4E, 0x1F, 0xA6, 0x3D, 0x61, 0x0E, 0x3B, 0xA6, 0x3E, 0x69, 0xDE, 0xB1, 0xFC, 0xBD, 0x48,
+0x16, 0xB8, 0x0D, 0x14, 0xA3, 0x22, 0x4F, 0xE1, 0x47, 0x1D, 0xB7, 0x71, 0x5A, 0xE9, 0x31, 0x81,
+0xFD, 0x5A, 0xDF, 0x45, 0x12, 0xD8, 0x77, 0x3F, 0x3C, 0x25, 0xFB, 0xB5, 0xD6, 0x33, 0x23, 0xAA,
+0x3A, 0xA8, 0xDB, 0xA2, 0x71, 0xCE, 0x31, 0xBD, 0xD1, 0x38, 0x5C, 0x6E, 0x1A, 0x31, 0xFD, 0x6A,
+0x74, 0x24, 0xCA, 0x0A, 0x69, 0x4C, 0x83, 0x44, 0x73, 0xDA, 0x56, 0xEC, 0xD3, 0xC9, 0x84, 0xC1,
+0x9C, 0xBF, 0xCC, 0x7D, 0x7A, 0xF8, 0xD8, 0x19, 0x29, 0xBB, 0x92, 0x83, 0x91, 0xB5, 0xDC, 0x81,
+0x81, 0x3B, 0x58, 0x68, 0x02, 0xFA, 0x45, 0x8E, 0xE5, 0xE1, 0xAC, 0x73, 0xA1, 0xB5, 0x77, 0x19,
+0x12, 0x53, 0xB9, 0xD0, 0xD6, 0x19, 0xFB, 0x96, 0x8E, 0x6F, 0x75, 0xC2, 0x1C, 0xB9, 0x6B, 0x07,
+0x37, 0x9B, 0x9F, 0x0F, 0xD7, 0x41, 0xC2, 0xA7, 0xD8, 0xCF, 0x1B, 0x68, 0x13, 0x73, 0x17, 0x32,
+0xB1, 0xF1, 0xEB, 0x6F, 0x1D, 0x0B, 0x47, 0x8F, 0x9D, 0x95, 0x04, 0xC5, 0x37, 0xE5, 0xA8, 0xED,
+0x63, 0x23, 0x04, 0x79, 0x89, 0x32, 0xEC, 0xEF, 0xEE, 0x9D, 0xD8, 0xD2, 0x0C, 0xE3, 0xCC, 0x2D,
+0x46, 0xCF, 0x22, 0xB2, 0x95, 0xC2, 0xCF, 0x4A, 0x8F, 0x49, 0xF4, 0xF7, 0xC3, 0xC3, 0xA7, 0xC3,
+0x6B, 0x6F, 0x1D, 0x0D, 0xEF, 0x7C, 0x80, 0x3D, 0x85, 0x99, 0x32, 0x06, 0x07, 0x7F, 0x10, 0xEC,
+0xC6, 0x1E, 0xC7, 0x88, 0x47, 0xC2, 0x7E, 0xB4, 0x23, 0x61, 0xE4, 0xFA, 0x90, 0x44, 0x08, 0x73,
+0xBE, 0xAD, 0xE4, 0xE0, 0xD6, 0x64, 0x9C, 0x77, 0xCC, 0xE2, 0xB1, 0x3A, 0xBF, 0x0A, 0x96, 0x6E,
+0xCD, 0x27, 0x82, 0xD8, 0x4D, 0x80, 0xC4, 0x1D, 0xC5, 0x7E, 0x6E, 0x94, 0x44, 0x99, 0x5B, 0x8C,
+0x66, 0xD8, 0xF9, 0xCC, 0x4C, 0xB7, 0x12, 0xC0, 0x6B, 0xCB, 0xD6, 0x9D, 0x77, 0x71, 0x0C, 0x75,
+0xE1, 0x8C, 0xC7, 0x82, 0x0F, 0xB8, 0x12, 0xB6, 0xE4, 0xE2, 0x61, 0x04, 0x8E, 0x43, 0x59, 0xEF,
+0xCB, 0x80, 0x65, 0xAD, 0x32, 0xE5, 0x27, 0x5E, 0xB7, 0xFE, 0x75, 0xC5, 0x44, 0x5E, 0xC4, 0xEB,
+0xAB, 0x65, 0xF4, 0xAD, 0x74, 0xAE, 0xF6, 0x83, 0x9E, 0x54, 0x3B, 0xFB, 0xF2, 0xF0, 0x7B, 0x4A,
+0xD3, 0x16, 0xAA, 0x76, 0xD9, 0x77, 0xA2, 0xDD, 0xD6, 0x5B, 0xA5, 0xAA, 0x1D, 0x5B, 0x7C, 0x15,
+0xBF, 0x5C, 0xA9, 0x28, 0x35, 0xEB, 0x68, 0x03, 0x99, 0x23, 0xA9, 0xA3, 0x49, 0xD2, 0x7D, 0xC8,
+0x2A, 0xEB, 0x6B, 0xE5, 0x4B, 0x2E, 0x53, 0x1D, 0x05, 0x53, 0xFF, 0x5E, 0x4B, 0xFD, 0x77, 0xF5,
+0x49, 0x3B, 0x58, 0x1D, 0x9B, 0xCA, 0x77, 0x08, 0x73, 0xC6, 0x81, 0xD4, 0xD1, 0x04, 0x4C, 0x67,
+0xF4, 0x03, 0xDB, 0x37, 0x84, 0xBE, 0x15, 0xEC, 0xB9, 0x78, 0xA3, 0xF8, 0xB0, 0x8F, 0xA3, 0xF8,
+0x42, 0x66, 0x42, 0x68, 0xFA, 0xD7, 0x71, 0xE1, 0x4F, 0xD1, 0x78, 0xB5, 0x5F, 0x28, 0x6E, 0x26,
+0xAD, 0x74, 0xD6, 0xBA, 0xA6, 0x65, 0x1D, 0x03, 0xE5, 0x7D, 0x69, 0x4E, 0xF2, 0x7C, 0xEA, 0xAF,
+0xFA, 0x88, 0xA6, 0xF9, 0xAF, 0x3F, 0x9A, 0x54, 0x19, 0xD4, 0xEB, 0xC4, 0x0C, 0x8B, 0xBD, 0x84,
+0x49, 0x06, 0xD9, 0x9E, 0x7D, 0x6B, 0xC0, 0xBF, 0xAE, 0x32, 0x8F, 0x96, 0x19, 0xB0, 0x85, 0x9F,
+0xBC, 0x1B, 0x1D, 0xE1, 0xEA, 0x75, 0xCC, 0x80, 0xB0, 0x15, 0x5B, 0x89, 0xB1, 0xFE, 0xF3, 0x63,
+0x33, 0x61, 0x08, 0x91, 0xB1, 0x2B, 0x59, 0x37, 0xA8, 0xA4, 0x31, 0x21, 0x31, 0xAF, 0x3D, 0x03,
+0x62, 0x78, 0x1E, 0x11, 0xB2, 0xD3, 0x4B, 0x54, 0x20, 0x7B, 0xD3, 0x22, 0xA1, 0xF1, 0xCB, 0x17,
+0x27, 0xC2, 0x4B, 0xC8, 0x99, 0xC7, 0x04, 0xC7, 0x13, 0x4B, 0x90, 0xC9, 0x4E, 0x90, 0xA2, 0xDD,
+0x08, 0x1A, 0xA2, 0x2A, 0x72, 0x05, 0xAA, 0x83, 0x64, 0xFA, 0xAF, 0xDD, 0x62, 0x6A, 0x09, 0x28,
+0x38, 0x77, 0x86, 0x11, 0x70, 0x75, 0xF4, 0xC8, 0x99, 0x70, 0x1C, 0x3F, 0x56, 0xA6, 0xA0, 0x5A,
+0xD4, 0x53, 0x7F, 0x48, 0x20, 0xD7, 0x21, 0xBB, 0xBF, 0xEF, 0x25, 0x4B, 0x05, 0xEE, 0xFA, 0xE0,
+0x48, 0x43, 0xA6, 0x2F, 0x9A, 0x49, 0xAF, 0xCA, 0xDE, 0xA3, 0x9E, 0xF2, 0x4A, 0x67, 0x36, 0x7D,
+0xB0, 0x06, 0x06, 0x7A, 0xC2, 0x46, 0xA8, 0x4E, 0xFD, 0xEB, 0xFB, 0xC4, 0x8D, 0xE7, 0x0C, 0x54,
+0xC3, 0x6B, 0xD7, 0x47, 0x56, 0xB4, 0x45, 0x22, 0x89, 0xE0, 0x07, 0x47, 0x4E, 0x4B, 0xEA, 0x97,
+0x25, 0xF9, 0xD7, 0x4A, 0x26, 0x54, 0x05, 0xB3, 0xDA, 0xCF, 0xF5, 0x72, 0x73, 0xCB, 0x3F, 0xC7,
+0x55, 0xD6, 0xD3, 0x0D, 0x75, 0xF5, 0x00, 0x7E, 0x80, 0x76, 0xA2, 0xDF, 0x83, 0xC0, 0xEE, 0x28,
+0xF6, 0x8D, 0x3D, 0x8E, 0x14, 0x1F, 0xCC, 0xC5, 0xD6, 0xE8, 0x41, 0x0C, 0x49, 0xE0, 0x7F, 0xF4,
+0xE3, 0xB7, 0xF0, 0x78, 0x23, 0x9C, 0x40, 0x3A, 0x10, 0x9E, 0x5B, 0x78, 0x34, 0xC2, 0xCA, 0x1A,
+0xBD, 0xEB, 0x8D, 0x95, 0x63, 0xEA, 0x9A, 0xBB, 0xF6, 0x6C, 0x97, 0x7C, 0xA7, 0x13, 0x0C, 0xA8,
+0xC4, 0x0F, 0x07, 0xFE, 0x18, 0x58, 0xC9, 0x21, 0xFE, 0xCC, 0x98, 0x0F, 0x3F, 0x79, 0xF1, 0xED,
+0xF0, 0x43, 0xE4, 0xB4, 0x7B, 0xFB, 0x9D, 0x13, 0x20, 0x76, 0x8A, 0x17, 0x7F, 0x10, 0x1C, 0xE0,
+0xDE, 0xC8, 0xF8, 0xFE, 0xA7, 0x52, 0x7D, 0x0D, 0xAA, 0xDD, 0x31, 0xA4, 0x8F, 0x71, 0xE2, 0xD7,
+0xE8, 0x7D, 0xC6, 0xD0, 0x26, 0xEE, 0x6E, 0xC1, 0x1F, 0x16, 0x4B, 0x4F, 0xA0, 0x46, 0x6B, 0x5C,
+0x59, 0xB9, 0xDB, 0x9A, 0xD8, 0xA9, 0x7A, 0xD4, 0x22, 0xA4, 0xE2, 0x14, 0x4C, 0xB1, 0x92, 0x67,
+0x86, 0xF6, 0x6E, 0x49, 0x5C, 0x6B, 0x3B, 0x4E, 0x2C, 0xF6, 0xF9, 0x58, 0xEC, 0xD3, 0x98, 0x95,
+0x8F, 0x7A, 0x98, 0x3A, 0xA3, 0xB9, 0xF0, 0x23, 0x04, 0x48, 0x09, 0x85, 0x47, 0x21, 0x29, 0xD9,
+0x11, 0x25, 0x4B, 0x16, 0x3D, 0x3E, 0xD7, 0x6B, 0xD4, 0x8F, 0x49, 0xD5, 0xA2, 0xA8, 0xF2, 0x89,
+0xBA, 0x66, 0x05, 0xED, 0x02, 0x57, 0xC2, 0xE2, 0xDE, 0xAD, 0x99, 0xCA, 0x24, 0xD7, 0xC9, 0xE5,
+0x6E, 0x16, 0xCD, 0xEA, 0x34, 0x45, 0x8F, 0xBE, 0x60, 0xEE, 0x6B, 0xA5, 0xF7, 0x63, 0x3B, 0xDC,
+0xA7, 0xCC, 0x54, 0x3B, 0x53, 0xB6, 0x7C, 0x6F, 0x59, 0x6D, 0x8F, 0x96, 0x89, 0x75, 0xB3, 0x6F,
+0xD6, 0x11, 0xCF, 0xB9, 0x17, 0x15, 0x31, 0x57, 0x7F, 0x58, 0xDE, 0xDB, 0x87, 0x2F, 0x77, 0x6E,
+0xDF, 0xB2, 0xD4, 0x8F, 0xD6, 0x95, 0x4D, 0xB9, 0xA5, 0x4B, 0x0B, 0x51, 0x65, 0xD0, 0x84, 0x3C,
+0x52, 0x3A, 0x1B, 0xE5, 0x72, 0xB9, 0x19, 0x51, 0xD5, 0x38, 0x55, 0x32, 0x55, 0xF1, 0x34, 0x46,
+0x62, 0x83, 0x24, 0x17, 0xE8, 0xF8, 0x18, 0x76, 0x8C, 0xA4, 0xE6, 0x6B, 0xEF, 0xBF, 0xFB, 0xE8,
+0xC5, 0x60, 0x0C, 0xCE, 0xAB, 0xA9, 0x09, 0x6C, 0x23, 0x06, 0x62, 0x87, 0xC0, 0x89, 0x2D, 0x50,
+0x2D, 0xB8, 0x35, 0xCC, 0x6A, 0x1F, 0x6C, 0xC7, 0x08, 0x7C, 0xEB, 0x2E, 0x5F, 0xB9, 0x0E, 0xC5,
+0x10, 0xFE, 0x75, 0xF8, 0x92, 0x56, 0xDF, 0x4A, 0x23, 0x58, 0x3E, 0x1F, 0x6D, 0x7C, 0x55, 0x60,
+0xD5, 0xBE, 0xB8, 0xAA, 0xAC, 0x84, 0xD5, 0xC6, 0x5A, 0xE6, 0xAE, 0xFD, 0x17, 0x15, 0xBC, 0x5C,
+0xBD, 0x55, 0x1C, 0xD3, 0x6E, 0x26, 0x49, 0xAD, 0x8D, 0xFE, 0x7C, 0xC0, 0x42, 0x14, 0x3B, 0x06,
+0x4E, 0xA0, 0x6E, 0x9A, 0x26, 0x0E, 0xC8, 0xB6, 0x6A, 0xB7, 0xF5, 0x57, 0xC6, 0x6A, 0x0F, 0xD5,
+0x4D, 0xA9, 0xBF, 0x0B, 0xAA, 0xE7, 0x7E, 0x98, 0x4E, 0x69, 0x39, 0xBD, 0x86, 0x94, 0x25, 0x57,
+0x91, 0xCA, 0x84, 0x4E, 0xFE, 0x8D, 0x1E, 0x4C, 0x4A, 0x7C, 0xF4, 0xFA, 0xB4, 0x24, 0x36, 0x7E,
+0xE1, 0xC2, 0x78, 0x78, 0xF5, 0xD2, 0x84, 0xE4, 0xB1, 0x5B, 0xEC, 0x20, 0x09, 0xFC, 0xFE, 0x99,
+0xD1, 0xF0, 0xCF, 0xDF, 0xBE, 0x1E, 0xFE, 0xFB, 0xB7, 0xAE, 0x85, 0x3F, 0x3D, 0x3E, 0x2A, 0xF7,
+0x5D, 0xEC, 0x0A, 0x46, 0x41, 0x3F, 0x70, 0xEF, 0x7E, 0xF8, 0x30, 0xB5, 0x87, 0x31, 0xFC, 0xA8,
+0x7B, 0xE7, 0xBD, 0x8F, 0x10, 0x44, 0xD1, 0xF8, 0xE2, 0x29, 0x3E, 0xD1, 0xF0, 0x4D, 0x3A, 0x75,
+0xFC, 0x6C, 0xB8, 0x00, 0x52, 0xC5, 0xDD, 0x11, 0xEA, 0xA9, 0x16, 0x4C, 0x1A, 0xBC, 0x01, 0x9F,
+0x31, 0xD9, 0x9E, 0x0E, 0xD7, 0x48, 0x82, 0x6E, 0x58, 0x07, 0xA6, 0x1B, 0x50, 0x08, 0x65, 0x4F,
+0x4F, 0x98, 0x58, 0xC5, 0xCC, 0x5B, 0x93, 0xA3, 0xAE, 0x03, 0x64, 0x67, 0xC7, 0x9E, 0x6D, 0x61,
+0x27, 0x1E, 0xFC, 0x41, 0x72, 0xE5, 0xE2, 0x75, 0x24, 0xDF, 0xBD, 0xBC, 0x22, 0x93, 0x32, 0xCD,
+0xB0, 0xCF, 0xBF, 0xFA, 0x01, 0xB6, 0xAF, 0xC4, 0x82, 0x6F, 0x9F, 0xC5, 0xBA, 0xF8, 0xAE, 0x44,
+0x75, 0x8B, 0x15, 0xDC, 0x08, 0x41, 0xAA, 0xCF, 0x20, 0x69, 0x32, 0xA5, 0x69, 0xB1, 0x07, 0xCA,
+0xFA, 0xF0, 0xC4, 0x74, 0xF8, 0xFE, 0xF3, 0x6F, 0x85, 0xBF, 0x79, 0xEE, 0x0D, 0x98, 0x91, 0x1B,
+0xF7, 0x89, 0x26, 0x89, 0x7D, 0xE5, 0xF5, 0x0F, 0xC3, 0x5F, 0x7E, 0xE3, 0xB9, 0xF0, 0x9D, 0x6F,
+0xFD, 0x18, 0xB9, 0xF0, 0x2E, 0x2F, 0x42, 0xAE, 0x6F, 0xA8, 0xB3, 0xD6, 0x6B, 0x9B, 0x6D, 0x8D,
+0x4C, 0xF3, 0x25, 0x3E, 0x0B, 0xDC, 0xAA, 0xEE, 0xD0, 0x01, 0xDD, 0x1F, 0x76, 0x04, 0x2A, 0xDB,
+0x8B, 0xAF, 0x7D, 0x88, 0x00, 0x87, 0x95, 0x65, 0x6D, 0xE0, 0xCE, 0x55, 0xA7, 0xB1, 0xBF, 0xEE,
+0x37, 0xD1, 0xDF, 0x6F, 0xFC, 0xD9, 0x73, 0xE1, 0xCD, 0xB7, 0x8F, 0x8A, 0xB9, 0x95, 0x07, 0xF1,
+0x7C, 0x80, 0x78, 0x32, 0x40, 0x0C, 0x8F, 0xCB, 0x48, 0x86, 0xFC, 0x93, 0x57, 0x3F, 0x14, 0xB3,
+0xFC, 0x4A, 0x0E, 0x26, 0x78, 0x7E, 0xE3, 0xDD, 0x13, 0x48, 0x5D, 0x85, 0x75, 0x8C, 0x1F, 0xF4,
+0x1B, 0x19, 0xF2, 0x95, 0xDC, 0xB0, 0xA6, 0xEC, 0x6D, 0xFF, 0x2D, 0x4D, 0x5B, 0xF5, 0x25, 0xB0,
+0x6B, 0xAA, 0x46, 0x92, 0xBF, 0x86, 0x41, 0x13, 0xB2, 0x3F, 0xAC, 0xAE, 0xE3, 0x1F, 0xF7, 0xD0,
+0x6A, 0xFC, 0xD7, 0x90, 0xD6, 0xA6, 0x89, 0x59, 0xF3, 0xCA, 0x55, 0xCD, 0x90, 0x23, 0x9E, 0xF6,
+0x6B, 0xF4, 0x84, 0x2B, 0x1D, 0x95, 0x46, 0x19, 0xA9, 0x4B, 0xEF, 0x59, 0xFD, 0x76, 0x3F, 0xA9,
+0x33, 0x53, 0x54, 0x44, 0x59, 0x92, 0x05, 0x5A, 0xEB, 0xCC, 0x95, 0x39, 0x5F, 0xE4, 0x63, 0x33,
+0x8C, 0x37, 0xEA, 0xEA, 0x6F, 0x0D, 0x73, 0x6E, 0xB3, 0xA0, 0x5A, 0x6B, 0x7F, 0xF6, 0xD9, 0x4A,
+0xBE, 0x76, 0x3E, 0xE7, 0xFC, 0xCD, 0xA4, 0x23, 0xBA, 0xF9, 0x44, 0xE1, 0xBE, 0x09, 0x60, 0x37,
+0x30, 0x58, 0x02, 0x07, 0xBE, 0xE4, 0x25, 0x9D, 0x8D, 0x8C, 0x83, 0x23, 0xEF, 0xEE, 0xCB, 0xB5,
+0x2D, 0x49, 0x13, 0x41, 0xCD, 0xD9, 0xB9, 0xA2, 0xE5, 0x6D, 0x36, 0x8C, 0x0C, 0x27, 0xC5, 0x3D,
+0x29, 0xAD, 0x8A, 0x37, 0x1E, 0x73, 0x98, 0x5B, 0x50, 0xEC, 0x3A, 0xF0, 0xA3, 0x61, 0x37, 0x72,
+0x1B, 0xAD, 0x6F, 0x60, 0x83, 0xEE, 0x06, 0xBA, 0xB4, 0x6C, 0x11, 0x7E, 0xD1, 0x9C, 0x85, 0x19,
+0x65, 0x78, 0x64, 0x14, 0xCD, 0x00, 0xA1, 0xE2, 0x2E, 0x20, 0xF9, 0x64, 0xF3, 0x71, 0xF5, 0x71,
+0xCE, 0xA6, 0xA2, 0xBC, 0xE5, 0x10, 0xF8, 0x8B, 0x6C, 0x9C, 0x63, 0x3D, 0xEC, 0x2F, 0xE7, 0x69,
+0xF6, 0xF0, 0x5B, 0x24, 0xFF, 0xBD, 0x34, 0xE7, 0x48, 0xEA, 0x98, 0x83, 0xAC, 0x15, 0x7B, 0x08,
+0x93, 0xD8, 0xF5, 0x70, 0x33, 0xEF, 0xFE, 0xAE, 0x55, 0x8F, 0x0E, 0x5E, 0x16, 0xAC, 0x9B, 0x50,
+0xA0, 0xC9, 0xDF, 0xB1, 0x0B, 0x5A, 0xDC, 0x85, 0x6F, 0xDD, 0xFD, 0x03, 0xED, 0xE2, 0x4B, 0xCA,
+0x3C, 0x76, 0x1F, 0x82, 0xA4, 0x2D, 0x45, 0xCC, 0xF2, 0x0A, 0x28, 0xB4, 0x5D, 0x02, 0x29, 0x7B,
+0xFD, 0xF2, 0x44, 0xF8, 0xF1, 0xF9, 0xF1, 0xF0, 0x22, 0x54, 0xB8, 0xE3, 0x43, 0xF5, 0x15, 0x3B,
+0xAA, 0x78, 0xE7, 0xA0, 0xEA, 0xBD, 0x0F, 0x85, 0xEE, 0x65, 0x90, 0x40, 0x2A, 0x76, 0xAF, 0x80,
+0x04, 0xBE, 0x7C, 0x61, 0x22, 0xBC, 0x7D, 0x15, 0xAA, 0xDD, 0x22, 0x64, 0x90, 0xB9, 0xC1, 0xE8,
+0xA7, 0xC5, 0x45, 0x6E, 0x1C, 0x51, 0xB1, 0x6F, 0x61, 0xE1, 0xBB, 0x0E, 0x5F, 0xA3, 0xCA, 0x16,
+0x53, 0x4B, 0x8C, 0x03, 0x15, 0x94, 0xB7, 0x41, 0x06, 0xCF, 0x62, 0xCF, 0x63, 0x46, 0x16, 0xCA,
+0x4F, 0xE4, 0x3A, 0xA0, 0x33, 0xA5, 0xD2, 0x56, 0x7C, 0xCE, 0x64, 0x7B, 0x3A, 0xCC, 0x7B, 0xB1,
+0xCC, 0xD0, 0x1D, 0xA1, 0x01, 0xB5, 0x89, 0x64, 0xE4, 0x7D, 0x98, 0xD2, 0x26, 0xB1, 0x05, 0x5F,
+0x6D, 0xD5, 0x34, 0xEF, 0x3E, 0xF8, 0xE0, 0x81, 0xF0, 0xE0, 0x03, 0x77, 0x49, 0x04, 0xF7, 0x20,
+0x54, 0x97, 0xB7, 0xDE, 0x3E, 0x11, 0xC6, 0x10, 0xE1, 0xD8, 0xC8, 0x41, 0xA5, 0x86, 0xAA, 0x15,
+0x4D, 0x75, 0xF4, 0xD1, 0x73, 0x57, 0x95, 0x46, 0xAE, 0x6D, 0x76, 0x19, 0xFA, 0x43, 0xDE, 0x05,
+0x85, 0x69, 0x00, 0xBB, 0x24, 0x90, 0x44, 0xBC, 0x81, 0xF4, 0x54, 0x2F, 0xBD, 0xFC, 0xAE, 0x60,
+0xAF, 0xBB, 0x6F, 0x2C, 0x7D, 0x70, 0x1D, 0x18, 0xE2, 0x8E, 0x15, 0x20, 0x2F, 0xEF, 0xC2, 0x24,
+0x49, 0xE5, 0x8E, 0x49, 0xA5, 0x45, 0x45, 0xBD, 0x15, 0x47, 0xFA, 0x3A, 0xAF, 0x7B, 0x77, 0xFA,
+0xC0, 0x6D, 0xDB, 0xBA, 0x21, 0x6C, 0x87, 0x2F, 0x21, 0x85, 0x9E, 0xC3, 0x50, 0x55, 0x8F, 0x1C,
+0x3F, 0xB7, 0xA2, 0x1F, 0x1E, 0xDC, 0x65, 0xE2, 0x0D, 0x98, 0x9C, 0xDF, 0xC1, 0x7E, 0xE8, 0x27,
+0xB1, 0xC3, 0x52, 0x37, 0x92, 0xAF, 0x53, 0x3D, 0xE6, 0x41, 0x53, 0xEC, 0x1E, 0xA8, 0xD5, 0x54,
+0x7C, 0xDB, 0x81, 0xED, 0x10, 0x08, 0xF2, 0x3B, 0xEF, 0x1E, 0x0F, 0x67, 0x48, 0x76, 0x17, 0xF1,
+0x15, 0xAD, 0x6D, 0x28, 0xD5, 0xD2, 0x0F, 0x8F, 0x9E, 0x09, 0x1F, 0x61, 0x0E, 0xCD, 0x52, 0x2C,
+0xB8, 0x05, 0x5F, 0x38, 0xB7, 0x3D, 0xB1, 0x63, 0x9A, 0x8D, 0x23, 0x67, 0x2E, 0x8B, 0x1D, 0x5D,
+0xF0, 0xC1, 0x87, 0x9F, 0xC4, 0x4E, 0xA3, 0x51, 0x6D, 0x95, 0xE2, 0xF9, 0x46, 0x79, 0x87, 0xCA,
+0x74, 0xF1, 0x50, 0xCC, 0x4D, 0x79, 0x53, 0xF6, 0x24, 0x1F, 0xE4, 0x14, 0x8D, 0x6A, 0xE7, 0xF4,
+0xEB, 0x29, 0xAA, 0x43, 0x71, 0x8F, 0x57, 0xF1, 0x65, 0x52, 0x02, 0x92, 0x94, 0x32, 0x9E, 0x52,
+0xB5, 0xCC, 0x7D, 0x9A, 0x94, 0x1A, 0x51, 0x2D, 0xE2, 0xDD, 0xB4, 0xAC, 0x46, 0x74, 0xAA, 0x9A,
+0x26, 0xB5, 0x57, 0x14, 0x40, 0x5E, 0x6E, 0x3E, 0x6F, 0x1E, 0x09, 0x9A, 0x91, 0x1C, 0xDD, 0xB1,
+0x82, 0x0F, 0x6D, 0xBB, 0x28, 0x8E, 0xC2, 0x0A, 0x93, 0x42, 0x17, 0x95, 0xC7, 0x78, 0x2E, 0x45,
+0x8D, 0xE6, 0x7B, 0x83, 0x2A, 0xA1, 0x74, 0xD5, 0x51, 0xFB, 0x9B, 0xEC, 0xCB, 0xCD, 0xFF, 0xB5,
+0xA1, 0xC3, 0xA3, 0x63, 0x20, 0xEA, 0x54, 0x46, 0xD8, 0x5C, 0x7D, 0x54, 0x45, 0xD1, 0x70, 0xB6,
+0xC8, 0x56, 0x21, 0x75, 0xA2, 0xA0, 0x1A, 0xA6, 0x99, 0xC4, 0x1A, 0x15, 0x2E, 0x2F, 0x6B, 0xE5,
+0xF4, 0x1A, 0x75, 0xC4, 0xC5, 0xCE, 0xE1, 0xF0, 0xAF, 0x43, 0xE0, 0x04, 0x5E, 0x3C, 0x08, 0xB9,
+0xBF, 0x07, 0xB2, 0x7C, 0x33, 0x8E, 0x31, 0xFA, 0xB7, 0x9C, 0xA0, 0x3F, 0xC6, 0x14, 0x94, 0x31,
+0x98, 0xA1, 0x7D, 0x1B, 0x1A, 0x99, 0x57, 0xD9, 0x23, 0x53, 0x81, 0x5D, 0x59, 0xF3, 0xE8, 0xD6,
+0xE4, 0x63, 0x67, 0x73, 0xD4, 0x89, 0xB1, 0x8C, 0x6B, 0x9A, 0x6F, 0x15, 0x9F, 0x4B, 0x9F, 0x7F,
+0xF6, 0x03, 0x44, 0x41, 0x50, 0x2A, 0x4D, 0xD5, 0x50, 0xDA, 0x81, 0x2F, 0x3C, 0xB6, 0x60, 0x23,
+0x16, 0xCB, 0x5E, 0x26, 0xF1, 0xA4, 0xD3, 0x72, 0xBD, 0x55, 0xBA, 0x19, 0x40, 0xDD, 0x8A, 0x7B,
+0xDC, 0xA0, 0x48, 0xB1, 0xD4, 0x77, 0x39, 0x15, 0xBB, 0x03, 0x50, 0xEC, 0x7A, 0xE1, 0x5B, 0xC6,
+0x1C, 0xC3, 0x2F, 0x5E, 0x1C, 0x17, 0x82, 0xD7, 0xC8, 0x41, 0xB2, 0x76, 0x1C, 0x66, 0xD5, 0xE7,
+0xCE, 0x8D, 0x87, 0xEF, 0x9D, 0x1E, 0x0D, 0x2F, 0x81, 0xA4, 0x5D, 0xC5, 0xB6, 0x64, 0xF5, 0x2C,
+0xB1, 0xA3, 0xD3, 0xF3, 0x42, 0xE6, 0x7E, 0x70, 0x76, 0x1C, 0xE6, 0x57, 0x6E, 0x93, 0x04, 0x11,
+0x02, 0xEA, 0xD6, 0x19, 0x90, 0xBD, 0xEF, 0x62, 0x77, 0x8B, 0x41, 0x90, 0xA2, 0x7A, 0x07, 0xCD,
+0x5D, 0x07, 0xEF, 0xDA, 0x19, 0x7A, 0xE0, 0x53, 0xC9, 0xFC, 0xA1, 0xAF, 0x63, 0xD1, 0x3F, 0x87,
+0x3D, 0xBA, 0x1B, 0xDD, 0x81, 0x86, 0x66, 0xCF, 0xBF, 0xFC, 0xDE, 0x2B, 0xE1, 0x1C, 0x54, 0xBB,
+0x56, 0xA8, 0x7F, 0x3A, 0x5F, 0x16, 0x7E, 0x41, 0x73, 0x11, 0x65, 0xF4, 0x25, 0xD3, 0x56, 0xB4,
+0xE0, 0x47, 0x3B, 0xEF, 0xF5, 0xE6, 0x7B, 0xC7, 0x85, 0x0C, 0x2E, 0x77, 0x30, 0x8D, 0x0A, 0xFD,
+0xA3, 0x98, 0xF3, 0xD1, 0x23, 0x62, 0xFD, 0x1A, 0x46, 0xC5, 0x7E, 0xE1, 0x99, 0x07, 0xC3, 0x17,
+0x9E, 0x7E, 0x20, 0x0C, 0x80, 0xA4, 0x0C, 0x83, 0x04, 0xFE, 0x35, 0x54, 0x2C, 0x6E, 0xF4, 0xDE,
+0x88, 0x7F, 0x28, 0xEF, 0xFF, 0xEA, 0xEB, 0x87, 0xB1, 0x33, 0xC1, 0xB5, 0xF8, 0x15, 0xAB, 0x75,
+0x2F, 0x36, 0xAA, 0xCD, 0x58, 0xB9, 0xF3, 0x89, 0x98, 0xEE, 0xC7, 0x9D, 0x41, 0x98, 0x83, 0x6D,
+0xE3, 0xB6, 0x8D, 0x92, 0x58, 0xFD, 0xA3, 0xA3, 0x67, 0xC3, 0x3B, 0x6F, 0x1E, 0x03, 0x29, 0x3D,
+0x05, 0x73, 0xAC, 0xAA, 0x50, 0x4B, 0x1D, 0xC4, 0xE3, 0x2A, 0xA2, 0x97, 0x5F, 0x85, 0x3A, 0x09,
+0xE1, 0x38, 0xF4, 0x6E, 0x58, 0x27, 0x84, 0x98, 0xA4, 0x7E, 0xE1, 0x61, 0xEB, 0xCD, 0x72, 0x95,
+0x2E, 0xF5, 0xFE, 0xB2, 0x50, 0x2D, 0xFF, 0x81, 0x63, 0xDB, 0xEE, 0xB9, 0x77, 0xAF, 0xEC, 0x65,
+0x7C, 0x09, 0x3F, 0x88, 0x7F, 0xFC, 0xC2, 0xBB, 0xE1, 0x12, 0x2C, 0x7A, 0x8D, 0x1E, 0xE7, 0x40,
+0x7A, 0xBF, 0xF3, 0xFD, 0xD7, 0xC3, 0x10, 0x3E, 0x7C, 0xEB, 0x60, 0xAE, 0xFF, 0xE2, 0xE7, 0x1F,
+0x96, 0x48, 0x5B, 0x1E, 0x8C, 0xAA, 0xDE, 0x88, 0x80, 0x8C, 0x9D, 0x7B, 0x77, 0x84, 0x6E, 0x24,
+0x33, 0x9E, 0xC0, 0x5C, 0x38, 0x09, 0x9F, 0x43, 0xFA, 0x1F, 0xD2, 0x2C, 0xDF, 0xC8, 0x41, 0xE2,
+0xF8, 0xD7, 0xD8, 0xDE, 0x8C, 0x3F, 0x28, 0xE2, 0xAC, 0x69, 0x94, 0x9F, 0x34, 0x72, 0x83, 0x06,
+0xCA, 0x7C, 0x02, 0x88, 0x1D, 0xD8, 0x2F, 0xB6, 0x49, 0xA1, 0xA3, 0x24, 0x93, 0xB6, 0x32, 0x22,
+0x36, 0x26, 0xFD, 0xF3, 0x05, 0xE9, 0x63, 0xFE, 0x55, 0x33, 0xAA, 0xED, 0xCB, 0xE9, 0xFB, 0xCF,
+0x5A, 0x9D, 0xEE, 0xA0, 0x1E, 0x6D, 0xB0, 0x8B, 0xDD, 0xEB, 0xFF, 0xDF, 0xDE, 0x97, 0x46, 0xC7,
+0x71, 0x9D, 0x57, 0x3E, 0x00, 0xC4, 0xBE, 0x13, 0x20, 0x08, 0x90, 0x58, 0x08, 0x11, 0xDC, 0x17,
+0x71, 0xD1, 0x42, 0x89, 0x34, 0x49, 0xED, 0xD1, 0x91, 0x14, 0x6F, 0x72, 0xE4, 0xC4, 0xB1, 0x1D,
+0x3B, 0x1E, 0x4F, 0xE2, 0xD8, 0x73, 0xCE, 0x8C, 0x73, 0x26, 0x3F, 0xE6, 0x47, 0xFC, 0x63, 0xC6,
+0xF6, 0x8F, 0x49, 0xE2, 0xCC, 0xC4, 0xF6, 0xB1, 0x33, 0xF1, 0xBE, 0xC8, 0xB2, 0x25, 0xD9, 0xB2,
+0x25, 0x4B, 0xB6, 0x65, 0x91, 0xA2, 0x48, 0x71, 0x97, 0x44, 0x91, 0x02, 0xF7, 0x05, 0xDC, 0xC1,
+0x15, 0x5C, 0x40, 0x02, 0x24, 0xC0, 0xB9, 0xF7, 0x7B, 0xEF, 0x55, 0x55, 0x37, 0x1A, 0x1B, 0x81,
+0x6E, 0x00, 0xCD, 0xAF, 0x78, 0x8A, 0xE8, 0xAE, 0xAE, 0x7A, 0x55, 0xEF, 0xD6, 0xAB, 0xAA, 0x5B,
+0xF7, 0xDB, 0xE4, 0xC6, 0xE5, 0x48, 0x51, 0xF4, 0xAF, 0x5F, 0xEE, 0x88, 0x5D, 0xF0, 0xD5, 0xAF,
+0x13, 0xA8, 0x30, 0x91, 0x6D, 0x83, 0xED, 0xD9, 0x24, 0x97, 0xBB, 0xBF, 0xC1, 0x36, 0xE1, 0xBA,
+0x3D, 0x8E, 0x8F, 0x27, 0x9D, 0xA6, 0x38, 0xB7, 0x4A, 0xE0, 0xA3, 0x16, 0xC8, 0xDB, 0xEE, 0x37,
+0x7B, 0xB4, 0xC1, 0xFF, 0xF6, 0x8B, 0x23, 0xB1, 0xC2, 0x99, 0x9C, 0x7A, 0x88, 0xEB, 0xAC, 0x00,
+0x37, 0x7A, 0x5B, 0x1F, 0x30, 0xF9, 0x13, 0xC9, 0x28, 0x1F, 0x5E, 0x0C, 0xDE, 0xA0, 0x89, 0xC5,
+0x07, 0x90, 0x44, 0x0F, 0xD5, 0x76, 0x31, 0x4E, 0xB9, 0x0B, 0x94, 0xCF, 0xF0, 0x0A, 0x12, 0xD5,
+0x35, 0xC0, 0xCE, 0xF7, 0xD5, 0xF5, 0x0B, 0x5F, 0xED, 0x3D, 0xC6, 0xAD, 0xCF, 0xF3, 0x8E, 0xC0,
+0x09, 0xBC, 0xE6, 0x9A, 0x3C, 0x5C, 0xDC, 0x33, 0xEB, 0xAB, 0xD1, 0x6F, 0x96, 0xD1, 0x4A, 0xFE,
+0x74, 0x85, 0x8E, 0xBC, 0x2D, 0xC7, 0xCC, 0x75, 0x3C, 0xA4, 0xE4, 0xB6, 0x06, 0xC5, 0x2E, 0x5A,
+0xE6, 0xCE, 0xF7, 0x28, 0x7A, 0x4E, 0xA3, 0x0F, 0xCA, 0x9E, 0xF7, 0x0C, 0xDB, 0xEF, 0xC0, 0x87,
+0xCE, 0x9D, 0xCF, 0x70, 0x2C, 0xF9, 0x6E, 0xFB, 0x11, 0xE0, 0x95, 0x4E, 0x7B, 0xDE, 0x39, 0x31,
+0x12, 0x36, 0x33, 0x3B, 0x07, 0x81, 0x25, 0x78, 0x93, 0xC5, 0x83, 0x79, 0x12, 0xEA, 0xE5, 0x52,
+0xB5, 0xEB, 0xF7, 0xBE, 0x9C, 0x7C, 0xB8, 0x06, 0xBD, 0x07, 0xF2, 0x0A, 0x9B, 0xEC, 0xD9, 0x5A,
+0xD5, 0x06, 0x3B, 0xC9, 0x39, 0xE9, 0xFF, 0x79, 0x13, 0x34, 0x1B, 0xAC, 0xDF, 0xCB, 0x8E, 0x68,
+0xCD, 0xAE, 0x42, 0x62, 0xE1, 0x46, 0x44, 0xC3, 0x12, 0xED, 0x3D, 0x20, 0x5D, 0xEF, 0x9D, 0xED,
+0x30, 0xE7, 0x61, 0x32, 0xA5, 0x49, 0xB6, 0xB7, 0x67, 0x00, 0xD5, 0xBA, 0x93, 0x20, 0x65, 0xDB,
+0xCE, 0x74, 0x98, 0xBD, 0x20, 0x77, 0x47, 0x2E, 0x77, 0x99, 0xF3, 0xA8, 0x11, 0x5B, 0x0E, 0x09,
+0x90, 0x29, 0x54, 0xE2, 0xA7, 0x2B, 0x50, 0x34, 0x9A, 0x51, 0x4F, 0x96, 0xEB, 0xB3, 0x4A, 0x85,
+0xCF, 0x9D, 0x77, 0x11, 0xDB, 0xEC, 0xC4, 0xF2, 0x73, 0x57, 0x13, 0x13, 0x42, 0xAA, 0x22, 0x35,
+0x70, 0x20, 0x9F, 0x35, 0xB3, 0x5E, 0xDA, 0x3D, 0x84, 0x92, 0x4D, 0x9B, 0x37, 0xEF, 0x92, 0x5A,
+0xA2, 0x7D, 0xA9, 0x40, 0x5E, 0xFD, 0xA1, 0x59, 0xEF, 0x6D, 0xA8, 0x7C, 0x17, 0x48, 0xD0, 0x78,
+0xDF, 0x70, 0xB7, 0xC6, 0xF8, 0xE3, 0xE3, 0x43, 0x94, 0x89, 0x70, 0x2B, 0x91, 0x33, 0xAD, 0x14,
+0x39, 0xD8, 0x68, 0xC2, 0x3D, 0x88, 0x7D, 0xB1, 0x18, 0x7D, 0x67, 0x1F, 0xCE, 0xFB, 0x54, 0x98,
+0xA8, 0x08, 0x72, 0xBD, 0x6B, 0x34, 0xF3, 0xC6, 0x75, 0x9D, 0x66, 0xBA, 0x26, 0x98, 0xEB, 0xE6,
+0xCC, 0xAA, 0x37, 0xF5, 0xB5, 0x13, 0x24, 0x18, 0xA3, 0x79, 0xF7, 0x21, 0xB3, 0x09, 0xE4, 0x85,
+0xA4, 0xB3, 0x2F, 0x47, 0x78, 0x0A, 0x08, 0x7B, 0xF1, 0x20, 0xDF, 0x82, 0x75, 0xF9, 0x60, 0x1E,
+0x08, 0x11, 0x1C, 0xEC, 0x78, 0xB2, 0xEB, 0xDF, 0xC4, 0x40, 0x4C, 0xB0, 0x23, 0xBE, 0x80, 0x31,
+0xBA, 0x73, 0xEE, 0x9C, 0x46, 0x51, 0x9B, 0x2E, 0x80, 0x54, 0xB4, 0x40, 0x29, 0xDA, 0x8C, 0x02,
+0xF7, 0x07, 0xE1, 0x6B, 0xD7, 0x57, 0x44, 0x33, 0x15, 0x28, 0x12, 0xA2, 0x2D, 0x30, 0x67, 0xD2,
+0x8F, 0x8C, 0xAA, 0xD5, 0xCC, 0x99, 0x8D, 0xA6, 0x6E, 0x72, 0x95, 0xE4, 0x74, 0x1B, 0xAD, 0x13,
+0xAB, 0x47, 0xCC, 0x9D, 0x73, 0x9B, 0x29, 0x04, 0x81, 0x67, 0xD4, 0xF2, 0xE6, 0xAD, 0x3B, 0xCD,
+0x66, 0x8C, 0x39, 0x2A, 0x77, 0xBD, 0xF9, 0x16, 0x8A, 0xDF, 0x27, 0xAC, 0x7E, 0xEF, 0x42, 0x7D,
+0x5B, 0xB7, 0xE9, 0x3D, 0x98, 0x49, 0x0F, 0x48, 0x6D, 0xE5, 0x06, 0xBC, 0xC0, 0xCC, 0x04, 0x49,
+0xA4, 0x6F, 0x9D, 0x9C, 0x15, 0x5C, 0xE8, 0x74, 0x0F, 0x98, 0x37, 0x6F, 0x2A, 0x22, 0x65, 0x0B,
+0x90, 0x20, 0xE1, 0x9A, 0x39, 0x7D, 0xFA, 0xBC, 0xE0, 0xB9, 0x1F, 0x6A, 0x72, 0x7F, 0x11, 0xE2,
+0xF4, 0xC5, 0x7B, 0x17, 0x26, 0xD8, 0xCD, 0xC0, 0x94, 0xE6, 0x58, 0x7B, 0xBF, 0xC1, 0x7F, 0x4A,
+0xEC, 0xC2, 0xE1, 0x44, 0x90, 0xF9, 0x16, 0xB7, 0x1B, 0xBE, 0x14, 0x72, 0x01, 0x73, 0x96, 0x34,
+0x27, 0xF4, 0xF9, 0xC2, 0x0D, 0x90, 0x79, 0x62, 0xE8, 0xFF, 0xC5, 0xBF, 0x62, 0xA6, 0x75, 0x7F,
+0xF9, 0x99, 0xCB, 0x13, 0xCD, 0xB2, 0x6D, 0xEC, 0x2C, 0x84, 0x51, 0xC8, 0x90, 0x9B, 0xC5, 0x69,
+0xDF, 0x46, 0x63, 0x06, 0xBF, 0xD9, 0x84, 0x62, 0x11, 0x3F, 0x2F, 0xE7, 0xD8, 0xCF, 0x60, 0x0E,
+0xC9, 0xCE, 0xEE, 0x6A, 0xF9, 0xC9, 0x3A, 0xB6, 0x7D, 0x6E, 0xCB, 0x37, 0x51, 0xF9, 0xCE, 0x7F,
+0x4E, 0x45, 0x09, 0xFF, 0xF2, 0xF7, 0xB0, 0x5D, 0x51, 0x5F, 0xDC, 0x1C, 0xDD, 0x57, 0x70, 0x5C,
+0x8E, 0x1C, 0x86, 0xDF, 0x1D, 0xC1, 0x09, 0x48, 0x59, 0x48, 0x78, 0xE2, 0xD7, 0x11, 0x54, 0x1D,
+0xF9, 0xB1, 0xC7, 0x42, 0xB7, 0x16, 0xE6, 0x33, 0xF3, 0xDB, 0x38, 0xD5, 0xCE, 0xDD, 0x72, 0xB2,
+0x9C, 0xFF, 0x9A, 0x64, 0x34, 0x87, 0x83, 0x73, 0x2E, 0x6E, 0x1A, 0xA9, 0x98, 0x78, 0x3C, 0x57,
+0x70, 0x9E, 0xBB, 0xF0, 0x40, 0xB9, 0x41, 0xDF, 0x9B, 0x28, 0xC1, 0x76, 0x4A, 0x9C, 0xF5, 0xAB,
+0x0B, 0x7D, 0x0E, 0xE5, 0xA2, 0xB1, 0x8E, 0x67, 0x56, 0x9D, 0x8A, 0x10, 0xE1, 0x40, 0xC9, 0x72,
+0x64, 0x37, 0xAA, 0xF8, 0x85, 0xE6, 0x68, 0x7B, 0x9E, 0x33, 0xE8, 0x5F, 0x87, 0x31, 0x93, 0x87,
+0xCC, 0xFB, 0x4D, 0x7C, 0x63, 0x4B, 0x91, 0x62, 0xC7, 0x9B, 0xC1, 0x3E, 0x12, 0x3B, 0x2A, 0x76,
+0x2C, 0xDD, 0x45, 0x62, 0x27, 0xE7, 0x26, 0x32, 0xFB, 0x73, 0xEF, 0x54, 0xE0, 0xD0, 0xBF, 0x32,
+0xD6, 0x77, 0xCE, 0xE6, 0xB2, 0x73, 0x0A, 0x9D, 0x53, 0x85, 0xAD, 0x2F, 0x9D, 0x53, 0x80, 0x1D,
+0x86, 0xDE, 0x37, 0xCF, 0xFB, 0x52, 0x06, 0x91, 0xD9, 0xC2, 0x08, 0x71, 0x08, 0xB9, 0xF9, 0x32,
+0x93, 0x4C, 0x90, 0x33, 0x4C, 0xAB, 0x84, 0x7F, 0x1D, 0x88, 0x5D, 0xF2, 0x1E, 0x74, 0xC9, 0x1D,
+0x5D, 0x12, 0x90, 0x22, 0xAF, 0x09, 0x83, 0x7C, 0xA0, 0x5A, 0x38, 0x2C, 0x29, 0xEC, 0xE7, 0x10,
+0xA3, 0xDC, 0xAF, 0xBF, 0x92, 0xF0, 0xC5, 0xB0, 0xC3, 0x32, 0xB9, 0x30, 0x82, 0x63, 0xCD, 0x59,
+0x10, 0xAD, 0x57, 0x5A, 0xDA, 0x11, 0xE0, 0x70, 0xDD, 0x80, 0xDB, 0xD9, 0xF1, 0x9B, 0x60, 0xA2,
+0x6F, 0x5D, 0xF3, 0x39, 0xA8, 0x75, 0xC7, 0x90, 0x38, 0x15, 0x6A, 0x5C, 0x01, 0x36, 0x9E, 0x90,
+0x97, 0x65, 0x16, 0x21, 0xC1, 0x71, 0xA2, 0x1C, 0x76, 0x8C, 0xB6, 0xA5, 0x99, 0xB6, 0xE5, 0xA2,
+0xF5, 0xA7, 0x63, 0x14, 0xAA, 0x25, 0xB7, 0x19, 0xE6, 0x12, 0x7E, 0xA3, 0x49, 0x97, 0x81, 0x18,
+0x89, 0xA6, 0x32, 0xA4, 0x0C, 0xF9, 0x93, 0xFB, 0x16, 0x9B, 0x32, 0xA4, 0xFB, 0x69, 0x83, 0x3A,
+0xF6, 0xFC, 0x0B, 0x6B, 0x60, 0xE6, 0xDB, 0xDB, 0xA7, 0x0A, 0x44, 0xC2, 0x74, 0x04, 0x65, 0x1F,
+0x9F, 0x7E, 0xFE, 0x75, 0x49, 0x93, 0xC2, 0xEA, 0x2D, 0xF4, 0xAF, 0x93, 0x3D, 0xF4, 0xA2, 0xDA,
+0x51, 0x1D, 0x6C, 0x80, 0xD9, 0xB7, 0x1E, 0x33, 0x73, 0x94, 0x9D, 0x39, 0xD5, 0x66, 0xDE, 0xC4,
+0x83, 0x97, 0xC1, 0x17, 0xBD, 0x4D, 0x47, 0x60, 0x16, 0x7B, 0xE1, 0xE5, 0xF5, 0x42, 0xD2, 0xAC,
+0xA2, 0x1F, 0x3B, 0xB1, 0x9F, 0x2C, 0xAB, 0x55, 0x0B, 0x82, 0x32, 0x7F, 0xC1, 0x74, 0xF1, 0x0B,
+0x65, 0x2E, 0xBB, 0x9F, 0x3C, 0xBB, 0x0A, 0x0F, 0xFF, 0x63, 0xA2, 0x6C, 0xF5, 0x36, 0x5D, 0xC6,
+0x7E, 0xDF, 0x40, 0x10, 0xC1, 0x16, 0x14, 0x97, 0xBF, 0xD2, 0x69, 0xD3, 0x6B, 0x79, 0x1F, 0xE8,
+0xC4, 0x4F, 0xE7, 0x5E, 0x58, 0x6B, 0x9F, 0x63, 0x45, 0x6E, 0x58, 0x83, 0x1C, 0xF0, 0x76, 0x3F,
+0xE1, 0xFF, 0xE1, 0xE6, 0x24, 0x22, 0x0F, 0xAF, 0x5C, 0x64, 0xCA, 0x50, 0x22, 0x2B, 0x13, 0xA4,
+0x96, 0x6E, 0x4B, 0xAF, 0xBD, 0xB6, 0xD5, 0xBC, 0xB9, 0x7E, 0x47, 0x9F, 0x26, 0x4A, 0x9A, 0xBC,
+0x9B, 0x11, 0x7C, 0xF0, 0xF3, 0x5F, 0xBE, 0x6E, 0xCE, 0x5D, 0xBC, 0x6C, 0x4A, 0x90, 0xCA, 0xE8,
+0xA1, 0xFB, 0xD0, 0x0E, 0x54, 0xAC, 0xC4, 0x13, 0x8F, 0x99, 0xF7, 0xCA, 0x41, 0x1E, 0xBA, 0xAC,
+0xEE, 0xFA, 0x3B, 0xA0, 0x6D, 0xFB, 0x5E, 0xA9, 0xB0, 0x30, 0xCF, 0x2C, 0x5E, 0x30, 0x4D, 0x4A,
+0x9F, 0x91, 0x17, 0x6C, 0xC3, 0xB8, 0x7C, 0xEE, 0x57, 0x6B, 0xCC, 0x2B, 0xAF, 0x6E, 0x36, 0x54,
+0xCB, 0x12, 0x4D, 0xBC, 0x6F, 0xD1, 0xCF, 0xF2, 0x47, 0xCF, 0xBC, 0x6A, 0x7E, 0xF2, 0x8B, 0x57,
+0xCD, 0xC9, 0xD6, 0xB3, 0x18, 0x17, 0x59, 0xA8, 0x52, 0x31, 0xC3, 0x94, 0x41, 0xA1, 0x63, 0xFD,
+0x79, 0x3F, 0xB1, 0xB4, 0xDA, 0x7D, 0x48, 0x5C, 0x5C, 0x5D, 0x89, 0xE5, 0xE8, 0x2C, 0x55, 0xE1,
+0x35, 0x50, 0xE0, 0xD6, 0xAE, 0xDF, 0xDE, 0xAF, 0x9A, 0x7C, 0x1E, 0x2F, 0x03, 0x2F, 0xFE, 0x6E,
+0xA3, 0xD9, 0x05, 0x5C, 0x49, 0x02, 0x23, 0x4E, 0x5C, 0x37, 0x03, 0xDA, 0x4D, 0x6F, 0x93, 0x1A,
+0x19, 0xE6, 0x26, 0x0F, 0x8F, 0x37, 0x0A, 0x96, 0xB3, 0x3A, 0x86, 0x24, 0x91, 0x7C, 0x9B, 0x13,
+0x27, 0x44, 0x94, 0xBB, 0xCA, 0x40, 0xA4, 0x5E, 0x06, 0x9C, 0xBA, 0x65, 0xCE, 0x49, 0xF0, 0x97,
+0xCB, 0xFA, 0x9A, 0xFD, 0x76, 0x09, 0xD7, 0x41, 0xDB, 0x6C, 0x5F, 0x66, 0xB4, 0x03, 0x1F, 0x23,
+0x3B, 0x23, 0x1B, 0x3B, 0x66, 0xFE, 0xB5, 0x9F, 0x91, 0xC4, 0xD3, 0x2D, 0x93, 0xE5, 0x38, 0xAE,
+0x4C, 0xCE, 0xAC, 0xAB, 0xE9, 0xEA, 0xAD, 0x46, 0xFF, 0x66, 0xC1, 0x9F, 0x84, 0xD5, 0x1C, 0x68,
+0xDE, 0xE2, 0x2C, 0x9F, 0xDD, 0xB2, 0x2C, 0x7C, 0x1F, 0xC7, 0x65, 0x18, 0x68, 0xF6, 0x33, 0x4A,
+0x6A, 0xF1, 0x33, 0x1E, 0xF0, 0xB2, 0x1C, 0x37, 0xBC, 0x71, 0x99, 0x6E, 0x39, 0xAB, 0x42, 0xB0,
+0xEC, 0x17, 0xDE, 0xD4, 0xB8, 0x9E, 0xAF, 0x67, 0x47, 0x45, 0x8D, 0x73, 0xF0, 0x1D, 0x77, 0x3C,
+0xBE, 0x6D, 0xCB, 0x7A, 0xF8, 0xCC, 0x08, 0x37, 0x86, 0x70, 0x33, 0xDB, 0x3D, 0xB3, 0x0B, 0x70,
+0x99, 0x64, 0xC0, 0x97, 0xBF, 0xEE, 0x33, 0xCE, 0x13, 0x7F, 0xB7, 0xEB, 0xD9, 0x07, 0x0C, 0xF7,
+0xD1, 0x84, 0xF0, 0xF2, 0xE2, 0x84, 0xD2, 0xFC, 0x4D, 0x9E, 0xD8, 0x3E, 0x36, 0x23, 0x99, 0x61,
+0x24, 0xD1, 0x0D, 0x12, 0x1C, 0xEF, 0xE7, 0x11, 0xBD, 0xCE, 0x83, 0xCF, 0xFE, 0x86, 0x6A, 0x49,
+0xAA, 0xDC, 0x7F, 0xFD, 0x7F, 0x7C, 0x18, 0x93, 0x44, 0xBB, 0xCB, 0xCA, 0x3F, 0x70, 0xAD, 0xF5,
+0xDA, 0xDF, 0x1C, 0xE3, 0x34, 0x2F, 0x92, 0x79, 0x06, 0x6C, 0x00, 0x94, 0xCA, 0xD2, 0x12, 0x53,
+0x85, 0x8B, 0x3D, 0x15, 0x7E, 0x26, 0x92, 0x40, 0xB5, 0xED, 0xA2, 0x69, 0x3D, 0xDF, 0x26, 0x2F,
+0x22, 0x19, 0x38, 0xCF, 0xA2, 0x72, 0x24, 0xB8, 0xF1, 0xFB, 0xAE, 0x87, 0xFD, 0xF4, 0x3E, 0x99,
+0xB1, 0x80, 0xDA, 0xFE, 0x86, 0x0F, 0x9C, 0xD0, 0x6F, 0xD3, 0x3F, 0x16, 0xDC, 0x6F, 0x82, 0x53,
+0x80, 0x9C, 0x6B, 0xC4, 0x3D, 0x74, 0x30, 0xF6, 0xBB, 0xB3, 0xF3, 0x40, 0xEC, 0x30, 0x1E, 0x30,
+0x18, 0xEA, 0xCA, 0xC7, 0x56, 0x29, 0x31, 0xF2, 0x95, 0x0B, 0x20, 0x4C, 0x27, 0x51, 0x87, 0xF5,
+0x14, 0x6C, 0x4C, 0x34, 0x3B, 0x52, 0xC1, 0xE2, 0xD9, 0x27, 0x59, 0x3D, 0x23, 0x51, 0xA5, 0xC8,
+0x35, 0x25, 0xE4, 0xC6, 0x76, 0x9D, 0x24, 0x87, 0xCA, 0x16, 0xEB, 0xB0, 0x9E, 0xC4, 0x6F, 0x67,
+0x19, 0x60, 0xE0, 0x40, 0x6F, 0xC7, 0x4A, 0xA7, 0xA5, 0x66, 0x2B, 0x0A, 0x86, 0x47, 0xA2, 0x58,
+0x3B, 0xB1, 0x0D, 0xDB, 0xF0, 0x6D, 0xF9, 0x60, 0xD3, 0x8B, 0x58, 0xBF, 0x15, 0xCB, 0x5B, 0x19,
+0xF5, 0x8A, 0xE3, 0x60, 0x14, 0x6A, 0x94, 0x43, 0xE5, 0xE1, 0x22, 0x63, 0xFE, 0xB9, 0xDA, 0xC2,
+0x71, 0x48, 0x77, 0xD2, 0x6D, 0xB6, 0x9D, 0x66, 0x20, 0x04, 0x4C, 0x80, 0x30, 0x9D, 0xEE, 0x6B,
+0xBB, 0x26, 0xDB, 0xF8, 0xF5, 0x69, 0xA5, 0xE5, 0x3E, 0xA8, 0xEA, 0x6D, 0x81, 0xD9, 0x96, 0x11,
+0xAE, 0xB4, 0xA2, 0x96, 0xE7, 0x66, 0x99, 0xB9, 0x68, 0xE3, 0xB6, 0x12, 0xFA, 0xEB, 0xF5, 0x24,
+0x0A, 0xEC, 0xD7, 0x79, 0x98, 0x69, 0xDB, 0xC8, 0x16, 0x23, 0x23, 0x8A, 0x24, 0x9E, 0xA4, 0x8F,
+0xE6, 0xDF, 0xDE, 0x82, 0x63, 0x99, 0xDD, 0x7F, 0xD1, 0xFC, 0x26, 0x38, 0xE6, 0xD7, 0xCB, 0xB8,
+0x7C, 0x77, 0xFB, 0x7E, 0xB3, 0x66, 0xDD, 0x36, 0xA8, 0x5E, 0x56, 0xDD, 0x39, 0x05, 0x15, 0x83,
+0x01, 0x15, 0x4C, 0x89, 0x42, 0x95, 0x8B, 0xC4, 0x69, 0x7B, 0xF3, 0x41, 0xF3, 0xC6, 0xDA, 0x77,
+0xCC, 0x26, 0xA8, 0x1B, 0x1D, 0xF0, 0xCD, 0x9B, 0x48, 0x5F, 0x28, 0x98, 0x08, 0xA9, 0x04, 0xF5,
+0xF6, 0xA8, 0x2E, 0x00, 0x01, 0x5B, 0xB0, 0x00, 0x25, 0xB0, 0x6E, 0x9F, 0x2E, 0x75, 0x3F, 0xA9,
+0xC6, 0x6D, 0xDA, 0xB2, 0x0B, 0xCE, 0xFC, 0x7B, 0xCD, 0x09, 0xA4, 0x1B, 0x61, 0xDB, 0x7C, 0x28,
+0x33, 0x58, 0xE2, 0x08, 0x1E, 0xCC, 0x9B, 0xA0, 0x84, 0xAC, 0x5E, 0xBB, 0xCD, 0x6C, 0xA4, 0xE9,
+0x10, 0x26, 0x56, 0x92, 0xB8, 0x78, 0xB2, 0x4E, 0xE2, 0x6A, 0xF3, 0x9D, 0x95, 0x99, 0x85, 0x20,
+0x00, 0x93, 0xAB, 0x2B, 0x10, 0x13, 0xD5, 0x29, 0xCA, 0xD4, 0x9A, 0xB5, 0xEF, 0x9A, 0x6D, 0x3B,
+0x0E, 0x88, 0x52, 0xC5, 0xDC, 0x76, 0x7C, 0xC6, 0xF0, 0x1A, 0xBC, 0x04, 0xF2, 0x4A, 0x9F, 0xA8,
+0x75, 0x9B, 0x9A, 0xCD, 0x5A, 0x98, 0xF6, 0x8E, 0x42, 0x4C, 0x28, 0x00, 0x81, 0xC8, 0x83, 0x0B,
+0x82, 0x28, 0xBE, 0x83, 0x91, 0x6C, 0x87, 0xFF, 0xB6, 0xD8, 0x67, 0x8B, 0x54, 0x28, 0xE7, 0xA3,
+0x94, 0xD8, 0xBC, 0x99, 0x53, 0x4C, 0x31, 0x54, 0xAC, 0x76, 0xA4, 0x68, 0xD9, 0xBD, 0xEF, 0x88,
+0x79, 0x03, 0x44, 0x64, 0x3D, 0x08, 0xEA, 0x61, 0xF4, 0x45, 0xCE, 0x15, 0xFA, 0xC9, 0x34, 0x1C,
+0x8C, 0x72, 0xE6, 0xB9, 0xDA, 0x80, 0xDF, 0xD6, 0x00, 0xCB, 0xAD, 0xEF, 0xEC, 0x01, 0x09, 0xEF,
+0x42, 0x3E, 0xB8, 0x49, 0x66, 0x11, 0xCA, 0x6C, 0xF1, 0x9C, 0x8C, 0xE6, 0x89, 0xCA, 0x24, 0xF3,
+0xEE, 0x2D, 0x04, 0x69, 0xCF, 0xC5, 0x98, 0xA1, 0x69, 0x75, 0x23, 0xC6, 0xE5, 0xAA, 0x37, 0xB6,
+0x99, 0x37, 0x36, 0xEC, 0x30, 0xFB, 0x40, 0xDE, 0x39, 0x8E, 0x48, 0xE0, 0x79, 0x8E, 0x99, 0x28,
+0x9B, 0x2A, 0xDA, 0x1B, 0x38, 0xF7, 0xAB, 0xB1, 0xCE, 0xDB, 0xDB, 0xF6, 0x99, 0xAB, 0x38, 0xDF,
+0xCC, 0xF9, 0xB7, 0x00, 0xE5, 0xC5, 0x4A, 0xE0, 0x9F, 0x18, 0x55, 0xF2, 0xF9, 0xB2, 0x31, 0x1B,
+0x09, 0x8B, 0x97, 0xA0, 0xAA, 0xC5, 0x5C, 0x94, 0x57, 0xE3, 0xB3, 0x9B, 0x6D, 0xBE, 0xF1, 0xE6,
+0x76, 0xBC, 0x74, 0x34, 0x8B, 0x12, 0xCA, 0xF1, 0xC2, 0xB1, 0xCF, 0x4C, 0x1D, 0xC4, 0xF6, 0x0C,
+0xDC, 0x0E, 0xF6, 0xC0, 0xAF, 0x8E, 0xEB, 0xAC, 0xC7, 0x8B, 0xC9, 0x79, 0x5C, 0x0F, 0xCC, 0x0B,
+0xC8, 0xE7, 0x6F, 0xE0, 0x36, 0x94, 0x42, 0x50, 0x47, 0x2D, 0xB1, 0x23, 0x18, 0x64, 0xE3, 0x27,
+0x91, 0xFD, 0x99, 0x39, 0xD4, 0xE4, 0xC6, 0x00, 0x92, 0x93, 0x51, 0x8C, 0x52, 0x27, 0x25, 0xE3,
+0x4D, 0x66, 0x71, 0x39, 0x3E, 0x63, 0x2E, 0x89, 0xFB, 0xEB, 0x97, 0x47, 0x7F, 0x8B, 0xFB, 0x1C,
+0x6C, 0x1B, 0x5D, 0xD7, 0x7D, 0xE6, 0x6F, 0x76, 0x2E, 0x33, 0x59, 0xC5, 0x48, 0x84, 0x88, 0xCF,
+0x9C, 0x33, 0xF9, 0xB9, 0x28, 0x6E, 0x2E, 0x2C, 0x31, 0x59, 0x85, 0x58, 0x56, 0x88, 0x13, 0xC8,
+0x39, 0x3F, 0xF2, 0xB7, 0x80, 0xDF, 0x8B, 0x64, 0x1E, 0x97, 0x8F, 0x92, 0x54, 0x6E, 0x1E, 0x97,
+0x8F, 0x5C, 0x60, 0x98, 0xB3, 0xF3, 0xF2, 0x31, 0x28, 0x0B, 0xEC, 0x5F, 0x28, 0x23, 0xE1, 0x9C,
+0x87, 0xCF, 0x9C, 0x73, 0xA1, 0x18, 0xE5, 0xCA, 0xDF, 0x5C, 0x5C, 0xB8, 0xF2, 0x17, 0x64, 0x92,
+0x73, 0x1E, 0xFF, 0xCA, 0xF7, 0x6C, 0x44, 0x6D, 0xE2, 0x37, 0x38, 0x79, 0xCA, 0x67, 0x28, 0x2A,
+0x74, 0x16, 0x96, 0xD9, 0x7F, 0xC6, 0x4D, 0x35, 0x37, 0x32, 0xB3, 0x6A, 0x00, 0x7D, 0x7C, 0x38,
+0xE7, 0x61, 0xD0, 0x31, 0x51, 0x2A, 0x93, 0xA4, 0xCA, 0xDF, 0xCC, 0x1B, 0xF2, 0x80, 0x90, 0x3C,
+0x72, 0x98, 0xBB, 0xA0, 0x62, 0x51, 0x92, 0x5F, 0x3C, 0xAD, 0xD6, 0x54, 0xE0, 0x2D, 0x26, 0x15,
+0x13, 0x6F, 0xB4, 0xED, 0xB8, 0x99, 0x77, 0x53, 0x99, 0x12, 0x93, 0xA4, 0x25, 0x1E, 0x9E, 0xA8,
+0x78, 0x85, 0x33, 0x46, 0xD1, 0xA4, 0x0A, 0xE5, 0x08, 0x9B, 0x13, 0xEE, 0x9C, 0xA2, 0xE7, 0x7C,
+0x0A, 0xB9, 0x3D, 0x89, 0x9E, 0x57, 0xFC, 0x9C, 0x0A, 0xE8, 0xD5, 0x40, 0x79, 0x13, 0x46, 0x50,
+0x0E, 0x1F, 0xFB, 0x59, 0xC0, 0xB3, 0x61, 0x32, 0xC3, 0xE9, 0x53, 0x63, 0x86, 0xE5, 0x03, 0xEB,
+0x10, 0xD2, 0x9C, 0x74, 0xB8, 0x94, 0x10, 0xF2, 0xE2, 0xC0, 0x7F, 0x4E, 0xDD, 0x0D, 0x83, 0x41,
+0xE2, 0x94, 0x39, 0x17, 0xDD, 0x6B, 0xAB, 0x47, 0xF0, 0x2D, 0xDA, 0xCE, 0xE1, 0x76, 0x84, 0x8D,
+0xA8, 0xB9, 0x7F, 0x1E, 0x23, 0xCF, 0xE9, 0x88, 0x97, 0x30, 0x40, 0xE7, 0xEB, 0xE9, 0x14, 0x65,
+0x39, 0xC7, 0x18, 0x17, 0x24, 0x75, 0xD7, 0x31, 0xCE, 0xE0, 0xC1, 0x24, 0x63, 0x65, 0x42, 0x11,
+0xD4, 0xA5, 0x31, 0x54, 0x71, 0x82, 0xE6, 0xFC, 0xC3, 0x97, 0xE0, 0xB3, 0x75, 0x1A, 0xFE, 0x8B,
+0x20, 0x44, 0x87, 0x2E, 0xC2, 0xA4, 0x02, 0x72, 0x44, 0xB2, 0x44, 0x9A, 0xC3, 0x80, 0x85, 0x77,
+0x40, 0xA6, 0x76, 0x41, 0x01, 0xEB, 0x70, 0x4E, 0xE6, 0x24, 0x5F, 0x34, 0x51, 0x32, 0xD0, 0xE0,
+0x6D, 0xFC, 0xB6, 0x17, 0x04, 0x8B, 0x9C, 0x8F, 0x73, 0x2B, 0x88, 0x5E, 0x33, 0x02, 0x0E, 0xB6,
+0x9D, 0xC1, 0x83, 0x31, 0x12, 0xC5, 0x7A, 0x09, 0x04, 0xAC, 0x19, 0xED, 0x4B, 0x5B, 0x08, 0x52,
+0xA0, 0x29, 0x95, 0x2F, 0x27, 0x4C, 0x43, 0xF2, 0x1E, 0x4C, 0xA0, 0xEF, 0x62, 0x1B, 0xE6, 0xAA,
+0xF3, 0x66, 0x56, 0x7F, 0x0D, 0xF1, 0xC5, 0xAA, 0xB6, 0x28, 0xDB, 0x2C, 0x42, 0x39, 0x30, 0xBE,
+0x48, 0xF1, 0xD8, 0x18, 0xAD, 0xFA, 0xFD, 0xE6, 0x0B, 0xE6, 0xD5, 0xC3, 0x97, 0xCD, 0x31, 0x6C,
+0x43, 0xA2, 0xC9, 0xE3, 0x25, 0xA9, 0xE4, 0x71, 0xFD, 0x6A, 0xFF, 0x45, 0xA8, 0x75, 0x48, 0x3D,
+0x84, 0xE3, 0xE5, 0x79, 0xAE, 0x86, 0x39, 0xF7, 0x81, 0xBA, 0x02, 0x53, 0x0A, 0x85, 0x39, 0xD1,
+0x64, 0x87, 0x44, 0xA8, 0xB0, 0x78, 0x72, 0xE5, 0xFD, 0x93, 0x21, 0xFA, 0xF5, 0x4A, 0xB8, 0xF8,
+0x32, 0x59, 0x87, 0xA8, 0xD2, 0xFB, 0x1F, 0xB8, 0xC3, 0x14, 0x41, 0xC9, 0xA1, 0x9F, 0xDA, 0x4B,
+0x2F, 0x6F, 0x30, 0xFF, 0xF1, 0xC3, 0x97, 0xCD, 0xAB, 0xAB, 0xDF, 0x32, 0xDB, 0x77, 0xB6, 0x80,
+0xCC, 0x59, 0x72, 0x74, 0x09, 0x55, 0x69, 0x76, 0xEE, 0x69, 0x31, 0xCF, 0x3C, 0xBF, 0xDA, 0xFC,
+0x00, 0xBF, 0xB7, 0x42, 0xAD, 0x2B, 0xC0, 0x7D, 0x63, 0xD1, 0xBC, 0x26, 0x21, 0x87, 0x4C, 0x4D,
+0x61, 0xDD, 0x67, 0x7A, 0x92, 0x4F, 0x3A, 0xFD, 0xDF, 0x87, 0xF2, 0x4E, 0x9C, 0xF9, 0x99, 0x19,
+0x10, 0xDE, 0x82, 0x7F, 0xDB, 0x4F, 0x7E, 0xF1, 0x1A, 0xA2, 0x15, 0xE1, 0x6F, 0xC7, 0x07, 0x28,
+0xFA, 0x7B, 0xE1, 0x42, 0xBB, 0x10, 0x91, 0x6F, 0x7C, 0xE7, 0xD7, 0xE6, 0xBB, 0x3F, 0xF9, 0x1D,
+0x9C, 0xFC, 0x5B, 0xE5, 0xD8, 0xA5, 0xBE, 0x67, 0x2F, 0xE2, 0x17, 0xCD, 0xBC, 0x8B, 0xF0, 0xF0,
+0x9F, 0x03, 0xB3, 0x5A, 0x1E, 0xEE, 0x6B, 0x6D, 0x50, 0xF8, 0x9E, 0x79, 0xE6, 0x0F, 0xE6, 0xA7,
+0xCF, 0xBE, 0x06, 0xC7, 0xF9, 0x43, 0x12, 0x4D, 0xC9, 0x8A, 0x14, 0x1D, 0x50, 0xE6, 0x5A, 0x4F,
+0x9F, 0x33, 0xAF, 0xAF, 0xDB, 0x6E, 0xBE, 0xFD, 0xBD, 0x97, 0xCC, 0x06, 0x3C, 0xBC, 0xE9, 0xC5,
+0x5D, 0x8F, 0xFE, 0x57, 0x30, 0x59, 0x2D, 0x4B, 0x1C, 0xE2, 0x7E, 0x9A, 0xB8, 0x76, 0x6A, 0x54,
+0xA7, 0x1D, 0xCC, 0x1D, 0xB2, 0x6F, 0x55, 0xAA, 0x67, 0x4B, 0x76, 0x3F, 0xD6, 0xBD, 0x22, 0xB6,
+0xC3, 0x3C, 0xAE, 0x09, 0x20, 0xD1, 0x8F, 0x3C, 0x7C, 0x97, 0x99, 0x38, 0xBE, 0x18, 0x31, 0x60,
+0x08, 0xC6, 0x41, 0x40, 0xD6, 0xEB, 0x20, 0x32, 0xFF, 0xFE, 0xFD, 0xDF, 0x9A, 0xB5, 0x1B, 0xDF,
+0x93, 0x0A, 0x20, 0x9D, 0x58, 0xCE, 0x74, 0x32, 0x5B, 0xE1, 0x9B, 0x48, 0xF5, 0xF2, 0xDB, 0xDF,
+0x7B, 0xD1, 0x3C, 0xFF, 0xCB, 0xD5, 0xA6, 0x0D, 0x91, 0x9F, 0x85, 0xF0, 0x9F, 0xBD, 0x77, 0xE9,
+0x02, 0xF4, 0x79, 0x62, 0x1F, 0x2F, 0xB4, 0xEE, 0xA5, 0x6F, 0x30, 0xDD, 0x0C, 0xD6, 0x75, 0xFD,
+0xED, 0x57, 0xA8, 0x1C, 0x18, 0x2E, 0x3C, 0x2F, 0x1F, 0x7E, 0x62, 0xA9, 0x98, 0xA1, 0x79, 0xAD,
+0x53, 0x21, 0x26, 0xA1, 0xFA, 0x16, 0xC6, 0xC7, 0x2B, 0xF0, 0xEF, 0x64, 0xB0, 0x03, 0xD3, 0xA1,
+0x5C, 0xC0, 0xD8, 0x6C, 0x96, 0xB1, 0xF9, 0xBA, 0xF9, 0x1E, 0xB0, 0xD8, 0x8B, 0xDC, 0x72, 0x1D,
+0x88, 0x1E, 0xCE, 0xC1, 0xF5, 0x37, 0x1B, 0x35, 0x62, 0x17, 0x81, 0xF8, 0x27, 0xF2, 0x27, 0xAC,
+0x40, 0xF0, 0xC4, 0x9F, 0x7F, 0xE4, 0x41, 0xF3, 0xD1, 0x27, 0xEF, 0x97, 0x52, 0x6D, 0x57, 0x40,
+0x7C, 0xD7, 0x41, 0x01, 0xFD, 0xD6, 0x77, 0x5F, 0x12, 0x7F, 0xCD, 0x13, 0x50, 0xFC, 0x38, 0xF6,
+0xA9, 0x7A, 0x32, 0x11, 0xF1, 0x1E, 0x10, 0xE9, 0x17, 0x7F, 0xB7, 0xC1, 0x7C, 0xFB, 0x3F, 0x5E,
+0x10, 0xFF, 0x46, 0x3E, 0x53, 0x67, 0xCF, 0x68, 0x10, 0x4B, 0x97, 0xF4, 0xA8, 0xDF, 0x7E, 0xDF,
+0x14, 0xA8, 0xBD, 0x6E, 0x34, 0x6A, 0x89, 0x1D, 0x8F, 0x98, 0x17, 0x34, 0x6B, 0xC4, 0x32, 0x80,
+0x42, 0xDE, 0x9C, 0xF9, 0xD4, 0xC6, 0xC3, 0x06, 0xCC, 0xC8, 0xCE, 0x20, 0x44, 0x19, 0xF8, 0x9B,
+0x11, 0xFF, 0x37, 0x7E, 0x59, 0xE4, 0xF7, 0x60, 0x5B, 0xAE, 0x13, 0x99, 0xC3, 0xE5, 0x78, 0x5B,
+0x01, 0xB1, 0x32, 0x50, 0x2C, 0x50, 0x24, 0xD3, 0xFD, 0xF5, 0x9F, 0xA3, 0x6A, 0x9E, 0x57, 0xF2,
+0xEC, 0xDF, 0x40, 0xC1, 0x0B, 0x94, 0x3B, 0xA7, 0xE0, 0xC9, 0xF7, 0xC4, 0x2A, 0x9E, 0x5D, 0x0E,
+0x05, 0x2F, 0x3A, 0x07, 0x8A, 0x1E, 0x95, 0x3A, 0x2A, 0x78, 0xB8, 0xA1, 0xB8, 0xBF, 0x56, 0xA9,
+0xB3, 0xCB, 0xA2, 0x33, 0x6F, 0x3C, 0x34, 0xE1, 0xD1, 0xDF, 0xC2, 0x2B, 0x76, 0xE1, 0x5F, 0xA8,
+0x71, 0x62, 0x82, 0xB1, 0xB3, 0x55, 0xEC, 0xC2, 0x39, 0x54, 0xEC, 0xBC, 0x6A, 0x67, 0x49, 0x14,
+0xB1, 0x67, 0x92, 0xDC, 0x69, 0x50, 0xEB, 0xA6, 0x4F, 0x9E, 0x90, 0x92, 0x7C, 0x6E, 0x72, 0xCE,
+0x71, 0xA2, 0x59, 0xC6, 0xAC, 0x9B, 0xD2, 0x38, 0x55, 0x3B, 0xA1, 0x75, 0x09, 0x1E, 0x40, 0x8E,
+0xC4, 0x58, 0xCB, 0x80, 0x25, 0x76, 0xA1, 0xA9, 0xC2, 0x6D, 0x23, 0x8B, 0xDC, 0xD3, 0x2B, 0xE6,
+0x7E, 0x11, 0x12, 0x20, 0xDB, 0x38, 0xB6, 0xC7, 0x0D, 0x9E, 0x3D, 0x1F, 0x07, 0x62, 0x35, 0xAD,
+0x8E, 0xE1, 0xF4, 0xA9, 0x09, 0x9C, 0xE0, 0xCD, 0x67, 0x0F, 0x92, 0x6F, 0x4B, 0xDA, 0x06, 0xF6,
+0x17, 0xE3, 0xC5, 0x76, 0x3A, 0xA2, 0xC6, 0xB9, 0x3E, 0x58, 0x75, 0xCD, 0xDF, 0x23, 0xA2, 0x81,
+0x15, 0x76, 0x99, 0x8F, 0xA7, 0x09, 0xD5, 0xBA, 0x80, 0xD6, 0x45, 0xDA, 0x74, 0x7D, 0x8F, 0x79,
+0xA4, 0x7B, 0x8C, 0xEC, 0xDF, 0x1B, 0x18, 0x83, 0x5D, 0x18, 0x9B, 0xD7, 0xE0, 0x5F, 0x47, 0x82,
+0x3D, 0x01, 0xCA, 0x05, 0x2B, 0x4E, 0x58, 0xD5, 0x62, 0x6C, 0x4C, 0x54, 0xD2, 0xA8, 0x7C, 0x31,
+0x30, 0x61, 0x33, 0x22, 0x41, 0xF7, 0xB4, 0xE1, 0xE1, 0x0D, 0xF5, 0x8C, 0x44, 0xE9, 0x1A, 0x08,
+0xDC, 0xBB, 0x67, 0xAE, 0x4A, 0xAA, 0x90, 0x77, 0x41, 0xBE, 0x7C, 0x4E, 0xB7, 0x76, 0x44, 0x89,
+0xD2, 0x1F, 0x6D, 0x2D, 0xA2, 0x4D, 0xD7, 0x63, 0xE6, 0x3A, 0x4C, 0xC1, 0x41, 0x57, 0x0B, 0xAA,
+0x78, 0x12, 0x51, 0x0A, 0x45, 0x8D, 0xA4, 0xCD, 0xAB, 0x7C, 0x54, 0xD6, 0x48, 0xEA, 0xD8, 0x16,
+0xB7, 0xA5, 0x92, 0x46, 0xEB, 0x42, 0xCB, 0xC5, 0xEB, 0x42, 0x10, 0x19, 0xDC, 0x70, 0xE0, 0x42,
+0xA7, 0x28, 0x81, 0x7E, 0x1B, 0x22, 0x48, 0x81, 0x6D, 0x3C, 0x7C, 0xE3, 0x16, 0x80, 0xD8, 0xDD,
+0x56, 0x92, 0x63, 0x48, 0xB2, 0x48, 0x0C, 0x79, 0xAC, 0x1B, 0xB1, 0xCD, 0x7A, 0xCC, 0x54, 0xF0,
+0xF8, 0x79, 0x03, 0x8E, 0x85, 0x9F, 0xB9, 0xFF, 0x16, 0x10, 0x54, 0x26, 0x37, 0x9E, 0x03, 0xA5,
+0x8E, 0x35, 0x66, 0xE7, 0x54, 0xE0, 0x45, 0x8F, 0xCC, 0x30, 0xC1, 0xC4, 0xD3, 0x65, 0x5F, 0xDC,
+0xA2, 0xE3, 0xC6, 0x5E, 0x25, 0xB6, 0x24, 0x93, 0x3D, 0x8E, 0x44, 0x13, 0xCF, 0x35, 0x1F, 0x68,
+0x77, 0x21, 0x00, 0x61, 0x3E, 0x0A, 0xAD, 0x67, 0xE1, 0xC5, 0x91, 0x51, 0xA2, 0x6B, 0x90, 0x4E,
+0x63, 0xD5, 0x9A, 0x77, 0xCC, 0x6A, 0x98, 0xA6, 0x56, 0xAF, 0x7E, 0xDB, 0xAC, 0x5A, 0xF5, 0x96,
+0x97, 0xF6, 0x2F, 0x6A, 0x00, 0x00, 0x35, 0x4E, 0x49, 0x44, 0x41, 0x54, 0x59, 0xC5, 0xBF, 0xAF,
+0x63, 0x19, 0xD5, 0x1F, 0x90, 0x32, 0x26, 0x0D, 0x9E, 0x83, 0x87, 0xDA, 0x9D, 0x28, 0x46, 0x4F,
+0xFF, 0x25, 0xBE, 0x68, 0xF6, 0x66, 0x5E, 0xF6, 0x51, 0x9D, 0x0B, 0x58, 0xCC, 0x1D, 0x6A, 0x11,
+0xEB, 0xD4, 0x1E, 0x85, 0x32, 0xB7, 0x0E, 0x64, 0x64, 0x15, 0x72, 0x8C, 0xAD, 0xC2, 0x7E, 0xB8,
+0xBF, 0x55, 0xAF, 0x63, 0x3F, 0xFC, 0x8B, 0x87, 0xEA, 0x56, 0xF8, 0x53, 0x75, 0xC0, 0x7F, 0x69,
+0x1A, 0xFC, 0xE8, 0x8A, 0x0A, 0xF0, 0x1C, 0xF0, 0x04, 0x36, 0xAE, 0x23, 0xBC, 0x86, 0x19, 0x31,
+0x7A, 0xF7, 0x5D, 0xB3, 0xA5, 0xD2, 0x00, 0x8F, 0x6B, 0x1B, 0xA2, 0x21, 0x49, 0x78, 0x6C, 0xDB,
+0x3C, 0x76, 0x3F, 0xDB, 0xFD, 0xAC, 0x83, 0xE2, 0x73, 0x0C, 0x0A, 0xD7, 0x78, 0x3C, 0xD8, 0x6F,
+0x9F, 0x77, 0x9B, 0xA8, 0x39, 0x7C, 0xEE, 0x90, 0xE8, 0x26, 0x0C, 0x1A, 0xF2, 0x2F, 0x89, 0x83,
+0xBA, 0x2C, 0xFC, 0x8B, 0x58, 0xA2, 0x1B, 0x5B, 0xE2, 0x86, 0xC2, 0x57, 0xDB, 0xD0, 0x42, 0x11,
+0x5D, 0xB3, 0x08, 0xEE, 0x32, 0xAC, 0x9B, 0x7A, 0x0F, 0x4A, 0x8A, 0xCD, 0x9E, 0xD9, 0x80, 0xC7,
+0x57, 0x0E, 0x22, 0x3E, 0x4F, 0x08, 0x19, 0x59, 0x2D, 0xF8, 0xF1, 0x7C, 0xBD, 0x65, 0xCF, 0x1B,
+0xFA, 0xCE, 0x94, 0x28, 0x6F, 0xE0, 0x5C, 0xEE, 0x80, 0x92, 0x45, 0x00, 0xE7, 0x20, 0x60, 0x82,
+0xE7, 0xBA, 0x02, 0xE6, 0xCD, 0xC4, 0x04, 0x56, 0x6E, 0x4A, 0xBD, 0xFB, 0x09, 0xF4, 0xD6, 0x7F,
+0x7F, 0xF3, 0x0E, 0x5E, 0xA6, 0xFB, 0x03, 0x2A, 0xE1, 0xDD, 0xBE, 0xC7, 0x46, 0x24, 0x63, 0x77,
+0x80, 0x94, 0xDD, 0x8D, 0x3E, 0x97, 0x81, 0xE4, 0x5D, 0x01, 0x49, 0x3F, 0x02, 0xC5, 0x75, 0xFD,
+0xC6, 0x66, 0x37, 0x5E, 0x5C, 0x7F, 0xFD, 0xD8, 0x44, 0x7F, 0xE9, 0xFB, 0x79, 0x16, 0xA6, 0x7E,
+0xE6, 0xFC, 0x9B, 0x0A, 0xDF, 0x3A, 0xF6, 0xB7, 0x1E, 0x39, 0x00, 0x13, 0xF9, 0x13, 0x16, 0xC0,
+0x05, 0x81, 0x6A, 0xDE, 0x8A, 0x65, 0x0B, 0xCC, 0x5D, 0x8B, 0x66, 0x98, 0xA2, 0xE2, 0x42, 0xB4,
+0xDF, 0x0A, 0x35, 0x77, 0x87, 0x6D, 0x9F, 0xE3, 0x06, 0x63, 0x9F, 0x98, 0xCA, 0x18, 0x75, 0xE3,
+0x94, 0xFB, 0xBF, 0x88, 0x17, 0x88, 0xC6, 0x86, 0x1A, 0xBC, 0xD4, 0x4C, 0x15, 0xBF, 0xE4, 0x40,
+0x7A, 0x4F, 0xE1, 0xED, 0x73, 0x54, 0x13, 0x3B, 0x9E, 0x4D, 0x2A, 0x38, 0x94, 0x3C, 0xF9, 0x57,
+0xC6, 0x06, 0x4D, 0x84, 0x49, 0xFD, 0x17, 0x88, 0x1F, 0x4E, 0x04, 0xF1, 0x7E, 0x6F, 0xF6, 0xED,
+0x37, 0x66, 0xEE, 0xEB, 0x38, 0x62, 0xD6, 0xF5, 0x6D, 0xDA, 0xED, 0xA3, 0xBE, 0x53, 0xD1, 0xEF,
+0x3D, 0xFC, 0xAA, 0x82, 0x36, 0xAC, 0x3F, 0x9C, 0xFF, 0x27, 0x06, 0xA5, 0xF8, 0x63, 0x91, 0xEF,
+0x09, 0x8E, 0xD1, 0xAD, 0xE7, 0xF7, 0xE9, 0xB7, 0x8B, 0xF1, 0xDF, 0x0A, 0x8E, 0xC9, 0x12, 0x2B,
+0x9A, 0x86, 0xE8, 0xDB, 0x98, 0x87, 0xB7, 0x8D, 0x87, 0x30, 0xB8, 0xAB, 0x19, 0xFA, 0x4D, 0x7F,
+0xB7, 0x14, 0x4C, 0x3C, 0xCF, 0x97, 0xF1, 0x74, 0x14, 0xA7, 0x7D, 0xE7, 0x6B, 0x66, 0x55, 0x07,
+0x3F, 0xF3, 0xEA, 0xB0, 0x6A, 0x53, 0xA0, 0xCE, 0x39, 0xE2, 0x13, 0x8F, 0x89, 0x75, 0xEB, 0xE1,
+0x80, 0xB1, 0x3E, 0x67, 0x01, 0xF9, 0x23, 0x69, 0x8A, 0x46, 0xCF, 0x72, 0x7B, 0x17, 0x96, 0xCE,
+0x07, 0xCD, 0xEC, 0x29, 0xB5, 0x08, 0x9C, 0x48, 0x14, 0x15, 0x36, 0xFC, 0x00, 0x30, 0x22, 0xB6,
+0xB9, 0x05, 0x4E, 0xB9, 0x54, 0x8D, 0x18, 0x85, 0x3A, 0x8E, 0xFB, 0x65, 0xFF, 0xEC, 0xEC, 0x9C,
+0xE3, 0xAC, 0xB2, 0xE6, 0x94, 0xB9, 0x58, 0x35, 0xCF, 0xDA, 0xCC, 0xAD, 0xDF, 0xA1, 0xDB, 0x2E,
+0x4A, 0x66, 0x1D, 0x71, 0xB5, 0x35, 0x76, 0x89, 0x99, 0xEB, 0x7B, 0x14, 0x53, 0x67, 0xB4, 0xF6,
+0x95, 0x2D, 0xBA, 0x40, 0x6E, 0x3B, 0xB1, 0xF2, 0x55, 0xA7, 0xB2, 0x4C, 0xAD, 0x28, 0x14, 0x3F,
+0xA5, 0xB1, 0xE4, 0x5F, 0x47, 0x7F, 0xB4, 0x5D, 0x50, 0xB9, 0xD6, 0xC0, 0x1F, 0xED, 0x8D, 0xE3,
+0x57, 0x45, 0x99, 0x6B, 0x75, 0x4A, 0xDB, 0x55, 0x30, 0xAC, 0x8D, 0x27, 0x3B, 0xCC, 0x6A, 0xA8,
+0x5F, 0x9B, 0x4E, 0x5D, 0x81, 0x22, 0x66, 0x19, 0x33, 0x4D, 0xAC, 0x24, 0x63, 0x7F, 0x38, 0xDC,
+0x6E, 0x56, 0xE1, 0xB7, 0x0D, 0x58, 0x87, 0x04, 0x91, 0xE6, 0xCA, 0x16, 0x90, 0xB9, 0x35, 0x88,
+0x44, 0x5D, 0x83, 0xE5, 0x54, 0xFF, 0x7C, 0x42, 0x60, 0x06, 0x2F, 0x90, 0x74, 0xAD, 0x3E, 0x0A,
+0x02, 0x89, 0x6D, 0xAF, 0xE2, 0x3C, 0x72, 0xFD, 0x83, 0x58, 0x87, 0x91, 0xAB, 0x6B, 0x31, 0x33,
+0x38, 0x82, 0xE6, 0xE0, 0x78, 0x7F, 0x36, 0x2A, 0xA1, 0xF3, 0x40, 0xCC, 0x1E, 0xA8, 0x45, 0x4D,
+0x62, 0x90, 0x35, 0x9E, 0x9B, 0x0E, 0xEC, 0x6F, 0x27, 0xD6, 0x7F, 0x76, 0xFF, 0x25, 0xF3, 0x8D,
+0xED, 0x6D, 0xE6, 0xFF, 0x6E, 0x3B, 0x67, 0xFE, 0x7D, 0x47, 0x9B, 0xF9, 0xFD, 0xA1, 0x76, 0x98,
+0x7B, 0xAD, 0x79, 0xB6, 0x0E, 0x4A, 0xDF, 0x47, 0x9A, 0x8A, 0xCC, 0x87, 0xA6, 0x22, 0xF0, 0x00,
+0x3E, 0x76, 0xBD, 0x3D, 0x2F, 0x18, 0xA4, 0x51, 0x06, 0xF2, 0x58, 0x8A, 0xD9, 0x5F, 0xBD, 0xFE,
+0x5D, 0x87, 0xDF, 0xE9, 0x9F, 0xD7, 0x57, 0x19, 0xB2, 0x6C, 0x28, 0x6D, 0xB3, 0x40, 0x12, 0x3E,
+0xF0, 0xC1, 0x95, 0x52, 0xBA, 0x89, 0x41, 0x08, 0x74, 0x24, 0x7F, 0x03, 0x04, 0xEE, 0x17, 0xBF,
+0x58, 0x65, 0xFE, 0xED, 0xEB, 0xCF, 0x99, 0xAF, 0x7C, 0xF5, 0x07, 0xE6, 0x7F, 0xFF, 0xD3, 0xD3,
+0xE6, 0x67, 0x3F, 0xFB, 0xA3, 0xD9, 0xB5, 0xEB, 0xB0, 0xDC, 0x3B, 0x4A, 0xE1, 0xEB, 0xF5, 0xF8,
+0xE3, 0xF7, 0x9A, 0x25, 0x77, 0xCF, 0x36, 0xF5, 0x78, 0x29, 0x14, 0x33, 0xB1, 0xE4, 0xC2, 0xB4,
+0x6E, 0x10, 0x89, 0xA6, 0xFA, 0xBA, 0x2A, 0xF3, 0x91, 0xF7, 0x2F, 0x97, 0x54, 0x16, 0x2C, 0x2D,
+0x76, 0x1C, 0xE4, 0xEE, 0xF9, 0x5F, 0xAE, 0x41, 0xDB, 0x3F, 0x35, 0xFF, 0xF3, 0xCB, 0x3F, 0x30,
+0xFF, 0xF2, 0xB5, 0x67, 0xCC, 0xCB, 0x50, 0x0C, 0x4F, 0x21, 0x52, 0xB5, 0x1B, 0xAA, 0x5E, 0x19,
+0x1E, 0xEC, 0x8F, 0xC2, 0x07, 0x90, 0xE5, 0xAF, 0xE8, 0xC7, 0xDC, 0x1B, 0x73, 0x64, 0x84, 0xEC,
+0xFD, 0x2B, 0x16, 0x8A, 0xF2, 0x58, 0x00, 0xB3, 0x2A, 0xCF, 0x1B, 0x2B, 0x2B, 0xFC, 0x1C, 0x8A,
+0xE0, 0x3F, 0xA1, 0xED, 0x2F, 0x7F, 0xF9, 0xFB, 0xE6, 0xAB, 0x5F, 0xFD, 0xA1, 0xF9, 0xE6, 0xB7,
+0x9E, 0x37, 0xAF, 0xAD, 0xDA, 0x2A, 0x65, 0xA4, 0x88, 0x49, 0x13, 0x08, 0xE9, 0x7D, 0x28, 0x26,
+0x2F, 0x6A, 0x0E, 0x8E, 0x9B, 0x2F, 0xCE, 0x3D, 0x88, 0x5D, 0x84, 0xB4, 0xF4, 0x46, 0x5C, 0x7B,
+0xBD, 0x63, 0x44, 0xEE, 0xD5, 0x03, 0xB9, 0xAB, 0xF4, 0xF4, 0xBD, 0x8E, 0xDD, 0x8A, 0x6E, 0x23,
+0x53, 0x61, 0x4A, 0xFD, 0xF8, 0x5F, 0x3E, 0x62, 0x3E, 0xFA, 0xD1, 0x07, 0x45, 0xC1, 0xE3, 0x36,
+0x54, 0xE8, 0x7E, 0xFF, 0x87, 0xCD, 0x38, 0x57, 0xCF, 0x9A, 0x2F, 0x7F, 0xE5, 0x47, 0xE6, 0x6B,
+0xFF, 0xE7, 0xE7, 0xE6, 0x85, 0x5F, 0xAF, 0x35, 0xBB, 0xE1, 0x03, 0x76, 0x0E, 0xD6, 0x30, 0x8E,
+0x49, 0xFA, 0x94, 0x3D, 0xFE, 0xC4, 0x32, 0xB3, 0x00, 0xEA, 0x2A, 0xCD, 0x90, 0x3D, 0x27, 0x77,
+0xEF, 0x94, 0x4E, 0xFA, 0x4A, 0x1F, 0x03, 0x39, 0xEA, 0xB8, 0x17, 0xEC, 0xFE, 0x36, 0x09, 0xEE,
+0x5B, 0x03, 0x23, 0x90, 0x54, 0xD5, 0xFE, 0xE2, 0x23, 0xF7, 0x9B, 0xE9, 0x53, 0x27, 0x21, 0x93,
+0x01, 0x1A, 0xC7, 0xB8, 0xB8, 0x82, 0x8A, 0x27, 0xEB, 0x61, 0x4A, 0xFF, 0x7F, 0xDF, 0xF9, 0x0D,
+0xCE, 0xEB, 0x8F, 0xCD, 0x3F, 0xFF, 0xF3, 0xD3, 0x50, 0x69, 0x31, 0x36, 0xA1, 0xDA, 0x75, 0xD2,
+0xDF, 0x13, 0xEB, 0x8C, 0x07, 0x59, 0x5F, 0x8E, 0x31, 0xF1, 0xC0, 0x8A, 0x05, 0x30, 0x5D, 0x27,
+0x36, 0x3B, 0xD3, 0xE7, 0x8E, 0xB5, 0x63, 0xA7, 0xC3, 0x5A, 0xF5, 0xE7, 0x7F, 0x76, 0xBF, 0x99,
+0xD2, 0x30, 0x11, 0xD7, 0x10, 0x02, 0x30, 0x2E, 0x5C, 0x12, 0x72, 0xFC, 0xAD, 0x6F, 0xFD, 0xCA,
+0x7C, 0xE5, 0x2B, 0x76, 0xEC, 0x7C, 0xFD, 0x1B, 0xCF, 0x99, 0x9F, 0x3C, 0xFD, 0x07, 0x09, 0xB0,
+0xB8, 0x02, 0x35, 0xB0, 0x10, 0x18, 0x2E, 0x83, 0x02, 0xBD, 0xE4, 0x8E, 0x59, 0xA2, 0x5C, 0x33,
+0x4A, 0x23, 0xAA, 0x9C, 0xF7, 0x07, 0xC3, 0x70, 0xFC, 0x9E, 0x9A, 0xA7, 0xF5, 0x4D, 0x1E, 0x29,
+0xDF, 0x1C, 0x4A, 0x01, 0x7C, 0x15, 0xEA, 0xB9, 0xF1, 0x62, 0xF3, 0x8A, 0x53, 0x54, 0x7D, 0x8A,
+0x55, 0x9C, 0x42, 0x65, 0xAA, 0xB7, 0xE5, 0x54, 0xAB, 0xE2, 0xDB, 0x89, 0x2A, 0x59, 0x3D, 0xB7,
+0xB3, 0x6F, 0xB5, 0x7E, 0xBB, 0x7E, 0xF7, 0x87, 0xDB, 0x6C, 0xEF, 0xEB, 0x44, 0x7D, 0xDA, 0xFA,
+0x3F, 0xD6, 0x1E, 0x6A, 0x9A, 0xF8, 0x7A, 0xB8, 0x19, 0x98, 0x4A, 0xA4, 0x9F, 0xCC, 0xF1, 0xFE,
+0x72, 0x03, 0x68, 0x9B, 0xDB, 0xB1, 0xAD, 0x48, 0x3B, 0x92, 0x90, 0x16, 0x0B, 0x8B, 0x60, 0xFA,
+0x6D, 0x98, 0x50, 0x6E, 0xEE, 0x44, 0xA2, 0xC6, 0x3B, 0x30, 0x97, 0xC0, 0xE7, 0x22, 0x15, 0x29,
+0x2E, 0xC4, 0xFC, 0x8E, 0xB7, 0xEA, 0x4E, 0x3C, 0x68, 0x79, 0x61, 0x79, 0x87, 0xD6, 0x58, 0x9E,
+0x12, 0x3E, 0x1A, 0x7C, 0x04, 0xA7, 0x25, 0x36, 0xD6, 0xAF, 0xCC, 0xFF, 0xF3, 0x44, 0xD0, 0x3F,
+0xC8, 0x64, 0x2B, 0xAE, 0x67, 0x3F, 0xB8, 0xD9, 0xA9, 0x5F, 0x12, 0xE0, 0x62, 0x15, 0xB3, 0xE2,
+0xA2, 0x42, 0x53, 0x37, 0x11, 0x25, 0x6B, 0x52, 0x10, 0x2C, 0xC2, 0xFE, 0x5E, 0x82, 0xF2, 0x70,
+0x18, 0xBE, 0x44, 0xE4, 0x16, 0x34, 0xC3, 0x7A, 0xBF, 0x42, 0xDF, 0x1F, 0x1E, 0x6B, 0x4F, 0x7F,
+0x39, 0xDB, 0x17, 0xFB, 0x30, 0xEB, 0xF9, 0x86, 0x1B, 0xDE, 0x44, 0xAC, 0xC9, 0x2E, 0xBA, 0xBD,
+0xBD, 0x14, 0xB9, 0xAD, 0xF5, 0x43, 0xF4, 0x0F, 0xC4, 0xB0, 0xA5, 0x0C, 0xA8, 0x75, 0x78, 0x00,
+0x62, 0xAB, 0x4E, 0x57, 0xB3, 0xB6, 0xC9, 0x05, 0x4E, 0xDC, 0xE4, 0x65, 0x3C, 0x22, 0x9B, 0x91,
+0x93, 0x9E, 0x83, 0x7F, 0xD9, 0x31, 0x28, 0x6D, 0x9C, 0xF9, 0x99, 0xB9, 0xE2, 0x88, 0x2B, 0xC9,
+0x11, 0xA3, 0x4B, 0xB9, 0xFC, 0x14, 0x4C, 0xAC, 0x9E, 0x70, 0x51, 0x51, 0x23, 0x01, 0x3B, 0x82,
+0xE5, 0x54, 0xE5, 0xE8, 0x9F, 0xC7, 0x75, 0x49, 0x88, 0x99, 0x3A, 0xE4, 0x38, 0xA2, 0x50, 0xA9,
+0xDC, 0x31, 0xAA, 0xD4, 0xFB, 0xBF, 0x91, 0x40, 0x92, 0x30, 0x1E, 0xC5, 0x72, 0xAF, 0x08, 0xB2,
+0xC3, 0x54, 0xF2, 0x64, 0xDF, 0xD8, 0x0F, 0xCD, 0xB0, 0xDC, 0x77, 0x7C, 0x42, 0x13, 0x12, 0xAF,
+0x6A, 0x54, 0xA0, 0x58, 0x0C, 0xE5, 0x6D, 0x51, 0x65, 0xAE, 0x99, 0x5A, 0x9A, 0x6D, 0xC6, 0x83,
+0x6C, 0xD1, 0xF7, 0x8D, 0xE6, 0xE3, 0x4D, 0x50, 0x07, 0xA9, 0x38, 0x52, 0xA9, 0xDB, 0x0F, 0xD5,
+0x8F, 0x7E, 0xB2, 0xD3, 0xCA, 0xB3, 0xB1, 0x7E, 0xAE, 0xB9, 0x13, 0x81, 0x17, 0x33, 0xCB, 0x91,
+0x82, 0xA6, 0x17, 0xB5, 0x8E, 0xC7, 0x90, 0x8F, 0x1D, 0xCC, 0x28, 0xCB, 0x91, 0x99, 0xA6, 0x21,
+0x92, 0x1A, 0xF6, 0x95, 0x18, 0xD4, 0x15, 0x8D, 0x13, 0x1F, 0xBD, 0xDE, 0x14, 0x3B, 0x6E, 0x4F,
+0xD5, 0xBF, 0x0A, 0xF7, 0x81, 0x25, 0x50, 0x81, 0x96, 0x2D, 0x99, 0x63, 0xA6, 0xE1, 0x21, 0xC7,
+0xFB, 0x00, 0x95, 0x8B, 0x1D, 0x3B, 0xF6, 0x9B, 0x8D, 0x50, 0x27, 0xD6, 0xC0, 0x67, 0xE9, 0x4D,
+0xF8, 0x15, 0x6D, 0x67, 0x14, 0x2C, 0x1C, 0xF0, 0x6B, 0x61, 0xBE, 0xBC, 0x17, 0xEB, 0x53, 0x39,
+0xAA, 0x03, 0xA9, 0x2B, 0x86, 0x09, 0x5F, 0x6A, 0x0B, 0x63, 0x3B, 0x79, 0xB1, 0xE8, 0x65, 0x34,
+0x30, 0x00, 0xE0, 0x2E, 0x28, 0x7C, 0x2C, 0x62, 0xDF, 0xD0, 0x50, 0x2D, 0x49, 0x8A, 0x77, 0xC2,
+0x0F, 0x6C, 0x1D, 0xCC, 0xA3, 0x54, 0x98, 0x18, 0x08, 0xB0, 0x7F, 0xFF, 0x11, 0x39, 0x79, 0xD5,
+0xF0, 0xDB, 0x5B, 0xBC, 0xA0, 0xC9, 0xDC, 0xB1, 0x70, 0xBA, 0x04, 0x49, 0xD8, 0x6B, 0x25, 0x71,
+0xCB, 0x2C, 0x41, 0xC5, 0x9C, 0x7C, 0xCB, 0x96, 0xCE, 0xC7, 0x71, 0xCD, 0x36, 0xB5, 0x20, 0x90,
+0x4C, 0x67, 0xF2, 0x1E, 0xA3, 0x23, 0x71, 0xDC, 0xAF, 0x43, 0x7D, 0x21, 0x51, 0xDD, 0xBC, 0x69,
+0xA7, 0x39, 0x04, 0x85, 0x8B, 0x11, 0x97, 0xF3, 0x11, 0x61, 0xBA, 0x14, 0xFD, 0x9D, 0x81, 0x7B,
+0x9F, 0x4F, 0x14, 0xCE, 0xFB, 0x41, 0x0F, 0x25, 0xCB, 0xEE, 0x38, 0x7C, 0xC3, 0x1C, 0xE8, 0x48,
+0xA7, 0x5F, 0xA0, 0xE0, 0x31, 0xF0, 0xD4, 0x41, 0x72, 0xAF, 0x96, 0x44, 0x01, 0xD6, 0x02, 0x13,
+0x2F, 0x9E, 0x73, 0x19, 0xC9, 0xF7, 0x62, 0xA8, 0x4B, 0x2B, 0x97, 0x2F, 0xC0, 0xF9, 0x9A, 0x0B,
+0x52, 0x52, 0x87, 0xDB, 0x49, 0x86, 0xD9, 0x0F, 0x33, 0xE1, 0x46, 0x90, 0x1D, 0x9E, 0xAB, 0xF5,
+0x50, 0x9C, 0x76, 0x21, 0x5F, 0x1D, 0xAB, 0x54, 0x8C, 0x83, 0x9A, 0xD4, 0x08, 0xE5, 0x8A, 0x7D,
+0xBD, 0x17, 0xEB, 0xB3, 0x54, 0x57, 0x6F, 0x7E, 0xC5, 0xD6, 0xC5, 0x90, 0x27, 0x70, 0x70, 0x94,
+0x21, 0x84, 0xC7, 0x9D, 0xFC, 0xBE, 0x54, 0xAB, 0xD0, 0x8F, 0xC6, 0xEE, 0xAB, 0x9F, 0x89, 0x7E,
+0xA0, 0x77, 0x62, 0x0C, 0xBC, 0xEF, 0x9E, 0x79, 0x56, 0x1D, 0x9E, 0x51, 0x67, 0x8A, 0xF0, 0x52,
+0x71, 0x14, 0xB9, 0xF8, 0xB6, 0xC2, 0x4F, 0x93, 0xFD, 0xE5, 0x39, 0xE6, 0xD8, 0x64, 0x50, 0x43,
+0xCD, 0xA4, 0x4A, 0x19, 0x63, 0x2B, 0x30, 0x16, 0x96, 0x2D, 0x9D, 0x87, 0x71, 0x51, 0x2B, 0xE4,
+0x2D, 0xD1, 0xC4, 0xDD, 0x33, 0x81, 0x76, 0x25, 0x14, 0x4C, 0xAA, 0x82, 0xEF, 0xBB, 0x67, 0xAE,
+0xA8, 0x9A, 0x4C, 0xDE, 0x7D, 0x18, 0x3E, 0x76, 0x24, 0x71, 0xF4, 0x4F, 0xE4, 0xD8, 0xD9, 0x08,
+0x75, 0xF9, 0x5D, 0xF8, 0xED, 0x9D, 0xC4, 0x4B, 0x07, 0x09, 0xF5, 0x12, 0x28, 0x81, 0xF7, 0xE2,
+0x98, 0x48, 0x06, 0xA9, 0x06, 0xDA, 0x6E, 0x45, 0x4A, 0x44, 0xF6, 0xD7, 0xB1, 0x61, 0xF8, 0x7D,
+0x70, 0x67, 0x69, 0x18, 0x76, 0x38, 0x90, 0x26, 0xF8, 0x60, 0xE2, 0xA0, 0xCF, 0x81, 0x89, 0xB2,
+0x61, 0x62, 0xB9, 0x99, 0x8F, 0x0B, 0x9D, 0x64, 0x23, 0x1B, 0xCB, 0x74, 0x4E, 0x1E, 0x06, 0xF4,
+0x3B, 0x28, 0x84, 0xC9, 0xA5, 0x16, 0xB5, 0x16, 0x1F, 0x9C, 0x3F, 0xCD, 0x7C, 0x1A, 0x3E, 0x1B,
+0xD3, 0x91, 0x2E, 0x20, 0x15, 0x41, 0x04, 0x1C, 0x17, 0x12, 0x38, 0x01, 0x05, 0x8B, 0x0F, 0x65,
+0x9A, 0x9C, 0xA5, 0x02, 0x83, 0xBB, 0x9F, 0x58, 0x3E, 0x12, 0x2A, 0x52, 0x12, 0xFD, 0xC9, 0x5F,
+0x23, 0xEA, 0x9B, 0x0F, 0x12, 0xB0, 0x8A, 0x96, 0x6C, 0x10, 0x28, 0x5F, 0x41, 0xBE, 0x3A, 0x4F,
+0x01, 0x7D, 0xA5, 0x11, 0x21, 0x39, 0xEE, 0x41, 0x8D, 0x80, 0x96, 0x8A, 0xD2, 0x52, 0x51, 0x1C,
+0x52, 0x51, 0xE8, 0x9E, 0xE6, 0x6E, 0x46, 0xA3, 0x9D, 0x63, 0x2D, 0x42, 0xDE, 0xE4, 0xC5, 0xBF,
+0xCE, 0x89, 0x74, 0xAE, 0x0F, 0x3E, 0xE0, 0xC3, 0x8A, 0x75, 0xA1, 0x2A, 0x17, 0xC8, 0x95, 0xC4,
+0x21, 0xF2, 0xF6, 0x6F, 0x73, 0x23, 0xF2, 0x4E, 0x62, 0xDF, 0xB2, 0x6D, 0x44, 0x6C, 0x5C, 0x04,
+0xB1, 0xAF, 0x48, 0xE2, 0x1F, 0x2C, 0xD2, 0x06, 0x67, 0x56, 0x73, 0xC1, 0x0B, 0x26, 0x54, 0xC3,
+0x6B, 0xA0, 0xFC, 0x34, 0x59, 0x52, 0x6D, 0x99, 0x59, 0x55, 0x6C, 0x4D, 0x0A, 0x63, 0x68, 0x22,
+0x04, 0x34, 0x51, 0x92, 0xF8, 0xE4, 0xD3, 0x87, 0x54, 0x7C, 0x47, 0x9D, 0x0B, 0x02, 0x3E, 0xE7,
+0x61, 0x19, 0x97, 0xE7, 0xE3, 0x77, 0x4F, 0x6E, 0xF8, 0x97, 0xCB, 0x8A, 0x30, 0x17, 0x72, 0x3B,
+0x06, 0x1C, 0x61, 0xE6, 0x4B, 0x1D, 0x5F, 0x2C, 0x99, 0x77, 0x8E, 0xEB, 0xF3, 0xB3, 0x7F, 0xEE,
+0xD0, 0x17, 0x95, 0x26, 0x4D, 0x2E, 0x67, 0x9B, 0xD1, 0xF5, 0xFD, 0x3E, 0x88, 0x21, 0xF9, 0x57,
+0xA2, 0x47, 0x95, 0xA8, 0x43, 0x20, 0x74, 0x1F, 0x9D, 0x56, 0x6C, 0x1E, 0xAE, 0x2B, 0x34, 0xF3,
+0x60, 0x62, 0xA5, 0xC2, 0x46, 0x12, 0x48, 0xF5, 0x9C, 0xC1, 0x2B, 0x1C, 0xCA, 0x7C, 0xA8, 0x93,
+0x8C, 0x3D, 0xD6, 0x50, 0x64, 0x1E, 0x6D, 0x28, 0x44, 0x49, 0xB2, 0xFE, 0xA3, 0xD4, 0x8B, 0xA1,
+0x02, 0xAE, 0x84, 0x1A, 0xB8, 0x62, 0x72, 0x01, 0x70, 0xC8, 0x84, 0xDF, 0x15, 0xDC, 0x1C, 0x40,
+0x30, 0x29, 0xBE, 0xDF, 0x3D, 0x31, 0x5F, 0x7C, 0xF3, 0xFA, 0x7B, 0x7C, 0xD2, 0x04, 0xD9, 0x88,
+0x07, 0xD4, 0x67, 0x3E, 0xF9, 0xA8, 0x79, 0xEC, 0xD1, 0x7B, 0xC4, 0xE1, 0x5C, 0x92, 0xB4, 0xB0,
+0xA4, 0x23, 0xFF, 0xB2, 0x31, 0x19, 0x6E, 0xDD, 0xA6, 0x10, 0x4A, 0xC8, 0xFB, 0xDE, 0x37, 0xDF,
+0xFC, 0xA7, 0x4F, 0x3F, 0x6E, 0x9A, 0x40, 0xA6, 0x38, 0x30, 0x59, 0x67, 0x96, 0xD1, 0xED, 0x19,
+0xD8, 0xBF, 0x4D, 0xF4, 0x9B, 0x78, 0x10, 0xF1, 0x37, 0x92, 0xC8, 0x4F, 0xFE, 0xC5, 0xC3, 0xE6,
+0xFE, 0xFB, 0x16, 0x8A, 0xBF, 0x5D, 0x86, 0xA8, 0xE8, 0xE1, 0x0B, 0x0C, 0x7B, 0x4C, 0x9F, 0xAA,
+0x05, 0x88, 0x64, 0xFC, 0xB3, 0xA7, 0x1E, 0x34, 0x53, 0x40, 0x4A, 0xB2, 0xD0, 0x6E, 0x26, 0x03,
+0xCD, 0x7C, 0xFB, 0x09, 0x9A, 0xA7, 0x0A, 0x45, 0x73, 0xDA, 0xDF, 0x7C, 0xF6, 0x03, 0x66, 0x39,
+0x48, 0x0F, 0xCD, 0xAB, 0x99, 0x9E, 0xB1, 0xF3, 0xF8, 0x5D, 0x4A, 0x16, 0x3E, 0xE2, 0x9B, 0xA0,
+0xFE, 0x3C, 0x85, 0xB6, 0x3F, 0xF0, 0xD8, 0x52, 0x09, 0x44, 0x60, 0xB0, 0x01, 0xFB, 0x41, 0xB3,
+0x2E, 0xB1, 0xF0, 0x93, 0xBD, 0x2F, 0xE1, 0x7F, 0x2E, 0xE3, 0xC3, 0xBB, 0x2F, 0x86, 0x1C, 0x3D,
+0x26, 0x6E, 0x43, 0xF5, 0x0F, 0x63, 0x85, 0xA4, 0xCB, 0x06, 0x7F, 0xF4, 0x3D, 0xC9, 0x6E, 0x30,
+0x80, 0x24, 0xA0, 0x0E, 0xFD, 0x24, 0xE1, 0x48, 0xC4, 0x7B, 0xD8, 0x16, 0x55, 0x49, 0x56, 0xA2,
+0xF8, 0xF4, 0xC7, 0x1E, 0x31, 0x8F, 0x3F, 0x76, 0x8F, 0xA9, 0xAA, 0x82, 0xAF, 0xB8, 0xBB, 0xAE,
+0xC5, 0x71, 0x9A, 0xBB, 0x67, 0xE4, 0x3F, 0xF2, 0xFB, 0x4D, 0x9A, 0x54, 0x61, 0x1E, 0x7A, 0xE8,
+0x0E, 0xF3, 0x59, 0x9C, 0xAF, 0xE9, 0x4D, 0x75, 0xD6, 0x5F, 0x31, 0xC1, 0x24, 0x47, 0x48, 0x8C,
+0x78, 0x0F, 0x10, 0xA2, 0x32, 0x08, 0xDA, 0x20, 0xDD, 0xC5, 0xF1, 0xCA, 0xB6, 0x3C, 0x83, 0xBD,
+0xF7, 0x56, 0xF0, 0x64, 0x98, 0x38, 0x48, 0xF4, 0x40, 0x85, 0x04, 0x46, 0xF0, 0x7E, 0xE4, 0x03,
+0xCB, 0xCD, 0x5F, 0x7F, 0xEA, 0x71, 0xF3, 0xA1, 0x0F, 0xAE, 0x90, 0xAA, 0x14, 0x42, 0xD5, 0x78,
+0x1F, 0x74, 0xFD, 0xE5, 0xCB, 0x00, 0x95, 0xD7, 0x7B, 0x40, 0x5E, 0x3F, 0xFF, 0x77, 0x1F, 0xC6,
+0xFC, 0x21, 0x73, 0x0F, 0xCC, 0xF3, 0x0C, 0xD6, 0xE9, 0x6F, 0xE2, 0x71, 0x58, 0x7F, 0xBB, 0xFB,
+0xCD, 0x93, 0x4F, 0xDE, 0x87, 0x6B, 0xA1, 0xDA, 0xC8, 0x95, 0xC7, 0xF6, 0x89, 0x09, 0x67, 0x8E,
+0x25, 0x60, 0xCA, 0x71, 0xB6, 0x18, 0x44, 0xF3, 0x33, 0x7F, 0xFD, 0x04, 0xDA, 0x9F, 0x25, 0x24,
+0x90, 0xE3, 0x23, 0x13, 0xE7, 0xCB, 0x8E, 0x9D, 0xFE, 0xCE, 0x74, 0x7F, 0x47, 0x33, 0xF0, 0xDF,
+0xB3, 0xBE, 0x84, 0x69, 0xE0, 0xAB, 0xA7, 0x6E, 0x4D, 0xFF, 0x36, 0xC3, 0xB7, 0xC6, 0x8B, 0xF0,
+0xB3, 0xE3, 0xCD, 0xAD, 0x06, 0xB6, 0xF4, 0x5A, 0x44, 0x3A, 0xE9, 0x9C, 0x24, 0x0C, 0xF0, 0xB6,
+0x31, 0x05, 0x37, 0xEE, 0x59, 0xF0, 0x3B, 0xB8, 0x17, 0x26, 0x98, 0xA5, 0x78, 0x73, 0x25, 0xC9,
+0x19, 0xE8, 0x45, 0x36, 0xD4, 0xD1, 0xC1, 0xBC, 0x4A, 0x7B, 0xF0, 0xB6, 0xF5, 0xD2, 0xE6, 0x66,
+0x38, 0x51, 0x23, 0xEF, 0x16, 0x7D, 0x73, 0x24, 0x9F, 0x9D, 0xBD, 0x20, 0xE4, 0x1E, 0x2F, 0x4C,
+0xC7, 0x06, 0x17, 0xD8, 0x0B, 0x85, 0x44, 0xC6, 0xBD, 0xB1, 0x07, 0x6A, 0x9C, 0x8B, 0x94, 0x23,
+0xB9, 0x71, 0xEF, 0xF2, 0x9E, 0xF0, 0xB8, 0x2D, 0x7C, 0x2E, 0x5E, 0x7B, 0xA9, 0xE1, 0x01, 0xD2,
+0x8D, 0x54, 0x23, 0x34, 0x37, 0xDF, 0x35, 0x7D, 0x8A, 0x79, 0xE4, 0x8E, 0xD9, 0xA6, 0x04, 0x37,
+0xF5, 0x64, 0x4F, 0x57, 0xE0, 0x78, 0xBB, 0x69, 0xE7, 0x01, 0xF3, 0xDB, 0x8D, 0x3B, 0xC4, 0x21,
+0x3E, 0x13, 0x81, 0x36, 0x19, 0x08, 0x5A, 0x70, 0x4F, 0xCA, 0xF0, 0x46, 0xE0, 0xC9, 0x9A, 0xFB,
+0xEB, 0x7B, 0x2E, 0xC7, 0xE7, 0x08, 0x6E, 0x70, 0xCB, 0x20, 0x91, 0x73, 0x37, 0x10, 0x79, 0xF8,
+0x38, 0x75, 0xCE, 0xD1, 0xE0, 0x50, 0xD9, 0x70, 0x1B, 0x78, 0x25, 0xD3, 0x49, 0x0F, 0xA2, 0x18,
+0x5E, 0x47, 0x40, 0xD0, 0x35, 0xFA, 0x7A, 0x62, 0xFB, 0x29, 0x48, 0x52, 0xFB, 0x89, 0x45, 0x75,
+0x66, 0x42, 0xB1, 0x35, 0x59, 0xA4, 0x6A, 0x2C, 0x0C, 0x15, 0x7B, 0x2A, 0xA0, 0xA7, 0x90, 0xA7,
+0x8D, 0x90, 0xD5, 0x14, 0xA2, 0xF6, 0x29, 0xA2, 0x4F, 0xFD, 0x5C, 0xC3, 0xCF, 0x30, 0x67, 0xD6,
+0x82, 0x28, 0x35, 0x41, 0xCD, 0x22, 0xC9, 0xA1, 0x29, 0x94, 0xBE, 0x76, 0x54, 0xD8, 0x0A, 0xF1,
+0xB9, 0xB1, 0x38, 0x47, 0xD6, 0x99, 0x84, 0x75, 0xFD, 0xCC, 0x60, 0x87, 0x7A, 0x54, 0x8C, 0x58,
+0x28, 0x7E, 0x71, 0xD9, 0xA2, 0x82, 0x51, 0x5D, 0xA3, 0xCA, 0x57, 0x06, 0xF5, 0x8B, 0xBF, 0xFB,
+0x75, 0x65, 0x5F, 0x6E, 0xFD, 0xB9, 0x30, 0xB7, 0xD6, 0xE3, 0x33, 0x73, 0xD7, 0x65, 0xF3, 0x61,
+0x13, 0x99, 0x38, 0xB4, 0xA9, 0xAC, 0x51, 0xA9, 0x23, 0x29, 0xE4, 0x67, 0xAE, 0xC3, 0xE3, 0xA9,
+0x44, 0x9B, 0xDC, 0x66, 0x12, 0x8E, 0xBF, 0xB1, 0x34, 0x07, 0x81, 0x16, 0xB9, 0x66, 0xF9, 0xA4,
+0x7C, 0x28, 0x75, 0xB9, 0x42, 0x24, 0xFB, 0x9B, 0x48, 0x48, 0x4B, 0x91, 0x56, 0x85, 0xD1, 0xF2,
+0x3C, 0x46, 0x8E, 0x81, 0xF2, 0xBC, 0x4C, 0x33, 0xBD, 0x2C, 0xD7, 0x3C, 0x5C, 0x5F, 0x68, 0x1A,
+0xD0, 0x87, 0x44, 0xF9, 0xEF, 0x62, 0x8F, 0x0F, 0xC7, 0x84, 0x07, 0xE0, 0x84, 0xCA, 0x52, 0xB9,
+0x96, 0xE8, 0x80, 0x5F, 0x0E, 0x62, 0x34, 0x09, 0x91, 0xA6, 0xD5, 0xC8, 0x75, 0x37, 0x01, 0xF7,
+0x0B, 0xD6, 0x95, 0x9D, 0x8A, 0x28, 0x45, 0x3A, 0xA3, 0x3F, 0x74, 0xFF, 0x62, 0xF3, 0x30, 0x66,
+0x9A, 0xF7, 0x98, 0x53, 0x8C, 0xD1, 0x83, 0x34, 0x07, 0x4E, 0x86, 0x7A, 0xB7, 0xFC, 0xDE, 0x79,
+0xA2, 0x10, 0x65, 0x27, 0x50, 0xC3, 0x89, 0x03, 0xD5, 0x35, 0x9A, 0x56, 0xC5, 0x29, 0x1D, 0x26,
+0xB5, 0x72, 0xB4, 0x31, 0x01, 0x64, 0xAF, 0x0A, 0xFB, 0xA8, 0x9D, 0x34, 0x01, 0x84, 0xA5, 0xD6,
+0xCC, 0x83, 0xB9, 0xF0, 0x2E, 0x98, 0xB8, 0x1E, 0x84, 0x19, 0xB6, 0x1C, 0x29, 0x59, 0x0E, 0x1C,
+0x3A, 0x29, 0xB9, 0xF0, 0x16, 0xC2, 0x47, 0x8F, 0xCA, 0x0A, 0x15, 0x3C, 0xEE, 0xB7, 0xE5, 0x68,
+0xAB, 0xE4, 0xB9, 0xDB, 0x0B, 0xBF, 0xC0, 0x93, 0xA8, 0x33, 0x3E, 0x11, 0x2A, 0x3C, 0xD5, 0x44,
+0xFA, 0xB4, 0x5E, 0xC7, 0xBD, 0xA5, 0x02, 0x84, 0xA0, 0xD2, 0x55, 0x30, 0xA8, 0xA9, 0xAE, 0x14,
+0x5F, 0xAB, 0x19, 0x68, 0x7F, 0x09, 0x94, 0x99, 0x47, 0x1F, 0xBE, 0x1B, 0xEA, 0x4C, 0x83, 0x24,
+0x34, 0x7E, 0x1A, 0x26, 0x5B, 0xE6, 0x86, 0x63, 0xDE, 0xB4, 0x95, 0x50, 0x7A, 0x18, 0xE5, 0x2B,
+0xB7, 0x0C, 0x3C, 0xCC, 0x99, 0x6E, 0x85, 0x11, 0x99, 0x93, 0xD1, 0x2E, 0x55, 0x20, 0xD6, 0x18,
+0x4D, 0xD4, 0xB7, 0x28, 0x9E, 0xED, 0x88, 0x16, 0xA6, 0xAF, 0x22, 0x71, 0x63, 0xEE, 0x39, 0xAA,
+0x82, 0x9C, 0xA9, 0x3E, 0xF5, 0x36, 0xB1, 0x3F, 0x4C, 0xCF, 0x41, 0x42, 0x47, 0x55, 0x6E, 0x06,
+0x48, 0xD8, 0x83, 0x2B, 0x17, 0x9A, 0x52, 0xF8, 0x7D, 0xC5, 0x9F, 0x2B, 0xBE, 0x0C, 0xB3, 0x2D,
+0x9E, 0xAF, 0x6E, 0x60, 0x4A, 0x1C, 0x4B, 0x81, 0x09, 0xFB, 0x4A, 0x1C, 0x27, 0x43, 0xB5, 0x6A,
+0x82, 0xC9, 0x76, 0x3A, 0x7C, 0x20, 0xE7, 0x01, 0xB3, 0x95, 0xCB, 0x18, 0xB8, 0xB2, 0x40, 0xB0,
+0x4C, 0x74, 0x6D, 0xB3, 0x9F, 0x7C, 0xD9, 0x66, 0xA4, 0x2D, 0x23, 0x4D, 0x6B, 0xF1, 0xA2, 0xBF,
+0x1C, 0x7D, 0x9D, 0x82, 0x3C, 0x9F, 0x03, 0xC9, 0x75, 0xC7, 0xA8, 0x66, 0x62, 0xC4, 0x20, 0x95,
+0xA6, 0x29, 0x93, 0xCD, 0x23, 0x0F, 0xDE, 0x89, 0xF3, 0xD5, 0x33, 0x10, 0xAF, 0x1B, 0xF7, 0xBF,
+0xB3, 0xC0, 0xFB, 0x24, 0xAC, 0x17, 0x0C, 0xDA, 0x59, 0x81, 0xE3, 0x6A, 0xC0, 0xDF, 0xDE, 0xC8,
+0xA6, 0xEF, 0x37, 0x7F, 0xA7, 0x5F, 0x20, 0x71, 0x29, 0xC1, 0x78, 0xA1, 0xDB, 0x56, 0x9E, 0x44,
+0x44, 0x97, 0x82, 0xD4, 0x96, 0x83, 0xBC, 0x56, 0xCA, 0x98, 0x9B, 0x05, 0xAC, 0x1F, 0x44, 0x2A,
+0x17, 0xEE, 0x9F, 0x3E, 0x88, 0x1C, 0x9F, 0xC4, 0x6A, 0x20, 0x13, 0xCF, 0x69, 0x05, 0xC4, 0x0E,
+0x96, 0xAA, 0x23, 0x9E, 0x05, 0x10, 0x3F, 0x2A, 0x27, 0x94, 0x9A, 0x09, 0x55, 0xE3, 0x4D, 0x0D,
+0x54, 0xCE, 0x06, 0xA8, 0xC0, 0x53, 0x40, 0xF8, 0x66, 0xA0, 0xDD, 0xFB, 0x70, 0x5E, 0x1E, 0x7B,
+0x64, 0x89, 0x99, 0x84, 0xE5, 0x52, 0x81, 0x02, 0x95, 0x31, 0xAA, 0x20, 0x4E, 0x2D, 0xC6, 0xCB,
+0x08, 0xFD, 0x48, 0x7B, 0x4F, 0x25, 0x33, 0x90, 0x23, 0x19, 0xF8, 0x3A, 0x78, 0xDE, 0xC9, 0x13,
+0x72, 0x54, 0x4D, 0x5E, 0xB1, 0xE3, 0x41, 0xD1, 0x34, 0x77, 0x14, 0x51, 0x27, 0xA7, 0x71, 0x71,
+0xF5, 0x95, 0x58, 0x72, 0x54, 0x75, 0x60, 0x0C, 0x1F, 0x0C, 0x95, 0xAA, 0x3C, 0x0C, 0x5C, 0xDE,
+0xBC, 0xAB, 0x70, 0xB1, 0xA7, 0xCA, 0xB7, 0x8E, 0x90, 0x5D, 0xC6, 0xDB, 0xF1, 0x8B, 0x30, 0x15,
+0x7C, 0xE9, 0xA7, 0xAF, 0x20, 0x9A, 0xA9, 0xC3, 0x74, 0x83, 0x68, 0x31, 0xAD, 0xAA, 0x9F, 0xAC,
+0x7F, 0x25, 0xF3, 0x91, 0x61, 0x0A, 0xC8, 0x9E, 0x7B, 0x73, 0xC2, 0x22, 0x47, 0xF9, 0x64, 0x75,
+0xFF, 0x39, 0x20, 0x41, 0x58, 0x3F, 0xA0, 0x82, 0xF8, 0x1C, 0xB4, 0xCA, 0x85, 0x28, 0x23, 0xD6,
+0xD5, 0xD1, 0x6E, 0x0A, 0x70, 0xE1, 0x7E, 0xE1, 0x4F, 0x97, 0x43, 0xA9, 0x5C, 0x22, 0xFD, 0x4F,
+0xF6, 0x74, 0x0A, 0x37, 0xB2, 0x7F, 0x7D, 0xF6, 0x55, 0xF3, 0xDD, 0xDF, 0xAF, 0x93, 0x72, 0x40,
+0xD9, 0x25, 0x95, 0x78, 0x5B, 0x25, 0x91, 0x66, 0x07, 0x22, 0x51, 0x84, 0x01, 0x1B, 0x25, 0x00,
+0xCE, 0xBF, 0xD0, 0x75, 0xD2, 0x1A, 0xF8, 0xC2, 0xFE, 0xD8, 0xD0, 0x7A, 0xBB, 0x9E, 0x25, 0x78,
+0xF6, 0xF7, 0x18, 0x32, 0xE8, 0xF0, 0xB1, 0xA4, 0xD0, 0x4E, 0x01, 0x01, 0x44, 0xD0, 0xD0, 0xB5,
+0xF2, 0x1A, 0xD3, 0x9E, 0x89, 0xCA, 0x08, 0xB8, 0xA1, 0xAD, 0x98, 0x52, 0x69, 0xBE, 0xF6, 0xC4,
+0x7C, 0x53, 0x5F, 0x9E, 0x3A, 0x82, 0x3F, 0x1C, 0xB8, 0xD3, 0xEC, 0x48, 0x92, 0x76, 0xD6, 0x91,
+0x3B, 0xDF, 0xA6, 0x87, 0xD2, 0x7E, 0xC7, 0x9B, 0x3C, 0x1E, 0x96, 0x24, 0x69, 0x0C, 0x32, 0xA0,
+0xB9, 0x94, 0xBE, 0x71, 0x24, 0x6B, 0x24, 0x45, 0x89, 0x26, 0x0A, 0x33, 0x13, 0x61, 0x3E, 0xA5,
+0x7F, 0x1A, 0x49, 0xD1, 0x45, 0xAC, 0xCB, 0x80, 0x06, 0x92, 0xC2, 0x44, 0xDA, 0x0B, 0xD7, 0x67,
+0x90, 0x44, 0x09, 0x08, 0x16, 0x15, 0xB4, 0xDE, 0x94, 0x60, 0x9A, 0x48, 0xDB, 0x60, 0xBE, 0x65,
+0x7B, 0x6D, 0x4C, 0x51, 0x82, 0xCF, 0xA7, 0x61, 0x0A, 0x66, 0xBB, 0xC5, 0x50, 0x3B, 0x2A, 0x41,
+0xF0, 0x48, 0xCA, 0xAA, 0xF3, 0xC7, 0x49, 0x5B, 0x03, 0x15, 0x88, 0x28, 0x26, 0xB0, 0xCD, 0xDD,
+0xF0, 0x37, 0x7C, 0xEF, 0x5C, 0x87, 0x98, 0x63, 0x67, 0x81, 0x18, 0xD2, 0x3C, 0x4B, 0x32, 0x39,
+0xD0, 0x76, 0xF8, 0xD2, 0xD5, 0x8A, 0x14, 0x21, 0xC7, 0x91, 0xA4, 0xB8, 0x1D, 0x0A, 0x33, 0xCD,
+0x99, 0xAD, 0xF0, 0xB7, 0x63, 0x91, 0x74, 0x12, 0x3F, 0x56, 0x90, 0x28, 0x87, 0x9A, 0xC6, 0x07,
+0x5A, 0x2D, 0x1E, 0xA6, 0x54, 0x28, 0xAE, 0xC2, 0xDF, 0x88, 0xA4, 0xAE, 0x85, 0x11, 0xAC, 0x18,
+0x6B, 0x54, 0x3B, 0x98, 0x82, 0x24, 0xAA, 0x7C, 0xC5, 0x63, 0xCC, 0xFB, 0xFD, 0x71, 0x10, 0x31,
+0xA6, 0xE8, 0xA0, 0x3F, 0xDD, 0x31, 0x54, 0xBC, 0xE8, 0xE8, 0x00, 0xD9, 0x06, 0x59, 0xE1, 0xF6,
+0x74, 0x94, 0xE7, 0x03, 0x9C, 0x6A, 0x13, 0x5F, 0xFA, 0x77, 0xE1, 0xC1, 0x49, 0xD2, 0x31, 0x1E,
+0xF7, 0x2A, 0x56, 0xCB, 0xA0, 0x6A, 0xC2, 0x54, 0x26, 0xBF, 0x7C, 0x71, 0x9D, 0x79, 0x1B, 0xCE,
+0xF2, 0x07, 0x90, 0x98, 0xB8, 0x14, 0xC9, 0xB5, 0xFF, 0xEB, 0x7F, 0xFB, 0x4B, 0x33, 0x07, 0x65,
+0xC6, 0xD8, 0x87, 0x13, 0x68, 0xFF, 0x1C, 0xA2, 0x44, 0x8F, 0x30, 0x0D, 0x08, 0xEE, 0x39, 0xB4,
+0x48, 0x90, 0xD8, 0x30, 0x29, 0x73, 0x65, 0x65, 0xB9, 0x98, 0x90, 0x8B, 0x60, 0x42, 0x7E, 0xEB,
+0x9D, 0xBD, 0xE6, 0xE3, 0x9F, 0xFE, 0x5F, 0x92, 0x99, 0xE1, 0x63, 0xF0, 0x5B, 0xFB, 0xC2, 0x67,
+0xDF, 0x2F, 0xE4, 0x92, 0x13, 0xFD, 0x0D, 0xCF, 0x22, 0xC5, 0x05, 0x93, 0x19, 0x4B, 0xDF, 0xB0,
+0xEF, 0x09, 0xE8, 0x7F, 0x5F, 0x7D, 0xE3, 0x76, 0x3C, 0xD6, 0xED, 0x30, 0x03, 0x33, 0xE1, 0x3E,
+0xFB, 0x51, 0x86, 0x99, 0xA6, 0xE5, 0xDE, 0x4C, 0x82, 0xDC, 0x86, 0x04, 0xE1, 0x30, 0x92, 0xF4,
+0x9F, 0xC7, 0x33, 0x90, 0x0A, 0x22, 0xD3, 0x9B, 0xCC, 0x9E, 0x51, 0xDF, 0x27, 0x19, 0x64, 0x1A,
+0x0E, 0xE2, 0x70, 0x94, 0xDB, 0x9D, 0x45, 0xDD, 0x5E, 0xF4, 0x95, 0xC4, 0x8C, 0x41, 0x01, 0x75,
+0x38, 0x3F, 0x45, 0xD8, 0x6F, 0x3E, 0x08, 0x5F, 0x15, 0xCE, 0x07, 0x2B, 0x57, 0xF4, 0x46, 0xD2,
+0xD8, 0x4F, 0xA6, 0xF3, 0xE0, 0x79, 0x24, 0x5E, 0xBC, 0x5F, 0xDC, 0x86, 0xC0, 0x00, 0x2A, 0xA7,
+0xFD, 0xF5, 0x95, 0xC7, 0x4E, 0x62, 0xC7, 0xF3, 0x7F, 0x12, 0x51, 0xAB, 0x4C, 0x41, 0x33, 0x17,
+0xE6, 0x4C, 0x1E, 0x43, 0xFC, 0x44, 0x42, 0xC6, 0xC8, 0x5D, 0xA6, 0x15, 0xE1, 0xC4, 0x17, 0x05,
+0x2A, 0x65, 0x3C, 0xC7, 0xFD, 0x4D, 0x3C, 0x46, 0xE2, 0xC2, 0x04, 0xC4, 0x8C, 0x8E, 0x3D, 0x83,
+0x71, 0x49, 0x32, 0x79, 0x06, 0x69, 0xD2, 0x68, 0x42, 0x27, 0xBE, 0x15, 0xE8, 0x27, 0xC7, 0x66,
+0x0D, 0x5E, 0x48, 0x58, 0x72, 0xAE, 0x7F, 0x9D, 0x34, 0x76, 0xAF, 0x62, 0x5D, 0xC1, 0xFD, 0xFA,
+0x28, 0xF2, 0x34, 0xB2, 0xFD, 0xA3, 0x18, 0x43, 0x3C, 0xFF, 0x3C, 0xBE, 0xF2, 0xB2, 0x42, 0x31,
+0x01, 0x33, 0xC9, 0x36, 0x5F, 0x78, 0xE8, 0x2F, 0xCA, 0x73, 0x14, 0x9C, 0x6B, 0xA8, 0xDB, 0xC4,
+0x99, 0x2F, 0x27, 0x7D, 0x11, 0xF8, 0xFE, 0xFA, 0x39, 0x98, 0xDF, 0x47, 0x3D, 0xB1, 0x1B, 0x4C,
+0x67, 0x74, 0xDD, 0xB1, 0x8D, 0xC0, 0x79, 0x5C, 0x98, 0x3F, 0xFA, 0xE3, 0x66, 0xF3, 0xF5, 0x97,
+0xDE, 0x44, 0x34, 0x34, 0x52, 0x47, 0xE0, 0xA1, 0x28, 0x95, 0x20, 0x85, 0xAC, 0xE0, 0x66, 0x2A,
+0xCA, 0x1C, 0x64, 0x7D, 0x21, 0x37, 0x54, 0xF2, 0x5C, 0xE4, 0x28, 0x73, 0x05, 0xB9, 0x07, 0xB5,
+0x77, 0x13, 0x67, 0x80, 0x49, 0xC6, 0x0D, 0xBB, 0x5C, 0x48, 0x0B, 0x9E, 0x60, 0xF2, 0xE8, 0xE5,
+0xB6, 0x2C, 0x97, 0xE5, 0xA1, 0xC2, 0xF7, 0x4C, 0x54, 0x9C, 0xE8, 0xC6, 0x5C, 0x8E, 0x8B, 0xF3,
+0xAB, 0x9F, 0x7A, 0xC2, 0x3C, 0xB4, 0x68, 0x66, 0x4A, 0xCA, 0x89, 0xB5, 0xE0, 0x2D, 0xFC, 0xBF,
+0x7F, 0xFB, 0x39, 0xF3, 0xEA, 0xB6, 0xDD, 0x92, 0x5E, 0x61, 0x5C, 0x71, 0x05, 0xCC, 0x15, 0xD9,
+0x4E, 0x45, 0x74, 0xC4, 0x2E, 0xE0, 0x17, 0x51, 0x85, 0xD2, 0x61, 0x22, 0x8B, 0xAC, 0x16, 0x17,
+0x38, 0xC7, 0x0B, 0xA1, 0x73, 0x90, 0x45, 0x3E, 0xC4, 0x27, 0x9B, 0x90, 0x4D, 0xE9, 0xD0, 0x6E,
+0x59, 0xA4, 0x23, 0x76, 0xF8, 0x9C, 0x57, 0x68, 0xAE, 0x81, 0x60, 0x5E, 0xBE, 0xC1, 0xDA, 0xB0,
+0x79, 0xE6, 0xA9, 0xDB, 0xEB, 0xCD, 0xDF, 0xAF, 0x9C, 0x2E, 0x75, 0x62, 0xC7, 0x8A, 0x5A, 0x37,
+0xB6, 0xAF, 0x02, 0x7B, 0xF4, 0xCC, 0x33, 0xC7, 0xBC, 0x79, 0xCC, 0xBD, 0x57, 0x02, 0x93, 0xE9,
+0x78, 0xA8, 0x77, 0x43, 0x89, 0x5F, 0xA2, 0x2F, 0xE0, 0x01, 0x10, 0x50, 0x12, 0xC8, 0x26, 0xA8,
+0x7F, 0x34, 0x13, 0x0F, 0x65, 0xA2, 0x8A, 0xD3, 0x7A, 0x0A, 0xC4, 0x0E, 0xAA, 0x15, 0x4D, 0x4E,
+0x24, 0x45, 0x4C, 0x1C, 0x3B, 0x5C, 0x91, 0xD3, 0x7C, 0x58, 0xB7, 0x21, 0xC5, 0x09, 0x4B, 0x99,
+0x09, 0xB1, 0x03, 0x19, 0x68, 0x80, 0xAA, 0x96, 0xD8, 0xB9, 0x3F, 0xB6, 0x27, 0x24, 0x11, 0x3F,
+0x43, 0xEA, 0x95, 0x55, 0x08, 0x86, 0x58, 0xF5, 0xFB, 0x0D, 0x26, 0xBF, 0x30, 0xC7, 0xFC, 0xE3,
+0x97, 0xFE, 0xB3, 0xA4, 0xAE, 0xA0, 0x19, 0x96, 0x44, 0xEC, 0x32, 0xC8, 0x0A, 0x8B, 0xDD, 0x93,
+0xB4, 0x08, 0xB1, 0x03, 0x61, 0x64, 0xDE, 0x3D, 0xAF, 0x10, 0x71, 0xF9, 0x4B, 0x48, 0x5F, 0xF1,
+0xC5, 0xBF, 0xFF, 0xBA, 0xBC, 0x74, 0xFD, 0x97, 0xCF, 0x3F, 0x69, 0x3E, 0xF1, 0xD1, 0x07, 0x24,
+0x05, 0xCA, 0x58, 0x9B, 0x48, 0xAE, 0x98, 0xD4, 0x99, 0xCA, 0x23, 0x71, 0x24, 0xF1, 0xCE, 0x0B,
+0x4A, 0xBD, 0x8D, 0xB5, 0xDE, 0xF4, 0x7F, 0xBC, 0x7C, 0x09, 0x39, 0x89, 0xB1, 0xC9, 0xDC, 0x8A,
+0x24, 0x76, 0x35, 0x50, 0xCC, 0xC4, 0xFC, 0x3E, 0x00, 0x92, 0xD8, 0x7F, 0xEB, 0x56, 0x6C, 0x62,
+0xBA, 0x93, 0xB3, 0x20, 0xCC, 0x52, 0x82, 0x0C, 0x2F, 0x05, 0x0C, 0xD2, 0xE1, 0x3C, 0x10, 0xB2,
+0x3B, 0x90, 0x7D, 0x0C, 0x75, 0x9D, 0xFE, 0xE9, 0xF0, 0x50, 0xF7, 0x30, 0x88, 0xED, 0x7D, 0xE4,
+0x8F, 0x3E, 0x40, 0x06, 0x01, 0x5A, 0x1A, 0xAD, 0xCA, 0xBC, 0x85, 0xAD, 0x2C, 0xF9, 0x43, 0xB2,
+0x25, 0x44, 0xCC, 0x32, 0x14, 0x89, 0xE8, 0x0C, 0x66, 0xEB, 0x37, 0x17, 0x56, 0x58, 0xB0, 0xFE,
+0x63, 0xD6, 0xAF, 0xCE, 0xEB, 0x31, 0xDC, 0x92, 0x64, 0xD0, 0xFA, 0x98, 0x59, 0xA6, 0x64, 0xD7,
+0x09, 0x82, 0x0E, 0x22, 0x9F, 0xAD, 0x63, 0x72, 0x16, 0x52, 0xBA, 0x20, 0x5B, 0x3D, 0x6E, 0xEE,
+0x39, 0x29, 0xF2, 0x27, 0xE3, 0x0D, 0xF7, 0x30, 0xD4, 0x68, 0x09, 0x9C, 0x00, 0xA1, 0x23, 0xF9,
+0xB4, 0xFD, 0xB2, 0xC7, 0x1E, 0xE4, 0x2F, 0x09, 0x68, 0x2B, 0xE9, 0x1F, 0x17, 0x87, 0x51, 0xD1,
+0x41, 0x90, 0x88, 0x5B, 0xE6, 0x1F, 0xD7, 0x81, 0xE0, 0x44, 0xA5, 0x32, 0xB2, 0x7E, 0x70, 0x8D,
+0x09, 0x39, 0xF6, 0xB8, 0x11, 0x17, 0x8B, 0x11, 0x53, 0x9D, 0x48, 0xC5, 0x16, 0x98, 0xA6, 0xCB,
+0x70, 0x48, 0xF3, 0x27, 0x16, 0x9B, 0xC2, 0x5E, 0xF2, 0xA4, 0xA5, 0xD1, 0xD0, 0x1B, 0x75, 0x5D,
+0xA1, 0x1A, 0x48, 0x45, 0xAD, 0x1A, 0xBE, 0x74, 0xA2, 0xD0, 0x0D, 0xF1, 0x4E, 0x4D, 0x5F, 0x3E,
+0x9A, 0x87, 0x19, 0x51, 0xDB, 0x57, 0x24, 0xEC, 0x40, 0x81, 0xA0, 0x79, 0x8A, 0xAA, 0x0D, 0xC9,
+0x16, 0x49, 0x1D, 0x55, 0xBB, 0xE1, 0x22, 0x75, 0x3C, 0x06, 0xFA, 0x71, 0x91, 0x28, 0x52, 0xE5,
+0xA0, 0x8F, 0x1F, 0x95, 0x16, 0xD6, 0x45, 0x1D, 0xC8, 0x44, 0x73, 0xEC, 0x22, 0x44, 0xF3, 0x73,
+0x2E, 0x2C, 0x2C, 0x40, 0xB0, 0xCB, 0x0D, 0xB3, 0x06, 0x96, 0x00, 0x2A, 0x56, 0xB6, 0x6D, 0x58,
+0x25, 0xA0, 0xA8, 0xB0, 0x4D, 0x9A, 0x14, 0xEB, 0x60, 0x5E, 0xA4, 0xE2, 0x17, 0x7D, 0x28, 0xFB,
+0x5A, 0xB4, 0x97, 0x61, 0xBA, 0x65, 0x1E, 0xD0, 0x46, 0xA8, 0x30, 0x2C, 0x61, 0x35, 0x16, 0x27,
+0x12, 0x57, 0x92, 0x56, 0xA6, 0x7E, 0xA9, 0x61, 0x60, 0x18, 0x72, 0x74, 0xA6, 0xF3, 0x33, 0x96,
+0xE7, 0x91, 0xC9, 0x81, 0xA7, 0xE0, 0x9C, 0x31, 0x20, 0x84, 0x09, 0x97, 0x07, 0xE5, 0x17, 0xD8,
+0xCF, 0x49, 0x66, 0xFB, 0x15, 0x30, 0xFD, 0x72, 0xEC, 0x53, 0xDD, 0xE5, 0xBE, 0xA8, 0x42, 0xF6,
+0x9E, 0x26, 0x26, 0xF5, 0xA3, 0x66, 0x88, 0xB7, 0x8B, 0xD4, 0x1F, 0xB0, 0xEE, 0x31, 0x7D, 0x11,
+0xE8, 0xE4, 0x9B, 0x16, 0x89, 0x1D, 0x53, 0x7F, 0x88, 0x28, 0xE5, 0x08, 0x8C, 0xA5, 0x69, 0x9E,
+0x9F, 0x85, 0xF9, 0xDA, 0x3C, 0x39, 0xB3, 0x94, 0x24, 0x86, 0xB3, 0x59, 0x94, 0xA2, 0x5E, 0x06,
+0x9E, 0xBC, 0x38, 0x02, 0x63, 0xB7, 0x90, 0x46, 0x49, 0xEC, 0x68, 0x8A, 0xA8, 0xC1, 0xC5, 0x3A,
+0x1E, 0x7E, 0x2B, 0x03, 0x91, 0xFF, 0x87, 0x7A, 0x16, 0x98, 0x88, 0xF5, 0x24, 0xA4, 0xFD, 0xB3,
+0xF0, 0x41, 0x62, 0x56, 0xB1, 0x0C, 0x26, 0xDF, 0xB6, 0x5A, 0x9B, 0xF3, 0x1F, 0xEC, 0x7B, 0x0F,
+0x41, 0x65, 0x0D, 0xE9, 0x42, 0x84, 0xB0, 0xC6, 0x6D, 0x26, 0x14, 0xD7, 0xA9, 0x78, 0x21, 0x26,
+0x8E, 0xF8, 0x7A, 0x88, 0x22, 0x38, 0x4A, 0xD4, 0x1B, 0xF0, 0xCF, 0x86, 0x29, 0x78, 0x3C, 0x08,
+0x5D, 0x23, 0x2B, 0x4E, 0xF8, 0x0A, 0x20, 0x43, 0xED, 0xB4, 0x6E, 0x3F, 0x60, 0x04, 0x38, 0x26,
+0x19, 0xFC, 0x41, 0x7F, 0x3F, 0x9A, 0x89, 0x87, 0xA6, 0xAF, 0xD9, 0x31, 0x4E, 0x53, 0x30, 0x7D,
+0xEE, 0x86, 0x28, 0xD6, 0x49, 0x1F, 0x78, 0x8D, 0xD0, 0xAC, 0x44, 0x9F, 0xA1, 0x62, 0x28, 0xDD,
+0xFD, 0xF9, 0x42, 0x0D, 0xB8, 0xE3, 0x6E, 0x45, 0xF1, 0xB9, 0x03, 0x79, 0xA4, 0xD2, 0xC2, 0x88,
+0x59, 0xEE, 0x63, 0xA0, 0x8A, 0x0B, 0x55, 0xBD, 0xDB, 0xA6, 0x54, 0x4B, 0x14, 0x6F, 0x19, 0x7C,
+0xAD, 0x98, 0xB2, 0xE6, 0xBD, 0xE6, 0x16, 0x31, 0x9B, 0xFA, 0x1A, 0xB4, 0x74, 0x31, 0x61, 0x9B,
+0x3C, 0x7E, 0xFA, 0x5B, 0xD1, 0xB9, 0xDE, 0x93, 0x1D, 0x9A, 0xDD, 0x58, 0x59, 0xA3, 0x19, 0xF5,
+0x68, 0x59, 0x05, 0x27, 0xBF, 0xD0, 0x2A, 0x92, 0x03, 0x71, 0xB6, 0x1F, 0x6C, 0x3F, 0x53, 0xB1,
+0xBE, 0x2F, 0xB1, 0x46, 0x1C, 0x69, 0x32, 0x1C, 0x2D, 0xAA, 0x52, 0xB2, 0xFA, 0xCE, 0xF3, 0xC8,
+0x73, 0xC5, 0xF3, 0xCA, 0xF1, 0xC3, 0x71, 0xD4, 0x8B, 0x67, 0xC5, 0x4D, 0x1D, 0x02, 0x5F, 0x60,
+0xFC, 0xD8, 0x97, 0xB1, 0x03, 0xF5, 0x93, 0x66, 0xE6, 0xD1, 0x44, 0x96, 0x95, 0xD8, 0xDD, 0xD4,
+0xA9, 0xD5, 0x8D, 0x92, 0x81, 0x00, 0x25, 0x6E, 0x92, 0x9D, 0xEB, 0xAE, 0xB6, 0xAE, 0xE4, 0xEE,
+0xF3, 0xF9, 0xDC, 0x1C, 0xE1, 0xB1, 0x84, 0x26, 0xB6, 0x16, 0x6A, 0x40, 0x00, 0x5D, 0x24, 0xA8,
+0x55, 0xF0, 0x84, 0xD1, 0x58, 0x72, 0x27, 0x04, 0x91, 0x76, 0x5C, 0xE7, 0x9F, 0x16, 0x51, 0xB0,
+0x32, 0x59, 0x23, 0x16, 0xFF, 0x78, 0xF1, 0x33, 0x02, 0x38, 0xAF, 0x97, 0xF0, 0xF7, 0xE1, 0xEE,
+0x2F, 0x0B, 0xA4, 0xEF, 0x61, 0x0D, 0x64, 0xF4, 0x99, 0x0F, 0xC9, 0x4C, 0x44, 0xE4, 0x5A, 0x2E,
+0x6A, 0x95, 0xBA, 0x44, 0x2A, 0x9B, 0xED, 0x8A, 0x8F, 0x76, 0x75, 0xA9, 0x12, 0x18, 0xD9, 0x2A,
+0x39, 0xEA, 0x7C, 0xEA, 0x84, 0x9E, 0xDB, 0xCA, 0x6F, 0x81, 0xAA, 0x19, 0x2A, 0x97, 0x41, 0x30,
+0x8A, 0x0D, 0x21, 0xB6, 0xBE, 0x79, 0x24, 0xBA, 0x30, 0x80, 0x93, 0x04, 0x8C, 0x47, 0x52, 0xE2,
+0x72, 0x98, 0xB1, 0x18, 0xBD, 0x37, 0x9A, 0x6E, 0x5A, 0xC3, 0x7D, 0x2E, 0xB4, 0xBD, 0xF4, 0x42,
+0x80, 0xC9, 0xDB, 0x99, 0x5C, 0xB9, 0x1A, 0x8A, 0xDC, 0x84, 0x9A, 0x09, 0x72, 0x7D, 0xD3, 0xAF,
+0xEE, 0x0D, 0xA4, 0x4C, 0xA1, 0x1F, 0x56, 0x7F, 0x13, 0x95, 0xF4, 0x83, 0x07, 0x4F, 0x98, 0x7D,
+0xBB, 0x5B, 0xA4, 0xDC, 0x58, 0x11, 0x5E, 0xF8, 0x2A, 0xE1, 0x23, 0xC5, 0x1C, 0x97, 0x3A, 0x29,
+0x02, 0x63, 0x01, 0x01, 0x25, 0x76, 0x63, 0xE1, 0x2C, 0xDD, 0x02, 0xC7, 0x48, 0xC2, 0xD2, 0x0E,
+0x27, 0xE1, 0x73, 0xC8, 0x20, 0x1E, 0x24, 0xA3, 0xB6, 0xB4, 0x2C, 0x9C, 0x45, 0x74, 0xB3, 0x24,
+0xC4, 0x5A, 0x57, 0x9D, 0x52, 0x25, 0x9F, 0x1D, 0x87, 0x8B, 0x60, 0x15, 0xE6, 0x73, 0x8B, 0x2A,
+0x77, 0x21, 0x39, 0xE2, 0xF6, 0x99, 0x24, 0x4A, 0xD8, 0x86, 0x6F, 0x5C, 0xD3, 0x51, 0x34, 0x3C,
+0x3F, 0x45, 0x37, 0x6F, 0x12, 0xBB, 0xDD, 0x24, 0x76, 0x30, 0x7B, 0xF2, 0x41, 0x94, 0xC1, 0xD9,
+0x32, 0x3B, 0x47, 0xC2, 0xAC, 0xC9, 0x35, 0x76, 0xB6, 0xC7, 0x6E, 0x09, 0x6B, 0x38, 0xC5, 0x60,
+0x24, 0xCA, 0x65, 0x18, 0x14, 0x11, 0xA8, 0x96, 0x01, 0xD9, 0x75, 0xB8, 0x09, 0x4B, 0x74, 0x38,
+0xBA, 0xFD, 0xD2, 0x6F, 0x91, 0xCE, 0xF6, 0xAC, 0xEC, 0x59, 0x5F, 0x96, 0x6F, 0x6E, 0xAB, 0x28,
+0x32, 0x25, 0x48, 0x8B, 0x30, 0x9C, 0x26, 0xB6, 0x5B, 0x60, 0x28, 0x6B, 0x17, 0x47, 0x18, 0x01,
+0x2A, 0x54, 0x54, 0x6C, 0x68, 0x6A, 0x9D, 0x8F, 0xEC, 0xFF, 0x4C, 0xED, 0xD1, 0x86, 0xC4, 0xB2,
+0x9B, 0x51, 0x5F, 0x96, 0x35, 0x43, 0xE9, 0x3F, 0xD7, 0xDB, 0x74, 0x0D, 0x11, 0xB3, 0x2D, 0xC8,
+0x53, 0xB6, 0x65, 0xEB, 0x4E, 0xC9, 0x4B, 0x96, 0x83, 0xE0, 0x9A, 0x99, 0x08, 0x54, 0xA0, 0x0F,
+0x5E, 0xBA, 0x2B, 0x5D, 0x23, 0x7C, 0xDA, 0x74, 0xF7, 0xC3, 0x88, 0xC0, 0xA8, 0x22, 0x76, 0x83,
+0x49, 0xD8, 0x38, 0x8C, 0x18, 0x68, 0x53, 0xA3, 0x00, 0x01, 0x96, 0x61, 0xBA, 0x08, 0x52, 0x47,
+0x72, 0xE7, 0xCD, 0x87, 0x96, 0xBB, 0x59, 0xF3, 0x24, 0xFF, 0x75, 0x8B, 0xE2, 0x66, 0x03, 0x07,
+0xBC, 0x4F, 0x1D, 0xBF, 0x87, 0x39, 0xEA, 0x2C, 0xC5, 0xB1, 0x66, 0x59, 0xE7, 0xAB, 0xE6, 0x3E,
+0xDB, 0xD0, 0x09, 0xB7, 0x9D, 0xF8, 0xDE, 0xF9, 0xA4, 0xCE, 0x76, 0x3D, 0x9A, 0x62, 0x67, 0x20,
+0x6D, 0x43, 0x3E, 0xEB, 0x5A, 0xA6, 0x60, 0x6A, 0x83, 0x09, 0x76, 0x17, 0x88, 0x5D, 0x37, 0x9C,
+0xDA, 0x99, 0xB3, 0x8F, 0x74, 0xCA, 0x4E, 0xE2, 0x45, 0x17, 0x28, 0x70, 0xD1, 0x44, 0xA6, 0x22,
+0xA8, 0x39, 0x65, 0xCE, 0xF2, 0x3B, 0x4F, 0xE2, 0xC2, 0xFE, 0x76, 0x4B, 0x95, 0x0D, 0x97, 0x0E,
+0xC6, 0x93, 0x40, 0xAF, 0x02, 0x7A, 0xBF, 0x3D, 0x91, 0xEA, 0xB8, 0x1B, 0xAF, 0xDE, 0xB9, 0x14,
+0xC6, 0xAC, 0x11, 0x0B, 0x3F, 0xC7, 0x5C, 0x84, 0x72, 0x2C, 0x98, 0x84, 0x02, 0xEA, 0xB5, 0xE3,
+0x11, 0x29, 0x0C, 0x9F, 0xBB, 0x38, 0x22, 0x99, 0x02, 0x78, 0x74, 0x17, 0x8A, 0xC0, 0x90, 0x11,
+0x60, 0xCE, 0xBD, 0x87, 0x56, 0x2C, 0x92, 0x08, 0x77, 0x12, 0xB6, 0x6D, 0xDB, 0xF6, 0x9A, 0x17,
+0x5E, 0x7E, 0x53, 0x6A, 0x7B, 0xD2, 0x1A, 0x90, 0x68, 0xBA, 0x82, 0x9A, 0xB8, 0x2C, 0x0B, 0xF5,
+0xF2, 0x2B, 0x1B, 0xCC, 0x25, 0x7C, 0x2E, 0x05, 0x29, 0x7C, 0x08, 0x55, 0x04, 0x18, 0xBD, 0xAA,
+0x93, 0x22, 0x30, 0x56, 0x10, 0x18, 0x55, 0xC4, 0x6E, 0xAC, 0x80, 0xA6, 0xC7, 0x39, 0xFC, 0x08,
+0x48, 0xA4, 0x11, 0xD2, 0x0A, 0xD0, 0xF7, 0x8C, 0xF7, 0x5C, 0xB9, 0xF1, 0x7A, 0x95, 0xC9, 0xED,
+0xCE, 0x79, 0xC5, 0x39, 0x0B, 0xAB, 0x23, 0x27, 0x96, 0xFD, 0xC5, 0xBA, 0xD3, 0xF9, 0x65, 0x42,
+0xF3, 0xC2, 0x39, 0xF6, 0xA8, 0x1D, 0xD1, 0x23, 0xD9, 0x03, 0x61, 0x2A, 0x83, 0xF3, 0xEB, 0x44,
+0x98, 0x5C, 0x06, 0x92, 0x9B, 0x69, 0x28, 0xBD, 0x97, 0x92, 0x69, 0x78, 0x60, 0x9C, 0x41, 0x84,
+0x1A, 0xFB, 0x2B, 0x11, 0xAD, 0x54, 0xEB, 0x22, 0x57, 0x62, 0xFC, 0x23, 0xC7, 0x7F, 0xEF, 0xA1,
+0x5E, 0x06, 0x0F, 0xA7, 0x58, 0xCD, 0x2E, 0xF4, 0xB9, 0xF3, 0xD8, 0xD8, 0x16, 0x7A, 0x3C, 0xCA,
+0xBC, 0xF8, 0xE7, 0x7E, 0x60, 0x7D, 0x5E, 0x46, 0x23, 0xD2, 0xA7, 0x6B, 0x56, 0x75, 0x99, 0x99,
+0x55, 0x53, 0x86, 0xD4, 0x37, 0x03, 0x73, 0x58, 0x1F, 0x0A, 0x26, 0xBA, 0xAD, 0x22, 0x90, 0x0C,
+0x04, 0xE8, 0x43, 0x37, 0x17, 0xF9, 0xE8, 0x6E, 0x9F, 0x37, 0x55, 0x72, 0xE4, 0x1D, 0x83, 0x39,
+0xF6, 0x4D, 0x54, 0x09, 0x78, 0x1D, 0x15, 0x09, 0x98, 0xCA, 0x84, 0x79, 0xEE, 0x98, 0x16, 0xE3,
+0xC4, 0xC9, 0xB3, 0x92, 0x0E, 0xE4, 0xBD, 0x9D, 0x87, 0xC4, 0x5C, 0xBB, 0x06, 0xD5, 0x0A, 0x9A,
+0x51, 0x1E, 0x8D, 0x97, 0xC5, 0x8C, 0xA6, 0x5A, 0x73, 0xFB, 0xDC, 0xC6, 0x31, 0xEB, 0x5F, 0x97,
+0x0C, 0x5C, 0xB5, 0xCD, 0xD1, 0x8F, 0xC0, 0xA8, 0x49, 0x50, 0x1C, 0xCD, 0x5D, 0x37, 0xFA, 0x61,
+0xD3, 0x23, 0x1C, 0x6E, 0x04, 0xCE, 0x43, 0xAD, 0xFB, 0xD5, 0xFA, 0xED, 0xE6, 0x9D, 0x83, 0xC7,
+0x91, 0x92, 0xA1, 0x5B, 0xD2, 0x32, 0x50, 0xAD, 0x23, 0xE1, 0x09, 0xCD, 0xAF, 0x8C, 0xF0, 0xC4,
+0x9E, 0x33, 0x69, 0x43, 0xB4, 0x19, 0xEF, 0xAD, 0x39, 0x51, 0xE4, 0x27, 0x7B, 0x48, 0xA2, 0x62,
+0xF1, 0xAB, 0x55, 0xBD, 0x84, 0xF3, 0x71, 0xFD, 0xC0, 0xD0, 0xC9, 0x0D, 0x40, 0xA6, 0xF0, 0x03,
+0x29, 0x0B, 0x13, 0xA2, 0x64, 0xC3, 0x91, 0x7A, 0x09, 0x12, 0x76, 0x3E, 0x84, 0xEC, 0xF4, 0x2C,
+0x9F, 0x96, 0xCC, 0x89, 0x8A, 0x64, 0x33, 0x4C, 0x3D, 0x5B, 0x91, 0x7F, 0x6B, 0x3D, 0x7C, 0x78,
+0x58, 0xB7, 0x94, 0x91, 0xA8, 0xAC, 0x3C, 0x21, 0xC2, 0x9A, 0x28, 0x8C, 0xB1, 0x2C, 0x2C, 0x9E,
+0xD8, 0xF1, 0xF8, 0xAC, 0x7A, 0x67, 0x09, 0xAD, 0x55, 0x23, 0x7D, 0x20, 0xAD, 0x25, 0xAC, 0x42,
+0x18, 0x65, 0x21, 0x57, 0x64, 0x2D, 0xCD, 0x88, 0x03, 0xBE, 0xF8, 0x1B, 0x32, 0x21, 0x8C, 0x23,
+0x7B, 0xF8, 0x4A, 0x4F, 0xC3, 0x4E, 0xA9, 0x87, 0x89, 0x1C, 0x52, 0x70, 0x38, 0x7F, 0x6A, 0xC9,
+0x0C, 0xB3, 0xB0, 0x9E, 0xA6, 0x69, 0x24, 0x2A, 0x1E, 0x4E, 0xCF, 0xE3, 0x64, 0x82, 0xAB, 0x6D,
+0x2B, 0x02, 0x71, 0x08, 0xE4, 0x22, 0xFA, 0x95, 0xC9, 0x6A, 0xF7, 0xEC, 0x3B, 0x6A, 0xCE, 0xC0,
+0x7F, 0xB7, 0xF5, 0xE4, 0x79, 0xF3, 0xF6, 0x5B, 0xBB, 0xCD, 0x0E, 0x5C, 0x7B, 0x47, 0x50, 0x8F,
+0xF6, 0x50, 0x4B, 0xAB, 0xD9, 0xB9, 0xE7, 0xB0, 0xD9, 0x84, 0x65, 0xBF, 0x79, 0x65, 0xA3, 0xF9,
+0xD1, 0x33, 0xAF, 0x9A, 0x2D, 0x28, 0x47, 0xD5, 0x01, 0xE5, 0x7A, 0x3A, 0xAA, 0x18, 0x7C, 0xEA,
+0xAF, 0x1E, 0x97, 0xF2, 0x68, 0x36, 0xB2, 0x72, 0xA8, 0x21, 0x2C, 0x7A, 0x7A, 0x14, 0x81, 0xD4,
+0x20, 0x30, 0x6A, 0xF2, 0xD8, 0x29, 0xB1, 0x4B, 0xCD, 0x09, 0x1F, 0xAD, 0x7B, 0x39, 0x80, 0x37,
+0xE7, 0x2F, 0x7C, 0xF3, 0x39, 0xB3, 0xE3, 0xF0, 0x49, 0x51, 0xEB, 0xAE, 0x40, 0xC1, 0x93, 0x4A,
+0x38, 0x01, 0xB1, 0x73, 0xF4, 0x45, 0xFC, 0xFB, 0x49, 0x5C, 0x2C, 0xB1, 0x73, 0x86, 0x4B, 0xF7,
+0xD7, 0xF9, 0xA0, 0xC9, 0x0F, 0x34, 0x49, 0x5A, 0xB2, 0x73, 0xC3, 0x95, 0xED, 0xF1, 0x44, 0x86,
+0xDB, 0x64, 0x83, 0xEC, 0x89, 0x16, 0x05, 0x02, 0xC9, 0x72, 0x75, 0xFF, 0xF0, 0xE1, 0x95, 0xE6,
+0x43, 0x4B, 0x6F, 0x37, 0xC5, 0x09, 0x92, 0x67, 0x0E, 0x27, 0x66, 0x27, 0x91, 0xD4, 0xF2, 0xE9,
+0xD7, 0xB6, 0x9A, 0x75, 0xA8, 0x83, 0xF9, 0xD6, 0xA1, 0xE3, 0xA6, 0x83, 0xB5, 0x71, 0x33, 0x40,
+0xEC, 0x68, 0x7E, 0x15, 0xD2, 0xEA, 0xD8, 0xAA, 0xE5, 0xA8, 0x32, 0xD9, 0x3E, 0xC6, 0x2A, 0x6E,
+0x96, 0xBA, 0x25, 0x9A, 0x2C, 0x89, 0x0B, 0x7E, 0x14, 0xEE, 0x17, 0x9F, 0xC5, 0x8E, 0x6D, 0x47,
+0x97, 0xA1, 0x46, 0x2F, 0x36, 0xB8, 0x8A, 0xA4, 0xC4, 0x45, 0x48, 0x85, 0xF0, 0xC9, 0x65, 0x73,
+0xCD, 0xDF, 0x3C, 0xB0, 0xC8, 0x34, 0x55, 0x97, 0xDB, 0x88, 0x5A, 0x7D, 0xA0, 0x0D, 0xE7, 0x10,
+0xD0, 0xB6, 0x52, 0x88, 0x00, 0xC7, 0xEF, 0x25, 0x04, 0x4C, 0xAC, 0x46, 0x4D, 0xCF, 0x7F, 0x41,
+0xB1, 0xF6, 0x75, 0xAF, 0x6F, 0x95, 0x1C, 0x81, 0xC5, 0xA5, 0xC5, 0xA6, 0x0C, 0x26, 0xDA, 0x3C,
+0xBC, 0xB8, 0x70, 0x7C, 0x33, 0xD5, 0xD2, 0x05, 0xBC, 0x5C, 0x9E, 0x83, 0x8A, 0xDE, 0x8D, 0xCA,
+0x17, 0x8D, 0xD3, 0xEB, 0xCC, 0x17, 0xFF, 0xEE, 0x83, 0xE6, 0x89, 0x47, 0xEF, 0x15, 0x5F, 0x3D,
+0xF5, 0xAF, 0x4B, 0xE1, 0x49, 0xD3, 0x5D, 0x0D, 0x19, 0x01, 0x35, 0xC5, 0x0E, 0x19, 0x42, 0x6D,
+0x60, 0xA8, 0x08, 0x30, 0xEB, 0x38, 0xEB, 0xA5, 0x9E, 0x82, 0x79, 0x92, 0x9F, 0x25, 0x1A, 0x36,
+0x08, 0x00, 0x70, 0x6A, 0x14, 0xC9, 0x8D, 0xA8, 0x53, 0x76, 0xF2, 0xA4, 0x27, 0x30, 0xCF, 0xBA,
+0x85, 0x9E, 0x04, 0x85, 0x81, 0x01, 0xA1, 0x19, 0xD2, 0x2A, 0x62, 0x96, 0x18, 0x52, 0xC4, 0xF3,
+0xD5, 0xFB, 0x0A, 0x90, 0x1E, 0xA1, 0x7E, 0xC2, 0x78, 0x93, 0x9B, 0x02, 0xB3, 0x23, 0x15, 0xBB,
+0xBD, 0xC8, 0xDE, 0xBF, 0x1F, 0x44, 0x96, 0x11, 0x77, 0x5E, 0x6F, 0x74, 0xBD, 0x72, 0xEA, 0x64,
+0x68, 0x34, 0xED, 0x91, 0xCE, 0x4E, 0xD8, 0xA9, 0xB7, 0xA1, 0x7A, 0x30, 0xFA, 0x38, 0x03, 0x56,
+0xD4, 0x0B, 0xA7, 0xC0, 0xEF, 0x4E, 0x00, 0x0B, 0x1A, 0x60, 0x5D, 0xD2, 0xEE, 0xEE, 0xEB, 0x92,
+0xB8, 0x76, 0x36, 0xB2, 0xFA, 0x97, 0x26, 0x99, 0xE0, 0x0E, 0x75, 0xCC, 0xE8, 0xF6, 0x8A, 0xC0,
+0x40, 0x10, 0x20, 0x69, 0x63, 0xDD, 0x59, 0x96, 0x21, 0x5B, 0xB9, 0x6C, 0xBE, 0x14, 0x68, 0x6F,
+0x40, 0xEE, 0x3A, 0xDE, 0x37, 0x58, 0x3D, 0x60, 0x0F, 0x2A, 0x1D, 0xEC, 0xDA, 0x77, 0xC4, 0x1C,
+0x80, 0x8A, 0x4E, 0x02, 0xC8, 0xEA, 0x11, 0x0B, 0x60, 0xBA, 0x65, 0xD1, 0xF7, 0x25, 0x77, 0xCF,
+0x45, 0x29, 0xB2, 0xF1, 0x4A, 0xEA, 0x06, 0x02, 0xB4, 0xAE, 0x33, 0xAA, 0x10, 0x18, 0x15, 0xC4,
+0x4E, 0x55, 0x81, 0x51, 0x35, 0x26, 0x52, 0x7E, 0x30, 0x9D, 0x70, 0x6C, 0x3E, 0x8A, 0xBC, 0x51,
+0xCC, 0x19, 0x45, 0xA2, 0xE3, 0x4B, 0xC7, 0x59, 0x53, 0x23, 0x83, 0x25, 0x38, 0x5B, 0xD3, 0xA3,
+0x0F, 0x9A, 0x88, 0x7E, 0xB6, 0x24, 0xD0, 0x06, 0x56, 0xD8, 0xD9, 0xB2, 0x40, 0x1F, 0x51, 0x1A,
+0x04, 0x5B, 0x44, 0xB6, 0x47, 0xE6, 0x38, 0xFB, 0x0F, 0xEB, 0x97, 0x22, 0xF1, 0x68, 0x55, 0x79,
+0xA1, 0x64, 0xA0, 0x4F, 0xE6, 0x44, 0xC2, 0xDA, 0xDE, 0xD1, 0x81, 0xA4, 0xC4, 0x28, 0x49, 0x73,
+0xFE, 0x82, 0x61, 0xBE, 0x2C, 0x1B, 0x0C, 0xE2, 0xCC, 0xAA, 0xA2, 0x30, 0x3A, 0x26, 0x46, 0xA5,
+0x4C, 0x7E, 0x60, 0xBF, 0xC2, 0xD9, 0x7F, 0x17, 0x11, 0xCD, 0x93, 0x34, 0x9B, 0xDB, 0xC5, 0xCE,
+0x3E, 0x49, 0xB3, 0x27, 0xC7, 0x71, 0xA9, 0x53, 0xFC, 0x36, 0x16, 0x3F, 0x4B, 0x93, 0xD9, 0x4C,
+0x17, 0x14, 0xBC, 0x6E, 0xD4, 0xCC, 0xCD, 0x47, 0x85, 0x83, 0x19, 0x20, 0x76, 0x25, 0x7D, 0xD4,
+0xAE, 0x4C, 0x26, 0x46, 0xDA, 0xB6, 0x22, 0x90, 0x0C, 0x04, 0x4A, 0x41, 0xEE, 0x3E, 0xF4, 0xC4,
+0x32, 0xF3, 0xB9, 0xCF, 0x3D, 0x69, 0x56, 0xAE, 0x5C, 0x64, 0x26, 0x21, 0xB1, 0x6C, 0x1E, 0xCC,
+0xAB, 0x59, 0x08, 0x8E, 0xE0, 0x3C, 0x0E, 0x51, 0xB4, 0xE5, 0x15, 0x65, 0x66, 0xD1, 0xE2, 0x19,
+0xE6, 0x13, 0x1F, 0x7F, 0xC4, 0x7C, 0xE6, 0x93, 0x8F, 0x4A, 0xED, 0x57, 0x55, 0xEA, 0x92, 0x71,
+0x36, 0xB4, 0xCD, 0x64, 0x23, 0x30, 0x2A, 0x88, 0x5D, 0xB2, 0x3B, 0xA9, 0xED, 0x8F, 0x6E, 0x04,
+0x58, 0x98, 0x7B, 0x2F, 0x4A, 0xDE, 0x30, 0x7F, 0x14, 0xA9, 0x86, 0x57, 0xEC, 0xC4, 0xBB, 0xCE,
+0x89, 0x53, 0xA1, 0xEA, 0xE4, 0xFD, 0xCA, 0x84, 0x92, 0xD8, 0x8E, 0xC9, 0x22, 0x6B, 0x70, 0x8C,
+0x50, 0x9C, 0x20, 0x9A, 0x53, 0xE8, 0x4B, 0x0C, 0x61, 0x72, 0xCA, 0x1F, 0xFD, 0xEC, 0xC0, 0x90,
+0x26, 0xB3, 0x80, 0x74, 0x01, 0x13, 0xA0, 0x26, 0xD7, 0x87, 0x46, 0xEA, 0x60, 0xA2, 0x0C, 0xCD,
+0x19, 0x28, 0x03, 0x54, 0xEE, 0xE8, 0xE5, 0x16, 0xA3, 0xA6, 0xF9, 0xE3, 0x8C, 0x3B, 0x5D, 0x3D,
+0xD6, 0x89, 0xF4, 0xDB, 0x7E, 0x0C, 0xA3, 0x62, 0x3D, 0xC9, 0x15, 0x5F, 0x43, 0xD7, 0x8E, 0x4F,
+0x53, 0x17, 0x36, 0xEB, 0x65, 0x3C, 0x0B, 0x2E, 0x03, 0x26, 0xC0, 0x32, 0x4D, 0x0E, 0x3E, 0xD3,
+0xBF, 0x6E, 0x12, 0x52, 0x3B, 0xA4, 0x42, 0xBD, 0x1C, 0xDD, 0xA3, 0x52, 0x8F, 0x2E, 0x9D, 0x10,
+0x60, 0xD2, 0xE2, 0x59, 0xF0, 0xA3, 0x7D, 0x1F, 0x8A, 0xCB, 0xAF, 0x5C, 0xBE, 0xC0, 0xAC, 0x44,
+0xA4, 0xAB, 0x9D, 0xF1, 0x99, 0xDF, 0x23, 0xCB, 0x56, 0x60, 0xF9, 0x1D, 0x0B, 0xA7, 0x4B, 0x62,
+0x64, 0xF5, 0x2F, 0x4D, 0xA7, 0x51, 0x70, 0xEB, 0xF4, 0x65, 0x54, 0xF8, 0xD8, 0xA9, 0x62, 0x77,
+0xEB, 0x0C, 0xB8, 0x44, 0x3D, 0x3D, 0x8A, 0x62, 0xD5, 0xFF, 0xF8, 0xA3, 0x97, 0xCD, 0x6B, 0xDB,
+0xF7, 0xC1, 0x3C, 0xD9, 0x05, 0xE5, 0xAE, 0x0B, 0x49, 0x8A, 0xBD, 0x62, 0x15, 0xBE, 0x7B, 0x78,
+0x7F, 0xBA, 0xD0, 0xB9, 0x8C, 0xD4, 0x05, 0xE1, 0x0F, 0xC2, 0xC7, 0xE2, 0x0A, 0xDD, 0x8B, 0x9B,
+0x99, 0x0D, 0x18, 0xB0, 0xC4, 0xCE, 0x26, 0x35, 0xA6, 0xEF, 0x1D, 0x13, 0x9A, 0xB0, 0xAC, 0x12,
+0xFD, 0xCC, 0x98, 0xB7, 0xEE, 0x63, 0xCB, 0x17, 0x9A, 0xBF, 0x7D, 0x7C, 0xA9, 0xA9, 0x44, 0x16,
+0xFA, 0x64, 0x4E, 0xAC, 0x85, 0xFB, 0xE3, 0x3F, 0x6E, 0x31, 0xDF, 0x79, 0x75, 0x93, 0x39, 0x8C,
+0x5A, 0x86, 0xF9, 0x78, 0xD8, 0x74, 0x65, 0x64, 0x99, 0xEB, 0xDE, 0x87, 0x8D, 0xDD, 0x89, 0x3A,
+0xD3, 0x45, 0x78, 0xA6, 0x17, 0xE8, 0xEC, 0xEF, 0x52, 0x09, 0x37, 0xB2, 0xAA, 0x0B, 0xB8, 0x08,
+0x0E, 0x9E, 0x7E, 0x71, 0xC0, 0x45, 0x30, 0x74, 0x93, 0xD8, 0xA1, 0xA9, 0x0E, 0x5A, 0xBA, 0x27,
+0xC8, 0x39, 0xF2, 0x77, 0xAD, 0xEB, 0x1A, 0x8A, 0x92, 0x77, 0xC1, 0xD7, 0x30, 0xD7, 0x7C, 0xFE,
+0xB1, 0xA5, 0xE6, 0x6F, 0x1F, 0x5D, 0x62, 0xC6, 0x23, 0xA2, 0x50, 0x50, 0x55, 0xFF, 0xBA, 0x64,
+0x0E, 0x09, 0x6D, 0x3B, 0x85, 0x08, 0x70, 0xCC, 0x77, 0xE0, 0x85, 0x8A, 0xB5, 0x64, 0x59, 0x70,
+0x9E, 0xF9, 0xEC, 0xE4, 0xA5, 0xC6, 0x0E, 0x74, 0x24, 0x20, 0x1E, 0x27, 0x64, 0x8E, 0xE5, 0xB7,
+0x86, 0xB3, 0xB6, 0x68, 0x0A, 0xBB, 0xA8, 0xBB, 0x52, 0x04, 0x04, 0x01, 0x55, 0xEC, 0x74, 0x20,
+0x8C, 0x28, 0x02, 0xF4, 0x33, 0x3B, 0x0B, 0xFF, 0xBA, 0x96, 0x53, 0xE7, 0x6C, 0x29, 0x31, 0xDC,
+0x7D, 0x45, 0xB1, 0x73, 0xEC, 0xC3, 0x2B, 0x70, 0xF6, 0x20, 0xE3, 0x09, 0x8C, 0x63, 0x28, 0x4E,
+0x9B, 0x92, 0x75, 0xBD, 0x25, 0x33, 0xE2, 0xAD, 0x66, 0xF3, 0xB0, 0x39, 0xE9, 0x8F, 0x83, 0xDE,
+0xC6, 0x56, 0xC8, 0xBA, 0x2C, 0x2D, 0x34, 0x95, 0x45, 0xB1, 0x53, 0x90, 0xBF, 0xEE, 0x0A, 0x94,
+0xC9, 0x3D, 0x50, 0x26, 0xA9, 0x50, 0x66, 0x23, 0xF1, 0x29, 0x49, 0x93, 0x57, 0x19, 0x83, 0x93,
+0x10, 0x95, 0x1C, 0x23, 0x67, 0xC6, 0x27, 0x5B, 0x0E, 0xBA, 0xE2, 0xBA, 0x1E, 0xD2, 0x34, 0xDF,
+0x3F, 0x0F, 0x40, 0xD8, 0x5F, 0x0B, 0x5D, 0xDC, 0x77, 0xD7, 0x36, 0xC9, 0xED, 0x8D, 0xEB, 0xD7,
+0x41, 0xF2, 0xBA, 0x4D, 0x45, 0x41, 0x8E, 0x99, 0x27, 0x91, 0xB0, 0x9A, 0x61, 0x7F, 0x44, 0x2F,
+0x0A, 0xDD, 0x79, 0x52, 0x10, 0xE0, 0x4B, 0x4E, 0x1E, 0x5E, 0xA6, 0x1A, 0x50, 0x43, 0x74, 0xD1,
+0xED, 0x4D, 0x66, 0xD9, 0x92, 0x39, 0x66, 0xF9, 0xBD, 0xF3, 0xEC, 0x0C, 0x9F, 0xBA, 0xBB, 0x17,
+0xCF, 0x94, 0xF4, 0x26, 0xA2, 0xD4, 0x0D, 0xB5, 0x38, 0x6F, 0x52, 0x7A, 0xA0, 0x8D, 0x2A, 0x02,
+0x03, 0x43, 0x60, 0x54, 0x10, 0x3B, 0x55, 0x05, 0x06, 0x76, 0xB2, 0xD2, 0x71, 0x2D, 0x92, 0x9C,
+0x13, 0x67, 0x2E, 0x80, 0xDC, 0xA1, 0xE2, 0x04, 0xB8, 0x07, 0x9D, 0xF8, 0xBD, 0x4F, 0x5C, 0x34,
+0xD1, 0x6E, 0x7C, 0x89, 0x2D, 0x4B, 0x54, 0xC4, 0x29, 0x2D, 0x20, 0x2D, 0x36, 0x51, 0xB1, 0x53,
+0xFA, 0x5C, 0x3B, 0xD4, 0xB6, 0xBA, 0xB0, 0xCC, 0x26, 0x37, 0xB6, 0x7E, 0x77, 0x62, 0x5E, 0x71,
+0x26, 0xC8, 0x1C, 0xF8, 0xD5, 0x4D, 0x45, 0xA1, 0xE8, 0x54, 0x94, 0x12, 0x63, 0x8E, 0xBE, 0xFD,
+0x70, 0xD8, 0xBE, 0xD2, 0x71, 0xDD, 0x25, 0x25, 0xB6, 0x87, 0xCE, 0x63, 0x0A, 0xFC, 0x04, 0xBD,
+0x5F, 0x5D, 0xBC, 0x79, 0x95, 0xEB, 0xB0, 0x0F, 0xDE, 0x97, 0xD0, 0x6F, 0x23, 0x7F, 0x43, 0x7F,
+0x41, 0x5B, 0x5E, 0xCC, 0xB6, 0x67, 0x55, 0x3E, 0x8B, 0x8F, 0xAC, 0x13, 0xD8, 0xB5, 0x2D, 0x0E,
+0x24, 0x85, 0x4C, 0x48, 0xDC, 0xDD, 0x05, 0xDF, 0x46, 0x10, 0xBB, 0x6A, 0x14, 0x42, 0x9F, 0x52,
+0x55, 0x2E, 0x66, 0x58, 0x4D, 0x16, 0x9E, 0x8E, 0x57, 0x9B, 0xF6, 0x49, 0x11, 0x50, 0x04, 0x6E,
+0x05, 0x04, 0x46, 0x05, 0xB1, 0xBB, 0x15, 0x80, 0xD6, 0x3E, 0x26, 0x46, 0xE0, 0x22, 0xCC, 0x21,
+0xBB, 0x8F, 0x9D, 0x42, 0x96, 0xF7, 0x4E, 0x21, 0x1A, 0xAC, 0x40, 0xC1, 0xC9, 0xD6, 0x84, 0x0D,
+0x64, 0xA5, 0x40, 0x8A, 0xB3, 0xBF, 0x7A, 0xC2, 0x12, 0xB6, 0x69, 0xA3, 0x47, 0xE3, 0xE4, 0x2E,
+0xBF, 0x32, 0xD7, 0x0F, 0xFC, 0xD9, 0x5C, 0x9E, 0x37, 0x51, 0xEB, 0xB2, 0x4C, 0x65, 0x71, 0xA1,
+0x99, 0x80, 0x37, 0x74, 0x2A, 0x77, 0xC9, 0x9C, 0x18, 0xED, 0x7B, 0xF6, 0xA2, 0x8D, 0xFC, 0x65,
+0x9E, 0x3E, 0xFA, 0xF3, 0x75, 0xDB, 0xB8, 0x89, 0x20, 0x02, 0x58, 0x8E, 0xD1, 0x11, 0xAE, 0xC8,
+0xA1, 0xDB, 0xFE, 0xC6, 0x1C, 0x9C, 0xAB, 0x18, 0xD1, 0xD3, 0x43, 0xCF, 0x81, 0xE3, 0xB1, 0x88,
+0xE0, 0xE3, 0xF7, 0x13, 0x10, 0x42, 0xEE, 0x97, 0x6A, 0x1D, 0x2A, 0x7D, 0x40, 0xB1, 0xCB, 0x03,
+0xD9, 0x9D, 0x3F, 0xA5, 0x46, 0x92, 0x34, 0xB3, 0x76, 0xAD, 0x4E, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x28, 0x02, 0x63, 0x13, 0x81, 0x11, 0xBF, 0x83, 0x6B, 0xB9, 0xA2, 0xB1, 0x39, 0x70, 0x86, 0xEB,
+0xA8, 0x59, 0x81, 0x61, 0x0B, 0x92, 0xF5, 0x76, 0x42, 0x39, 0xA2, 0x90, 0x66, 0x7D, 0x5E, 0x90,
+0xD5, 0xCD, 0xA9, 0x6B, 0xDE, 0xFF, 0x52, 0x54, 0x5D, 0x99, 0x1D, 0xF9, 0x91, 0xE8, 0x57, 0xFB,
+0xD9, 0xFB, 0xCF, 0xD9, 0x62, 0xF7, 0xE1, 0x2C, 0xDB, 0xCA, 0xEC, 0x0A, 0x8A, 0xB9, 0x28, 0x50,
+0xF2, 0xA1, 0xEB, 0x8C, 0x00, 0x85, 0xF9, 0xB5, 0x11, 0xE9, 0x0C, 0xE8, 0x5B, 0x93, 0xEC, 0x89,
+0x6A, 0xDD, 0x61, 0xF8, 0xF6, 0xB4, 0x43, 0xA1, 0x94, 0x09, 0xC7, 0x8A, 0x74, 0x5A, 0x2E, 0xE8,
+0x97, 0xFE, 0x7E, 0xD6, 0x6B, 0xCE, 0x26, 0x55, 0xF6, 0xE4, 0x33, 0xAA, 0xE4, 0x39, 0x02, 0x18,
+0x51, 0x34, 0x6D, 0x5F, 0xD9, 0xBF, 0xC8, 0x6F, 0x42, 0x60, 0x3D, 0x06, 0x61, 0x64, 0xB0, 0xA8,
+0x78, 0x41, 0xD4, 0xB0, 0xC3, 0x0E, 0x18, 0x64, 0x5C, 0xBB, 0x6A, 0x32, 0x40, 0xEE, 0x4A, 0x72,
+0xB2, 0xCC, 0x83, 0x0B, 0xE0, 0x30, 0x5E, 0x98, 0x17, 0x04, 0x9D, 0x24, 0x1B, 0x13, 0x6D, 0x5F,
+0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x60, 0xF8, 0x11, 0x18, 0x71, 0x62, 0x37, 0xFC, 0x5D, 0xD2,
+0x16, 0xC7, 0x02, 0x02, 0xF4, 0xAD, 0x23, 0xA9, 0x3B, 0x04, 0xB2, 0x73, 0x00, 0x25, 0x7D, 0x7A,
+0xF8, 0xD7, 0x39, 0x99, 0xCA, 0xAA, 0x70, 0x71, 0x93, 0x53, 0xB5, 0xEC, 0x52, 0xEB, 0x53, 0x16,
+0xC6, 0x80, 0x5A, 0xD5, 0x2E, 0xCC, 0x79, 0xE7, 0x4D, 0xB5, 0x36, 0x2E, 0x81, 0x66, 0x58, 0xAE,
+0xCB, 0xFD, 0xD3, 0x97, 0x6C, 0x2A, 0x52, 0x7B, 0xA4, 0xC2, 0xA7, 0xAC, 0x03, 0x49, 0x4F, 0xF7,
+0x21, 0x7F, 0x1D, 0x09, 0x9E, 0x57, 0x22, 0x29, 0x4E, 0x5A, 0x91, 0xD1, 0x2B, 0x70, 0xF6, 0xB3,
+0x0F, 0x70, 0xF0, 0x9F, 0xC5, 0x5C, 0xEB, 0x20, 0x70, 0x09, 0x4A, 0xDC, 0xB7, 0xA8, 0x42, 0xE9,
+0x3F, 0x07, 0xA8, 0x58, 0x82, 0x18, 0x76, 0xDF, 0xAA, 0x83, 0x7E, 0x66, 0xA3, 0xD7, 0x3A, 0x65,
+0xCE, 0xC6, 0xD2, 0xE9, 0x35, 0x95, 0x66, 0x76, 0xDD, 0xC4, 0x94, 0x98, 0xA4, 0xC7, 0xC2, 0xF8,
+0xD4, 0x63, 0x54, 0x04, 0x14, 0x01, 0x45, 0x60, 0xAC, 0x22, 0xA0, 0xC4, 0x6E, 0xAC, 0x9E, 0xB9,
+0x31, 0x7E, 0xDC, 0xF4, 0xAD, 0xDB, 0x85, 0x2A, 0x13, 0xEF, 0xA1, 0x5E, 0xE3, 0x39, 0xF8, 0xD7,
+0x91, 0x67, 0xD0, 0x5C, 0x19, 0xFA, 0xD2, 0x59, 0x75, 0x2E, 0xCC, 0x57, 0xE7, 0xFD, 0xC6, 0x42,
+0x5F, 0xB9, 0x60, 0xDD, 0xB8, 0x5C, 0x6D, 0xA2, 0xE2, 0x45, 0xB6, 0xF5, 0xCA, 0x1D, 0x69, 0x8D,
+0x10, 0x3B, 0x72, 0x1A, 0x44, 0x81, 0x16, 0x20, 0x7F, 0xD5, 0x0C, 0xE4, 0xB3, 0x4A, 0x05, 0xB1,
+0x93, 0x52, 0x62, 0x47, 0x4E, 0x4A, 0x86, 0xFB, 0x0C, 0x89, 0xC8, 0x25, 0x7F, 0xF3, 0x8A, 0x9B,
+0xED, 0xA7, 0xEF, 0x8F, 0xF7, 0x8D, 0x73, 0x9E, 0x73, 0x41, 0x3E, 0x3E, 0x9F, 0x97, 0x8F, 0xDB,
+0xF9, 0xE8, 0x0F, 0x6F, 0x82, 0x0E, 0x13, 0x19, 0x3B, 0xFF, 0xB9, 0x40, 0xA1, 0xB3, 0xFE, 0x85,
+0x36, 0x20, 0xC5, 0x29, 0x78, 0xC2, 0x84, 0xA1, 0x8A, 0x76, 0x00, 0x77, 0x98, 0x61, 0xF3, 0x91,
+0x94, 0x78, 0xF9, 0xBC, 0x69, 0x92, 0xCF, 0x4F, 0x23, 0xD4, 0xC7, 0xF8, 0x85, 0xA5, 0x87, 0xAF,
+0x08, 0x28, 0x02, 0xB7, 0x3C, 0x02, 0x4A, 0xEC, 0x6E, 0xF9, 0x21, 0x30, 0x32, 0x00, 0xB4, 0xC3,
+0xA7, 0x6E, 0xDB, 0xFE, 0xE3, 0x66, 0x1B, 0x32, 0xBF, 0xB7, 0x77, 0x40, 0x39, 0xC2, 0xD4, 0x05,
+0xD3, 0xA0, 0xF5, 0x33, 0x73, 0xB2, 0x92, 0x3F, 0xB4, 0x38, 0xD7, 0xB9, 0xD0, 0xF7, 0x2E, 0x70,
+0xBD, 0x73, 0xDA, 0x9D, 0x33, 0xCD, 0xC6, 0x75, 0x49, 0x12, 0xA1, 0x38, 0xD5, 0x8B, 0xB5, 0x61,
+0xB9, 0x3D, 0x03, 0x04, 0x68, 0x76, 0x9C, 0x8C, 0xBC, 0x6D, 0xD9, 0xE3, 0x92, 0x9B, 0x98, 0x58,
+0xCA, 0x1A, 0xC1, 0x97, 0xF0, 0x30, 0xD2, 0xBA, 0x74, 0xD1, 0xFE, 0xEA, 0x52, 0xB3, 0x88, 0x16,
+0xE9, 0x14, 0x3B, 0x39, 0x3E, 0x6F, 0x66, 0x8D, 0x59, 0xC3, 0x93, 0xB1, 0xB0, 0x53, 0xB1, 0xBE,
+0x87, 0x6C, 0xC3, 0xF6, 0x4F, 0xBA, 0x19, 0x7E, 0x74, 0x8B, 0xAC, 0x96, 0x29, 0xFB, 0x72, 0x28,
+0xC1, 0xDE, 0x2D, 0xE6, 0x57, 0x73, 0xBD, 0x03, 0xD1, 0xB0, 0x5D, 0xA6, 0x06, 0x79, 0xEB, 0x16,
+0x4C, 0xAD, 0xD5, 0x42, 0xE7, 0x23, 0x73, 0x29, 0xE8, 0x5E, 0x15, 0x01, 0x45, 0x40, 0x11, 0x18,
+0x56, 0x04, 0x46, 0x94, 0xD8, 0xA9, 0x3A, 0x30, 0xAC, 0xE7, 0x72, 0xEC, 0x34, 0x06, 0x96, 0xC1,
+0xA0, 0x89, 0x8D, 0x28, 0xBE, 0xBD, 0x65, 0xDF, 0x31, 0xE4, 0x50, 0xB3, 0x49, 0x3F, 0x48, 0xEC,
+0x6C, 0x81, 0xD8, 0xD0, 0x7F, 0x8E, 0xEA, 0x94, 0xAF, 0xBC, 0xE0, 0x55, 0x2D, 0xF1, 0xA9, 0xA3,
+0x02, 0x25, 0xAA, 0x5C, 0xA8, 0x7A, 0xD9, 0x65, 0x36, 0x9F, 0x9D, 0x57, 0xBF, 0xB8, 0xAE, 0x8D,
+0xF0, 0xB4, 0x84, 0x8E, 0x9F, 0x19, 0xB8, 0x50, 0x06, 0x75, 0x6A, 0x42, 0x49, 0x11, 0x12, 0x13,
+0x23, 0xFB, 0x7C, 0x92, 0x13, 0x13, 0x33, 0x20, 0xA4, 0x0D, 0xAA, 0xA4, 0x55, 0x26, 0x2D, 0xF9,
+0xA4, 0x82, 0x26, 0x2C, 0x4C, 0x6C, 0xA5, 0xEC, 0x8F, 0x8D, 0xD4, 0xB5, 0xD5, 0x36, 0x22, 0xBE,
+0x71, 0xDE, 0x4C, 0xEB, 0xD7, 0x8F, 0x7E, 0xF7, 0x38, 0xB9, 0x88, 0x5F, 0x1F, 0xF9, 0x1B, 0x93,
+0xA4, 0xD8, 0xB7, 0xEB, 0xD4, 0x3A, 0x5B, 0xE9, 0x02, 0xC4, 0xAE, 0xB3, 0x83, 0x0E, 0x8D, 0xA2,
+0x60, 0xCE, 0x6E, 0x9C, 0x6C, 0x1A, 0x27, 0x57, 0x99, 0x9C, 0xEC, 0xE4, 0xFB, 0x1A, 0x8E, 0x9D,
+0x41, 0xAA, 0x47, 0xAA, 0x08, 0x28, 0x02, 0x8A, 0xC0, 0xD8, 0x44, 0x60, 0x44, 0x89, 0xDD, 0xD8,
+0x84, 0x4C, 0x8F, 0x7A, 0xA8, 0x08, 0x5C, 0xBD, 0x76, 0xCD, 0xEC, 0x3E, 0xD2, 0x2A, 0x35, 0x53,
+0x5B, 0xDB, 0x2E, 0x05, 0x44, 0x47, 0x4A, 0x89, 0x85, 0xD2, 0x92, 0x10, 0x9C, 0x58, 0x17, 0x3B,
+0x4F, 0x7A, 0xA2, 0x11, 0xB0, 0xA1, 0x10, 0x15, 0xB7, 0x72, 0xA8, 0xFE, 0x39, 0xA5, 0x4A, 0xF2,
+0xD7, 0xA1, 0x41, 0x96, 0x09, 0xAA, 0x9F, 0x50, 0x8E, 0xC0, 0x89, 0x0A, 0x53, 0x84, 0xD2, 0x59,
+0xC9, 0x4E, 0xB7, 0xC3, 0x8A, 0x1A, 0x47, 0x50, 0x46, 0xEC, 0x32, 0xCC, 0xB1, 0x51, 0x1F, 0xB7,
+0x48, 0xFE, 0xE1, 0x18, 0xE5, 0xCE, 0xCB, 0x6E, 0x01, 0x39, 0x75, 0x44, 0x35, 0x46, 0x95, 0x0B,
+0x94, 0x39, 0x5B, 0x71, 0xC3, 0x56, 0xB1, 0xF0, 0xEA, 0x5C, 0x44, 0xB6, 0xF3, 0x2A, 0x9D, 0xDF,
+0x98, 0xE4, 0x19, 0xE6, 0x57, 0xC3, 0x68, 0x58, 0x60, 0x31, 0x1E, 0xE4, 0x76, 0xE1, 0xF4, 0x29,
+0xA6, 0x6A, 0xBC, 0x46, 0xC3, 0x0E, 0x75, 0x5C, 0xEB, 0xF6, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x8C,
+0x06, 0x04, 0x94, 0xD8, 0x8D, 0x86, 0xB3, 0x70, 0x8B, 0x1D, 0x43, 0xDB, 0xE5, 0xAB, 0xE6, 0xB5,
+0x6D, 0x7B, 0x25, 0x31, 0x71, 0x36, 0x55, 0x22, 0x46, 0x88, 0xC2, 0xF7, 0x4C, 0x26, 0x97, 0x63,
+0x4E, 0xF2, 0xAC, 0x39, 0xA5, 0x2D, 0x5E, 0x7D, 0xA3, 0xF4, 0xE6, 0x23, 0x60, 0x2D, 0xF9, 0xF3,
+0xEB, 0x86, 0xB9, 0xDA, 0xEC, 0x36, 0xB1, 0x91, 0xB3, 0x1C, 0xEC, 0x24, 0x41, 0xD9, 0x20, 0x76,
+0xF3, 0x1A, 0xAA, 0xCD, 0xED, 0x8D, 0xD5, 0x52, 0xFD, 0x21, 0xD9, 0x13, 0x23, 0x61, 0x9B, 0x0F,
+0xB7, 0x22, 0x60, 0x03, 0x81, 0x13, 0x8C, 0xFC, 0x8D, 0x2A, 0x76, 0x11, 0x7F, 0x40, 0xF9, 0x91,
+0x66, 0xDA, 0x98, 0xE8, 0x55, 0xFB, 0xBD, 0x3B, 0xA2, 0xCE, 0x89, 0xCF, 0x1C, 0x67, 0x31, 0x5B,
+0x5B, 0xB5, 0xCF, 0x2A, 0x7E, 0xAE, 0xFF, 0x12, 0x5F, 0x1B, 0xF1, 0xD9, 0x13, 0x61, 0x50, 0x76,
+0x6C, 0x0C, 0x95, 0xBA, 0x6B, 0x1D, 0x10, 0xED, 0x60, 0xF6, 0x46, 0x5A, 0x93, 0xA6, 0xBA, 0x6A,
+0x73, 0xF7, 0xDC, 0x69, 0xA6, 0x30, 0x2F, 0x57, 0xFD, 0xEB, 0x92, 0x3D, 0x10, 0xB4, 0x7D, 0x45,
+0x40, 0x11, 0x50, 0x04, 0x52, 0x80, 0x80, 0x12, 0xBB, 0x14, 0x80, 0xAC, 0xBB, 0x08, 0x11, 0x60,
+0xD0, 0x02, 0x23, 0x61, 0xDF, 0x3D, 0x78, 0xC2, 0x5C, 0xEE, 0x44, 0x44, 0x26, 0x2A, 0x30, 0x78,
+0x33, 0xAC, 0x4F, 0x7D, 0x23, 0x4A, 0x56, 0x8C, 0x54, 0xE7, 0x64, 0xBC, 0x40, 0xD0, 0x0B, 0xBF,
+0x7B, 0xDF, 0xB4, 0xA8, 0xDF, 0x9D, 0xF7, 0x5B, 0xF3, 0xFE, 0x66, 0x5E, 0x06, 0xF4, 0x75, 0x1F,
+0x73, 0xB3, 0xB3, 0xCD, 0xB4, 0x49, 0x13, 0x64, 0xCE, 0xC3, 0xE7, 0x64, 0x4F, 0x0C, 0x14, 0xD9,
+0x77, 0xE2, 0xB4, 0x44, 0xE2, 0x92, 0xBC, 0x59, 0x85, 0xCD, 0x1D, 0x55, 0xBC, 0x4F, 0x9C, 0x7C,
+0x0F, 0xFD, 0xE2, 0x7A, 0xF8, 0xC7, 0x05, 0xBF, 0xBA, 0xA3, 0x76, 0xDB, 0x87, 0xEA, 0x9F, 0x4B,
+0xD0, 0xEC, 0x7C, 0x09, 0x83, 0xA0, 0x0A, 0x82, 0xC2, 0xF4, 0x26, 0x4C, 0x46, 0xDC, 0x7D, 0x5D,
+0x48, 0x61, 0x69, 0x71, 0x91, 0x59, 0x34, 0xE3, 0x36, 0x33, 0x75, 0xF2, 0x44, 0x35, 0xC3, 0x26,
+0x7B, 0x10, 0x68, 0xFB, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xA4, 0x08, 0x81, 0x11, 0x25, 0x76, 0xC9,
+0x36, 0x81, 0xA5, 0x08, 0x43, 0xDD, 0xCD, 0x20, 0x10, 0x60, 0x74, 0xE8, 0x36, 0xF8, 0xD5, 0x9D,
+0x38, 0x7F, 0x49, 0x04, 0x24, 0x92, 0x2D, 0xE6, 0xAE, 0x63, 0x44, 0x6C, 0x18, 0xE1, 0xE9, 0x7D,
+0xE5, 0xBC, 0xE9, 0x95, 0x4A, 0x14, 0xC5, 0x2C, 0x17, 0xF1, 0xE9, 0x54, 0x3A, 0xC9, 0x69, 0x17,
+0xE7, 0x67, 0xE7, 0x97, 0xC5, 0xE4, 0xBC, 0x73, 0x11, 0xA1, 0xDC, 0x17, 0x09, 0x50, 0x01, 0x54,
+0xBA, 0x7A, 0x54, 0x58, 0xA8, 0xC5, 0x9C, 0x83, 0x20, 0x8A, 0x64, 0x4F, 0x1D, 0xA8, 0x7D, 0x7B,
+0xF8, 0x54, 0x9B, 0x10, 0x3B, 0xAA, 0x75, 0xAC, 0xAE, 0x21, 0x73, 0x44, 0x79, 0x23, 0xD1, 0x12,
+0x05, 0xCE, 0x45, 0xC7, 0x5A, 0x35, 0xCE, 0xF9, 0xE3, 0xF1, 0x37, 0xAF, 0x40, 0x06, 0x79, 0xFA,
+0x9C, 0x1F, 0x9E, 0xC3, 0xC4, 0x47, 0xCC, 0x86, 0xB9, 0xED, 0x9C, 0x5F, 0xA1, 0xCF, 0xFB, 0x42,
+0x96, 0xDB, 0x7D, 0x4D, 0x94, 0x3C, 0x21, 0x95, 0xA8, 0x25, 0xDB, 0x50, 0x53, 0x65, 0xEE, 0xBB,
+0x63, 0xAE, 0x29, 0xD1, 0x68, 0xD8, 0x64, 0x0F, 0x01, 0x6D, 0x5F, 0x11, 0x50, 0x04, 0x14, 0x81,
+0x94, 0x21, 0x30, 0xA2, 0xC4, 0x2E, 0x65, 0xBD, 0xD4, 0x1D, 0x8D, 0x0A, 0x04, 0x48, 0xDE, 0x4E,
+0x81, 0xD0, 0x6D, 0x3B, 0x78, 0xDC, 0xB4, 0x5D, 0xB9, 0x1A, 0x04, 0x09, 0x88, 0x19, 0xD6, 0x55,
+0x9C, 0xF0, 0x6A, 0x1B, 0x0F, 0x58, 0xC8, 0x5C, 0x28, 0xBB, 0x05, 0x7D, 0xB0, 0x84, 0xC7, 0x7E,
+0xB5, 0xA1, 0x12, 0x5C, 0xCF, 0xCD, 0x4E, 0xA9, 0xF2, 0x2B, 0xDB, 0xD4, 0x21, 0xB6, 0x3E, 0x2C,
+0x27, 0x92, 0xBB, 0x2A, 0x54, 0x9A, 0x98, 0x80, 0xF2, 0x59, 0x36, 0x70, 0x22, 0xB9, 0x97, 0x00,
+0xC9, 0xDC, 0x29, 0xF8, 0x11, 0xD2, 0xEC, 0xEC, 0x6B, 0xE0, 0x06, 0x7E, 0x76, 0xD1, 0xB3, 0xD2,
+0xB3, 0x1B, 0xE1, 0xAF, 0x62, 0x4A, 0x8D, 0x6E, 0x15, 0xDB, 0x82, 0xE7, 0x6E, 0x51, 0xD5, 0x2E,
+0x02, 0x88, 0xFD, 0x08, 0xEC, 0xE9, 0xC3, 0xC8, 0xAA, 0x17, 0xD4, 0xF4, 0x4A, 0x51, 0x71, 0xE3,
+0x8E, 0x19, 0x8D, 0x66, 0xD6, 0x94, 0x49, 0x48, 0xD0, 0x9C, 0x7C, 0xD5, 0x72, 0x54, 0x0C, 0x40,
+0x3D, 0x08, 0x45, 0x40, 0x11, 0x50, 0x04, 0x6E, 0x01, 0x04, 0x92, 0xFB, 0x54, 0xEB, 0x03, 0x40,
+0xAD, 0x38, 0x71, 0x0B, 0x8C, 0xAE, 0xB8, 0x2E, 0xD2, 0x0C, 0x7B, 0x00, 0xB5, 0x52, 0xDF, 0x39,
+0x74, 0x5C, 0x14, 0xBA, 0x40, 0xAD, 0x83, 0x33, 0xBF, 0x98, 0x1F, 0xBD, 0xDD, 0x30, 0x12, 0xE9,
+0xEA, 0x15, 0x38, 0x9B, 0x06, 0x25, 0xEA, 0x4F, 0x67, 0xD5, 0xBC, 0x68, 0x2E, 0xBB, 0x68, 0xCE,
+0xBB, 0x50, 0xC1, 0xB2, 0xD1, 0xB0, 0x99, 0xE2, 0x77, 0x06, 0xFF, 0x3A, 0xA4, 0x36, 0x69, 0xAA,
+0xAE, 0x30, 0xC5, 0x08, 0x9A, 0x48, 0xC5, 0x44, 0x33, 0xEC, 0x5E, 0x94, 0x4C, 0xEB, 0x44, 0xDF,
+0xA9, 0x50, 0xDB, 0x00, 0x91, 0xD0, 0x5C, 0x1A, 0x1F, 0x01, 0x6B, 0x7F, 0xB3, 0x84, 0x35, 0x66,
+0xF6, 0x2A, 0x65, 0x24, 0x3A, 0xD6, 0xFB, 0xD4, 0xF9, 0x48, 0x5A, 0x8F, 0x87, 0x2D, 0x67, 0x61,
+0xC9, 0xAF, 0xC5, 0x87, 0xF9, 0x01, 0x51, 0x13, 0x16, 0x9F, 0xAF, 0x20, 0x02, 0x99, 0x6A, 0xDD,
+0x6D, 0xD5, 0x55, 0xE6, 0x4F, 0xEE, 0x9A, 0xA7, 0xB9, 0xEB, 0x52, 0x31, 0x08, 0x74, 0x1F, 0x8A,
+0x80, 0x22, 0xA0, 0x08, 0xA4, 0x10, 0x81, 0x11, 0x23, 0x76, 0x29, 0xEC, 0xA3, 0xEE, 0x6A, 0x14,
+0x20, 0x40, 0x82, 0x71, 0xFE, 0xD2, 0x55, 0xF3, 0xF6, 0xFE, 0xA3, 0xE6, 0xD8, 0xD9, 0x0B, 0x42,
+0x3A, 0x58, 0x80, 0xFE, 0x3A, 0x8B, 0xD0, 0xB3, 0x8C, 0x98, 0x23, 0x34, 0x41, 0x58, 0xAC, 0x57,
+0xEB, 0x62, 0x54, 0xAD, 0xB8, 0x3C, 0x75, 0x5E, 0xCD, 0x8B, 0x44, 0x88, 0x86, 0x61, 0xA7, 0x11,
+0xC5, 0xCF, 0x29, 0x75, 0x6C, 0x92, 0x35, 0x61, 0xA7, 0x4D, 0xAA, 0x34, 0x25, 0xF9, 0x79, 0x29,
+0x41, 0xE5, 0x0A, 0x88, 0xDD, 0x9E, 0xA3, 0xA7, 0x5D, 0x4A, 0x17, 0x17, 0xBD, 0xEA, 0x8E, 0x3B,
+0x50, 0x24, 0x23, 0x07, 0x1D, 0xAB, 0xBA, 0x85, 0x87, 0x28, 0x24, 0x8F, 0x18, 0x39, 0x62, 0x17,
+0x56, 0xA0, 0x70, 0x52, 0x1F, 0x57, 0xB5, 0x9C, 0x31, 0x42, 0xE8, 0xEC, 0x6F, 0x3E, 0x90, 0x82,
+0x66, 0xDA, 0x92, 0xFC, 0x7C, 0x98, 0xA1, 0x2B, 0xCC, 0x9D, 0x33, 0x1B, 0xCD, 0x9C, 0xC6, 0x49,
+0x5A, 0x69, 0x22, 0x25, 0xA3, 0x40, 0x77, 0xA2, 0x08, 0x28, 0x02, 0x8A, 0x40, 0xEA, 0x10, 0x18,
+0x31, 0x62, 0xA7, 0xFE, 0x75, 0xA9, 0x3B, 0xC9, 0xA3, 0x61, 0x4F, 0xCC, 0xE5, 0x76, 0xEC, 0xF4,
+0x79, 0xB3, 0x7A, 0xFB, 0x7E, 0xA7, 0x5E, 0x21, 0xE3, 0x06, 0x1C, 0xF9, 0xBB, 0x98, 0x28, 0x97,
+0xA4, 0xC5, 0xF9, 0xBF, 0x59, 0x13, 0xAB, 0x57, 0xEF, 0xAC, 0x76, 0x15, 0xA8, 0x6F, 0xBE, 0x5E,
+0xAC, 0x53, 0xEF, 0xE8, 0x47, 0x27, 0xB5, 0x55, 0x03, 0xDF, 0x3B, 0x1F, 0x51, 0x2A, 0x9B, 0xD9,
+0xDC, 0x75, 0xAE, 0x5D, 0x5B, 0x71, 0xE2, 0x86, 0x44, 0xC4, 0xCE, 0xAC, 0xAB, 0x82, 0x52, 0x95,
+0x22, 0x62, 0x07, 0x9F, 0xC2, 0x3D, 0x47, 0x4F, 0x49, 0xA5, 0x0B, 0xE9, 0x99, 0x90, 0xD0, 0x48,
+0xBF, 0x7C, 0x5D, 0xD7, 0x48, 0x7D, 0x57, 0x1B, 0x10, 0x12, 0xF6, 0x5B, 0x36, 0x72, 0x7D, 0x0D,
+0xFE, 0xCA, 0xEF, 0x6C, 0xCF, 0xE5, 0xF4, 0xF3, 0xFE, 0x79, 0xCE, 0xEF, 0x50, 0xF2, 0xD5, 0x91,
+0xD0, 0x92, 0xCC, 0x3A, 0xB6, 0x48, 0x2C, 0xA6, 0xA2, 0x74, 0xD8, 0xFB, 0xE6, 0x4E, 0x35, 0x8F,
+0x2D, 0x51, 0xB5, 0x6E, 0x34, 0x5C, 0x17, 0x7A, 0x0C, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x0C, 0x37,
+0x02, 0x23, 0x46, 0xEC, 0x86, 0xBB, 0x23, 0xDA, 0xDE, 0xE8, 0x45, 0x80, 0x84, 0x8A, 0x09, 0x7A,
+0xB7, 0xEE, 0x3B, 0x2A, 0xF5, 0x52, 0xC5, 0x0C, 0x0F, 0xF3, 0x60, 0x37, 0x88, 0x5D, 0x37, 0x23,
+0x35, 0x03, 0xB5, 0x2E, 0xDA, 0x87, 0x88, 0x12, 0xE5, 0xFD, 0xE8, 0x2C, 0x5F, 0x0B, 0x7D, 0xEF,
+0x62, 0x56, 0x77, 0xA6, 0xC7, 0x60, 0x59, 0xE0, 0x74, 0x27, 0x71, 0x14, 0x4C, 0x4A, 0x4C, 0x62,
+0x53, 0x0A, 0xBF, 0xBA, 0x6A, 0x54, 0x5A, 0xC8, 0xCB, 0x49, 0x7E, 0x32, 0x5E, 0x9A, 0x5D, 0x99,
+0xDA, 0xE5, 0xF8, 0xD9, 0x8B, 0x12, 0x2C, 0xE1, 0x6B, 0xC3, 0x5A, 0x5A, 0xD7, 0x97, 0xDF, 0x5C,
+0x22, 0x7F, 0x3A, 0xDB, 0xB1, 0xE0, 0x17, 0x9A, 0x58, 0xE5, 0x9F, 0x5F, 0xEA, 0x3B, 0x1E, 0x46,
+0xD4, 0x92, 0xCC, 0x32, 0xF9, 0x32, 0xFF, 0xD1, 0x97, 0xB0, 0x71, 0xE2, 0x78, 0xB3, 0x64, 0xE6,
+0x14, 0xB3, 0x0C, 0xC4, 0x6E, 0xCE, 0x94, 0x1A, 0x55, 0xEB, 0x46, 0xEF, 0x25, 0xA3, 0x47, 0xA6,
+0x08, 0x28, 0x02, 0x8A, 0xC0, 0x4D, 0x23, 0x30, 0x22, 0xC4, 0x4E, 0xFD, 0xEB, 0x6E, 0xFA, 0x7C,
+0x8D, 0xC9, 0x0D, 0xA9, 0xD6, 0x1D, 0x39, 0x75, 0xCE, 0xBC, 0xBC, 0x65, 0x97, 0xB9, 0x8A, 0x64,
+0xBD, 0x24, 0x59, 0xD7, 0xE1, 0x57, 0x47, 0x52, 0xE7, 0x03, 0x21, 0x02, 0x55, 0xCE, 0x13, 0x37,
+0x1A, 0x10, 0xBD, 0x5F, 0x99, 0xA7, 0x33, 0xCE, 0x14, 0x29, 0xEB, 0xBA, 0x7C, 0x77, 0x52, 0xBD,
+0x44, 0x24, 0x2E, 0xC9, 0x3E, 0x1C, 0x98, 0x2A, 0x83, 0x3C, 0x76, 0xF8, 0x9D, 0xFE, 0x75, 0x9C,
+0x48, 0x6E, 0x6A, 0xC6, 0x97, 0x82, 0xD0, 0xE4, 0x24, 0x3D, 0x29, 0x31, 0xF7, 0xC7, 0xBA, 0xB0,
+0xAD, 0x6D, 0x17, 0xCD, 0x85, 0xAB, 0x57, 0x83, 0x7E, 0x46, 0x7D, 0xEA, 0x2C, 0xC1, 0x0D, 0x67,
+0xFB, 0xDD, 0xFB, 0xC7, 0xC5, 0xE6, 0xA8, 0x0B, 0x7C, 0x09, 0x1D, 0x26, 0xBD, 0x7D, 0xF7, 0x55,
+0x39, 0x58, 0x3A, 0x8D, 0xEA, 0x64, 0x36, 0xFA, 0x4C, 0xF2, 0x97, 0x33, 0x6E, 0x9C, 0xB9, 0x6F,
+0x7E, 0x93, 0x79, 0xFF, 0x3D, 0xF3, 0xCC, 0xD2, 0xD9, 0x53, 0x4D, 0x91, 0xE6, 0xAD, 0x1B, 0x93,
+0xD7, 0x92, 0x1E, 0xB4, 0x22, 0xA0, 0x08, 0x28, 0x02, 0xFD, 0x21, 0x30, 0x22, 0xC4, 0xAE, 0xBF,
+0x83, 0xD2, 0xDF, 0xD3, 0x07, 0x01, 0xEB, 0x5B, 0xD7, 0x6E, 0xB6, 0xEC, 0x3D, 0x6A, 0x9A, 0x51,
+0x6D, 0x82, 0xCA, 0xD5, 0x0D, 0x46, 0x68, 0x42, 0xAD, 0xBB, 0x11, 0xAD, 0x34, 0x61, 0x6D, 0xB0,
+0x96, 0x82, 0x09, 0x81, 0x73, 0xAA, 0x56, 0x3C, 0x14, 0xF1, 0xBE, 0x77, 0xCE, 0x74, 0xDB, 0x73,
+0xB5, 0x30, 0x72, 0x96, 0x44, 0x92, 0xAD, 0xD1, 0xBF, 0xAE, 0x11, 0x29, 0x4E, 0xF2, 0x73, 0x93,
+0xAF, 0xD6, 0xF1, 0x78, 0x3A, 0x40, 0x62, 0x5B, 0x4E, 0x9E, 0x33, 0x57, 0x3A, 0x91, 0x3B, 0x0E,
+0x53, 0x97, 0x04, 0x31, 0xF8, 0xA0, 0x06, 0xA7, 0xBE, 0x45, 0x89, 0x9A, 0x0F, 0x10, 0x89, 0x3A,
+0x0A, 0x3A, 0x55, 0x2E, 0xAA, 0xCD, 0x59, 0xD5, 0xCE, 0xF9, 0x1B, 0x06, 0xED, 0x85, 0xDF, 0xAD,
+0xF9, 0x35, 0xD3, 0x8C, 0x63, 0xC4, 0x2F, 0x56, 0x26, 0x91, 0x9D, 0xD7, 0x50, 0x63, 0xEE, 0x9D,
+0x75, 0x9B, 0x99, 0x87, 0xF2, 0x61, 0x75, 0x92, 0xE6, 0x25, 0x35, 0x18, 0xA4, 0xCF, 0x48, 0xD6,
+0x9E, 0x28, 0x02, 0x8A, 0x80, 0x22, 0x30, 0x36, 0x10, 0x50, 0x62, 0x37, 0x36, 0xCE, 0xD3, 0x98,
+0x3D, 0x4A, 0x46, 0xBF, 0x1E, 0x86, 0x5A, 0xF7, 0xDB, 0xAD, 0x3B, 0x41, 0x70, 0xAE, 0x89, 0x5A,
+0xD7, 0xD5, 0x75, 0x4D, 0x02, 0x27, 0x84, 0x93, 0x39, 0x5F, 0x38, 0x4B, 0xE3, 0xAC, 0xFA, 0x26,
+0x3E, 0x73, 0x3E, 0x2A, 0x54, 0x08, 0x9F, 0x4B, 0x6A, 0x22, 0xBE, 0x66, 0xFE, 0xBB, 0x55, 0xBA,
+0x6C, 0x44, 0x68, 0xA8, 0xEE, 0x79, 0x25, 0xCB, 0xAA, 0x7A, 0x96, 0x02, 0x89, 0x1F, 0x9E, 0xF3,
+0xAF, 0x9B, 0x05, 0xFF, 0xBA, 0x7C, 0x10, 0x9D, 0x54, 0x4C, 0x57, 0xE0, 0x5F, 0x67, 0x2B, 0x4E,
+0x20, 0x47, 0x1F, 0x23, 0x62, 0x49, 0xC2, 0xA4, 0x40, 0x84, 0xCB, 0x57, 0x17, 0x5F, 0x61, 0x42,
+0xBA, 0x12, 0x89, 0xF4, 0x75, 0xA4, 0x4F, 0xAA, 0x70, 0x78, 0xF5, 0xD2, 0xAB, 0x96, 0xCE, 0xDF,
+0xD0, 0xBA, 0xD2, 0xB9, 0xFA, 0xB8, 0x8E, 0x18, 0x8F, 0xCB, 0xCA, 0x12, 0x85, 0x8E, 0xCB, 0xAF,
+0x01, 0xFF, 0x8A, 0xE2, 0x02, 0xF3, 0xE4, 0xD2, 0xDB, 0xCD, 0xE2, 0xE9, 0xF5, 0x52, 0x42, 0xCD,
+0x72, 0x67, 0xA7, 0x7A, 0xA6, 0x02, 0x08, 0xDD, 0x87, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x40,
+0xCA, 0x10, 0x50, 0x62, 0x97, 0x32, 0xA8, 0x6F, 0xBD, 0x1D, 0x91, 0xD4, 0xB5, 0x22, 0x6F, 0xDD,
+0xA6, 0xDD, 0x87, 0xCD, 0x7B, 0x20, 0x38, 0x24, 0x19, 0xA2, 0xD6, 0x31, 0xBD, 0x09, 0x23, 0x61,
+0x83, 0x29, 0xEA, 0x4F, 0xE7, 0x68, 0x8A, 0x5F, 0x14, 0x55, 0xF2, 0x2C, 0x25, 0x91, 0xFF, 0x1D,
+0x67, 0x0B, 0xBE, 0xDB, 0x80, 0x03, 0x6B, 0xD9, 0x0C, 0x04, 0x2F, 0xD7, 0xBE, 0xAF, 0x38, 0x91,
+0x8F, 0x2A, 0x13, 0xAC, 0x11, 0x9B, 0x9B, 0x82, 0xA4, 0xC4, 0xDC, 0x35, 0x89, 0xEC, 0x81, 0xD6,
+0xB3, 0x92, 0x3B, 0x8E, 0x07, 0x15, 0x9F, 0xC7, 0xCE, 0xF7, 0x26, 0xF4, 0x06, 0x8C, 0x3D, 0xFE,
+0x28, 0x99, 0xF3, 0x5D, 0x97, 0x7E, 0x47, 0x27, 0xF7, 0x3D, 0x0B, 0x0C, 0x6F, 0x9C, 0xF3, 0xA9,
+0x13, 0xA5, 0x4E, 0x1A, 0xBF, 0x61, 0x26, 0x96, 0x15, 0x9B, 0x3B, 0xA7, 0xD5, 0x9B, 0x25, 0xB3,
+0x1A, 0xCC, 0xA4, 0xCA, 0x32, 0x55, 0xEA, 0x6E, 0xBD, 0xCB, 0x50, 0x7B, 0xAC, 0x08, 0x28, 0x02,
+0xB7, 0x18, 0x02, 0x29, 0x27, 0x76, 0xAA, 0x14, 0xDC, 0x3A, 0x23, 0x8C, 0x91, 0xA0, 0xCD, 0x2D,
+0x27, 0xCD, 0xAF, 0x37, 0x36, 0x9B, 0xF6, 0x8E, 0x4E, 0x71, 0xE4, 0xEF, 0x86, 0x5A, 0x27, 0x91,
+0xB0, 0x30, 0x4B, 0x86, 0x7E, 0x75, 0x61, 0xC5, 0x05, 0x1B, 0x48, 0x61, 0xAB, 0x26, 0xD8, 0xDC,
+0x76, 0x61, 0x74, 0xA8, 0xA8, 0x59, 0x3E, 0x62, 0x56, 0xD4, 0x2F, 0xCB, 0xE4, 0xEC, 0x98, 0x0A,
+0x67, 0xAB, 0x88, 0x59, 0x95, 0x4E, 0x72, 0xD8, 0x81, 0xE8, 0x50, 0x31, 0x63, 0xEE, 0x3A, 0x26,
+0x26, 0xA6, 0xA2, 0x95, 0xEC, 0x89, 0xFB, 0xBE, 0x82, 0x3E, 0x9F, 0x38, 0x87, 0xC0, 0x09, 0x92,
+0xD9, 0x88, 0xFA, 0x16, 0x93, 0x63, 0xCF, 0x29, 0x70, 0x61, 0xFE, 0x3A, 0xBA, 0x0B, 0xDA, 0xE8,
+0x5E, 0x89, 0xE8, 0x8D, 0x46, 0xFD, 0xBA, 0x3C, 0x7F, 0x51, 0x55, 0x92, 0x9F, 0x69, 0x69, 0x26,
+0x99, 0xCB, 0xCE, 0x1A, 0x07, 0xD2, 0x9A, 0x6D, 0x48, 0xF2, 0x88, 0x3D, 0xF7, 0x79, 0x67, 0x53,
+0x9D, 0x79, 0x6A, 0xC5, 0x02, 0x53, 0x0B, 0x42, 0xCB, 0xF5, 0x82, 0x6D, 0x5D, 0xD4, 0x6C, 0xB2,
+0x71, 0xD0, 0xF6, 0x15, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x52, 0x8B, 0x40, 0xCA, 0x89, 0x5D,
+0x6A, 0xBB, 0xA7, 0x7B, 0x1B, 0x29, 0x04, 0xAE, 0xC2, 0xAF, 0xEC, 0xE0, 0x89, 0xB3, 0x66, 0xE3,
+0xAE, 0x16, 0xF1, 0xAD, 0x13, 0xD5, 0x8A, 0xA5, 0xC3, 0x48, 0xEA, 0xE0, 0x5B, 0xE7, 0xA3, 0x5B,
+0x7D, 0xDE, 0x36, 0x6B, 0x7A, 0xB5, 0x2A, 0x93, 0x9F, 0xC2, 0x65, 0x76, 0x89, 0xAF, 0x32, 0xE1,
+0x13, 0xF8, 0x8A, 0x34, 0xE7, 0xE4, 0xAE, 0x68, 0x5E, 0xB7, 0x20, 0x17, 0x9C, 0x90, 0x1E, 0xFB,
+0x6D, 0x1C, 0x58, 0xCD, 0xE4, 0xF1, 0x25, 0x92, 0x90, 0xD7, 0xFA, 0xDC, 0x25, 0x77, 0x22, 0xB1,
+0x3A, 0x8E, 0x7C, 0x7D, 0x17, 0x50, 0x61, 0x83, 0x04, 0x8B, 0x73, 0x30, 0x25, 0x50, 0x15, 0xE3,
+0x8F, 0x28, 0xF6, 0x7B, 0x1C, 0x26, 0xDE, 0x1C, 0x8B, 0x06, 0x49, 0xE2, 0x48, 0x98, 0x19, 0x18,
+0xC2, 0xD9, 0x1A, 0xB4, 0x6F, 0x98, 0x32, 0xA4, 0x73, 0xB9, 0xBD, 0x11, 0x7E, 0x75, 0xB3, 0x1B,
+0xCC, 0x82, 0xDB, 0x26, 0x49, 0x95, 0x0D, 0x4D, 0x31, 0x94, 0xDC, 0x73, 0xAE, 0xAD, 0x2B, 0x02,
+0x8A, 0x80, 0x22, 0x30, 0x1A, 0x10, 0x48, 0x39, 0xB1, 0xD3, 0x87, 0xCB, 0x68, 0x38, 0xED, 0xC9,
+0x3F, 0x06, 0x06, 0x4C, 0xAC, 0xDD, 0x71, 0xD0, 0xFC, 0xEE, 0xAD, 0xDD, 0x88, 0x0E, 0xED, 0x16,
+0xD2, 0x41, 0x52, 0x77, 0x03, 0x01, 0x05, 0x36, 0x88, 0xD5, 0x46, 0xB1, 0xFA, 0x20, 0x00, 0xAF,
+0x62, 0x79, 0xA5, 0xCD, 0xAA, 0x6D, 0xFC, 0x67, 0x6D, 0xAC, 0xFC, 0x67, 0x73, 0xBB, 0x59, 0x05,
+0xCF, 0xE6, 0x69, 0xF3, 0xCA, 0x96, 0x0F, 0x1C, 0xF0, 0xBF, 0xDB, 0x54, 0x22, 0x3E, 0xCD, 0x09,
+0x9B, 0xA0, 0x4A, 0x37, 0xA3, 0x96, 0xFE, 0x75, 0xA9, 0x29, 0x9F, 0xC5, 0x9A, 0xB8, 0x3B, 0x69,
+0x7E, 0x76, 0xFE, 0x75, 0x0C, 0x1A, 0xB1, 0x44, 0xD4, 0xFB, 0xD7, 0x85, 0x2A, 0xA5, 0x8F, 0x8E,
+0x8D, 0x46, 0xBA, 0xC6, 0xAA, 0x7A, 0xE2, 0x98, 0xE7, 0xD4, 0x49, 0x4B, 0x70, 0xA9, 0x50, 0x92,
+0xD4, 0xD1, 0xAC, 0x4C, 0x95, 0x8E, 0x81, 0x21, 0xEC, 0x2F, 0x09, 0x25, 0xE7, 0x69, 0x35, 0x15,
+0xE6, 0xAF, 0x1E, 0xB8, 0xD3, 0xAC, 0x98, 0x37, 0x15, 0xB5, 0x71, 0x73, 0x02, 0x9F, 0x3A, 0xAF,
+0x02, 0x26, 0x7F, 0x04, 0xE8, 0x1E, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x46, 0x02, 0x81,
+0x94, 0x13, 0xBB, 0x91, 0xE8, 0xA4, 0xEE, 0x33, 0x75, 0x08, 0xB4, 0x5F, 0xED, 0x34, 0xBB, 0x8E,
+0x9C, 0x12, 0xBF, 0xBA, 0x0D, 0xBB, 0x0E, 0x99, 0x7D, 0x27, 0xCF, 0x4A, 0x49, 0x2B, 0x44, 0x4C,
+0xA0, 0x06, 0x3D, 0x88, 0x1D, 0xF3, 0xD6, 0x05, 0x4A, 0x9B, 0x73, 0x8A, 0x13, 0xCE, 0x13, 0x9A,
+0x55, 0xA3, 0x29, 0x40, 0xFC, 0xE7, 0x68, 0xD5, 0x85, 0x44, 0xBF, 0xC7, 0xA7, 0x0E, 0xF1, 0xA6,
+0xCD, 0xCC, 0xCC, 0x2C, 0x11, 0xF5, 0x72, 0x50, 0x4A, 0x6C, 0xDA, 0xE4, 0xCA, 0x94, 0xE4, 0xAF,
+0x23, 0xDA, 0x2C, 0x25, 0xB6, 0xE7, 0xD8, 0x69, 0xA4, 0x75, 0xB1, 0xBE, 0x84, 0xAC, 0xAE, 0xE1,
+0x33, 0xCC, 0xF9, 0xC0, 0x10, 0x4F, 0xF4, 0xE2, 0xFB, 0x13, 0xD6, 0xC8, 0x75, 0x01, 0x22, 0x42,
+0x84, 0x6D, 0xB2, 0x61, 0x9F, 0x9B, 0x8E, 0x44, 0x95, 0x64, 0x8E, 0x66, 0x66, 0x76, 0x90, 0x29,
+0x65, 0x38, 0x51, 0xA9, 0x9B, 0x5B, 0x3F, 0xD1, 0xDC, 0x83, 0x7C, 0x75, 0xF7, 0xCC, 0x6C, 0x30,
+0x0D, 0xC8, 0x5D, 0xC7, 0x32, 0x6A, 0x3A, 0x29, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xDC, 0x1A,
+0x08, 0x28, 0xB1, 0xBB, 0x35, 0xCE, 0x73, 0x4A, 0x7A, 0x49, 0x73, 0x23, 0x0B, 0xDE, 0xBF, 0xF0,
+0xE6, 0x76, 0xF3, 0xE3, 0x55, 0x5B, 0xCD, 0x16, 0x94, 0x0F, 0x13, 0x42, 0x82, 0xFF, 0xAE, 0x5F,
+0xEB, 0x30, 0x5D, 0xD7, 0x3A, 0x25, 0x68, 0x22, 0x4A, 0xC2, 0x02, 0xA5, 0x2E, 0xF0, 0x41, 0x73,
+0x09, 0x8B, 0x23, 0x91, 0xA0, 0x89, 0x48, 0x5D, 0x50, 0x5A, 0xCB, 0xAF, 0xE7, 0xD2, 0x7F, 0xC4,
+0xA8, 0x5E, 0x62, 0xA6, 0xE4, 0x10, 0xBF, 0x01, 0x55, 0x6B, 0x9C, 0x69, 0x44, 0xD5, 0x85, 0xBC,
+0x14, 0x29, 0x76, 0xCC, 0xD7, 0xB7, 0x1F, 0x75, 0x71, 0x99, 0xCB, 0x4E, 0x54, 0x3A, 0xF4, 0xDB,
+0x47, 0xB7, 0xFA, 0x92, 0xB8, 0x3E, 0xD2, 0xC3, 0x9B, 0x4F, 0xED, 0x49, 0x72, 0x91, 0xC1, 0x01,
+0x0D, 0xB4, 0xA6, 0x55, 0xE2, 0x48, 0x85, 0x2E, 0x5B, 0x22, 0x5E, 0xB3, 0x4D, 0x2E, 0x66, 0x92,
+0x3B, 0x62, 0x7E, 0x15, 0x84, 0xB9, 0xFD, 0x6A, 0x87, 0xB4, 0x3F, 0x03, 0xE5, 0xD2, 0x3E, 0xBE,
+0x72, 0xB1, 0x79, 0xE2, 0xEE, 0x39, 0x66, 0x7C, 0x49, 0xA1, 0x35, 0xCD, 0x6A, 0x04, 0x6C, 0x4A,
+0xC6, 0xBF, 0xEE, 0x44, 0x11, 0x50, 0x04, 0x14, 0x81, 0xD1, 0x80, 0x80, 0x12, 0xBB, 0xD1, 0x70,
+0x16, 0xD2, 0xE0, 0x18, 0x68, 0xFE, 0x6B, 0x81, 0x3A, 0xB7, 0xA1, 0xF9, 0x90, 0x59, 0xD7, 0x7C,
+0xD0, 0xBC, 0xBD, 0xEF, 0x98, 0x39, 0x71, 0xFE, 0x22, 0x7A, 0xE6, 0xCC, 0xA9, 0x24, 0x17, 0x20,
+0x59, 0x99, 0x48, 0xC3, 0x21, 0x33, 0x48, 0x49, 0x26, 0x9C, 0xFD, 0x65, 0xF6, 0xCB, 0xA0, 0x2C,
+0x65, 0xC9, 0x32, 0xFE, 0xD6, 0x73, 0xCE, 0x82, 0x42, 0x95, 0x85, 0xE5, 0x32, 0x43, 0x89, 0x8B,
+0xCE, 0x24, 0x39, 0xF6, 0x77, 0x3F, 0x53, 0xD1, 0xCA, 0x72, 0x26, 0xDF, 0x0C, 0xA9, 0x36, 0x51,
+0x25, 0x81, 0x13, 0xC9, 0x1F, 0xF2, 0x0C, 0x96, 0x38, 0x7F, 0xF9, 0x0A, 0x92, 0x13, 0x5F, 0x82,
+0x52, 0x67, 0x95, 0x34, 0x51, 0xDA, 0x90, 0x5B, 0x4E, 0xFC, 0xE1, 0xF8, 0x57, 0x66, 0xEF, 0x1F,
+0x67, 0x09, 0x28, 0xFD, 0x00, 0x39, 0x7B, 0x9F, 0x39, 0x06, 0x44, 0x44, 0x67, 0xDB, 0x6F, 0x1B,
+0x08, 0x42, 0x81, 0x93, 0x2A, 0x1D, 0xD3, 0x9A, 0xD4, 0x22, 0xE9, 0xF2, 0xED, 0xA8, 0xFB, 0x7A,
+0xF7, 0x8C, 0x3A, 0xE4, 0xAA, 0x6B, 0x80, 0x5F, 0xDD, 0x14, 0x33, 0x83, 0x69, 0x5D, 0x72, 0x53,
+0x63, 0x76, 0x4E, 0x83, 0xE1, 0xAB, 0x5D, 0x50, 0x04, 0x14, 0x01, 0x45, 0x20, 0x6D, 0x10, 0xC0,
+0x4B, 0x7E, 0xD4, 0xAB, 0x3B, 0xB9, 0xFD, 0x52, 0xE5, 0x20, 0xB9, 0xF8, 0x8E, 0x64, 0xEB, 0x6D,
+0x20, 0x32, 0xBF, 0x5A, 0xF7, 0xAE, 0xF9, 0xF9, 0xDA, 0x6D, 0x66, 0x1F, 0x82, 0x26, 0xDA, 0x61,
+0x8A, 0xB4, 0x11, 0x9B, 0xF4, 0x0D, 0x73, 0x29, 0x4E, 0x82, 0xA1, 0x16, 0x17, 0x2A, 0xC0, 0x55,
+0xDC, 0xC1, 0x5B, 0xF5, 0xCA, 0x4E, 0xDC, 0x94, 0x86, 0xCC, 0x30, 0xC0, 0x82, 0x3F, 0x86, 0x21,
+0x14, 0xD1, 0x6D, 0x6C, 0xAE, 0x13, 0x8F, 0x00, 0xFD, 0xF7, 0x40, 0x90, 0x40, 0xE2, 0xA8, 0x68,
+0x65, 0x80, 0x44, 0x3D, 0xB5, 0x6C, 0xBE, 0xF9, 0xE2, 0x87, 0x57, 0x4A, 0xFA, 0x8F, 0x64, 0x4F,
+0x34, 0xC3, 0xAE, 0xDA, 0xB6, 0xD7, 0xFC, 0xC3, 0xF7, 0x5E, 0x04, 0xC1, 0xBB, 0x2A, 0x44, 0xAC,
+0xCB, 0xE5, 0xED, 0x8B, 0xF6, 0x3C, 0x9A, 0xB9, 0xC4, 0x7A, 0x0C, 0x46, 0x27, 0x46, 0xC4, 0x86,
+0x40, 0xF8, 0x8F, 0xDC, 0x86, 0x79, 0xF1, 0x3A, 0x61, 0xE2, 0xA5, 0x79, 0xB7, 0xBE, 0xB2, 0xD4,
+0xDC, 0x0F, 0x3F, 0xBA, 0x7B, 0x66, 0x4D, 0x31, 0x35, 0x15, 0x25, 0xA6, 0x02, 0x2A, 0x5D, 0x2D,
+0xD2, 0x9A, 0x14, 0xE6, 0xA5, 0xA6, 0xBA, 0x46, 0xB2, 0xB1, 0xD4, 0xF6, 0x15, 0x01, 0x45, 0x40,
+0x11, 0x50, 0x04, 0x06, 0x87, 0x40, 0xF2, 0xE5, 0x8B, 0xC1, 0x1D, 0x8F, 0xAE, 0x3D, 0xC6, 0x10,
+0xA0, 0xA9, 0xB1, 0xA5, 0xF5, 0x9C, 0x79, 0x73, 0xE7, 0x21, 0xB3, 0x66, 0xC7, 0x7E, 0xF3, 0xD6,
+0xFE, 0x63, 0xE6, 0xCC, 0xC5, 0x76, 0x38, 0xF0, 0xD3, 0xE4, 0xCA, 0xA4, 0xBC, 0x56, 0x59, 0xBA,
+0x01, 0x72, 0x65, 0xA0, 0xC6, 0xD9, 0x19, 0x3E, 0x5F, 0x9C, 0xA1, 0xBA, 0xF9, 0xCF, 0x19, 0x54,
+0xD7, 0xFC, 0xF2, 0xC8, 0xEF, 0x19, 0x5C, 0x27, 0xE1, 0x0C, 0xE5, 0x8A, 0xEA, 0x95, 0x9F, 0xD1,
+0x7E, 0xF4, 0x3B, 0x9C, 0xCF, 0x82, 0xDA, 0xAC, 0x93, 0xA0, 0xD6, 0xCD, 0x47, 0x6D, 0xD4, 0x82,
+0x14, 0x99, 0x61, 0x85, 0x7C, 0xA1, 0xFF, 0xC4, 0x80, 0x24, 0x4C, 0x54, 0xBB, 0x48, 0xFA, 0x12,
+0x5B, 0xFE, 0x2C, 0x4C, 0x67, 0x12, 0x04, 0x34, 0xB8, 0xE5, 0x96, 0xD1, 0x85, 0x49, 0x87, 0xD9,
+0x1E, 0x31, 0x64, 0x3B, 0x54, 0xF9, 0x4A, 0x0B, 0x72, 0xCD, 0x94, 0xAA, 0x32, 0xB3, 0x70, 0xEA,
+0x64, 0xD4, 0x7E, 0x6D, 0x40, 0x89, 0xB0, 0x46, 0xD4, 0x7F, 0x6D, 0x94, 0xCF, 0x0C, 0x10, 0x61,
+0x12, 0x62, 0x0D, 0x52, 0x1A, 0x63, 0x17, 0x92, 0x1E, 0xAE, 0x22, 0xA0, 0x08, 0x28, 0x02, 0xC3,
+0x84, 0x80, 0x2A, 0x76, 0xC3, 0x04, 0xE4, 0xAD, 0xDA, 0xCC, 0x85, 0xF6, 0xAB, 0xF0, 0xA9, 0xDB,
+0x01, 0xA5, 0xEE, 0x1D, 0x09, 0x9A, 0x38, 0x7B, 0xB9, 0x5D, 0x48, 0x09, 0x95, 0xBA, 0x80, 0x5C,
+0xF8, 0x88, 0xD0, 0x38, 0x4D, 0x2A, 0xC0, 0x2C, 0x4E, 0xC0, 0x4B, 0xA4, 0xDE, 0x71, 0x5D, 0x59,
+0x2D, 0x2A, 0xCC, 0x79, 0x41, 0x2B, 0x01, 0xF8, 0x0C, 0x22, 0xED, 0x02, 0xA9, 0xCA, 0x83, 0xA9,
+0xF2, 0x4F, 0xEF, 0x9C, 0x6D, 0x3E, 0xF7, 0xC4, 0xBD, 0x30, 0x4F, 0x4E, 0x4C, 0x89, 0x29, 0x96,
+0x66, 0xE9, 0x0D, 0x3B, 0x0F, 0x9A, 0xCF, 0xFE, 0xDB, 0xB3, 0xE6, 0xD4, 0x85, 0xCB, 0xB2, 0xCF,
+0xDE, 0xFA, 0xE4, 0x0F, 0x3D, 0x3E, 0xDD, 0x89, 0x58, 0x70, 0x9D, 0xC2, 0x49, 0xD5, 0x91, 0xE6,
+0x5D, 0x92, 0xBA, 0xF1, 0xC5, 0xF9, 0xA6, 0xA9, 0xBA, 0xC2, 0x2C, 0x9A, 0x5A, 0x6B, 0x16, 0x4F,
+0xAB, 0x43, 0x7E, 0xBA, 0x32, 0x31, 0x33, 0x57, 0x42, 0xA9, 0xA3, 0x1F, 0x61, 0xD0, 0x9E, 0xE6,
+0xA9, 0xBB, 0x55, 0x2F, 0x49, 0xED, 0xB7, 0x22, 0xA0, 0x08, 0xDC, 0xE2, 0x08, 0x28, 0xB1, 0xBB,
+0xC5, 0x07, 0xC0, 0x50, 0xBB, 0x7F, 0xBA, 0xED, 0xB2, 0xF9, 0xE6, 0x6F, 0xD6, 0x99, 0xE7, 0xD6,
+0x6D, 0x33, 0x97, 0x3A, 0x3B, 0x4D, 0x1E, 0xC8, 0x45, 0x26, 0xD5, 0x39, 0xCB, 0xC1, 0x7A, 0xA3,
+0x72, 0x43, 0xDD, 0xED, 0x80, 0xB6, 0x67, 0x34, 0x28, 0xD5, 0xBA, 0x27, 0xEF, 0x9D, 0x6F, 0xDE,
+0xBF, 0x74, 0x1E, 0x72, 0xD8, 0xE5, 0x0D, 0x68, 0xBB, 0xA1, 0xAE, 0x44, 0x65, 0x6D, 0xF7, 0xE1,
+0x93, 0xE6, 0x7F, 0xFC, 0xF0, 0x65, 0xB3, 0xF7, 0xF8, 0x99, 0xC1, 0x37, 0xC7, 0x40, 0x09, 0xF8,
+0xDA, 0xF9, 0xC4, 0xCA, 0xF4, 0xBB, 0x63, 0x54, 0x6F, 0x21, 0xD2, 0x96, 0x54, 0x95, 0x16, 0x9A,
+0x69, 0x08, 0x90, 0x20, 0xA9, 0xBB, 0x13, 0x73, 0x79, 0x71, 0x61, 0x4C, 0x5E, 0x3E, 0xEF, 0x59,
+0xA1, 0x8A, 0xDD, 0xE0, 0x61, 0xD7, 0x2D, 0x14, 0x01, 0x45, 0x40, 0x11, 0x48, 0x07, 0x04, 0x52,
+0x4A, 0xEC, 0xE4, 0x61, 0xAF, 0x11, 0x7A, 0xE9, 0x30, 0x6E, 0x82, 0x3E, 0x9C, 0x44, 0x65, 0x85,
+0x6F, 0xFE, 0x7A, 0x2D, 0xFC, 0xEA, 0x4E, 0x0B, 0x93, 0xCB, 0xCA, 0x0A, 0xBD, 0xC5, 0x46, 0x8A,
+0xD8, 0x71, 0xBF, 0x54, 0x0C, 0x27, 0x21, 0x21, 0xF1, 0x5D, 0xA8, 0x8F, 0x3A, 0x1F, 0x09, 0x7A,
+0xA9, 0x6C, 0xA5, 0x2A, 0xED, 0x07, 0x85, 0xB6, 0x73, 0x30, 0x47, 0xBF, 0xB4, 0xE9, 0x3D, 0xB3,
+0x76, 0xFB, 0x01, 0x73, 0x05, 0x51, 0xAB, 0x83, 0x99, 0x18, 0x30, 0x51, 0x80, 0xC0, 0x87, 0x5C,
+0x98, 0x8E, 0x73, 0x73, 0xC6, 0x49, 0x52, 0xE5, 0x1A, 0x10, 0xD4, 0x1A, 0xF4, 0xA7, 0x18, 0x89,
+0x86, 0x59, 0x41, 0xA3, 0xBC, 0x28, 0x1F, 0xA4, 0xAE, 0x40, 0x08, 0x5F, 0x74, 0x52, 0x42, 0x37,
+0x18, 0xA4, 0x75, 0x5D, 0x45, 0x40, 0x11, 0x50, 0x04, 0xD2, 0x0F, 0x01, 0x25, 0x76, 0xE9, 0x77,
+0x4E, 0x53, 0xDA, 0xA3, 0xB3, 0x17, 0xDA, 0x25, 0x68, 0x82, 0x01, 0x03, 0xF1, 0x11, 0xA7, 0x23,
+0x4A, 0xEC, 0x58, 0x69, 0xA2, 0xA2, 0xD4, 0x2C, 0x6E, 0xAA, 0x35, 0x95, 0x88, 0x86, 0x95, 0x7C,
+0x6F, 0x29, 0x9C, 0x68, 0x8E, 0x3D, 0x00, 0xB5, 0x6E, 0xE3, 0xCE, 0x16, 0x04, 0x92, 0x74, 0x0E,
+0x58, 0xB9, 0x24, 0x66, 0xC4, 0x91, 0xC4, 0x2E, 0x0F, 0x89, 0x87, 0x49, 0xEC, 0xCA, 0x8A, 0x0A,
+0x84, 0xA4, 0x4E, 0x2C, 0x2F, 0x91, 0xEF, 0x51, 0x2B, 0x6B, 0x7C, 0xEC, 0x93, 0x12, 0xBB, 0x14,
+0x9E, 0x64, 0xDD, 0x95, 0x22, 0xA0, 0x08, 0x28, 0x02, 0xA3, 0x10, 0x81, 0x94, 0x13, 0x3B, 0x55,
+0xED, 0x46, 0xE1, 0x28, 0x18, 0xC2, 0x21, 0x75, 0x5E, 0xEB, 0x32, 0xC7, 0xCE, 0xB4, 0x89, 0x0F,
+0xD8, 0x68, 0x22, 0x15, 0x24, 0x3F, 0xAC, 0x32, 0x51, 0x0E, 0x52, 0x94, 0x03, 0xF3, 0x70, 0xAA,
+0x5D, 0xCE, 0xE8, 0x17, 0x77, 0xF9, 0x4A, 0xA7, 0x28, 0x77, 0x52, 0x4E, 0x6D, 0x10, 0x13, 0x8F,
+0x95, 0xAA, 0x1D, 0xC9, 0x28, 0x4D, 0xB2, 0x54, 0x1A, 0xD9, 0x97, 0x3C, 0x90, 0x3A, 0x2E, 0x8B,
+0x92, 0xB9, 0xD1, 0x84, 0xF9, 0x20, 0xBA, 0xA8, 0xAB, 0x2A, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x24, 0x09, 0x01, 0x25, 0x76, 0x49, 0x02, 0x56, 0x9B, 0x55, 0x04, 0x92, 0x85, 0x80, 0x12, 0xBB,
+0x64, 0x21, 0xAB, 0xED, 0x2A, 0x02, 0x8A, 0x80, 0x22, 0x30, 0xF6, 0x11, 0x18, 0x11, 0x62, 0xE7,
+0x55, 0xBB, 0xB1, 0x0F, 0x9F, 0xF6, 0x40, 0x11, 0x48, 0x1D, 0x02, 0xAA, 0xCE, 0xA5, 0x0E, 0x6B,
+0xDD, 0x93, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x63, 0x15, 0x81, 0xD4, 0x3A, 0x1E, 0x8D, 0x55, 0x94,
+0xF4, 0xB8, 0x15, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x18, 0x03,
+0x08, 0x8C, 0x98, 0x62, 0x37, 0x06, 0xB0, 0xD1, 0x43, 0x54, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11,
+0x50, 0x04, 0x14, 0x01, 0x45, 0x60, 0x4C, 0x21, 0xA0, 0x8A, 0xDD, 0x98, 0x3A, 0x5D, 0x7A, 0xB0,
+0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xF4, 0x8E, 0x80, 0x12,
+0x3B, 0x1D, 0x1D, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xA4,
+0x09, 0x02, 0x4A, 0xEC, 0xD2, 0xE4, 0x44, 0x6A, 0x37, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04,
+0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x62, 0xA7, 0x63, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45,
+0x40, 0x11, 0x50, 0x04, 0x14, 0x81, 0x34, 0x41, 0x40, 0x89, 0x5D, 0x9A, 0x9C, 0x48, 0xED, 0x86,
+0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x4A, 0xEC, 0x74, 0x0C,
+0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0x90, 0x26, 0x08, 0x28,
+0xB1, 0x4B, 0x93, 0x13, 0xA9, 0xDD, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14,
+0x01, 0x45, 0x40, 0x89, 0x9D, 0x8E, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40,
+0x11, 0x50, 0x04, 0xD2, 0x04, 0x01, 0x25, 0x76, 0x69, 0x72, 0x22, 0xB5, 0x1B, 0x8A, 0x80, 0x22,
+0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0xB1, 0xD3, 0x31, 0xA0, 0x08, 0x28,
+0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x40, 0x9A, 0x20, 0xA0, 0xC4, 0x2E, 0x4D,
+0x4E, 0xA4, 0x76, 0x43, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01,
+0x25, 0x76, 0x3A, 0x06, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11,
+0x48, 0x13, 0x04, 0x94, 0xD8, 0xA5, 0xC9, 0x89, 0xD4, 0x6E, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0,
+0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0xC4, 0x4E, 0xC7, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02,
+0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x69, 0x82, 0x80, 0x12, 0xBB, 0x34, 0x39, 0x91, 0xDA,
+0x0D, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x94, 0xD8, 0xE9,
+0x18, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x20, 0x4D, 0x10,
+0x50, 0x62, 0x97, 0x26, 0x27, 0x52, 0xBB, 0xA1, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x28, 0x02, 0x8A, 0x80, 0x12, 0x3B, 0x1D, 0x03, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A,
+0x80, 0x22, 0xA0, 0x08, 0xA4, 0x09, 0x02, 0x4A, 0xEC, 0xD2, 0xE4, 0x44, 0x6A, 0x37, 0x14, 0x01,
+0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x62, 0xA7, 0x63, 0x40, 0x11,
+0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x81, 0x34, 0x41, 0x40, 0x89, 0x5D,
+0x9A, 0x9C, 0x48, 0xED, 0x86, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28,
+0x02, 0x4A, 0xEC, 0x74, 0x0C, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80,
+0x22, 0x90, 0x26, 0x08, 0x28, 0xB1, 0x4B, 0x93, 0x13, 0xA9, 0xDD, 0x50, 0x04, 0x14, 0x01, 0x45,
+0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x89, 0x9D, 0x8E, 0x01, 0x45, 0x40, 0x11, 0x50,
+0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0xD2, 0x04, 0x01, 0x25, 0x76, 0x69, 0x72, 0x22,
+0xB5, 0x1B, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0xB1,
+0xD3, 0x31, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x40, 0x9A,
+0x20, 0xA0, 0xC4, 0x2E, 0x4D, 0x4E, 0xA4, 0x76, 0x43, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40,
+0x11, 0x50, 0x04, 0x14, 0x01, 0x25, 0x76, 0x3A, 0x06, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04,
+0x14, 0x01, 0x45, 0x40, 0x11, 0x48, 0x13, 0x04, 0x94, 0xD8, 0xA5, 0xC9, 0x89, 0xD4, 0x6E, 0x28,
+0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0xC4, 0x4E, 0xC7, 0x80,
+0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x69, 0x82, 0x80, 0x12,
+0xBB, 0x34, 0x39, 0x91, 0xDA, 0x0D, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11,
+0x50, 0x04, 0x94, 0xD8, 0xE9, 0x18, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14,
+0x01, 0x45, 0x20, 0x4D, 0x10, 0x50, 0x62, 0x97, 0x26, 0x27, 0x52, 0xBB, 0xA1, 0x08, 0x28, 0x02,
+0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x12, 0x3B, 0x1D, 0x03, 0x8A, 0x80, 0x22,
+0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xA4, 0x09, 0x02, 0x4A, 0xEC, 0xD2, 0xE4,
+0x44, 0x6A, 0x37, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50,
+0x62, 0xA7, 0x63, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x81,
+0x34, 0x41, 0x40, 0x89, 0x5D, 0x9A, 0x9C, 0x48, 0xED, 0x86, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A,
+0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x4A, 0xEC, 0x74, 0x0C, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0,
+0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0x90, 0x26, 0x08, 0x28, 0xB1, 0x4B, 0x93, 0x13, 0xA9, 0xDD,
+0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x89, 0x9D, 0x8E,
+0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0xD2, 0x04, 0x01,
+0x25, 0x76, 0x69, 0x72, 0x22, 0xB5, 0x1B, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80,
+0x22, 0xA0, 0x08, 0x28, 0xB1, 0xD3, 0x31, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x28, 0x02, 0x8A, 0x40, 0x9A, 0x20, 0xA0, 0xC4, 0x2E, 0x4D, 0x4E, 0xA4, 0x76, 0x43, 0x11, 0x50,
+0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x25, 0x76, 0x3A, 0x06, 0x14, 0x01,
+0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x48, 0x13, 0x04, 0x94, 0xD8, 0xA5,
+0xC9, 0x89, 0xD4, 0x6E, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22,
+0xA0, 0xC4, 0x4E, 0xC7, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28,
+0x02, 0x69, 0x82, 0xC0, 0xFF, 0x07, 0xC8, 0x95, 0xBB, 0x50, 0xD6, 0xE3, 0x27, 0x57, 0x00, 0x00,
+0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+
+
+
+#endif /** DATA_TRANSFER_H_ **/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..a58b95cad
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,519 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.cproject
new file mode 100644
index 000000000..f80c8c65f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.cproject
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.346149942">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.346149942" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.346149942" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.346149942." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.250547050" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.1748504011" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.2090233040" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1667294435" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.NUCLEO" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1415579023" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.2089990133" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.2086618565" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.1336819872" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.401508748" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.768076664" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.611195564" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.480516329" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.1549105566" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/Target"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1874613946" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="THREAD_WB"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="ST_OT_DEBUG"/>
+ <listOptionValue builtIn="false" value="FRAMEWORK_1"/>
+ <listOptionValue builtIn="false" value="OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.113877678" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1994084606" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.352808911" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.130747949" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1884437029" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.108771236" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.403075023" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/Target"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.778314144" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="THREAD_WB"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="ST_OT_DEBUG"/>
+ <listOptionValue builtIn="false" value="FRAMEWORK_1"/>
+ <listOptionValue builtIn="false" value="OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1461809138" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.906601470" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1910775117" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1624263638" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1878517513" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.290998545" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
+ <option id="gnu.c.link.option.paths.397193107" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
+ <option id="gnu.c.link.option.ldflags.923386309" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.1564276312" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.307003495" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.1295990300" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1026277836" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1305212196" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
+ <option id="gnu.cpp.link.option.paths.1452141159" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
+ <option id="gnu.cpp.link.option.flags.1473308267" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.2003298275" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1646007108" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1815090390" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1851080940" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.804339454" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1578735136" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1505104390" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer.fr.ac6.managedbuild.target.gnu.cross.exe.821141350" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.346149942;fr.ac6.managedbuild.config.gnu.cross.exe.debug.346149942.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.768076664;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1994084606">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration artifactName="${ProjName}" configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer"/>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.project
new file mode 100644
index 000000000..32518034d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/.project
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
+ <name>P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer</name>
+ <comment/>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/syscalls.c</location>
+ </link><link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</location>
+ </link>
+
+ <link>
+ <name>Application/User/Core/src/app_entry.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm32_lpm_if.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/hw_timerserver.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/hw_uart.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/main.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/main.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm32wbxx_hal_msp.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_msp.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm32wbxx_it.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm_logging.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm_logging.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/system_stm32wbxx.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/app/app_thread.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_thread.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/target/hw_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</location>
+ </link>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/readme.txt</location>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_adc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_adc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_hsem.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_ll_usb.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/link.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/message.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/server.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
+ </link>
+ <link>
+ <name>Utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
+ </link>
+ <link>
+ <name>Utilities/stm32_seq.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
+ </link>
+ </linkedResources>
+</projectDescription> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..1679a357b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/P-NUCLEO-WB55.Nucleo_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed ā€œas is,ā€ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 : { *(MB_MEM2) } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..023c1b016
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,427 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ ldr r0, =_sdata
+ ldr r1, =_edata
+ ldr r2, =_sidata
+ movs r3, #0
+ b LoopCopyDataInit
+
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+
+/* Zero fill the bss segment. */
+ ldr r2, =_sbss
+ ldr r4, =_ebss
+ movs r3, #0
+ b LoopFillZerobss
+
+FillZerobss:
+ str r3, [r2]
+ adds r2, r2, #4
+
+LoopFillZerobss:
+ cmp r2, r4
+ bcc FillZerobss
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c
new file mode 100644
index 000000000..e266506b6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c
@@ -0,0 +1,204 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Thread_Coap_DataTransfer.ioc b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Thread_Coap_DataTransfer.ioc
new file mode 100644
index 000000000..38dec8af5
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Thread_Coap_DataTransfer.ioc
@@ -0,0 +1,246 @@
+#MicroXplorer Configuration settings - do not modify
+Dma.LPUART1_TX.0.Direction=DMA_MEMORY_TO_PERIPH
+Dma.LPUART1_TX.0.EventEnable=DISABLE
+Dma.LPUART1_TX.0.Instance=DMA1_Channel1
+Dma.LPUART1_TX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.LPUART1_TX.0.MemInc=DMA_MINC_ENABLE
+Dma.LPUART1_TX.0.Mode=DMA_NORMAL
+Dma.LPUART1_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.LPUART1_TX.0.PeriphInc=DMA_PINC_DISABLE
+Dma.LPUART1_TX.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING
+Dma.LPUART1_TX.0.Priority=DMA_PRIORITY_LOW
+Dma.LPUART1_TX.0.RequestNumber=1
+Dma.LPUART1_TX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
+Dma.LPUART1_TX.0.SignalID=NONE
+Dma.LPUART1_TX.0.SyncEnable=DISABLE
+Dma.LPUART1_TX.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
+Dma.LPUART1_TX.0.SyncRequestNumber=1
+Dma.LPUART1_TX.0.SyncSignalID=NONE
+Dma.Request0=LPUART1_TX
+Dma.Request1=USART1_TX
+Dma.RequestsNb=2
+Dma.USART1_TX.1.Direction=DMA_MEMORY_TO_PERIPH
+Dma.USART1_TX.1.EventEnable=DISABLE
+Dma.USART1_TX.1.Instance=DMA1_Channel2
+Dma.USART1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART1_TX.1.MemInc=DMA_MINC_ENABLE
+Dma.USART1_TX.1.Mode=DMA_NORMAL
+Dma.USART1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART1_TX.1.PeriphInc=DMA_PINC_DISABLE
+Dma.USART1_TX.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING
+Dma.USART1_TX.1.Priority=DMA_PRIORITY_LOW
+Dma.USART1_TX.1.RequestNumber=1
+Dma.USART1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
+Dma.USART1_TX.1.SignalID=NONE
+Dma.USART1_TX.1.SyncEnable=DISABLE
+Dma.USART1_TX.1.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
+Dma.USART1_TX.1.SyncRequestNumber=1
+Dma.USART1_TX.1.SyncSignalID=NONE
+File.Version=6
+KeepUserPlacement=false
+LPUART1.BaudRate=115200
+LPUART1.IPParameters=BaudRate,WordLength
+LPUART1.WordLength=UART_WORDLENGTH_8B
+Mcu.Family=STM32WB
+Mcu.IP0=DMA
+Mcu.IP1=HSEM
+Mcu.IP10=TINY_LPM
+Mcu.IP11=USART1
+Mcu.IP2=LPUART1
+Mcu.IP3=NVIC
+Mcu.IP4=RCC
+Mcu.IP5=RF
+Mcu.IP6=RTC
+Mcu.IP7=SEQUENCER
+Mcu.IP8=STM32_WPAN
+Mcu.IP9=SYS
+Mcu.IPNb=12
+Mcu.Name=STM32WB55RGVx
+Mcu.Package=VFQFPN68
+Mcu.Pin0=PC14-OSC32_IN
+Mcu.Pin1=PC15-OSC32_OUT
+Mcu.Pin10=VP_HSEM_VS_HSEM
+Mcu.Pin11=VP_RTC_VS_RTC_Activate
+Mcu.Pin12=VP_SEQUENCER_VS_SEQUENCER
+Mcu.Pin13=VP_STM32_WPAN_VS_THREAD
+Mcu.Pin14=VP_SYS_VS_Systick
+Mcu.Pin15=VP_TINY_LPM_VS_TINY_LPM
+Mcu.Pin2=PA2
+Mcu.Pin3=PA3
+Mcu.Pin4=RF1
+Mcu.Pin5=OSC_OUT
+Mcu.Pin6=OSC_IN
+Mcu.Pin7=PA11
+Mcu.Pin8=PB6
+Mcu.Pin9=PB7
+Mcu.PinsNb=16
+Mcu.ThirdPartyNb=0
+Mcu.UserConstants=
+Mcu.UserName=STM32WB55RGVx
+MxCube.Version=5.6.0
+MxDb.Version=DB.5.0.60
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.C2SEV_PWR_C2H_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+NVIC.DMA1_Channel1_IRQn=true\:0\:0\:false\:false\:true\:false\:true
+NVIC.DMA1_Channel2_IRQn=true\:0\:0\:false\:false\:true\:false\:true
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.FLASH_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.FPU_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+NVIC.ForceEnableDMAVector=true
+NVIC.HSEM_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.LPUART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.PVD_PVM_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
+NVIC.RCC_IRQn=true\:0\:0\:false\:false\:true\:true\:false
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true
+NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+OSC_IN.Mode=HSE-External-Oscillator
+OSC_IN.Signal=RCC_OSC_IN
+OSC_OUT.Mode=HSE-External-Oscillator
+OSC_OUT.Signal=RCC_OSC_OUT
+PA11.Locked=true
+PA11.Signal=USART1_CTS
+PA2.Mode=Asynchronous
+PA2.Signal=LPUART1_TX
+PA3.Mode=Asynchronous
+PA3.Signal=LPUART1_RX
+PB6.Locked=true
+PB6.Mode=Asynchronous
+PB6.Signal=USART1_TX
+PB7.Locked=true
+PB7.Mode=Asynchronous
+PB7.Signal=USART1_RX
+PC14-OSC32_IN.Mode=LSE-External-Oscillator
+PC14-OSC32_IN.Signal=RCC_OSC32_IN
+PC15-OSC32_OUT.Mode=LSE-External-Oscillator
+PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
+PCC.Ble.ConnectionInterval=1000.0
+PCC.Ble.DataLength=6
+PCC.Ble.Mode=Advertising
+PCC.Ble.PowerLevel=Min
+PinOutPanel.RotationAngle=0
+ProjectManager.AskForMigrate=true
+ProjectManager.BackupPrevious=false
+ProjectManager.CompilerOptimize=6
+ProjectManager.ComputerToolchain=false
+ProjectManager.CoupleFile=false
+ProjectManager.DeletePrevious=true
+ProjectManager.DeviceId=STM32WB55RGVx
+ProjectManager.FreePins=false
+ProjectManager.HalAssertFull=false
+ProjectManager.HeapSize=0x400
+ProjectManager.KeepUserCode=true
+ProjectManager.LastFirmware=true
+ProjectManager.LibraryCopy=2
+ProjectManager.MainLocation=Core/Src
+ProjectManager.NoMain=false
+ProjectManager.PreviousToolchain=SW4STM32
+ProjectManager.ProjectBuild=false
+ProjectManager.ProjectFileName=Thread_Coap_DataTransfer.ioc
+ProjectManager.ProjectName=Thread_Coap_DataTransfer
+ProjectManager.StackSize=0x1000
+ProjectManager.TargetToolchain=EWARM V8
+ProjectManager.ToolChainLocation=
+ProjectManager.UnderRoot=false
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_LPUART1_UART_Init-LPUART1-true-HAL-false,5-MX_USART1_UART_Init-USART1-true-HAL-false,6-MX_RF_Init-RF-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true,8-APPE_Init-STM32_WPAN-false-HAL-true,9-MX_SEQUENCER_Init-SEQUENCER-true-HAL-false,10-MX_TINY_LPM_Init-TINY_LPM-true-HAL-false
+RCC.ADCFreq_Value=48000000
+RCC.AHBFreq_Value=32000000
+RCC.APB1Freq_Value=32000000
+RCC.APB1TimFreq_Value=32000000
+RCC.APB2Freq_Value=32000000
+RCC.APB2TimFreq_Value=32000000
+RCC.APB3Freq_Value=16000000
+RCC.Cortex2Freq_Value=32000000
+RCC.CortexFreq_Value=32000000
+RCC.FCLK2Freq_Value=32000000
+RCC.FCLKCortexFreq_Value=32000000
+RCC.FamilyName=M
+RCC.HCLK2Freq_Value=32000000
+RCC.HCLK3Freq_Value=32000000
+RCC.HCLKFreq_Value=32000000
+RCC.HCLKRFFreq_Value=16000000
+RCC.HSE_VALUE=32000000
+RCC.HSI48_VALUE=48000000
+RCC.HSI_VALUE=16000000
+RCC.I2C1Freq_Value=32000000
+RCC.I2C3Freq_Value=32000000
+RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,Cortex2Freq_Value,CortexFreq_Value,FCLK2Freq_Value,FCLKCortexFreq_Value,FamilyName,HCLK2Freq_Value,HCLK3Freq_Value,HCLKFreq_Value,HCLKRFFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C3Freq_Value,LCDFreq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PWRFreq_Value,RFWKPClockSelection,RFWKPFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SMPS1Freq_Value,SMPSCLockSelectionVirtual,SMPSFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value
+RCC.LCDFreq_Value=32768
+RCC.LPTIM1Freq_Value=32000000
+RCC.LPTIM2Freq_Value=32000000
+RCC.LPUART1Freq_Value=32000000
+RCC.LSCOPinFreq_Value=32000
+RCC.LSI_VALUE=32000
+RCC.MCO1PinFreq_Value=32000000
+RCC.PLLPoutputFreq_Value=16000000
+RCC.PLLQoutputFreq_Value=16000000
+RCC.PLLRCLKFreq_Value=16000000
+RCC.PLLSAI1N=24
+RCC.PLLSAI1PoutputFreq_Value=48000000
+RCC.PLLSAI1QoutputFreq_Value=48000000
+RCC.PLLSAI1RoutputFreq_Value=48000000
+RCC.PWRFreq_Value=32000000
+RCC.RFWKPClockSelection=RCC_RFWKPCLKSOURCE_LSE
+RCC.RFWKPFreq_Value=32768
+RCC.RNGFreq_Value=32000
+RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE
+RCC.RTCFreq_Value=32768
+RCC.SAI1Freq_Value=48000000
+RCC.SMPS1Freq_Value=16000000
+RCC.SMPSCLockSelectionVirtual=RCC_SMPSCLKSOURCE_HSE
+RCC.SMPSFreq_Value=8000000
+RCC.SYSCLKFreq_VALUE=32000000
+RCC.SYSCLKSource=RCC_SYSCLKSOURCE_HSE
+RCC.USART1Freq_Value=32000000
+RCC.USBFreq_Value=48000000
+RCC.VCOInputFreq_Value=4000000
+RCC.VCOOutputFreq_Value=32000000
+RCC.VCOSAI1OutputFreq_Value=96000000
+RF1.Mode=RF1_Activate
+RF1.Signal=RF_RF1
+RTC.AsynchPrediv=CFG_RTC_ASYNCH_PRESCALER
+RTC.IPParameters=AsynchPrediv,SynchPrediv
+RTC.SynchPrediv=CFG_RTC_SYNCH_PRESCALER
+STM32_WPAN.APP_DBG_EN=1
+STM32_WPAN.CFG_CLI_UART=hw_lpuart1
+STM32_WPAN.CFG_DBG_TRACE_UART=hw_lpuart1
+STM32_WPAN.CFG_DEBUG_TRACE_LIGHT=1
+STM32_WPAN.CFG_DEBUG_TRACE_LIGTH=1
+STM32_WPAN.CFG_DEBUG_TRACE_UART=hw_uart1
+STM32_WPAN.CFG_FAST_CONN_ADV_INTERVAL_MAX_HEXA=0x0
+STM32_WPAN.CFG_FAST_CONN_ADV_INTERVAL_MIN_HEXA=0x0
+STM32_WPAN.CFG_HW_LPUART1_ENABLED=1
+STM32_WPAN.CFG_HW_USART1_ENABLED=1
+STM32_WPAN.CFG_LP_CONN_ADV_INTERVAL_MAX_HEXA=0x0
+STM32_WPAN.CFG_LP_CONN_ADV_INTERVAL_MIN_HEXA=0x0
+STM32_WPAN.CHANNEL=19
+STM32_WPAN.DBG_TRACE_UART_CFG=hw_lpuart1
+STM32_WPAN.IPParameters=UART_CLI,CFG_FAST_CONN_ADV_INTERVAL_MIN_HEXA,CFG_FAST_CONN_ADV_INTERVAL_MAX_HEXA,CFG_LP_CONN_ADV_INTERVAL_MIN_HEXA,CFG_LP_CONN_ADV_INTERVAL_MAX_HEXA,CFG_HW_LPUART1_ENABLED,DBG_TRACE_UART_CFG,CFG_DEBUG_TRACE_LIGTH,LOCAL_NAME_FORMATTED,APP_DBG_EN,CFG_HW_USART1_ENABLED,THREAD_APPLICATION,PANID,CHANNEL,CFG_CLI_UART,CFG_DBG_TRACE_UART,CFG_DEBUG_TRACE_LIGHT,CFG_DEBUG_TRACE_UART
+STM32_WPAN.LOCAL_NAME_FORMATTED=,'0'
+STM32_WPAN.PANID=2226
+STM32_WPAN.THREAD_APPLICATION=FTD
+STM32_WPAN.UART_CLI=hw_uart1
+USART1.IPParameters=VirtualMode-Asynchronous,WordLength,OverSampling
+USART1.OverSampling=UART_OVERSAMPLING_8
+USART1.VirtualMode-Asynchronous=VM_ASYNC
+USART1.WordLength=WORDLENGTH_8B
+VP_HSEM_VS_HSEM.Mode=HSEM_Activate
+VP_HSEM_VS_HSEM.Signal=HSEM_VS_HSEM
+VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled
+VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate
+VP_SEQUENCER_VS_SEQUENCER.Mode=SEQUENCER_Enabled
+VP_SEQUENCER_VS_SEQUENCER.Signal=SEQUENCER_VS_SEQUENCER
+VP_STM32_WPAN_VS_THREAD.Mode=STM32_WPAN_Enabled
+VP_STM32_WPAN_VS_THREAD.Signal=STM32_WPAN_VS_THREAD
+VP_SYS_VS_Systick.Mode=SysTick
+VP_SYS_VS_Systick.Signal=SYS_VS_Systick
+VP_TINY_LPM_VS_TINY_LPM.Mode=TINY_LPM_Enabled
+VP_TINY_LPM_VS_TINY_LPM.Signal=TINY_LPM_VS_TINY_LPM
+board=custom
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/readme.txt
new file mode 100644
index 000000000..23d33a234
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/readme.txt
@@ -0,0 +1,226 @@
+/**
+ @page Thread_Coap_DataTransfer application
+
+ @verbatim
+ ******************************************************************************
+ * @file Thread/Thread_Coap_DataTransfer/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Thread_Coap_DataTransfer application
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to transfer large blocks of data through the CoAP messaging protocol.
+
+This application requires the use of at least two STM32WB55xx boards. It demonstrates the
+ability to transfer large blocks of data through the CoAP messaging protocol. This application could be
+further developed into an Over The Air Firmware Update. However at the current state it stands as a
+Proof of Concept for the ability of transferring large blocks of data through the network. Namely
+5 blocks of data of 128bits length.
+
+In a Thread network, IPv6 addressing is split into 3 modes and 3 scopes.
+Multicast, Unicast and Anycast modes:
+ Multicast is used to communicate messages to multiple devices at once depending on the scope used in the address.
+ Unicast is used to communicate messages to a specific node in the network.
+ Anycast is used when the thread interface's routing locator is unknown.
+
+The scope determines the level of network access to be targeted:
+ Link-Local scope: all interfaces are reachable through a single radio transmission hop.
+ Mesh-Local scope: all interfaces reachable from within the same thread network.
+ Global scope : all interfaces reachable from within and outside the same thread network.
+
+In our application, we will use the MEsh-local scope and multicast addressing types to probe the
+mesh-local IP addresses of the child devices to which the File would be transferred.
+Nodes are split into two forwarding roles: Router or End Device.
+The Thread Leader is a Router that is responsible for managing the set of Routers in a
+Thread network. An End Device (or child) communicates primarily with a single Router.
+
+In our Application, which uses two devices, one device will act as a Leader (Router)
+and the other one will act as an End Device (child mode)
+
+After the reset of the 2 boards, one board will be in Leader mode (Green LED2 ON) and
+the other one will be in Child mode (Red LED3 ON) Once the child mode is established for
+one of the devices, it starts the provisioning procedure in multicast mode in order to probe
+the IP address of the leader device. Then this is used to start the File transfer procedure
+in unicast mode, which success is marked by the lightening of the blue LED.
+
+
+ ___________________________ ___________________________
+ | Device 1 | | Device 2 |
+ |_________________________| |_________________________|
+ | | | |
+ | | | Provisioning enabled() |
+ | | | |
+ | | | |
+ | | | |
+ | Provisioning Request | | |
+ | send() |======> COAP =========>|------------- |
+ | |Resource "provisioning"| | |
+ | |Mode : Multicast | v |
+ | |Type : Non-Confirmable | Provisioning Request |
+ | |Code : Get | Handler() |
+ | |Payload: empty | | |
+ | | | v |
+ | | | Provisioning Response |
+ | | | send() |
+ | | | | |
+ | -------------|<===== COAP ========== |<------------ |
+ | | |Resource "provisioning"| |
+ | v |Mode : Multicast | |
+ | Provisioning Response |Type : Non Confirmable | |
+ | Handler() |Code : Put | |
+ | | |Payload : MeshLocal EUI| |
+ | | | | |
+ | | | | |
+ | v | | |
+ | ---->Get_NextBuffer() | | |
+ || | | | |
+ || v | | |
+ || Unicast_Data_Send() | | |
+ || | | |
+ || | | | |
+ || v | | |
+ || ----------->|=====>CoAP============>|------------- |
+ || |Resource : "File" | | |
+ || |Mode : Unicast | v |
+ || |Type : Confirmable | Data_Request_Handler() |
+ || |Code : Put | |
+ || |Payload : Buffer[] | | |
+ || | | v |
+ || | | Check_Message_Validity |
+ || | | | |
+ || | | v |
+ || | | Data_Response_Send() |
+ || | | |
+ || | | | |
+ || Data_Response_Handler()|<=====CoAP=============|<------------ |
+ || |Resource: "File" | |
+ || | |Mode : Unicast | |
+ || | |Type : Acknowledgment |
+ || | |Code : Changed | |
+ || | |Payload : empty | |
+ || v | | |
+ || /\ | | |
+ || / \ | | |
+ || Yes / \ | | |
+ | <---- /ID <5?\ | | |
+ | \ / | | |
+ | \ / | | |
+ | \ / | | |
+ | \/ | | |
+ | | NO | | |
+ | v | | |
+ | Blue Led ON | | |
+ | | | |
+ | | | |
+ | | | |
+ --------------------------- ---------------------------
+ | Role : Child | | Role : Leader |
+ | | | |
+ | LED : Red | | LED : Green |
+ | | | |
+ |_________________________| |_________________________|
+
+
+@par Keywords
+
+COAP,THREAD
+
+@par Directory contents
+
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h Header for all modules with common definition
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h Parameters configuration file of the application
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h Parameters configuration file of the application
+ - Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h Header for app_thread.c module
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/data_transfer.h Array definition for Data Transfer application
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h Configuration file of the HW
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/main.h Header for main.c module
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.h Interrupt header file
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/system_infra.h System infrastructure header file
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c Initialization of the application
+ - Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c Thread application implementation
+ - Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c UART driver
+ - Thread/Thread_Coap_DataTransfer/Core/Src/main.c Main program
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c Logging module for traces
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm32xx_it.c Interrupt handlers
+ - Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices (Nucleo board and dongle)
+
+ - This example has been tested with STMicroelectronics STM32WB55RG_Nucleo
+ boards and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_Thread_FTD_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+
+In order to make the program work, you must do the following:
+ - Connect 2 STM32WB55xx boards to your PC (can be Nucleo and/or dongle)
+ - Open your preferred toolchain
+ - Rebuild all files of Thread/Thread_Coap_DataTransfer application
+ and load your image into the target memory
+ - Run the example on one board first wait until it switches to Leader Role
+ (indicated through the lightning of a green LED)
+ - Run the example on the second board and wait until it switches to Child Role
+ (indicated through the lightning of the Red LED)
+ - After a few seconds, if everything goes right, a blue LED should be lit indicating the end of the File transfer
+ - If the above step didn't go as planned, you should look through the traces to locate the source of the error.
+
+Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+If you want to get the traces in real time, you can connect an HyperTerminal
+via an UART RS232 cable using the following connections:
+ RXD: CN10(Pin35)
+ TXD: CN10(Pin37)
+
+
+For the traces, the UART must be configured as follows:
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_entry.c
index 09e50ba61..5fce121d0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_entry.c
@@ -119,7 +119,6 @@ void APPE_Init( void )
/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
- UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
Led_Init();
Button_Init();
/* USER CODE END APPE_Init_1 */
@@ -205,6 +204,10 @@ static void SystemPower_Config( void )
/* Initialize low power manager */
UTIL_LPM_Init( );
+ /* Disable low power mode until INIT is complete */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
#if (CFG_USB_INTERFACE_ENABLE != 0)
/**
* Enable USB power
@@ -320,7 +323,13 @@ static void APPE_SysEvtReadyProcessing( void )
TL_TRACES_Init( );
APP_THREAD_Init();
+
+#if ( CFG_LPM_SUPPORTED == 1)
+ /* Thread stack is initialized, low power mode can be enabled */
UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ UTIL_LPM_SetStopMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+#endif
+
return;
}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c
index c0478d8be..1a1eade9c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c
@@ -103,7 +103,6 @@ void APPE_Init( void )
/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
- UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
Led_Init();
Button_Init();
/* USER CODE END APPE_Init_1 */
@@ -189,6 +188,10 @@ static void SystemPower_Config( void )
/* Initialize low power manager */
UTIL_LPM_Init( );
+ /* Disable low power mode until INIT is complete */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
#if (CFG_USB_INTERFACE_ENABLE != 0)
/**
* Enable USB power
@@ -287,7 +290,13 @@ static void APPE_SysEvtReadyProcessing( void )
TL_TRACES_Init( );
APP_THREAD_Init();
+
+#if ( CFG_LPM_SUPPORTED == 1)
+ /* Thread stack is initialized, low power mode can be enabled */
UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ UTIL_LPM_SetStopMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+#endif
+
return;
}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
index c6e1ca97a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
-{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_common.h
new file mode 100644
index 000000000..836f40dcf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_common.h
@@ -0,0 +1,115 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_conf.h
new file mode 100644
index 000000000..323df0f3a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_conf.h
@@ -0,0 +1,358 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+ /**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum
+{
+ CFG_TASK_MSG_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ /* USER CODE BEGIN CFG_IdleTask_Id_t */
+ CFG_TASK_UDP_SEND,
+ /* USER CODE END CFG_IdleTask_Id_t */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+/* USER CODE BEGIN DEFINE_TASK */
+#define TASK_UDP_SEND (1U << CFG_TASK_UDP_SEND)
+/* USER CODE END DEFINE_TASK */
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+ /**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ /* USER CODE BEGIN CFG_IdleEvt_Id_t */
+ CFG_EVT_RESPONSE_ACK,
+ /* USER CODE END CFG_IdleEvt_Id_t */
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+/* USER CODE BEGIN DEFINE_EVENT */
+#define EVENT_RESPONSE_ACK (1U << CFG_EVT_RESPONSE_ACK)
+/* USER CODE END DEFINE_EVENT */
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_THREAD,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..297f7cee0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f580a14ee
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,359 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_I2S_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..6ac5b7b53
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm_logging.h
@@ -0,0 +1,59 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum
+{
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_OPENTHREAD_API = 2U, /* OpenThread API */
+ APPLI_LOG_REGION_OT_API_LINK = 3U, /* OpenThread Link API */
+ APPLI_LOG_REGION_OT_API_INSTANCE = 4U, /* OpenThread Instance API */
+ APPLI_LOG_REGION_OT_API_MESSAGE = 5U /* OpenThread Message API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..66e0e60c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/vcp_conf.h
@@ -0,0 +1,53 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#include "app_thread.h"
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA)
+#define VCP_TASK_PRIO (CFG_SCH_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/app_entry.c
new file mode 100644
index 000000000..c0478d8be
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/app_entry.c
@@ -0,0 +1,430 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_thread.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC(( sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Global function prototypes -----------------------------------------------*/
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+
+/* USER CODE BEGIN GFP */
+
+/* USER CODE END GFP */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void Init_Debug( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+static void APPE_SysUserEvtRx( void * pPayload );
+static void APPE_SysEvtReadyProcessing( void );
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ Init_Debug();
+
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch(ErrorCode)
+ {
+ case ERR_THREAD_LLD_FATAL_ERROR:
+ APP_DBG("** ERR_THREAD : LLD_FATAL_ERROR \n");
+ break;
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_THREAD : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_THREAD : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ APP_THREAD_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch(evt_waited_bm)
+ {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Does not allow other tasks when waiting for OT Cmd response */
+ UTIL_SEQ_Run(0);
+ break;
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Run only the task CFG_TASK_MSG_FROM_M0_TO_M4 */
+ UTIL_SEQ_Run(TASK_MSG_FROM_M0_TO_M4);
+ break;
+ default :
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..e0e4fcb5d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_uart.c
new file mode 100644
index 000000000..ce910235c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/main.c
new file mode 100644
index 000000000..2874778d1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/main.c
@@ -0,0 +1,616 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Thread_FTD_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+#include "app_common.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+
+RTC_HandleTypeDef hrtc;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+/* USER CODE BEGIN PFP */
+void PeriphClock_Config(void);
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Reset_BackupDomain( void );
+static void Init_Exti( void );
+static void Config_HSE(void);
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+ Reset_Device();
+ Config_HSE();
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Init code for STM32_WPAN */
+ APPE_Init();
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ HAL_PWR_EnableBkUpAccess();
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN LPUART1_Init 0 */
+
+ /* USER CODE END LPUART1_Init 0 */
+
+ /* USER CODE BEGIN LPUART1_Init 1 */
+
+ /* USER CODE END LPUART1_Init 1 */
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN LPUART1_Init 2 */
+
+ /* USER CODE END LPUART1_Init 2 */
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART1_Init 0 */
+
+ /* USER CODE END USART1_Init 0 */
+
+ /* USER CODE BEGIN USART1_Init 1 */
+
+ /* USER CODE END USART1_Init 1 */
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART1_Init 2 */
+
+ /* USER CODE END USART1_Init 2 */
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+ /* USER CODE BEGIN RF_Init 0 */
+
+ /* USER CODE END RF_Init 0 */
+
+ /* USER CODE BEGIN RF_Init 1 */
+
+ /* USER CODE END RF_Init 1 */
+ /* USER CODE BEGIN RF_Init 2 */
+
+ /* USER CODE END RF_Init 2 */
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+ /* USER CODE BEGIN RTC_Init 0 */
+
+ /* USER CODE END RTC_Init 0 */
+
+ /* USER CODE BEGIN RTC_Init 1 */
+
+ /* USER CODE END RTC_Init 1 */
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+/* USER CODE END 4 */
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..6fdb80557
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,336 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ __HAL_RCC_RTCAPB_CLK_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ __HAL_RCC_RTCAPB_CLK_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..636b316a4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,383 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+extern UART_HandleTypeDef hlpuart1;
+extern UART_HandleTypeDef huart1;
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles EXTI4_IRQ Handler.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm_logging.c
new file mode 100644
index 000000000..8c76e703c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm_logging.c
@@ -0,0 +1,211 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion)
+ {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_OPENTHREAD_API:
+ strcpy(logRegionString, "[M4 OPENTHREAD API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_LINK:
+ strcpy(logRegionString, "[M4 LINK API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_INSTANCE:
+ strcpy(logRegionString, "[M4 INSTANCE API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_MESSAGE:
+ strcpy(logRegionString, "[M4 MESSAGE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Project.eww
new file mode 100644
index 000000000..f8a6a1aea
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Project.eww
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<workspace>
+ <project>
+ <path>$WS_DIR$\Thread_Udp.ewp</path>
+ </project>
+ <batchBuild/>
+</workspace>
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewd
new file mode 100644
index 000000000..7df461081
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Thread_Udp</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state />
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state />
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state />
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state />
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state />
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state />
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state />
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state />
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state />
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state />
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state />
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state />
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state />
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state />
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state />
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state />
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state />
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state />
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state />
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state />
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewp
new file mode 100644
index 000000000..f1136e96b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/Thread_Udp.ewp
@@ -0,0 +1,1374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Thread_Udp</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>P-NUCLEO-WB55.Nucleo\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>P-NUCLEO-WB55.Nucleo\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>P-NUCLEO-WB55.Nucleo\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.60.2.11347</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>THREAD_WB</state>
+ <state>STM32WB55xx</state>
+ <state>ST_OT_DEBUG</state>
+ <state>FRAMEWORK_1</state>
+ <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\App</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\Target</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\stack\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\stack\include\openthread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../tiny_lpm</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Project.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Thread_Udp.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <group>
+ <name>src</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_thread.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_adc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_adc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_ipcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_ll_usb.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_thread_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>thread</name>
+ <group>
+ <name>openthread</name>
+ <group>
+ <name>core</name>
+ <group>
+ <name>openthread_api</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_manager.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_monitor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\child_supervision.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\coap.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\commissioner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\crypto.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\diag.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dns.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\icmp6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\instance.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\ip6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\jam_detection.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\joiner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link_raw.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\message.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\netdata.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\network_time.cpp</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread_api_wb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\radio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\tasklet.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\udp.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,528 @@
+;/********************* COPYRIGHT(c) 2019 STMicroelectronics ********************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;********************************************************************************
+;*
+;* 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 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 STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+;*
+;*******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD USB_FS_WKUP_CRS_IRQHandler ; USB Full speed wakeup
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK USB_FS_WKUP_CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_FS_WKUP_CRS_IRQHandler
+ B USB_FS_WKUP_CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+ END
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..46f07d1f3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvoptx
new file mode 100644
index 000000000..1af4993b9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvoptx
@@ -0,0 +1,1221 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>Thread_Udp</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>0</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>0</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>6</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ST-LINKIII-KEIL_SWO</Key>
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint/>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>startup_stm32wb55xx_cm4.s</PathWithFileName>
+ <FilenameWithoutPath>startup_stm32wb55xx_cm4.s</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/Core/src</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_entry.c</PathWithFileName>
+ <FilenameWithoutPath>app_entry.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_timerserver.c</PathWithFileName>
+ <FilenameWithoutPath>hw_timerserver.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_uart.c</PathWithFileName>
+ <FilenameWithoutPath>hw_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/main.c</PathWithFileName>
+ <FilenameWithoutPath>main.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32_lpm_if.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_hal_msp.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_msp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_it.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_it.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm_logging.c</PathWithFileName>
+ <FilenameWithoutPath>stm_logging.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/system_stm32wbxx.c</PathWithFileName>
+ <FilenameWithoutPath>system_stm32wbxx.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/App</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/App/app_thread.c</PathWithFileName>
+ <FilenameWithoutPath>app_thread.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/Target</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/Target/hw_ipcc.c</PathWithFileName>
+ <FilenameWithoutPath>hw_ipcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Doc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>5</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../readme.txt</PathWithFileName>
+ <FilenameWithoutPath>readme.txt</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_nucleo.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_adc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_adc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_cortex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_exti.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_hsem.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_ipcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pcd.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pcd_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>38</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>39</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_ll_usb.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>40</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</PathWithFileName>
+ <FilenameWithoutPath>shci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>41</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>42</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>43</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</PathWithFileName>
+ <FilenameWithoutPath>tl_mbox.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>44</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</PathWithFileName>
+ <FilenameWithoutPath>tl_thread_hci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>45</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</PathWithFileName>
+ <FilenameWithoutPath>channel_manager.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>46</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</PathWithFileName>
+ <FilenameWithoutPath>channel_monitor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>47</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</PathWithFileName>
+ <FilenameWithoutPath>child_supervision.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>48</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</PathWithFileName>
+ <FilenameWithoutPath>coap.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>49</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</PathWithFileName>
+ <FilenameWithoutPath>commissioner.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>50</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</PathWithFileName>
+ <FilenameWithoutPath>crypto.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>51</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</PathWithFileName>
+ <FilenameWithoutPath>dataset.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>52</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</PathWithFileName>
+ <FilenameWithoutPath>dataset_ftd.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>53</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</PathWithFileName>
+ <FilenameWithoutPath>dhcp6_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>54</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</PathWithFileName>
+ <FilenameWithoutPath>dhcp6_server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>55</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</PathWithFileName>
+ <FilenameWithoutPath>diag.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>56</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</PathWithFileName>
+ <FilenameWithoutPath>dns.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>57</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</PathWithFileName>
+ <FilenameWithoutPath>icmp6.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>58</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</PathWithFileName>
+ <FilenameWithoutPath>instance.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>59</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</PathWithFileName>
+ <FilenameWithoutPath>ip6.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>60</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</PathWithFileName>
+ <FilenameWithoutPath>jam_detection.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>61</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</PathWithFileName>
+ <FilenameWithoutPath>joiner.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>62</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</PathWithFileName>
+ <FilenameWithoutPath>link.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>63</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</PathWithFileName>
+ <FilenameWithoutPath>link_raw.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>64</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</PathWithFileName>
+ <FilenameWithoutPath>message.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>65</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</PathWithFileName>
+ <FilenameWithoutPath>netdata.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>66</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</PathWithFileName>
+ <FilenameWithoutPath>openthread.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</PathWithFileName>
+ <FilenameWithoutPath>openthread_api_wb.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>68</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</PathWithFileName>
+ <FilenameWithoutPath>radio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>69</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</PathWithFileName>
+ <FilenameWithoutPath>server.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>70</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</PathWithFileName>
+ <FilenameWithoutPath>tasklet.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>71</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</PathWithFileName>
+ <FilenameWithoutPath>thread.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>72</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</PathWithFileName>
+ <FilenameWithoutPath>thread_ftd.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>73</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</PathWithFileName>
+ <FilenameWithoutPath>udp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>74</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</PathWithFileName>
+ <FilenameWithoutPath>dbg_trace.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>75</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</PathWithFileName>
+ <FilenameWithoutPath>otp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>76</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</PathWithFileName>
+ <FilenameWithoutPath>stm_list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>77</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</PathWithFileName>
+ <FilenameWithoutPath>stm_queue.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Utilities</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>78</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>79</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/sequencer/stm32_seq.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_seq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvprojx
new file mode 100644
index 000000000..5c5731526
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/Thread_Udp.uvprojx
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>Thread_Udp</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
+ <PackURL>http://www.keil.com/pack</PackURL>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) IRAM_SHARED(0x20030000-0x200327FF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll></FlashDriverDll>
+ <DeviceId></DeviceId>
+ <RegisterFile></RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32WB55RGVx$CMSIS\SVD\STM32WBxx_CM4.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>P-NUCLEO-WB55.Nucleo\Exe\</OutputDirectory>
+ <OutputName>Thread_Udp</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf #L --bin --output=$L@L.bin</UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4107</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>1</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls>--C99</MiscControls>
+ <Define>CORE_CM4,USE_HAL_DRIVER,USE_STM32WBXX_NUCLEO,THREAD_WB,STM32WB55xx,ST_OT_DEBUG,FRAMEWORK_1,OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</Define>
+ <Undefine></Undefine>
+ <IncludePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/;../Core/Inc;../STM32_WPAN/App;../STM32_WPAN/Target;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy;../tiny_lpm;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <uClangAs>0</uClangAs>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile>stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc>--diag_suppress=L6329</Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/Core/src</GroupName>
+ <Files>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_msp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_hal_msp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_logging.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm_logging.c</FilePath>
+ </File>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/App</GroupName>
+ <Files>
+ <File>
+ <FileName>app_thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/App/app_thread.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/Target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/Target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.Nucleo</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_nucleo.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_adc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_adc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_exti.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_hsem.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_ll_usb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_thread_hci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api</GroupName>
+ <Files>
+ <File>
+ <FileName>channel_manager.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</FilePath>
+ </File>
+ <File>
+ <FileName>channel_monitor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</FilePath>
+ </File>
+ <File>
+ <FileName>child_supervision.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</FilePath>
+ </File>
+ <File>
+ <FileName>coap.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</FilePath>
+ </File>
+ <File>
+ <FileName>commissioner.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</FilePath>
+ </File>
+ <File>
+ <FileName>crypto.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</FilePath>
+ </File>
+ <File>
+ <FileName>dataset.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</FilePath>
+ </File>
+ <File>
+ <FileName>dataset_ftd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</FilePath>
+ </File>
+ <File>
+ <FileName>dhcp6_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>dhcp6_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>diag.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</FilePath>
+ </File>
+ <File>
+ <FileName>dns.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</FilePath>
+ </File>
+ <File>
+ <FileName>icmp6.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</FilePath>
+ </File>
+ <File>
+ <FileName>instance.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</FilePath>
+ </File>
+ <File>
+ <FileName>ip6.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</FilePath>
+ </File>
+ <File>
+ <FileName>jam_detection.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</FilePath>
+ </File>
+ <File>
+ <FileName>joiner.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</FilePath>
+ </File>
+ <File>
+ <FileName>link.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</FilePath>
+ </File>
+ <File>
+ <FileName>link_raw.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</FilePath>
+ </File>
+ <File>
+ <FileName>message.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</FilePath>
+ </File>
+ <File>
+ <FileName>netdata.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</FilePath>
+ </File>
+ <File>
+ <FileName>openthread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</FilePath>
+ </File>
+ <File>
+ <FileName>openthread_api_wb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</FilePath>
+ </File>
+ <File>
+ <FileName>radio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</FilePath>
+ </File>
+ <File>
+ <FileName>server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</FilePath>
+ </File>
+ <File>
+ <FileName>tasklet.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</FilePath>
+ </File>
+ <File>
+ <FileName>thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</FilePath>
+ </File>
+ <File>
+ <FileName>thread_ftd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</FilePath>
+ </File>
+ <File>
+ <FileName>udp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components/>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.c
new file mode 100644
index 000000000..3d8986fa7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.c
@@ -0,0 +1,965 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : App/app_thread.c
+ * Description : Thread Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_thread.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "openthread_api_wb.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#include "vcp.h"
+#include "vcp_conf.h"
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define C_SIZE_CMD_STRING 256U
+#define C_PANID 0x2226U
+#define C_CHANNEL_NB 19U
+#define UDP_PORT 1234
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/**
+ * This macro checks for the specified status, which is expected to commonly be successful, and branches to the local
+ * label 'exit' if the status is unsuccessful.
+ *
+ * @param[in] aStatus A scalar status to be evaluated against zero (0).
+ *
+ */
+#define SuccessOrExit(aStatus) \
+ do \
+ { \
+ if ((aStatus) != 0) \
+ { \
+ goto exit; \
+ } \
+ } while (false)
+
+/**
+ * This macro checks for the specified condition, which is expected to commonly be true, and both executes @a ... and
+ * branches to the local label 'exit' if the condition is false.
+ *
+ * @param[in] aCondition A Boolean expression to be evaluated.
+ * @param[in] ... An expression or block to execute when the assertion fails.
+ *
+ */
+#define VerifyOrExit(aCondition, ...) \
+ do \
+ { \
+ if (!(aCondition)) \
+ { \
+ __VA_ARGS__; \
+ goto exit; \
+ } \
+ } while (false)
+/* USER CODE END PM */
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_THREAD_CheckWirelessFirmwareInfo(void);
+static void APP_THREAD_DeviceConfig(void);
+static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext);
+static void APP_THREAD_TraceError(const char * pMess, uint32_t ErrCode);
+#if (CFG_FULL_LOW_POWER == 0)
+static void Send_CLI_To_M0(void);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+static void Send_CLI_Ack_For_OT(void);
+static void HostTxCb( void );
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+static uint32_t ProcessCmdString(uint8_t* buf , uint32_t len);
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static void RxCpltCallback(void);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* USER CODE BEGIN PFP */
+static otError UdpBind(uint16_t aPort);
+static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo);
+static void APP_THREAD_UdpSend(void);
+static otError UdpSend(void);
+/* USER CODE END PFP */
+
+/* Private variables -----------------------------------------------*/
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+static uint8_t TmpString[C_SIZE_CMD_STRING];
+static uint8_t VcpRxBuffer[sizeof(TL_CmdSerial_t)]; /* Received Data over USB are stored in this buffer */
+static uint8_t VcpTxBuffer[sizeof(TL_EvtPacket_t) + 254U]; /* Transmit buffer over USB */
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static uint8_t aRxBuffer[C_SIZE_CMD_STRING];
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_FULL_LOW_POWER == 0)
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+static __IO uint16_t indexReceiveChar = 0;
+static __IO uint16_t CptReceiveCmdFromUser = 0;
+
+static TL_CmdPacket_t *p_thread_otcmdbuffer;
+static TL_EvtPacket_t *p_thread_notif_M0_to_M4;
+static __IO uint32_t CptReceiveMsgFromM0 = 0;
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_TH_Config_t ThreadConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
+
+/* USER CODE BEGIN PV */
+otUdpSocket mSocket;
+uint8_t udpBufffer[256] = "HELLO UDP!";
+
+uint16_t udpPort = UDP_PORT;
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+
+void APP_THREAD_Init( void )
+{
+ /* USER CODE BEGIN APP_THREAD_INIT_1 */
+
+ /* USER CODE END APP_THREAD_INIT_1 */
+
+ SHCI_CmdStatus_t ThreadInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_THREAD_CheckWirelessFirmwareInfo();
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ VCP_Init(&VcpTxBuffer[0], &VcpRxBuffer[0]);
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+ /* Register cmdbuffer */
+ APP_THREAD_RegisterCmdBuffer(&ThreadOtCmdBuffer);
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_THREAD, UTIL_LPM_DISABLE);
+
+ /* Init config buffer and call TL_THREAD_Init */
+ APP_THREAD_TL_THREAD_INIT();
+
+ /* Configure UART for sending CLI command from M4 */
+ APP_THREAD_Init_UART_CLI();
+
+ /* Send Thread start system cmd to M0 */
+ ThreadInitStatus = SHCI_C2_THREAD_Init();
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ThreadInitStatus);
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_MSG_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_THREAD_ProcessMsgM0ToM4);
+
+ /* USER CODE BEGIN INIT TASKS */
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_UDP_SEND, UTIL_SEQ_RFU, APP_THREAD_UdpSend);
+ /* USER CODE END INIT TASKS */
+
+ /* Initialize and configure the Thread device*/
+ APP_THREAD_DeviceConfig();
+
+ /* USER CODE BEGIN APP_THREAD_INIT_2 */
+
+ /* USER CODE END APP_THREAD_INIT_2 */
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_THREAD_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ /* USER CODE BEGIN APP_THREAD_Error_1 */
+
+ /* USER CODE END APP_THREAD_Error_1 */
+ switch(ErrId)
+ {
+ case ERR_REC_MULTI_MSG_FROM_M0 :
+ APP_THREAD_TraceError("ERROR : ERR_REC_MULTI_MSG_FROM_M0 ", ErrCode);
+ break;
+ case ERR_THREAD_SET_STATE_CB :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SET_STATE_CB ",ErrCode);
+ break;
+ case ERR_THREAD_SET_CHANNEL :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SET_CHANNEL ",ErrCode);
+ break;
+ case ERR_THREAD_SET_PANID :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SET_PANID ",ErrCode);
+ break;
+ case ERR_THREAD_IPV6_ENABLE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_IPV6_ENABLE ",ErrCode);
+ break;
+ case ERR_THREAD_START :
+ APP_THREAD_TraceError("ERROR: ERR_THREAD_START ", ErrCode);
+ break;
+ case ERR_THREAD_ERASE_PERSISTENT_INFO :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_ERASE_PERSISTENT_INFO ",ErrCode);
+ break;
+ case ERR_THREAD_CHECK_WIRELESS :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_CHECK_WIRELESS ",ErrCode);
+ break;
+ /* USER CODE BEGIN APP_THREAD_Error_2 */
+ case ERR_THREAD_COAP_START :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_START ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_ADD_RESSOURCE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_ADD_RESSOURCE ",ErrCode);
+ break;
+ case ERR_THREAD_MESSAGE_READ :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_MESSAGE_READ ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_SEND_RESPONSE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_SEND_RESPONSE ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_APPEND :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_APPEND ",ErrCode);
+ break;
+ case ERR_THREAD_COAP_SEND_REQUEST :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_COAP_SEND_REQUEST ",ErrCode);
+ break;
+ case ERR_THREAD_SETUP :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_SETUP ", ErrCode);
+ break;
+ case ERR_THREAD_LINK_MODE :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_LINK_MODE ", ErrCode);
+ break;
+ case ERR_ALLOC_MSG :
+ APP_THREAD_TraceError("ERROR : ERR_ALLOC_MSG ", ErrCode);
+ break;
+ case ERR_FILE_RESP_HANDLER :
+ APP_THREAD_TraceError("ERROR : ERR_FILE_RESP_HANDLER ", ErrCode);
+ break;
+ case ERR_MSG_COMPARE_FAILED :
+ APP_THREAD_TraceError("ERROR : ERR_MSG_COMPARE_FAILED ", ErrCode);
+ break;
+ case ERR_NEW_MSG_ALLOC:
+ APP_THREAD_TraceError("ERROR : ERR_NEW_MSG_ALLOC ", ErrCode);
+ break;
+ case ERR_PROVISIONING_RESP:
+ APP_THREAD_TraceError("ERROR : ERR_PROVISIONING_RESP ", ErrCode);
+ break;
+ case ERR_THREAD_DATA_RESPONSE:
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_DATA_RESPONSE ", ErrCode);
+ break;
+ case ERR_APPEND:
+ APP_THREAD_TraceError("ERROR : ERR_APPEND ", ErrCode);
+ break;
+ case ERR_HEADER_INIT:
+ APP_THREAD_TraceError("ERROR : ERR_HEADER_INIT ", ErrCode);
+ break;
+ case ERR_TOKEN:
+ APP_THREAD_TraceError("ERROR : ERR_TOKEN ", ErrCode);
+ break;
+ /* USER CODE END APP_THREAD_Error_2 */
+ default :
+ APP_THREAD_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Thread initialization.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_DeviceConfig(void)
+{
+ otError error;
+ error = otInstanceErasePersistentInfo(NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_ERASE_PERSISTENT_INFO,error);
+ }
+ otInstanceFinalize(NULL);
+ otInstanceInitSingle();
+ error = otSetStateChangedCallback(NULL, APP_THREAD_StateNotif, NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_STATE_CB,error);
+ }
+ error = otLinkSetChannel(NULL, C_CHANNEL_NB);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_CHANNEL,error);
+ }
+ error = otLinkSetPanId(NULL, C_PANID);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_PANID,error);
+ }
+ error = otIp6SetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_IPV6_ENABLE,error);
+ }
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_START,error);
+ }
+
+ /* USER CODE BEGIN DEVICECONFIG */
+ /* Initialiaze socket */
+ memset(&mSocket, 0, sizeof(mSocket));
+
+ /* Open socket */
+ otUdpOpen(NULL, &mSocket, HandleUdpReceive, NULL);
+ UdpBind(UDP_PORT);
+
+ /* USER CODE END DEVICECONFIG */
+}
+
+/**
+ * @brief Thread notification when the state changes.
+ * @param aFlags : Define the item that has been modified
+ * aContext: Context
+ *
+ * @retval None
+ */
+static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
+
+ /* USER CODE BEGIN APP_THREAD_STATENOTIF */
+ static uint32_t child_notif = 0;
+ /* USER CODE END APP_THREAD_STATENOTIF */
+
+ if ((NotifFlags & (uint32_t)OT_CHANGED_THREAD_ROLE) == (uint32_t)OT_CHANGED_THREAD_ROLE)
+ {
+ switch (otThreadGetDeviceRole(NULL))
+ {
+ case OT_DEVICE_ROLE_DISABLED:
+ /* USER CODE BEGIN OT_DEVICE_ROLE_DISABLED */
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_DISABLED */
+ break;
+ case OT_DEVICE_ROLE_DETACHED:
+ /* USER CODE BEGIN OT_DEVICE_ROLE_DETACHED */
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_DETACHED */
+ break;
+ case OT_DEVICE_ROLE_CHILD:
+ /* USER CODE BEGIN OT_DEVICE_ROLE_CHILD */
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ if (child_notif == 0)
+ {
+ HAL_Delay(3000U);
+ UTIL_SEQ_SetTask(TASK_UDP_SEND, CFG_SCH_PRIO_1);
+ }
+ child_notif = 1U;
+ /* USER CODE END OT_DEVICE_ROLE_CHILD */
+ break;
+ case OT_DEVICE_ROLE_ROUTER :
+ /* USER CODE BEGIN OT_DEVICE_ROLE_ROUTER */
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_ROUTER */
+ break;
+ case OT_DEVICE_ROLE_LEADER :
+ /* USER CODE BEGIN OT_DEVICE_ROLE_LEADER */
+ BSP_LED_On(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END OT_DEVICE_ROLE_LEADER */
+ break;
+ default:
+ /* USER CODE BEGIN DEFAULT */
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ /* USER CODE END DEFAULT */
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (OpenThread or other module if any)
+ * @retval None
+ */
+static void APP_THREAD_TraceError(const char * pMess, uint32_t ErrCode)
+{
+ /* USER CODE BEGIN TRACE_ERROR */
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while(1U == 1U)
+ {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+ /* USER CODE END TRACE_ERROR */
+}
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Thread
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_THREAD_Error((uint32_t)ERR_THREAD_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_THREAD_FTD :
+ APP_DBG("FW Type : Thread FTD");
+ break;
+ case INFO_STACK_TYPE_THREAD_MTD :
+ APP_DBG("FW Type : Thread MTD");
+ break;
+ case INFO_STACK_TYPE_BLE_THREAD_FTD_STATIC :
+ APP_DBG("FW Type : Static Concurrent Mode BLE/Thread");
+ break;
+ default :
+ /* No Thread device supported ! */
+ APP_THREAD_Error((uint32_t)ERR_THREAD_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+}
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static uint16_t Swap16(uint16_t v)
+{
+ return (((v & 0x00ffU) << 8) & 0xff00) | (((v & 0xff00U) >> 8) & 0x00ff);
+}
+
+static uint16_t HostSwap16(uint16_t v)
+{
+ return Swap16(v);
+}
+
+static otError UdpBind(uint16_t aPort)
+{
+ otError error;
+ otSockAddr sockaddr;
+
+ memset(&sockaddr, 0, sizeof(sockaddr));
+
+ /* "::" specifies the IPv6 Unspecified Address */
+ error = otIp6AddressFromString("::", &sockaddr.mAddress);
+ SuccessOrExit(error);
+
+ sockaddr.mPort = aPort;
+ sockaddr.mScopeId = OT_NETIF_INTERFACE_ID_THREAD;
+
+ error = otUdpBind(&mSocket, &sockaddr);
+
+exit:
+ return error;
+}
+
+static void HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo)
+{
+ int length;
+ uint8_t udpBuffferReceived[256];
+
+ APP_DBG("Received %d bytes from ", otMessageGetLength(aMessage) - otMessageGetOffset(aMessage));
+ APP_DBG(
+ "%x:%x:%x:%x:%x:%x:%x:%x %d ", HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[0]),
+ HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[1]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[2]),
+ HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[3]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[4]),
+ HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[5]), HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[6]),
+ HostSwap16(aMessageInfo->mPeerAddr.mFields.m16[7]), aMessageInfo->mPeerPort);
+
+ length = otMessageRead(aMessage, otMessageGetOffset(aMessage), udpBuffferReceived, sizeof(udpBuffferReceived) - 1);
+ udpBuffferReceived[length] = '\0';
+
+ APP_DBG("Received %s\r\n", udpBuffferReceived);
+
+ if(strcmp((char const*)udpBuffferReceived, (char const*)udpBufffer) == 0)
+ {
+ APP_DBG("Comparison OK!");
+ BSP_LED_On(LED_BLUE);
+ }
+}
+
+/**
+ * @brief This function initiates the APP_THREAD_UdpSend procedure
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_UdpSend(void)
+{
+ HAL_Delay(1000U);
+
+ /* Send Udp request */
+ UdpSend();
+}
+
+static otError UdpSend(void)
+{
+ otError error;
+ otMessageInfo messageInfo;
+ otMessage * message = NULL;
+
+ memset(&messageInfo, 0, sizeof(messageInfo));
+
+ error = otIp6AddressFromString("ff02::1", &messageInfo.mPeerAddr);
+ SuccessOrExit(error);
+
+ messageInfo.mPeerPort = udpPort;
+ messageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;
+
+ message = otUdpNewMessage(NULL, true);
+ VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);
+
+ error = otMessageAppend(message, udpBufffer, (uint16_t)strlen((const char*)udpBufffer));
+ SuccessOrExit(error);
+
+ APP_DBG("Sending UDP message %s", udpBufffer);
+ error = otUdpSend(&mSocket, message, &messageInfo);
+
+exit:
+
+ if (error != OT_ERROR_NONE && message != NULL)
+ {
+ APP_DBG("UdpSend failed with error : %s", error);
+ otMessageFree(message);
+ }
+
+ return error;
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_THREAD_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer)
+{
+ p_thread_otcmdbuffer = p_buffer;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_OTCmdPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)p_thread_otcmdbuffer->cmdserial.cmd.payload;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)((TL_EvtPacket_t *)p_thread_otcmdbuffer)->evtserial.evt.payload;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_NotificationPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)(p_thread_notif_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the Ot commands from the
+ * M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void Ot_Cmd_Transfer(void)
+{
+ /* OpenThread OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_thread_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ uint32_t l_size = ((Thread_OT_Cmd_Request_t*)(p_thread_otcmdbuffer->cmdserial.cmd.payload))->Size * 4U + 8U;
+ p_thread_otcmdbuffer->cmdserial.cmd.plen = l_size;
+
+ TL_OT_SendCmd();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+}
+
+/**
+ * @brief This function is called when acknowledge from OT command is received from the M0+.
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_OT_CmdEvtReceived( TL_EvtPacket_t * Otbuffer )
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+}
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_THREAD_NotReceived( TL_EvtPacket_t * Notbuffer )
+{
+ p_thread_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+}
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_OtCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+}
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+}
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+}
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveMsgFromM0++;
+ UTIL_SEQ_SetTask(TASK_MSG_FROM_M0_TO_M4,CFG_SCH_PRIO_0);
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ if (aRxBuffer[0] == '\r')
+ {
+ CptReceiveCmdFromUser = 1U;
+
+ /* UART task scheduling*/
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_CLI_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief Process the command strings.
+ * As soon as a complete command string has been received, the task
+ * in charge of sending the command to the M0 is scheduled
+ * @param None
+ * @retval None
+ */
+static uint32_t ProcessCmdString( uint8_t* buf , uint32_t len )
+{
+ uint32_t i,j,tmp_start;
+ tmp_start = 0;
+ uint32_t res = 0;
+
+ i= 0;
+ while ((buf[i] != '\r') && (i < len))
+ {
+ i++;
+ }
+
+ if (i != len)
+ {
+ memcpy(CommandString, buf,(i+1));
+ indexReceiveChar = i + 1U; /* Length of the buffer containing the command string */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ tmp_start = i;
+ for (j = 0; j < (len - tmp_start - 1U) ; j++)
+ {
+ buf[j] = buf[tmp_start + j + 1U];
+ }
+ res = len - tmp_start - 1U;
+ }
+ else
+ {
+ res = len;
+ }
+ return res; /* Remaining characters in the temporary buffer */
+}
+#endif/* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_FULL_LOW_POWER == 0)
+/**
+ * @brief Process sends receive CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void Send_CLI_To_M0(void)
+{
+ memset(ThreadCliCmdBuffer.cmdserial.cmd.payload, 0x0U, 255U);
+ memcpy(ThreadCliCmdBuffer.cmdserial.cmd.payload, CommandString, indexReceiveChar);
+ ThreadCliCmdBuffer.cmdserial.cmd.plen = indexReceiveChar;
+ ThreadCliCmdBuffer.cmdserial.cmd.cmdcode = 0x0;
+
+ /* Clear receive buffer, character counter and command complete */
+ CptReceiveCmdFromUser = 0;
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+
+ TL_CLI_SendCmd();
+}
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+
+/**
+ * @brief Send notification for CLI TL Channel.
+ * @param None
+ * @retval None
+ */
+static void Send_CLI_Ack_For_OT(void)
+{
+
+ /* Notify M0 that characters have been sent to UART */
+ TL_THREAD_CliSendAck();
+}
+
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_Init_UART_CLI(void)
+{
+#if (CFG_FULL_LOW_POWER == 0)
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_CLI_TO_M0, UTIL_SEQ_RFU,Send_CLI_To_M0);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+ MX_LPUART1_UART_Init();
+ HW_UART_Receive_IT(CFG_CLI_UART, aRxBuffer, 1, RxCpltCallback);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+}
+
+/**
+ * @brief Perform initialization of TL for THREAD.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_TL_THREAD_INIT(void)
+{
+ ThreadConfigBuffer.p_ThreadOtCmdRspBuffer = (uint8_t*)&ThreadOtCmdBuffer;
+ ThreadConfigBuffer.p_ThreadNotAckBuffer = (uint8_t*)ThreadNotifRspEvtBuffer;
+ ThreadConfigBuffer.p_ThreadCliRspBuffer = (uint8_t*)&ThreadCliCmdBuffer;
+
+ TL_THREAD_Init( &ThreadConfigBuffer );
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_THREAD_CliNotReceived( TL_EvtPacket_t * Notbuffer )
+{
+ TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t l_size = l_CliBuffer->cmdserial.cmd.plen;
+
+ /* WORKAROUND: if string to output is "> " then respond directly to M0 and do not output it */
+ if (strcmp((const char *)l_CliBuffer->cmdserial.cmd.payload, "> ") != 0)
+ {
+ /* Write to CLI UART */
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ VCP_SendData( l_CliBuffer->cmdserial.cmd.payload, l_size, HostTxCb);
+#else
+ HW_UART_Transmit_IT(CFG_CLI_UART, l_CliBuffer->cmdserial.cmd.payload, l_size, HostTxCb);
+#endif /*USAGE_OF_VCP */
+ }
+ else
+ {
+ Send_CLI_Ack_For_OT();
+ }
+}
+
+/**
+ * @brief End of transfer callback for CLI UART sending.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void HostTxCb(void)
+{
+ Send_CLI_Ack_For_OT();
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_ProcessMsgM0ToM4(void)
+{
+ if (CptReceiveMsgFromM0 != 0)
+ {
+ /* If CptReceiveMsgFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveMsgFromM0 > 1U)
+ {
+ APP_THREAD_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else
+ {
+ OpenThread_CallBack_Processing();
+ }
+ /* Reset counter */
+ CptReceiveMsgFromM0 = 0;
+ }
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief This function is called when thereare some data coming
+ * from the Hyperterminal via the USB port
+ * Data received over USB OUT endpoint are sent over CDC interface
+ * through this function.
+ * @param Buf: Buffer of data received
+ * @param Len: Number of data received (in bytes)
+ * @retval Number of characters remaining in the buffer and not yet processed
+ */
+void VCP_DataReceived(uint8_t* Buf , uint32_t *Len)
+{
+ uint32_t i,flag_continue_checking = TRUE;
+ uint32_t char_remaining = 0;
+ static uint32_t len_total = 0;
+
+ /* Copy the characteres in the temporary buffer */
+ for (i = 0; i < *Len; i++)
+ {
+ TmpString[len_total++] = Buf[i];
+ }
+
+ /* Process the buffer commands one by one */
+ /* A command is limited by a \r caracaters */
+ while (flag_continue_checking == TRUE)
+ {
+ char_remaining = ProcessCmdString(TmpString,len_total);
+ /* If char_remaining is equal to len_total, it means that the command string is not yet
+ * completed.
+ * If char_remaining is equal to 0, it means that the command string has
+ * been entirely processed.
+ */
+ if ((char_remaining == 0) || (char_remaining == len_total))
+ {
+ flag_continue_checking = FALSE;
+ }
+ len_total = char_remaining;
+ }
+}
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.h
new file mode 100644
index 000000000..7ce237d59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.h
@@ -0,0 +1,137 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : App/app_thread.h
+ * Description : Header for Thread Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_THREAD_H
+#define APP_THREAD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "tl_thread_hci.h"
+
+/* OpenThread Library */
+#include OPENTHREAD_CONFIG_FILE
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+/* Thread application generic defines */
+/*------------------------------------*/
+typedef enum
+{
+ APP_THREAD_LIMITED,
+ APP_THREAD_FULL,
+} APP_THREAD_InitMode_t;
+
+/* ipv6-addressing defines */
+/*------------------------------------*/
+/* Key Point: A major difference between FTDs and MTDs are that FTDs subscribe to the ff03::2 multicast address.
+ * MTDs do not. */
+
+#define MULICAST_FTD_MED "ff03::1"
+#define MULICAST_FTD_BORDER_ROUTER "ff03::2"
+
+/* Application errors */
+/*------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum
+{
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_THREAD_SET_STATE_CB,
+ ERR_THREAD_SET_CHANNEL,
+ ERR_THREAD_SET_PANID,
+ ERR_THREAD_IPV6_ENABLE,
+ ERR_THREAD_START,
+ ERR_THREAD_ERASE_PERSISTENT_INFO,
+/* USER CODE BEGIN ERROR_APPLI_ENUM */
+ ERR_THREAD_COAP_START,
+ ERR_THREAD_COAP_ADD_RESSOURCE,
+ ERR_THREAD_MESSAGE_READ,
+ ERR_THREAD_COAP_SEND_RESPONSE,
+ ERR_THREAD_COAP_APPEND,
+ ERR_THREAD_COAP_SEND_REQUEST,
+ ERR_THREAD_COAP_SEND_RESP,
+ ERR_THREAD_SETUP,
+ ERR_THREAD_LINK_MODE,
+ ERR_ALLOC_MSG,
+ ERR_FILE_RESP_HANDLER,
+ ERR_MSG_COMPARE_FAILED,
+ ERR_NEW_MSG_ALLOC,
+ ERR_PROVISIONING_HANDLER,
+ ERR_THREAD_DATA_RESPONSE,
+ ERR_APPEND,
+ ERR_PROVISIONING_RESP,
+ ERR_HEADER_INIT,
+ ERR_TOKEN,
+ ERR_APEND_URI,
+ ERR_READ,
+/* USER CODE END ERROR_APPLI_ENUM */
+ ERR_THREAD_CHECK_WIRELESS
+ } ErrAppliIdEnum_t;
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ------------------------------------------------------- */
+void APP_THREAD_Init( void );
+void APP_THREAD_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_THREAD_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+void APP_THREAD_ProcessMsgM0ToM4(void);
+void APP_THREAD_Init_UART_CLI(void);
+void APP_THREAD_TL_THREAD_INIT(void);
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_THREAD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..a58b95cad
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,519 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.cproject
new file mode 100644
index 000000000..a72f17b42
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.cproject
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1375980677">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1375980677" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1375980677" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1375980677." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.787415212" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.1653453172" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1959767300" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1399854393" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.Nucleo" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1961282909" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.353653440" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1582463554" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.622071843" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/Thread_Udp}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1397732277" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1705476986" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1820184245" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.none" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.2071849108" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.133391438" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/Target"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1497790679" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="THREAD_WB"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="ST_OT_DEBUG"/>
+ <listOptionValue builtIn="false" value="FRAMEWORK_1"/>
+ <listOptionValue builtIn="false" value="OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.1637247419" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.291405499" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.450743194" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.866283947" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1717491864" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.none" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.2019551517" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1915728901" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/Target"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy"/>
+ <listOptionValue builtIn="false" value="../../../tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread/platform"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.227441793" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO"/>
+ <listOptionValue builtIn="false" value="THREAD_WB"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="ST_OT_DEBUG"/>
+ <listOptionValue builtIn="false" value="FRAMEWORK_1"/>
+ <listOptionValue builtIn="false" value="OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1539383181" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.1962342706" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1838901649" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.2033656650" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1265713108" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.916045340" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
+ <option id="gnu.c.link.option.paths.956797558" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
+ <option id="gnu.c.link.option.ldflags.2070058247" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.689343588" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.2057366301" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.296120878" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1412414640" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.668069160" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
+ <option id="gnu.cpp.link.option.paths.495281737" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
+ <option id="gnu.cpp.link.option.flags.1159683159" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.1468702120" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1368598302" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1779265167" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.810828183" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.57689459" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1024098844" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1075556146" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="Thread_Udp.fr.ac6.managedbuild.target.gnu.cross.exe.1049637750" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1375980677;fr.ac6.managedbuild.config.gnu.cross.exe.debug.1375980677.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1705476986;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.291405499">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="/Thread_Udp"/>
+ </configuration>
+ <configuration configurationName="Release"/>
+ </storageModule>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.project
new file mode 100644
index 000000000..7ae5bb9c5
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/.project
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
+ <name>Thread_Udp</name>
+ <comment/>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/syscalls.c</location>
+ </link><link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</location>
+ </link>
+
+ <link>
+ <name>Application/User/Core/src/app_entry.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/hw_timerserver.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/hw_uart.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/main.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/main.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm32_lpm_if.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm32wbxx_hal_msp.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_msp.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm32wbxx_it.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/stm_logging.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm_logging.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/src/system_stm32wbxx.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/App/app_thread.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_thread.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/Target/hw_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</location>
+ </link>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/readme.txt</location>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_adc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_adc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_adc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_exti.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_hsem.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_ll_usb.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/link.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/message.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/server.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
+ </link>
+ <link>
+ <name>Utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
+ </link>
+ <link>
+ <name>Utilities/stm32_seq.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
+ </link>
+ </linkedResources>
+</projectDescription> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..f07016593
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/Thread_Udp/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed Ć¢ā‚¬Å“as is,Ć¢ā‚¬ļæ½ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..f79eec117
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* start address for the .MB_MEM2 section. defined in linker script */
+.word _sMB_MEM2
+/* end address for the .MB_MEM2 section. defined in linker script */
+.word _eMB_MEM2
+
+/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */
+.macro INIT_BSS start, end
+ ldr r0, =\start
+ ldr r1, =\end
+ movs r3, #0
+ bl LoopFillZerobss
+.endm
+
+/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */
+.macro INIT_DATA start, end, src
+ ldr r0, =\start
+ ldr r1, =\end
+ ldr r2, =\src
+ movs r3, #0
+ bl LoopCopyDataInit
+.endm
+
+.section .text.data_initializers
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+ bx lr
+
+FillZerobss:
+ str r3, [r0]
+ adds r0, r0, #4
+
+LoopFillZerobss:
+ cmp r0, r1
+ bcc FillZerobss
+ bx lr
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ INIT_DATA _sdata, _edata, _sidata
+
+/* Zero fill the bss segments. */
+ INIT_BSS _sbss, _ebss
+ INIT_BSS _sMB_MEM2, _eMB_MEM2
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/syscalls.c
new file mode 100644
index 000000000..9b7c4071a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/SW4STM32/syscalls.c
@@ -0,0 +1,207 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Author : Auto-generated by System workbench for STM32
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Target : STMicroelectronics STM32
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+** @attention
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+**
+** 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 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 STMicroelectronics nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/readme.txt
new file mode 100644
index 000000000..971edad62
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/readme.txt
@@ -0,0 +1,162 @@
+/**
+ @page Thread_Udp application
+
+ @verbatim
+ ******************************************************************************
+ * @file Thread/Thread_Udp/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Thread_Udp application
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to transfer data using UDP.
+
+This application requires the use of at least two STM32WB55xx boards.
+It demonstrates the ability to transfer a block of data through UDP.
+
+Nodes are split into two forwarding roles: Router or End Device.
+The Thread Leader is a Router that is responsible for managing the set of Routers in a
+Thread network. An End Device (or child) communicates primarily with a single Router.
+
+In our Application, which uses two devices, one device will act as a Leader (Router)
+and the other one will act as an End Device (child mode)
+
+After the reset of the 2 boards, one board will be in Leader mode (Green LED2 ON) and
+the other one will be in Child mode (Red LED3 ON) Once the child mode is established for
+one of the devices, it starts the UDP sending procedure in multicast mode.
+If the pattern is correctly received on the Leader side Blue LED is switch ON.
+
+
+ ___________________________ ___________________________
+ | Device 1 | | Device 2 |
+ |_________________________| |_________________________|
+ | | | |
+ | | | UDP open socket |
+ | | | UDP bind to UDP_PORT |
+ | | | |
+ | | | |
+ | | | |
+ | UDP send() |======> UDP =========> |------------- |
+ | |UDP_PORT "1234" | | |
+ | |Address : ff02::1 | | |
+ | |Payload: udpBuffer[] | | |
+ | | | v |
+ | | | UDP Receive () |
+ | | | | |
+ | | | | |
+ | | | v |
+ | | | Blue Led ON |
+ | | | |
+ --------------------------- ---------------------------
+ | Role : Child | | Role : Leader |
+ | | | |
+ | LED : Red | | LED : Green |
+ | | | |
+ |_________________________| |_________________________|
+
+
+@par Keywords
+
+COAP,THREAD
+
+@par Directory contents
+
+ - Thread/Thread_Udp/Core/Inc/app_common.h Header for all modules with common definition
+ - Thread/Thread_Udp/Core/Inc/app_conf.h Parameters configuration file of the application
+ - Thread/Thread_Udp/Core/Inc/app_entry.h Parameters configuration file of the application
+ - Thread/Thread_Udp/STM32_WPAN/App/app_thread.h Header for app_thread.c module
+ - Thread/Thread_Udp/Core/Inc/hw_conf.h Configuration file of the HW
+ - Thread/Thread_Udp/Core/Inc/main.h Header for main.c module
+ - Thread/Thread_Udp/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - Thread/Thread_Udp/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - Thread/Thread_Udp/Core/Src/stm32wbxx_it.h Interrupt header file
+ - Thread/Thread_Udp/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - Thread/Thread_Udp/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port
+ - Thread/Thread_Udp/Core/Src/app_entry.c Initialization of the application
+ - Thread/Thread_Udp/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - Thread/Thread_Udp/STM32_WPAN/App/app_thread.c Thread application implementation
+ - Thread/Thread_Udp/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - Thread/Thread_Udp/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - Thread/Thread_Udp/Core/Src/hw_uart.c UART driver
+ - Thread/Thread_Udp/Core/Src/main.c Main program
+ - Thread/Thread_Udp/Core/Src/stm_logging.c Logging module for traces
+ - Thread/Thread_Udp/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - Thread/Thread_Udp/Core/Src/stm32wbxx_hal_msp.c MSP Initialization
+ - Thread/Thread_Udp/Core/Src/stm32xx_it.c Interrupt handlers
+ - Thread/Thread_Udp/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices (Nucleo board and dongle)
+
+ - This example has been tested with STMicroelectronics STM32WB55RG_Nucleo
+ boards and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_Thread_FTD_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+
+In order to make the program work, you must do the following:
+ - Connect 2 STM32WB55xx boards to your PC (can be Nucleo and/or dongle)
+ - Open your preferred toolchain
+ - Rebuild all files of Thread/Thread_Udp application
+ and load your image into the target memory
+ - Run the example on one board first wait until it switches to Leader Role
+ (indicated through the lightning of a green LED)
+ - Run the example on the second board and wait until it switches to Child Role
+ (indicated through the lightning of the Red LED)
+ - After a few seconds, if everything goes right, a blue LED should be lit indicating the end of the File transfer
+ - If the above step didn't go as planned, you should look through the traces to locate the source of the error.
+
+Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+If you want to get the traces in real time, you can connect an HyperTerminal
+via an UART RS232 cable using the following connections:
+ RXD: CN10(Pin35)
+ TXD: CN10(Pin37)
+
+
+For the traces, the UART must be configured as follows:
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_conf.h
new file mode 100644
index 000000000..f7a44b00d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_conf.h
@@ -0,0 +1,355 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TIM_ZIGBEE_APP_NTW_RESTART,
+ CFG_TASK_BUTTON_SW1,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+ CFG_EVT_ZIGBEE_CONTINUE_INIT,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+#define EVENT_ZIGBEE_CONTINUE_INIT (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..8409edd16
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_conf.h
@@ -0,0 +1,219 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/app_entry.c
new file mode 100644
index 000000000..a73f9b5ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/app_entry.c
@@ -0,0 +1,500 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..f024b61e3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,275 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Project.eww
new file mode 100644
index 000000000..bc7aa6d5d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_Commissioning_Client_Coord.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewd
new file mode 100644
index 000000000..0899e96de
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Commissioning_Client_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewp
new file mode 100644
index 000000000..19417014b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewp
@@ -0,0 +1,1258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Commissioning_Client_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_Commissioning_Client_Coord/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_Commissioning_Client_Coord/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_Commissioning_Client_Coord/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_Commissioning_Client_Coord.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_Commissioning_Client_Coord.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..03c7a6f78
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,996 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.commission.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+
+/* Commissioning specific defines -------------------------------------------------*/
+#define ZR_NWK_ADDR 0xffff /* unspecified */
+#define ZR_EXT_ADDR (uint64_t)0x1111111111111111
+#define ZR_NB_SCANS 1
+#define ZR_RESTART_DEVICE_DELAY 1 /* 1 second */
+#define ZB_PANID_WILDCARD 0xffff
+
+#define NB_NWK_CONFIG 1
+#define CHANNEL_1 19
+#define EXT_PANID_1 0x1122334455667788
+#define ZR_COMMISSIONING_SERVER_INDEX_NWK_1 0
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* NWK parameters handled by Commissioning client */
+struct nwk_parameters{
+ uint64_t extendedPanID;
+ uint32_t channelMask;
+ uint16_t nwk_addr;
+ uint8_t nwkKeyType;
+ uint8_t stackProfile;
+ uint8_t scan_count;
+ uint8_t startupControl;
+ bool useInsecureJoin;
+};
+
+/* ZC NWK configuration structure */
+struct zigbee_nwk_config {
+ uint8_t currentConfig;
+ struct nwk_parameters config[NB_NWK_CONFIG];
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_SW1_Process(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_Commissioning_Client_Init(void);
+static void APP_ZIGBEE_Commissioning_Cmd_Rsp_Mgmt(struct ZbZclCommandRspT *zcl_rsp);
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg);
+
+static void APP_ZIGBEE_Commissioning_Client_RemoteWrite_cb(const ZbZclWriteRspT *writeResp, void *cb_arg);
+static void APP_ZIGBEE_NwkInfo(void);
+static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, struct nwk_parameters *params);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStartType startupControl;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *commissioning_client;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static struct zigbee_nwk_config nwk_config = {
+ /* Starting with network configuration 1 */
+ .currentConfig = ZR_COMMISSIONING_SERVER_INDEX_NWK_1,
+
+ /* nwk 1 parameters */
+ .config[0].extendedPanID = EXT_PANID_1,
+ .config[0].channelMask = CHANNEL_1,
+ .config[0].nwk_addr = ZR_NWK_ADDR,
+ .config[0].nwkKeyType = ZB_SEC_KEYTYPE_STANDARD_NWK,
+ .config[0].stackProfile = ZB_NWK_STACK_PROFILE_PRO,
+ .config[0].scan_count = ZR_NB_SCANS,
+ .config[0].startupControl = ZbStartTypePreconfigured,
+ .config[0].useInsecureJoin = true,
+};
+
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Device generic command response callback
+ * @param zcl_rsp: ZCL response
+ * @param arg: passed arguments
+ * @retval None
+ */
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg){
+ UNUSED(arg);
+
+ /* Checking response consistency */
+ assert(zcl_rsp != NULL);
+
+ switch(zcl_rsp->hdr.frameCtrl.frameType){
+ case ZCL_FRAMETYPE_PROFILE:
+ /* general frame cmd response */
+
+ switch(zcl_rsp->hdr.cmdId){
+ case ZCL_COMMAND_DEFAULT_RESPONSE:
+ /* general default response */
+ if (zcl_rsp->status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Default response: the server returned an error: 0x%02x.\n", zcl_rsp->status);
+ } else {
+ APP_DBG("Default response: success!\n");
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported general cmd type.\n");
+ break;
+ }
+ break;
+
+ case ZCL_FRAMETYPE_CLUSTER:
+ /* cluster specific frame cmd response */
+
+ if(zcl_rsp->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error: cmd not successfully received. 0x%02x.\n", zcl_rsp->status);
+ return;
+ }
+
+ switch(zcl_rsp->clusterId){
+ case ZCL_CLUSTER_COMMISSIONING:
+ /* Commissioning cluster */
+ APP_ZIGBEE_Commissioning_Cmd_Rsp_Mgmt(zcl_rsp);
+ break;
+
+ default:
+ APP_DBG("Error: unsupported cluster.\n");
+ break;
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported frame type.\n");
+ break;
+ }
+} /* APP_ZIGBEE_Generic_Cmd_Rsp_cb */
+
+/**
+ * @brief Commissioning client command response management
+ * @param zcl_rsp: ZCL response
+ * @retval None
+ */
+static void APP_ZIGBEE_Commissioning_Cmd_Rsp_Mgmt(struct ZbZclCommandRspT *zcl_rsp){
+ uint8_t rsp_status = 0;
+
+ /* Checking response consistency */
+ assert(zcl_rsp != NULL && zcl_rsp->payload != NULL);
+
+ memcpy(&rsp_status, zcl_rsp->payload, sizeof(rsp_status));
+ switch(zcl_rsp->hdr.cmdId){
+ case ZCL_COMMISSION_SVR_CMD_RESTART_DEVICE_RSP:
+ /* Commissioning restart device cmd response */
+ APP_DBG("RestartDevice response received from server.");
+ if(rsp_status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, server did not handle the request successfuly. Error code 0x%2x", rsp_status);
+ return;
+ }
+ break;
+
+ case ZCL_COMMISSION_SVR_CMD_SAVE_STARTUP_RSP:
+ /* Commissioning save startup cmd response */
+ APP_DBG("SaveStartup response received from server.");
+ if(rsp_status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, server did not handle the request successfuly. Error code 0x%2x", rsp_status);
+ return;
+ }
+ break;
+
+ case ZCL_COMMISSION_SVR_CMD_RESTORE_STARTUP_RSP:
+ /* Commissioning restore startup cmd response */
+ APP_DBG("RestoreStartup response received from server.");
+ if(rsp_status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, server did not handle the request successfuly. Error code 0x%2x", rsp_status);
+ return;
+ }
+ break;
+
+ case ZCL_COMMISSION_SVR_CMD_RESET_STARTUP_RSP:
+ /* Commissioning reset startup cmd response */
+ APP_DBG("ResetStartup response received from server.");
+ if(rsp_status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, server did not handle the request successfuly. Error code 0x%2x", rsp_status);
+ return;
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported general cmd type.\n");
+ return;
+ }
+
+ APP_DBG("Response is OK, continue Commissioning process.\n");
+
+ /* Continue the Commissioning process */
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+} /* APP_ZIGBEE_Commissioning_Cmd_Rsp_Mgmt */
+
+/**
+ * @brief Zigbee application helper to configure Commissioning server
+ * @param config_num: Current NWK commissioning client NWK configuration
+ * @param params: Corresponding NWK parameters
+ * @retval None
+ */
+static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, struct nwk_parameters *params){
+ enum ZclStatusCodeT status;
+ struct ZbZclCommissionClientResetStartup ResetStartupReq;
+ struct ZbZclCommissionClientSaveStartup SaveStartupReq;
+ struct ZbZclCommissionClientRestoreStartup RestoreStartup;
+ struct ZbZclCommissionClientRestartDev RestartDeviceReq;
+ ZbZclWriteReqT RemoteWriteReq;
+ uint64_t epid;
+ uint32_t channelMask;
+ uint16_t nwk_addr;
+
+ /* Reseting Commissioning client nwk configuration */
+ APP_DBG("Sending ResetStartup request.");
+ memset(&ResetStartupReq, 0, sizeof(ResetStartupReq));
+ status = ZbZclCommissionClientSendResetStartup(zigbee_app_info.commissioning_client, ZR_EXT_ADDR, &ResetStartupReq,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclCommissionClientSendResetStartup failed");
+ assert(0);
+ }
+
+ /* Waiting the successful server response */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ /* Remotely writing Commissioning client nwk configuration (request 1) */
+ memset(&RemoteWriteReq, 0, sizeof(RemoteWriteReq));
+ RemoteWriteReq.dst.mode = ZB_APSDE_ADDRMODE_EXT;
+ /* We want to address any device with INTERPAN,
+ * even if not connected to ZC's network */
+ RemoteWriteReq.dst.panId = ZB_PANID_WILDCARD; /* wildcard value */
+ RemoteWriteReq.dst.extAddr = ZR_EXT_ADDR;
+ RemoteWriteReq.dst.endpoint = ZB_ENDPOINT_INTERPAN;
+ RemoteWriteReq.count = 8;
+
+ APP_DBG("Remotely writting Commissioning server attributes.");
+
+ /* NWK address attribute */
+ APP_DBG("Modifying NKK address.");
+ RemoteWriteReq.attr[0].attrId = ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR;
+ RemoteWriteReq.attr[0].type = ZCL_DATATYPE_UNSIGNED_16BIT;
+ putle16((uint8_t*)&nwk_addr, params->nwk_addr);
+ RemoteWriteReq.attr[0].value = (uint8_t const*)&nwk_addr;
+ RemoteWriteReq.attr[0].length = 2;
+
+ /* Extended PAN ID attribute */
+ APP_DBG("Modifying extended PAN ID.");
+ RemoteWriteReq.attr[1].attrId = ZCL_COMMISSION_CLI_ATTR_EPID;
+ RemoteWriteReq.attr[1].type = ZCL_DATATYPE_BITMAP_64BIT;
+ putle64((uint8_t*)&epid, params->extendedPanID);
+ RemoteWriteReq.attr[1].value = (uint8_t const*)&epid;
+ RemoteWriteReq.attr[1].length = 8;
+
+ /* Stack profile attribute */
+ APP_DBG("Modifying stack profile.");
+ RemoteWriteReq.attr[2].attrId = ZCL_COMMISSION_CLI_ATTR_STACKPROFILE;
+ RemoteWriteReq.attr[2].type = ZCL_DATATYPE_UNSIGNED_8BIT;
+ RemoteWriteReq.attr[2].value = (uint8_t const*)&params->stackProfile;
+ RemoteWriteReq.attr[2].length = 1;
+
+ /* Channel mask attribute */
+ APP_DBG("Modifying channel mask.");
+ RemoteWriteReq.attr[3].attrId = ZCL_COMMISSION_CLI_ATTR_CHANNELMASK;
+ RemoteWriteReq.attr[3].type = ZCL_DATATYPE_BITMAP_32BIT;
+ putle32((uint8_t*)&channelMask, 1 << params->channelMask);
+ RemoteWriteReq.attr[3].value = (uint8_t const*)&channelMask;
+ RemoteWriteReq.attr[3].length = 4;
+
+ /* Use Insecure Join attribute */
+ APP_DBG("Modifying insecure join.");
+ RemoteWriteReq.attr[4].attrId = ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN;
+ RemoteWriteReq.attr[4].type = ZCL_DATATYPE_BOOLEAN;
+ RemoteWriteReq.attr[4].value = (uint8_t const*)&params->useInsecureJoin;
+ RemoteWriteReq.attr[4].length = 1;
+
+ /* Preconfigured Link Key attribute */
+ APP_DBG("Modifying preconfigured link key.");
+ RemoteWriteReq.attr[5].attrId = ZCL_COMMISSION_CLI_ATTR_PRECONFLINKKEY;
+ RemoteWriteReq.attr[5].type = ZCL_DATATYPE_SECURITY_KEY128;
+ RemoteWriteReq.attr[5].value = (uint8_t const*)&sec_key_ha;
+ RemoteWriteReq.attr[5].length = 16;
+
+ /* Network Key type attribute */
+ APP_DBG("Modifying NWK key type.");
+ RemoteWriteReq.attr[6].attrId = ZCL_COMMISSION_CLI_ATTR_NWKKEYTYPE;
+ RemoteWriteReq.attr[6].type = ZCL_DATATYPE_ENUMERATION_8BIT;
+ RemoteWriteReq.attr[6].value = (uint8_t const*)&params->nwkKeyType;
+ RemoteWriteReq.attr[6].length = 1;
+
+ /* Startup Control attribute */
+ APP_DBG("Modifying startup control.");
+ RemoteWriteReq.attr[7].attrId = ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL;
+ RemoteWriteReq.attr[7].type = ZCL_DATATYPE_ENUMERATION_8BIT;
+ RemoteWriteReq.attr[7].value = (uint8_t const*)&params->startupControl;
+ RemoteWriteReq.attr[7].length = 1;
+
+ status = ZbZclWriteReq(zigbee_app_info.commissioning_client, &RemoteWriteReq, APP_ZIGBEE_Commissioning_Client_RemoteWrite_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclWriteReq failed");
+ assert(0);
+ }
+
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ /* Remotely writing Commissioning client nwk configuration (request 2) */
+ memset(&RemoteWriteReq, 0, sizeof(RemoteWriteReq));
+ RemoteWriteReq.dst.mode = ZB_APSDE_ADDRMODE_EXT;
+ /* We want to address any device with INTERPAN,
+ * even if not connected to ZC's network */
+ RemoteWriteReq.dst.panId = ZB_PANID_WILDCARD; /* wildcard value */
+ RemoteWriteReq.dst.extAddr = ZR_EXT_ADDR;
+ RemoteWriteReq.dst.endpoint = ZB_ENDPOINT_INTERPAN;
+ RemoteWriteReq.count = 1;
+
+ APP_DBG("Remotely writting Commissioning server attributes.");
+
+ /* Scan attemps attribute */
+ APP_DBG("Modifying scan attemps.");
+ RemoteWriteReq.attr[0].attrId = ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS;
+ RemoteWriteReq.attr[0].type = ZCL_DATATYPE_UNSIGNED_8BIT;
+ RemoteWriteReq.attr[0].value = (uint8_t const*)&params->scan_count;
+ RemoteWriteReq.attr[0].length = 1;
+
+ status = ZbZclWriteReq(zigbee_app_info.commissioning_client, &RemoteWriteReq, APP_ZIGBEE_Commissioning_Client_RemoteWrite_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclWriteReq failed");
+ assert(0);
+ }
+
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ /* Saving Commissioning client nwk configuration */
+ APP_DBG("Sending SaveStartup request.");
+ memset(&SaveStartupReq, 0, sizeof(SaveStartupReq));
+ SaveStartupReq.index = config_num;
+ status = ZbZclCommissionClientSendSaveStartup(zigbee_app_info.commissioning_client, ZR_EXT_ADDR, &SaveStartupReq,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclCommissionClientSendSaveStartup failed");
+ assert(0);
+ }
+
+ /* Waiting the successful server response */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ /* Reseting Commissioning client nwk configuration */
+ APP_DBG("Sending ResetStartup request.");
+ memset(&ResetStartupReq, 0, sizeof(ResetStartupReq));
+ status = ZbZclCommissionClientSendResetStartup(zigbee_app_info.commissioning_client, ZR_EXT_ADDR, &ResetStartupReq,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclCommissionClientSendResetStartup failed");
+ assert(0);
+ }
+
+ /* Waiting the successful server response */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ /* Sending Restore Startup command */
+ APP_DBG("Sending RestoreStartup request.");
+ memset(&RestoreStartup, 0, sizeof(RestoreStartup));
+ RestoreStartup.index = config_num;
+ status = ZbZclCommissionClientSendRestoreStartup(zigbee_app_info.commissioning_client, ZR_EXT_ADDR, &RestoreStartup,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclCommissionClientSendResetStartup failed");
+ assert(0);
+ }
+
+ /* Waiting the successful server response */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ /* Sending RestartDevice command */
+ APP_DBG("Sending RestartDevice request.");
+ memset(&RestartDeviceReq, 0, sizeof(RestartDeviceReq));
+
+ /* We want the receiver to install the current set of startup parameters before restarting */
+ RestartDeviceReq.options = ZCL_COMMISSION_OPTIONS_MODE_USE_NEW;
+ RestartDeviceReq.delay = ZR_RESTART_DEVICE_DELAY;
+ status = ZbZclCommissionClientSendRestart(zigbee_app_info.commissioning_client, ZR_EXT_ADDR, &RestartDeviceReq,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclCommissionClientSendRestart failed");
+ assert(0);
+ }
+
+ /* Waiting the successful server response */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+
+ APP_DBG("Commissioning process successfully ended.\n");
+}
+
+/**
+ * @brief Zigbee application helper to show network information
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkInfo(void){
+ ZbNlmeGetInterfaceReqT ZbNlmeReq;
+ ZbNlmeGetInterfaceConfT ZbNlmeConf;
+ uint64_t epid = 0;
+ uint32_t channelInUse = 0 ;
+
+ /* Extended Pan ID */
+ if(ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_ExtendedPanId, &epid, sizeof(epid)) != ZB_STATUS_SUCCESS){
+ APP_DBG("Error, ZbNwkGet failed.");
+ return;
+ }
+ APP_DBG("Extended PAN ID: 0x%" PRIx64 "\n.", epid);
+
+ /* Channel in use */
+
+ /* NLME-GET-INTERFACE.request */
+ memset(&ZbNlmeReq, 0, sizeof(ZbNlmeReq));
+ memset(&ZbNlmeConf, 0, sizeof(ZbNlmeConf));
+ ZbNlmeReq.ifcIndex = 0; /* interface 0 */
+
+ ZbNlmeGetInterface(zigbee_app_info.zb, &ZbNlmeReq, &ZbNlmeConf);
+ if (ZbNlmeConf.status != ZB_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbNlmeGetInterface failed.");
+ return;
+ }
+
+ /* Current channel */
+ while (!(ZbNlmeConf.channelInUse & 1)) {
+ /* Iterate through bits untill we find the only set bit */
+ ZbNlmeConf.channelInUse = ZbNlmeConf.channelInUse >> 1;
+ ++channelInUse;
+ }
+
+ APP_DBG("Channel in use: %d\n.", channelInUse);
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+
+ /* Initialize Zigbee Commissioning Client parameters */
+ APP_ZIGBEE_Commissioning_Client_Init();
+} /* APP_ZIGBEE_App_Init */
+
+/**
+ * @brief Commissioning client initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_Commissioning_Client_Init(void){
+ /* Show NWK info */
+ APP_ZIGBEE_NwkInfo();
+
+ APP_DBG("Commissioning client init done!\n");
+} /* APP_ZIGBEE_Commissioning_Client_Init */
+
+/**
+ * @brief Device generic remote write response callback
+ * @param writeResp: ZCL write response
+ * @param cb_arg: passed arguments
+ * @retval None
+ */
+static void APP_ZIGBEE_Commissioning_Client_RemoteWrite_cb(const ZbZclWriteRspT *writeResp, void *cb_arg){
+ UNUSED(cb_arg);
+
+ if(writeResp->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, remote write failed.\n");
+ return;
+ }
+
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_CONTINUE_INIT);
+ APP_DBG("Remote write OK.\n");
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+ zigbee_app_info.startupControl = ZbStartTypeJoin;
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ /* Commissioning Client */
+ zigbee_app_info.commissioning_client = ZbZclCommissionClientAlloc(zigbee_app_info.zb, ZCL_PROFILE_HOME_AUTOMATION, false);
+ assert(zigbee_app_info.commissioning_client != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.commissioning_client);
+
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ /* Set the centralized network */
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORD");
+ config.startupControl = ZbStartTypeForm;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << nwk_config.config[nwk_config.currentConfig].channelMask; /* Channel in use */
+ config.extendedPanId = nwk_config.config[nwk_config.currentConfig].extendedPanID; /* PAN ID in use */
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, re-attempting to form a network after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ /* Set NWK configuration 1 on the commissioning server */
+ APP_DBG("Setting up NWK configuration for the ZR.");
+ APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(nwk_config.currentConfig, &nwk_config.config[nwk_config.currentConfig]);
+} /* APP_ZIGBEE_SW1_Process */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/readme.txt
new file mode 100644
index 000000000..b562eabb4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/readme.txt
@@ -0,0 +1,211 @@
+/**
+ @page Zigbee_Commissioning_Client_Coord application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_Commissioning_Client_Coord/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Commissioning Cluster application as a
+ * client using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Commissioning cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to operate a commissioning process using the Commissioning cluster. Once the Zigbee mesh
+network is created, the user can send requests for the commissioning process from client to
+server (through push buttons SW1).
+
+The router network info can be checked by pressing push button SW1. It will show:
+- Network address assigned to the device.
+- Network PAN ID and extended PAN ID.
+
+Note: You can press push button SW1 on Commissioning client router before and after
+ Commissioning process to see the changes.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Commissioning_Server_Router
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Commissioning_Client_Coord
+
+
+Demo use case :
+
+This demo shows how to use Commissioning cluster.
+The Commssioning cluster is used to operate a commissioning process on a not connected
+Zigbee router (Commissioning server) from the Zigbee coordinator (Commissioning client).
+
+For that, Commissioning process from the client uses INTERPAN communication that allows to
+address requests to not connected devices.
+
+The Commissioning process is as follow:
+
+0. Initial server configuration: commissioning capabiliy (INTERPAN communication) enabled.
+ --> device MAC layer configured to listen for packets.
+ --> the server is able to handle requests even if not connected through the network.
+
+1. The client sends Reset Startup request to server.
+ --> the server current startup configuration is cleared.
+
+2. The client remotely writes commissioning server attributes (INTERPAN communication):
+ - ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR
+ - ZCL_COMMISSION_CLI_ATTR_EPID
+ - ZCL_COMMISSION_CLI_ATTR_STACKPROFILE
+ - ZCL_COMMISSION_CLI_ATTR_CHANNELMASK
+ - ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN
+ - ZCL_COMMISSION_CLI_ATTR_PRECONFLINKKEY
+ - ZCL_COMMISSION_CLI_ATTR_NWKKEYTYPE
+ - ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL
+ - ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS
+
+ --> the server startup configuration changes.
+
+3. The client sends Save Startup request to server (request with an index value of 0).
+ --> the server current startup configuration is saved (under index 0).
+
+4. The client sends Reset Startup request to server.
+ --> the server current startup configuration is cleared.
+
+5. The client sends Restore Startup request to server (request with an index value of 0).
+ --> the server restore current startup configuration from a saved
+ startup configuration (index 0).
+
+6. The client sends Restart device request to server.
+ --> the server operate a full startup process with current startup configuration.
+ --> the server router joins the network.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | /* Commissioning server init */ | |
+ | | -->| |
+ | | ZbZclCommissionServerEnable() | | |
+ | | ---| |
+ | | | |
+ | | /* Commissioning process */ | |
+ | | | |
+ | | ZbZclCommissionClientSendResetStartup() | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclWriteReq() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendSaveStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendResetStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendResoreStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendRestartStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | -->| |
+ | | /* Waiting the delay mentioned in the RestartStartup cmd */ | | |=> GREEN LED ON (during delay)
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | /* Router joins the network*/ | | |=> BLUE LED ON
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | /* Show network info */ | | |<=PushB SW1
+ | | ---| |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_Commissioning_Client_Coord application (Device1 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router but it will not connect to the
+ Zigbee network. Connecting the router to the network is the goal of this demo.
+
+ b) When Commissioning process is complete, the router joins the network and its Blue LED (LED1) is ON.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_conf.h
new file mode 100644
index 000000000..398c28c08
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_conf.h
@@ -0,0 +1,358 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_ZIGBEE_RESTART_DEVICE_DELAY,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_ZIGBEE_APP_POWER_PROFILE_STEP_1,
+ CFG_TASK_ZIGBEE_APP_POWER_PROFILE_STEP_2,
+ CFG_TASK_ZIGBEE_APP_POWER_PROFILE_STEP_3,
+ CFG_TIM_ZIGBEE_APP_POWER_PROFILE_STEP_4,
+ CFG_TIM_ZIGBEE_APP_ZIGBEE_PowerProfile_Processing,
+ CFG_TASK_BUTTON_SW1,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..8409edd16
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_conf.h
@@ -0,0 +1,219 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+ * Semaphores
+ * THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+ *****************************************************************************/
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/app_entry.c
new file mode 100644
index 000000000..a73f9b5ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/app_entry.c
@@ -0,0 +1,500 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..f024b61e3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,275 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Project.eww
new file mode 100644
index 000000000..d4cac8320
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_Commissioning_Server_Router.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewd
new file mode 100644
index 000000000..0993b817f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Commissioning_Server_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewp
new file mode 100644
index 000000000..a3b8ae746
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewp
@@ -0,0 +1,1258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Commissioning_Server_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_Commissioning_Server_Router/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_Commissioning_Server_Router/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_Commissioning_Server_Router/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_Commissioning_Server_Router.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_Commissioning_Server_Router.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..22cbeea9c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,913 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.commission.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+#define NB_MAX_STRING 10
+
+#define HW_TS_SERVER_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL) /**< 1s */
+
+/* Commissioning specific defines --------------------------------------------*/
+#define ZR_EXT_ADDR (uint64_t)0x1111111111111111
+#define MAX_CONFIG_TAB_SIZE 1
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+static void APP_ZIGBEE_SW1_Process(void);
+
+static void APP_ZIGBEE_Commissioning_Server_Init(void);
+static enum ZclStatusCodeT ZbZclCommissionServerSetStartup(struct ZbZclClusterT *clusterPtr, struct ZbStartupT *config);
+static void APP_ZIGBEE_RestartDevice(void);
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_RestartDevice_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientRestartDev *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_SaveStartup_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientSaveStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_RestoreStartup_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientRestoreStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_ResetStartup_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientResetStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStartType startupControl;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+ bool init_after_join;
+
+ struct ZbZclClusterT *commissioning_server;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+/* Commissioning server callbacks */
+static struct ZbZclCommissionServerCallbacksT CommissionServerCallbacks = {
+ .restart_device = APP_ZIGBEE_Commissioning_RestartDevice_cb,
+ .save_startup = APP_ZIGBEE_Commissioning_SaveStartup_cb,
+ .restore_startup = APP_ZIGBEE_Commissioning_RestoreStartup_cb,
+ .reset_startup = APP_ZIGBEE_Commissioning_ResetStartup_cb,
+};
+
+static struct ZbStartupT SavedConfigTab[MAX_CONFIG_TAB_SIZE];
+static struct ZbStartupT config;
+
+static uint8_t TS_ID1;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Restarting the device NWK (performing a NWK join)
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_RestartDevice(void){
+ APP_DBG("GREEN LED OFF.");
+ APP_DBG("Restarting the Startup process ...\n.");
+ BSP_LED_Off(LED_GREEN);
+ ZbReset(zigbee_app_info.zb);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Restart Device Commissioning client request callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param req: Commissioning Restart Device client command
+ * @param srcInfo: src address informations
+ * @param arg: passed argument
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_RestartDevice_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientRestartDev *req, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ enum ZclStatusCodeT status;
+ struct ZbZclCommissionServerRestartDevRsp rsp = {.status=ZCL_STATUS_SUCCESS};
+ uint32_t delay = 0;
+
+ UNUSED(arg);
+
+ APP_DBG("RestartDevice request received.");
+
+ BSP_LED_Off(LED_BLUE);
+ zigbee_app_info.join_status = ZB_ZDP_STATUS_NOT_ACTIVE;
+
+ if(req->options == ZCL_COMMISSION_OPTIONS_MODE_USE_NEW){
+ /* Installing current set of startup parameters */
+ status = ZbZclCommissionServerGetStartup(zigbee_app_info.commissioning_server, &config);
+ if(status!=ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, ZbZclCommissionServerGetStartup failed\n.");
+ rsp.status = status;
+ (void)ZbZclCommissionServerSendRestartRsp(zigbee_app_info.commissioning_server, srcInfo, &rsp);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+ }
+
+ delay = req->delay*1000; /* restart delay in ms */
+ if(delay<ZCL_COMMISSION_RESTART_DEVICE_DELAY_MS){
+ APP_DBG("Warning, a delay of %d ms for restarting is too short.", delay);
+ APP_DBG("Delay set to %d ms.", ZCL_COMMISSION_RESTART_DEVICE_DELAY_MS);
+ delay = ZCL_COMMISSION_RESTART_DEVICE_DELAY_MS;
+ }
+ HW_TS_Start(TS_ID1, delay*HW_TS_SERVER_1MS_NB_TICKS);
+
+ APP_DBG("Restarting the device in %d ms.", delay);
+ APP_DBG("GREEN LED ON.");
+ BSP_LED_On(LED_GREEN);
+
+ (void) ZbZclCommissionServerSendRestartRsp(zigbee_app_info.commissioning_server, srcInfo, &rsp);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+}
+
+/**
+ * @brief Save Startup Parameters Commissioning client request callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param req: Commissioning Save Startup Parameters client command
+ * @param srcInfo: src address informations
+ * @param arg: passed argument
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_SaveStartup_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientSaveStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ enum ZclStatusCodeT status;
+ struct ZbZclCommissionServerSaveStartupRsp rsp = {.status=ZCL_STATUS_SUCCESS};
+ struct ZbStartupT currentConfig;
+ uint8_t index = req->index;
+
+ UNUSED(arg);
+
+ APP_DBG("SaveStartup request received.");
+
+ /* Check boundary */
+ if(index>MAX_CONFIG_TAB_SIZE){
+ APP_DBG("Error, index out of bound.\n");
+ rsp.status = ZCL_STATUS_FAILURE;
+ }
+
+ /* Get the current network configuration from Commissioning server attributes */
+ status = ZbZclCommissionServerGetStartup(zigbee_app_info.commissioning_server, &currentConfig);
+ if(status!=ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, ZbZclCommissionServerGetStartup failed.\n");
+ rsp.status = status;
+ } else {
+ APP_DBG("Configuration saved with index %d.\n", req->index);
+
+ /* Save the current network configuration */
+ memset(&SavedConfigTab[index], 0, sizeof(struct ZbStartupT));
+ SavedConfigTab[index] = currentConfig;
+ }
+
+ (void) ZbZclCommissionServerSendSaveStartupRsp(zigbee_app_info.commissioning_server, srcInfo, &rsp);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+}
+
+/**
+ * @brief Restore Startup Parameters Commissioning client request callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param req: Commissioning Restore Startup Parameters client command
+ * @param srcInfo: src address informations
+ * @param arg: passed argument
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_RestoreStartup_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientRestoreStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ enum ZclStatusCodeT status = ZCL_STATUS_SUCCESS;
+ struct ZbZclCommissionServerRestoreStartupRsp rsp = {.status=ZCL_STATUS_SUCCESS};
+ uint8_t index = req->index;
+
+ UNUSED(arg);
+
+ APP_DBG("RestoreStartup request received.");
+
+ if(index>MAX_CONFIG_TAB_SIZE){
+ APP_DBG("Error, index out of bound.\n");
+ rsp.status = ZCL_STATUS_FAILURE;
+ }
+
+ /* Set the Commissioning server attributes to the values present at the requested index */
+ status = ZbZclCommissionServerSetStartup(zigbee_app_info.commissioning_server, &SavedConfigTab[index]);
+ if(status!=ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, ZbZclCommissionServerSetStartup failed.\n");
+ rsp.status = status;
+ } else {
+ APP_DBG("Startup parameters restored with index %d.\n", index);
+ }
+
+ (void) ZbZclCommissionServerSendRestoreStartupRsp(zigbee_app_info.commissioning_server, srcInfo, &rsp);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+}
+
+/**
+ * @brief Reset Startup Parameters Commissioning client request callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param req: Commissioning Reset Startup Parameters client command
+ * @param srcInfo: src address informations
+ * @param arg: passed argument
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_ResetStartup_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclCommissionClientResetStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ enum ZclStatusCodeT status = ZCL_STATUS_SUCCESS;
+ struct ZbZclCommissionServerResetStartupRsp rsp = {.status=ZCL_STATUS_SUCCESS};
+ struct ZbStartupT currentConfig;
+
+ UNUSED(arg);
+
+ APP_DBG("ResetStartup request received.");
+
+ /* reset the current network configuration */
+ memset(&currentConfig, 0, sizeof(currentConfig));
+ status = ZbZclCommissionServerSetStartup(zigbee_app_info.commissioning_server, &currentConfig);
+ if(status !=ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, ZbZclCommissionServerSetStartup failed.");
+ rsp.status = status;
+ } else {
+ APP_DBG("Startup parameters reset with default values.\n");
+ }
+
+ (void) ZbZclCommissionServerSendResetStartupRsp(zigbee_app_info.commissioning_server, srcInfo, &rsp);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+
+ /* Timer associated with the DeviceRestart command handling */
+ HW_TS_Create(1U << CFG_TIM_ZIGBEE_RESTART_DEVICE_DELAY, &TS_ID1, hw_ts_SingleShot, APP_ZIGBEE_RestartDevice);
+
+ APP_ZIGBEE_Commissioning_Server_Init();
+} /* APP_ZIGBEE_App_Init */
+
+/**
+ * @brief Power Profile server initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_Commissioning_Server_Init(void){
+ enum ZclStatusCodeT status;
+ struct ZbZclCommissionServerEnableInfoT info;
+
+ /* Enabling Commissioning client */
+ info.page = 0;
+ info.channel = 19;
+ status = ZbZclCommissionServerEnable(zigbee_app_info.commissioning_server, &info);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("ZbZclCommissionServerEnable failed.");
+ assert(0);
+ }
+ APP_DBG("Commissioning server enabled.");
+
+ /* Init nwk configuration with NULL values */
+ memset(&config, 0, sizeof(config));
+
+ status = ZbZclCommissionServerSetStartup(zigbee_app_info.commissioning_server, &config);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("ZbZclCommissionServerSetStartup failed.");
+ assert(0);
+ }
+
+ /* Change Extended Address */
+ ZbChangeExtAddr(zigbee_app_info.zb, ZR_EXT_ADDR);
+
+ APP_DBG("Commissioning server init done!\n");
+} /* APP_ZIGBEE_Commissioning_Server_Init */
+
+static enum ZclStatusCodeT ZbZclCommissionServerSetStartup(struct ZbZclClusterT *clusterPtr, struct ZbStartupT *config){
+ enum ZclStatusCodeT status;
+ uint8_t scan_count = 0;
+
+ /* ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR, (uint16_t)config->shortAddress);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_EPID */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_EPID, (uint64_t)config->extendedPanId);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_PANID */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_PANID, (uint16_t)config->panId);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_CHANNELMASK */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_CHANNELMASK, (config->channelList.list[0].channelMask & WPAN_PAGE_CHANNELMASK_ALL));
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_STACKPROFILE */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_STACKPROFILE, (uint8_t)config->stackProfile);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL */
+ switch (config->startupControl) {
+ case ZbStartTypePreconfigured:
+ case ZbStartTypeForm:
+ case ZbStartTypeRejoin:
+ case ZbStartTypeJoin:
+ break;
+
+ default:
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL, (enum ZbStartType)config->startupControl);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_TCADDR */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_TCADDR, (uint64_t)config->security.trustCenterAddress);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_NWKKEY */
+ status = ZbZclAttrWrite(clusterPtr, NULL, ZCL_COMMISSION_CLI_ATTR_NWKKEY, (const uint8_t*)&(config->security.networkKey), ZB_SEC_KEYSIZE, ZCL_ATTR_WRITE_FLAG_NORMAL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN, (bool)config->security.useInsecureRejoin);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_PRECONFLINKKEY */
+ status = ZbZclAttrWrite(clusterPtr, NULL, ZCL_COMMISSION_CLI_ATTR_PRECONFLINKKEY, (const uint8_t*)&(config->security.preconfiguredLinkKey), ZB_SEC_KEYSIZE, ZCL_ATTR_WRITE_FLAG_NORMAL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_NWKKEYSEQNUM */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_NWKKEYSEQNUM, (uint8_t)config->security.networkKeySeqNum);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_NWKKEYTYPE */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_NWKKEYTYPE, (enum ZbSecKeyTypeT)config->security.networkKeySeqNum);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_NWKMGRADDR */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_NWKMGRADDR, (uint16_t)config->networkManagerAddress);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ /* ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS */
+ ZbApsGet(clusterPtr->zb, ZB_APS_IB_ID_SCAN_COUNT, &scan_count, sizeof(scan_count));
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS, (uint8_t)scan_count);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
+ }
+
+ return ZCL_STATUS_SUCCESS;
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+ zigbee_app_info.startupControl = ZbStartTypeJoin;
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ /* Not starting nwk now but init Commissioning server */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ /* Commissioning Server */
+ zigbee_app_info.commissioning_server = ZbZclCommissionServerAlloc(zigbee_app_info.zb, ZCL_PROFILE_HOME_AUTOMATION, false, &CommissionServerCallbacks, NULL);
+ assert(zigbee_app_info.commissioning_server != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.commissioning_server);
+
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+
+ /* Setting up additional startup configuration parameters (not Commissioning attributes) */
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.security.level = 0x05;
+ config.bdbCommissioningMode = 0;
+ memcpy(config.security.distributedGlobalKey, sec_key_distrib_uncert, ZB_SEC_KEYSIZE);
+ config.capability = (MCP_ASSOC_CAP_PWR_SRC
+ | MCP_ASSOC_CAP_RXONIDLE
+ | MCP_ASSOC_CAP_ALLOC_ADDR
+ | MCP_ASSOC_CAP_DEV_TYPE);
+
+ /* As Extended PAN ID is provided, we will try to connect only to the NWK with this extended PAN ID */
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ zigbee_app_info.init_after_join = true;
+ APP_DBG("BLUE LED ON.");
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, attempting again after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ uint16_t pid = 0, nwk_addr = 0;
+ uint64_t epid = 0;
+
+ APP_DBG("Device current network parameters:");
+
+ /* NWK address */
+ if(ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkAddress, &nwk_addr, sizeof(nwk_addr)) != ZB_STATUS_SUCCESS){
+ APP_DBG("Error, ZbNwkGet failed.\n");
+ return;
+ }
+ APP_DBG("NWK address: 0x%04x", nwk_addr);
+
+ /* PAN ID */
+ if(ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_PanId, &pid, sizeof(pid)) != ZB_STATUS_SUCCESS){
+ APP_DBG("Error, ZbNwkGet failed.\n");
+ return;
+ }
+ APP_DBG("PAN ID: 0x%04x", pid);
+
+ /* Extended PAN ID */
+ if(ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_ExtendedPanId, &epid, sizeof(epid)) != ZB_STATUS_SUCCESS){
+ APP_DBG("Error, ZbNwkGet failed.\n");
+ return;
+ }
+ APP_DBG("Extended PAN ID: 0x%" PRIx64 "\n.", epid);
+} /* APP_ZIGBEE_SW1_Process */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/readme.txt
new file mode 100644
index 000000000..b9d35202f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/readme.txt
@@ -0,0 +1,211 @@
+/**
+ @page Zigbee_Commissioning_Server_Router application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_Commissioning_Server_Router/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Commissioning Cluster application as a
+ * client using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Commissioning cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to operate a commissioning process using the Commissioning cluster. Once the Zigbee mesh
+network is created, the user can send requests for the commissioning process from client to
+server (through push button SW1).
+
+The router network info can be checked by pressing push button SW1. It will show:
+- Network address assigned to the device.
+- Network PAN ID and extended PAN ID.
+
+Note: You can press push button SW1 on Commissioning client router before and after
+ Commissioning process to see the changes.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Commissioning_Server_Router
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Commissioning_Client_Coord
+
+
+Demo use case :
+
+This demo shows how to use Commissioning cluster.
+The Commissioning cluster is used to operate a commissioning process on a not connected
+Zigbee router (Commissioning server) from the Zigbee coordinator (Commissioning client).
+
+For that, Commissioning process from the client uses INTERPAN communication that allows to
+address requests to not connected devices.
+
+The Commissioning process is as follow:
+
+0. Initial server configuration: commissioning capabiliy (INTERPAN communication) enabled.
+ --> device MAC layer configured to listen for packets.
+ --> the server is able to handle requests even if not connected through the network.
+
+1. The client sends Reset Startup request to server.
+ --> the server current startup configuration is cleared.
+
+2. The client remotely writes commissioning server attributes (INTERPAN communication):
+ - ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR
+ - ZCL_COMMISSION_CLI_ATTR_EPID
+ - ZCL_COMMISSION_CLI_ATTR_STACKPROFILE
+ - ZCL_COMMISSION_CLI_ATTR_CHANNELMASK
+ - ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN
+ - ZCL_COMMISSION_CLI_ATTR_PRECONFLINKKEY
+ - ZCL_COMMISSION_CLI_ATTR_NWKKEYTYPE
+ - ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL
+ - ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS
+
+ --> the server startup configuration changes.
+
+3. The client sends Save Startup request to server (request with an index value of 0).
+ --> the server current startup configuration is saved (under index 0).
+
+4. The client sends Reset Startup request to server.
+ --> the server current startup configuration is cleared.
+
+5. The client sends Restore Startup request to server (request with an index value of 0).
+ --> the server restore current startup configuration from a saved
+ startup configuration (index 0).
+
+6. The client sends Restart device request to server.
+ --> the server operate a full startup process with current startup configuration.
+ --> the server router joins the network.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | /* Commissioning server init */ | |
+ | | -->| |
+ | | ZbZclCommissionServerEnable() | | |
+ | | ---| |
+ | | | |
+ | | /* Commissioning process */ | |
+ | | | |
+ | | ZbZclCommissionClientSendResetStartup() | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclWriteReq() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendSaveStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendResetStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendResoreStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclCommissionClientSendRestartStartup() | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | -->| |
+ | | /* Waiting the delay mentioned in the RestartStartup cmd */ | | |=> GREEN LED ON (during delay)
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | /* Router joins the network*/ | | |=> BLUE LED ON
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | /* Show network info */ | | |<=PushB SW1
+ | | ---| |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_Commissioning_Client_Coord application (Device1 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router but it will not connect to the
+ Zigbee network. Connecting the router to the network is the goal of this demo.
+
+ b) When Commissioning process is complete, the router joins the network and its Blue LED (LED1) is ON.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Src/app_entry.c
index 38614c4d5..fab440cd8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/App/app_zigbee.c
index a67b4383c..ef22b0fa5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 18
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -360,8 +363,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
@@ -420,7 +426,7 @@ static void device_temp_read_cb(const ZbZclReadRspT *readRsp, void *arg)
{
case ZCL_DEV_TEMP_CURRENT:
current_temp = pletoh16(readRsp->attr[i].value);
- APP_DBG("[DEV TEMP] Current Temperature= %dC",current_temp);
+ APP_DBG("[DEV TEMP]Current Temperature= %dC",current_temp);
break;
case ZCL_DEV_TEMP_MIN_TEMP:
min_temp = pletoh16(readRsp->attr[i].value);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Src/app_entry.c
index 34117d963..2e8aa9fbc 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/App/app_zigbee.c
index 88d8a6047..8d6a9d41e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -44,7 +44,8 @@
#define ZCL_DEVICE_TEMP_LIMIT 50
#define ZCL_DEVICE_TEMP_RESOL 2
-
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
@@ -389,8 +390,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_conf.h
new file mode 100644
index 000000000..da0d52657
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/app_entry.c
new file mode 100644
index 000000000..7fa137a42
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/app_entry.c
@@ -0,0 +1,501 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Project.eww
new file mode 100644
index 000000000..9add51e0c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_Diagnostic_Client_Router.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewd
new file mode 100644
index 000000000..11a57b997
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Diagnostic_Client_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewp
new file mode 100644
index 000000000..9d5576067
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Diagnostic_Client_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_Diagnostic_Client_Router/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_Diagnostic_Client_Router/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_Diagnostic_Client_Router/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_Diagnostic_Client_Router.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_Diagnostic_Client_Router.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..17de8b738
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,688 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.onoff.h"
+#include "zcl/zcl.diagnostics.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_SW1_Process(void);
+static void APP_ZIGBEE_SW2_Process(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_Diagnostic_Client_Init(void);
+static void APP_ZIGBEE_Diagnostic_Client_Read_attr(void);
+static void APP_ZIGBEE_Diagnostic_Client_Read_attr_cb(const ZbZclReadRspT *rsp, void *arg);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *diagnostic_client_1;
+ struct ZbZclClusterT *onoff_client_1;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read Diagnostic RX/TX attribute
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_Diagnostic_Client_Read_attr(void){
+ enum ZclStatusCodeT status;
+ ZbZclReadReqT req;
+
+ APP_DBG("[DIAGNOSTIC] Reading RX/TX UCAST attributes ...");
+
+ memset(&req, 0, sizeof(req));
+ req.dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ req.dst.endpoint = SW1_ENDPOINT;
+ req.dst.nwkAddr = 0x0;
+ req.count = 2;
+
+ req.attr[0] = ZCL_DIAG_ATTR_APS_RX_UCAST;
+ req.attr[1] = ZCL_DIAG_ATTR_APS_TX_UCAST_SUCCESS;
+
+ status = ZbZclReadReq(zigbee_app_info.diagnostic_client_1, &req, APP_ZIGBEE_Diagnostic_Client_Read_attr_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[DIAGNOSTIC] Error, ZbZclReadReq failed.");
+ }
+}
+
+/**
+ * @brief Read Attribute callback
+ * @param rsp: ZCL response
+ * @param arg: passed argument
+ * @retval None
+ */
+static void APP_ZIGBEE_Diagnostic_Client_Read_attr_cb(const ZbZclReadRspT *rsp, void *arg){
+ uint8_t buf[256];
+ unsigned int *val=(unsigned int*)buf;
+
+ UNUSED(arg);
+
+ if(rsp->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[DIAGNOSTIC] The server returned an error: 0x%02x.\n", rsp->status);
+ }
+
+ for(unsigned int cpt=0 ; cpt<rsp->count ; cpt++){
+ /* Copy the value into a buffer */
+ memset(buf, 0, sizeof(buf));
+ memcpy(buf, rsp->attr[cpt].value, rsp->attr[cpt].length);
+
+ /* Output the remotely read attribute value */
+ switch(rsp->attr[cpt].attrId){
+ case ZCL_DIAG_ATTR_APS_RX_UCAST:
+ APP_DBG("[DIAGNOSTIC] The Diagnostic server device APS layer received %d unicasts", *val);
+ APP_DBG("[DIAGNOSTIC] (including +1 for the remote reading).");
+ break;
+
+ case ZCL_DIAG_ATTR_APS_TX_UCAST_SUCCESS:
+ APP_DBG("[DIAGNOSTIC] The Diagnostic server device APS layer successfuly sent %d unicasts", *val);
+ APP_DBG("[DIAGNOSTIC] (including +1 for the remote reading).\n");
+ break;
+
+ default:
+ APP_DBG("[DIAGNOSTIC] Error: unsupported attribute.\n");
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with push button SW1, and 2 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW2, UTIL_SEQ_RFU, APP_ZIGBEE_SW2_Process);
+
+ /* Initialize Zigbee Diagnostic Client parameters */
+ APP_ZIGBEE_Diagnostic_Client_Init();
+} /* APP_ZIGBEE_App_Init */
+
+/**
+ * @brief Diagnostic client initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_Diagnostic_Client_Init(void){
+ APP_DBG("[DIAGNOSTIC] Diagnostic client init done!\n");
+} /* APP_ZIGBEE_Diagnostic_Client_Init */
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_DATA_COLLECTION_UNIT;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* Diagnostic Client */
+ zigbee_app_info.diagnostic_client_1 = ZbZclDiagnosticsClientAlloc(zigbee_app_info.zb, SW1_ENDPOINT);
+ assert(zigbee_app_info.diagnostic_client_1 != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.diagnostic_client_1);
+
+ /* On Off Client */
+ zigbee_app_info.onoff_client_1 = ZbZclOnOffClientAlloc(zigbee_app_info.zb, SW1_ENDPOINT);
+ assert(zigbee_app_info.onoff_client_1 != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.onoff_client_1);
+
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+ config.startupControl = ZbStartTypeJoin;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /* Channel in use*/
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, attempting again after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+ }
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ enum ZclStatusCodeT status;
+ struct ZbApsAddrT dst;
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+
+ APP_DBG("OnOff toggle request");
+ status = ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, NULL, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed");
+ }
+} /* APP_ZIGBEE_SW1_Process */
+
+/**
+ * @brief Button 2 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW2_Process(void)
+{
+ APP_ZIGBEE_Diagnostic_Client_Read_attr();
+} /* APP_ZIGBEE_SW2_Process */
+
+/**
+ * @brief Button 3 callback
+ * @param None
+ * @retval None
+ */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/readme.txt
new file mode 100644
index 000000000..b5d8862e3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/readme.txt
@@ -0,0 +1,144 @@
+/**
+ @page Zigbee_Diagnostic_Client_Router application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_Diagnostic_Client_Router/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Diagnostic Cluster application as a client
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Diagnostic cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the Diagnostic cluster. Once the Zigbee mesh
+network is created, the user can send requests from the client to the server through push buttons SW1 and SW2.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Diagnostic_Server_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Diagnostic_Client_Router
+
+
+Demo use case :
+
+This demo shows how to use Diagnostic cluster.
+The coordinator (the 'server') is composed of 1 Diagnostic server and 1 OnOff server.
+The router (the 'client') is composed of 1 Diagnostic client and 1 OnOff client.
+
+The client can send ZCL OnOff toggle request to the OnOff server.
+The client can remotely read Diagnostic server attributes by requesting a remote read.
+
+Two Diagnostic attributes related to unicast RX/TX are used :
+- ZCL_DIAG_ATTR_APS_RX_UCAST
+- ZCL_DIAG_ATTR_APS_TX_UCAST_SUCCESS
+
+When the user reads these attributes, thier changes change because the ZCL read is based on RX/TX too.
+It's the same for the ZCL OnOff commands.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | | |
+ | | | |
+ | | | |
+ | | ZbZclOnOffClientToggleReq() | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=> GREEN LED toogle
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclReadReq() | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_Diagnostic_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+ it is now possible to remotely read Diagnostic server attributes on the client by pressing on
+ the SW1/SW2 push button.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_conf.h
new file mode 100644
index 000000000..c68880bb0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_conf.h
@@ -0,0 +1,351 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/app_entry.c
new file mode 100644
index 000000000..d9acfa065
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/app_entry.c
@@ -0,0 +1,499 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ break;
+
+ case BUTTON_SW2_PIN:
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Project.eww
new file mode 100644
index 000000000..04ac27f9f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_Diagnostic_Server_Coord.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewd
new file mode 100644
index 000000000..2550021a3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Diagnostic_Server_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewp
new file mode 100644
index 000000000..41009fed4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_Diagnostic_Server_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_Diagnostic_Server_Coord/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_Diagnostic_Server_Coord/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_Diagnostic_Server_Coord/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_Diagnostic_Server_Coord.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_Diagnostic_Server_Coord.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..40de8314c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,618 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.onoff.h"
+#include "zcl/zcl.diagnostics.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_Diagnostic_Server_Init(void);
+static enum ZclStatusCodeT APP_ZIGBEE_OnOff_server_toggle(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ bool diagnostic_server;
+ struct ZbZclClusterT *onoff_server;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+struct ZbZclOnOffServerCallbacksT ZbZclOnOffServerCallbacks = {
+ .toggle = APP_ZIGBEE_OnOff_server_toggle,
+};
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Initialize Zigbee Diagnotic Server parameters */
+ APP_ZIGBEE_Diagnostic_Server_Init();
+}
+
+/**
+ * @brief Diagnotic server initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_Diagnostic_Server_Init(void){
+ APP_DBG("[DIAGNOSTIC] Diagnotic server init done!\n");
+} /* APP_ZIGBEE_Diagnostic_Server_Init */
+
+/**
+ * @brief OnOff server toggle callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param srcInfo: Src address information
+ * @param arg: passed arguments
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_OnOff_server_toggle(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ uint8_t attrVal;
+ enum ZclStatusCodeT status;
+
+ status = ZbZclAttrRead(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, NULL, &attrVal, sizeof(attrVal), false);
+
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_FAILURE;
+ }
+ if (attrVal != 0) {
+ APP_DBG("LED_GREEN OFF");
+ BSP_LED_Off(LED_GREEN);
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, 0);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_FAILURE;
+ }
+ }
+ else {
+ APP_DBG("LED_GREEN ON");
+ BSP_LED_On(LED_GREEN);
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, 1);
+ if (status != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_FAILURE;
+ }
+ }
+
+ return ZCL_STATUS_SUCCESS;
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ /* run the task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_METER_INTERFACE;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* Diagnotic Server */
+ zigbee_app_info.diagnostic_server = ZbZclDiagnosticsServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, ZCL_PROFILE_HOME_AUTOMATION, ZB_APS_STATUS_UNSECURED);
+ assert(zigbee_app_info.diagnostic_server != false);
+
+ /* On Off Server */
+ zigbee_app_info.onoff_server = ZbZclOnOffServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, &ZbZclOnOffServerCallbacks, NULL);
+ assert(zigbee_app_info.onoff_server != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.onoff_server);
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ /* Set the centralized network */
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORD");
+ config.startupControl = ZbStartTypeForm;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /*Channel in use */
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, re-attempting to form a network after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+ }
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/readme.txt
new file mode 100644
index 000000000..9b9b43b21
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/readme.txt
@@ -0,0 +1,144 @@
+/**
+ @page Zigbee_Diagnostic_Server_Router application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_Diagnostic_Server_Router/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Diagnostic Cluster application as a client
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Diagnostic cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the Diagnostic cluster. Once the Zigbee mesh
+network is created, the user can send requests from the client to the server through push buttons SW1 and SW2.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Diagnostic_Server_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_Diagnostic_Client_Router
+
+
+Demo use case :
+
+This demo shows how to use Diagnostic cluster.
+The coordinator (the 'server') is composed of 1 Diagnostic server and 1 OnOff server.
+The router (the 'client') is composed of 1 Diagnostic client and 1 OnOff client.
+
+The client can send ZCL OnOff toggle request to the OnOff server.
+The client can remotely read Diagnostic server attributes by requesting a remote read.
+
+Two Diagnostic attributes related to unicast RX/TX are used :
+- ZCL_DIAG_ATTR_APS_RX_UCAST
+- ZCL_DIAG_ATTR_APS_TX_UCAST_SUCCESS
+
+When the user reads these attributes, thier changes change because the ZCL read is based on RX/TX too.
+It's the same for the ZCL OnOff commands.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | | |
+ | | | |
+ | | | |
+ | | ZbZclOnOffClientToggleReq() | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=> GREEN LED toogle
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclReadReq() | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_Diagnostic_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+ it is now possible to remotely read Diagnostic server attributes on the client by pressing on
+ the SW1/SW2 push button.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_conf.h
new file mode 100644
index 000000000..ad1fff13c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_conf.h
@@ -0,0 +1,354 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+ CFG_TASK_BUTTON_SW3,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/app_entry.c
new file mode 100644
index 000000000..3d0ce436b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/app_entry.c
@@ -0,0 +1,502 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW3,CFG_SCH_PRIO_1);
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Project.eww
new file mode 100644
index 000000000..1a9bcea03
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_DoorLock_Client_Router.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewd
new file mode 100644
index 000000000..68a5544ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_DoorLock_Client_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewp
new file mode 100644
index 000000000..0d0e2b900
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_DoorLock_Client_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_DoorLock_Client_Router/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_DoorLock_Client_Router/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_DoorLock_Client_Router/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_DoorLock_Client_Router.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_DoorLock_Client_Router.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..668ac87c3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,880 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.alarm.h"
+#include "zcl/zcl.doorlock.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+
+/* DoorLock specific defines -------------------------------------------------*/
+#define USER_ID 0x1
+#define USER_STATUS DOORLOCK_USER_STATUS_OCC_ENABLED
+#define USER_TYPE DOORLOCK_USER_TYPE_UNRESTRICTED
+#define PIN_CODE "PASSWD"
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_SW1_Process(void);
+static void APP_ZIGBEE_SW2_Process(void);
+static void APP_ZIGBEE_SW3_Process(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_ALARM_CLIENT_cb(void *arg, uint16_t nwk_addr, uint8_t endpoint, uint8_t alarm_code, uint16_t cluster_id);
+
+static void APP_ZIGBEE_DoorLock_Client_Init(void);
+static void APP_ZIGBEE_DoorLock_Client_Send_Lock(void);
+static void APP_ZIGBEE_DoorLock_Client_Send_Unlock(void);
+static void APP_ZIGBEE_DoorLock_Client_Send_UnlockWithWrongPIN(void);
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg);
+static void APP_ZIGBEE_DoorLock_Cmd_Rsp_Mgmt(struct ZbZclCommandRspT *zcl_rsp);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *doorlock_client;
+ struct ZbZclClusterT *alarm_client;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Alarm client callback
+ * @param nwk_addr: Alarm server ntw address
+ * @param endpoint: Alarm server endpoint
+ * @param alarm_code: Alarm code (cluster specific)
+ * @param cluster_id: Cluster ID (related to Alarm code)
+ * @param arg: passed arguments
+ * @retval None
+ */
+static void APP_ZIGBEE_ALARM_CLIENT_cb(void *arg, uint16_t nwk_addr, uint8_t endpoint, uint8_t alarm_code, uint16_t cluster_id){
+ UNUSED(arg);
+
+ switch(cluster_id){
+ case ZCL_CLUSTER_DOOR_LOCK:
+ APP_DBG("[ALARM] Alarm received from Door Lock cluster (code %d) from addr 0x%04x.", alarm_code, nwk_addr);
+
+ /* RED led on during 500ms */
+ BSP_LED_On(LED_RED);
+ APP_DBG("LED_RED ON\n");
+ HAL_Delay(500);
+ BSP_LED_Off(LED_RED);
+ APP_DBG("LED_RED OFF\n");
+ break;
+
+ default:
+ APP_DBG("[ALARM] Error, alarm from an unexpected cluser received.");
+ break;
+ }
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with push button SW1, 2 and 3 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW2, UTIL_SEQ_RFU, APP_ZIGBEE_SW2_Process);
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW3, UTIL_SEQ_RFU, APP_ZIGBEE_SW3_Process);
+
+ /* Initialize Zigbee Meter Identification Client parameters */
+ APP_ZIGBEE_DoorLock_Client_Init();
+} /* APP_ZIGBEE_App_Init */
+
+/**
+ * @brief Door Lock client initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Client_Init(void){
+ struct ZbApsAddrT dst;
+ struct ZbZclDoorLockSetPinReqT DoorLockSetPinReq;
+ enum ZclStatusCodeT status;
+
+ APP_DBG("[DOORLOCK] Requesting PIN code setting for the user.");
+
+ /* Setting up the addressing mode */
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+
+ /* Creating a request for new user and its associated pin */
+ memset(&DoorLockSetPinReq, 0, sizeof(DoorLockSetPinReq));
+ DoorLockSetPinReq.user_id = USER_ID;
+ DoorLockSetPinReq.user_status = USER_STATUS;
+ DoorLockSetPinReq.user_type = USER_TYPE;
+ DoorLockSetPinReq.pin_len = sizeof(PIN_CODE);
+ memset(DoorLockSetPinReq.pin, 0, DOORLOCK_MAX_PIN);
+ memcpy(DoorLockSetPinReq.pin, PIN_CODE, DoorLockSetPinReq.pin_len);
+
+ /* Send the request */
+ status = ZbZclDoorLockClientSetPinReq(zigbee_app_info.doorlock_client, &dst, &DoorLockSetPinReq, &APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] Error, ZbZclDoorLockClientSetPinReq failed");
+ return;
+ }
+} /* APP_ZIGBEE_DoorLock_Client_Init */
+
+/**
+ * @brief DoorLock client lock command
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Client_Send_Lock(void){
+ struct ZbApsAddrT dst;
+ struct ZbZclDoorLockLockDoorReqT ZbZclDoorLockLockDoorReq;
+ enum ZclStatusCodeT status;
+
+ APP_DBG("[DOORLOCK] Requesting a Lock.");
+
+ /* Setting up the addressing mode */
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+
+ /* Creating a request for the unlock cmd */
+ memset(&ZbZclDoorLockLockDoorReq, 0, sizeof(ZbZclDoorLockLockDoorReq));
+ ZbZclDoorLockLockDoorReq.pin_len = sizeof(PIN_CODE);
+ memset(ZbZclDoorLockLockDoorReq.pin, 0, DOORLOCK_MAX_PIN);
+ memcpy(ZbZclDoorLockLockDoorReq.pin, PIN_CODE, ZbZclDoorLockLockDoorReq.pin_len);
+
+ /* Send the request */
+ status = ZbZclDoorLockClientLockReq(zigbee_app_info.doorlock_client, &dst, &ZbZclDoorLockLockDoorReq, &APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] Error, ZbZclDoorLockClientLockReq failed.");
+ return;
+ }
+} /* APP_ZIGBEE_DoorLock_Client_Send_Lock */
+
+/**
+ * @brief DoorLock client unlock command
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Client_Send_Unlock(void){
+ struct ZbApsAddrT dst;
+ struct ZbZclDoorLockUnlockDoorReqT DoorLockUnlockDoorReq;
+ enum ZclStatusCodeT status;
+
+ APP_DBG("[DOORLOCK] Requesting an Unlock.");
+
+ /* Setting up the addressing mode */
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+
+ /* Creating a request for the unlock cmd */
+ memset(&DoorLockUnlockDoorReq, 0, sizeof(DoorLockUnlockDoorReq));
+ DoorLockUnlockDoorReq.pin_len = sizeof(PIN_CODE);
+ memset(DoorLockUnlockDoorReq.pin, 0, DOORLOCK_MAX_PIN);
+ memcpy(DoorLockUnlockDoorReq.pin, PIN_CODE, DoorLockUnlockDoorReq.pin_len);
+
+ /* Send the request */
+ status = ZbZclDoorLockClientUnlockReq(zigbee_app_info.doorlock_client, &dst, &DoorLockUnlockDoorReq, &APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] Error, ZbZclDoorLockClientUnlockReq failed");
+ return;
+ }
+} /* APP_ZIGBEE_DoorLock_Client_Send_Unlock */
+
+static void APP_ZIGBEE_DoorLock_Client_Send_UnlockWithWrongPIN(void){
+ struct ZbApsAddrT dst;
+ struct ZbZclDoorLockUnlockDoorReqT DoorLockUnlockDoorReq;
+ enum ZclStatusCodeT status;
+
+ APP_DBG("[DOORLOCK] Requesting an Unlock with a wrong PIN.");
+
+ /* Setting up the addressing mode */
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+
+
+ /* Creating a request for the unlock cmd with a wrong pin (set to 0) */
+ DoorLockUnlockDoorReq.pin_len = 1;
+ memset(DoorLockUnlockDoorReq.pin, 0, DOORLOCK_MAX_PIN);
+ memcpy(DoorLockUnlockDoorReq.pin, 0, 1);
+
+ /* Send the request */
+ status = ZbZclDoorLockClientUnlockReq(zigbee_app_info.doorlock_client, &dst, &DoorLockUnlockDoorReq, &APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] Error, ZbZclDoorLockClientUnlockReq failed");
+ return;
+ }
+} /* APP_ZIGBEE_DoorLock_Client_Send_UnlockWithWrongPIN */
+
+/**
+ * @brief Device generic command response callback
+ * @param zcl_rsp: ZCL response
+ * @param arg: passed arguments
+ * @retval None
+ */
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg){
+ UNUSED(arg);
+
+ /* Checking response consistency */
+ assert(zcl_rsp != NULL);
+
+ switch(zcl_rsp->hdr.frameCtrl.frameType){
+ case ZCL_FRAMETYPE_PROFILE:
+ /* general frame cmd response */
+
+ switch(zcl_rsp->hdr.cmdId){
+ case ZCL_COMMAND_DEFAULT_RESPONSE:
+ /* general default response */
+ if (zcl_rsp->status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Default response: the server returned an error: 0x%02x.\n", zcl_rsp->status);
+ } else {
+ APP_DBG("Default response: success!\n");
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported general cmd type.\n");
+ break;
+ }
+ break;
+
+ case ZCL_FRAMETYPE_CLUSTER:
+ /* cluster specific frame cmd response */
+
+ if(zcl_rsp->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error: cmd not successfully received. 0x%02x.\n", zcl_rsp->status);
+ return;
+ }
+
+ switch(zcl_rsp->clusterId){
+ case ZCL_CLUSTER_DOOR_LOCK:
+ /* DoorLock cluster */
+ APP_ZIGBEE_DoorLock_Cmd_Rsp_Mgmt(zcl_rsp);
+ break;
+
+ default:
+ APP_DBG("Error: unsupported cluster.\n");
+ break;
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported frame type.\n");
+ break;
+ }
+} /* APP_ZIGBEE_Generic_Cmd_Rsp_cb */
+
+/**
+ * @brief DoorLock client command response management
+ * @param zcl_rsp: ZCL response
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Cmd_Rsp_Mgmt(struct ZbZclCommandRspT *zcl_rsp){
+ uint8_t rsp_status = 0;
+
+ /* Checking response consistency */
+ assert(zcl_rsp != NULL && zcl_rsp->payload != NULL);
+
+ memcpy(&rsp_status, zcl_rsp->payload, sizeof(rsp_status));
+ switch(zcl_rsp->hdr.cmdId){
+ case ZCL_DOORLOCK_SVR_LOCK_RSP:
+ /* DoorLock lock cmd response */
+ if (rsp_status != DOORLOCK_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] Lock response: the server returned an error: 0x%02x.\n", rsp_status);
+ } else {
+ APP_DBG("[DOORLOCK] Lock response: success!\n");
+ }
+ break;
+
+ case ZCL_DOORLOCK_SVR_UNLOCK_RSP:
+ /* DoorLock unlock cmd response */
+ if (rsp_status != DOORLOCK_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] Unlock response: the server returned an error: 0x%02x.\n", rsp_status);
+ } else {
+ APP_DBG("[DOORLOCK] Unlock response: success!\n");
+ }
+ break;
+
+ case ZCL_DOORLOCK_SVR_SETPIN_RSP:
+ /* DoorLock set_pin cmd response */
+ if (rsp_status != DOORLOCK_STATUS_SUCCESS) {
+ APP_DBG("[DOORLOCK] set_pin response: the server returned an error: 0x%02x.\n", rsp_status);
+ } else {
+ APP_DBG("[DOORLOCK] set_pin response: success!\n");
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported general cmd type.\n");
+ break;
+ }
+} /* APP_ZIGBEE_DoorLock_Cmd_Rsp_Mgmt */
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_DATA_COLLECTION_UNIT;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* DoorLock and Alarm cluster are mapped in the same endpoint */
+
+ /* Alarm Client */
+ zigbee_app_info.alarm_client = ZbZclAlarmClientAlloc(zigbee_app_info.zb, SW1_ENDPOINT, APP_ZIGBEE_ALARM_CLIENT_cb, NULL);
+ assert(zigbee_app_info.alarm_client != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.alarm_client);
+
+ /* DoorLock Client */
+ zigbee_app_info.doorlock_client = ZbZclDoorLockClientAlloc(zigbee_app_info.zb, SW1_ENDPOINT);
+ assert(zigbee_app_info.doorlock_client != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.doorlock_client);
+
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+ config.startupControl = ZbStartTypeJoin;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /* Channel in use*/
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, attempting again after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+ }
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ APP_ZIGBEE_DoorLock_Client_Send_Unlock();
+} /* APP_ZIGBEE_SW1_Process */
+
+/**
+ * @brief Button 2 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW2_Process(void)
+{
+ APP_ZIGBEE_DoorLock_Client_Send_Lock();
+} /* APP_ZIGBEE_SW2_Process */
+
+/**
+ * @brief Button 3 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW3_Process(void)
+{
+ APP_ZIGBEE_DoorLock_Client_Send_UnlockWithWrongPIN();
+} /* APP_ZIGBEE_SW3_Process */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/readme.txt
new file mode 100644
index 000000000..8b94c7670
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/readme.txt
@@ -0,0 +1,212 @@
+/**
+ @page Zigbee_DoorLock_Client_Router application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_DoorLock_Client_Router/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Door Lock Cluster application as a client
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Door Lock cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the Door Lock cluster. Once the Zigbee mesh
+network is created, the user can send requests from both client to server (through push buttons SW1, SW2 and SW3)
+and server to client (push buttons SW1).
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_DoorLock_Server_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_DoorLock_Client_Router
+
+
+Demo use case :
+
+This demo shows how to use Door Lock cluster.
+
+The Door Lock Server set up its initial configuration:
+ - The lock state is locked.
+ - The Door Lock normal and passage mode are supported.
+ - The operating mode is set to normal.
+ - The Auto Relock Time is set to 5 seconds.
+ - The Door Lock alarm supports <Forced Door Open under Door Locked Condition> event.
+
+When the Door Lock server lock state is locked, the green led is ON.
+The Door Lock Server periodically enables passage mode (every 30 seconds during 10 seconds).
+When passage mode is activated on server, the red led is ON.
+
+The Door Lock Client can remotely:
+ - Create a new user (with PIN code).
+ - Lock/Unlock the door (including unlock requests with a wrong PIN).
+
+When the Door Lock client receives a Door Lock alarm notification, the red led
+is ON during 500ms.
+
+Note: When the Door Lock server is in passage mode, the PIN code is not checked
+ and the lock remains open after an unlock.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | /* Door Lock server init */ | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_LOCKSTATE) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_DOORSTATE) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_SUPPORTED_MODES) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_MODE) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_AUTO_RELOCK) | | |
+ | | ---| |
+ | | | |
+ | | | |
+ | | /* Door Lock client/server normal mode interaction */ | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(PIN) | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=> GREEN LED OFF
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | /* When Auto Relock Time is reached */ -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_LOCKSTATE) | | |=> GREEN LED ON
+ | | ---| |
+ | | | |
+ | | ZbZclDoorLockClientLockReq(PIN) | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |=> GREEN LED ON
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(WRONG_PIN) | |
+ PushB SW3=>| | -------------------------------------------------------------------> | |=> GREEN LED remains ON
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | | |
+ | | /* Door Lock client/server passage interaction */ | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(PIN) | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=> GREEN LED OFF
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclDoorLockClientLockReq(PIN) | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |=> GREEN LED ON
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(WRONG_PIN) | |
+ PushB SW3=>| | -------------------------------------------------------------------> | |=> GREEN LED OFF
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | | |
+ | | /* Forced Door Open under Door Locked Condition alarm */ | |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_DOORSTATE) | | |<=PushB SW1
+ | | ---| |
+ | | ZbZclClusterSendAlarm | |
+RED LED ON <=| | <------------------------------------------------------------------- | |
+ | | | |
+ | | -->| |
+ | | /* Passage mode for 10s */ | | |<=PushB SW2
+ | | ---| |
+ | | | |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_DoorLock_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+ it is now possible to remotely read Door Lock server attributes on the client by pressing on
+ the SW1/SW2 push button.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_conf.h
new file mode 100644
index 000000000..b59564bfb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_conf.h
@@ -0,0 +1,359 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE,
+ CFG_TIM_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE_DURATION,
+ CFG_TIM_ZIGBEE_APP_DOORLOCK_AUTO_RELOCK_TIME,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE,
+ CFG_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE_DURATION,
+ CFG_ZIGBEE_APP_DOORLOCK_AUTO_RELOCK_TIME,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/app_entry.c
new file mode 100644
index 000000000..2e8aa9fbc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/app_entry.c
@@ -0,0 +1,501 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Project.eww
new file mode 100644
index 000000000..0786f2f11
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_DoorLock_Server_Coord.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewd
new file mode 100644
index 000000000..a144c1e21
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_DoorLock_Server_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewp
new file mode 100644
index 000000000..72ded8460
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_DoorLock_Server_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_DoorLock_Server_Coord/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_DoorLock_Server_Coord/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_DoorLock_Server_Coord/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_DoorLock_Server_Coord.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_DoorLock_Server_Coord.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..312849462
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,1392 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.time.h"
+#include "zcl/zcl.alarm.h"
+#include "zcl/zcl.doorlock.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+#define HW_TS_SERVER_1S_NB_TICKS (1*1000*1000/CFG_TS_TICK_VAL)
+
+/* Alarm specific defines -------------------------------------------------*/
+#define ZCL_ALARM_LOG_ENTRY_NB 4U
+
+/* DoorLock specific defines -------------------------------------------------*/
+#define MAX_PIN_NB_USERS 5
+#define DOORLOCK_PASSAGE_MODE_DURATION 10*HW_TS_SERVER_1S_NB_TICKS
+#define DOORLOCK_AUTO_RELOCK_TIME 5
+
+#define DOORLOCK_DOORSTATE_OPEN 0x00
+#define DOORLOCK_DOORSTATE_CLOSE 0x01
+#define DOORLOCK_DOORSTATE_ERROR_JAMMED 0x02
+#define DOORLOCK_DOORSTATE_ERROR_FORCED_OPEN 0x03
+#define DOORLOCK_DOORSTATE_ERROR_UNSPECIFIED 0x04
+#define DOORLOCK_DOORSTATE_ERROR_UNDEFINED 0xFF
+
+#define DOORLOCK_NORMAL_MODE 0x00
+#define DOORLOCK_VACATION_MODE 0x01
+#define DOORLOCK_PRIVACY_MODE 0x02
+#define DOORLOCK_NO_RF_LOCK_UNLOCK_MODE 0x03
+#define DOORLOCK_PASSAGE_MODE 0x04
+#define DOORLOCK_NORMAL_MODE_SUPPORTED 1 << DOORLOCK_NORMAL_MODE
+#define DOORLOCK_VACATION_MODE_SUPPORTED 1 << DOORLOCK_VACATION_MODE
+#define DOORLOCK_PRIVACY_MODE_SUPPORTED 1 << DOORLOCK_PRIVACY_MODE
+#define DOORLOCK_NO_RF_LOCK_UNLOCK_MODE_SUPPORTED 1 << DOORLOCK_NO_RF_LOCK_UNLOCK_MODE
+#define DOORLOCK_PASSAGE_MODE_SUPPORTED 1 << DOORLOCK_PASSAGE_MODE
+
+/* Deadbolt Jammed alarm */
+#define DOORLOCK_ALARM_DEADBOLT_JAMMED 0x00
+/* Lock Reset to Factory Defaults alarm */
+#define DOORLOCK_ALARM_RESET 0x01
+/* RF Module Power Cycled alarm */
+#define DOORLOCK_ALARM_RF_MODULE 0x03
+/* Tamper Alarm – wrong code entry limit */
+#define DOORLOCK_ALARM_WRONG_CODE_LIMIT 0x04
+/* Tamper Alarm - front escutcheon removed from main */
+#define DOORLOCK_ALARM_FRONT 0x05
+/* Forced Door Open under Door Locked Condition alarm */
+#define DOORLOCK_ALARM_FORCED_DOOR 0x06
+
+struct doorlock_info_t {
+ uint8_t current_nb_users;
+ struct ZbZclDoorLockSetPinReqT user_tab[MAX_PIN_NB_USERS];
+};
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_SW1_Process(void);
+static void APP_ZIGBEE_SW2_Process(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_BINDING_TABLE_insert(uint16_t ntw_addr, uint8_t endpoint, uint16_t cluster_id);
+
+/* Time */
+static uint32_t APP_ZIGBEE_Time_Server_GetTime_cb(struct ZbZclClusterT *clusterPtr, void *arg);
+static void APP_ZIGBEE_Time_Server_SetTime_cb(struct ZbZclClusterT *clusterPtr, uint32_t time_val, void *arg);
+
+/* Door Lock */
+static void APP_ZIGBEE_DoorLock_Server_Init(void);
+static void APP_ZIGBEE_DoorLock_Server_PassageMode(void);
+static void APP_ZIGBEE_DoorLock_Server_PassageMode_exec(void);
+static void APP_ZIGBEE_DoorLock_Server_PassageMode_Ended(void);
+static void APP_ZIGBEE_DoorLock_Server_PassageMode_Ended_exec(void);
+static void APP_ZIGBEE_DoorLock_Server_AutoRelockTime(void);
+static void APP_ZIGBEE_DoorLock_Server_AutoRelockTime_exec(void);
+static int8_t APP_ZIGBEE_DoorLock_Server_search_userID(struct doorlock_info_t* info, uint16_t user_id);
+static int8_t APP_ZIGBEE_DoorLock_Server_search_PIN(struct doorlock_info_t* info, uint8_t pin[], uint8_t pin_len);
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Attr_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclAttrCbInfoT *cb);
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_AttrNotify_cb(struct ZbZclClusterT *clusterPtr, struct ZbApsAddrT *src,
+ uint16_t attributeId, const uint8_t *inputData, unsigned int inputMaxLen,
+ void *attrData, ZclWriteModeT mode, void *app_cb_arg);
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockLockDoorReqT *cmd_req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockUnlockDoorReqT *cmd_req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_SetPin_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetPinReqT *cmd_req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Adding required optional attributes */
+static const struct ZbZclAttrT optionalAttrList[] = {
+ {
+ ZCL_DOORLOCK_ATTR_DOORSTATE, ZCL_DATATYPE_UNSIGNED_8BIT,
+ ZCL_ATTR_FLAG_CB_NOTIFY, 0, APP_ZIGBEE_DoorLock_Server_Attr_cb, {0, 0}, {0, 0}
+ },
+};
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *doorlock_server;
+ struct ZbZclClusterT *time_server;
+ struct ZbZclClusterT *alarm_server;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+/* Time server custom callbacks */
+struct ZbZclTimeServerCallbacks ZbZclTimeServerCallbacks = {
+ .get_time = APP_ZIGBEE_Time_Server_GetTime_cb,
+ .set_time = APP_ZIGBEE_Time_Server_SetTime_cb,
+};
+
+/* DoorLock server custom callbacks */
+static struct ZbZclDoorLockServerCallbacksT DoorLockServerCallbacks = {
+ .lock = APP_ZIGBEE_DoorLock_Server_Lock_cb,
+ .unlock = APP_ZIGBEE_DoorLock_Server_Unlock_cb,
+ .set_pin = APP_ZIGBEE_DoorLock_Server_SetPin_cb,
+};
+
+static struct doorlock_info_t doorlock_info;
+static uint8_t TS_ID1, TS_ID2;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Adding entry in binding table
+ * @param ntw_addr: Network address
+ * @param endpoint: Endpoint
+ * @param cluster_id: ZCL cluster ID
+ * @retval None
+ */
+static void APP_ZIGBEE_BINDING_TABLE_insert(uint16_t ntw_addr, uint8_t endpoint, uint16_t cluster_id){
+ enum ZbStatusCodeT status;
+ ZbApsmeBindT current_bind;
+ ZbApsmeBindReqT bindreq;
+ ZbApsmeBindConfT bindconf;
+ uint32_t bind_index = 0;
+ bool insert_new = false;
+
+ /* check if this ntw address with this particular endpoint is in the BT */
+
+ /* Searching over the BT */
+ for(bind_index=0;;bind_index++){
+
+ /* Get the next entry in the binding table. */
+ status = ZbApsGetIndex(zigbee_app_info.zb, ZB_APS_IB_ID_BINDING_TABLE, &current_bind, sizeof(ZbApsmeBindT), bind_index);
+ if (status != ZB_APS_STATUS_SUCCESS) {
+ /* End of table, no matching found */
+ insert_new = true;
+ break;
+ }
+
+ if(current_bind.srcExtAddr != 0){
+ if((current_bind.clusterId == cluster_id)
+ && (current_bind.dst.nwkAddr == ntw_addr)
+ && (current_bind.dst.endpoint == endpoint)){
+ /* matching found, exit */
+ break;
+ }
+ }
+ }
+
+ /* if new, insert it */
+ if(insert_new){
+ /* Binding request */
+ memset(&bindreq, 0, sizeof(bindreq));
+ memset(&bindconf, 0, sizeof(bindconf));
+ bindreq.srcExtAddr = ZbExtendedAddress(zigbee_app_info.zb);
+ bindreq.srcEndpt = SW1_ENDPOINT;
+ bindreq.clusterId = cluster_id;
+ bindreq.dst.mode = ZB_APSDE_ADDRMODE_EXT;
+ bindreq.dst.endpoint = endpoint;
+ bindreq.dst.extAddr = ZbNwkAddrLookupExt(zigbee_app_info.zb, ntw_addr);
+
+ ZbApsmeBindReq(zigbee_app_info.zb,&bindreq,&bindconf);
+
+ if(bindconf.status != ZB_WPAN_STATUS_SUCCESS){
+ APP_DBG("[DOORLOCK] Local Bind failed on DoorLock Cluster.\n");
+ }
+ APP_DBG("[DOORLOCK] Binding the client with ext_addr = %#08llx dest enpoint: %d.\n", bindreq.dst.extAddr, bindreq.dst.endpoint);
+ }
+}
+
+/**
+ * @brief Door Lock server attribute callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param cb: Callback info
+ * @param cluster_id: ZCL cluster ID
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Attr_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclAttrCbInfoT *cb){
+ if (cb->type == ZCL_ATTR_CB_TYPE_NOTIFY) {
+ return APP_ZIGBEE_DoorLock_Server_AttrNotify_cb(clusterPtr, cb->src, cb->info->attributeId, cb->zcl_data, cb->zcl_len,
+ cb->attr_data, cb->write_mode, cb->app_cb_arg);
+ } else {
+ return ZCL_STATUS_FAILURE;
+ }
+}
+
+/**
+ * @brief Door Lock server attribute notify callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param src: Source of the command, if not locally generated. May be NULL
+ * @param attributeId: ZCL attribute ID
+ * @param inputData: Incoming or outgoing ZCL attribute payload data
+ * @param inputMaxLen: Incoming or outgoing ZCL attribute payload data length
+ * @param attrData: Local attribute storage (if application is letting the cluster maintain the attribute data)
+ * @param mode: ZCL write mode
+ * @param app_cb_arg: Application's defined callback argument
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_AttrNotify_cb(struct ZbZclClusterT *clusterPtr, struct ZbApsAddrT *src,
+ uint16_t attributeId, const uint8_t *inputData, unsigned int inputMaxLen,
+ void *attrData, ZclWriteModeT mode, void *app_cb_arg){
+ enum ZclStatusCodeT status;
+ uint16_t alarmMask;
+ uint8_t currentDoorState;
+
+ if(clusterPtr != zigbee_app_info.doorlock_server){
+ return ZCL_STATUS_FAILURE;
+ }
+
+ switch(attributeId){
+ case ZCL_DOORLOCK_ATTR_DOORSTATE:
+
+ /* getting the door state */
+ currentDoorState = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ return ZCL_STATUS_FAILURE;
+ }
+
+ APP_DBG("[DOORLOCK] Door state changed to 0x%02x.", currentDoorState);
+
+ /* getting the alarm mask */
+ alarmMask = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_ALARM_MASK, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ return ZCL_STATUS_FAILURE;
+ }
+
+ /* check the door state */
+ if((currentDoorState == DOORLOCK_DOORSTATE_ERROR_FORCED_OPEN)
+ && (1<<DOORLOCK_ALARM_FORCED_DOOR & alarmMask)){
+ APP_DBG("[DOORLOCK] Problematic value detected for the door state.");
+ ZbZclClusterSendAlarm(zigbee_app_info.doorlock_server, ZbZclClusterGetEndpoint(zigbee_app_info.doorlock_server), currentDoorState);
+ APP_DBG("[ALARM] Alarm sent for DoorLock cluster clients that are registered in the BT.");
+ }
+
+ /* setting door state to closed */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_CLOSE);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute.");
+ assert(0);
+ }
+ return ZCL_STATUS_SUCCESS;
+
+ default:
+ return ZCL_STATUS_FAILURE;
+ }
+}
+
+/**
+ * @brief DoorLock server lock command callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param cmd_req: ZCL DoorLock cluster Lock Door request
+ * @param srcInfo: Src address informations
+ * @param arg: passed arguments
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockLockDoorReqT *cmd_req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg)
+{
+ enum ZclStatusCodeT status;
+ struct ZbZclDoorLockLockDoorRspT rsp = {.status = DOORLOCK_STATUS_GENERAL_FAILURE};
+ struct doorlock_info_t* info = (struct doorlock_info_t*) arg;
+ long long res;
+ uint8_t currentMode = 0;
+ int8_t user_pos = 0;
+
+ /* Get the lock operating mode */
+ currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ APP_DBG("Lock requested.");
+
+ /* Read the lock state */
+ res = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, NULL, &status);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reqding local attribute: cannot read lock state.\n");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ if(res == DOORLOCK_LOCKSTATE_LOCKED){
+ /* Lock already locked */
+ APP_DBG("Already locked!\n");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Passage mode behaviour */
+ if(currentMode == DOORLOCK_PASSAGE_MODE){
+ APP_DBG("Passage mode is activated.");
+
+ /* Lock is unlocked -> locked it */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_LOCKED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set lock state to 'locked'.\n");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ APP_DBG("Door locked!");
+ rsp.status = DOORLOCK_STATUS_SUCCESS;
+
+ BSP_LED_On(LED_GREEN);
+ APP_DBG("LED_GREEN ON\n");
+
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Check pin length */
+ if(cmd_req->pin_len>DOORLOCK_MAX_PIN
+ || cmd_req->pin_len<DOORLOCK_MIN_PIN){
+ APP_DBG("Error: Wrong pin format.\n");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Check if the PIN is valid */
+ user_pos = APP_ZIGBEE_DoorLock_Server_search_PIN(info, cmd_req->pin, cmd_req->pin_len);
+ if(user_pos < 0){
+ APP_DBG("Error: Pin doesn't match.\n");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+ APP_DBG("Request from user %d.", info->user_tab[user_pos].user_id);
+
+ /* Lock is unlocked -> locked it */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_LOCKED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set lock state to 'unlocked'.\n");
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ APP_DBG("Door locked!");
+ rsp.status = DOORLOCK_STATUS_SUCCESS;
+
+ BSP_LED_On(LED_GREEN);
+ APP_DBG("LED_GREEN ON\n");
+
+ /* Stop the Auto Relock Time associated timer */
+ HW_TS_Stop(TS_ID2);
+
+ (void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+} /* APP_ZIGBEE_DoorLock_Server_Lock_cb */
+
+/**
+ * @brief DoorLock server lock command callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param cmd_req: ZCL DoorLock cluster Unlock Door request
+ * @param srcInfo: Src address informations
+ * @param arg: passed arguments
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockUnlockDoorReqT *cmd_req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg)
+{
+ enum ZclStatusCodeT status;
+ struct ZbZclDoorLockUnlockDoorRspT rsp = {.status = DOORLOCK_STATUS_GENERAL_FAILURE};
+ struct doorlock_info_t* info = (struct doorlock_info_t*) arg;
+ long long res;
+ uint32_t autoRelockTime = 0;
+ uint16_t currentMode = 0;
+ int8_t user_pos = 0;
+
+ /* Get the lock operating mode */
+ currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ APP_DBG("Unlock requested.");
+
+ /* Read the lock state */
+ res = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, NULL, &status);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reqding local attribute: cannot reqd lock state.\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ if(res == DOORLOCK_LOCKSTATE_UNLOCKED){
+ /* Lock already unlocked */
+ APP_DBG("Already unlocked!\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Passage mode behaviour */
+ if(currentMode == DOORLOCK_PASSAGE_MODE){
+ APP_DBG("Passage mode is activated.");
+
+ /* Lock is locked -> unlocked it */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_UNLOCKED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set lock state to 'unlocked'.\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ APP_DBG("Door unlocked!");
+ rsp.status = DOORLOCK_STATUS_SUCCESS;
+
+ BSP_LED_Off(LED_GREEN);
+ APP_DBG("LED_GREEN OFF\n");
+
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Check pin length */
+ if(cmd_req->pin_len>DOORLOCK_MAX_PIN
+ || cmd_req->pin_len<DOORLOCK_MIN_PIN){
+ APP_DBG("Error: Wrong pin format.\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Check if the PIN is valid */
+ user_pos = APP_ZIGBEE_DoorLock_Server_search_PIN(info, cmd_req->pin, cmd_req->pin_len);
+ if(user_pos < 0){
+ APP_DBG("Error: Pin doesn't match.\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+ APP_DBG("Request from user %d.", info->user_tab[user_pos].user_id);
+
+ /* Lock is locked -> unlocked it */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_UNLOCKED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set lock state to 'unlocked'.\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Read the auto relock time value */
+ autoRelockTime = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_AUTO_RELOCK, NULL, &status);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reqding local attribute: cannot reqd lock state.\n");
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Start Auto Relock timer with auto relock time attribute value */
+ HW_TS_Start(TS_ID2, autoRelockTime*HW_TS_SERVER_1S_NB_TICKS);
+
+ APP_DBG("Door unlocked for %d seconds !", autoRelockTime);
+ rsp.status = DOORLOCK_STATUS_SUCCESS;
+
+ BSP_LED_Off(LED_GREEN);
+ APP_DBG("LED_GREEN OFF\n");
+
+ (void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+} /* APP_ZIGBEE_DoorLock_Server_Unlock_cb */
+
+/**
+ * @brief DoorLock server set pin command callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param cmd_req: ZCL DoorLock cluster Unlock Door request
+ * @param srcInfo: Src address informations
+ * @param arg: passed arguments
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_SetPin_cb(struct ZbZclClusterT *clusterPtr, struct ZbZclDoorLockSetPinReqT *cmd_req,
+ struct ZbZclAddrInfoT *srcInfo, void *arg)
+{
+ struct ZbZclDoorLockSetPinRspT rsp = {.status = DOORLOCK_STATUS_GENERAL_FAILURE};
+ struct doorlock_info_t* info = (struct doorlock_info_t*) arg;
+ APP_DBG("Set PIN requested.");
+
+ /* Check if we can add a new PIN user */
+ if(info->current_nb_users >= MAX_PIN_NB_USERS){
+ APP_DBG("Error: PIN users limit reached.\n");
+ rsp.status = DOORLOCK_STATUS_MEM_FULL;
+ (void) ZbZclDoorLockServerSendSetPinRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Check if the user id is unique */
+ if(APP_ZIGBEE_DoorLock_Server_search_userID(info, cmd_req->user_id) < 0){
+ APP_DBG("Error: User with ID %d already registered.\n", cmd_req->user_id);
+ }
+
+ /* PIN length check */
+ if(cmd_req->pin_len>DOORLOCK_MAX_PIN
+ || cmd_req->pin_len<DOORLOCK_MIN_PIN){
+ APP_DBG("Error: Wrong pin format.\n");
+ (void) ZbZclDoorLockServerSendSetPinRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+ }
+
+ /* Check the unicity of the PIN */
+ if(APP_ZIGBEE_DoorLock_Server_search_PIN(info, cmd_req->pin, cmd_req->pin_len) < 0){
+ APP_DBG("Error: User with this PIN already registered.\n");
+ }
+
+ /* create the user */
+ info->user_tab[info->current_nb_users].user_id = cmd_req->user_id;
+ info->user_tab[info->current_nb_users].user_status = cmd_req->user_status;
+ info->user_tab[info->current_nb_users].user_type = cmd_req->user_type;
+ memcpy(info->user_tab[info->current_nb_users].pin, cmd_req->pin, cmd_req->pin_len);
+ info->user_tab[info->current_nb_users].pin_len = cmd_req->pin_len;
+ info->current_nb_users++;
+ APP_DBG("PIN set for user %d!\n", cmd_req->user_id);
+
+ /* Add Alarm client in the server binding table if not present for receiving Alarm notifications */
+ /* DoorLock and Alarm cluster are mapped in the same endpoint */
+ APP_ZIGBEE_BINDING_TABLE_insert(srcInfo->addr.nwkAddr, srcInfo->addr.endpoint, ZCL_CLUSTER_ALARMS);
+
+ rsp.status = DOORLOCK_STATUS_SUCCESS;
+ (void) ZbZclDoorLockServerSendSetPinRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
+ return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
+}
+
+/**
+ * @brief DoorLock server Passage mode task launcher wrapper
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_PassageMode_exec(void){
+ /* Start the task */
+ UTIL_SEQ_SetTask(1U << CFG_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE, CFG_SCH_PRIO_1);
+}
+
+/**
+ * @brief DoorLock server enable Passage mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_PassageMode(void){
+ enum ZclStatusCodeT status = ZCL_STATUS_FAILURE;
+ uint16_t supportedModes = 0;
+ uint8_t currentMode = 0;
+
+ /* Get current operating mode */
+ currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ return;
+ }
+ if(currentMode == DOORLOCK_PASSAGE_MODE){
+ /* Already in passage mode*/
+ return;
+ }
+
+ /* Get available operating modes */
+ supportedModes = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_SUPPORTED_MODES, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ return;
+ }
+
+ /* Check if passage mode is available */
+ if(!(supportedModes >> DOORLOCK_PASSAGE_MODE)){
+ APP_DBG("Error passage mode not available.");
+ return;
+ }
+
+ /* Activate passage mode */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, DOORLOCK_PASSAGE_MODE);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set operating mode.");
+ }
+
+ /* Start passage mode duration timer */
+ HW_TS_Start(TS_ID1, DOORLOCK_PASSAGE_MODE_DURATION);
+
+ APP_DBG("Passage mode activated.");
+ BSP_LED_On(LED_RED);
+ APP_DBG("LED_RED ON\n");
+}
+
+/**
+ * @brief DoorLock server Passage mode end task launcher wrapper
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_PassageMode_Ended_exec(void){
+ /* Start the task */
+ UTIL_SEQ_SetTask(1U << CFG_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE_DURATION, CFG_SCH_PRIO_1);
+}
+
+/**
+ * @brief DoorLock server stop Passage mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_PassageMode_Ended(void){
+ enum ZclStatusCodeT status = ZCL_STATUS_FAILURE;
+
+ /* Operating mode set to normal */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, DOORLOCK_NORMAL_MODE);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set operating mode.");
+ }
+
+ APP_DBG("Passage mode ended.");
+ BSP_LED_Off(LED_RED);
+ APP_DBG("LED_RED OFF\n");
+}
+
+/**
+ * @brief DoorLock server Auto Relock Time reached task launcher wrapper
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_AutoRelockTime_exec(void){
+ /* Start the task */
+ UTIL_SEQ_SetTask(1U << CFG_ZIGBEE_APP_DOORLOCK_AUTO_RELOCK_TIME, CFG_SCH_PRIO_1);
+}
+
+/**
+ * @brief DoorLock server Auto Relock Time reached
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_AutoRelockTime(void){
+ enum ZclStatusCodeT status = ZCL_STATUS_FAILURE;
+
+ APP_DBG("Auto Relock Time reached.");
+
+ /* Lock the door */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_LOCKED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set lock state to 'unlocked'.\n");
+ return;
+ }
+
+ APP_DBG("Door Locked.");
+ BSP_LED_On(LED_GREEN);
+ APP_DBG("LED_GREEN ON\n");
+}
+
+/**
+ * @brief DoorLock server search user by ID
+ * @param info: Door Lock server info
+ * @param user_id: ZCL Door Lock user ID
+ * @retval User index in the table if found (-1 otherwise)
+ */
+static int8_t APP_ZIGBEE_DoorLock_Server_search_userID(struct doorlock_info_t* info, uint16_t user_id){
+ int8_t pos = -1, cpt = 0;
+
+ if(info->current_nb_users == 0){
+ /* no user registered */
+ return 0;
+ }
+
+ while(cpt <= info->current_nb_users){
+ if(info->user_tab[cpt].user_id == user_id){
+ /* user id found */
+ pos = cpt;
+ break;
+ }
+ cpt++;
+ }
+
+ return pos;
+}
+
+/**
+ * @brief DoorLock server search user by PIN
+ * @param info: Door Lock server info
+ * @param pin: PIN code to search
+ * @param pin_len: PIN code length
+ * @retval User index in the table if found (-1 otherwise)
+ */
+static int8_t APP_ZIGBEE_DoorLock_Server_search_PIN(struct doorlock_info_t* info, uint8_t pin[], uint8_t pin_len){
+ int8_t pos = -1, cpt = 0;
+
+ if(info->current_nb_users == 0){
+ /* no user registered */
+ return 0;
+ }
+
+ while(cpt <= info->current_nb_users){
+ if(info->user_tab[cpt].pin_len == pin_len
+ && memcmp(info->user_tab[cpt].pin, pin, pin_len) == 0){
+ /* pin found */
+ pos = cpt;
+ break;
+ }
+ cpt++;
+ }
+
+ return pos;
+}
+
+/**
+ * @brief Time server GetTime callback
+ * @param clusterPtr: ZCL Cluster pointer
+ * @param arg: Passed argument
+ * @retval None
+ */
+static uint32_t APP_ZIGBEE_Time_Server_GetTime_cb(struct ZbZclClusterT *clusterPtr, void *arg){
+ uint32_t time = HAL_GetTick()*HW_TS_SERVER_1S_NB_TICKS;
+ return time;
+}
+
+/**
+ * @brief Time server SetTime callback
+ * @param clusterPtr: ZCL Cluster pointer
+ * @param time_val: time value to set
+ * @param arg: Passed argument
+ * @retval None
+ */
+static void APP_ZIGBEE_Time_Server_SetTime_cb(struct ZbZclClusterT *clusterPtr, uint32_t time_val, void *arg){
+
+ /* Unused function */
+
+ UNUSED(clusterPtr);
+ UNUSED(time_val);
+ UNUSED(arg);
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with push button SW1 and SW2 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW2, UTIL_SEQ_RFU, APP_ZIGBEE_SW2_Process);
+
+ /* Timers associated with Door Lock passage operating mode */
+ HW_TS_Create(1U << CFG_TIM_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE_DURATION, &TS_ID1, hw_ts_SingleShot, APP_ZIGBEE_DoorLock_Server_PassageMode_Ended_exec);
+ HW_TS_Create(1U << CFG_TIM_ZIGBEE_APP_DOORLOCK_AUTO_RELOCK_TIME, &TS_ID2, hw_ts_SingleShot, APP_ZIGBEE_DoorLock_Server_AutoRelockTime_exec);
+
+ /* Task associated with Door Lock passage mode */
+ UTIL_SEQ_RegTask(1U << CFG_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE, UTIL_SEQ_RFU, APP_ZIGBEE_DoorLock_Server_PassageMode);
+ UTIL_SEQ_RegTask(1U << CFG_ZIGBEE_APP_DOORLOCK_PASSAGE_MODE_DURATION, UTIL_SEQ_RFU, APP_ZIGBEE_DoorLock_Server_PassageMode_Ended);
+ UTIL_SEQ_RegTask(1U << CFG_ZIGBEE_APP_DOORLOCK_AUTO_RELOCK_TIME, UTIL_SEQ_RFU, APP_ZIGBEE_DoorLock_Server_AutoRelockTime);
+
+ /* Initialize Zigbee Meter Identification Server parameters */
+ APP_ZIGBEE_DoorLock_Server_Init();
+}
+
+/**
+ * @brief DoorLock server initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_DoorLock_Server_Init(void){
+ enum ZclStatusCodeT status;
+
+ /* Init the PIN user struct */
+ memset(&doorlock_info, 0, sizeof(doorlock_info));
+
+ /* At startup, the lock is locked */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_LOCKED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set lock state to 'locked'.");
+ assert(0);
+ }
+
+ /* Door state is closed */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_CLOSE);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute.");
+ assert(0);
+ }
+
+ /* Setting up supported mode bitmap */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_SUPPORTED_MODES,
+ (uint16_t)DOORLOCK_NORMAL_MODE_SUPPORTED|DOORLOCK_PASSAGE_MODE_SUPPORTED);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set supported mode.");
+ assert(0);
+ }
+
+ /* Setting up operating mode attribute */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, DOORLOCK_NORMAL_MODE);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set operating mode.");
+ assert(0);
+ }
+
+ /* Setting up auto relock time attribute */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_AUTO_RELOCK, DOORLOCK_AUTO_RELOCK_TIME);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set operating mode.");
+ assert(0);
+ }
+
+ /* Setting up alarm bitmap */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_ALARM_MASK, 1<<DOORLOCK_ALARM_FORCED_DOOR);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute: cannot set operating mode.");
+ assert(0);
+ }
+
+ BSP_LED_On(LED_GREEN);
+ APP_DBG("LED_GREEN ON");
+ APP_DBG("Lock state initialized to 'locked'");
+ APP_DBG("DoorLock server init done !\n");
+} /* APP_ZIGBEE_DoorLock_Server_Init */
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ /* run the task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ enum ZclStatusCodeT status;
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_METER_INTERFACE;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* Time server */
+ zigbee_app_info.time_server = ZbZclTimeServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, &ZbZclTimeServerCallbacks, NULL);
+ assert(zigbee_app_info.time_server != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.time_server);
+
+ /* Alarm server */
+ zigbee_app_info.alarm_server = ZbZclAlarmServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, ZCL_ALARM_LOG_ENTRY_NB, zigbee_app_info.time_server);
+ assert(zigbee_app_info.alarm_server != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.alarm_server);
+
+ /* DoorLock Server */
+ zigbee_app_info.doorlock_server = ZbZclDoorLockServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, &DoorLockServerCallbacks, &doorlock_info);
+ assert(zigbee_app_info.doorlock_server != NULL);
+
+ /* Registering attributes */
+ status = ZbZclAttrAppendList(zigbee_app_info.doorlock_server, optionalAttrList, ZCL_ATTR_LIST_LEN(optionalAttrList));
+ assert(status == ZCL_STATUS_SUCCESS);
+
+ ZbZclClusterEndpointRegister(zigbee_app_info.doorlock_server);
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ /* Set the centralized network */
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORD");
+ config.startupControl = ZbStartTypeForm;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /*Channel in use */
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, re-attempting to form a network after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+ }
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void){
+ enum ZclStatusCodeT status;
+
+ /* Door state is forced opened */
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_ERROR_FORCED_OPEN);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error writting local attribute.");
+ assert(0);
+ }
+} /* APP_ZIGBEE_SW1_Process */
+
+
+/**
+ * @brief Button 2 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW2_Process(void){
+
+ /* Start passage mode */
+ APP_ZIGBEE_DoorLock_Server_PassageMode_exec();
+} /* APP_ZIGBEE_SW2_Process */
+
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/readme.txt
new file mode 100644
index 000000000..14dbb1eca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/readme.txt
@@ -0,0 +1,212 @@
+/**
+ @page Zigbee_DoorLock_Server_Coord application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_DoorLock_Server_Coord/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Door Lock Cluster application as a client
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Door Lock cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the Door Lock cluster. Once the Zigbee mesh
+network is created, the user can send requests from both client to server (through push buttons SW1, SW2 and SW3)
+and server to client (push buttons SW1).
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_DoorLock_Server_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_DoorLock_Client_Router
+
+
+Demo use case :
+
+This demo shows how to use Door Lock cluster.
+
+The Door Lock Server set up its initial configuration:
+ - The lock state is locked.
+ - The Door Lock normal and passage mode are supported.
+ - The operating mode is set to normal.
+ - The Auto Relock Time is set to 5 seconds.
+ - The Door Lock alarm supports <Forced Door Open under Door Locked Condition> event.
+
+When the Door Lock server lock state is locked, the green led is ON.
+The Door Lock Server can enable passage mode by pressing SW2 (passage mode activated for 10 seconds).
+When passage mode is activated on server, the red led is ON.
+
+The Door Lock Client can remotely:
+ - Create a new user (with PIN code).
+ - Lock/Unlock the door (including unlock requests with a wrong PIN).
+
+When the Door Lock client receives a Door Lock alarm notification, the red led
+is ON during 500ms.
+
+Note: When the Door Lock server is in passage mode, the PIN code is not checked
+ and the lock remains open after an unlock.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | /* Door Lock server init */ | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_LOCKSTATE) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_DOORSTATE) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_SUPPORTED_MODES) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_MODE) | | |
+ | | ---| |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_AUTO_RELOCK) | | |
+ | | ---| |
+ | | | |
+ | | | |
+ | | /* Door Lock client/server normal mode interaction */ | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(PIN) | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=> GREEN LED OFF
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | /* When Auto Relock Time is reached */ -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_LOCKSTATE) | | |=> GREEN LED ON
+ | | ---| |
+ | | | |
+ | | ZbZclDoorLockClientLockReq(PIN) | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |=> GREEN LED ON
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(WRONG_PIN) | |
+ PushB SW3=>| | -------------------------------------------------------------------> | |=> GREEN LED remains ON
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | | |
+ | | /* Door Lock client/server passage interaction */ | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(PIN) | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=> GREEN LED OFF
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclDoorLockClientLockReq(PIN) | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |=> GREEN LED ON
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclDoorLockClientUnlockReq(WRONG_PIN) | |
+ PushB SW3=>| | -------------------------------------------------------------------> | |=> GREEN LED OFF
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | | |
+ | | /* Forced Door Open under Door Locked Condition alarm */ | |
+ | | | |
+ | | -->| |
+ | | ZbZclAttrIntegerWrite(ZCL_DOORLOCK_ATTR_DOORSTATE) | | |<=PushB SW1
+ | | ---| |
+ | | ZbZclClusterSendAlarm | |
+RED LED ON <=| | <------------------------------------------------------------------- | |
+ | | | |
+ | | -->| |
+ | | /* Passage mode for 10s */ | | |<=PushB SW2
+ | | ---| |
+ | | | |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_DoorLock_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+ it is now possible to remotely read Door Lock server attributes on the client by pressing on
+ the SW1/SW2 push button.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_conf.h
new file mode 100644
index 000000000..da0d52657
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/app_entry.c
new file mode 100644
index 000000000..7fa137a42
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/app_entry.c
@@ -0,0 +1,501 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Project.eww
new file mode 100644
index 000000000..acf76be45
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_IAS_WD_Client_Router.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewd
new file mode 100644
index 000000000..6e77c3c9a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_IAS_WD_Client_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewp
new file mode 100644
index 000000000..893b65c7f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_IAS_WD_Client_Router</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_IAS_WD_Client_Router/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_IAS_WD_Client_Router/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_IAS_WD_Client_Router/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_IAS_WD_Client_Router.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_IAS_WD_Client_Router.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..1518a1ff0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,766 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/security/zcl.ias_wd.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+#define UTIL_SEQ_NO_BIT_SET 0
+#define UTIL_SEQ_ALL_BIT_SET (~0)
+
+/* IAS WD specific defines ---------------------------------------------------*/
+#define MAX_DURATION_ATTR_VAL 5
+#define WARNING_DURATION_VAL 15
+#define STROBE_DUTYCYCLE_VAL 20
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_SW1_Process(void);
+static void APP_ZIGBEE_SW2_Process(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_IAS_WD_Client_Init(void);
+static void APP_ZIGBEE_IAS_WD_Client_Send_StartWarning_cmd(void);
+static void APP_ZIGBEE_IAS_WD_Client_Send_Squawk_cmd(void);
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg);
+static void APP_ZIGBEE_IAS_WD_Remote_Write_cb(const ZbZclWriteRspT *writeResp, void *cb_arg);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *ias_wd_client_1;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static UTIL_SEQ_bm_t RemoteWriteMaxDurationAttr_OK = UTIL_SEQ_ALL_BIT_SET;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with push button SW1, 2 and 3 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW2, UTIL_SEQ_RFU, APP_ZIGBEE_SW2_Process);
+
+ /* Initialize Zigbee IAS WD Client parameters */
+ APP_ZIGBEE_IAS_WD_Client_Init();
+} /* APP_ZIGBEE_App_Init */
+
+static void APP_ZIGBEE_IAS_WD_Remote_Write_cb(const ZbZclWriteRspT *writeResp, void *cb_arg){
+ UNUSED(cb_arg);
+
+ if(writeResp->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[IAS WD] Error, remote write failed.");
+ assert(0);
+ }
+
+ if(writeResp->attr[0].attrId != ZCL_IAS_WD_SVR_ATTR_MAX_DURATION){
+ APP_DBG("[IAS WD] Error, wrong attribute in response.");
+ assert(0);
+ }
+
+ if(writeResp->attr[0].status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[IAS WD] Error, remotely write attribute failed.");
+ assert(0);
+ }
+
+ UTIL_SEQ_SetEvt(RemoteWriteMaxDurationAttr_OK);
+ APP_DBG("[IAS WD] Remote write OK.");
+}
+
+/**
+ * @brief IAS WD client initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_IAS_WD_Client_Init(void){
+ enum ZclStatusCodeT status;
+ ZbZclWriteReqT RemoteWriteReq;
+ uint16_t max_duration_attr = 0;
+
+ /* Remotely write IAS WD server MaxDuration attribute */
+ APP_DBG("[IAS WD] Remotely writing MaxDuration attribute...");
+ memset(&RemoteWriteReq, 0, sizeof(RemoteWriteReq));
+ RemoteWriteReq.dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ RemoteWriteReq.dst.nwkAddr = 0x0;
+ RemoteWriteReq.dst.endpoint = SW1_ENDPOINT;
+ RemoteWriteReq.count = 1;
+ RemoteWriteReq.attr[0].attrId = ZCL_IAS_WD_SVR_ATTR_MAX_DURATION;
+ RemoteWriteReq.attr[0].type = ZCL_DATATYPE_UNSIGNED_16BIT;
+ putle16((uint8_t*)&max_duration_attr, MAX_DURATION_ATTR_VAL);
+ RemoteWriteReq.attr[0].value = (uint8_t const*)&max_duration_attr;
+ RemoteWriteReq.attr[0].length = 2;
+
+ status = ZbZclWriteReq(zigbee_app_info.ias_wd_client_1, &RemoteWriteReq, APP_ZIGBEE_IAS_WD_Remote_Write_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[IAS WD] Error, ZbZclWriteReq failed");
+ assert(0);
+ }
+
+ /* Waiting for the successful return of the command */
+ UTIL_SEQ_WaitEvt(RemoteWriteMaxDurationAttr_OK);
+
+ APP_DBG("[IAS WD] IAS WD client init done!\n");
+} /* APP_ZIGBEE_IAS_WD_Client_Init */
+
+/**
+ * @brief Sending IAS WD StartWarning command to server
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_IAS_WD_Client_Send_StartWarning_cmd(void){
+ enum ZclStatusCodeT status;
+ struct ZbApsAddrT dst;
+ struct ZbZclIasWdClientStartWarningReqT req;
+
+ /* Setting up the addressing mode */
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.nwkAddr = 0x0;
+ dst.endpoint = SW1_ENDPOINT;
+
+ /* Creating a request */
+ memset(&req, 0, sizeof(req));
+ req.warning_mode = ZCL_IAS_WD_WARNING_MODE_BURGLAR;
+ req.warning_duration = (uint16_t) WARNING_DURATION_VAL;
+ req.siren_level = ZCL_IAS_WD_LEVEL_MEDIUM;
+ req.strobe = ZCL_IAS_WD_STROBE_ON;
+ req.strobe_level = ZCL_IAS_WD_LEVEL_MEDIUM;
+ req.strobe_dutycycle = (uint8_t) STROBE_DUTYCYCLE_VAL; /* strobe ON state duration in 1/100 of a second */
+
+ APP_DBG("[IAS WD] Sending StartWarning command.");
+ status = ZbZclIasWdClientStartWarningReq(zigbee_app_info.ias_wd_client_1, &dst, &req, APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[IAS WD] Error, ZbZclIasWdClientStartWarningReq failed");
+ assert(0);
+ }
+} /* APP_ZIGBEE_IAS_WD_Client_Send_StartWarning_cmd */
+
+/**
+ * @brief Sending IAS WD Squawk command to server
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_IAS_WD_Client_Send_Squawk_cmd(void){
+ enum ZclStatusCodeT status;
+ struct ZbApsAddrT dst;
+ struct ZbZclIasWdClientSquawkReqT req;
+
+ /* Setting up the addressing mode */
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.nwkAddr = 0x0;
+ dst.endpoint = SW1_ENDPOINT;
+
+ /* Creating a request */
+ memset(&req, 0, sizeof(req));
+ req.squawk_mode = ZCL_IAS_WD_SQUAWK_MODE_ARMED;
+ req.squawk_level = ZCL_IAS_WD_LEVEL_MEDIUM;
+ req.strobe = ZCL_IAS_WD_STROBE_ON;
+
+ APP_DBG("[IAS WD] Sending Squawk command.");
+ status = ZbZclIasWdClientSquawkReq(zigbee_app_info.ias_wd_client_1, &dst, &req, APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[IAS WD] Error, ZbZclIasWdClientSquawkReq failed");
+ assert(0);
+ }
+} /* APP_ZIGBEE_IAS_WD_Client_Send_Squawk_cmd */
+
+/**
+ * @brief Command response callback
+ * @param zcl_rsp: ZCL response
+ * @param arg: passed argument
+ * @retval None
+ */
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg){
+ UNUSED(arg);
+
+ /* Checking response consistency */
+ assert(zcl_rsp != NULL);
+
+ switch(zcl_rsp->hdr.frameCtrl.frameType){
+ case ZCL_FRAMETYPE_PROFILE:
+ /* general frame cmd response */
+
+ switch(zcl_rsp->hdr.cmdId){
+ case ZCL_COMMAND_DEFAULT_RESPONSE:
+ /* general default response */
+ if (zcl_rsp->status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[IAS WD] Default response: the server returned an error: 0x%02x.\n", zcl_rsp->status);
+ } else {
+ APP_DBG("[IAS WD] Default response: success!\n");
+ }
+ break;
+
+ default:
+ APP_DBG("[IAS WD] Error: unsupported general cmd type.\n");
+ break;
+ }
+ break;
+
+ case ZCL_FRAMETYPE_CLUSTER:
+ /* cluster specific frame cmd response */
+
+ default:
+ APP_DBG("[IAS WD] Error: unsupported frame type.\n");
+ break;
+ }
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_DATA_COLLECTION_UNIT;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* IAS WD Client */
+ zigbee_app_info.ias_wd_client_1 = ZbZclIasWdClientAlloc(zigbee_app_info.zb, SW1_ENDPOINT, NULL);
+ assert(zigbee_app_info.ias_wd_client_1 != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.ias_wd_client_1);
+
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+ config.startupControl = ZbStartTypeJoin;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /* Channel in use*/
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, attempting again after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+ }
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ APP_ZIGBEE_IAS_WD_Client_Send_StartWarning_cmd();
+} /* APP_ZIGBEE_SW1_Process */
+
+/**
+ * @brief Button 2 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW2_Process(void)
+{
+ APP_ZIGBEE_IAS_WD_Client_Send_Squawk_cmd();
+} /* APP_ZIGBEE_SW2_Process */
+
+/**
+ * @brief Button 3 callback
+ * @param None
+ * @retval None
+ */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/readme.txt
new file mode 100644
index 000000000..d63fd352f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/readme.txt
@@ -0,0 +1,156 @@
+/**
+ @page Zigbee_IAS_WD_Server_Coord application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_IAS_WD_Server_Coord/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee IAS WD Cluster application as a client
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use IAS WD cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the IAS WD cluster. Once the Zigbee mesh
+network is created, the user can send requests from the client to the server through push buttons SW1 and SW2.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_IAS_WD_Server_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_IAS_WD_Client_Router
+
+
+Demo use case :
+
+This demo shows how to use IAS WD cluster.
+The IAS WD Client remotely writes the MaxDuration IAS WD Server attribute (attribute set to 10sec).
+The IAS WD Client can send the two IAS WD Cluster commands : StartWarning and Squawk.
+
+StartWarning command:
+=====================
+
+- IAS WD StartWarning command is send to server.
+ + Warning mode set to ZCL_IAS_WD_WARNING_MODE_BURGLAR.
+ + Warning duration set to 15sec.
+ + Siren level set to ZCL_IAS_WD_LEVEL_MEDIUM.
+ + Strobe is enabled with the siren (ZCL_IAS_WD_STROBE_ON).
+ + Strobe level set to ZCL_IAS_WD_LEVEL_MEDIUM.
+ + Strobe dutycycle (in 1/100 of a sec) is set to 20.
+- IAS WD Server activate the alarm for 10sec (MaxDuration IAS WD Server attribute value).
+
+
+Squawk:
+=======
+
+IAS WD Squawk command is send to server.
+ + Squawk mode set to ZCL_IAS_WD_SQUAWK_MODE_ARMED.
+ + Squawk level set to ZCL_IAS_WD_LEVEL_MEDIUM.
+ + Strobe is enabled with the siren (ZCL_IAS_WD_STROBE_ON).
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | ZbZclWriteReq(ZCL_IAS_WD_SVR_ATTR_MAX_DURATION) | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclIasWdClientStartWarningReq(ZCL_IAS_WD_STROBE_ON) | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=>LED_GREEN
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclIasWdClientSquawkReq(ZCL_IAS_WD_STROBE_ON) | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |=>LED_RED
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_IAS_WD_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+ it is now possible to send IAS WD server commands to the client by pressing on
+ the SW1/SW2 push button.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_conf.h
new file mode 100644
index 000000000..07e29e409
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_ZIGBEE_APP_IAS_WD_START_WARNING,
+ CFG_TASK_ZIGBEE_APP_IAS_WD_SQUAWK,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/app_entry.c
new file mode 100644
index 000000000..d9acfa065
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/app_entry.c
@@ -0,0 +1,499 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ break;
+
+ case BUTTON_SW2_PIN:
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Project.eww
new file mode 100644
index 000000000..103f4993f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_IAS_WD_Server_Coord.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewd
new file mode 100644
index 000000000..856870ab7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_IAS_WD_Server_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewp
new file mode 100644
index 000000000..16d312126
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_IAS_WD_Server_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_IAS_WD_Server_Coord/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_IAS_WD_Server_Coord/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_IAS_WD_Server_Coord/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_IAS_WD_Server_Coord.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_IAS_WD_Server_Coord.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..6308e2f3b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,694 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/security/zcl.ias_wd.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+#define NB_MAX_STRING 10
+
+/* IAS WD specific defines ---------------------------------------------------*/
+#define MAX_DURATION_ATTR_VAL 10
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+
+static void APP_ZIGBEE_IAS_WD_Server_Init(void);
+static uint8_t APP_ZIGBEE_IAS_WD_Server_StartWarning_cb(struct ZbZclClusterT *clusterPtr, void *arg, struct ZbZclIasWdClientStartWarningReqT *warn_req);
+static uint8_t APP_ZIGBEE_IAS_WD_Server_Squawk_cb(struct ZbZclClusterT *clusterPtr, void *arg, struct ZbZclIasWdClientSquawkReqT *squawk_req);
+static void APP_ZIGBEE_IAS_WD_Server_Squawk_Processing(void);
+static void APP_ZIGBEE_IAS_WD_Server_Alarm_Processing(void);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *ias_wd_server_1;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static struct ZbZclIasWdServerCallbacksT ZbZclIasWdServerCallbacks = {
+ .start_warning = APP_ZIGBEE_IAS_WD_Server_StartWarning_cb,
+ .squawk = APP_ZIGBEE_IAS_WD_Server_Squawk_cb,
+};
+
+static struct ZbZclIasWdClientStartWarningReqT warningReq;
+static bool is_Squawk_strobe = false;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief IAS WD StartWarning server command callback
+ * @param clusterPtr: cluster pointer
+ * @param arg: passed argument
+ * @param warn_req: StartWarning request
+ * @retval ZCL status
+ */
+static uint8_t APP_ZIGBEE_IAS_WD_Server_StartWarning_cb(struct ZbZclClusterT *clusterPtr, void *arg, struct ZbZclIasWdClientStartWarningReqT *warn_req){
+ APP_DBG("[IAS WD] IAS WD StartWarning command received.");
+
+ /* Dumping the request parameters */
+ APP_DBG("[IAS WD] Warning mode: 0x%02x.", warn_req->warning_mode);
+ APP_DBG("[IAS WD] Warning duration: 0x%04x.", warn_req->warning_duration);
+ APP_DBG("[IAS WD] Siren level: 0x%02x.", warn_req->siren_level);
+ APP_DBG("[IAS WD] Strobe enabled? %s.", (warn_req->strobe) ? "Yes" : "No");
+ APP_DBG("[IAS WD] Strobe duty cycle: 0x%02x.\n", warn_req->strobe_dutycycle);
+
+ /* activate the warning state */
+ memcpy(&warningReq, warn_req, sizeof(warningReq));
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_IAS_WD_START_WARNING, CFG_SCH_PRIO_0);
+
+ return ZCL_STATUS_SUCCESS;
+}
+
+/**
+ * @brief IAS WD Squawk server command callback
+ * @param clusterPtr: cluster pointer
+ * @param arg: passed argument
+ * @param warn_req: Squawk request
+ * @retval ZCL status
+ */
+static uint8_t APP_ZIGBEE_IAS_WD_Server_Squawk_cb(struct ZbZclClusterT *clusterPtr, void *arg, struct ZbZclIasWdClientSquawkReqT *squawk_req){
+ APP_DBG("[IAS WD] IAS WD Squawk command received.");
+
+ /* Dumping the request parameters */
+ APP_DBG("[IAS WD] Squawk mode: 0x%02x.", squawk_req->squawk_mode);
+ APP_DBG("[IAS WD] Squawk level: 0x%02x.", squawk_req->squawk_level);
+ APP_DBG("[IAS WD] Strobe enabled? %s.\n", (squawk_req->strobe) ? "Yes" : "No");
+
+ APP_DBG("[IAS WD] Activating Squawk signal.");
+ is_Squawk_strobe = (bool)squawk_req->strobe;
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_IAS_WD_SQUAWK, CFG_SCH_PRIO_0);
+
+ return ZCL_STATUS_SUCCESS;
+}
+
+/**
+ * @brief Zigbee application IAS WD StartWarning command proccessing
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_IAS_WD_Server_Alarm_Processing(void){
+ enum ZclStatusCodeT status;
+ enum ZclDataTypeT type;
+ uint16_t warning_duration = warningReq.warning_duration;
+ uint16_t max_duration = 0;
+
+ /* reading local MaxDuration attribute */
+ type = ZCL_DATATYPE_UNSIGNED_16BIT;
+ max_duration = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.ias_wd_server_1, ZCL_IAS_WD_SVR_ATTR_MAX_DURATION, &type, &status);
+ if (status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("[IAS WD] Error, ZbZclAttrIntegerRead failed");
+ assert(0);
+ }
+
+ if(max_duration<warning_duration){
+ /* the alarm cannot last ;ore that MaxDuration attribute value */
+ warning_duration = max_duration;
+ }
+
+ for(unsigned int cpt=0 ; cpt<warning_duration ; cpt++){
+ APP_DBG("[IAS WD] Alarm!");
+ if(warningReq.strobe){
+ /* strobe enabled */
+ BSP_LED_On(LED_GREEN);
+ HAL_Delay(warningReq.strobe_dutycycle*10); /* time in ms corresponding to strobe duty cycle */
+ BSP_LED_Off(LED_GREEN);
+ HAL_Delay(1000 - warningReq.strobe_dutycycle*10); /* remaining time in 1s */
+ } else {
+ HAL_Delay(1000);
+ }
+ }
+
+ APP_DBG("[IAS WD] Alarm ended.\n");
+}
+
+/**
+ * @brief Zigbee application IAS WD Squawk command proccessing
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_IAS_WD_Server_Squawk_Processing(void){
+ for(unsigned int cpt=0 ; cpt<3 ; cpt++){ /* 3 sec loop */
+ APP_DBG("[IAS WD] Squawk!");
+ if(is_Squawk_strobe){BSP_LED_On(LED_RED);}
+ HAL_Delay(100);
+ if(is_Squawk_strobe){BSP_LED_Off(LED_RED);}
+ HAL_Delay(100);
+ }
+ APP_DBG("[IAS WD] Squawk signal ended.\n");
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Registering StartWarning and squawk IAS WD tasks */
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_ZIGBEE_APP_IAS_WD_START_WARNING, UTIL_SEQ_RFU, APP_ZIGBEE_IAS_WD_Server_Alarm_Processing);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_ZIGBEE_APP_IAS_WD_SQUAWK, UTIL_SEQ_RFU, APP_ZIGBEE_IAS_WD_Server_Squawk_Processing);
+
+ /* Initialize Zigbee IAS WD Server parameters */
+ APP_ZIGBEE_IAS_WD_Server_Init();
+}
+
+/**
+ * @brief IAS WD server initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_IAS_WD_Server_Init(void){
+ memcpy(&warningReq, 0, sizeof(warningReq));
+ APP_DBG("[IAS WD] IAS WD server init done!\n");
+} /* APP_ZIGBEE_IAS_WD_Server_Init */
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ /* run the task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_METER_INTERFACE;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* IAS WD Server */
+ zigbee_app_info.ias_wd_server_1 = ZbZclIasWdServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, &ZbZclIasWdServerCallbacks, NULL);
+ assert(zigbee_app_info.ias_wd_server_1 != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.ias_wd_server_1);
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ /* Set the centralized network */
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORD");
+ config.startupControl = ZbStartTypeForm;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /*Channel in use */
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, re-attempting to form a network after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+ }
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/readme.txt
new file mode 100644
index 000000000..88bfb8f3d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/readme.txt
@@ -0,0 +1,156 @@
+/**
+ @page Zigbee_IAS_WD_Server_Coord application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_IAS_WD_Server_Coord/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee IAS WD Cluster application as a server
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use IAS WD cluster as a server on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the IAS WD cluster. Once the Zigbee mesh
+network is created, the user can send requests from the client to the server through push buttons SW1 and SW2.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_IAS_WD_Server_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_IAS_WD_Client_Router
+
+
+Demo use case :
+
+This demo shows how to use IAS WD cluster.
+The IAS WD Client remotely writes the MaxDuration IAS WD Server attribute (attribute set to 10sec).
+The IAS WD Client can send the two IAS WD Cluster commands : StartWarning and Squawk.
+
+StartWarning command:
+=====================
+
+- IAS WD StartWarning command is send to server.
+ + Warning mode set to ZCL_IAS_WD_WARNING_MODE_BURGLAR.
+ + Warning duration set to 15sec.
+ + Siren level set to ZCL_IAS_WD_LEVEL_MEDIUM.
+ + Strobe is enabled with the siren (ZCL_IAS_WD_STROBE_ON).
+ + Strobe level set to ZCL_IAS_WD_LEVEL_MEDIUM.
+ + Strobe dutycycle (in 1/100 of a sec) is set to 20.
+- IAS WD Server activate the alarm for 10sec (MaxDuration IAS WD Server attribute value).
+
+
+Squawk:
+=======
+
+IAS WD Squawk command is send to server.
+ + Squawk mode set to ZCL_IAS_WD_SQUAWK_MODE_ARMED.
+ + Squawk level set to ZCL_IAS_WD_LEVEL_MEDIUM.
+ + Strobe is enabled with the siren (ZCL_IAS_WD_STROBE_ON).
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | | Server |
+ | | ZbZclWriteReq(ZCL_IAS_WD_SVR_ATTR_MAX_DURATION) | |
+ | | -------------------------------------------------------------------> | |
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclIasWdClientStartWarningReq(ZCL_IAS_WD_STROBE_ON) | |
+ PushB SW1=>| | -------------------------------------------------------------------> | |=>LED_GREEN
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ | | ZbZclIasWdClientSquawkReq(ZCL_IAS_WD_STROBE_ON) | |
+ PushB SW2=>| | -------------------------------------------------------------------> | |=>LED_RED
+ | | <------------------------------------------------------------------- | |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_IAS_WD_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee router and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+ it is now possible to send IAS WD server commands to the client by pressing on
+ the SW1/SW2 push button.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Src/app_entry.c
index 34117d963..2e8aa9fbc 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/App/app_zigbee.c
index 2546e06b0..ddc6e4eb3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -39,6 +39,9 @@
#define CHANNEL 19
#define NB_MAX_STRING 10
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -461,8 +464,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c
index 1bc581289..8fd8a42d4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c
index d5d4bdfd7..e3db8bb40 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -33,6 +33,9 @@
#include "zcl/zcl.h"
#include "zcl/zcl.meter.id.h"
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private defines -----------------------------------------------------------*/
#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
#define SW1_ENDPOINT 17
@@ -396,8 +399,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Src/app_entry.c
index 38614c4d5..fab440cd8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/App/app_zigbee.c
index 8e8606430..519a19354 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 12
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -357,8 +360,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c
index 38614c4d5..fab440cd8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c
index ef0d61a59..93cac7b17 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 13
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -353,8 +356,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c
index ae6f6fb5d..d9acfa065 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvoptx
new file mode 100644
index 000000000..3c7c940d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvoptx
@@ -0,0 +1,861 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>Zigbee_OnOff_Server_Coord</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>18</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>0</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>6</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ARMRTXEVENTFLAGS</Key>
+ <Name>-L70 -Z18 -C0 -M0 -T1</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>DLGTARM</Key>
+ <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ARMDBGFLAGS</Key>
+ <Name></Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>DLGUARM</Key>
+ <Name>(105=-1,-1,-1,-1,0)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL01000000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ST-LINKIII-KEIL_SWO</Key>
+ <Name>-U-O142 -O2254 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(6BA02477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RGVx$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint/>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>1</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>1</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>startup_stm32wb55xx_cm4.s</PathWithFileName>
+ <FilenameWithoutPath>startup_stm32wb55xx_cm4.s</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/Core</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_entry.c</PathWithFileName>
+ <FilenameWithoutPath>app_entry.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_timerserver.c</PathWithFileName>
+ <FilenameWithoutPath>hw_timerserver.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_uart.c</PathWithFileName>
+ <FilenameWithoutPath>hw_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/main.c</PathWithFileName>
+ <FilenameWithoutPath>main.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_hal_msp.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_msp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_it.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_it.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm_logging.c</PathWithFileName>
+ <FilenameWithoutPath>stm_logging.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\Core\Src\stm32_lpm_if.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/App</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/App/app_zigbee.c</PathWithFileName>
+ <FilenameWithoutPath>app_zigbee.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/Target</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/Target/hw_ipcc.c</PathWithFileName>
+ <FilenameWithoutPath>hw_ipcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/BSP/STM32WBxx_Nucleo</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_nucleo.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/system_stm32wbxx.c</PathWithFileName>
+ <FilenameWithoutPath>system_stm32wbxx.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_cortex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_exti.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_hsem.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/schi</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</PathWithFileName>
+ <FilenameWithoutPath>shci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</PathWithFileName>
+ <FilenameWithoutPath>tl_mbox.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>38</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_zigbee_hci.c</PathWithFileName>
+ <FilenameWithoutPath>tl_zigbee_hci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>39</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</PathWithFileName>
+ <FilenameWithoutPath>dbg_trace.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>40</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</PathWithFileName>
+ <FilenameWithoutPath>otp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>41</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</PathWithFileName>
+ <FilenameWithoutPath>stm_list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>42</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</PathWithFileName>
+ <FilenameWithoutPath>stm_queue.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/zigbee/core</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>43</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c</PathWithFileName>
+ <FilenameWithoutPath>zigbee_core_wb.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/zigbee/stack</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>44</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib_keil.lib</PathWithFileName>
+ <FilenameWithoutPath>stm32wb_zigbee_wb_lib_keil.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Utilities/lpm/tiny_lpm</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>45</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Utilities/sequencer</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>14</GroupNumber>
+ <FileNumber>46</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/sequencer/stm32_seq.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_seq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvprojx
new file mode 100644
index 000000000..51fa8c51e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/Zigbee_OnOff_Server_Coord.uvprojx
@@ -0,0 +1,692 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>Zigbee_OnOff_Server_Coord</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
+ <PackURL>http://www.keil.com/pack</PackURL>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002EC03) IRAM_SHARED(0x20030000-0x20030FFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll></FlashDriverDll>
+ <DeviceId></DeviceId>
+ <RegisterFile></RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32WB55RGVx$CMSIS\SVD\STM32WBxx_CM4.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>Zigbee_OnOff_Coord\Exe\</OutputDirectory>
+ <OutputName>Zigbee_OnOff_Coord</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>0</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf #L --bin --output=$L@L.bin</UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4107</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2ec00</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>1</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls>--C99 --diag_suppress=188</MiscControls>
+ <Define>USE_HAL_DRIVER,STM32WB55xx,USE_STM32WBXX_NUCLEO,ZIGBEE_WB</Define>
+ <Undefine></Undefine>
+ <IncludePath>../Core/Inc;../STM32_WPAN/App;../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/app;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc;../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack;../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include;../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac;../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4;../../../../../../Drivers/CMSIS/Include;../../../../../../Utilities/sequencer</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <uClangAs>0</uClangAs>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_msp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_hal_msp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_logging.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm_logging.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\Core\Src\stm32_lpm_if.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/App</GroupName>
+ <Files>
+ <File>
+ <FileName>app_zigbee.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/App/app_zigbee.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/Target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/Target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/STM32WBxx_Nucleo</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_nucleo.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <Files>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_exti.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_hsem.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/schi</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>hci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_zigbee_hci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_zigbee_hci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/zigbee/core</GroupName>
+ <Files>
+ <File>
+ <FileName>zigbee_core_wb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/zigbee/stack</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wb_zigbee_wb_lib_keil.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib_keil.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Utilities/lpm/tiny_lpm</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Utilities/sequencer</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components/>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..553ae3f23
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 102400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c
index 7a3ccc81f..df375a05e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 13
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -418,8 +421,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.cproject
new file mode 100644
index 000000000..ccb87cbf5
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.cproject
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1988999533">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1988999533" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings />
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser" />
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1988999533" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1988999533." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1738727995" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.1137411195" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.2139166287" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1410687345" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.Nucleo" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4" />
+ <listOptionValue builtIn="false" value="CM4" />
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1913388987" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1607730813" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.311216678" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated" />
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.199103341" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross" />
+ <builder buildPath="${workspace_loc:/Zigbee_OnOff_Server_Coord}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1106946495" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug" />
+ </outputEntries>
+ </builder>
+
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1102089029" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1321552695" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.none" valueType="enumerated" />
+ <option id="gnu.c.compiler.option.debugging.level.368039995" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated" />
+ <option id="gnu.c.compiler.option.include.paths.147446147" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Core/Inc" /><listOptionValue builtIn="false" value="../../../STM32_WPAN/App" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/app" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/inc" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /></option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.230594381" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="ZIGBEE_WB" /></option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.1177913305" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.208386199" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.229791251" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s" />
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1833407330" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.2115632630" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.none" valueType="enumerated" />
+ <option id="gnu.cpp.compiler.option.debugging.level.1326254292" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated" />
+ <option id="gnu.cpp.compiler.option.include.paths.921409332" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Core/Inc" /><listOptionValue builtIn="false" value="../../../STM32_WPAN/App" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/app" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/inc" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /></option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1953535544" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="ZIGBEE_WB" /></option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1491542756" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.938506133" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1413313155" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s" />
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.365111171" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.505295416" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
+ <option id="gnu.c.link.option.libs.383431422" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"><listOptionValue builtIn="false" value=":stm32wb_zigbee_wb_lib.a" /></option>
+ <option id="gnu.c.link.option.paths.1608714529" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths"><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/lib" /></option>
+ <option id="gnu.c.link.option.ldflags.1547575327" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
+ <option id="gnu.c.link.option.other.1665949757" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1663409622" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
+ <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.959519236" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1059666458" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
+ <option id="gnu.cpp.link.option.libs.212637043" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs"><listOptionValue builtIn="false" value=":stm32wb_zigbee_wb_lib.a" /></option>
+ <option id="gnu.cpp.link.option.paths.559315092" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths"><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/lib" /></option>
+ <option id="gnu.cpp.link.option.flags.2067653512" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
+ <option id="gnu.cpp.link.option.other.2003867642" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1300265105" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
+ <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1253133896" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver" />
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.895535017" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.1411636026" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+
+
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2045640633" superClass="cdt.managedbuild.tool.gnu.assembler.input" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.230677903" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input" />
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="" />
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings" />
+ </cconfiguration>
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.release.910223959">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.910223959" moduleId="org.eclipse.cdt.core.settings" name="Release">
+ <externalSettings />
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser" />
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser" />
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.910223959" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.910223959." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.701052216" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.1137411195" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.2139166287" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55RGVx" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1410687345" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55.Nucleo" valueType="string" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4" />
+ <listOptionValue builtIn="false" value="CM4" />
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1913388987" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1607730813" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated" />
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.311216678" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated" />
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.199103341" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross" />
+ <builder buildPath="${workspace_loc:/Zigbee_OnOff_Server_Coord}/Release" id="fr.ac6.managedbuild.builder.gnu.cross.1106946495" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Release" />
+ </outputEntries>
+ </builder>
+
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1102089029" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1321552695" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.none" valueType="enumerated" />
+ <option id="gnu.c.compiler.option.debugging.level.368039995" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated" />
+ <option id="gnu.c.compiler.option.include.paths.147446147" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Core/Inc" /><listOptionValue builtIn="false" value="../../../STM32_WPAN/App" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/app" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/inc" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /></option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.230594381" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="ZIGBEE_WB" /></option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.1177913305" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.208386199" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.229791251" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s" />
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.1833407330" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.2115632630" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.none" valueType="enumerated" />
+ <option id="gnu.cpp.compiler.option.debugging.level.1326254292" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.debugging.level.max" valueType="enumerated" />
+ <option id="gnu.cpp.compiler.option.include.paths.921409332" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"><listOptionValue builtIn="false" value="../../../Core/Inc" /><listOptionValue builtIn="false" value="../../../STM32_WPAN/App" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/app" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/inc" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac" /><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4" /><listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer" /><listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm" /></option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.symbols.1286648646" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"><listOptionValue builtIn="false" value="USE_HAL_DRIVER" /><listOptionValue builtIn="false" value="STM32WB55xx" /><listOptionValue builtIn="false" value="USE_STM32WBXX_NUCLEO" /><listOptionValue builtIn="false" value="ZIGBEE_WB" /></option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1491542756" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" value="-fmessage-length=0" valueType="string" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.938506133" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1413313155" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s" />
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.365111171" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.505295416" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
+ <option id="gnu.c.link.option.libs.383431422" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs"><listOptionValue builtIn="false" value=":stm32wb_zigbee_wb_lib.a" /></option>
+ <option id="gnu.c.link.option.paths.1608714529" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths"><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/lib" /></option>
+ <option id="gnu.c.link.option.ldflags.1547575327" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
+ <option id="gnu.c.link.option.other.1665949757" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1663409622" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
+ <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.959519236" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1059666458" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string" />
+ <option id="gnu.cpp.link.option.libs.212637043" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs"><listOptionValue builtIn="false" value=":stm32wb_zigbee_wb_lib.a" /></option>
+ <option id="gnu.cpp.link.option.paths.559315092" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths"><listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/zigbee/lib" /></option>
+ <option id="gnu.cpp.link.option.ldflags.1677281721" superClass="gnu.cpp.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string" />
+ <option id="gnu.cpp.link.option.other.2003867642" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false" valueType="stringList" />
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1300265105" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
+ <additionalInput kind="additionalinput" paths="$(LIBS)" />
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1253133896" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver" />
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.exe.release.1114327249" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.exe.release">
+ <option id="gnu.both.asm.option.include.paths.1411636026" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2045640633" superClass="cdt.managedbuild.tool.gnu.assembler.input" />
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.230677903" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input" />
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="" />
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings" />
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="Zigbee_OnOff_Server_Coord.fr.ac6.managedbuild.target.gnu.cross.exe.1636637727" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe" />
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="" />
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1988999533;fr.ac6.managedbuild.config.gnu.cross.exe.debug.1988999533.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1102089029;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.208386199">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId="" />
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders" />
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration artifactName="${ProjName}" configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="Zigbee_OnOff_Server_Coord" />
+ </configuration>
+ </storageModule>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.project
new file mode 100644
index 000000000..331bd4fcb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/.project
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
+ <name>Zigbee_OnOff_Server_Coord</name>
+ <comment/>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/syscalls.c</location>
+ </link><link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <location>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</location>
+ </link>
+
+ <link>
+ <name>Application/User/Core/app_entry.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/hw_timerserver.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/hw_uart.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/main.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/main.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/stm32wbxx_hal_msp.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_hal_msp.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/stm32wbxx_it.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</location>
+ </link>
+ <link>
+ <name>Application/User/Core/stm_logging.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm_logging.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/App/app_zigbee.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_zigbee.c</location>
+ </link>
+ <link>
+ <name>Application/User/STM32_WPAN/Target/hw_ipcc.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/BSP/STM32WBxx_Nucleo/stm32wbxx_nucleo.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.Nucleo/stm32wbxx_nucleo.c</location>
+ </link>
+ <link>
+ <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <type>1</type>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_exti.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_exti.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_hsem.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_hsem.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/schi/shci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_zigbee_hci.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_zigbee_hci.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/zigbee/core/zigbee_core_wb.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c</location>
+ </link>
+ <link>
+ <name>Utilities/lpm/tiny_lpm/stm32_lpm.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
+ </link>
+ <link>
+ <name>Utilities/sequencer/stm32_seq.c</name>
+ <type>1</type>
+ <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
+ </link>
+ </linkedResources>
+</projectDescription> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..f29df9dcb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/Zigbee_OnOff_Server_Coord/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed Ć¢ā‚¬Å“as is,Ć¢ā‚¬ļæ½ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 102400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..f79eec117
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* start address for the .MB_MEM2 section. defined in linker script */
+.word _sMB_MEM2
+/* end address for the .MB_MEM2 section. defined in linker script */
+.word _eMB_MEM2
+
+/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */
+.macro INIT_BSS start, end
+ ldr r0, =\start
+ ldr r1, =\end
+ movs r3, #0
+ bl LoopFillZerobss
+.endm
+
+/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */
+.macro INIT_DATA start, end, src
+ ldr r0, =\start
+ ldr r1, =\end
+ ldr r2, =\src
+ movs r3, #0
+ bl LoopCopyDataInit
+.endm
+
+.section .text.data_initializers
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+ bx lr
+
+FillZerobss:
+ str r3, [r0]
+ adds r0, r0, #4
+
+LoopFillZerobss:
+ cmp r0, r1
+ bcc FillZerobss
+ bx lr
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ INIT_DATA _sdata, _edata, _sidata
+
+/* Zero fill the bss segments. */
+ INIT_BSS _sbss, _ebss
+ INIT_BSS _sMB_MEM2, _eMB_MEM2
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/syscalls.c
new file mode 100644
index 000000000..9b7c4071a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/SW4STM32/syscalls.c
@@ -0,0 +1,207 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Author : Auto-generated by System workbench for STM32
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Target : STMicroelectronics STM32
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+** @attention
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+**
+** 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 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 STMicroelectronics nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Src/app_entry.c
index ae6f6fb5d..d9acfa065 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/App/app_zigbee.c
index ee7d4cab1..fb7ddbc1c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 12
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -421,8 +424,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_conf.h
new file mode 100644
index 000000000..36b993e9a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_conf.h
@@ -0,0 +1,357 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_ZIGBEE_APP_POLL_CONTROL_SET_CHECKIN_RSP,
+ CFG_TASK_ZIGBEE_APP_POLL_CONTROL_REMOTE_WRITE,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+ CFG_EVT_ZIGBEE_CONTINUE,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+#define EVENT_ZIGBEE_CONTINUE (1U << CFG_EVT_ZIGBEE_CONTINUE)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/app_entry.c
new file mode 100644
index 000000000..a73f9b5ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/app_entry.c
@@ -0,0 +1,500 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Project.eww
new file mode 100644
index 000000000..b10c1015d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_PollControl_Client_Coord.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewd
new file mode 100644
index 000000000..755c5945e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_PollControl_Client_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewp
new file mode 100644
index 000000000..8bed1e69f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_PollControl_Client_Coord</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_PollControl_Client_Coord/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_PollControl_Client_Coord/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_PollControl_Client_Coord/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_PollControl_Client_Coord.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_PollControl_Client_Coord.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..1f9890db7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,822 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.poll.control.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+#define HW_TS_SERVER_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL) /* 1ms */
+
+/* Poll Control specific defines ---------------------------------------------*/
+/* Poll Control time related attribute values are in 1/4 of a second */
+#define POLL_CONVERT_MS_TO_QS(ms) (ms / 250U)
+#define POLL_CONVERT_QS_TO_MS(qs) (qs * 250U)
+#define SERVER_CHECKIN_INTERVAL (4*1*60) /* 1min */
+#define SERVER_LONG_POLL_INTERVAL (4*10) /* 10s */
+#define SERVER_SHORT_POLL_INTERVAL (4*1) /* 1s */
+#define SERVER_FAST_POLL_TIMEOUT (4*15) /* 15s */
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+static void APP_ZIGBEE_SW1_Process(void);
+
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg);
+static void APP_ZIGBEE_Remote_Write_cb(const ZbZclWriteRspT *writeResp, void *cb_arg);
+
+static void APP_ZIGBEE_PollControl_Client_Init(void);
+static void APP_ZIGBEE_PollControl_Client_SetCheckInRspForServers(void);
+static void APP_ZIGBEE_PollControl_Client_OperateOnRemoteServer(void);
+static enum ZclStatusCodeT APP_ZIGBEE_PollControl_Client_CheckinRsp_cb(struct ZbZclClusterT *clusterPtr,
+ struct zcl_poll_checkin_rsp_t *rsp_info,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *pollcontrol_client;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static struct ZbZclPollControlClientCallbackT ZbZclPollControlClientCallbacks = {
+ .checkin_rsp_callback = APP_ZIGBEE_PollControl_Client_CheckinRsp_cb,
+};
+
+static struct ZbZclAddrInfoT currentServer_FastPollStarted_dstInfo;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Poll Control client Checkin response callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param rsp_info: Checkin response
+ * @param srcInfo: sender address info
+ * @param arg: passed arguments
+ * @retval ZCL status code
+ */
+static enum ZclStatusCodeT APP_ZIGBEE_PollControl_Client_CheckinRsp_cb(struct ZbZclClusterT *clusterPtr,
+ struct zcl_poll_checkin_rsp_t *rsp_info,
+ struct ZbZclAddrInfoT *srcInfo, void *arg){
+ /* Check response status */
+ if(rsp_info->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, checkin request failed.");
+ return ZCL_STATUS_SUCCESS;
+ }
+
+ /* If device entered in Fast Poll, do remote operations on it */
+ if(rsp_info->start_fast_poll){
+ APP_DBG("[POLL CONTROL] Device with nwk address 0x%04x entered in fast poll for %d seconds.\n",
+ srcInfo->addr.nwkAddr, rsp_info->fast_poll_timeout/4);
+ memset(&currentServer_FastPollStarted_dstInfo, 0, sizeof(currentServer_FastPollStarted_dstInfo));
+ currentServer_FastPollStarted_dstInfo = *srcInfo;
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_POLL_CONTROL_REMOTE_WRITE, CFG_SCH_PRIO_0);
+ }
+
+ return ZCL_STATUS_SUCCESS;
+}
+
+/**
+ * @brief Device generic command response callback
+ * @param zcl_rsp: ZCL response
+ * @param arg: passed arguments
+ * @retval None
+ */
+static void APP_ZIGBEE_Generic_Cmd_Rsp_cb(struct ZbZclCommandRspT *zcl_rsp, void *arg){
+ UNUSED(arg);
+
+ /* Checking response consistency */
+ assert(zcl_rsp != NULL);
+
+ switch(zcl_rsp->hdr.frameCtrl.frameType){
+ case ZCL_FRAMETYPE_PROFILE:
+ /* general frame cmd response */
+
+ switch(zcl_rsp->hdr.cmdId){
+ case ZCL_COMMAND_DEFAULT_RESPONSE:
+ /* general default response */
+ if (zcl_rsp->status != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Default response: the server returned an error: 0x%02x.\n", zcl_rsp->status);
+ } else {
+ APP_DBG("Default response received: success!\n");
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_CONTINUE);
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported general cmd type.\n");
+ break;
+ }
+ break;
+
+ default:
+ APP_DBG("Error: unsupported frame type.\n");
+ break;
+ }
+} /* APP_ZIGBEE_Generic_Cmd_Rsp_cb */
+
+/**
+ * @brief Enable Fast Polling for servers present on the network
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Client_SetCheckInRspForServers(void){
+ enum ZbStatusCodeT ZB_status = ZB_NWK_STATUS_SUCCESS;
+ enum ZclStatusCodeT ZCL_status;
+ struct ZbZclPollControlClientCheckinInfo info;
+ ZbNwkNeighborT currentEntry;
+ uint32_t index = 0;
+
+ /* Enable Fast Polling period for associated devices
+ => iterate over the Neighboor Table */
+
+ while(ZB_status == ZB_NWK_STATUS_SUCCESS){
+ memset(&info, 0, sizeof(info));
+
+ /* Get the next entry in the binding table. */
+ ZB_status = ZbNwkGetIndex(zigbee_app_info.zb, ZB_NWK_NIB_ID_NeighborTable, &currentEntry, sizeof(currentEntry), index);
+
+ if(ZB_status == ZB_NWK_STATUS_SUCCESS){
+ info.dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ info.dst.nwkAddr = currentEntry.nwkAddr;
+ info.start_fast_poll = true;
+ info.fast_poll_timeout = SERVER_FAST_POLL_TIMEOUT;
+ ZCL_status = zcl_poll_client_set_checkin_rsp(zigbee_app_info.pollcontrol_client, &info);
+ if(ZCL_status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[POLL CONTROL] Error zcl_poll_client_set_checkin_rsp failed.");
+ }
+
+ APP_DBG("[POLL CONTROL] Fast Polling possible for device with nwk address 0x%04x.", info.dst.nwkAddr);
+ }
+
+ index++;
+ }
+}
+
+/**
+ * @brief Remote operations on a Poll Control during its Fast Pulling period
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Client_OperateOnRemoteServer(void){
+ enum ZclStatusCodeT status;
+ struct ZbZclPollControlClientSetLongReq long_req;
+ struct ZbZclPollControlClientSetShortReq short_req;
+ struct ZbZclAddrInfoT dstInfo = currentServer_FastPollStarted_dstInfo;
+ ZbZclWriteReqT RemoteWriteReq;
+ uint32_t checkin_interval_val = SERVER_CHECKIN_INTERVAL;
+ uint16_t fast_poll_timeout_val = SERVER_FAST_POLL_TIMEOUT;
+
+ APP_DBG("[POLL CONTROL] Modifying Poll Control attributes for device with nwk address 0x%04x.",
+ dstInfo.addr.nwkAddr);
+
+ /* Poll Control Server attributes remote write */
+ memset(&RemoteWriteReq, 0, sizeof(RemoteWriteReq));
+ RemoteWriteReq.dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ RemoteWriteReq.dst.endpoint = SW1_ENDPOINT;
+ RemoteWriteReq.dst.nwkAddr = dstInfo.addr.nwkAddr;
+
+ /* remotely write two attribute with the same request */
+ RemoteWriteReq.count = 2;
+
+ /* ZCL_POLL_CHECK_IN_INTERVAL attribute */
+ RemoteWriteReq.attr[0].attrId = ZCL_POLL_CHECK_IN_INTERVAL;
+ RemoteWriteReq.attr[0].type = ZCL_DATATYPE_UNSIGNED_32BIT;
+ RemoteWriteReq.attr[0].length = 4;
+ RemoteWriteReq.attr[0].value = (uint8_t const*)&checkin_interval_val;
+
+ /* ZCL_POLL_SERVER_FAST_POLL_TIMEOUT attribute */
+ RemoteWriteReq.attr[1].attrId = ZCL_POLL_FAST_POLL_TIMEOUT;
+ RemoteWriteReq.attr[1].type = ZCL_DATATYPE_UNSIGNED_16BIT;
+ RemoteWriteReq.attr[1].length = 2;
+ RemoteWriteReq.attr[1].value = (uint8_t const*)&fast_poll_timeout_val;
+ APP_DBG("[POLL CONTROL] Remotely writing WR server attributes: Check-in Interval and Fast Poll Timeout.");
+
+ status = ZbZclWriteReq(zigbee_app_info.pollcontrol_client, &RemoteWriteReq,
+ APP_ZIGBEE_Remote_Write_cb, NULL);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[POLL CONTROL] Error writting remote attribute.");
+ return;
+ }
+
+ /* Waiting until previous commamd finishes */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE);
+
+ /* Sending Poll Control Client request for writing R-only ZCL_POLL_SERVER_SHORT_POLL_INTERVAL */
+ APP_DBG("[POLL CONTROL] Sending request for writing R-only Short Poll interval attribute.");
+ memset(&short_req, 0, sizeof(short_req));
+ short_req.dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ short_req.dst.nwkAddr = dstInfo.addr.nwkAddr;
+ short_req.dst.endpoint = SW1_ENDPOINT;
+ short_req.interval = SERVER_SHORT_POLL_INTERVAL;
+ status = zcl_poll_client_set_short_intvl_req(zigbee_app_info.pollcontrol_client, &short_req,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, zcl_poll_client_set_short_intvl_req failed.");
+ return;
+ }
+
+ /* Waiting until previous commamd finishes */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE);
+
+ /* Sending Poll Control Client request for writing R-only ZCL_POLL_SERVER_LONG_POLL_INTERVAL */
+ APP_DBG("[POLL CONTROL] Sending request for writing R-only Long Poll interval attribute.");
+ memset(&long_req, 0, sizeof(long_req));
+ long_req.dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ long_req.dst.nwkAddr = dstInfo.addr.nwkAddr;
+ long_req.dst.endpoint = SW1_ENDPOINT;
+ long_req.interval = SERVER_LONG_POLL_INTERVAL;
+ status = zcl_poll_client_set_long_intvl_req(zigbee_app_info.pollcontrol_client, &long_req,
+ APP_ZIGBEE_Generic_Cmd_Rsp_cb, NULL);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, zcl_poll_client_set_long_intvl_req failed.");
+ return;
+ }
+
+ /* Waiting until previous commamd finishes */
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_CONTINUE);
+
+ APP_DBG("[POLL CONTROL] Remote operations on device done during its Fast Pulling time.\n");
+}
+
+/**
+ * @brief Poll Control client initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Client_Init(void){
+ APP_DBG("[POLL CONTROL] Poll Control client init done!\n");
+} /* APP_ZIGBEE_PollControl_Client_Init */
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Task associated with Fast Poll set checkin response */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_POLL_CONTROL_SET_CHECKIN_RSP,
+ UTIL_SEQ_RFU, APP_ZIGBEE_PollControl_Client_SetCheckInRspForServers);
+
+ /* Task associated with remote Poll Control attributes modification */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_POLL_CONTROL_REMOTE_WRITE,
+ UTIL_SEQ_RFU, APP_ZIGBEE_PollControl_Client_OperateOnRemoteServer);
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+
+ /* Initialize Zigbee Poll Control Client parameters */
+ APP_ZIGBEE_PollControl_Client_Init();
+} /* APP_ZIGBEE_App_Init */
+
+static void APP_ZIGBEE_Remote_Write_cb(const ZbZclWriteRspT *writeResp, void *cb_arg){
+ UNUSED(cb_arg);
+
+ if(writeResp->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[POLL CONTROL] Error, remote write failed.\n");
+ return;
+ }
+
+ APP_DBG("Remote write OK.\n");
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_CONTINUE);
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_HOME_GATEWAY;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* Poll Control Client */
+ zigbee_app_info.pollcontrol_client = zcl_poll_client_alloc(zigbee_app_info.zb, SW1_ENDPOINT,
+ &ZbZclPollControlClientCallbacks, NULL);
+ assert(zigbee_app_info.pollcontrol_client != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.pollcontrol_client);
+
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ /* Set the centralized network */
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORD");
+ config.startupControl = ZbStartTypeForm;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /*Channel in use */
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, re-attempting to form a network after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+ }
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_POLL_CONTROL_SET_CHECKIN_RSP, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_SW1_Process */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/readme.txt
new file mode 100644
index 000000000..0c2bb698b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/readme.txt
@@ -0,0 +1,161 @@
+/**
+ @page Zigbee_PollControl_Client_Coord application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_PollControl_Client_Coord/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Poll Control Cluster application as a client
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Poll Control cluster as a client on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the Poll Control cluster. Once the Zigbee mesh
+network is created, the user can start the demo scenario on the client through push button SW1.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_PollControl_Client_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_RFD_fw.bin
+ - application : Zigbee_PollControl_Server_SED
+
+
+Demo use case :
+
+This demo shows how to use Poll Control for remotely operating on a Sleepy End Device (SED).
+
+The Poll Control server, on the SED, sends periodically Checkin requests to the Poll Control client
+to know its polling policy (Long or Fast Poll) until the next Checkin request.
+The client can respond to Checkin requests with:
+- Fast Poll field set to false => the server will continue Long Polling (default behavior).
+- Fast Poll field set to true => the server is going to enter in Fast Polling mode
+ (during the specified Fast Poll timeout).
+
+During this Fast Polling period, the SED is not sleeping and remote operation are possible.
+So, during this period of time, the client remotely writes Poll Control server attributes.
+
+The client will respond to the next server Checkin request with a Fast Poll response when push
+button SW1 is pressed (client side}.
+The current Poll Control configuration of the server can be shown by pressing button SW1 (server side).
+It can be used to validate the client remote operation during the server Fast Polling period.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | -->| Server |
+ | | ZbZclAttrIntegerWrite(ZCL_POLL_CHECK_IN_INTERVAL) | | |
+ | | ---| |
+ | | | |
+ | | /* Default Long Poll mode */ | |
+ | | | |
+ | | /* Checkin request */ | |
+ | | <----------------------------------------------------------------------------- | |
+ | | /* Checkin response (Fast Poll false) => Long Poll */ | |
+ | | -----------------------------------------------------------------------------> | |
+ | | | |
+ | | | |
+ | | /* Fast Poll mode */ | |
+ | | | |
+ | | <-- | |
+ PushB SW1=>| | | zcl_poll_client_set_checkin_rsp(ZCL_PWR_PROF_STATE_PROFILE_IDLE) | |
+ | | --- | |
+ | | | |
+ | | /* Checkin request */ | |
+ | | <----------------------------------------------------------------------------- | |
+ | | /* Checkin response (Fast Poll true) => Short Poll */ | |=> GREEN LED ON
+ | | -----------------------------------------------------------------------------> | | (during fast poll timeout)
+ | | | |
+ | | | |
+ | | -->| |
+ | | /* Show local Poll Control server attributes */ | | |<=PushB SW1
+ | | ---| |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_MeterId_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee SED and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_common.h
new file mode 100644
index 000000000..4defc5d7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_common.h
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * File Name : app_common.h
+ * Description : App Common application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_conf.h
new file mode 100644
index 000000000..89f631292
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_conf.h
@@ -0,0 +1,354 @@
+/**
+ ******************************************************************************
+ * File Name : app_conf.h
+ * Description : Application configuration file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Application Config
+ ******************************************************************************/
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ *
+ * When CFG_FULL_LOW_POWER is set to 1, the system is configured in full
+ * low power mode. It means that all what can have an impact on the consumptions
+ * are powered down.(For instance LED, Access to Debugger, Etc.)
+ *
+ * When CFG_FULL_LOW_POWER is set to 0, the low power mode is not activated
+ *
+ ******************************************************************************/
+
+#define CFG_FULL_LOW_POWER 0
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/*****************************************************************************
+ * Traces
+ * Enable or Disable traces in application
+ * When CFG_DEBUG_TRACE is set, traces are activated
+ *
+ * Note : Refer to utilities_conf.h file in order to details
+ * the level of traces : CFG_DEBUG_TRACE_FULL or CFG_DEBUG_TRACE_LIGHT
+ *****************************************************************************/
+#define CFG_DEBUG_TRACE 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_DEBUG_TRACE
+#define CFG_DEBUG_TRACE 0
+#endif /* CFG_FULL_LOW_POWER */
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+/**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum {
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_ZIGBEE_APP_START,
+ CFG_TASK_ZIGBEE_APP_POLL_CONTROL_SHOW_ATTR,
+ CFG_TIM_ZIGBEE_APP_POLL_CONTROL_LED_INDICATION,
+ CFG_TASK_BUTTON_SW1,
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/* Scheduler types and defines */
+/*------------------------------------*/
+
+//#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum {
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum {
+ CFG_LPM_APP,
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_entry.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_entry.h
+ * Description : App entry configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macros ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+ void APPE_Init( void );
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /*APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..71290de64
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+ /**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOvalueNotSetted_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOvalueNotSetted
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_valueNotSetted
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AFvalueNotSetted_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_CHANNEL_1
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_CHANNEL_1_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_CHANNEL_1_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA1_CHANNEL_2
+#define CFG_HW_USART1_TX_DMA_IRQn DMA1_CHANNEL_2_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA1_CHANNEL_2_IRQHandler
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/main.h
new file mode 100644
index 000000000..68182bc5a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/main.h
@@ -0,0 +1,71 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ea9aa40d0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/*#define HAL_ADC_MODULE_ENABLED */
+/*#define HAL_CRYP_MODULE_ENABLED */
+/*#define HAL_COMP_MODULE_ENABLED */
+/*#define HAL_CRC_MODULE_ENABLED */
+#define HAL_HSEM_MODULE_ENABLED
+/*#define HAL_I2C_MODULE_ENABLED */
+/*#define HAL_IPCC_MODULE_ENABLED */
+/*#define HAL_IRDA_MODULE_ENABLED */
+/*#define HAL_IWDG_MODULE_ENABLED */
+/*#define HAL_LCD_MODULE_ENABLED */
+/*#define HAL_LPTIM_MODULE_ENABLED */
+/*#define HAL_PCD_MODULE_ENABLED */
+/*#define HAL_PKA_MODULE_ENABLED */
+/*#define HAL_QSPI_MODULE_ENABLED */
+/*#define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/*#define HAL_SAI_MODULE_ENABLED */
+/*#define HAL_SMBUS_MODULE_ENABLED */
+/*#define HAL_SMARTCARD_MODULE_ENABLED */
+/*#define HAL_SPI_MODULE_ENABLED */
+/*#define HAL_TIM_MODULE_ENABLED */
+/*#define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/*#define HAL_USART_MODULE_ENABLED */
+/*#define HAL_WWDG_MODULE_ENABLED */
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..a3a535f13
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,83 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_common.h"
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void PVD_PVM_IRQHandler(void);
+void FLASH_IRQHandler(void);
+void RCC_IRQHandler(void);
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+void C2SEV_PWR_C2H_IRQHandler(void);
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void);
+void HSEM_IRQHandler(void);
+void FPU_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+void RTC_WKUP_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..58877c570
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/stm_logging.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.h
+ * Description : Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__), __FUNCTION__, __LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum {
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* OpenThread API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/app_entry.c
new file mode 100644
index 000000000..a73f9b5ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/app_entry.c
@@ -0,0 +1,500 @@
+/**
+ ******************************************************************************
+ * File Name : app_entry.c
+ * Description : Entry application source file for STM32WPAN Middleware.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_zigbee.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "dbg_trace.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* Global function prototypes -----------------------------------------------*/
+size_t __write(int handle, const unsigned char *buf, size_t bufSize);
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config(void);
+static void Init_Debug(void);
+static void appe_Tl_Init(void);
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status);
+static void APPE_SysUserEvtRx(void *pPayload);
+static void APPE_SysEvtReadyProcessing(void);
+static void APPE_SysEvtError(SCHI_SystemErrCode_t ErrorCode);
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init(void);
+static void Button_Init(void);
+
+/* Section specific to button management using UART */
+static void RxUART_Init(void);
+static void RxCpltCallback(void);
+static void UartCmdExecute(void);
+
+#define C_SIZE_CMD_STRING 256U
+#define RX_BUFFER_SIZE 8U
+
+static uint8_t aRxBuffer[RX_BUFFER_SIZE];
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+static uint16_t indexReceiveChar = 0;
+EXTI_HandleTypeDef exti_handle;
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+ RxUART_Init();
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Zigbee Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch (ErrorCode)
+ {
+ case ERR_ZIGBEE_UNKNOWN_CMD:
+ APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_ZIGBEE : ErroCode=%d \n", ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init();
+
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW2, BUTTON_MODE_EXTI);
+ BSP_PB_Init(BUTTON_SW3, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch (evt_waited_bm) {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Run only the task CFG_TASK_REQUEST_FROM_M0_TO_M4 to process
+ * direct requests from the M0 (e.g. ZbMalloc), but no stack notifications
+ * until we're done the request to the M0. */
+ UTIL_SEQ_Run((1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Process notifications and requests from the M0 */
+ UTIL_SEQ_Run((1U << CFG_TASK_NOTIFY_FROM_M0_TO_M4) | (1U << CFG_TASK_REQUEST_FROM_M0_TO_M4));
+ break;
+
+ default:
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ MX_USART1_UART_Init();
+
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+/**
+ * @brief This function manage the Push button action
+ * @param GPIO_Pin : GPIO pin which has been activated
+ * @retval None
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin) {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1,CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW2_PIN:
+ break;
+
+ case BUTTON_SW3_PIN:
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void RxUART_Init(void)
+{
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ if (aRxBuffer[0] == '\r')
+ {
+ APP_DBG("received %s", CommandString);
+
+ UartCmdExecute();
+
+ /* Clear receive buffer and character counter*/
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+ }
+ else
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_DEBUG_TRACE_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+
+static void UartCmdExecute(void)
+{
+ /* Parse received CommandString */
+ if(strcmp((char const*)CommandString, "SW1") == 0)
+ {
+ APP_DBG("SW1 OK");
+ exti_handle.Line = EXTI_LINE_4;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW2") == 0)
+ {
+ APP_DBG("SW2 OK");
+ exti_handle.Line = EXTI_LINE_0;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else if (strcmp((char const*)CommandString, "SW3") == 0)
+ {
+ APP_DBG("SW3 OK");
+ exti_handle.Line = EXTI_LINE_1;
+ HAL_EXTI_GenerateSWI(&exti_handle);
+ }
+ else
+ {
+ APP_DBG("NOT RECOGNIZED COMMAND : %s", CommandString);
+ }
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_uart.c
new file mode 100644
index 000000000..9a553610d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/hw_uart.c
@@ -0,0 +1,318 @@
+/**
+ ******************************************************************************
+ * File Name : Src/hw_uart.c
+ * Description : HW UART source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#endif
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+/* Variables -----------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/main.c
new file mode 100644
index 000000000..80ad1ad58
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/main.c
@@ -0,0 +1,521 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Zigbee_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_entry.h"
+
+/* Private includes ----------------------------------------------------------*/
+
+#include "dbg_trace.h"
+#include "hw_conf.h"
+#include "otp.h"
+#include "stm32_seq.h"
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef hlpuart1;
+UART_HandleTypeDef huart1;
+DMA_HandleTypeDef hdma_lpuart1_tx;
+DMA_HandleTypeDef hdma_usart1_tx;
+RTC_HandleTypeDef hrtc;
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
+void MX_LPUART1_UART_Init(void);
+void MX_USART1_UART_Init(void);
+static void MX_RF_Init(void);
+static void MX_RTC_Init(void);
+
+void PeriphClock_Config(void);
+static void Reset_Device(void);
+static void Reset_IPCC(void);
+static void Reset_BackupDomain(void);
+static void Init_Exti(void);
+static void Config_HSE(void);
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_DMA_Init();
+ MX_RF_Init();
+ MX_RTC_Init();
+
+ /* Init the full application */
+ APPE_Init();
+
+ /* Infinite loop */
+
+ while (1) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+
+ }
+
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief LPUART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_LPUART1_UART_Init(void)
+{
+
+ hlpuart1.Instance = LPUART1;
+ hlpuart1.Init.BaudRate = 115200;
+ hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
+ hlpuart1.Init.StopBits = UART_STOPBITS_1;
+ hlpuart1.Init.Parity = UART_PARITY_NONE;
+ hlpuart1.Init.Mode = UART_MODE_TX_RX;
+ hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ hlpuart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_Init(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+void MX_USART1_UART_Init(void)
+{
+
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_8;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ if (HAL_UART_Init(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) {
+ Error_Handler();
+ }
+ if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) {
+ Error_Handler();
+ }
+
+}
+
+/**
+ * @brief RF Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RF_Init(void)
+{
+
+}
+
+/**
+ * @brief RTC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_RTC_Init(void)
+{
+
+
+ /** Initialize RTC Only
+ */
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN RTC_Init 2 */
+
+ /* USER CODE END RTC_Init 2 */
+
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
+ /* DMA1_Channel2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+void PeriphClock_Config(void)
+{
+ #if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..9c338486d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,334 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : stm32wbxx_hal_msp.c
+ * Description : This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_HSEM_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* Peripheral interrupt init */
+ /* PVD_PVM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
+ /* FLASH_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FLASH_IRQn);
+ /* RCC_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(RCC_IRQn);
+ /* C2SEV_PWR_C2H_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(C2SEV_PWR_C2H_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(C2SEV_PWR_C2H_IRQn);
+ /* PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn);
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_IRQn);
+ /* FPU_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(FPU_IRQn);
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+ hdma_lpuart1_tx.Init.Request = DMA_REQUEST_LPUART1_TX;
+ hdma_lpuart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_lpuart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_lpuart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_lpuart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_lpuart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_lpuart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_lpuart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_lpuart1_tx);
+
+ /* LPUART1 interrupt Init */
+ HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspInit 1 */
+
+ /* USER CODE END LPUART1_MspInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+ hdma_usart1_tx.Init.Request = DMA_REQUEST_USART1_TX;
+ hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart1_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
+
+ /* USART1 interrupt Init */
+ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /**LPUART1 GPIO Configuration
+ PA2 ------> LPUART1_TX
+ PA3 ------> LPUART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
+
+ /* LPUART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* LPUART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LPUART1_IRQn);
+ /* USER CODE BEGIN LPUART1_MspDeInit 1 */
+
+ /* USER CODE END LPUART1_MspDeInit 1 */
+ }
+ else if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA11 ------> USART1_CTS
+ PB6 ------> USART1_TX
+ PB7 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
+
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
+
+ /* USART1 DMA DeInit */
+ HAL_DMA_DeInit(huart->hdmatx);
+
+ /* USART1 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(USART1_IRQn);
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspInit 0 */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSE as RTC Input */
+
+ /* USER CODE END RTC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_RTC_ENABLE();
+ /* USER CODE BEGIN RTC_MspInit 1 */
+
+ MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
+ /* USER CODE END RTC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief RTC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hrtc: RTC handle pointer
+* @retval None
+*/
+void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
+{
+ if(hrtc->Instance==RTC)
+ {
+ /* USER CODE BEGIN RTC_MspDeInit 0 */
+
+ /* USER CODE END RTC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_RTC_DISABLE();
+ /* USER CODE BEGIN RTC_MspDeInit 1 */
+
+ /* USER CODE END RTC_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..7c5536dfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,411 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @brief Interrupt Service Routines.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32wbxx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "hw.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+
+extern DMA_HandleTypeDef hdma_usart1_tx;
+
+extern UART_HandleTypeDef hlpuart1;
+
+extern UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Prefetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32WBxx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32wbxx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles PVD/PVM0/PVM2 interrupts through EXTI lines 16/31/33.
+ */
+void PVD_PVM_IRQHandler(void)
+{
+ /* USER CODE BEGIN PVD_PVM_IRQn 0 */
+
+ /* USER CODE END PVD_PVM_IRQn 0 */
+ HAL_PWREx_PVD_PVM_IRQHandler();
+ /* USER CODE BEGIN PVD_PVM_IRQn 1 */
+
+ /* USER CODE END PVD_PVM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Flash global interrupt.
+ */
+void FLASH_IRQHandler(void)
+{
+ /* USER CODE BEGIN FLASH_IRQn 0 */
+
+ /* USER CODE END FLASH_IRQn 0 */
+ HAL_FLASH_IRQHandler();
+ /* USER CODE BEGIN FLASH_IRQn 1 */
+
+ /* USER CODE END FLASH_IRQn 1 */
+}
+
+/**
+ * @brief This function handles RCC global interrupt.
+ */
+void RCC_IRQHandler(void)
+{
+ /* USER CODE BEGIN RCC_IRQn 0 */
+
+ /* USER CODE END RCC_IRQn 0 */
+ /* USER CODE BEGIN RCC_IRQn 1 */
+
+ /* USER CODE END RCC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel1 global interrupt.
+ */
+void DMA1_Channel1_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+ /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA1 channel2 global interrupt.
+ */
+void DMA1_Channel2_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles CPU2 SEV interrupt through EXTI line 40 and PWR CPU2 HOLD wake-up interrupt.
+ */
+void C2SEV_PWR_C2H_IRQHandler(void)
+{
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 0 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 0 */
+ /* USER CODE BEGIN C2SEV_PWR_C2H_IRQn 1 */
+
+ /* USER CODE END C2SEV_PWR_C2H_IRQn 1 */
+}
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+ HAL_UART_IRQHandler(&huart1);
+ /* USER CODE BEGIN USART1_IRQn 1 */
+
+ /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LPUART1 global interrupt.
+ */
+void LPUART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN LPUART1_IRQn 0 */
+
+ /* USER CODE END LPUART1_IRQn 0 */
+ HAL_UART_IRQHandler(&hlpuart1);
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/**
+ * @brief This function handles PWR switching on the fly, end of BLE activity, end of 802.15.4 activity, end of critical radio phase interrupt.
+ */
+void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler(void)
+{
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 0 */
+ /* USER CODE BEGIN PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+
+ /* USER CODE END PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQn 1 */
+}
+
+/**
+ * @brief This function handles HSEM global interrupt.
+ */
+void HSEM_IRQHandler(void)
+{
+ /* USER CODE BEGIN HSEM_IRQn 0 */
+
+ /* USER CODE END HSEM_IRQn 0 */
+ HAL_HSEM_IRQHandler();
+ /* USER CODE BEGIN HSEM_IRQn 1 */
+
+ /* USER CODE END HSEM_IRQn 1 */
+}
+
+/**
+ * @brief This function handles FPU global interrupt.
+ */
+void FPU_IRQHandler(void)
+{
+ /* USER CODE BEGIN FPU_IRQn 0 */
+
+ /* USER CODE END FPU_IRQn 0 */
+ /* USER CODE BEGIN FPU_IRQn 1 */
+
+ /* USER CODE END FPU_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+/**
+ * @brief This function handles External External line 4 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI4_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External External line 0 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI0_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External External line 1 interrupt request.
+ * @param None
+ * @retval None
+ */
+void EXTI1_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+void
+IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void
+IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/* USER CODE END 1 */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm_logging.c
new file mode 100644
index 000000000..c24b86dd8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/stm_logging.c
@@ -0,0 +1,205 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#define LOG_MSG_SZ_MAX 256
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t
+logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion) {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_ZIGBEE_API:
+ strcpy(logRegionString, "[M4 ZIGBEE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..d4653a0ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,353 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32wbxx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/*!< Uncomment the following line if you need to relocate your vector Table in
+ Internal SRAM. */
+/* #define VECT_TAB_SRAM */
+#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+
+#define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+ /* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* Configure the Vector Table location add offset address ------------------*/
+#if defined(VECT_TAB_SRAM) && defined(VECT_TAB_BASE_ADDRESS)
+ /* program in SRAMx */
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAMx for CPU1 */
+#else /* program in FLASH */
+ SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
+#endif
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+ #endif
+
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+ /* Set MSION bit */
+ RCC->CR |= RCC_CR_MSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00070000U;
+
+ /* Reset PLLSAI1ON, PLLON, HSECSSON, HSEON, HSION, and MSIPLLON bits */
+ RCC->CR &= (uint32_t)0xFAF6FEFBU;
+
+ /*!< Reset LSI1 and LSI2 bits */
+ RCC->CSR &= (uint32_t)0xFFFFFFFAU;
+
+ /*!< Reset HSI48ON bit */
+ RCC->CRRCR &= (uint32_t)0xFFFFFFFEU;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x22041000U;
+
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Project.eww
new file mode 100644
index 000000000..d6e74a7a0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Zigbee_PollControl_Server_SED.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewd
new file mode 100644
index 000000000..d3e3d2c1a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_PollControl_Server_SED</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state>--stlink_use_server</state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewp
new file mode 100644
index 000000000..25eca193b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewp
@@ -0,0 +1,1261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Zigbee_PollControl_Server_SED</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>1</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Zigbee_PollControl_Server_SED/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Zigbee_PollControl_Server_SED/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Zigbee_PollControl_Server_SED/List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Full formatting, with multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>4.41A</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>ZIGBEE_WB</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>00000000</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state>--diag_suppress Pe111</state>
+ <state>--diag_suppress Pe188</state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$/../Core/Inc</state>
+ <state>$PROJ_DIR$/../STM32_WPAN/App</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc/Legacy</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/app</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/utilities</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/core/Inc</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
+ <state>$PROJ_DIR$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/M4</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
+ <state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Zigbee_PollControl_Server_SED.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Zigbee_PollControl_Server_SED.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>1</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_hal_msp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>App</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.c</name>
+ </file>
+ </group>
+ <group>
+ <name>Target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>STM32WBxx_Nucleo</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_exti.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_hsem.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>schi</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_zigbee_hci.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ <group>
+ <name>zigbee</name>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\core\src\zigbee_core_wb.c</name>
+ </file>
+ </group>
+ <group>
+ <name>stack</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\zigbee\lib\stm32wb_zigbee_wb_lib.a</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <group>
+ <name>lpm</name>
+ <group>
+ <name>tiny_lpm</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>sequencer</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..70aec4026
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002F000;
+
+ /*0x2002FFFF---------------------------------------|
+ * | Emulation Flash |
+ * 0x2002F000-------------------------------------- |
+ * | Region_RAM |
+ * 0x20000004-------------------------------------- |
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000; /* 4K */
+define symbol __ICFEDIT_size_heap__ = 102400; /* was 4K */
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x20031000;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..fe5a886b9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,746 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_zigbee.h"
+#include "zigbee_interface.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "zigbee_types.h"
+#include "stm32_seq.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.poll.control.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17
+#define CHANNEL 19
+#define HW_TS_SERVER_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL) /* 1ms */
+#define SED_SLEEP_TIME_30S 1 /* SED base sleep unit is 30s */
+
+/* Poll Control specific defines ---------------------------------------------*/
+/* Poll Control time related attribute values are in 1/4 of a second */
+/* Convert milliseconds to quarter seconds, and vice versa */
+#define POLL_CONVERT_MS_TO_QS(ms) (ms / 250U)
+#define POLL_CONVERT_QS_TO_MS(qs) (qs * 250U)
+#define CHECKIN_INTERVAL (4*10) /* 10s */
+#define LONG_POLL_INTERVAL (4*5) /* 5s */
+
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_ZIGBEE_StackLayersInit(void);
+static void APP_ZIGBEE_ConfigEndpoints(void);
+static void APP_ZIGBEE_NwkForm(void);
+static void APP_ZIGBEE_App_Init(void);
+static void APP_ZIGBEE_SW1_Process(void);
+
+static void APP_ZIGBEE_PollControl_Server_Init(void);
+static void APP_ZIGBEE_PollControl_Server_ShowAttr(void);
+static void APP_ZIGBEE_PollControl_Server_FillingBindingTable(void);
+static void APP_ZIGBEE_PollControl_Server_CheckinRsp_cb(struct ZbZclClusterT *clusterPtr, struct zcl_poll_checkin_rsp_t *rsp_info,
+ struct ZbZclAddrInfoT *srcInfo, void *arg);
+static void APP_ZIGBEE_PollControl_FastPoll_End(void);
+
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
+
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+/* Private variables -----------------------------------------------*/
+static TL_CmdPacket_t *p_ZIGBEE_otcmdbuffer;
+static TL_EvtPacket_t *p_ZIGBEE_notif_M0_to_M4;
+static TL_EvtPacket_t *p_ZIGBEE_request_M0_to_M4;
+static __IO uint32_t CptReceiveNotifyFromM0 = 0;
+static __IO uint32_t CptReceiveRequestFromM0 = 0;
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_ZIGBEE_Config_t ZigbeeConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ZigbeeOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+struct zigbee_app_info {
+ bool has_init;
+ struct ZigBeeT *zb;
+ enum ZbStatusCodeT join_status;
+ uint32_t join_delay;
+
+ struct ZbZclClusterT *pollcontrol_server;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static struct ZbZclPollControlServerCallbackT ZbZclPollControlServerCallbacks = {
+ .checkin_rsp = APP_ZIGBEE_PollControl_Server_CheckinRsp_cb,
+};
+
+static uint8_t TS_ID1;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Poll Control client Checkin response callback
+ * @param clusterPtr: ZCL cluster pointer
+ * @param rsp_info: Checkin response
+ * @param srcInfo: sender address info
+ * @param arg: passed arguments
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Server_CheckinRsp_cb(struct ZbZclClusterT *clusterPtr, struct zcl_poll_checkin_rsp_t *rsp_info,
+ struct ZbZclAddrInfoT *srcInfo, void *arg){
+
+ /* Check response status */
+ if(rsp_info->status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error, checkin request no successfully handled by Poll Control client.");
+ return;
+ }
+
+ APP_DBG("[POLL CONTROL] Checkin response recieved.");
+
+ if(rsp_info->start_fast_poll){
+ APP_DBG("[POLL CONTROL] Fast Poll enabled for %d seconds.\n", rsp_info->fast_poll_timeout/4);
+ BSP_LED_On(LED_GREEN);
+ APP_DBG("GREEN LED ON\n");
+ HW_TS_Start(TS_ID1, POLL_CONVERT_QS_TO_MS(rsp_info->fast_poll_timeout)*HW_TS_SERVER_1MS_NB_TICKS);
+ } else {
+ APP_DBG("[POLL CONTROL] Continue with Long Poll.\n");
+ }
+}
+
+/**
+ * @brief Show Poll Control server local attributes
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Server_ShowAttr(void){
+ enum ZclStatusCodeT status;
+ uint32_t checkin_interval, long_interval;
+ uint16_t short_interval, fast_timeout;
+
+ APP_DBG("[POLL CONTROL] Server attributes.");
+
+ /* Get local ZCL_POLL_CHECK_IN_INTERVAL attributes value */
+ checkin_interval = (uint32_t)ZbZclAttrIntegerRead(zigbee_app_info.pollcontrol_server,
+ ZCL_POLL_CHECK_IN_INTERVAL, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ } else {
+ APP_DBG("[POLL CONTROL] Checkin interval: %ds", checkin_interval/4);
+ }
+
+ /* Get local ZCL_POLL_LONG_POLL_INTERVAL attributes value */
+ long_interval = (uint32_t)ZbZclAttrIntegerRead(zigbee_app_info.pollcontrol_server,
+ ZCL_POLL_LONG_POLL_INTERVAL, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ } else {
+ APP_DBG("[POLL CONTROL] Long poll interval: %ds", long_interval/4);
+ }
+
+ /* Get local ZCL_POLL_SHORT_POLL_INTERVAL attributes value */
+ short_interval = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.pollcontrol_server,
+ ZCL_POLL_SHORT_POLL_INTERVAL, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ } else {
+ APP_DBG("[POLL CONTROL] Short poll interval: %ds", short_interval/4);
+ }
+
+ /* Get local ZCL_POLL_FAST_POLL_TIMEOUT attributes value */
+ fast_timeout = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.pollcontrol_server,
+ ZCL_POLL_FAST_POLL_TIMEOUT, NULL, &status);
+ if (status != ZCL_STATUS_SUCCESS){
+ APP_DBG("Error reading local attribute.");
+ } else {
+ APP_DBG("[POLL CONTROL] Fast poll timeout: %ds\n", fast_timeout/4);
+ }
+}
+
+/**
+ * @brief Adding coordinator (with Poll Control Cluster) in device binding table
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Server_FillingBindingTable(void){
+ ZbApsmeBindReqT bindreq;
+ ZbApsmeBindConfT bindconf;
+ uint64_t ext_addr;
+
+ APP_DBG("[POLL CONTROL] Adding Poll Control client in the binding table.");
+
+ /* Get the extended addr of the Poll Control client (the coordinator) */
+ ext_addr = ZbNwkAddrLookupExt(zigbee_app_info.zb, 0x0);
+
+ /* Filling binding request */
+ memset(&bindreq, 0, sizeof(bindreq));
+ memset(&bindconf, 0, sizeof(bindconf));
+ bindreq.srcExtAddr = ZbExtendedAddress(zigbee_app_info.zb);
+ bindreq.srcEndpt = SW1_ENDPOINT;
+ bindreq.clusterId = ZCL_CLUSTER_POLL_CONTROL;
+ bindreq.dst.mode = ZB_APSDE_ADDRMODE_EXT;
+ bindreq.dst.endpoint = SW1_ENDPOINT;
+ bindreq.dst.extAddr = ext_addr;
+
+ ZbApsmeBindReq(zigbee_app_info.zb,&bindreq,&bindconf);
+
+ if(bindconf.status != ZB_WPAN_STATUS_SUCCESS){
+ APP_DBG("[POLL CONTROL] Local Bind failed.");
+ assert(0);
+ }
+}
+
+/**
+ * @brief Poll Control server initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PollControl_Server_Init(void){
+ enum ZclStatusCodeT status;
+
+ /* IMPORTANT: In order for the check-in request to be submited to the client,
+ the client must be present in the server local binding table. */
+ APP_ZIGBEE_PollControl_Server_FillingBindingTable();
+
+ /* ZCL_POLL_CHECK_IN_INTERVAL attribute init */
+ APP_DBG("[POLL CONTROL] Writing Check-in Interval attribute.");
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.pollcontrol_server, ZCL_POLL_CHECK_IN_INTERVAL, CHECKIN_INTERVAL);
+ if(status != ZCL_STATUS_SUCCESS){
+ APP_DBG("[POLL CONTROL] Error writting local attribute.");
+ assert(0);
+ }
+
+ APP_DBG("[POLL CONTROL] Poll Control server init done!\n");
+} /* APP_ZIGBEE_PollControl_Server_Init */
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_App_Init(void){
+ /* Timer associated with Poll Control polling state indication */
+ HW_TS_Create(CFG_TIM_ZIGBEE_APP_POLL_CONTROL_LED_INDICATION, &TS_ID1, hw_ts_SingleShot, APP_ZIGBEE_PollControl_FastPoll_End);
+
+ /* Task associated with Poll Control server attributes print */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_POLL_CONTROL_SHOW_ATTR,
+ UTIL_SEQ_RFU, APP_ZIGBEE_PollControl_Server_ShowAttr);
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+
+ /* Initialize Zigbee Poll Control Server parameters */
+ APP_ZIGBEE_PollControl_Server_Init();
+} /* APP_ZIGBEE_App_Init */
+
+static void APP_ZIGBEE_PollControl_FastPoll_End(void){
+ BSP_LED_Off(LED_GREEN);
+ APP_DBG("GREEN LED OFF\n");
+}
+
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_ZIGBEE_CheckWirelessFirmwareInfo();
+
+ /* Register cmdbuffer */
+ APP_ZIGBEE_RegisterCmdBuffer(&ZigbeeOtCmdBuffer);
+
+ /* Init config buffer and call TL_ZIGBEE_Init */
+ APP_ZIGBEE_TL_INIT();
+
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessNotifyM0ToM4);
+ UTIL_SEQ_RegTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_ZIGBEE_ProcessRequestM0ToM4);
+
+ /* Task associated with network creation process */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+
+ /* Task associated with application init */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_APP_START, UTIL_SEQ_RFU, APP_ZIGBEE_App_Init);
+ /* Start the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /* Initialize Zigbee stack layers */
+ APP_ZIGBEE_StackLayersInit();
+
+
+
+} /* APP_ZIGBEE_Init */
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ APP_DBG("APP_ZIGBEE_StackLayersInit");
+
+ zigbee_app_info.zb = ZbInit(0U, NULL, NULL);
+ assert(zigbee_app_info.zb != NULL);
+
+ /* Create the endpoint and cluster(s) */
+ APP_ZIGBEE_ConfigEndpoints();
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Configure the joining parameters */
+ zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+
+ /* Initialization Complete */
+ zigbee_app_info.has_init = true;
+
+ /* run the task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_StackLayersInit */
+
+/**
+ * @brief Configure Zigbee application endpoints
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigEndpoints(void)
+{
+ ZbApsmeAddEndpointReqT req;
+ ZbApsmeAddEndpointConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_WHITE_GOODS;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* Poll Control Server */
+ zigbee_app_info.pollcontrol_server = zcl_poll_server_alloc(zigbee_app_info.zb, SW1_ENDPOINT,
+ &ZbZclPollControlServerCallbacks, NULL);
+ assert(zigbee_app_info.pollcontrol_server != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.pollcontrol_server);
+} /* APP_ZIGBEE_ConfigEndpoints */
+
+/**
+ * @brief Handle Zigbee network forming and joining
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NwkForm(void)
+{
+ if ((zigbee_app_info.join_status != ZB_STATUS_SUCCESS) && (HAL_GetTick() >= zigbee_app_info.join_delay))
+ {
+ struct ZbStartupT config;
+ enum ZbStatusCodeT status;
+
+ /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ ZbSetLogging(zigbee_app_info.zb, ZB_LOG_MASK_LEVEL_5, NULL);
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+ config.startupControl = ZbStartTypeJoin;
+
+ /* Using the default HA preconfigured Link Key */
+ memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+ config.channelList.count = 1;
+ config.channelList.list[0].page = 0;
+ config.channelList.list[0].channelMask = 1 << CHANNEL; /* Channel in use */
+
+ /* Add Sleepy End device configuration */
+ config.capability &= ~(MCP_ASSOC_CAP_RXONIDLE | MCP_ASSOC_CAP_DEV_TYPE | MCP_ASSOC_CAP_ALT_COORD);
+ config.endDeviceTimeout = 1*SED_SLEEP_TIME_30S /* 1 x (30sec sleep time unit) => 30s sleepy cycle */;
+
+
+ /* Using ZbStartupWait (blocking) here instead of ZbStartup, in order to demonstrate how to do
+ * a blocking call on the M4. */
+ status = ZbStartupWait(zigbee_app_info.zb, &config);
+
+ APP_DBG("ZbStartup Callback (status = 0x%02x)", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ zigbee_app_info.join_delay = 0U;
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ APP_DBG("Startup failed, attempting again after a short delay (%d ms)", APP_ZIGBEE_STARTUP_FAIL_DELAY);
+ zigbee_app_info.join_delay = HAL_GetTick() + APP_ZIGBEE_STARTUP_FAIL_DELAY;
+ }
+ }
+
+ /* If Network forming/joining was not successful reschedule the current task to retry the process */
+ if (zigbee_app_info.join_status != ZB_STATUS_SUCCESS)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+
+ /* Since we're using group addressing (broadcast), shorten the broadcast timeout */
+ uint32_t bcast_timeout = 3;
+ ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
+
+ /* Starting application init task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_START, CFG_SCH_PRIO_0);
+ }
+} /* APP_ZIGBEE_NwkForm */
+
+/*************************************************************
+ * ZbStartupWait Blocking Call
+ *************************************************************/
+struct ZbStartupWaitInfo {
+ bool active;
+ enum ZbStatusCodeT status;
+};
+
+static void ZbStartupWaitCb(enum ZbStatusCodeT status, void *cb_arg)
+{
+ struct ZbStartupWaitInfo *info = cb_arg;
+
+ info->status = status;
+ info->active = false;
+ UTIL_SEQ_SetEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+} /* ZbStartupWaitCb */
+
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config)
+{
+ struct ZbStartupWaitInfo *info;
+ enum ZbStatusCodeT status;
+
+ info = malloc(sizeof(struct ZbStartupWaitInfo));
+ if (info == NULL) {
+ return ZB_STATUS_ALLOC_FAIL;
+ }
+ memset(info, 0, sizeof(struct ZbStartupWaitInfo));
+
+ info->active = true;
+ status = ZbStartup(zb, config, ZbStartupWaitCb, info);
+ if (status != ZB_STATUS_SUCCESS) {
+ info->active = false;
+ return status;
+ }
+ UTIL_SEQ_WaitEvt(EVENT_ZIGBEE_STARTUP_ENDED);
+ status = info->status;
+ free(info);
+ return status;
+} /* ZbStartupWait */
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch (ErrId) {
+ default:
+ APP_ZIGBEE_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+} /* APP_ZIGBEE_Error */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param pMess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (Zigbee or other module if any)
+ * @retval None
+ */
+static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ while (1U == 1U) {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+} /* APP_ZIGBEE_TraceError */
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Zigbee
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t *p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) {
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
+
+
+/**
+ * @brief Button 1 callback
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_APP_POLL_CONTROL_SHOW_ATTR, CFG_SCH_PRIO_0);
+} /* APP_ZIGBEE_SW1_Process */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer)
+{
+ p_ZIGBEE_otcmdbuffer = p_buffer;
+} /* APP_ZIGBEE_RegisterCmdBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+} /* ZIGBEE_Get_OTCmdPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)((TL_EvtPacket_t *)p_ZIGBEE_otcmdbuffer)->evtserial.evt.payload;
+} /* ZIGBEE_Get_OTCmdRspPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_NotificationPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_notif_M0_to_M4)->evtserial.evt.payload;
+} /* ZIGBEE_Get_NotificationPayloadBuffer */
+
+Zigbee_Cmd_Request_t * ZIGBEE_Get_M0RequestPayloadBuffer(void)
+{
+ return (Zigbee_Cmd_Request_t *)(p_ZIGBEE_request_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the commands from the M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void ZIGBEE_CmdTransfer(void)
+{
+ Zigbee_Cmd_Request_t *cmd_req = (Zigbee_Cmd_Request_t *)p_ZIGBEE_otcmdbuffer->cmdserial.cmd.payload;
+
+ /* Zigbee OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ p_ZIGBEE_otcmdbuffer->cmdserial.cmd.plen = 8U + (cmd_req->Size * 4U);
+
+ TL_ZIGBEE_SendM4RequestToM0();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+} /* ZIGBEE_CmdTransfer */
+
+/**
+ * @brief This function is called when the M0+ acknoledge the fact that it has received a Cmd
+ *
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_CmdEvtReceived(TL_EvtPacket_t *Otbuffer)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+} /* TL_ZIGBEE_CmdEvtReceived */
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_NotReceived(TL_EvtPacket_t *Notbuffer)
+{
+ p_ZIGBEE_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+} /* TL_ZIGBEE_NotReceived */
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_ZigbeeCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+} /* Pre_ZigbeeCmdProcessing */
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Wait_Getting_Ack_From_M0 */
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+} /* Receive_Ack_From_M0 */
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveNotifyFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_NOTIFY_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief This function is called when a request from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_ZIGBEE_M0RequestReceived(TL_EvtPacket_t *Reqbuffer)
+{
+ p_ZIGBEE_request_M0_to_M4 = Reqbuffer;
+
+ CptReceiveRequestFromM0++;
+ UTIL_SEQ_SetTask(1U << (uint32_t)CFG_TASK_REQUEST_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+}
+
+/**
+ * @brief Perform initialization of TL for Zigbee.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_TL_INIT(void)
+{
+ ZigbeeConfigBuffer.p_ZigbeeOtCmdRspBuffer = (uint8_t *)&ZigbeeOtCmdBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotAckBuffer = (uint8_t *)ZigbeeNotifRspEvtBuffer;
+ ZigbeeConfigBuffer.p_ZigbeeNotifRequestBuffer = (uint8_t *)ZigbeeNotifRequestBuffer;
+ TL_ZIGBEE_Init(&ZigbeeConfigBuffer);
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void)
+{
+ if (CptReceiveNotifyFromM0 != 0) {
+ /* If CptReceiveNotifyFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveNotifyFromM0 > 1U) {
+ APP_ZIGBEE_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else {
+ Zigbee_CallBackProcessing();
+ }
+ /* Reset counter */
+ CptReceiveNotifyFromM0 = 0;
+ }
+}
+
+/**
+ * @brief Process the requests coming from the M0.
+ * @param
+ * @return
+ */
+void APP_ZIGBEE_ProcessRequestM0ToM4(void)
+{
+ if (CptReceiveRequestFromM0 != 0) {
+ Zigbee_M0RequestProcessing();
+ CptReceiveRequestFromM0 = 0;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..79d9b1eae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,62 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_zigbee.h
+ * Description : Header for Zigbee Application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ZIGBEE_H
+#define APP_ZIGBEE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+#include "tl.h"
+#include "tl_zigbee_hci.h"
+
+/* Exported types ------------------------------------------------------------*/
+
+/*
+ * List of all errors tracked by the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum {
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+ ERR_ZIGBEE_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_ZIGBEE_Init(void);
+void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_ZIGBEE_RegisterCmdBuffer(TL_CmdPacket_t *p_buffer);
+void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
+void APP_ZIGBEE_ProcessRequestM0ToM4(void);
+void APP_ZIGBEE_TL_INIT(void);
+void Pre_ZigbeeCmdProcessing(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ZIGBEE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..f0038ab55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,513 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/readme.txt
new file mode 100644
index 000000000..d1bc52a89
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/readme.txt
@@ -0,0 +1,161 @@
+/**
+ @page Zigbee_PollControl_Server_SED application
+
+ @verbatim
+ ******************************************************************************
+ * @file Zigbee/Zigbee_PollControl_Server_SED/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Zigbee Poll Control Cluster application as a server
+ * using a centralized network.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to use Poll Control cluster as a server on a centralized Zigbee network.
+
+The purpose of this application is to show how to create a Zigbee centralized network, and
+how to communicate from one node to another one using the Poll Control cluster. Once the Zigbee mesh
+network is created, the user can start the demo scenario on the client through push button SW1.
+
+For this application it is requested to have:
+
+- 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
+ - application : Zigbee_PollControl_Client_Coord
+
+- 1 or more STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Zigbee_RFD_fw.bin
+ - application : Zigbee_PollControl_Server_SED
+
+
+Demo use case :
+
+This demo shows how to use Poll Control for remotely operating on a Sleepy End Device (SED).
+
+The Poll Control server, on the SED, sends periodically Checkin requests to the Poll Control client
+to know its polling policy (Long or Fast Poll) until the next Checkin request.
+The client can respond to Checkin requests with:
+- Fast Poll field set to false => the server will continue Long Polling (default behavior).
+- Fast Poll field set to true => the server is going to enter in Fast Polling mode
+ (during the specified Fast Poll timeout).
+
+During this Fast Polling period, the SED is not sleeping and remote operation are possible.
+So, during this period of time, the client remotely writes Poll Control server attributes.
+
+The client will respond to the next server Checkin request with a Fast Poll response when push
+button SW1 is pressed (client side}.
+The current Poll Control configuration of the server can be shown by pressing button SW1 (server side).
+It can be used to validate the client remote operation during the server Fast Polling period.
+
+
+ Device 1 Device 2
+
+ +--------+ +--------+
+ | | | |
+ | Client | -->| Server |
+ | | ZbZclAttrIntegerWrite(ZCL_POLL_CHECK_IN_INTERVAL) | | |
+ | | ---| |
+ | | | |
+ | | /* Default Long Poll mode */ | |
+ | | | |
+ | | /* Checkin request */ | |
+ | | <----------------------------------------------------------------------------- | |
+ | | /* Checkin response (Fast Poll false) => Long Poll */ | |
+ | | -----------------------------------------------------------------------------> | |
+ | | | |
+ | | | |
+ | | /* Fast Poll mode */ | |
+ | | | |
+ | | <-- | |
+ PushB SW1=>| | | zcl_poll_client_set_checkin_rsp(ZCL_PWR_PROF_STATE_PROFILE_IDLE) | |
+ | | --- | |
+ | | | |
+ | | /* Checkin request */ | |
+ | | <----------------------------------------------------------------------------- | |
+ | | /* Checkin response (Fast Poll true) => Short Poll */ | |=> GREEN LED ON
+ | | -----------------------------------------------------------------------------> | | (during fast poll timeout)
+ | | | |
+ | | | |
+ | | -->| |
+ | | /* Show local Poll Control server attributes */ | | |<=PushB SW1
+ | | ---| |
+ | | | |
+ +--------+ +--------+
+
+To setup the application :
+
+ a) Open the project, build it and load your generated application on your STM32WB devices.
+
+ To run the application :
+
+ a) Start the first board. It must be the coordinator of the Zigbee network so in this demo application it is
+ the device running Zigbee_MeterId_Server_Coord application (Device2 in the above diagram).
+ Wait for the Blue LED (LED1) ON.
+ Start the second board. This board is configured as Zigbee SED and will attached to the network created
+ by the coordinator. Do the same for the other boards if applicable.
+
+ b) At this stage, the Zigbee network is automatically created and BLUE LED (LED1) is ON on all devices.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG_Nucleo
+ board and can be easily tailored to any other supported device
+ and development board.
+
+ - On STM32WB55RG_Nucleo, the jumpers must be configured as described
+ in this section. Starting from the top left position up to the bottom
+ right position, the jumpers on the Board must be set as follows:
+
+ CN11: GND [OFF]
+ JP4: VDDRF [ON]
+ JP6: VC0 [ON]
+ JP2: +3V3 [ON]
+ JP1: USB_STL [ON] All others [OFF]
+ CN12: GND [OFF]
+ CN7: <All> [OFF]
+ JP3: VDD_MCU [ON]
+ JP5: GND [OFF] All others [ON]
+ CN10: <All> [OFF]
+
+
+@par How to use it ?
+
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.bin binary
+
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.bin binary flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+ All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+ Wireless Coprocessor binary.
+
+=> Getting traces
+ To get the traces you need to connect your Board to the Hyperterminal (through the STLink Virtual COM Port).
+ The UART must be configured as follows:
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+=> Running the application
+
+ Refer to the Application description at the beginning of this readme.txt
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Src/app_entry.c
index 1bc581289..8fd8a42d4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/App/app_zigbee.c
index 2c37a1d40..4d18294a6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/App/app_zigbee.c
@@ -38,6 +38,9 @@
#define SW1_ENDPOINT 17
#define CHANNEL 19
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -439,8 +442,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c
index 38614c4d5..fab440cd8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c
index dffefc00d..1a1c28291 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c
@@ -46,6 +46,9 @@
#define ENERGY_REMOTE 0 /* False */
#define SCHEDULE_MODE ZCL_PWR_PROF_SCHED_MODE_CHEAPEST
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -702,8 +705,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Src/app_entry.c
index 38614c4d5..fab440cd8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/App/app_zigbee.c
index 18287f5fa..b94af80c4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -43,6 +43,9 @@
#define ZCL_MAX_REPORT 0x000A
#define ZCL_REPORT_CHANGE 0x03E8 /* 100kPa */
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -431,8 +434,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Src/app_entry.c
index 34117d963..2e8aa9fbc 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/App/app_zigbee.c
index 21d78235b..14afaf4fe 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -47,7 +47,8 @@
#define ZCL_PRESSURE_LIMIT (int16_t)10140 /*101,4 MPa*10*/
#define ZCL_PRESSURE_RESOL 1000U /* 100kPa *10 */
-
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
@@ -394,8 +395,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Src/app_entry.c
index 1bc581289..8fd8a42d4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/App/app_zigbee.c
index 215ae58b1..8867249b3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/App/app_zigbee.c
@@ -39,6 +39,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 15
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -376,8 +379,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Src/app_entry.c
index e09f5154c..f770c4f97 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Src/app_entry.c
@@ -258,12 +258,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/App/app_zigbee.c
index da131bb85..92d0ee115 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/App/app_zigbee.c
@@ -39,6 +39,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 15
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -427,8 +430,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html b/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html
index ffcd04d80..595d9576d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html
@@ -41,16 +41,67 @@
<ul>
<li>Projects\NUCLEO-WB55.Nucleo\Applications\BLE</li>
<li>Projects\NUCLEO-WB55.Nucleo\Applications\BLE_Thread</li>
+<li>Projects\NUCLEO-WB55.Nucleo\Applications\BLE_Zigbee</li>
<li>Projects\NUCLEO-WB55.Nucleo\Applications\Mac_802_15_4</li>
<li>Projects\NUCLEO-WB55.Nucleo\Applications\Thread</li>
+<li>Projects\NUCLEO-WB55.Nucleo\Applications\Zigbee</li>
</ul>
</div>
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section6" checked aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<input type="checkbox" id="collapse-section7" checked aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.6.0 / 26-March-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<h3 id="ble">BLE</h3>
+<ul>
+<li><strong>Add BLE Mesh split of BLE_MeshLightingDemo project in</strong>:
+<ul>
+<li>BLE_MeshLightingLPN (Low Power Node),</li>
+<li>BLE_MeshLightingPRFNode (Proxy Relay Friend Node),</li>
+<li>BLE_MeshLightingProvisioner (Embedded Provisioner in Dynamic Mode)</li>
+</ul></li>
+<li><strong>Add BLE_RfWithFlash project</strong>
+<ul>
+<li>demonstrates the capability to erase/write the flash while a Point-to-Point communication using BLE component is active</li>
+</ul></li>
+<li><strong>Add BLE_HeartRate_ANCS and BLE_HeartRateFreeRTOS_ANCS projects (based on Sequencer &amp; FreeRTOS)</strong>
+<ul>
+<li>Demonstrate the Apple Notification Center Service to access many kinds of notifications that are generated on iOS devices</li>
+<li>Combined with Heart rate server Application</li>
+</ul></li>
+</ul>
+<h3 id="thread">Thread</h3>
+<ul>
+<li><strong>Add new application demonstrating usage of UDP packet exchange</strong>
+<ul>
+<li>Thread_Udp</li>
+</ul></li>
+</ul>
+<h3 id="zigbee">Zigbee</h3>
+<ul>
+<li><strong>Add new Zigbee applications highlighting the usage of the following clusters : Commissioning, Diagnostic, IAS_WD and Poll control</strong>
+<ul>
+<li>Those applications are provided under Applications\Zigbee:
+<ul>
+<li>Zigbee_Commissioning_Client_Coord</li>
+<li>Zigbee_Commissioning_Server_Router</li>
+<li>Zigbee_Diagnostic_Client_Router</li>
+<li>Zigbee_Diagnostic_Server_Coord</li>
+<li>Zigbee_IAS_WD_Client_Router</li>
+<li>Zigbee_IAS_WD_Server_Coord</li>
+<li>Zigbee_PollControl_Client_Coord</li>
+<li>Zigbee_PollControl_Server_SED</li>
+</ul></li>
+<li>Those application requires the usage of the <strong>stm32wb5x_Zigbee_FFD_Full_fw.bin</strong></li>
+</ul></li>
+</ul>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<h3 id="add-blezigbee-static-concurrent-mode-support-and-additionnal-zigbee-applications">Add BLE/Zigbee static concurrent mode support and additionnal zigbee applications</h3>
<ul>
<li><strong>Add BLE/Zigbee static concurrent mode support</strong>
@@ -85,7 +136,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.4.0 / 06-December-2019</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<h3 id="maintenance">Maintenance</h3>
<ul>
<li>Add SW4STM32 and MDK-ARM IDE files for:
@@ -99,7 +150,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.3.0 / 11-September-2019</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<h3 id="introduction-of-zigbee-support">Introduction of ZIGBEE support</h3>
<ul>
<li>Ensure compatibility with <strong>STM32CubeMX V5.4</strong>.</li>
@@ -129,7 +180,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.2.0 / 26-June-2019</label>
<div>
-<h2 id="main-changes-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<h3 id="addition-of-new-application">Addition of new application</h3>
<p><strong>Add CKS (Customer Key Storage) application</strong></p>
<ul>
@@ -144,7 +195,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.1.0 / 05-April-2019</label>
<div>
-<h2 id="main-changes-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<h3 id="remove-binaries-addition-of-new-examples">Remove binaries, Addition of new examples</h3>
<p>Change directory name to reflect board RPN: <a href="https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/stm32-nucleo-expansion-boards/p-nucleo-wb55.html">P-NUCLEO-WB55</a></p>
<p>Add QSPI examples:</p>
@@ -167,7 +218,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.0.0 / 06-February-2019</label>
<div>
-<h2 id="main-changes-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<h3 id="first-release">First release</h3>
<p>First official release.</p>
</div>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_lpm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_lpm.c
deleted file mode 100644
index c6be4053b..000000000
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/hw_lpm.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
-******************************************************************************
-* @file hw_lpm.c
-* @author MCD Application Team
-* @brief hw to low power manager
-******************************************************************************
-* @attention
-*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
-* All rights reserved.</center></h2>
-*
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
-*
-******************************************************************************
-*/
-
-
-/* Includes ------------------------------------------------------------------*/
-#include "app_common.h"
-#include "hw_conf.h"
-
-/* Private const -----------------------------------------------------------*/
-const uint32_t HW_LPM_STOP_MODE[3] = {LL_PWR_MODE_STOP0, LL_PWR_MODE_STOP1, LL_PWR_MODE_STOP2};
-const uint32_t HW_LPM_OFF_MODE[2] = {LL_PWR_MODE_STANDBY, LL_PWR_MODE_SHUTDOWN};
-
-void HW_LPM_SleepMode(void)
-{
- LL_LPM_EnableSleep(); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
-
- /**
- * This option is used to ensure that store operations are completed
- */
-#if defined ( __CC_ARM)
- __force_stores();
-#endif
-
- __WFI();
-
- return;
-}
-
-void HW_LPM_StopMode(HW_LPM_StopModeConf_t configuration)
-{
- LL_PWR_SetPowerMode(HW_LPM_STOP_MODE[configuration]);
-
- LL_LPM_EnableDeepSleep(); /**< Set SLEEPDEEP bit of Cortex System Control Register */
-
- /**
- * This option is used to ensure that store operations are completed
- */
-#if defined ( __CC_ARM)
- __force_stores();
-#endif
-
- __WFI();
-
- return;
-}
-
-void HW_LPM_OffMode(HW_LPM_OffModeConf_t configuration)
-{
- /*
- * There is no risk to clear all the WUF here because in the current implementation, this API is called
- * in critical section. If an interrupt occurs while in that critical section before that point,
- * the flag is set and will be cleared here but the system will not enter Off Mode
- * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
- * of this critical section
- */
- LL_PWR_ClearFlag_WU();
-
- LL_PWR_SetPowerMode(HW_LPM_OFF_MODE[configuration]);
-
- LL_LPM_EnableDeepSleep(); /**< Set SLEEPDEEP bit of Cortex System Control Register */
-
- /**
- * This option is used to ensure that store operations are completed
- */
-#if defined ( __CC_ARM)
- __force_stores();
-#endif
-
- __WFI();
-
- return;
-}
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h
deleted file mode 100644
index 96479cedc..000000000
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
-******************************************************************************
-* @file appli_nvm.h
-* @author BLE Mesh Team
-* @version V1.11.000
-* @date 25-07-2019
-* @brief Header file for the user application file
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-*
-* 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 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 STMicroelectronics nor the names of its contributors
-* may be used to endorse or promote products derived from this software
-* without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
-*
-* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
-* (MoBLE) technology. The present solution is developed and maintained for both
-* Mesh library and Applications solely by STMicroelectronics.
-*
-******************************************************************************
-*/
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __APPLI_NVM_H
-#define __APPLI_NVM_H
-
-/* Includes ------------------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported variables ------------------------------------------------------- */
-#define APP_NVM_BASE ((unsigned int)appNvmBase)
-#define APP_NVM_SIZE 4096U
-#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
-#define PRVN_NVM_PAGE_SIZE 4096U
-
-/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
-MOBLE_RESULT AppliNvm_FactorySettingReset(void);
-//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
-MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
-void AppliNvm_Process(void);
-void AppliNvm_SaveMessageParam (void);
-MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 SubPageSize,
- MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset);
-MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
-MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data, uint8_t size);
-MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
-void AppliPrvnNvm_Process(void);
-
-MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
-
-MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
-void AppliNvm_saveProvisionerDevKey(MOBLEUINT8 *data , MOBLEUINT8 size
- , MOBLEUINT8 *prvnFlag);
-#endif /* __APPLI_NVM_H */
-
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
-
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/readme.txt
deleted file mode 100644
index 89608aa4f..000000000
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/readme.txt
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- @page BLE_MeshLightingDemo example
-
- @verbatim
- ******************** (C) COPYRIGHT 2019 STMicroelectronics *******************
- * @file BLE/BLE_MeshLightingDemo/readme.txt
- * @author MCD Application Team
- * @brief Description of the BLE Mesh Lighting demo example.
- ******************************************************************************
- *
- * Copyright (c) 2019 STMicroelectronics. All rights reserved.
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- @endverbatim
-
-@par Example Description
-This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
-
-@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
- based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
- a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
- than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
- To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
-
-@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
- to have correct HAL operation.
-
-@par Directory contents
- mesh_lighting_demo
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_common.h Header for all modules with common definition
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h Parameters configuration file of the application
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_debug.h Interface to support debug in the application
- - BLE/BLE_MeshLightingDemo/Core/Inc/app_entry.h Parameters configuration file of the application
- - BLE/BLE_MeshLightingDemo/Core/Inc/hw_conf.h Configuration file of the HW
- - BLE/BLE_MeshLightingDemo/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
- - BLE/BLE_MeshLightingDemo/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
- - BLE/BLE_MeshLightingDemo/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
- - BLE/BLE_MeshLightingDemo/Core/Inc/main.h Header for main.c module
- - BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
- - BLE/BLE_MeshLightingDemo/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
- - BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
- - BLE/BLE_MeshLightingDemo/Core/Inc/utilities_conf.h Configuration file of the utilities
- - BLE/BLE_MeshLightingDemo/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
- - BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c Interface to support debug in the application
- - BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c Initialization of the application
- - BLE/BLE_MeshLightingDemo/Core/Src/hw_flash.c FLASH driver needed by EE module
- - BLE/BLE_MeshLightingDemo/Core/Src/hw_timerserver.c Timer Server based on RTC
- - BLE/BLE_MeshLightingDemo/Core/Src/hw_uart.c UART Driver
- - BLE/BLE_MeshLightingDemo/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
- - BLE/BLE_MeshLightingDemo/Core/Src/main.c Main program
- - BLE/BLE_MeshLightingDemo/Core/Src/stm32_lpm_if.c Low Power Manager Interface
- - BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c Interrupt handlers
- - BLE/BLE_MeshLightingDemo/Core/Src/system_stm32wbxx.c stm32wbxx system source file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/app_ble.c BLE Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_config_client.c Application interface for Config CLient Mesh Model
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_config_client.h Header of Application interface for Config CLient Mesh Model
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic_client.c Application interface for Client Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_generic_client.h Header of Application interface for Client Generic Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_client.c Application interface for Client Light Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_client.h Header of Application interface for Client Light Mesh Models
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/ble_conf.h BLE Services configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/hal_common.h Header for common function of HAL file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/tl_if.c Transport Layer interface
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/user_if.h Header file for User interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/user_if.c User interface file
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
- - BLE/BLE_MeshLightingDemo/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
-
-
-@par Hardware and Software environment
-
- - This example runs on STM32WB55xx devices.
-
- - This example has been tested with an STMicroelectronics USB DONGLE board (MB1293C)
- and can be easily tailored to any other supported device and development board.
-
-@par How to use it ?
-
-This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
-If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
-All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
-Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
-Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
-Wireless Coprocessor binary.
-
-In order to make the program work, you must do the following:
- - Open your preferred toolchain
- - Rebuild all files and load your image into target memory
- - Run the example
-
-For more details refer to the Application Note:
- AN5292_STM32WB_How_to_build_BLE_Mesh_Application
-
-* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
- */
- \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
new file mode 100644
index 000000000..9dbfbba05
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
@@ -0,0 +1,118 @@
+/**
+ ******************************************************************************
+ * @file app_common.h
+ * @author MCD Application Team
+ * @brief Common
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_COMMON_H
+#define __APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+
+#define PAUSE( t ) M_BEGIN \
+ volatile int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
index 3972d3d4f..a9ed87c7d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
@@ -115,7 +115,7 @@
#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI15_10_IRQHandler
#define POWEROFF_EXTI_IRQHandler EXTI2_IRQHandler
-
+
#define CFG_MAX_CONNECTION 1
#define RADIO_ACTIVITY_EVENT 1
@@ -278,8 +278,8 @@
/**
* Select UART interfaces
*/
-#define CFG_DEBUG_TRACE_UART hw_uart1
-#define CFG_CONSOLE_MENU hw_lpuart1
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU hw_lpuart1
/******************************************************************************
* USB interface
@@ -297,7 +297,7 @@
* When set to 1, the low power mode is enable
* When set to 0, the device stays in RUN mode
*/
-#define CFG_LPM_SUPPORTED 0
+#define CFG_LPM_SUPPORTED 1
/******************************************************************************
* Timer Server
@@ -435,7 +435,7 @@ typedef enum
* When both are set to 0, no trace are output
* When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
*/
-#define CFG_DEBUG_TRACE_LIGHT 0
+#define CFG_DEBUG_TRACE_LIGHT 1
#define CFG_DEBUG_TRACE_FULL 0
#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h
new file mode 100644
index 000000000..13485c16b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h
@@ -0,0 +1,45 @@
+
+/**
+ ******************************************************************************
+ * @file app_debug.h
+ * @author MCD Application Team
+ * @brief Interface to support debug in the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_DEBUG_H
+#define __APP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPD_Init( void );
+ void APPD_EnableCPU2( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_DEBUG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h
new file mode 100644
index 000000000..5d85cd90c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h
@@ -0,0 +1,44 @@
+
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief Interface to the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_ENTRY_H
+#define __APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..1e2d7a616
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/**
+ ******************************************************************************
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_CONF_H
+#define __HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+/**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+#define CFG_HW_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOA
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_6
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_Channel4
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_Channel4_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_Channel4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
+
+#endif /*__HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h
new file mode 100644
index 000000000..18c088d3e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h
@@ -0,0 +1,87 @@
+/**
+******************************************************************************
+* @file hw_flash.h
+* @brief Header for hw_flash.c module
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_FLASH_H
+#define __HW_FLASH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Write 64 bits double word in FLASH
+ *
+ * @param FLASH destination address
+ * @param 64 bits double word data
+ * @retval result
+ */
+MOBLE_RESULT HW_FLASH_Write(uint32_t address, uint64_t data);
+
+/**
+ * @brief Erase FLASH page
+ *
+ * @param address of FLASH page
+ * @param number of page
+ * @param interrupt not used
+ * @retval result
+ */
+MOBLE_RESULT HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt);
+
+#if 0
+/**
+ * @brief Get Option Byte IPCC buffer address
+ *
+ * @param None
+ * @retval Option Byte IPCC buffer address
+ */
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void);
+
+/**
+ * @brief Get Option Byte SFSA
+ *
+ * @param None
+ * @retval Option Byte SFSA
+ */
+uint32_t HW_FLASH_OB_GetSFSA(void);
+
+/**
+ * @brief Get Option Byte SBSRA
+ *
+ * @param None
+ * @retval Option Byte SBSRA
+ */
+uint32_t HW_FLASH_OB_GetSBRSA(void);
+
+/**
+ * @brief Get Option Byte SNBRSA
+ *
+ * @param None
+ * @retval Option Byte SNBRSA
+ */
+uint32_t HW_FLASH_OB_GetSNBRSA(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__HW_FLASH_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h
new file mode 100644
index 000000000..41f226faf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h
@@ -0,0 +1,60 @@
+/**
+******************************************************************************
+* @file lp_timer.h
+* @brief Header for lp_timer.c module
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __LP_TIMER_H
+#define __LP_TIMER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+ /**
+ * @brief Initialize the low power timer
+ *
+ * @param None
+ * @retval None
+ */
+ void LpTimerInit(void);
+
+ /**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : in ms
+ * @retval None
+ */
+ void LpTimerStart(uint32_t time_to_sleep);
+
+ /**
+ * @brief Read how long the timer has run
+ *
+ * @param None
+ * @retval The time elapsed in ms
+ */
+ uint32_t LpGetElapsedTime(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__LP_TIMER_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
new file mode 100644
index 000000000..3de57ae3e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
@@ -0,0 +1,38 @@
+/**
+ ******************************************************************************
+ * @file main.h
+ * @author MCD Application Team
+ * @brief Header for main.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported variables --------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..0270583e8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,350 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/* #define HAL_ADC_MODULE_ENABLED */
+#define HAL_COMP_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_CRC_MODULE_ENABLED
+#define HAL_CRYP_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_IPCC_MODULE_ENABLED
+#define HAL_IRDA_MODULE_ENABLED
+#define HAL_IWDG_MODULE_ENABLED
+#define HAL_LCD_MODULE_ENABLED
+#define HAL_LPTIM_MODULE_ENABLED
+#define HAL_PCD_MODULE_ENABLED
+#define HAL_PKA_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_QSPI_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_RNG_MODULE_ENABLED
+#define HAL_RTC_MODULE_ENABLED
+#define HAL_SAI_MODULE_ENABLED
+#define HAL_SMARTCARD_MODULE_ENABLED
+#define HAL_SMBUS_MODULE_ENABLED
+/* #define HAL_SPI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+#define HAL_TSC_MODULE_ENABLED
+#define HAL_UART_MODULE_ENABLED
+#define HAL_USART_MODULE_ENABLED
+#define HAL_WWDG_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE ((uint32_t)32000000) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)48000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)(1<<__NVIC_PRIO_BITS) - 1) /*!< tick interrupt priority (lowest by default) */
+#define USE_RTOS 0
+#define PREFETCH_ENABLE 0
+#define INSTRUCTION_CACHE_ENABLE 1
+#define DATA_CACHE_ENABLE 1
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1 */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 1U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(char* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h
index 5bebf1ba6..5bebf1ba6 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..4b9e79dde
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h
@@ -0,0 +1,53 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA_ID)
+#define VCP_TASK_PRIO (CFG_SEQ_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c
index 083cbcd94..083cbcd94 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_debug.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
index 9e48e5ce2..ebedfe370 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
@@ -39,7 +39,7 @@
#include "pal_nvm.h"
#include "lp_timer.h"
#include "mesh_cfg.h"
-
+
/* Private includes -----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
@@ -58,7 +58,7 @@ extern const void *appNvmBase;
extern const void *prvsnr_data;
#if (LOW_POWER_FEATURE == 1)
extern __IO uint32_t uwTick;
-extern HAL_TickFreqTypeDef uwTickFreq;
+extern HAL_TickFreqTypeDef uwTickFreq;
#if ( CFG_LPM_SUPPORTED == 1)
static uint32_t BleMesh_sleepTime;
#endif
@@ -87,9 +87,10 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
-//#if(CFG_DEBUG_TRACE != 0)
-//static uint8_t VcpTxBuffer[MAX_DBG_TRACE_MSG_SIZE]; /* Transmit buffer over USB */
-//#endif
+#if(CFG_DEBUG_TRACE != 0)
+static uint8_t VcpTxBuffer[MAX_DBG_TRACE_MSG_SIZE]; /* Transmit buffer over USB */
+#endif
+
/* USER CODE BEGIN PV */
/* USER CODE END PV */
@@ -372,8 +373,8 @@ void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW1_REQ_ID, CFG_SCH_PRIO_0);
}
break;
-
- default:
+
+ default:
break;
}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c
new file mode 100644
index 000000000..882181c8c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c
@@ -0,0 +1,152 @@
+/*****************************************************************************
+ * @file hw_flash.c
+ * @author MCD Application Team
+ * @brief This file contains the FLASH driver needed by EE module
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+#include "common.h"
+#include "stm32_seq.h"
+//#include "dbg_gpio.h"
+#include "hw_flash.h"
+#include "stm32wbxx_hal.h"
+
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);
+static void HW_FLASH_PageErase(uint32_t Page);
+//static void HW_FLASH_WaitEndOfOperation(void);
+
+/*****************************************************************************/
+
+MOBLE_RESULT HW_FLASH_Write(uint32_t address, uint64_t data)
+{
+ /* Enable EOP interrupt */
+ // __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ // __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_Program_DoubleWord(address, data);
+
+ // HW_FLASH_WaitEndOfOperation();
+
+ /* Disable EOP interrupt */
+// __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the PG bit once data has been written */
+ CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
+
+ return (MOBLE_RESULT_SUCCESS);
+}
+
+/*****************************************************************************/
+
+MOBLE_RESULT HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt)
+{
+ UNUSED(interrupt);
+
+ uint32_t loop;
+
+ /* Enable EOP interrupt */
+ __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ for( loop = 0; loop < n ; loop++)
+ {
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_PageErase(page+loop);
+
+// HW_FLASH_WaitEndOfOperation();
+ }
+
+ /* Disable EOP interrupt */
+ __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the page erase bit */
+ CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
+
+ return (MOBLE_RESULT_SUCCESS);
+}
+
+#if 0
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void)
+{
+ return READ_BIT(FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSFSA(void)
+{
+ return (READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SBRSA) >> FLASH_SRRVR_SBRSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSNBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SNBRSA) >> FLASH_SRRVR_SNBRSA_Pos);
+}
+#endif
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * This is a copy of FLASH_Program_DoubleWord() from the HAL
+ */
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_WRITE);
+
+ /* Set PG bit */
+ SET_BIT(FLASH->CR, FLASH_CR_PG);
+
+ /* Program first word */
+ *(uint32_t *)Address = (uint32_t)Data;
+
+ /* Barrier to ensure programming is performed in 2 steps, in right order
+ (independently of compiler optimization behavior) */
+ __ISB();
+
+ /* Program second word */
+ *(uint32_t *)(Address + 4U) = (uint32_t)(Data >> 32U);
+
+// DBG_GPIO_Gr2Reset(DBG_GPIO_GR2_FLASH_WRITE);
+}
+
+/**
+ * This is a copy of LASH_PageErase() from the HAL
+ */
+static void HW_FLASH_PageErase(uint32_t Page)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+
+ /* Proceed to erase the page */
+ MODIFY_REG(FLASH->CR, FLASH_CR_PNB, ((Page << FLASH_CR_PNB_Pos) | FLASH_CR_PER | FLASH_CR_STRT));
+
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c
new file mode 100644
index 000000000..cb97bd718
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c
@@ -0,0 +1,471 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ (__HANDLE__).Init.BaudRate = CFG_HW_##__USART_BASE__##_BAUDRATE; \
+ (__HANDLE__).Init.WordLength = CFG_HW_##__USART_BASE__##_WORDLENGTH; \
+ (__HANDLE__).Init.StopBits = CFG_HW_##__USART_BASE__##_STOPBITS; \
+ (__HANDLE__).Init.Parity = CFG_HW_##__USART_BASE__##_PARITY; \
+ (__HANDLE__).Init.HwFlowCtl = CFG_HW_##__USART_BASE__##_HWFLOWCTL; \
+ (__HANDLE__).Init.Mode = CFG_HW_##__USART_BASE__##_MODE; \
+ (__HANDLE__).Init.OverSampling = CFG_HW_##__USART_BASE__##_OVERSAMPLING; \
+ (__HANDLE__).AdvancedInit.AdvFeatureInit = CFG_HW_##__USART_BASE__##_ADVFEATUREINIT; \
+ HAL_UART_Init(&(__HANDLE__)); \
+ } while(0)
+
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+#define HW_UART_MSP_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ \
+ /* Configure Tx Pin */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_TX_PIN ; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_TX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_TX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_TX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_TX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_TX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure Rx Pin */ \
+ CFG_HW_##__USART_BASE__##_RX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_RX_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_RX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_RX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_RX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_RX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_RX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure CTS Pin */ \
+ CFG_HW_##__USART_BASE__##_CTS_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_CTS_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_CTS_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_CTS_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_CTS_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_CTS_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_CTS_PORT, &GPIO_InitStruct); \
+ \
+ /* Set USART source clock */ \
+ __HAL_RCC_##__USART_BASE__##_CONFIG(CFG_HW_##__USART_BASE__##_SOURCE_CLOCK); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_CLK_ENABLE(); \
+ \
+ HAL_NVIC_SetPriority(__USART_BASE__##_IRQn, CFG_HW_##__USART_BASE__##_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(__USART_BASE__##_IRQn); \
+ } while(0)
+
+#define HW_UART_MSP_TX_DMA_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ /* Configure the DMA handler for Transmission process */ \
+ /* Enable DMA clock */ \
+ CFG_HW_##__USART_BASE__##_DMA_CLK_ENABLE(); \
+ /* Enable DMA MUX clock */ \
+ CFG_HW_##__USART_BASE__##_DMAMUX_CLK_ENABLE(); \
+ \
+ HW_hdma_##__HANDLE__##_tx.Instance = CFG_HW_##__USART_BASE__##_TX_DMA_CHANNEL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Request = CFG_HW_##__USART_BASE__##_TX_DMA_REQ; \
+ HW_hdma_##__HANDLE__##_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphInc = DMA_PINC_DISABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemInc = DMA_MINC_ENABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.Mode = DMA_NORMAL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Priority = DMA_PRIORITY_LOW; \
+ \
+ HAL_DMA_Init(&HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* Associate the initialized DMA handle to the UART handle */ \
+ __HAL_LINKDMA(huart, hdmatx, HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* NVIC configuration for DMA transfer complete interrupt */ \
+ HAL_NVIC_SetPriority(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn, CFG_HW_##__USART_BASE__##_DMA_TX_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_DMA_TX_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn); \
+ } while(0)
+
+/* Variables ------------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+ UART_HandleTypeDef huart1 = {0};
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+void (*HW_huart1RxCb)(void);
+void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ UART_HandleTypeDef hlpuart1 = {0};
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+void (*HW_hlpuart1RxCb)(void);
+void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Init(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_INIT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_INIT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_USART2_ENABLED == 1)
+ case hw_uart2:
+ HW_huart2TxCb = cb;
+ huart2.Instance = USART2;
+ hal_status = HAL_UART_Transmit_DMA(&huart2, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_USART2_DMA_TX_SUPPORTED == 1)
+ case hw_uart2:
+ HAL_DMA_IRQHandler(huart2.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_MspInit(UART_HandleTypeDef *huart)
+{
+#if ( (CFG_HW_USART1_ENABLED == 1) || (CFG_HW_LPUART1_ENABLED == 1) )
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+#endif
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ HW_UART_MSP_UART_INIT( huart1, USART1 );
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( huart1, USART1 );
+#endif
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ HW_UART_MSP_UART_INIT( hlpuart1, LPUART1 );
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( hlpuart1, LPUART1 );
+#endif
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c
new file mode 100644
index 000000000..404bb2e3b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c
@@ -0,0 +1,134 @@
+/**
+ ***************************************************************************************
+ * File Name : lp_timer.c
+ * Description : Low power timer to be used within Mesh Application.
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "lp_timer.h"
+
+/* Exported variables --------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void LpTimerCb(void);
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ uint32_t LpTimeLeftOnEntry;
+ uint8_t LpTimer_Id;
+} LpTimerContext_t;
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static LpTimerContext_t LpTimerContext;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Initialize the low power timer
+ *
+ * @param None
+ * @retval None
+ */
+void LpTimerInit(void)
+{
+ (void) HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(LpTimerContext.LpTimer_Id), hw_ts_SingleShot, LpTimerCb);
+
+ return;
+}
+
+/**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : in ms
+ * @retval None
+ */
+void LpTimerStart(uint32_t time_to_sleep)
+{
+ /* Converts the number of ms into hw timer tick */
+ if(time_to_sleep > 0x400000)
+ {
+ time_to_sleep = time_to_sleep / (CFG_TS_TICK_VAL);
+ time_to_sleep *= 1000;
+ }
+ else
+ {
+ time_to_sleep *= 1000;
+ time_to_sleep = time_to_sleep / (CFG_TS_TICK_VAL);
+ }
+
+ HW_TS_Start(LpTimerContext.LpTimer_Id, time_to_sleep);
+
+ /**
+ * There might be other timers already running in the timer server that may elapse
+ * before this one.
+ * Store how long before the next event so that on wakeup, it will be possible to calculate
+ * how long the tick has been suppressed
+ */
+ LpTimerContext.LpTimeLeftOnEntry = HW_TS_RTC_ReadLeftTicksToCount();
+
+ return;
+}
+
+/**
+ * @brief Read how long the timer has run
+ *
+ * @param None
+ * @retval The time elapsed in ms
+ */
+uint32_t LpGetElapsedTime(void)
+{
+ uint32_t return_value;
+
+ return_value = (CFG_TS_TICK_VAL) * (uint32_t)(LpTimerContext.LpTimeLeftOnEntry - HW_TS_RTC_ReadLeftTicksToCount());
+ return_value = return_value / 1000;
+
+ /**
+ * The system may have been out from another reason than the timer
+ * Stop the timer after the elapsed time is calculated other wise, HW_TS_RTC_ReadLeftTicksToCount()
+ * may return 0xFFFF ( TIMER LIST EMPTY )
+ * It does not hurt stopping a timer that exists but is not running.
+ */
+ HW_TS_Stop(LpTimerContext.LpTimer_Id);
+
+ return return_value;
+}
+
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Low power timer callback
+ *
+ * @param None
+ * @retval None
+ */
+static void LpTimerCb( void )
+{
+ /**
+ * Nothing to be done
+ */
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
new file mode 100644
index 000000000..95537ac98
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
@@ -0,0 +1,432 @@
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief BLE application with BLE core
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Stack_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "app_entry.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include "otp.h"
+#include "stm32wbxx_hal_rcc.h"
+
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application
+* @{
+*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Global variables ---------------------------------------------------------*/
+RTC_HandleTypeDef hrtc = { 0 }; /**< RTC handler declaration */
+TIM_HandleTypeDef htim1 = { 0 };
+TIM_HandleTypeDef htim2 = { 0 };
+
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void Reset_BackupDomain( void );
+static void Init_RTC( void );
+static void SystemClock_Config( void );
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Init_Exti( void );
+void Error_Handler(void);
+void PeriphClock_Config(void);
+static void Config_HSE(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+int main( void )
+{
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /**
+ * When the application is expected to run at higher speed, it should be better to set the correct system clock
+ * in system_stm32yyxx.c so that the initialization phase is running at max speed.
+ */
+ SystemClock_Config(); /**< Configure the system clock */
+
+ PeriphClock_Config();
+
+// HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_16);
+
+ Init_Exti( );
+
+ Init_RTC();
+
+ /* Enable CRC clock */
+ __HAL_RCC_CRC_CLK_ENABLE();
+
+ APPE_Init( );
+
+#if ( CFG_LPM_SUPPORTED == 1)
+// BSP_LED_On(LED_GREEN);
+#endif
+
+ while(1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_RTC( void )
+{
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+
+ __HAL_RCC_RTC_ENABLE(); /**< Enable RTC */
+
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+
+ return;
+}
+
+void PeriphClock_Config(void)
+{
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+ /**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+#if ( CFG_LPM_SUPPORTED == 1)
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
+#else
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+#endif
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+#if (CFG_USE_SMPS != 0)
+ /**
+ * Configure and enable SMPS
+ *
+ * The SMPS configuration is not yet supported by CubeMx
+ */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#endif
+ /* USER CODE END Smps */
+}
+
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c
index 02c02d26a..02c02d26a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..9e9b79832
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,343 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "app_common.h"
+#include "otp.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+/* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+ /**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /* FPU settings ------------------------------------------------------------*/
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+#endif
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ LL_RCC_HSE_Enable();
+
+ /**
+ * Set FLASH latency to 1WS
+ */
+ LL_FLASH_SetLatency( LL_FLASH_LATENCY_1 );
+ while( LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1 );
+
+ /**
+ * Switch to HSE
+ *
+ */
+ while(!LL_RCC_HSE_IsReady());
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSE );
+ while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+
+ /**
+ * Switch OFF MSI
+ */
+ LL_RCC_MSI_Disable();
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /*SystemCoreClock=HAL_RCC_GetSysClockFreq();*/
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd
new file mode 100644
index 000000000..2bfdd4943
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewd
@@ -0,0 +1,2834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_LPN</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB55CG.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB5xxG_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+ <configuration>
+ <name>Lighting_Provisioner</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB55CG.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB5xxG_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
index b2c62aa75..055df4ab8 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewp
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
@@ -2,7 +2,7 @@
<project>
<fileVersion>3</fileVersion>
<configuration>
- <name>Lighting_Node</name>
+ <name>Lighting_LPN</name>
<toolchain>
<name>ARM</name>
</toolchain>
@@ -16,15 +16,15 @@
<debug>0</debug>
<option>
<name>ExePath</name>
- <state>Lighting_Node\Exe</state>
+ <state>Lighting_LPN\Exe</state>
</option>
<option>
<name>ObjPath</name>
- <state>Lighting_Node\Obj</state>
+ <state>Lighting_LPN\Obj</state>
</option>
<option>
<name>ListPath</name>
- <state>Lighting_Node\List</state>
+ <state>Lighting_LPN\List</state>
</option>
<option>
<name>GEndianMode</name>
@@ -669,7 +669,7 @@
</option>
<option>
<name>OOCOutputFile</name>
- <state>BLE_MeshLightingNodeDemo.hex</state>
+ <state>BLE_MeshLightingLPN.hex</state>
</option>
<option>
<name>OOCCommandLineProducer</name>
@@ -724,7 +724,7 @@
</option>
<option>
<name>IlinkOutputFile</name>
- <state>BLE_MeshLightingNodeDemo.out</state>
+ <state>BLE_MeshLightingLPN.out</state>
</option>
<option>
<name>IlinkDebugInfoEnable</name>
@@ -837,7 +837,7 @@
<option>
<name>IlinkAdditionalLibs</name>
<state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_IAR.a</state>
- <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.1_CM4_IARv8.a</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_IARv8.a</state>
</option>
<option>
<name>IlinkOverrideProgramEntryLabel</name>
@@ -1100,30 +1100,12 @@
<name>$PROJ_DIR$\..\STM32_WPAN\app\app_ble.c</name>
</file>
<file>
- <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_config_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
- </file>
- <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic.c</name>
</file>
<file>
- <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
- </file>
- <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light.c</name>
</file>
<file>
- <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
- </file>
- <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_lc.c</name>
</file>
<file>
@@ -1276,30 +1258,12 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\common.c</name>
</file>
<file>
- <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\config_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
- </file>
- <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic.c</name>
</file>
<file>
- <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
- </file>
- <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light.c</name>
</file>
<file>
- <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_client.c</name>
- <excluded>
- <configuration>Lighting_Node</configuration>
- </excluded>
- </file>
- <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_lc.c</name>
</file>
<file>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/Project.eww
index 72bdfe1c3..d692bd89f 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/EWARM/Project.eww
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/Project.eww
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<workspace>
<project>
- <path>$WS_DIR$\BLE_MeshLightingDemo.ewp</path>
+ <path>$WS_DIR$\BLE_MeshLightingLPN.ewp</path>
</project>
<batchBuild />
</workspace>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..5f36da686
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx
new file mode 100644
index 000000000..7671db812
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx
@@ -0,0 +1,1324 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>Lighting_LPN</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>18</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>1</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>0</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>BIN\UL2CM3.DLL</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32WB_M4 -FL01000000 -FS08000000 -FP0($$Device:STM32WB55CGUx$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint/>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Application/Core</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_debug.c</PathWithFileName>
+ <FilenameWithoutPath>app_debug.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/app_entry.c</PathWithFileName>
+ <FilenameWithoutPath>app_entry.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_flash.c</PathWithFileName>
+ <FilenameWithoutPath>hw_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_timerserver.c</PathWithFileName>
+ <FilenameWithoutPath>hw_timerserver.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/hw_uart.c</PathWithFileName>
+ <FilenameWithoutPath>hw_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/lp_timer.c</PathWithFileName>
+ <FilenameWithoutPath>lp_timer.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/main.c</PathWithFileName>
+ <FilenameWithoutPath>main.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32_lpm_if.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32wbxx_it.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_it.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>startup_stm32wb55xx_cm4.s</PathWithFileName>
+ <FilenameWithoutPath>startup_stm32wb55xx_cm4.s</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/STM32_WPAN/app</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/app_ble.c</PathWithFileName>
+ <FilenameWithoutPath>app_ble.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_generic.c</PathWithFileName>
+ <FilenameWithoutPath>appli_generic.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_light.c</PathWithFileName>
+ <FilenameWithoutPath>appli_light.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_light_lc.c</PathWithFileName>
+ <FilenameWithoutPath>appli_light_lc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_mesh.c</PathWithFileName>
+ <FilenameWithoutPath>appli_mesh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_nvm.c</PathWithFileName>
+ <FilenameWithoutPath>appli_nvm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_sensor.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/appli_vendor.c</PathWithFileName>
+ <FilenameWithoutPath>appli_vendor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/models_if.c</PathWithFileName>
+ <FilenameWithoutPath>models_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/pal_nvm.c</PathWithFileName>
+ <FilenameWithoutPath>pal_nvm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/PWM_config.c</PathWithFileName>
+ <FilenameWithoutPath>PWM_config.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/app/PWM_handlers.c</PathWithFileName>
+ <FilenameWithoutPath>PWM_handlers.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/STM32_WPAN/target</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../STM32_WPAN/target/hw_ipcc.c</PathWithFileName>
+ <FilenameWithoutPath>hw_ipcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Doc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>5</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../readme.txt</PathWithFileName>
+ <FilenameWithoutPath>readme.txt</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.USBDongle</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>6</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_usb_dongle.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>7</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/system_stm32wbxx.c</PathWithFileName>
+ <FilenameWithoutPath>system_stm32wbxx.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_cortex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_dma.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_flash_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_i2c.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>34</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_i2c_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>35</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pcd.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>36</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pcd_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>37</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>38</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_pwr_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>39</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>40</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rcc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>41</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>42</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_rtc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>43</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>44</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_tim_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>45</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>46</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_hal_uart_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>8</GroupNumber>
+ <FileNumber>47</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</PathWithFileName>
+ <FilenameWithoutPath>stm32wbxx_ll_usb.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_USB_Device_Library</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>48</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</PathWithFileName>
+ <FilenameWithoutPath>usbd_cdc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>49</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</PathWithFileName>
+ <FilenameWithoutPath>usbd_core.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>50</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</PathWithFileName>
+ <FilenameWithoutPath>usbd_ctlreq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>51</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</PathWithFileName>
+ <FilenameWithoutPath>usbd_ioreq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>52</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</PathWithFileName>
+ <FilenameWithoutPath>common.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>53</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</PathWithFileName>
+ <FilenameWithoutPath>generic.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>54</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</PathWithFileName>
+ <FilenameWithoutPath>light.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>55</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</PathWithFileName>
+ <FilenameWithoutPath>light_lc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>56</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</PathWithFileName>
+ <FilenameWithoutPath>mesh.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>57</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</PathWithFileName>
+ <FilenameWithoutPath>mesh_cfg.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>58</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</PathWithFileName>
+ <FilenameWithoutPath>sensors.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>59</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</PathWithFileName>
+ <FilenameWithoutPath>svc_ctl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>60</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</PathWithFileName>
+ <FilenameWithoutPath>time_scene.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>10</GroupNumber>
+ <FileNumber>61</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</PathWithFileName>
+ <FilenameWithoutPath>vendor.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/core</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>62</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_gap_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>63</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_gatt_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>64</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_hal_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>65</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</PathWithFileName>
+ <FilenameWithoutPath>ble_hci_le.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>66</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</PathWithFileName>
+ <FilenameWithoutPath>ble_l2cap_aci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>11</GroupNumber>
+ <FileNumber>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</PathWithFileName>
+ <FilenameWithoutPath>osal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>12</GroupNumber>
+ <FileNumber>68</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</PathWithFileName>
+ <FilenameWithoutPath>shci.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>69</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>70</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>hci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>71</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>72</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</PathWithFileName>
+ <FilenameWithoutPath>shci_tl_if.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>13</GroupNumber>
+ <FileNumber>73</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</PathWithFileName>
+ <FilenameWithoutPath>tl_mbox.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>14</GroupNumber>
+ <FileNumber>74</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</PathWithFileName>
+ <FilenameWithoutPath>usbd_conf.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>14</GroupNumber>
+ <FileNumber>75</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</PathWithFileName>
+ <FilenameWithoutPath>usbd_desc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>14</GroupNumber>
+ <FileNumber>76</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</PathWithFileName>
+ <FilenameWithoutPath>vcp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>77</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</PathWithFileName>
+ <FilenameWithoutPath>dbg_trace.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>78</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</PathWithFileName>
+ <FilenameWithoutPath>otp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>79</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_lpm.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>80</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Utilities/sequencer/stm32_seq.c</PathWithFileName>
+ <FilenameWithoutPath>stm32_seq.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>81</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</PathWithFileName>
+ <FilenameWithoutPath>stm_list.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>15</GroupNumber>
+ <FileNumber>82</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</PathWithFileName>
+ <FilenameWithoutPath>stm_queue.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>16</GroupNumber>
+ <FileNumber>83</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</PathWithFileName>
+ <FilenameWithoutPath>libBle_Mesh_CM4_Keil.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>17</GroupNumber>
+ <FileNumber>84</FileNumber>
+ <FileType>4</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</PathWithFileName>
+ <FilenameWithoutPath>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>1</RteFlg>
+ </Group>
+
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvprojx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
index 4c7d6b3d6..74464b62b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvprojx
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
@@ -7,7 +7,7 @@
<Targets>
<Target>
- <TargetName>Lighting_Node</TargetName>
+ <TargetName>Lighting_LPN</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
@@ -16,7 +16,7 @@
<TargetCommonOption>
<Device>STM32WB55CGUx</Device>
<Vendor>STMicroelectronics</Vendor>
- <PackID>Keil.STM32WBxx_DFP.1.1.0</PackID>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
<FlashUtilSpec></FlashUtilSpec>
@@ -48,8 +48,8 @@
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
- <OutputDirectory>Lighting_Node\Exe\</OutputDirectory>
- <OutputName>BLE_MeshLightingNodeDemo</OutputName>
+ <OutputDirectory>Lighting_LPN\Exe\</OutputDirectory>
+ <OutputName>BLE_MeshLightingLPNDemo</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>
@@ -110,11 +110,11 @@
</CommonProperty>
<DllOption>
<SimDllName>SARMCM3.DLL</SimDllName>
- <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDllArguments> -REMAP -MPU</SimDllArguments>
<SimDlgDll>DCM.DLL</SimDlgDll>
<SimDlgDllArguments>-pCM4</SimDlgDllArguments>
<TargetDllName>SARMCM3.DLL</TargetDllName>
- <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDllArguments> -MPU</TargetDllArguments>
<TargetDlgDll>TCM.DLL</TargetDlgDll>
<TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
</DllOption>
@@ -134,11 +134,11 @@
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
<Capability>1</Capability>
- <DriverSelection>4107</DriverSelection>
+ <DriverSelection>4101</DriverSelection>
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
- <Flash3></Flash3>
+ <Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
@@ -184,6 +184,7 @@
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@@ -447,184 +448,16 @@
<FilePath>../STM32_WPAN/app/app_ble.c</FilePath>
</File>
<File>
- <FileName>appli_config_client.c</FileName>
- <FileType>1</FileType>
- <FilePath>../STM32_WPAN/app/appli_config_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
- </File>
- <File>
<FileName>appli_generic.c</FileName>
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/appli_generic.c</FilePath>
</File>
<File>
- <FileName>appli_generic_client.c</FileName>
- <FileType>1</FileType>
- <FilePath>../STM32_WPAN/app/appli_generic_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
- </File>
- <File>
<FileName>appli_light.c</FileName>
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/appli_light.c</FilePath>
</File>
<File>
- <FileName>appli_light_client.c</FileName>
- <FileType>1</FileType>
- <FilePath>../STM32_WPAN/app/appli_light_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
- </File>
- <File>
<FileName>appli_light_lc.c</FileName>
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/appli_light_lc.c</FilePath>
@@ -855,184 +688,16 @@
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</FilePath>
</File>
<File>
- <FileName>config_client.c</FileName>
- <FileType>1</FileType>
- <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
- </File>
- <File>
<FileName>generic.c</FileName>
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</FilePath>
</File>
<File>
- <FileName>generic_client.c</FileName>
- <FileType>1</FileType>
- <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
- </File>
- <File>
<FileName>light.c</FileName>
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</FilePath>
</File>
<File>
- <FileName>light_client.c</FileName>
- <FileType>1</FileType>
- <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c</FilePath>
- <FileOption>
- <CommonProperty>
- <UseCPPCompiler>2</UseCPPCompiler>
- <RVCTCodeConst>0</RVCTCodeConst>
- <RVCTZI>0</RVCTZI>
- <RVCTOtherData>0</RVCTOtherData>
- <ModuleSelection>0</ModuleSelection>
- <IncludeInBuild>0</IncludeInBuild>
- <AlwaysBuild>2</AlwaysBuild>
- <GenerateAssemblyFile>2</GenerateAssemblyFile>
- <AssembleAssemblyFile>2</AssembleAssemblyFile>
- <PublicsOnly>2</PublicsOnly>
- <StopOnExitCode>11</StopOnExitCode>
- <CustomArgument></CustomArgument>
- <IncludeLibraryModules></IncludeLibraryModules>
- <ComprImg>1</ComprImg>
- </CommonProperty>
- <FileArmAds>
- <Cads>
- <interw>2</interw>
- <Optim>0</Optim>
- <oTime>2</oTime>
- <SplitLS>2</SplitLS>
- <OneElfS>2</OneElfS>
- <Strict>2</Strict>
- <EnumInt>2</EnumInt>
- <PlainCh>2</PlainCh>
- <Ropi>2</Ropi>
- <Rwpi>2</Rwpi>
- <wLevel>0</wLevel>
- <uThumb>2</uThumb>
- <uSurpInc>2</uSurpInc>
- <uC99>2</uC99>
- <uGnu>2</uGnu>
- <useXO>2</useXO>
- <v6Lang>0</v6Lang>
- <v6LangP>0</v6LangP>
- <vShortEn>2</vShortEn>
- <vShortWch>2</vShortWch>
- <v6Lto>2</v6Lto>
- <v6WtE>2</v6WtE>
- <v6Rtti>2</v6Rtti>
- <VariousControls>
- <MiscControls></MiscControls>
- <Define></Define>
- <Undefine></Undefine>
- <IncludePath></IncludePath>
- </VariousControls>
- </Cads>
- </FileArmAds>
- </FileOption>
- </File>
- <File>
<FileName>light_lc.c</FileName>
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</FilePath>
@@ -1213,9 +878,9 @@
<GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
<Files>
<File>
- <FileName>STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</FileName>
+ <FileName>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FileName>
<FileType>4</FileType>
- <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</FilePath>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilePath>
</File>
</Files>
</Group>
@@ -1232,7 +897,7 @@
<component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.3.0" condition="CMSIS Core">
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.5.0"/>
<targetInfos>
- <targetInfo name="Lighting_Node"/>
+ <targetInfo name="Lighting_LPN"/>
</targetInfos>
</component>
</components>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c
new file mode 100644
index 000000000..e9b50f44e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.c
@@ -0,0 +1,109 @@
+/**
+ *******************************************************************************
+ * @file PWM_config.c
+ * @author BLE Mesh Team
+ * @brief Configuration file for PWM.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "PWM_config.h"
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+
+#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / 1000000) - 1)
+
+/**
+ *@brief Configure PWM sources and GPIO
+ *@retval None
+ */
+void PWM_Init()
+{
+ TIM_OC_InitTypeDef sConfigOC = {0};
+ TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+ /* GPIO Configuration */
+ GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+
+ /* Configure PWM pins */
+ GPIO_InitStructure.Pin = PWM0_PIN | PWM1_PIN;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Pull = GPIO_PULLUP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
+
+ /* Configure PWM pins */
+ GPIO_InitStructure.Pin = PWM2_PIN | PWM3_PIN | PWM4_PIN;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Pull = GPIO_PULLUP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure.Alternate = GPIO_AF1_TIM2;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ /* MFT Configuration */
+ HAL_NVIC_SetPriority((IRQn_Type)(TIM1_CC_IRQn), 15, 0);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TIM1_CC_IRQn));
+ HAL_NVIC_SetPriority((IRQn_Type)(TIM2_IRQn), 15, 0);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TIM2_IRQn));
+
+ htim1.Instance = TIM1;
+ htim1.Init.Prescaler = 0/*PRESCALER_VALUE*/;
+ htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim1.Init.Period = TIME_PERIOD;
+ htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ HAL_TIM_PWM_Init(&htim1);
+
+ htim2.Instance = TIM2;
+ htim2.Init.Prescaler = 0/*PRESCALER_VALUE*/;
+ htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim2.Init.Period = TIME_PERIOD;
+ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ HAL_TIM_PWM_Init(&htim2);
+
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+ HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
+ HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
+
+ sConfigOC.OCMode = TIM_OCMODE_PWM1;
+ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+ sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+ sConfigOC.Pulse = MFT1_TON_1;
+ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
+ sConfigOC.Pulse = MFT2_TON_1;
+ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
+ sConfigOC.Pulse = MFT1_TON_2;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
+ sConfigOC.Pulse = MFT2_TON_2;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
+ sConfigOC.Pulse = MFT2_TON_3;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
+
+ /* Start channel 1 */
+ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);
+ /* Start channel 2 */
+ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_2);
+ /* Start channel 1 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
+ /* Start channel 2 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_2);
+ /* Start channel 3 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_3);
+}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h
new file mode 100644
index 000000000..a229ec666
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_config.h
@@ -0,0 +1,69 @@
+/******************** (C) COPYRIGHT 2015 STMicroelectronics ********************
+* File Name : PWM/PWM_config.c
+* Author : SNM Application Team
+* Version : V1.0.0
+* Date : September-2015
+* Description : Configuration file for PWM
+********************************************************************************
+* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+#include "mesh_cfg_usr.h"
+
+/* Macros defined for the number of PWM Provided */
+#define PWM0 0
+#define PWM1 1
+#define PWM2 2
+#define PWM3 3
+#define PWM4 4
+
+/************************************************************************/
+
+/*STM32WB
+ * This configuration given below is for the STM32WB board.
+ * Here user has selected the PWM0 in SERIAL2_MODE and PWM1 in SERIAL1_MODE.
+ * User can configure software PWM to any of the GPIO which are not used for
+ * hardware PWM.
+*/
+/* PWM pins for MFT1 and MFT2 respectively */
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+
+#define PWM0_PIN GPIO_PIN_14 /* TIM1_CH1 AF1 */
+#define PWM1_PIN GPIO_PIN_15 /* TIM1_CH2 AF1 */
+
+/* GPIOs pins (SOFTWARE PWM) used to output a PWM signal */
+#define PWM2_PIN GPIO_PIN_0 /* TIM2_CH1 AF1 */
+#define PWM3_PIN GPIO_PIN_1 /* TIM2_CH2 AF1 */
+#define PWM4_PIN GPIO_PIN_2 /* TIM2_CH3 AF1 */
+#endif
+/************************************************************************/
+
+#define TIME_PERIOD 32000
+
+/* TIM1 Channel 1 Timer Ton and T0ff (ticks number) PWM0*/
+#define MFT1_TON_1 (12000 - 1)
+#define MFT1_TOFF_1 (20000 - 1)
+
+/* TIM1 Channel 2 Timer 1 Ton and T0ff (ticks number) PWM1*/
+#define MFT2_TON_1 (8000 - 1 )
+#define MFT2_TOFF_1 (24000 - 1)
+
+/* TIM2 Channel 1 Timer 2 Ton and T0ff (ticks number) PWM2*/
+#define MFT1_TON_2 (16000 - 1)
+#define MFT1_TOFF_2 (16000 -1)
+
+/* TIM2 Channel 2 Timer 2 Ton and T0ff (ticks number) PWM3*/
+#define MFT2_TON_2 (4000 - 1)
+#define MFT2_TOFF_2 (28000 - 1)
+
+/* TIM2 Channel 3 Timer 2 Ton and T0ff (ticks number) PWM4*/
+#define MFT2_TON_3 (4000 - 1)
+#define MFT2_TOFF_3 (28000 - 1)
+
+void PWM_Init(void);
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c
new file mode 100644
index 000000000..698bdced8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.c
@@ -0,0 +1,300 @@
+/**
+********************************************************************************
+* @file PWM_handlers.c
+* @author BLE Mesh Team
+* @version V1.0.0
+* @date 31-July-2018
+* @brief Handlers for PWM and other support functions.
+********************************************************************************
+* @attention
+*
+*<h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "app_conf.h"
+#include "PWM_handlers.h"
+#include "mesh_cfg_usr.h"
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+
+/* Global Variables */
+uint16_t DUTY;
+int NonZeroPWM0=0;
+int NonZeroPWM1=0;
+uint8_t Duty_flag_A = 0;
+uint16_t PWM0_on,
+ PWM1_on,
+ PWM2_on = MFT1_TON_2, /* Timer2, MFT1 */
+ PWM3_on = MFT2_TON_2, /* Timer2, MFT2 */
+ PWM4_on = MFT2_TON_3; /* Timer2, MFT2 */
+
+uint32_t channel = PWM3_PIN; /* It is the channel with initial lowest duty-cycle */
+uint32_t period = TIME_PERIOD; /* Period in ticks of the PWM signal */
+uint8_t channel_number = 0;
+
+uint32_t PWM_channels[] = {PWM3_PIN, PWM4_PIN}; /* Channels managed by MFT2 Timer 2 */
+uint16_t Ton_values[] = {MFT2_TON_2, MFT2_TON_3}; /* Sorted array containing duty-cycle values
+ respectively for PWM3_PIN and PWM4_PIN */
+uint16_t delta_1 = MFT2_TON_3 - MFT2_TON_2; /* Delta between the first two duty-cycles */
+uint16_t delta = MFT2_TON_3 - MFT2_TON_2;
+
+int number_of_channels = 2; /* Number of channels managed by MFT2 Timer 2 */
+int max_duty = MFT2_TON_3; /* Maximum duty-cycle */
+
+/**
+ *@brief PWM2 handler
+ *@retval None
+ */
+void PWM2_handler()
+{
+ if(__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1) > 0)
+ {
+ __HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC1);
+ if(Duty_flag_A == 1)
+ {
+ HAL_GPIO_WritePin(GPIOA, PWM2_PIN, GPIO_PIN_SET);
+ Duty_flag_A = 0;
+ htim1.Instance->CCR1 = PWM2_on;
+ }
+ else
+ {
+ HAL_GPIO_WritePin(GPIOA, PWM2_PIN, GPIO_PIN_RESET);
+ Duty_flag_A = 1;
+ htim1.Instance->CCR1 = TIME_PERIOD - PWM2_on;
+ }
+ }
+}
+
+/**
+ *@brief PWM3 and PWM4 handler
+ *@retval None
+ */
+void PWM3_PWM4_handler()
+{
+ /*STATE 0
+ if delta != 0, there is a channel with a duty lower than the other one.
+ So the channel with the lower duty is cleared. Delta is period - max_duty
+ (the duty of the other channel)
+ The machine passes to STATE 1.
+
+ if delta == 0, the two channel are cleared together.
+ The machine passes to STATE 2
+
+ The delta is computed for the next timer event*/
+
+ if (channel_number < number_of_channels - 1)
+ {
+ if (delta != 0)
+ {
+// HAL_GPIO_WritePin(GPIOA, channel, GPIO_PIN_RESET);
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number ++;
+ delta = period - max_duty; /*computed delta for the next reset of the counter*/
+ channel = PWM_channels[channel_number];
+ }
+ else
+ {
+// HAL_GPIO_WritePin(GPIOA, PWM3_PIN |PWM4_PIN, GPIO_PIN_RESET);
+ delta = period - max_duty;
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number = number_of_channels;
+ }
+ }
+ /*STATE 1
+ Here the channel with the max duty-cycle is cleared. The delta is that one
+ computed in STATE 0. The machine passes to STATE 2 */
+ else if (channel_number == number_of_channels - 1)
+ {
+// HAL_GPIO_WritePin(GPIOA, channel, GPIO_PIN_RESET);
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number ++;
+ }
+ /*STATE 2
+ All the channels have been cleared and now are set again. The machine passes to STATE 0 */
+ else
+ { /* channel_number > number_of_channels - 1 */
+ HAL_GPIO_WritePin(GPIOA, PWM3_PIN | PWM4_PIN, GPIO_PIN_SET);
+ htim2.Instance->CCR2 = Ton_values[0] - 1;
+ htim2.Instance->CCR3 = Ton_values[1] - 1;
+ Ton_sorting();
+ channel_number = 0;
+ delta = Ton_values[1] - Ton_values[0];
+ channel = PWM_channels[0];
+ }
+}
+
+/**
+ *@brief Sorting on basis of duty cycle
+ *@retval None
+ */
+
+void Ton_sorting(void)
+{
+ if (PWM3_on > PWM4_on)
+ {
+ max_duty = PWM3_on;
+ Ton_values[1] = PWM3_on;
+ Ton_values[0] = PWM4_on;
+ PWM_channels[1] = PWM3_PIN;
+ PWM_channels[0] = PWM4_PIN;
+ }
+ else
+ {
+ max_duty = PWM4_on;
+ Ton_values[0] = PWM3_on;
+ Ton_values[1] = PWM4_on;
+ PWM_channels[0] = PWM3_PIN;
+ PWM_channels[1] = PWM4_PIN;
+ }
+}
+
+
+/**
+ *@brief PWM modification
+ *@param PWM_ID: PWM number
+ *@param duty_cycle: Duty cycle at output
+ *@retval None
+ */
+void Modify_PWM(uint8_t PWM_ID, uint16_t duty_cycle)
+{
+#if ( CFG_LPM_SUPPORTED == 0)
+ GPIO_InitTypeDef GPIO_InitStructure1 = {0};
+
+ if (PWM_ID == 0) /* PD14 */
+ {
+ if (duty_cycle == 0 && NonZeroPWM0 == 0)
+ {
+ GPIO_InitStructure1.Pin = PWM0_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStructure1.Pull = GPIO_NOPULL;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+ HAL_GPIO_WritePin(GPIOD, PWM0_PIN, GPIO_PIN_RESET);
+
+ NonZeroPWM0=1;
+ }
+ else if ((duty_cycle != 0 && NonZeroPWM0 == 1))
+ {
+ GPIO_InitStructure1.Pin = PWM0_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure1.Pull = GPIO_PULLUP;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure1.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+
+ NonZeroPWM0=0;
+ }
+ }
+ else if((PWM_ID == 1)) /* GPIO3 */
+ {
+ if (duty_cycle == 0 && NonZeroPWM1 == 0)
+ {
+ GPIO_InitStructure1.Pin = PWM1_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStructure1.Pull = GPIO_NOPULL;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+ HAL_GPIO_WritePin(GPIOD, PWM1_PIN, GPIO_PIN_RESET);
+
+ NonZeroPWM1=1;
+ }
+ else if ((duty_cycle != 0 && NonZeroPWM1 == 1))
+ {
+ GPIO_InitStructure1.Pin = PWM1_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure1.Pull = GPIO_PULLUP;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure1.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+
+ NonZeroPWM1=0;
+ }
+ }
+ else
+ {
+ }
+
+ DUTY = duty_cycle;
+ switch (PWM_ID)
+ {
+ case 0: /* PWM0 */
+ {
+ htim1.Instance->CCR1 = DUTY;
+ }
+ break;
+ case 1: /* PWM1 */
+ {
+ htim1.Instance->CCR2 = DUTY;
+ }
+ break;
+ case 2: /* PWM2 */
+ {
+ PWM2_on = DUTY;
+ htim2.Instance->CCR1 = PWM2_on;
+ }
+ break;
+ case 3: /* PWM3 */
+ {
+ PWM3_on = DUTY;
+ htim2.Instance->CCR2 = PWM3_on;
+ }
+ break;
+ case 4: /* PWM4 */
+ {
+ PWM4_on = DUTY;
+ htim2.Instance->CCR3 = PWM4_on;
+ }
+ break;
+ }
+#endif
+}
+
+/**
+ * @brief Period elapsed callback in non blocking mode
+ * @param htim : TIM handle
+ * @retval None
+ */
+void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
+{
+#if 0
+ if(htim->Instance == TIM1)
+ PWM2_handler();
+ else
+ PWM3_PWM4_handler();
+#endif
+}
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h
new file mode 100644
index 000000000..a27fa757b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/PWM_handlers.h
@@ -0,0 +1,35 @@
+/**
+ ******************************************************************************
+ * @file PWM/PWM_handlers.c
+* @author SNM Application Team
+* @version V1.0.0
+* @date September-2015
+ * @brief Handlers for PWM and other support functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ ******************************************************************************
+ */
+
+#include "PWM_config.h"
+//#include "SDK_EVAL_Config.h"
+
+/* PWM2 handler */
+void PWM2_handler(void);
+
+/* PWM3 and PWM4 handler */
+void PWM3_PWM4_handler(void);
+
+/* Here the channel with the lower duty-cycle is established*/
+void Ton_sorting(void);
+
+/* Handle modifications in duty cycle */
+void Modify_PWM(uint8_t PWM_ID, uint16_t duty_cycle);
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
new file mode 100644
index 000000000..c96144dff
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
@@ -0,0 +1,661 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.c
+ * @author MCD Application Team
+ * @brief BLE Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+
+#include "stm32_seq.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "mesh_cfg.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+
+/**
+ * security parameters structure
+ */
+typedef struct _tSecurityParams
+{
+ /**
+ * IO capability of the device
+ */
+ uint8_t ioCapability;
+
+ /**
+ * Authentication requirement of the device
+ * Man In the Middle protection required?
+ */
+ uint8_t mitm_mode;
+
+ /**
+ * bonding mode of the device
+ */
+ uint8_t bonding_mode;
+
+ /**
+ * Flag to tell whether OOB data has
+ * to be used during the pairing process
+ */
+ uint8_t OOB_Data_Present;
+
+ /**
+ * OOB data to be used in the pairing process if
+ * OOB_Data_Present is set to TRUE
+ */
+ uint8_t OOB_Data[16];
+
+ /**
+ * this variable indicates whether to use a fixed pin
+ * during the pairing process or a passkey has to be
+ * requested to the application during the pairing process
+ * 0 implies use fixed pin and 1 implies request for passkey
+ */
+ uint8_t Use_Fixed_Pin;
+
+ /**
+ * minimum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMin;
+
+ /**
+ * maximum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMax;
+
+ /**
+ * fixed pin to be used in the pairing process if
+ * Use_Fixed_Pin is set to 1
+ */
+ uint32_t Fixed_Pin;
+
+ /**
+ * this flag indicates whether the host has to initiate
+ * the security, wait for pairing or does not have any security
+ * requirements.\n
+ * 0x00 : no security required
+ * 0x01 : host should initiate security by sending the slave security
+ * request command
+ * 0x02 : host need not send the clave security request but it
+ * has to wait for paiirng to complete before doing any other
+ * processing
+ */
+ uint8_t initiateSecurity;
+}tSecurityParams;
+
+/**
+ * global context
+ * contains the variables common to all
+ * services
+ */
+typedef struct _tBLEProfileGlobalContext
+{
+
+ /**
+ * security requirements of the host
+ */
+ tSecurityParams bleSecurityParam;
+
+ /**
+ * gap service handle
+ */
+ uint16_t gapServiceHandle;
+
+ /**
+ * device name characteristic handle
+ */
+ uint16_t devNameCharHandle;
+
+ /**
+ * appearance characteristic handle
+ */
+ uint16_t appearanceCharHandle;
+
+ /**
+ * connection handle of the current active connection
+ * When not in connection, the handle is set to 0xFFFF
+ */
+ uint16_t connectionHandle;
+
+ /**
+ * length of the UUID list to be used while advertising
+ */
+ uint8_t advtServUUIDlen;
+
+ /**
+ * the UUID list to be used while advertising
+ */
+ uint8_t advtServUUID[100];
+
+}BleGlobalContext_t;
+
+typedef struct
+{
+ BleGlobalContext_t BleApplicationContext_legacy;
+ APP_BLE_ConnStatus_t Device_Connection_Status;
+ /**
+ * ID of the Advertising Timeout
+ */
+ uint8_t Advertising_mgr_timer_Id;
+
+} BleApplicationContext_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define APPBLE_GAP_DEVICE_NAME_LENGTH 7
+#define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
+#define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
+
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* USER CODE BEGIN PD */
+#define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
+
+uint8_t Test_Status =0x00;
+
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+{
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+};
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Extern function prototypes -----------------------------------------------*/
+extern void HCI_Event_CB(void *pckt);
+
+/* Global variables ----------------------------------------------------------*/
+const uint8_t *bd_addr;
+
+/* Private function prototypes -----------------------------------------------*/
+static void BLE_UserEvtRx( void * pPayload );
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
+static void Ble_Tl_Init( void );
+static void Ble_Hci_Gap_Gatt_Init(void);
+static const uint8_t* BleGetBdAddress( void );
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init_1 */
+
+/* USER CODE END APP_BLE_Init_1 */
+ SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet =
+ {
+ {{0,0,0}}, /**< Header unused */
+ {0, /** pBleBufferAddress not used */
+ 0, /** BleBufferSize not used */
+ CFG_BLE_NUM_GATT_ATTRIBUTES,
+ CFG_BLE_NUM_GATT_SERVICES,
+ CFG_BLE_ATT_VALUE_ARRAY_SIZE,
+ CFG_BLE_NUM_LINK,
+ CFG_BLE_DATA_LENGTH_EXTENSION,
+ CFG_BLE_PREPARE_WRITE_LIST_SIZE,
+ CFG_BLE_MBLOCK_COUNT,
+ CFG_BLE_MAX_ATT_MTU,
+ CFG_BLE_SLAVE_SCA,
+ CFG_BLE_MASTER_SCA,
+ CFG_BLE_LSE_SOURCE,
+ CFG_BLE_MAX_CONN_EVENT_LENGTH,
+ CFG_BLE_HSE_STARTUP_TIME,
+ CFG_BLE_VITERBI_MODE,
+ CFG_BLE_LL_ONLY,
+ 0}
+ };
+
+ /**
+ * Initialize Ble Transport Layer
+ */
+ Ble_Tl_Init( );
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+
+ /**
+ * Do not allow stop mode in the application
+ */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+#endif
+
+ /**
+ * Register the hci transport layer to handle BLE User Asynchronous Events
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, hci_user_evt_proc);
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ /**
+ * Initialization of HCI & GATT & GAP layer
+ */
+ Ble_Hci_Gap_Gatt_Init();
+
+ /**
+ * Initialization of the BLE Services
+ */
+ SVCCTL_Init();
+
+ /**
+ * Initialization of the BLE App Context
+ */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
+
+ /*Radio mask Activity*/
+#if(RADIO_ACTIVITY_EVENT != 0)
+ aci_hal_set_radio_activity_mask(0x00FF);
+#endif
+
+ BleApplicationContext.Device_Connection_Status = APP_BLE_FAST_ADV;
+
+/* USER CODE BEGIN APP_BLE_Init_2 */
+
+/* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
+{
+ HCI_Event_CB(pckt);
+
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+
+ return (SVCCTL_UserEvtFlowEnable);
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Ble_Tl_Init( void )
+{
+ HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
+
+ Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
+ Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
+ hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
+
+ return;
+}
+
+static void Ble_Hci_Gap_Gatt_Init(void){
+
+ uint8_t role;
+ uint8_t index;
+ uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
+ const uint8_t *bd_addr;
+ uint32_t srd_bd_addr[2];
+#ifndef BLE_CFG_MESH
+ const uint8_t mode = BLE_CFG_DATA_ROLE_MODE;
+#endif
+ uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
+
+ /**
+ * Initialize HCI layer
+ */
+ /*HCI Reset to synchronise BLE Stack*/
+ hci_reset();
+
+ /**
+ * Write the BD Address
+ */
+
+ bd_addr = BleGetBdAddress();
+ aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
+ CONFIG_DATA_PUBADDR_LEN,
+ (uint8_t*) bd_addr);
+
+ /**
+ * Static random Address
+ * The two upper bits shall be set to 1
+ * The lowest 32bits is read from the UDN to differentiate between devices
+ * The RNG may be used to provide a random number on each power on
+ */
+ srd_bd_addr[1] = 0x0000ED6E;
+ srd_bd_addr[0] = LL_FLASH_GetUDN( );
+ aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
+
+#ifndef BLE_CFG_MESH
+ /**
+ * Write the Role
+ */
+ aci_hal_write_config_data(CONFIG_DATA_ROLE,
+ CONFIG_DATA_ROLE_LEN,
+ (uint8_t*) &mode);
+#endif
+
+ /**
+ * Set TX Power to 0dBm.
+ */
+ aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+
+ /**
+ * Initialize GATT interface
+ */
+ aci_gatt_init();
+
+ /**
+ * Initialize GAP interface
+ */
+ role = 0;
+
+#if (BLE_CFG_PERIPHERAL == 1)
+ role |= GAP_PERIPHERAL_ROLE;
+#endif
+
+#if (BLE_CFG_CENTRAL == 1)
+ role |= GAP_CENTRAL_ROLE;
+#endif
+
+#ifdef BLE_CFG_MESH
+#if (BLE_CFG_BROADCASTER == 1)
+ role |= GAP_BROADCASTER_ROLE;
+#endif
+
+#if (BLE_CFG_OBSERVER == 1)
+ role |= GAP_OBSERVER_ROLE;
+#endif
+#endif
+
+ if (role > 0)
+ {
+ const char *name = "STM32WB";
+ aci_gap_init(role, 0,
+ APPBLE_GAP_DEVICE_NAME_LENGTH,
+ &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
+
+ if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
+ {
+ BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
+ }
+ }
+
+ if(aci_gatt_update_char_value(gap_service_handle,
+ gap_appearance_char_handle,
+ 0,
+ 2,
+ (uint8_t *)&appearance))
+ {
+ BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
+ }
+/**
+ * Initialize Default PHY
+ */
+ hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
+
+ /**
+ * Initialize IO capability
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
+ aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
+
+ /**
+ * Initialize authentication
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = 0;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = 8;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = 16;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = 1;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = 111111;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 1;
+ for (index = 0; index < 16; index++)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
+ }
+
+ aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
+ 0,
+ 0,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
+ 0
+ );
+
+ /**
+ * Initialize whitelist
+ */
+ if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
+ {
+ aci_gap_configure_whitelist();
+ }
+}
+
+const uint8_t* BleGetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTION */
+
+/* USER CODE END FD_LOCAL_FUNCTION */
+
+/*************************************************************
+ *
+ *SPECIFIC FUNCTIONS
+ *
+ *************************************************************/
+/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
+
+/* USER CODE END FD_SPECIFIC_FUNCTIONS */
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void hci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+#if (LOW_POWER_FEATURE == 1)
+static volatile uint8_t HciResponse = 0;
+#endif
+
+void hci_cmd_resp_release(uint32_t flag)
+{
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+#else
+ HciResponse = 1;
+#endif
+ return;
+}
+
+void hci_cmd_resp_wait(uint32_t timeout)
+{
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+#else
+ while(HciResponse == 0);
+ HciResponse = 0;
+#endif
+ return;
+}
+
+static void BLE_UserEvtRx( void * pPayload )
+{
+ SVCCTL_UserEvtFlowStatus_t svctl_return_status;
+ tHCI_UserEvtRxParam *pParam;
+
+ pParam = (tHCI_UserEvtRxParam *)pPayload;
+
+ svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
+ if (svctl_return_status != SVCCTL_UserEvtFlowDisable)
+ {
+ pParam->status = HCI_TL_UserEventFlow_Enable;
+ }
+ else
+ {
+ pParam->status = HCI_TL_UserEventFlow_Disable;
+ }
+}
+
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status )
+{
+ uint32_t task_id_list;
+ switch (status)
+ {
+ case HCI_TL_CmdBusy:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_PauseTask(task_id_list);
+
+ break;
+
+ case HCI_TL_CmdAvailable:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_ResumeTask(task_id_list);
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+void SVCCTL_ResumeUserEventFlow( void )
+{
+ hci_resume_flow();
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h
new file mode 100644
index 000000000..d87d3e466
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.h
@@ -0,0 +1,79 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.h
+ * @author MCD Application Team
+ * @brief Header for ble application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_BLE_H
+#define APP_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "hci_tl.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+typedef enum
+{
+ APP_BLE_IDLE,
+ APP_BLE_FAST_ADV,
+ APP_BLE_LP_ADV,
+ APP_BLE_SCAN,
+ APP_BLE_LP_CONNECTING,
+ APP_BLE_CONNECTED_SERVER,
+ APP_BLE_CONNECTED_CLIENT
+} APP_BLE_ConnStatus_t;
+
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+void APP_BLE_Init( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*APP_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c
new file mode 100644
index 000000000..6f64749c8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c
@@ -0,0 +1,1979 @@
+/**
+ ******************************************************************************
+ * @file appli_config_client.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Config CLient Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "config_client.h"
+#include "appli_config_client.h"
+#include "appli_mesh.h"
+#include "sensors.h"
+#include "light_lc.h"
+#include "vendor.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+
+#define DEFAULT_GROUP_ADDR 0xC000
+#define DEFAULT_PUBLISH_ADDR 0xC000
+#define DEFAULT_NETKEY_INDEX 0x0000
+#define DEFAULT_APPKEY_INDEX 0x0000
+#define DEFAULT_CREDENTIAL_FLAG 0x00
+#define DEFAULT_PUBLISH_TTL 0x08
+#define DEFAULT_PUBLISH_PERIOD 0x00
+#define DEFAULT_PUBLISH_RETRANSMIT_COUNT 0x00
+#define DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS 0x00
+
+#define NUM_VENDOR_MODELS_TO_SUBSCRIBE 0
+#define NUM_VENDOR_MODELS_TO_PUBLISH 0
+#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+
+const MOBLEUINT8 aConfigAppKeyDefault[19]=
+ { /* NetKeyIndexAndAppKeyIndex : 3B
+ Index of the NetKey and index of the AppKey*/
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
+ (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff),
+ /* AppKey is initialised as below = 16B */
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 };
+
+
+const MOBLEUINT8 aConfigAppKeyDeleteDefault[3]=
+ { /* NetKeyIndexAndAppKeyIndex : 3B
+ Index of the NetKey and index of the AppKey*/
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
+ (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff)};
+
+
+const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
+ { /* NetKeyIndex : 2B
+ Index of the NetKey */
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) };
+
+const MOBLEUINT8 aNoParamDefaultConfig;
+
+const MOBLEUINT8 aNoInitParamDefault[MAX_CONFIG_PARAM_SIZE]= {0};
+
+/* Private macro -------------------------------------------------------------*/
+#ifndef CONFIGURE_AS_PER_COMPOSITION_DATA
+MOBLEUINT16 aSigModelsToBind[][MAX_ELEMENTS_PER_NODE] = {
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ }
+};
+#endif
+
+MOBLEUINT16 aPublishModels[] =
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+// SENSOR_SERVER_MODEL_ID,
+// LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+// LIGHT_MODEL_SERVER_LC_MODEL_ID
+};
+
+MOBLEUINT16 aSubscribeModels[] =
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+// LIGHT_MODEL_SERVER_LC_MODEL_ID
+};
+
+const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[] = {
+ /* MOBLEUINT16 opcode,
+ MOBLEUINT8 min_payload_size,
+ MOBLEUINT8 max_payload_size;
+ Here in this array, Handler is not defined; */
+
+ /* 4.3.2.37 Config AppKey Add, Opcode = 0x00
+ The Config AppKey Add is an acknowledged message used to add an AppKey
+ to the AppKey List on a node and bind it to the NetKey identified by
+ NetKeyIndex. The added AppKey can be used by the node only as a pair with
+ the specified NetKey.
+ The AppKey is used to authenticate and decrypt messages it receives, as well
+ as authenticate and encrypt messages it sends.
+ The response to a Config AppKey Add message is a Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex: 3B : Index of the NetKey and index of the AppKey
+ AppKey 16B : AppKey value */
+ { OPCODE_CONFIG_APPKEY_ADD, 19, 19, aConfigAppKeyDefault },
+
+ /* 4.3.2.39 Config AppKey Delete, Opcode = 0x80 0x00
+ The Config AppKey Delete is an acknowledged message used to delete an
+ AppKey from the AppKey List on a node.
+ The response to a Config AppKey Delete message is a
+ Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex : 3B : Index of the NetKey and index of the AppKey
+ */
+ { OPCODE_CONFIG_APPKEY_DELETE, 3, 3, aConfigAppKeyDeleteDefault },
+
+ /* 4.3.2.41 Config AppKey Get, Opcode = 0x80 0x01
+ The AppKey Get is an acknowledged message used to report all AppKeys bound
+ to the NetKey.
+ The response to a Config AppKey Get message is a Config AppKey List message */
+ { OPCODE_CONFIG_APPKEY_GET, 2, 2, aConfigAppKeyGetDefault },
+
+ /* 4.3.2.38 Config AppKey Update, Opcode = 0x01
+ The Config AppKey Update is an acknowledged message used to update an
+ AppKey value on the AppKey List on a node. The updated AppKey is used by
+ the node to authenticate and decrypt messages it receives, as well as
+ authenticate and encrypt messages it sends, as defined by the Key Refresh procedure (see Section 3.10.4).
+ The response to an Config AppKey Update message is an Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex: 3B : Index of the NetKey and index of the AppKey
+ AppKey 16B : AppKey value */
+ { OPCODE_CONFIG_APPKEY_UPDATE, 19, 19, aConfigAppKeyDefault },
+
+ /* 4.3.2.1 Config Beacon Get, Opcode = 0x80 0x09
+ The Config Beacon Get is an acknowledged message used to get the current
+ Secure Network Beacon state of a node (see Section 4.2.10).
+ The response to a Config Beacon Get message is a Config Beacon Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_BEACON_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.2 Config Beacon Set, Opcode = 0x80 0x0A
+ The Config Beacon Set is an acknowledged message used to set the
+ Secure Network Beacon state of a node (see Section 4.2.10).
+ The response to a Config Beacon Set message is a Config Beacon Status message.
+ Beacon : 1B: New Secure Network Beacon state*/
+ { OPCODE_CONFIG_BEACON_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.4 Config Composition Data Get, Opcode = 0x80 0x08
+ The Config Composition Data Get is an acknowledged message used to read
+ one page of the Composition Data (see Section 4.2.1).
+ The response to a Config Composition Data Get message is a
+ Config Composition Data Status message.
+ Page : 1B : Page number of the Composition Data */
+ { OPCODE_CONFIG_COMPOSITION_DATA_GET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.16 Config Model Publication Set, Opcode = 0x03
+ The Config Model Publication Set is an acknowledged message used to set the
+ Model Publication state (see Section 4.2.2) of an outgoing message that
+ originates from a model.
+ The response to a Config Model Publication Set message is a
+ Config Model Publication Status message.
+ The Config Model Publication Set message uses a single octet opcode to
+ maximize the size of a payload.
+
+ ElementAddress : 16b : Address of the element
+ PublishAddress : 16b : Value of the publish address
+ AppKeyIndex : 12b : Index of the application key
+ CredentialFlag : 1b : Value of the Friendship Credential Flag
+ RFU : 3b : Reserved for Future Use
+ PublishTTL : 8b : Default TTL value for the outgoing messages
+ PublishPeriod : 8b : Period for periodic status publishing
+ PublishRetransmitCount : 3b : Number of retransmissions for each published message
+ PublishRetransmitIntervalSteps : 5b: Number of 50-millisecond steps between retransmissions
+ ModelIdentifier: 16 or 32b: SIG Model ID or Vendor Model ID
+ */
+
+ { OPCODE_CONFIG_CONFIG_MODEL_PUBLICATION_SET, 11, 13, },
+
+ /* 4.3.2.6 Config Default TTL Get, Opcode = 0x80 0x0C
+ The Config Default TTL Get is an acknowledged message used to get the
+ current Default TTL state of a node.
+ The response to a Config Default TTL Get message is a Config Default TTL Status message.
+ There are no Parameters for this message.
+ */
+ { OPCODE_CONFIG_DEFAULT_TTL_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.7 Config Default TTL Set, Opcode = 0x80 0x0D
+ The Config Default TTL Set is an acknowledged message used to set the
+ Default TTL state of a node (see Section 4.2.7).
+ The response to a Config Default TTL Set message is a
+ Config Default TTL Status message.
+ TTL : 1B : New Default TTL value*/
+ { OPCODE_CONFIG_DEFAULT_TTL_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.55 Config Friend Get, Opcode = 0x80 0x0F
+ The Config Friend Get is an acknowledged message used to get the current
+ Friend state of a node (see Section 4.2.13).
+ The response to a Config Friend Get message is a Config Friend Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_FRIEND_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.56 Config Friend Set, Opcode = 0x80 0x10
+ The Config Friend Set is an acknowledged message used to set the
+ Friend state of a node (see Section 4.2.13).
+ The response to a Config Friend Set message is a Config Friend Status message.
+ Friend : 1B : New Friend state */
+ { OPCODE_CONFIG_FRIEND_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.9 Config GATT Proxy Get, Opcode = 0x80 0x12
+ The Config GATT Proxy Get is an acknowledged message used to get the
+ current GATT Proxy state of a node (see Section 4.2.11).
+ The response to a Config GATT Proxy Get message is a
+ Config GATT Proxy Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_GATT_PROXY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.10 Config GATT Proxy Set, Opcode = 0x80 0x12
+ The Config GATT Proxy Set is an acknowledged message used to set the
+ GATT Proxy state of a node (see Section 4.2.11).
+ The response to a Config GATT Proxy Set message is a Config GATT Proxy
+ Status message
+ GATTProxy : 1B : New GATT Proxy state */
+ { OPCODE_CONFIG_GATT_PROXY_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.61 Config Heartbeat Publication Get, Opcode = 0x80 0x38
+ The Config Heartbeat Publication Get is an acknowledged message used to get
+ the current Heartbeat Publication state of an element (see Section 4.2.17).
+ The response to a Config Heartbeat Publication Get message is a
+ Config Heartbeat Publication Status message.
+ The message has no parameters.*/
+ { OPCODE_CONFIG_HEARTBEAT_PUBLICATION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.62 Config Heartbeat Publication Set, Opcode = 0x80 0x39
+ The Config Heartbeat Publication Set is an acknowledged message used to set
+ the current Heartbeat Publication state of an element (see Section 4.2.17).
+ The response to a Config Heartbeat Publication Set message is a
+ Config Heartbeat Publication Status message.
+
+ Destination : 2B : Destination address for Heartbeat messages
+ CountLog : 1B : Number of Heartbeat messages to be sent
+ PeriodLog : 1B : Period for sending Heartbeat messages
+ TTL : 1B : TTL to be used when sending Heartbeat messages
+ Features : 2B : Bit field indicating features that trigger Heartbeat messages when changed
+ NetKeyIndex : 2B : NetKey Index
+ */
+ { OPCODE_CONFIG_HEARTBEAT_PUBLICATION_SET, 9, 9, aNoInitParamDefault },
+
+ /* 4.3.2.64 Config Heartbeat Subscription Get, Opcode = 0x80 0x3A
+ The Config Heartbeat Subscription Get is an acknowledged message used to get
+ the current Heartbeat Subscription state of an element (see Section 4.2.18).
+ The response to a Config Heartbeat Subscription Get message is a
+ Config Heartbeat Subscription Status message.
+ The message has no parameters. */
+ { OPCODE_CONFIG_HEARTBEAT_SUBSCRIPTION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.65 Config Heartbeat Subscription Set, Opcode = 0x80 0x3B
+ The Config Heartbeat Subscription Set is an acknowledged message used to
+ set the current Heartbeat Subscription state of an element (see Section 4.2.18).
+ The response to a Config Heartbeat Subscription Set message is a
+ Config Heartbeat Subscription Status message.
+
+ Source : 2B : Source address for Heartbeat messages
+ Destination : 2B : Destination address for Heartbeat messages
+ PeriodLog : 1B : Period for receiving Heartbeat messages */
+ { OPCODE_CONFIG_HEARTBEAT_SUBSCRIPTION_SET, 5, 5, aNoInitParamDefault },
+
+ /* 4.3.2.58 Config Key Refresh Phase Get, Opcode = 0x80 0x15
+ The Config Key Refresh Phase Get is an acknowledged message used to get the
+ current Key Refresh Phase state of the identified network key.
+ The response to a Config Key Refresh Phase Get message is a
+ Config Key Refresh Phase Status message.
+ NetKeyIndex : 2B : NetKey Index*/
+ { OPCODE_CONFIG_KEY_REFRESH_PHASE_GET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.59 Config Key Refresh Phase Set, Opcode = 0x80 0x16
+ The Config Key Refresh Phase Set is an acknowledged message used to set the
+ Key Refresh Phase state of the identified network key (see Section 4.2.14).
+ The response to a Config Key Refresh Phase Set message is a
+ Config Key Refresh Phase Status message.
+
+ NetKeyIndex : 2B : NetKey Index
+ Transition : 1B : New Key Refresh Phase Transition */
+ { OPCODE_CONFIG_KEY_REFRESH_PHASE_SET, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.2.67 Config Low Power Node PollTimeout Get, Opcode = 0x80 0x2D
+ The Config Low Power Node PollTimeout Get is an acknowledged message used
+ to get the current value of PollTimeout timer of the Low Power node within
+ a Friend node (see Section 3.6.6.1). The message is sent to a Friend node
+ that has claimed to be handling messages by sending ACKs On Behalf Of (OBO)
+ the indicated Low Power node. This message should only be sent to a node
+ that has the Friend feature supported and enabled.
+ The response to a Config Low Power Node PollTimeout Get message is a
+ Config Low Power Node PollTimeout Status message.
+
+ LPNAddress : 2B : The unicast address of the Low Power node */
+ { OPCODE_CONFIG_LOW_POWER_NODE_POLLTIMEOUT_GET, 2, 2, aNoInitParamDefault },
+
+
+ /* 4.3.3.12 Health Attention Get
+ The Health Attention Get is an acknowledged message used to get the current
+ Attention Timer state of an element (see Section 4.2.9).
+ The response to a Health Attention Get message is an Attention Status message.
+ There are no Parameters for this message.*/
+ { OPCODE_HEALTH_ATTENTION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.3.13 Health Attention Set
+ The Health Attention Set is an acknowledged message used to set the
+ Attention Timer state of an element (see Section 4.2.9).
+ The response to a Health Attention Set message is a
+ Health Attention Status message
+ Attention: 1B: Value of the Attention Timer state*/
+ { OPCODE_HEALTH_ATTENTION_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.3.14 Health Attention Set Unacknowledged
+ The Health Attention Set Unacknowledged is an unacknowledged message used
+ to set the Attention Timer state of an element (see Section 4.2.9). */
+ { OPCODE_HEALTH_ATTENTION_SET_UNACKNOWLEDGED, 1, 1, aNoInitParamDefault },
+
+
+
+
+
+
+ /* 4.3.2.15 Config Model Publication Get
+ The Config Model Publication Get is an acknowledged message used to get the
+ publish address and parameters of an outgoing message that originates
+ from a model.
+ The response to a Config Model Publication Get message is a
+ Config Model Publication Status message.
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2 or 4B : SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_PUBLICATION_GET, 4, 6, aNoInitParamDefault },
+
+ /* 4.3.2.17 Config Model Publication Virtual Address Set
+ The Config Model Publication Virtual Address Set is an acknowledged message
+ used to set the model Publication state (see Section 4.2.2) of an
+ outgoing message that originates from a model.
+ The response to a Config Model Publication Virtual Address Set message is
+ a Config Model Publication Status message.
+
+ ElementAddress : 16b : Address of the element
+ PublishAddress : 128b : Value of the Label UUID publish address
+ AppKeyIndex : 12b : Index of the application key
+ CredentialFlag : 1b : Value of the Friendship Credential Flag
+ RFU : 3b : Reserved for Future Use
+ PublishTTL : 8b : Default TTL value for the outgoing messages
+ PublishPeriod : 8b : Period for periodic status publishing
+ PublishRetransmitCount : 3b : Number of retransmissions for each published message
+ PublishRetransmitIntervalSteps : 5b: Number of 50-millisecond steps between retransmissions
+ ModelIdentifier: 16 or 32b: SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_PUBLICATION_VIRTUAL_ADDRESS_SET, 25, 27, aNoInitParamDefault },
+
+ /* 4.3.2.19 Config Model Subscription Add
+ The Config Model Subscription Add is an acknowledged message used to add an
+ address to a Subscription List of a model (see Section 4.2.3).
+
+ The response to a Config Model Subscription Add message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID
+*/
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_ADD, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.21 Config Model Subscription Delete
+ The Config Model Subscription Delete is an acknowledged message used to
+ delete a subscription address from the Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Delete message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_DELETE, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.25 Config Model Subscription Delete All
+ The Config Model Subscription Delete All is an acknowledged message used to
+ discard the Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Delete All message is a
+ Config Model Subscription Status message.
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_DELETE_ALL, 4, 6, aNoInitParamDefault },
+
+ /* 4.3.2.23 Config Model Subscription Overwrite
+ The Config Model Subscription Overwrite is an acknowledged message used to
+ discard the Subscription List and add an address to the
+ cleared Subscription List of a model (see Section 4.2.3).
+
+ The response to a Config Model Subscription Overwrite message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_OVERWRITE, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.20 Config Model Subscription Virtual Address Add
+ The Config Model Subscription Virtual Address Add is an acknowledged message
+ used to add an address to a Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Add message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ Label : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_ADD, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.22 Config Model Subscription Virtual Address Delete
+ The Config Model Subscription Virtual Address Delete is an acknowledged
+ message used to delete a subscription address from the
+ Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Delete message
+ is a Config Model Subscription Status message.
+ ElementAddress : 2B : Address of the element
+ Address : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_DELETE, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.24 Config Model Subscription Virtual Address Overwrite
+ The Config Model Subscription Virtual Address Overwrite is an acknowledged
+ message used to discard the Subscription List and add an address to the
+ cleared Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Overwrite
+ message is a Config Model Subscription Status message.
+ Element Address : 2B : Address of the element
+ Address : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_OVERWRITE, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.69 Config Network Transmit Get
+ The Config Network Transmit Get is an acknowledged message used to get the
+ current Network Transmit state of a node (see Section 4.2.19).
+ The response to a Config Network Transmit Get message is a Config Network
+ Transmit Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NETWORK_TRANSMIT_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.70 Config Network Transmit Set
+ The Config Network Transmit Set is an acknowledged message used to set the
+ Network Transmit state of a node (see Section 4.2.19).
+ The response to a Config Network Transmit Set message is a Config Network
+ Transmit Status message.
+
+ NetworkTransmitCount : 3b : Number of transmissions for each Network PDU originating from the node
+ NetworkTransmitIntervalSteps : 5b : Number of 10-millisecond steps between transmissions
+ */
+ { OPCODE_CONFIG_NETWORK_TRANSMIT_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.12 Config Relay Get
+ The Config Relay Get is an acknowledged message used to get the
+ current Relay (see Section 4.2.8) and Relay Retransmit (see Section 4.2.20)
+ states of a node.
+ The response to a Config Relay Get message is a Config Relay Status message.
+ There are no Parameters for this message.*/
+ { OPCODE_CONFIG_RELAY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.13 Config Relay Set
+ The Config Relay Set is an acknowledged message used to set the Relay
+ (see Section 4.2.8) and Relay Retransmit (see Section 4.2.20) states of a node.
+ The response to a Config Relay Set message is a Config Relay Status message.
+ Relay : 8 bits : Relay
+ RelayRetransmitCount : 3b : Number of retransmissions on advertising bearer for each Network PDU relayed by the node
+ RelayRetransmitIntervalSteps : 5b : Number of 10-millisecond steps between retransmissions
+ */
+ { OPCODE_CONFIG_RELAY_SET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.27 Config SIG Model Subscription Get
+ The Config SIG Model Subscription Get is an acknowledged message used to
+ get the list of subscription addresses of a model within the element.
+ This message is only for SIG Models.
+ The response to a Config SIG Model Subscription Get message is a Config SIG
+ Model Subscription List message.
+ Element Address : 2B : Address of the element
+ ModelIdentifier : 2B : SIG Model ID */
+
+ { OPCODE_CONFIG_SIG_MODEL_SUBSCRIPTION_GET, 4, 4, aNoInitParamDefault },
+
+ /* 4.3.2.29 Config Vendor Model Subscription Get
+ The Config Vendor Model Subscription Get is an acknowledged message used to
+ get the list of subscription addresses of a model within the element.
+ This message is only for Vendor Models.
+ The response to a Config Vendor Model Subscription Get message is a
+ Config Vendor Model Subscription List message.
+ Element Address : 2B : Address of the element
+ ModelIdentifier : 4B : Vendor Model ID */
+
+ { OPCODE_CONFIG_VENDOR_MODEL_SUBSCRIPTION_GET, 6, 6, aNoInitParamDefault },
+
+
+ /* 4.3.3.4 Health Fault Clear
+ The Health Fault Clear is an acknowledged message used to clear the current
+ Registered Fault state identified by Company ID of an element
+ (see Section 4.2.15.2).
+ The response to a Health Fault Clear message is a Health Fault Status message */
+ { OPCODE_HEALTH_FAULT_CLEAR, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.3 Health Fault Clear Unacknowledged
+ The Health Fault Clear Unacknowledged is an unacknowledged message used to
+ clear the current Registered Fault state identified by Company ID of an
+ element (see Section 4.2.15.2).
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+
+ { OPCODE_HEALTH_FAULT_CLEAR_UNACKNOWLEDGED, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.2 Health Fault Get
+ The Health Fault Get is an acknowledged message used to get the current
+ Registered Fault state identified by Company ID of an element
+ (see Section 4.2.15.2).
+ The response to a Health Fault Get message is a Health Fault Status message
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_GET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.5 Health Fault Test
+ The Health Fault Test is an acknowledged message used to invoke a
+ self-test procedure of an element.
+ The procedure is implementation specific and may result in changing the
+ Health Fault state of an element (see Section 4.2.15).
+ The response to a Health Fault Test message is a Health Fault Status message.
+
+ Test ID : 1B : Identifier of a specific test to be performed
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_TEST, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.3.6 Health Fault Test Unacknowledged
+ The Health Fault Test Unacknowledged is an unacknowledged message used to
+ invoke a self-test procedure of an element. The procedure is implementation
+ specific and may result in changing the Health Fault state of an element
+ (see Section 4.2.15).
+
+ Test ID : 1B : Identifier of a specific test to be performed
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_TEST_UNACKNOWLEDGED, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.3.8 Health Period Get
+ The Health Period Get is an acknowledged message used to get the
+ current Health Fast Period Divisor state of an element (see Section 4.2.16).
+ The response to a Health Period Get message is a Health Period Status message.
+ There are no parameters for this message. */
+ { OPCODE_HEALTH_PERIOD_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.3.10 Health Period Set
+ The Health Period Set is an acknowledged message used to set the current
+ Health Fast Period Divisor state of an element (see Section 4.2.16).
+ The response to a Health Period Set message is a Health Period Status message
+
+ FastPeriodDivisor : 1B: Divider for the Publish Period.
+ Modified Publish Period is used for sending Current */
+ { OPCODE_HEALTH_PERIOD_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.3.9 Health Period Set Unacknowledged
+ The Health Period Set Unacknowledged is an unacknowledged message used to
+ set the current Health Fast Period Divisor state of an element
+ (see Section 4.2.16).
+
+ FastPeriodDivisor : 1B: Divider for the Publish Period.
+ Modified Publish Period is used for sending Current
+ Health Status messages when there are active faults to communicate */
+ { OPCODE_HEALTH_PERIOD_SET_UNACKNOWLEDGED, 1, 1, aNoInitParamDefault },
+//// { OPCODE_HEALTH_PERIOD_STATUS 0x8037
+
+
+
+ /* 4.3.2.46 Config Model App Bind
+ The Config Model App Bind is an acknowledged message used to bind an
+ AppKey to a model.
+ The response to a Config Model App Bind message is a
+ Config Model App Status message.
+
+ ElementAddress : 2B : Address of the element
+ AppKeyIndex : 2B : Index of the AppKey
+ ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID */
+
+ { OPCODE_CONFIG_MODEL_APP_BIND, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.47 Config Model App Unbind
+ The Config Model App Unbind is an acknowledged message used to remove the
+ binding between an AppKey and a model.
+ The response to a Config Model App Unbind message is a Config Model App Status message.
+
+
+ ElementAddress : 2B : Address of the element
+ AppKeyIndex : 2B : Index of the AppKey
+ ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_APP_UNBIND, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.31 Config NetKey Add
+ The Config NetKey Add is an acknowledged message used to add a NetKey
+ to a NetKey List (see Section 4.2.4) on a node.
+ The added NetKey is then used by the node to authenticate and decrypt messages it receives, as well as authenticate and encrypt messages it sends.
+ The response to a Config NetKey Add message is a Config NetKey Status message.
+ NetKeyIndex : 2B
+ NetKey : 16B NetKey */
+ { OPCODE_CONFIG_NETKEY_ADD, 18, 18, aNoInitParamDefault },
+
+ /* 4.3.2.33 Config NetKey Delete
+ The Config NetKey Delete is an acknowledged message used to delete a NetKey
+ on a NetKey List from a node.
+ The response to a Config NetKey Delete message is a
+ Config NetKey Status message.
+ NetKeyIndex : 2B */
+ { OPCODE_CONFIG_NETKEY_DELETE, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.35 Config NetKey Get
+ The Config NetKey Get is an acknowledged message used to report all NetKeys
+ known to the node.
+ The response to a Config NetKey Get message is a Config NetKey List message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NETKEY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.32 Config NetKey Update
+ The Config NetKey Update is an acknowledged message used to update a NetKey
+ on a node. The updated NetKey is then used by the node to authenticate and
+ decrypt messages it receives, as well as authenticate and encrypt messages
+ it sends, as defined by the Key Refresh procedure (see Section 3.10.4).
+ The response to a Config NetKey Update message is a Config NetKey Status message.
+ NetKeyIndex : 2B : Index of the NetKey
+ NetKey : 16B : NetKey */
+ { OPCODE_CONFIG_NETKEY_UPDATE, 18, 18, aNoInitParamDefault},
+
+ /* 4.3.2.43 Config Node Identity Get
+ The Config Node Identity Get is an acknowledged message used to get the
+ current Node Identity state for a subnet (see Section 4.2.12).
+ The response to a Config Node Identity Get message is a
+ Config Node Identity Status message.
+
+ NetKeyIndex : 2B : Index of the NetKey */
+ { OPCODE_CONFIG_NODE_IDENTITY_GET, 2, 2, aNoInitParamDefault},
+
+ /* 4.3.2.44 Config Node Identity Set
+ The Config Node Identity Set is an acknowledged message used to set the
+ current Node Identity state for a subnet (see Section 4.2.12).
+ The response to a Config Node Identity Set message is a
+ Config Node Identity Status message.
+
+ NetKeyIndex : 2B : Index of the NetKey
+ Identity : 1B : New Node Identity state */
+ { OPCODE_CONFIG_NODE_IDENTITY_SET, 3, 3, aNoInitParamDefault},
+
+ /* 4.3.2.53 Config Node Reset
+ The Config Node Reset is an acknowledged message used to reset a node
+ (other than a Provisioner) and remove it from the network.
+ The response to a Config Node Reset message is a Config Node Reset
+ Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NODE_RESET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.49 Config SIG Model App Get
+ The Config SIG Model App Get is an acknowledged message used to request
+ report of all AppKeys bound to the SIG Model.
+ The response to a Config SIG Model App Get message is a Config SIG Model
+ App List message.
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2B : SIG Model ID */
+ { OPCODE_CONFIG_SIG_MODEL_APP_GET, 4, 4, aNoInitParamDefault },
+
+ /* 4.3.2.51 Config Vendor Model App Get
+ The Config Vendor Model App Get is an acknowledged message used to request
+ report of all AppKeys bound to the model. This message is only for Vendor Models.
+ The response to a Config Vendor Model App Get message is a Config Vendor Model App List message
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 4B : Vendor Model ID */
+ { OPCODE_CONFIG_VENDOR_MODEL_APP_GET, 6, 6, aNoInitParamDefault },
+
+};
+/* Private variables ---------------------------------------------------------*/
+
+eClientSendMsgState_t eClientSendMsgState; /* Keeps the state of Sent Message */
+eServerRespRecdState_t eServerRespRecdState; /* Keeps the state of Received Message */
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief This function is callback from library after the Provisioning is
+ completed by embedded Provisioner
+* @param prvState: Provisioning State of the Node. Expecting "1" when the
+ provisioning is completed
+* @retval None
+*/
+void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState)
+{
+ if (prvState==1 )
+ {
+ Appli_ConfigClient_Init();
+ eClientSendMsgState = ProvisioningDone_State;
+ NodeInfo.nodePrimaryAddress = GetAddressToConfigure();
+ }
+}
+
+
+/**
+* @brief This function is Init function for the state machine of the
+ Configuration Client. The Function shall be called everytime a new
+ node is provisioned
+* @param None
+* @retval None
+*/
+MOBLE_RESULT Appli_ConfigClient_Init(void)
+{
+ eClientSendMsgState = ClientIdle_State; /* Init the value of state machine */
+ eServerRespRecdState = NodeIdle_State; /* Init the value of state machine */
+ ConfigClient_ResetTrials();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_ConfigClient_Process: This function is Process function and
+ shall be called from while(1) loop
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_Process(void)
+{
+
+ Appli_ConfigClient_ConfigureNode();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief This function is used to configure the Node after provisioning
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 nowClockTime;
+
+ /*
+ State response called function
+ --------------------------------------------------------------------------------
+ ClientIdle_State X None
+ ProvisioningDone_State X Start the configuration
+ CompositionGet_State ConfigRespInit_State GetComposition
+ CompositionGet_State CompositionRecd_State ChangeThe State to next
+ AppKeyAdd_State X Issue AppKey
+ AppKeyAdd_State AppkeyAck_State ChangeThe State to next
+ AppBindModel_State X Issue AppKetBind
+ AppBindModel_State AppBindModelAck_State ChangeThe State to next
+ AddSubscription_State X Issue the Subscription
+ AddSubscription_State SubscriptionAck_State ChangeThe State to next
+ SetPublication_State PublicationStatus_State Issue the Subscription
+ SetPublication_State PublicationStatus_State ChangeThe State to next
+
+ */
+
+ /* If the Node is already configured, return from here */
+ if (eClientSendMsgState == ConfigurationDone_State)
+ return result;
+
+ if (eClientSendMsgState == ClientIdle_State)
+ {
+ /* Waiting for the Provisioning to be done before to Start the
+ node configuration procedure */
+ return result;
+ }
+
+ if (eServerRespRecdState == NodeNoResponse_State)
+ {
+ /* No Response received from Node under Provisioning for some config
+ messages. So, no need to do the trials */
+ return MOBLE_RESULT_FAIL;
+ }
+
+ if (eClientSendMsgState == ProvisioningDone_State)
+ {
+ /* Start the node configuration procedure */
+ eClientSendMsgState = CompositionGet_State;
+ ConfigClient_SaveMsgSendingTime();
+ }
+
+ else if (eClientSendMsgState == CompositionGet_State)
+ {
+ nowClockTime = Clock_Time();
+ if( (nowClockTime - NodeInfo.Initial_time) < CONFIGURATION_START_DELAY)
+ {
+ return result;
+ }
+ /*------------- Add the delay before to start the configuration messages */
+
+ if (eServerRespRecdState == CompositionRecdCompleted_State)
+ {
+ eClientSendMsgState = AppKeyAdd_State; /* Change the state to Next */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the GetComposition servicing */
+ Appli_ConfigClient_GetCompositionData();
+ }
+ }
+
+ else if (eClientSendMsgState == AppKeyAdd_State)
+ {
+ if (eServerRespRecdState == AppkeyAckCompleted_State)
+ {
+ eClientSendMsgState = AppBindModel_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the AppKeyAdd servicing */
+ Appli_ConfigClient_DefaultAppKeyAdd();
+ }
+ }
+
+ else if (eClientSendMsgState == AppBindModel_State)
+ {
+ if (eServerRespRecdState == AppBindModelAckCompleted_State)
+ {
+ eClientSendMsgState = AddSubscription_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the AppKeyBIND servicing */
+ Appli_ConfigClient_DefaultAppKeyBind();
+ }
+ }
+
+ else if (eClientSendMsgState == AddSubscription_State)
+ {
+ if (eServerRespRecdState == SubscriptionAckCompleted_State)
+ {
+ eClientSendMsgState = SetPublication_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the Subscription add servicing */
+ AppliConfigClient_SubscriptionAddDefault();
+ }
+ }
+
+ else if (eClientSendMsgState == SetPublication_State)
+ {
+ if (eServerRespRecdState == PublicationStatusCompleted_State)
+ {
+ eClientSendMsgState = ConfigurationDone_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ TRACE_M(TF_CONFIG_CLIENT,"**Node is configured** \r\n");
+ }
+ else
+ {
+ /* Continue the Publication add servicing */
+ AppliConfigClient_PublicationSetDefault();
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief This function is called to Get the Composition data from the
+* a node under configuration
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+ MOBLEUINT16 dst_peer;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+
+ ConfigClient_SaveMsgSendingTime();
+
+ dst_peer = GetAddressToConfigure();
+
+ /* Start the Get Composition Message */
+ ConfigClient_CompositionDataGet(dst_peer);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ break;
+
+ case CompositionRecd_State:
+ /* Switch the state to next state AddAppKey_State */
+ ConfigClient_ResetTrials();
+ eServerRespRecdState = CompositionRecdCompleted_State;
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
+ }
+
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyAdd: This function is called to
+ add the default AppKeys and NetKeys to a node under configuration
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+ MOBLEUINT8 *pAppKey;
+ MOBLEUINT16 netKeyIndex = DEFAULT_NETKEY_INDEX;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLE_ADDRESS dst_addr;
+
+ pAppKey = GetNewProvNodeAppKey();
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ ConfigClient_SaveMsgSendingTime();
+
+ dst_addr = GetAddressToConfigure();
+
+ /* Start the Set Appkey message */
+ ConfigClient_AppKeyAdd ( dst_addr,
+ netKeyIndex,
+ appKeyIndex,
+ pAppKey);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ break;
+
+ case AppkeyAck_State:
+ ConfigClient_ResetTrials();
+ eServerRespRecdState = AppkeyAckCompleted_State;
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
+ }
+
+ break;
+
+ default:
+ /* Error State */
+ break;
+}
+
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
+ function to Bind the element(node) with AppKeyIndex and Models
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
+{
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the AppBindModel_State message */
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ modelIdentifier = GetSIGModelToBindApp(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeSendMessage_State:
+ /* Start the AppBindModel_State message */
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Send the Message to the server */
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ break;
+
+ case AppBindModelAck_State:
+ /* Need to check if all SIG Models are binded ? */
+
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ numVendorModels = GetCountVendorModelToBindApp(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ /* Switch to InProgress_State */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ /*Now, do binding for Vendor Model */
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+ if (elementIndex >= numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+
+ eServerRespRecdState = AppBindModelAckCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SubscriptionAddDefault: This function is application
+ used for adding subscription to the element(node) for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
+{
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT16 elementAddress;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the SubscriptionAdd message */
+
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ modelIdentifier = GetSIGModelToSubscribe(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeSendMessage_State:
+ elementAddress = GetServerElementAddress(elementIndex);
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+
+ break;
+
+
+ case SubscriptionAck_State:
+ /* Need to check if all SIG Models are subscribed ? */
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ numVendorModels = GetCountVendorModelToSubscribe(elementIndex);
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+
+ /* Get the Next Model and Bind it again till all SIG Models are binded */
+ eServerRespRecdState = NodeNextSigModel_State;
+
+ }
+ else if (indexVendormodels < numVendorModels)
+{
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+ if (elementIndex == numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+ eServerRespRecdState = SubscriptionAckCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ indexSIGmodels =0; /* Reset the variable again for the next element */
+ indexVendormodels = 0;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_PublicationSetDefault: This function is application
+ used for adding publication settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
+{
+ MOBLEUINT16 publishAddress = DEFAULT_PUBLISH_ADDR;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT8 credentialFlag = DEFAULT_CREDENTIAL_FLAG;
+ MOBLEUINT8 publishTTL = DEFAULT_PUBLISH_TTL;
+ MOBLEUINT8 publishPeriod = DEFAULT_PUBLISH_PERIOD;
+ MOBLEUINT8 publishRetransmitCount = DEFAULT_PUBLISH_RETRANSMIT_COUNT;
+ MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
+
+ static MOBLEUINT16 elementAddress;
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the Publication Add message */
+
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ modelIdentifier = GetSIGModelToPublish(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels);
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+
+ case NodeSendMessage_State:
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+
+ break;
+
+
+ case PublicationStatus_State:
+ /* Need to check if all SIG Models are subscribed ? */
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ numVendorModels = GetCountVendorModelToPublish(elementIndex);
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+ eServerRespRecdState = NodeNextSigModel_State;
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+
+ if (elementIndex == numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+ eServerRespRecdState = PublicationStatusCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ indexSIGmodels =0; /* Reset the variable again for the next element */
+ indexVendormodels = 0;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SelfPublicationSetDefault: This function is application
+ used for adding publication settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
+{
+ MOBLEUINT16 publishAddress = DEFAULT_PUBLISH_ADDR;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT8 credentialFlag = DEFAULT_CREDENTIAL_FLAG;
+ MOBLEUINT8 publishTTL = DEFAULT_PUBLISH_TTL;
+ MOBLEUINT8 publishPeriod = DEFAULT_PUBLISH_PERIOD;
+ MOBLEUINT8 publishRetransmitCount = DEFAULT_PUBLISH_RETRANSMIT_COUNT;
+ MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
+
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT8 elementIndex;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+ }
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SelfSubscriptionSetDefault: This function is application
+ used for adding Subscription settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
+{
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ /*If limit is reaching to no models*/
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
+
+ /*Checking for Vendor Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
+
+ }
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
+ function to Bind the element(node) with AppKeyIndex and Models
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
+{
+
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT8 elementIndex;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ appKeyIndex = DEFAULT_APPKEY_INDEX;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
+
+ }
+ return result;
+}
+
+/**
+* @brief Appli_CompositionDataStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
+{
+ eServerRespRecdState = CompositionRecd_State;
+}
+
+
+/**
+* @brief Appli_AppKeyStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_AppKeyStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = AppkeyAck_State;
+}
+
+
+/**
+* @brief Appli_AppBindModelStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = AppBindModelAck_State;
+}
+
+
+/**
+* @brief Appli_SubscriptionAddStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = SubscriptionAck_State;
+}
+
+
+/**
+* @brief Appli_PublicationStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_PublicationStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = PublicationStatus_State;
+}
+
+
+/**
+* @brief Appli_NodeResetStatusCb: This function is callback from config
+ client middleware on reception of the Node Reset response
+* @param None
+* @retval None
+*/
+void Appli_NodeResetStatusCb(void)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = NodeResetStatus_State;
+}
+
+
+/**
+* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+{
+
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ MOBLEUINT16 model_id;
+ MOBLEUINT8 index;
+ MOBLEUINT8 idxSIG = *pModelIndex;
+
+ for (index = idxSIG; index < numberOfModels ; index++ )
+ {
+ model_id = aNodeElements[elementIndex].aSIGModels[index];
+ if (MODEL_IS_FOUNDATION_MODEL(model_id))
+ {
+ /* Do nothing, let the next model_if be scanned */
+ model_id = 0xffff; /* Invalid Model ID */
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *pModelIndex = index;
+ return model_id;
+#else
+ return aSigModelsToBind[idxSIG][elementIdx] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[indexModels];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+/**
+* @brief GetCountSIGModelToBindApp: This function gets the NUMBER of SIG Model
+ to Bind
+* @param elementIndex Index of the Element for which the Count is needed
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element for which the Count is needed
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_BIND_APP;
+#endif
+}
+
+
+/**
+* @brief GetSIGModelToPublish: This function gets the SIG Model to Publish
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
+#else
+ return aPublishModels[idxSIG] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @param idxSIG Pointer to Index of the Model
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+
+/**
+* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_PUBLISH;
+#endif
+}
+
+
+/**
+* @brief GetSIGModelToSubscribe: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
+#else
+ return aSubscribeModels[idxSIG] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToSubscribe: This function Gets the Vendor Model ID for
+ Subscription
+* @param elementIndex Index of the Element
+* @param idxSIG Index to the Model ID to Subscribe
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 idxSIG)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+
+/**
+* @brief GetCountSIGModelToSubscribe: This function gets the SIG Model to Subscribe
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToPublish: This function gets the Count of the
+ Vendor Model to Subscribe
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
+#endif
+}
+
+
+/**
+* @brief AppliConfigClient_SendMessageDefault: This function is used for sending
+ a message.
+ ** The Function is not yet written fully
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
+{
+ return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h
new file mode 100644
index 000000000..da4633bd3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h
@@ -0,0 +1,89 @@
+/**
+******************************************************************************
+* @file appli_config_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_CONFIG_CLIENT_H
+#define __APPLI_CONFIG_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+#include "config_client.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+#define CONFIGURE_AS_PER_COMPOSITION_DATA
+#define MAX_CONFIG_PARAM_SIZE 22
+
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Init(void);
+MOBLE_RESULT Appli_ConfigClient_Process(void);
+MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
+void Appli_CompositionDataStatusCb(MOBLE_RESULT);
+void Appli_AppKeyStatusCb(MOBLEUINT8 status);
+void Appli_AppBindModelStatusCb(MOBLEUINT8 status);
+void Appli_PublicationStatusCb(MOBLEUINT8 status);
+void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status);
+void Appli_NodeResetStatusCb(void);
+
+void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState);
+MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void);
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void);
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void);
+MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void);
+MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void);
+MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void);
+MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void);
+MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void);
+Composition_Data_Page0_t* Appli_GetNodeCompositionBuff (void);
+
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx);
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx);
+
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8);
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8);
+
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
+
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+
+
+#endif /* __APPLI_CONFIG_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c
new file mode 100644
index 000000000..57c1bc7cf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c
@@ -0,0 +1,457 @@
+/**
+ ******************************************************************************
+ * @file appli_generic.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Generic Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "mesh_cfg.h"
+#include "generic.h"
+#include "light.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application_Mesh_Models
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+extern MOBLEUINT8 RestoreFlag;
+extern MOBLEUINT16 IntensityValue;
+extern MOBLEUINT8 IntensityFlag;
+extern MOBLEUINT8 PowerOnOff_flag;
+extern Appli_LightPwmValue_t Appli_LightPwmValue;
+Appli_Generic_OnOffSet AppliOnOffSet;
+Appli_Generic_LevelSet AppliLevelSet;
+Appli_Generic_PowerOnOffSet AppliPowerOnSet;
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet;
+
+/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid);
+/* Private functions ---------------------------------------------------------*/
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+/**
+* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* when Generic OnOff message is received
+* @param pGeneric_OnOffParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
+
+
+ /* This condition is applicable when user want to on off the light with some default
+ * transition value, or optionalValid =IN_TRANSITION , transition is in progress.
+ */
+ if((OptionalValid == DEFAULT_TRANSITION) || (OptionalValid == IN_TRANSITION))
+ {
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet.Present_OnOffValue;
+ Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
+ if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+ {
+ AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ }
+ else
+ {
+ AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ }
+
+ if(AppliOnOffSet.Present_OnOffValue > 16000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+ else
+ {
+ if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+
+/**
+* @brief Appli_Generic_OnOff_Status: This function is callback for Application
+* when Generic OnOff message is received
+* @param pOnOff_status: Pointer to the parameters received for message
+* @param plength: length of the data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Present OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Target OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", pOnOff_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+/**
+* @brief Appli_Generic_Level_Set: This function is callback for Application
+* when Generic Level message is received
+* @param plevelParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
+ MOBLEUINT8 OptionalValid)
+{
+ MOBLEUINT16 duty;
+ static MOBLEUINT16 previousIntensity = 0;
+
+ AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet.Present_Level16 <= 0)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+
+ IntensityValue = AppliLevelSet.Present_Level16;
+
+ if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
+ IntensityValue == INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = MOBLE_FALSE;
+ }
+ else
+ {
+ IntensityFlag = MOBLE_TRUE;
+ }
+ previousIntensity = IntensityValue;
+
+ if(AppliLevelSet.Present_Level16 < 0x00)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+ duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",AppliLevelSet.Present_Level16);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_LEVEL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ /* For demo, if Level is more than 100, switch ON the LED */
+ if(AppliLevelSet.Present_Level16 >= 50)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_Delta_Set: This function is callback for Application
+* when Generic Level Delta message is received
+* @param pdeltalevelParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+
+ /* For demo, if Level is more than 50, switch ON the LED */
+ if (AppliLevelSet.Present_Level16 >= 50)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+ BSP_LED_Off(LED_BLUE);
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Generic_Move_Set: This function is callback for Application
+* when Generic Level Move message is received
+* @param pdeltaMoveParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ if(OptionalValid == 1)
+ {
+ AppliLevelSet.Present_Level16= pdeltaMoveParam->Present_Level16;
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+ /**
+* @brief Appli_Generic_Level_Status: This function is callback for Application
+* when Generic Level Move message is received
+* @param plevel_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_LEVEL */
+
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+/**
+* @brief Appli_Generic_PowerOnOff_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pPowerOnOffParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+
+ /* set the flag value for NVM store */
+ //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+/**
+* @brief Appli_Generic_PowerOnOff_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param powerOnOff_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF */
+
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+/**
+* @brief Appli_Generic_DefaultTransitionTime_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pDefaultTimeParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_DefaultTransitionTime_Status: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pTransition_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
+
+
+/**
+* @brief Appli_Generic_GetOnOffState: This function is callback for Application
+* when Generic on off status message is to be provided
+* @param pOnOff_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+{
+
+ *pOnOff_Status = AppliOnOffSet.Present_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
+ AppliOnOffSet.Present_OnOff);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetOnOffValue: This function is callback for Application
+ to get the PWM value for the generic on off
+* @param pOnOff_Value: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+{
+
+ *pOnOff_Value = AppliOnOffSet.Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet.Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet.TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet.TargetValue >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Value: Value %d!\n\r",
+ AppliOnOffSet.Present_OnOffValue);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetLevelStatus: This function is callback for Application
+ when Generic Level status message is to be provided
+* @param pLevel_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+{
+ *pLevel_Status = AppliLevelSet.Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
+ *pLevel_Status);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetPowerOnOffStatus: This function is callback for Application
+* when Generic Get Power status message is to be provided
+* @param pLevel_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+{
+ *pPower_Status = AppliPowerOnSet.PowerOnState;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
+ AppliPowerOnSet.PowerOnState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetDefaultTransitionStatus: This function is callback for
+* Application when Generic Level status message is to be provided
+* @param pTransition_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+{
+ *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
+ TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
+ AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h
new file mode 100644
index 000000000..41228825e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h
@@ -0,0 +1,115 @@
+/**
+ ******************************************************************************
+ * @file appli_generic.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Generic Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_GENERIC_H
+#define __APPLI_GENERIC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* user configuration for Battery status */
+#define BATTERY_ABSENT 0X00
+#define BATTERY_PRESENT_REMOVABLE 0X01
+#define BATTERY_PRESENT_NON_REMOVABLE 0X02
+#define BATTERY_UNKNOWN 0X03
+#define BATTERY_CRITICAL_LOW_LEVEL 0X00
+#define BATTERY_LOW_LEVEL 0X01
+#define BATTERY_GOOD_LEVEL 0X02
+#define BATTERY_LEVEL_UNKNOWN 0X03
+#define BATTERY_NOT_CHARGEABLE 0X00
+#define BATTERY_NOT_CHARGING 0X01
+#define BATTERY_IS_CHARGING 0X02
+#define BATTERY_CHARGING_UNKNOWN 0X03
+#define BATTERY_SERVICE_RFU 0X00
+#define BATTERY_REQUIRE_NO_SERVICE 0X01
+#define BATTERY_REQUIRE_SERVICE 0X02
+#define BATTERY_SERVICE_UNKNOWN 0X03
+
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 Present_OnOff;
+ MOBLEUINT16 Present_OnOffValue;
+ MOBLEUINT16 TargetValue;
+}Appli_Generic_OnOffSet;
+
+typedef struct
+{
+ MOBLEINT16 Present_Level16;
+}Appli_Generic_LevelSet;
+
+typedef struct
+{
+ MOBLEINT16 PowerOnState;
+}Appli_Generic_PowerOnOffSet;
+
+typedef struct
+{
+ MOBLEUINT8 DefaultTransitionTime;
+}Appli_Generic_DefaultTransitionSet;
+
+typedef struct
+{
+ MOBLEUINT8 Is_BatteryPresent;
+ MOBLEUINT8 Is_Chargeable;
+ MOBLEUINT8 Is_Serviceable;
+}Appli_BatteryUserflag_param_t;
+#pragma pack(4)
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
+ MOBLEUINT32 plength);
+
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status) ;
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength);
+
+
+#endif /* __APPLI_GENERIC_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c
new file mode 100644
index 000000000..0c36b2294
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c
@@ -0,0 +1,101 @@
+/**
+******************************************************************************
+* @file appli_generic_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "generic_client.h"
+#include "appli_generic_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+MOBLEUINT8 Led_Value;
+/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* when Generic OnOff message is called
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pGeneric_OnOffParam[2];
+
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value;
+ GenericClient_OnOff_Set_Unack(elementAddr,
+ (_Generic_OnOffParam*) pGeneric_OnOffParam,
+ sizeof(pGeneric_OnOffParam) );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/**
+* @brief Appli_Generic_Level_Set: This function is callback for Application
+* when Generic Level message is called
+* @param void:
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ GenericClient_Level_Set_Unack(elementAddr,
+ (_Generic_LevelParam*) pGeneric_LevelParam,
+ sizeof(pGeneric_LevelParam));
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h
new file mode 100644
index 000000000..eb1c7dcf2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h
@@ -0,0 +1,44 @@
+/**
+******************************************************************************
+* @file appli_generic_client.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_GENERIC_CLIENT_H
+#define __APPLI_GENERIC_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
+MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void);
+
+
+#endif /* __APPLI_GENERIC_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c
new file mode 100644
index 000000000..02c6cb8c2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c
@@ -0,0 +1,1312 @@
+/**
+ ******************************************************************************
+ * @file appli_light.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Lighting Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "light.h"
+#include "appli_light.h"
+#include "appli_generic.h"
+#include "common.h"
+#include "mesh_cfg.h"
+#include "PWM_handlers.h"
+#include "PWM_config.h"
+#include "appli_nvm.h"
+#include "math.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING Lightness MODEL
+*******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+
+Appli_Light_lightnessSet ApplilightnessSet = {1,0,0,0,0,0};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet;
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
+/******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING CTL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+
+Appli_Light_CtlSet AppliCtlSet;
+Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet;
+Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
+/******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING HSL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+ Appli_Light_HslSet AppliHslSet;
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet = {0x7FFF,0x7FFF,0x7FFF};
+ Appli_Light_RGBSet Appli_RGBParam;
+ Appli_Light_HslRangeSet AppliHslRangeSet;
+
+/*******************************************************************************/
+#endif /*End of the LIGHTING HSL MODEL variables */
+/*******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the RGB board.
+*******************************************************************************/
+
+Appli_LightPwmValue_t Appli_LightPwmValue;
+extern MOBLEUINT8 RestoreFlag;
+extern MOBLEUINT8 PowerOnOff_flag;
+extern MOBLEUINT8 IntensityFlag;
+extern MOBLEUINT16 IntensityValue;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+/**
+* @brief Appli_Light_Lightness_Set: This function is callback for Application
+* when Light Lightness Set message is received
+* @param pLight_LightnessParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 OptionalValid)
+{
+ MOBLEUINT16 duty;
+ static MOBLEUINT16 previousIntensity = 0;
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+
+ if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
+ {
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ }
+
+ if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
+ IntensityValue == INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = MOBLE_FALSE;
+ }
+ else
+ {
+ IntensityFlag = MOBLE_TRUE;
+ }
+ previousIntensity = IntensityValue;
+
+ /* For demo, if Level is more than 100, switch ON the LED */
+ if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+
+ duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+
+/**
+* @brief Appli_Light_Lightness_Status: This function is callback for Application
+* when Light Lightness status message is received
+* @param pLightness_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+/**
+* @brief Appli_Light_Lightness_Linear_Set: This function is callback for Application
+* when Light Lightness Linear Set message is received
+* @param pLight_LightnessLinearParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
+ MOBLEUINT8 OptionalValid)
+{
+ ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Linear_Status: This function is callback for Application
+* when Light Lightness Linear status message is received
+* @param pLightnessLinear_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+/**
+* @brief Appli_Light_Lightness_Default_Set: This function is callback for Application
+* when Light Lightness Default Set message is received
+* @param pLight_LightnessDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Default_Status: This function is callback for Application
+* when Light Lightness Default status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+/**
+* @brief Appli_Light_Lightness_Range_Set: This function is callback for Application
+* when Light Lightness Range Set message is received
+* @param pLight_LightnessRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+
+ TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Range_Status: This function is callback for Application
+* when Light Lightness range ststus message is received
+* @param pLightnessRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+/**
+* @brief Appli_Light_Ctl_Set: This function is callback for Application
+* when Light Ctl Set message is received
+* @param pLight_CtlParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
+ MOBLEUINT8 OptionalValid)
+{
+ float colourRatio;
+ float brightRatio;
+ TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+
+ AppliCtlSet.PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet.PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet.PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
+ colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+
+ Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
+ Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
+
+ Rgb_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ TRACE_M(TF_SERIAL_CTRL,"#825E%04hx%04hx%04hx!\n\r",
+ AppliCtlSet.PresentLightness16,
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Ctl_Status: This function is callback for Application
+* when Light CTL status message is received
+* @param pLightCtl_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+/**
+* @brief Appli_Light_CtlTemperature_Set: This function is callback for Application
+* when Light Ctl Temperature Set message is received
+* @param pLight_CtltempParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
+ MOBLEUINT8 OptionalValid)
+{
+ float colourRatio;
+ float brightRatio;
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
+ AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+
+ Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
+ Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
+
+ Rgb_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_CtlTemperature_Status: This function is callback for Application
+* when Light CTL temperature status message is received
+* @param pLightCtlTemp_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+/**
+* @brief Appli_Light_CtlTemperature_Range_Set: This function is callback for Application
+* when Light Ctl Temperature range Set message is received
+* @param pLight_CtlTempRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+/**
+* @brief Appli_Light_CtlTemperature_Range_Set: This function is callback for Application
+* when Light CTL temperature range status message is received
+* @param pCtlTempRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+/**
+* @brief Appli_Light_CtlDefault_Set: This function is callback for Application
+* when Light Ctl Default Set message is received
+* @param pLight_CtlDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_CtlDefault_Status: This function is callback for Application
+* when Light CTL Default status message is received
+* @param pCtlDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+/**
+* @brief Appli_Light_Hsl_Set: This function is callback for Application
+* when Light Hsl Set message is received
+* @param pLight_HslParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+
+ /* Function to convert HSL values in RGB values */
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ /* when HSL is set, make CTL pwm will bw zero */
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Hsl_Status: This function is callback for Application
+* when Light HSL status message is received
+* @param pHsl_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+/**
+* @brief Appli_Light_HslHue_Set: This function is callback for Application
+* when Light Hsl Hue Set message is received
+* @param pLight_HslHueParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+
+/**
+* @brief Appli_Light_HslHue_Status: This function is callback for Application
+* when Light HSL HUE status message is received
+* @param pHslHue_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+/**
+* @brief Appli_Light_HslSaturation_Set: This function is callback for Application
+* when Light Hsl Saturation Set message is received
+* @param pLight_HslSaturationParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslSaturation_Status: This function is callback for Application
+* when Light HSL Saturation status message is received
+* @param pHslSaturation_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+/**
+* @brief Appli_Light_HslDefault_Set: This function is callback for Application
+* when Light Hsl Default Set message is received
+* @param pLight_HslDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+
+ AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
+ AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
+ AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslDefault_Status: This function is callback for Application
+* when Light HSL Default status message is received
+* @param pHslDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+/**
+* @brief Appli_Light_HslRange_Set: This function is callback for Application
+* when Light Hsl Range Set message is received
+* @param pLight_HslRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslRange_Status: This function is callback for Application
+* when Light HSL range status message is received
+* @param pHslRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+#endif
+
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING Lightness MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+
+/**
+* @brief Appli_Light_GetLightnessStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLightnessState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+{
+ *(lLightnessState) = ApplilightnessSet.PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessLinearStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLightnessState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+{
+ *(lLightnessState) = ApplilightnessLinearSet.PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet.PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Linear Status: present: %d last: %d\n\r",
+ ApplilightnessLinearSet.PresentState16,
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+{
+ *(lDefaultState) = ApplilightnessSet.LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
+ ApplilightnessSet.LightnessDefault);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessLastStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLastState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+{
+ *(lLastState) = ApplilightnessSet.LastLightness16;
+ *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
+
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetLightnessRangeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lRangeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+{
+ *(lRangeState) = ApplilightnessSet.StatusCode;
+ *(lRangeState+1) = ApplilightnessSet.RangeMin;
+ *(lRangeState+2) = ApplilightnessSet.RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet.RangeMax;
+ *(lRangeState+4) = ApplilightnessSet.RangeMax >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Range Status: status: %d Min: %d Max: %d\n\r",
+ ApplilightnessSet.StatusCode,
+ ApplilightnessSet.RangeMin,
+ ApplilightnessSet.RangeMax);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING CTL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+
+/**
+* @brief Appli_Light_GetCtlLightStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlLightState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+{
+ *(lCtlLightState) = AppliCtlSet.PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet.PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet.PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet.PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet.PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet.PresentCtlDelta16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Light Status: lightness: %d temp: %d delta: %d\n\r",
+ AppliCtlSet.PresentLightness16,
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlTeperatureStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlTempState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+{
+ *(lCtlTempState) = AppliCtlSet.PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet.PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet.PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet.PresentCtlDelta16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Temperature Status: temp: %d delta: %d\n\r",
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlTemperatureRange: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlTempRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+{
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet.StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet.RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet.RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet.RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet.RangeMax >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Temperature Range: status: %d Min: %d Max: %d\n\r",
+ AppliCtlTemperatureRangeSet.StatusCode,
+ AppliCtlTemperatureRangeSet.RangeMin,
+ AppliCtlTemperatureRangeSet.RangeMax);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+{
+ *(lCtlDefaultState) = AppliCtlDefaultSet.CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet.CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet.CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet.CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet.CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet.CtlDefaultDeltaUv >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Default Status: lightness: %d temp: %d deltaUV: %d\n\r",
+ AppliCtlDefaultSet.CtlDefaultLightness16,
+ AppliCtlDefaultSet.CtlDefaultTemperature16,
+ AppliCtlDefaultSet.CtlDefaultDeltaUv);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING HSL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+/**
+* @brief Appli_Light_GetHslStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+{
+ *(lHslState) = AppliHslSet.HslLightness16;
+ *(lHslState+1) = AppliHslSet.HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet.HslHueLightness16;
+ *(lHslState+3) = AppliHslSet.HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet.HslSaturation16;
+ *(lHslState+5) = AppliHslSet.HslSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Status: lightness: %d hue: %d saturation: %d\n\r",
+ AppliHslSet.HslLightness16,
+ AppliHslSet.HslHueLightness16,
+ AppliHslSet.HslSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslHueStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslHueState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+{
+ *(lHslHueState) = AppliHslSet.HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
+ AppliHslSet.HslHueLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetHslSaturationStatus: This function is callback for Application
+* to get the application values in middleware used for transition change
+* @param lHslSaturationState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+{
+ *(lHslSaturationState) = AppliHslSet.HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
+ AppliHslSet.HslSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+{
+ *(lHslDefaultState) = Appli_HslDefaultSet.HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet.HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet.HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet.HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet.HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet.HslDefaultSaturation16 >>8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslSatRange: This function is callback for Application
+* to get the application values in middleware used for transition change
+* @param lHslSatRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+{
+ *(lHslSatRange) = AppliHslRangeSet.StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet.HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet.HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet.HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet.HslMaxSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Range: status: %d min: %d max: %d\n\r",
+ AppliHslRangeSet.StatusCode,
+ AppliHslRangeSet.HslMinSaturation16,
+ AppliHslRangeSet.HslMaxSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslHueRange: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslHueRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+{
+ *(lHslHueRange) = AppliHslRangeSet.StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet.HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet.HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet.HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet.HslHueMaxRange16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Range: status: %d min: %d max: %d\n\r",
+ AppliHslRangeSet.StatusCode,
+ AppliHslRangeSet.HslHueMinRange16,
+ AppliHslRangeSet.HslHueMaxRange16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_SERVER_HSL */
+/******************************************************************************/
+
+/* This Function used to initialise the PWM . This is used for the RGB board */
+void Appli_Light_PwmInit()
+{
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmCoolValue = 0;
+ Appli_LightPwmValue.PwmWarmValue = 0;
+ Appli_LightPwmValue.PwmRedValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmGreenValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmBlueValue = PWM_VALUE_OFF;
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+
+/**
+* @brief Function to convert the map the RGB values in real values.
+* @param value1: This value corresponds to red led.
+* @param value2: This value corresponds to green led .
+* @param value3: This value corresponds to blue led .
+* @retval void
+*/
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+{
+ Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+}
+
+/**
+* @brief Function to convert the HSL values in RGB values.
+* @param void
+* @retval void
+*/
+void HSL2RGB_Conversion(void)
+{
+
+ MOBLEUINT16 hueValue;
+ float lightnessvalue;
+ float saturationValue;
+ MOBLEUINT16 cValue; /* chroma */
+ MOBLEUINT16 mValue; /* intermediate value used for creating the r,g,b baseline */
+ MOBLEUINT16 xValue; /* intermediate value used for computing r,g,b */
+
+ if(AppliHslSet.HslSaturation16 == 0)
+ {
+ Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ }
+ else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ {
+ Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ }
+ else
+ {
+ /* Hue is calculated for angular value. so converting in between 0 to 360 degree */
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet.HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet.HslLightness16/65535;
+ saturationValue = (float)AppliHslSet.HslSaturation16/65535;
+
+ /* Formula to get the values used for RGB conversion */
+ cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
+ mValue = (MOBLEUINT16)((lightnessvalue * 1000) - (cValue/2));
+ xValue = (MOBLEUINT16)(cValue * (1 - fabs(fmod(hueValue / 60.0, 2.0) - 1)));
+
+ /* Conditons applied for the different angle of hue value */
+ if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
+ {
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
+ {
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
+ {
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 2)
+ && hueValue < (2 * HUE_UPPER_LIMIT / 3))
+ {
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ }
+ else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
+ && hueValue < (5 * HUE_UPPER_LIMIT / 6))
+ {
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ }
+ else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
+ {
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ }
+ else
+ {
+ RgbF_Create(mValue, mValue, mValue);
+ }
+ }
+}
+
+#endif
+
+/**
+* @brief Rgb_LedOffState: This function is called while using CTL, makes all the RGB
+* PWM off state for Application.
+* @param void:
+* @retval void
+*/
+void Rgb_LedOffState(void)
+{
+ Appli_LightPwmValue.PwmRedValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmGreenValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmBlueValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+}
+
+/**
+* @brief Ctl_LedOffState: This function is called while using HSL, makes all the
+* cool Warm PWM off state for Application.
+* @param void:
+* @retval void
+*/
+void Ctl_LedOffState(void)
+{
+ Appli_LightPwmValue.PwmWarmValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmCoolValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+}
+
+/**
+* @brief Function to set the values for PWM for RGB board.
+* @param state: decided the state of PWM according to the condition.
+* @retval void
+*/
+void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
+{
+
+#ifndef USER_BOARD_1LED
+ if(light_state.IntensityValue > 0)
+ {
+#ifdef USER_BOARD_COOL_WHITE_LED
+ if((light_state.PwmCoolValue == 0) && (light_state.PwmWarmValue == 0))
+ light_state.PwmWarmValue = light_state.IntensityValue;
+#endif
+#ifdef USER_BOARD_RGB_LED
+ if((light_state.PwmRedValue == PWM_VALUE_OFF) &&
+ (light_state.PwmGreenValue == PWM_VALUE_OFF) &&
+ (light_state.PwmBlueValue == PWM_VALUE_OFF))
+ light_state.PwmBlueValue = light_state.IntensityValue;
+#endif
+ }
+#endif
+
+ if(state == RESUME_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+
+#ifdef USER_BOARD_RGB_LED
+
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+
+ }
+ else if(state == RESET_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, PWM_VALUE_OFF);
+#endif
+#ifdef USER_BOARD_COOL_WHITE_LED
+ Modify_PWM(COOL_LED, 0);
+ Modify_PWM(WARM_LED, 0);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, PWM_VALUE_OFF);
+ Modify_PWM(GREEN_LED, PWM_VALUE_OFF);
+ Modify_PWM(BLUE_LED, PWM_VALUE_OFF);
+#endif
+ }
+ else if(state == LOAD_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+ }
+ else
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+ light_state.PwmCoolValue = PWM_DEFAULT_VALUE;
+
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+ }
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h
new file mode 100644
index 000000000..aaa600146
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h
@@ -0,0 +1,196 @@
+/**
+ ******************************************************************************
+ * @file appli_light.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Light Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_H
+#define __APPLI_LIGHT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "light.h"
+
+/* Exported macro ------------------------------------------------------------*/
+#define HUE_UPPER_LIMIT 360
+/* Exported variables -------------------------------------------------------*/
+
+/* Light Lightness set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 PresentState16;
+ MOBLEUINT16 LastLightness16;
+ MOBLEUINT16 LightnessDefault;
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 RangeMin;
+ MOBLEUINT16 RangeMax;
+}Appli_Light_lightnessSet;
+
+
+/* Light Lightness Linear set */
+typedef struct
+{
+ MOBLEUINT16 PresentState16;
+}Appli_Light_lightnessLinearSet;
+
+/* Light Ctl Set */
+typedef struct
+{
+ MOBLEUINT16 PresentLightness16;
+ MOBLEUINT16 PresentTemperature16;
+ MOBLEINT16 PresentCtlDelta16;
+}Appli_Light_CtlSet;
+
+/* Light Ctl Temperature Range Set */
+typedef struct
+{
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 RangeMin;
+ MOBLEUINT16 RangeMax;
+}Appli_Light_CtlTemperatureRangeSet;
+
+/* Light Ctl Default set */
+typedef struct
+{
+ MOBLEUINT16 CtlDefaultLightness16;
+ MOBLEUINT16 CtlDefaultTemperature16;
+ MOBLEINT16 CtlDefaultDeltaUv;
+}Appli_Light_CtlDefaultSet;
+
+/* Light Hsl Hue set */
+typedef struct
+{
+ MOBLEUINT16 HslLightness16;
+ MOBLEUINT16 HslHueLightness16;
+ MOBLEUINT16 HslSaturation16;
+}Appli_Light_HslSet;
+
+/* Light Hsl Hue set */
+typedef struct
+{
+ MOBLEUINT16 HslDefaultLightness16;
+ MOBLEUINT16 HslDefaultHueLightness16;
+ MOBLEUINT16 HslDefaultSaturation16;
+}Appli_Light_HslDefaultSet;
+
+typedef struct
+{
+ MOBLEUINT16 Red_Value;
+ MOBLEUINT16 Green_Value;
+ MOBLEUINT16 Blue_Value;
+}Appli_Light_RGBSet;
+
+typedef struct
+{
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 HslHueMinRange16;
+ MOBLEUINT16 HslHueMaxRange16;
+ MOBLEUINT16 HslMinSaturation16;
+ MOBLEUINT16 HslMaxSaturation16;
+}Appli_Light_HslRangeSet;
+
+typedef struct
+{
+ MOBLEUINT16 IntensityValue;
+ MOBLEUINT16 PwmRedValue;
+ MOBLEUINT16 PwmGreenValue;
+ MOBLEUINT16 PwmBlueValue;
+ MOBLEUINT16 PwmWarmValue;
+ MOBLEUINT16 PwmCoolValue;
+}Appli_LightPwmValue_t;
+#pragma pack(4)
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState);
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState);
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState);
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState);
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState);
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange);
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState);
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState);
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState);
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState);
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange);
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange);
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState);
+void Appli_Light_PwmInit(void);
+void HSL2RGB_Conversion(void);
+void Ctl_LedOffState(void);
+void Rgb_LedOffState(void);
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3);
+void Light_UpdateLedValue(MOBLEUINT8 state , Appli_LightPwmValue_t light_state);
+#endif /* __APPLI_LIGHT_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c
new file mode 100644
index 000000000..96626b19a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c
@@ -0,0 +1,102 @@
+/**
+******************************************************************************
+* @file appli_light_client.c
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "generic_client.h"
+#include "appli_light_client.h"
+#include "light_client.h"
+
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+extern MOBLEUINT8 Tid_Client;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_Lightness_Set: This function is callback for Application
+* when Lightness message is called
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pLightnessParam[3];
+
+ Appli_IntensityControlPublishing(pLightnessParam);
+ LightClient_Lightness_Set_Unack(elementAddr,
+ (_Light_LightnessParam*) pLightnessParam,
+ sizeof(pLightnessParam) );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h
new file mode 100644
index 000000000..f216e5175
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h
@@ -0,0 +1,62 @@
+/**
+******************************************************************************
+* @file appli_light_client.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_CLIENT_H
+#define __APPLI_LIGHT_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+
+
+#endif /* __APPLI_LIGHT_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c
new file mode 100644
index 000000000..cd419fe7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @file appli_light_ctrl.c
+ * @author BLE Mesh Team
+ * @brief Application interface for light LC Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_light_lc.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variable ----------------------------------------------------------*/
+
+Appli_LightLC_Set_t Appli_LightLC_set;
+Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+
+MOBLEUINT16 AmbientLuxLevel;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_LCMode_Set: This function is callback for Application
+* when Light LC mode Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_mode = pLight_LC_Param->LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Mode Set: %d\n\r",
+ pLight_LC_Param->LC_mode);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OM_Set: This function is callback for Application
+* when Light LC mode Occupancy Model Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_OM = pLight_LC_Param->LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"OM Set: %d\n\r",
+ pLight_LC_Param->LC_OM);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OnOff_Set: This function is callback for Application
+* when Light LC On Off Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Present_Light_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"OnOff Set: %d\n\r",
+ pLight_LC_Param->Present_Light_OnOff);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Get_AmbientLuxLevelOutput: This function is given to calculate the Ambient
+ Lux level output from the ambient sensor.
+* @param void:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void)
+{
+ /* Use AmbientLuxLevel global variable to store the value from ambient lux sensor
+ and then use this value to copmpare the lux level output from state machine.
+ */
+
+ return AmbientLuxLevel;
+}
+
+/**
+* @brief Light_LC_LuxLevelPIRegulator: This function will calculate all the parameter
+* Kid,kpu,kiu,kpd and return the value Light Lightness Linear.
+* @param tableLuxLevel:
+* @param ambientLuxLevel:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,MOBLEUINT16 ambientLuxLevel)
+{
+ MOBLEUINT16 luxLevel = 0;
+ /* User can write their code for the calculation */
+
+
+ return luxLevel;
+}
+
+/**
+* @brief Appli_LightLC_Get_ModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+{
+ *(plcModeState) = Appli_LightLC_set.LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_mode);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OMModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOM_ModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState)
+{
+ *(plcOM_ModeState) = Appli_LightLC_set.LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"Get OM Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_OM);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OnOffStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOnOffState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
+{
+ *(plcOnOffState) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+1) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+2) = Appli_LightLC_set.Light_OnOffState;
+ TRACE_M(TF_SERIAL_CTRL,"Get On Off Status: %d\n\r",
+ Appli_LightLC_set.Light_OnOffState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h
new file mode 100644
index 000000000..049d95308
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h
@@ -0,0 +1,89 @@
+/**
+******************************************************************************
+* @file appli_light_ctrl.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Light Control Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_LC_H
+#define __APPLI_LIGHT_LC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "light_lc.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+/*******************************************************************************
+Following Variables are used for the Light LC Mode MODEL
+*******************************************************************************/
+/* Light Lightness set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 LC_mode;
+ MOBLEUINT8 LC_OM;
+ MOBLEUINT8 Light_OnOffState;
+ MOBLEUINT16 Light_OnOffValue;
+}Appli_LightLC_Set_t;
+
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT16 Property_Value;
+}Appli_Light_LC_PropertySet_t;
+#pragma pack(4)
+
+
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState);
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState);
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState);
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void);
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,
+ MOBLEUINT16 ambientLuxLevel);
+#endif /* __APPLI_LIGHT_LC_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c
new file mode 100644
index 000000000..2b2f07087
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c
@@ -0,0 +1,1529 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.c
+ * @author BLE Mesh Team
+ * @brief User Application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Includes ------------------------------------------------------------------*/
+#include "ble_common.h"
+#include "app_conf.h"
+#include "hal_common.h"
+#include "appli_mesh.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "ble_hal_aci.h"
+#include "ble_hci_le.h"
+#include <string.h>
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include "generic.h"
+#include "common.h"
+#include "serial_if.h"
+#include "appli_nvm.h"
+#include "pal_nvm.h"
+#include "appli_config_client.h"
+#include "appli_generic_client.h"
+#include "appli_light_client.h"
+
+#include "stm32_seq.h"
+#include "PWM_config.h"
+#include "mesh_cfg_usr.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+#define APPLI_OPTIM 0
+
+/*********** Macros to be modified according to the requirement *************/
+#define BOUNCE_THRESHOLD 20U
+#define LONG_PRESS_THRESHOLD 1000U
+#define MANUAL_UNPROVISION_TIMER 3000U
+#define FLASH_ERASE_TIME 100U
+//#define DISCOVER_TIMER 10*60*1000 /* 10 minutes */
+#define DISCOVER_TIMER_INTERVAL 10*60*(1000000/CFG_TS_TICK_VAL) /* 10 minutes */
+#if (APPLI_OPTIM == 1)
+#define APPLI_MESH_TIMER_INTERVAL 1*(1000/CFG_TS_TICK_VAL) /* 1 ms */
+#endif
+#define DEFAULT_DELAY_PACKET_FROM 500U
+#define DEFAULT_DELAY_PACKET_RANDOM_TIME 500U
+#define USER_OUTPUT_OOB_APPLI_PROCESS 0U
+#define INPUT_OOB_TIMEOUT 300U /* input Oob30 Sec timeout*/
+#define PBADV_UNPROV_DEV_BEACON_INTERVAL 100U /* 100 ms */
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#if (LOW_POWER_FEATURE == 1)
+#define LPN_API_TIMER_INTERVAL 30*(1000000/CFG_TS_TICK_VAL) /* 30 secondes */
+#endif
+/* Private macro -------------------------------------------------------------*/
+#define MAX_APPLI_BUFF_SIZE 8
+#define MAX_PENDING_PACKETS_QUE_SIZE 2
+#define DATA_BUFFER_LENGTH 8
+#define MAX_NUMB_ELEMENTS APPLICATION_NUMBER_OF_ELEMENTS
+#define CUSTOM_BEACON_AD_TYPE 0x00
+#define ENABLE_CUSTOM_BEACON 0
+#define CUSTOM_BEACON_INTERVAL 2000U
+
+/**********************Friendship callbacks macros ****************************/
+#define FN_CLEARED_REPEAT_REQUEST 1
+#define FN_CLEARED_POLL_TIMEOUT 2
+#define FN_CLEARED_FRIEND_CLEAR 3
+#define LPN_CLEARED_NO_RESPONSE 1
+
+/* Private variables ---------------------------------------------------------*/
+
+enum ButtonState
+{
+ BS_OFF,
+ BS_DEBOUNCE,
+ BS_SHORT_PRESS,
+ BS_LONG_PRESS
+};
+
+enum ButtonState buttonState = BS_OFF;
+tClockTime tBounce = 0;
+MOBLEUINT8 Appli_LedState = 0;
+MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
+MOBLEUINT8 IntensityFlag = FALSE;
+MOBLEUINT8 ProxyFlag = 0;
+MOBLEUINT8 ProvisionFlag = 0;
+
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+static MOBLEUINT8 PrvngInProcess = 0;
+static MOBLEUINT32 OutputOobData = 0;
+static MOBLEUINT32 OutputOobBlinkCount = 0;
+#endif
+
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+MOBLEUINT8 InputOobData[8] = {0};
+MOBLEUINT8 inputOOBDataReady = 0;
+#endif
+
+/*Number Of Elements selected per Node. Maximum Elements supported = 3*/
+MOBLEUINT8 NumberOfElements = APPLICATION_NUMBER_OF_ELEMENTS;
+
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+/* 16 octets Static OOB information to be input here. Used during provisioning by Library */
+const MOBLEUINT8 StaticOobBuff[STATIC_OOB_SIZE] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+#else
+const MOBLEUINT8 StaticOobBuff[] = {0};
+#endif
+
+#ifdef PUB_KEY_TYPE_OOB
+/* 64 octets Public Key information to be input here. It is only required for Public Key OOB case.
+Used during provisioning by Library */
+const MOBLEUINT8 PubKeyBuff[64] = {0xF4, 0x65, 0xE4, 0x3F, 0xF2, 0x3D, 0x3F, 0x1B, 0x9D, 0xC7,
+0xDF, 0xC0, 0x4D, 0xA8, 0x75, 0x81, 0x84, 0xDB, 0xC9, 0x66, 0x20, 0x47, 0x96, 0xEC, 0xCF,
+0x0D, 0x6C, 0xF5, 0xE1, 0x65, 0x00, 0xCC, 0x02, 0x01, 0xD0, 0x48, 0xBC, 0xBB, 0xD8, 0x99,
+0xEE, 0xEF, 0xC4, 0x24, 0x16, 0x4E, 0x33, 0xC2, 0x01, 0xC2, 0xB0, 0x10, 0xCA, 0x6B, 0x4D,
+0x43, 0xA8, 0xA1, 0x55, 0xCA, 0xD8, 0xEC, 0xB2, 0x79};
+
+/* 32 octets Private Key information to be input here. It is only required for Public Key OOB case.
+Used during provisioning by Library */
+const MOBLEUINT8 PrivKeyBuff[32] = {0x52, 0x9A, 0xA0, 0x67, 0x0D, 0x72, 0xCD, 0x64, 0x97, 0x50,
+0x2E, 0xD4, 0x73, 0x50, 0x2B, 0x03, 0x7E, 0x88, 0x03, 0xB5, 0xC6, 0x08, 0x29, 0xA5, 0xA3,
+0xCA, 0xA2, 0x19, 0x50, 0x55, 0x30, 0xBA};
+#else
+const MOBLEUINT8 PubKeyBuff[] = NULL;
+const MOBLEUINT8 PrivKeyBuff[] = NULL;
+#endif
+
+
+
+/* Select Node as Sniffer, Means able to sniff all the packets
+* 0 - Filters are enabled and packets not targeted to node are filtered
+* 1 - Filters are disabled and packets not targeted to node are not filtered
+*/
+MOBLEUINT8 DisableFilter = 0;
+
+#if LOW_POWER_FEATURE
+MOBLEINT32 BLEMesh_sleepTime;
+MOBLEUINT32 SysRefCount;
+#endif
+
+MOBLEUINT8 network_conf[0x1000];
+MOBLEUINT8 nvm_operation;
+MOBLEUINT8 nvm_flash_page;
+MOBLEUINT8 provisioning_completion;
+
+/* Timer to control unprovisioned device beacons */
+#if PB_ADV_SUPPORTED
+MOBLEUINT8 discoverTimer_Id;
+tClockTime discoverTimerinterval = DISCOVER_TIMER_INTERVAL;
+#endif
+
+#if (APPLI_OPTIM == 1)
+MOBLEUINT8 appliTaskTimer_Id;
+#endif
+#if LOW_POWER_FEATURE
+volatile uint8_t BleProcessInit = 0;
+#endif
+#if (LOW_POWER_FEATURE == 1)
+MOBLEUINT8 lowPowerNodeApiTimer_Id;
+#endif
+
+/********************* Application configuration **************************/
+#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
+MOBLEUINT8 bdaddr[8];
+
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+static void Appli_GetMACfromUniqueNumber(void);
+#endif /* INTERNAL_UNIQUE_NUMBER_MAC */
+
+const void *mobleNvmBase;
+const void *appNvmBase;
+const void *prvsnr_data;
+#else
+#error "Unknown compiler"
+#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
+
+/* Private function prototypes -----------------------------------------------*/
+//static void Appli_LongButtonPress(void);
+static void Appli_ShortButtonPress(void);
+#if USER_OUTPUT_OOB_APPLI_PROCESS
+void Appli_OobAuthenticationProcess(void);
+#endif
+void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason);
+void Appli_LowPowerProcess(void);
+#if (APPLI_OPTIM == 1)
+static void AppliMeshTask(void);
+#endif
+
+/* Private functions ---------------------------------------------------------*/
+
+/************************* Button Control functions ********************/
+/**
+* @brief Function calls when a button is pressed for short duration
+* @param void
+* @retval void
+*/
+static void Appli_ShortButtonPress(void)
+{
+ BLEMesh_ModelsCommand();
+}
+
+#if 0
+/**
+* @brief Function calls when a button is pressed for Long duration
+* @param void
+* @retval void
+*/
+static void Appli_LongButtonPress(void)
+{
+ /* User Implementation */
+}
+#endif
+
+/**
+* @brief Updates the button status
+* @param int isPressed
+* @retval void
+*/
+static void Appli_UpdateButtonState(int isPressed)
+{
+ uint32_t t0 = 0,t1 = 1;
+
+ t0 = Clock_Time(); /* SW1 press timing */
+
+ while(BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED);
+ t1 = Clock_Time(); /* SW1 release timing */
+
+ if((t1 - t0) > LONG_PRESS_THRESHOLD)
+ {
+ IntensityPublish();
+ }
+ else if((t1 - t0) > BOUNCE_THRESHOLD)
+ {
+ /* Button 1 short press action */
+ Appli_ShortButtonPress();
+ }
+}
+
+/**
+* @brief task for the BLE MESH, the MESH Models and the Appli processes
+* @param void
+* @retval void
+*/
+static void Mesh_Task()
+{
+ BLEMesh_Process();
+ BLEMesh_ModelsProcess(); /* Models Processing */
+
+#if (APPLI_OPTIM == 0)
+ /* Set the task in the scheduler for the next execution */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+#endif
+}
+
+/**
+* @brief task for the BLE MESH, the MESH Models and the Appli processes
+* @param void
+* @retval void
+*/
+static void Appli_Task()
+{
+ Appli_Process();
+
+#if (APPLI_OPTIM == 0)
+ /* Set the task in the scheduler for the next execution */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+#endif
+}
+
+/************************* LED Control functions ********************/
+/**
+* @brief Controls the state of on board LED
+* @param void
+* @retval void
+*/
+void Appli_LedCtrl(void)
+{
+ if(Appli_LedState)
+ {
+ BSP_LED_On(LED_BLUE);
+
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+
+ }
+}
+
+/************* BLE-Mesh library callback functions ***************/
+
+/**
+* @brief Blinks the on board LED
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_LedBlink(void)
+{
+ /* Switch On the LED */
+ Appli_LedState = 1;
+ Appli_LedCtrl();
+ Clock_Wait(500);
+
+ /* Switch Off the LED */
+ Appli_LedState = 0;
+ Appli_LedCtrl();
+ Clock_Wait(500);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Callback function Sets the state of the bulb
+* @param MOBLEUINT16 ctrl which sets the lighting state of LED
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl)
+{
+ /* Switch On the LED */
+ if(ctrl > 0)
+ {
+ Appli_LedState = 1;
+ }
+ /* Switch Off the LED */
+ else
+ {
+ Appli_LedState = 0;
+ }
+
+ Appli_LedCtrl();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief initializes BLE Stack
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleStackInitCb()
+{
+ /* BLE Stack initialization */
+ /* Not Required in BLE */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Sets transmission power of RF
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetTxPowerCb(void)
+{
+ tBleStatus status;
+ /* API to change the Transmission power of BLE Device */
+ /* uint8_t en_high_power, uint8_t pa_level
+ en_high_power Can be only 0 or 1. Set high power bit on or off.
+ pa_level Can be from 0 to 7. Set the PA level value
+ */
+ status = aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+ if (status)
+ return MOBLE_RESULT_FAIL;
+ else
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief SET UUID value
+* @param uuid_prefix_data : Pointer of UUID buffer data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data)
+{
+ /* UUID is 128 bits (16 bytes) and can guarantee uniqueness across space and time.
+ It can be “Time-based “ UUID or “truly-random or pseudo-random numbers”
+
+ In this buffer user need to fill 10 bytes of UUID data.
+ Remaining 6 bytes, library fill this data with BDaddress.
+
+ For example :
+ F81D4FAE-7DEC-XBC4-Y12F-17D1AD07A961 (16 bytes)
+ <any number> |_| |_| <BDAddress>
+
+ X = 1 i.e. “Time Base UUID”
+ X = 4 i.e. “Random Number“
+ Y = 4 i.e. Conforming to the current spec
+ For UUID information refer RFC4122
+ */
+
+ /* copy UUID prefix data*/
+ uint8_t uuid_buff[10] = {0xF8,0x1D,0x4F,0xAE,0x7D,0xEC};/*random value by user */
+
+ uuid_buff[6] = 0x4B; /* 0x4B => 4 : Random */
+ uuid_buff[7] = 'S' ; /* User define value */
+ uuid_buff[8] = 0xA1; /* 0xA1 => A : Conforming to the current Spec */
+ uuid_buff[9] = 'T' ; /* User define value */
+
+ memcpy(uuid_prefix_data,uuid_buff,sizeof(uuid_buff));
+ memcpy(&uuid_prefix_data[10],bdaddr,6); /* Copy bdaddr to last 6 bytes of UUID */
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief SET CID , PID and VID values
+* @param company_product_info : vendor fill product information in this buffer
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info)
+{
+ /* CID : provide 16-bit company identifier assigned by the Bluetooth SIG */
+ uint16_t company_id = COMPANY_ID;
+
+ /* PID : Provide 16-bit vendor-assigned product identifier */
+ uint16_t product_id = PRODUCT_ID;
+
+ /* VID : Provide 16-bit vendor-assigned product version identifier*/
+ uint16_t product_version_id = PRODUCT_VERSION_ID;
+
+ memcpy(company_product_info + 0,(void *)&company_id,sizeof(company_id));
+ memcpy(company_product_info + 2 ,(void *)&product_id,sizeof(product_id));
+ memcpy(company_product_info + 4 ,(void *)&product_version_id,sizeof(product_version_id));
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Call back function called when GATT Connection Created
+* @param none
+* @retval none
+*/
+void Appli_BleGattConnectionCompleteCb(void)
+{
+ ProvisionFlag = 1;
+ /* Proxy Node, will be called whenever Gatt connection is established */
+ /* Turn ON Red LED*/
+ ProxyFlag = 1;
+ BSP_LED_On(LED_GREEN);
+}
+
+/**
+* @brief Call back function called when GATT Disconnection Complete
+* @param none
+* @retval none
+*/
+void Appli_BleGattDisconnectionCompleteCb(void)
+{
+ ProvisionFlag = 0;
+ /* Proxy Node, will be called whenever Gatt disconnected */
+ /* Turn Off Red LED*/
+ ProxyFlag = 0;
+ BSP_LED_Off(LED_GREEN);
+}
+
+/**
+* @brief Unprovisioned Node Identification
+* @param MOBLEUINT8 data
+* @retval none
+*/
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
+{
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 1;
+#endif
+ TRACE_M(TF_PROVISION,"Unprovisioned Node Identifier received: %02x\n\r", data);
+}
+
+/**
+* @brief Set Number of Elements in a Node
+* @param none
+* @retval Sending the value to BLE Mesh Library
+*/
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
+{
+ if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ {
+ TRACE_M(TF_ELEMENTS,"In version 1.11.00x one Element per node is supported!\r\n");
+ return MAX_NUMB_ELEMENTS;
+ }
+
+ else if(NumberOfElements == 0)
+ {
+ TRACE_M(TF_ELEMENTS,"Number Of Elements must be 1 or greater than 1!\r\n");
+ return 1;
+ }
+
+ else
+ {
+ return NumberOfElements;
+ }
+}
+
+/**
+* @brief Sets the Attention Timer Callback function
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleAttentionTimerCb(void)
+{
+/* avoid printf, if low power feature is supported */
+#if (LOW_POWER_FEATURE == 0)
+ TRACE_M(TF_MISC, " \r\n");
+#endif /* LOW_POWER_FEATURE == 0 */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Call back function to give Output OOB information
+* @param MOBLEUINT8* output_oob
+* @param MOBLEUINT8 size
+* @retval void
+*/
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size)
+{
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ uint32_t ooBData = 0;
+ for (MOBLEUINT8 i = 0; i < size; i++)
+ {
+ ooBData |= (output_oob[i] << 8*i);
+ }
+ OutputOobData = ooBData;
+ TRACE_M(TF_PROVISION,"Output OOB information for provisioner: %ld\n\r", ooBData);
+ #endif
+}
+
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+/**
+* @brief Process for both output and Input OOB handling
+* @param void
+* @retval void
+*/
+void Appli_OobAuthenticationProcess(void)
+{
+ if(OutputOobBlinkCount < OutputOobData)
+ {
+ OutputOobBlinkCount++;
+ Appli_LedBlink();
+ }
+ else
+ {
+ OutputOobBlinkCount++;
+ Clock_Wait(1000);
+ if(OutputOobBlinkCount > OutputOobData+3)
+ {
+ OutputOobBlinkCount = 0;
+ }
+ }
+}
+#endif
+
+
+/**
+* @brief Call back function to provide Input OOB information
+* @param MOBLEUINT8 size
+* @retval MOBLEUINT8*
+*/
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
+{
+#if defined (ENABLE_AUTH_TYPE_INPUT_OOB) && (ENABLE_SERIAL_INTERFACE)
+ MOBLEUINT16 inputTimer = 0;
+ TRACE_M(TF_PROVISION,"Input OOB information for provisioner-Size: %d\n\r", size);
+ while(1)
+ {
+ Serial_InterfaceProcess();
+ /* Check if input is completed or timeout */
+ if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
+ {
+ inputOOBDataReady = 0;
+ break;
+ }
+ Clock_Wait(100);
+ inputTimer++;
+ }
+ return InputOobData;
+#else
+ return NULL;
+#endif
+}
+
+
+/**
+* @brief Call back function to provide Input OOB information
+* @param rcvdStringBuff: buffer to store input string
+* @param rcvdStringSize: length of the input string
+* @retval void
+*/
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+ unsigned long long InputOobDatatemp;
+ sscanf(rcvdStringBuff + 5, "%lld", &InputOobDatatemp);
+ memmove(&InputOobData, &InputOobDatatemp, sizeof(InputOobDatatemp));
+ inputOOBDataReady = 1;
+#endif
+}
+
+
+/**
+* @brief Application BLE Disable Filter
+* @param none
+* @retval Status is replied
+*/
+MOBLEUINT8 Appli_BleDisableFilterCb(void)
+{
+ return DisableFilter;
+}
+
+/**
+* @brief Checks and do Manual Unprovision of board
+* @param void
+* @retval void
+*/
+void Appli_CheckForUnprovision(void)
+{
+ /* Checks if the User button is pressed or not at the startup */
+ if (BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED)
+ {
+ BSP_LED_On(LED_BLUE);
+ tClockTime t = Clock_Time();
+ int interrupted = 0;
+
+ /*Wait to check if user is pressing the button persistently*/
+ while ((Clock_Time() - t) < MANUAL_UNPROVISION_TIMER)
+ {
+ if (BSP_PB_GetState(BUTTON_SW1) != BUTTON_PRESSED)
+ {
+ interrupted = 1;
+ break;
+ }
+ }
+ /* Unprovision, show that unprovisioning is completed, and
+ wait until user releases button*/
+ if (!interrupted)
+ {
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+ t = Clock_Time();
+ while ((Clock_Time() - t) < FLASH_ERASE_TIME)
+ {
+ BLEMesh_Process();
+ }
+
+ while (BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED)
+ {
+ Appli_LedBlink();
+ }
+ }
+ BSP_LED_Off(LED_BLUE);
+ NVIC_SystemReset();
+ }
+
+ /* Register the task for all MESH dedicated processes */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_REQ_ID, UTIL_SEQ_RFU, Mesh_Task );
+ /* Set the task in the scheduler for the next scheduling */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#else
+ BleProcessInit = 1;
+#endif
+
+ /* Register the task for all MESH dedicated processes */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_APPLI_REQ_ID, UTIL_SEQ_RFU, Appli_Task );
+ /* Set the task in the scheduler for the next scheduling */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+
+#if (APPLI_OPTIM == 1)
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &appliTaskTimer_Id, hw_ts_Repeated, AppliMeshTask);
+
+ HW_TS_Start(appliTaskTimer_Id, APPLI_MESH_TIMER_INTERVAL);
+#endif
+}
+
+void Appli_Unprovision(void)
+{
+ if(!ProxyFlag)
+ {
+ /* No GATT connection */
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+}
+
+/**
+* @brief Checks and updates Mac address to generate MAC Address
+* @param void
+* @retval MOBLEUINT8 sum return the sum calculated mac
+*/
+int Appli_CheckBdMacAddr(void)
+{
+ MOBLEUINT8 sum = 239;
+ MOBLEUINT8 result = 0;
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ memcpy(bdaddr, (MOBLEUINT8 *)CFG_ADV_BD_ADDRESS, 7);
+ bdaddr[7] = (EXTERNAL_MAC_ADDR_MGMT | EXTERNAL_MAC_TYPE);
+#endif
+
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+ aci_hal_read_config_data(0x00, &bdaddr[7], bdaddr);
+ Appli_GetMACfromUniqueNumber();
+ bdaddr[7] = INTERNAL_UNIQUE_NUMBER_MAC;
+#endif
+
+ for (int i = 0; i < 6; ++i)
+ {
+ sum = (sum << 1) + bdaddr[i];
+ }
+
+ if (sum == bdaddr[6])
+ {
+ result = 1;
+ }
+
+#if defined(EXTERNAL_MAC_ADDR_MGMT) && defined(EXTERNAL_MAC_IS_PUBLIC_ADDR)
+ /* Do nothing for modification of 2 MSb */
+#else
+ bdaddr[5] |= 0xC0; /* 2 Msb bits shall be 11b for Static Random Address */
+#endif
+
+#ifdef GENERATE_STATIC_RANDOM_MAC
+ bdaddr[7] = GENERATE_STATIC_RANDOM_MAC;
+ /* Do nothing for bdaddr, just pass the identification */
+ result = 1; /* This will overwrite the above for loop result,
+ which is redundant for this case */
+#endif
+
+ return result;
+}
+
+
+/**
+* @brief Reads the unique serial number of the device
+* @param void
+* @retval void
+*/
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+static void Appli_GetMACfromUniqueNumber(void)
+{
+#ifdef STM32L152xE
+ /************************STM32L152RE 96 bit Unique ID addresses***************/
+#define DEVICE_ID_REG0 (0x1FF800D0)
+#define DEVICE_ID_REG1 (0x1FF800D4)
+#define DEVICE_ID_REG2 (0x1FF800E4)
+#endif
+
+ /*
+ The unique serial number is a six bytes value generated from STM32 UID
+ stored at DEVICE_ID_REG0, DEVICE_ID_REG1 and DEVICE_ID_REG2. It is generated
+ cancating 4bytes from DEVICE_ID_REG2 and first bytes of DEVICE_ID_REG0 and
+ DEVICE_ID_REG1. Since the UID at DEVICE_ID_REG0 and
+ DEVICE_ID_REG1 could be identical for same batch samples,
+ 4 bytes have been taken from DEVICE_ID_REG2
+ */
+
+ uint8_t i;
+ uint8_t sum = 239;
+#if 0
+ uint8_t *ls_addr;
+
+ ls_addr = (uint8_t*)DEVICE_ID_REG2;
+
+ for(i = 0; i < 4; i += 1)
+ {
+ bdaddr[i] = *ls_addr;
+ ls_addr++;
+ }
+
+ bdaddr[4] = *(uint8_t*)(DEVICE_ID_REG0);
+ bdaddr[5] = (*(uint8_t*)(DEVICE_ID_REG1)) | 0xC0;
+#endif
+ /* Static Device Address:
+ The two most significant bits
+ of the address shall be equal to 1,
+ hence ORed with 0xC0)*/
+
+ for (i = 0; i < 6; ++i)
+ {
+ sum = (sum << 1) + bdaddr[i];
+ }
+ bdaddr[6] = sum;
+}
+#endif
+
+
+#if 0
+/**
+* @brief provides the information of the power saving mode
+* @param sleepMode curently unused, to be used in future
+* @retval SleepModes returns the mode of the controller
+*/
+SleepModes App_SleepMode_Check(SleepModes sleepMode)
+{
+ if (buttonState == BS_OFF)
+ {
+ return SLEEPMODE_WAKETIMER;
+ }
+ else
+ {
+ return SLEEPMODE_RUNNING;
+ }
+}
+#endif
+
+/**
+* @brief callback for unprovision the node by provisioner.
+* @param status reserved for future
+* @retval void
+*/
+void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason)
+{
+ ProvisionFlag = 0;
+ TRACE_I(TF_PROVISION,"Device is unprovisioned by provisioner \n\r");
+#if PB_ADV_SUPPORTED
+ BLEMesh_SetUnprovisionedDevBeaconInterval(PBADV_UNPROV_DEV_BEACON_INTERVAL);
+#endif
+ AppliNvm_ClearModelState();
+}
+
+/**
+* @brief This function scans and prints unprovisioned devices
+* @param unprovDeviceArray: Pointer of an array for filling unprovisioned device UUIDs
+* @param noOfUnprovDevices: Pointer to take total count of nearby unprovisioned devices
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices)
+{
+ MOBLE_RESULT result;
+
+ result = BLEMesh_GetNeighborState(unprovDeviceArray,noOfUnprovDevices);
+ /* Array print for testing */
+ /* Check if any unprovisioned device is available */
+ if(!(*noOfUnprovDevices))
+ {
+ TRACE_I(TF_PROVISION,"No Unprovisioned Device Nearby\r\n");
+ }
+ else
+ {
+ for(MOBLEINT8 count=0; count < *noOfUnprovDevices; count++)
+ {
+ BLEMesh_PrintStringCb("");
+ TRACE_I(TF_PROVISION,"Device-%d -> ", count);
+ BLEMesh_PrintDataCb(unprovDeviceArray[count].uuid, 16);
+ }
+ }
+ return result;
+}
+/**
+* @brief This function returns starts the provisioning of one of the devices
+* @param unprovDeviceArray: Pointer of an array having unprovisioned device UUIDs
+* @param index: Index of the device to be provisioned
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ result = BLEMesh_ProvisionRemote((unprovDeviceArray+index)->uuid);
+
+ return result;
+}
+
+/* Customized implementation for provisioning a device from mesh node - End */
+
+/**
+* @brief Call back function called when PB-ADV link Opened
+* @param none
+* @retval none
+*/
+void BLEMesh_PbAdvLinkOpenCb(void)
+{
+ ProvisionFlag = 0;
+ TRACE_M(TF_PROVISION,"PB-ADV Link opened successfully \n\r");
+ /* Turn ON Red LED*/
+#if LOW_POWER_FEATURE
+ /* do nothing */
+#else
+ BSP_LED_On(LED_RED);
+#endif
+}
+
+
+/**
+* @brief Call back function called when PB-ADV link Closed
+* @param none
+* @retval none
+*/
+void BLEMesh_PbAdvLinkCloseCb(void)
+{
+ TRACE_M(TF_PROVISION,"PB-ADV Link Closed successfully \n\r");
+ /* Turn Off Red LED*/
+#if LOW_POWER_FEATURE
+ /* do nothing */
+#else
+ BSP_LED_Off(LED_RED);
+#endif
+}
+
+
+/**
+* @brief callback for provision the node by provisioner.
+* @param void
+* @retval void
+*/
+void BLEMesh_ProvisionCallback(void)
+{
+ ProvisionFlag = 1;
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 0;
+#endif
+ TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
+
+#if (LOW_POWER_FEATURE == 1)
+ /* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
+ HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
+#endif
+}
+
+
+/**
+* @brief callback for friendship established by friend node
+* @param address of corresponding low power node
+* @param receive delay of low power node (unit ms)
+* @param poll timeout of low power node (unit 100ms)
+* @param number of elements of low power node
+* @param previous friend address of low power node (can be invalid address)
+* @retval void
+*/
+void BLEMesh_FnFriendshipEstablishedCallback(MOBLE_ADDRESS lpnAddress,
+ MOBLEUINT8 lpnReceiveDelay,
+ MOBLEUINT32 lpnPollTimeout,
+ MOBLEUINT8 lpnNumElements,
+ MOBLE_ADDRESS lpnPrevFriendAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship established. Low power node address 0x%.4X \r\n", lpnAddress);
+ TRACE_M(TF_LPN_FRND,"Low power node receive delay %dms \r\n", lpnReceiveDelay);
+ TRACE_M(TF_LPN_FRND,"Low power node poll timeout %ldms \r\n", lpnPollTimeout*100);
+ TRACE_M(TF_LPN_FRND,"Low power node number of elements %d \r\n", lpnNumElements);
+ if (lpnPrevFriendAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_LPN_FRND,"Low power node previous friend address 0x%.4X \r\n", lpnPrevFriendAddress);
+ }
+}
+
+/**
+* @brief callback for friendship clear by friend node
+* @param reason of friendship clear
+* 0: reserved,
+* 1: friend request received from existing low power node (friend)
+* 2: low power node poll timeout occurred
+* 3: friend clear received
+* @param previous friend address of low power node (can be invalid address)
+* @retval void
+*/
+void BLEMesh_FnFriendshipClearedCallback(MOBLEUINT8 reason, MOBLE_ADDRESS lpnAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship cleared. Low power node address 0x%.4X \r\n", lpnAddress);
+
+ switch(reason)
+ {
+ case FN_CLEARED_REPEAT_REQUEST:
+ TRACE_M(TF_LPN_FRND,"Reason: New friend request received from existing low power node \r\n");
+ break;
+ case FN_CLEARED_POLL_TIMEOUT:
+ TRACE_M(TF_LPN_FRND,"Reason: Low power node poll timeout occurred \r\n");
+ break;
+ case FN_CLEARED_FRIEND_CLEAR:
+ TRACE_M(TF_LPN_FRND,"Reason: Friend clear received \r\n");
+ break;
+ default:
+ TRACE_M(TF_LPN_FRND,"Reason: Invalid \r\n");
+ break;
+ }
+}
+
+/**
+* @brief callback for friendship established by low power node
+* @param address of corresponding friend node
+* @retval void
+*/
+void BLEMesh_LpnFriendshipEstablishedCallback(MOBLE_ADDRESS fnAddress)
+{
+ /* Friendship established */
+ TRACE_M(TF_LPN_FRND,"Friend node responding, friendship established.\r\n");
+}
+
+/**
+* @brief callback for friendship cleare by low power node
+* @param reason of friendship clear.
+* 0: reserved
+* 1: No response received from friend node
+* @retval void
+*/
+void BLEMesh_LpnFriendshipClearedCallback(MOBLEUINT8 reason, MOBLE_ADDRESS fnAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship cleared. Friend node address 0x%.4x \r\n", fnAddress);
+
+ if (reason == LPN_CLEARED_NO_RESPONSE)
+ {
+ TRACE_M(TF_LPN_FRND,"Reason: Friend node not responding \r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LPN_FRND,"Reason: Invalid \r\n");
+ }
+}
+
+/**
+* @brief New neighbor appeared callback in neighbor table.
+ If MAC address of neighbor changes it appears as new neighbor.
+* @param MAC address of neighbor.
+* is neighbor provisioned or unprovisioned device.
+* uuid of neighbor. NULL if not available
+* network address of neighbor. MOBLE_ADDRESS_UNASSIGNED if not available
+* last updated rssi value.
+* @retval void
+*/
+void BLEMesh_NeighborAppearedCallback(const MOBLEUINT8* bdAddr,
+ MOBLEBOOL provisioned,
+ const MOBLEUINT8* uuid,
+ MOBLE_ADDRESS networkAddress,
+ MOBLEINT8 rssi)
+{
+ TRACE_M(TF_NEIGHBOUR,"New neighbor appeared. Neighbor MAC address:");
+
+ for (MOBLEUINT8 count=0 ; count<6; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", bdAddr[count]);
+ }
+
+ if (provisioned == MOBLE_TRUE)
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Provisioned node. \n\r");
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Unprovisioned device. \n\r");
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"rssi: %d. ", rssi);
+
+ if (networkAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address: 0x%.4x\n\r", networkAddress);
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address not available\n\r");
+ }
+
+ for (MOBLEUINT8 i=0; i<16; i++)
+ {
+ if (uuid[i] == 0x00)
+ {
+ continue;
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"UUID: ");
+
+ for (MOBLEUINT8 count=0 ; count<16; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", uuid[count]);
+ }
+
+ break;
+ }
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"\n\r");
+}
+
+/**
+* @brief Existing neighbor refreshed callback in neighbor table.
+ If MAC address of neighbor changes it appears as new neighbor.
+* @param MAC address of neighbor.
+* is neighbor provisioned or unprovisioned device.
+* uuid of neighbor. NULL if not available
+* network address of neighbor. MOBLE_ADDRESS_UNASSIGNED if not available
+* last updated rssi value.
+* @retval void
+*/
+void BLEMesh_NeighborRefreshedCallback(const MOBLEUINT8* bdAddr,
+ MOBLEBOOL provisioned,
+ const MOBLEUINT8* uuid,
+ MOBLE_ADDRESS networkAddress,
+ MOBLEINT8 rssi)
+{
+ TRACE_M(TF_NEIGHBOUR,"Existing neighbor refreshed. Neighbor MAC address:");
+
+ for (MOBLEUINT8 count=0 ; count<6; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", bdAddr[count]);
+ }
+
+ if (provisioned == MOBLE_TRUE)
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Provisioned node. \n\r");
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Unprovisioned device. \n\r");
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"rssi: %d. ", rssi);
+
+ if (networkAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address: 0x%.4x\n\r", networkAddress);
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address not available\n\r");
+ }
+
+ for (MOBLEUINT8 i=0; i<16; i++)
+ {
+ if (uuid[i] == 0x00)
+ {
+ continue;
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"UUID: ");
+
+ for (MOBLEUINT8 count=0 ; count<16; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", uuid[count]);
+ }
+
+ break;
+ }
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"\n\r");
+}
+
+/**
+* @brief Beacon received callback
+* Beacons are received only if received beacon ad type is not
+* Mesh Message, Mesh Beacon or PB-ADV
+* @param MAC address
+* data
+* length of beacon
+* rssi value of beacon
+* @retval void
+*/
+#if (ENABLE_CUSTOM_BEACON == 1)
+/* BLEMesh_CustomBeaconReceivedCallback high frequency callback */
+void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
+ const MOBLEUINT8* data,
+ MOBLEUINT8 length,
+ MOBLEINT8 rssi)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (length < 2)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_BEACON, "Message is too small \r\n");
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if ((length-1) < data[0])
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
+ }
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ MOBLEUINT8 adType = data[1];
+ MOBLEUINT8 i;
+
+ if (adType == CUSTOM_BEACON_AD_TYPE)
+ {
+ TRACE_M(TF_BEACON, "Message length(%d), ad type(0x%.2x), rssi(%d) \r\n", length-2, adType, rssi);
+ TRACE_M(TF_BEACON, "Message:\r\n");
+ for(i = 0; i < length-2; i++)
+ TRACE_M(TF_BEACON, "data[%d]= %d\r\n", i, data[2+i]);
+ }
+ else
+ {
+ /* Discard, Ad type mismatch */
+ }
+ }
+}
+#endif /* BLEMesh_CustomBeaconReceivedCallback high frequency callback */
+
+/**
+* @brief Custom beacon generator
+* If size set to > 31 bytes, beacon is rejected
+* BLEMesh_SetCustomBeaconInterval should be set to get this callback
+* @param beacon data buffer. It includes length and AD type fields
+* buffer size
+* @retval void
+*/
+void BLEMesh_CustomBeaconGeneratorCallback(void* buffer, MOBLEUINT8* size)
+{
+ MOBLEUINT8 adType = CUSTOM_BEACON_AD_TYPE;
+ MOBLEUINT8 dataLength = 5;
+ MOBLEUINT8 data[5] = {0x00,0x01,0x02,0x03,0x04};
+ MOBLEUINT8* buf = (MOBLEUINT8*)buffer;
+
+ buf[0] = dataLength+1;
+ buf[1] = adType;
+ memcpy(buf+2, data, dataLength);
+
+ *size = dataLength+2;
+}
+
+/**
+* @brief Low Power mode process
+* If low power feature is supported, device enables low power mode
+* @param void
+* @retval void
+*/
+void Appli_LowPowerProcess(void)
+{
+#if 0
+#if LOW_POWER_FEATURE
+ BluenrgMesh_sleepTime = (MOBLEINT32)BluenrgMesh_GetSleepDuration();
+
+ if (BluenrgMesh_sleepTime > 0)
+ {
+ /* Timer 0 used for low power */
+ HAL_VTimerStart_ms(0, BluenrgMesh_sleepTime);
+
+ /* To start virtual timer */
+ BTLE_StackTick();
+
+ /* save virtual timer current count */
+ SysRefCount = HAL_VTimerGetCurrentTime_sysT32();
+
+ /* wakeup either from io or virtual timer */
+ BlueNRG_Sleep(SLEEPMODE_WAKETIMER, WAKEUP_IO13, WAKEUP_IOx_LOW);
+
+ /* update systick count based on updated virtual timer count */
+ Set_Clock_Time(Clock_Time() +
+ HAL_VTimerDiff_ms_sysT32(HAL_VTimerGetCurrentTime_sysT32(), SysRefCount));
+
+ /* Stop Timer 0 */
+ HAL_VTimer_Stop(0);
+ }
+#endif /* LOW_POWER_FEATURE */
+#endif
+}
+
+/**
+* @brief Appli_IntensityControlPublishing:Function is used to set the intensity value.
+* Publishing the value.
+* @param void
+* @retval void
+*/
+void Appli_IntensityControlPublishing(MOBLEUINT8* value)
+{
+
+ if(IntensityFlag == FALSE)
+ {
+
+ IntensityValue = IntensityValue + (INTENSITY_LEVEL_FULL/5);
+ value[0] = (MOBLEUINT8)IntensityValue;
+ value[1] = (MOBLEUINT8)(IntensityValue >> 8) ;
+
+ if(IntensityValue >= INTENSITY_LEVEL_FULL)
+ {
+ IntensityFlag = TRUE;
+ }
+
+ }
+ else
+ {
+
+ IntensityValue = IntensityValue - (INTENSITY_LEVEL_FULL/5);
+ value[0] = (MOBLEUINT8)IntensityValue;
+ value[1] = (MOBLEUINT8)(IntensityValue >> 8) ;
+
+ if(IntensityValue <= INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = FALSE;
+ }
+
+ }
+}
+
+
+/**
+* @brief Publish the intensity value for generic level or light lightness
+* This function should be called in main loop
+* @param void
+* @retval void
+*/
+void IntensityPublish(void)
+{
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ Appli_LightClient_Lightness_Set();
+#endif
+
+#ifdef GENERIC_CLIENT_MODEL_PUBLISH
+ Appli_GenericClient_Level_Set_Unack();
+#endif
+}
+
+/**
+* @brief Application processing
+* This function should be called in main loop
+* @param void
+* @retval void
+*/
+void Appli_Process(void)
+{
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ AppliNvm_Process();
+#endif
+
+ Appli_LowPowerProcess();
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ if(PrvngInProcess)
+ {
+#if USER_OUTPUT_OOB_APPLI_PROCESS
+ Appli_OobAuthenticationProcess();
+#endif
+ }
+#endif
+
+#ifdef TPT_LAYER_BUSY_TEST
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ //SdkEvalLedOn(LED1);
+ }
+ else
+ {
+ //SdkEvalLedOff(LED1);
+ }
+#endif
+}
+
+#if PB_ADV_SUPPORTED
+static void UnprovisionedDeviceBeaconApp(void)
+{
+ BLEMesh_SetUnprovisionedDevBeaconInterval(0);
+}
+
+static void UnprovisionedDeviceBeaconTask(void)
+{
+ /**
+ * The code shall be executed in the background as aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_BEACON_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+#if (APPLI_OPTIM == 1)
+static void AppliMeshTask(void)
+{
+ /* Set the task in the scheduler for the next execution */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+static void AppliMeshSW1Task(void)
+{
+ Appli_UpdateButtonState(BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED);
+
+ return;
+}
+
+#if (LOW_POWER_FEATURE == 1)
+static void LowPowerNodeApiApp(void)
+{
+ TRACE_I(TF_PROVISION,"Scan disabled \r\n");
+ BLEMesh_LpnDisableScan();
+ return;
+}
+
+static void LowPowerNodeApiTask(void)
+{
+ /* Set the task in the scheduler for the next execution */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_LPN_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+/**
+* @brief function to inintiallise the GPIO interrupt fot Power down
+* @param void
+* @retval void
+*/
+static void GPIO_InitNVICPowerOff(void)
+{
+ GPIO_InitTypeDef gpioinitstruct = {0};
+
+ /* Enable the PowerOff GPIO Clock */
+ POWEROFF_GPIO_CLK_ENABLE();
+
+ /* Configure PowerOff pin as input with External interrupt */
+ gpioinitstruct.Pin = POWEROFF_PIN;
+ gpioinitstruct.Pull = GPIO_PULLUP;
+ gpioinitstruct.Mode = GPIO_MODE_IT_FALLING;
+ HAL_GPIO_Init(POWEROFF_GPIO_PORT, &gpioinitstruct);
+
+ /* Enable and set PowerOff EXTI Interrupt to the lowest priority */
+ HAL_NVIC_SetPriority((IRQn_Type)(POWEROFF_EXTI_IRQn), 0x0F, 0x00);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(POWEROFF_EXTI_IRQn));
+}
+#endif
+
+/**
+* @brief Initializes the Application
+* @param void
+* @retval void
+*/
+void Appli_Init(MOBLEUINT8 *flag)
+{
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+ /* Hardware Factory Restore implementation */
+ AppliNvm_FactorySettingReset();
+#endif
+
+#if PB_ADV_SUPPORTED
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_BEACON_REQ_ID, UTIL_SEQ_RFU, UnprovisionedDeviceBeaconApp );
+ /**
+ * Create Timer to control unprovisioned device beacons
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &discoverTimer_Id, hw_ts_SingleShot, UnprovisionedDeviceBeaconTask);
+
+ HW_TS_Start(discoverTimer_Id, DISCOVER_TIMER_INTERVAL);
+#endif
+
+#if ENABLE_SERIAL_INTERFACE
+ Serial_Init();
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ GPIO_InitNVICPowerOff();
+#endif
+
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
+ __HAL_RCC_TIM1_CLK_ENABLE();
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ PWM_Init();
+#endif
+
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
+
+#if (ENABLE_CUSTOM_BEACON == 1)
+ BLEMesh_SetCustomBeaconInterval(CUSTOM_BEACON_INTERVAL);
+#endif
+
+#if (LOW_POWER_FEATURE == 1) /**
+ * Create Timer to control unprovisioned device beacons
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &lowPowerNodeApiTimer_Id, hw_ts_SingleShot, LowPowerNodeApiTask);
+
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_LPN_REQ_ID, UTIL_SEQ_RFU, LowPowerNodeApiApp );
+#endif
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h
new file mode 100644
index 000000000..ad831f2cd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.h
+ * @author BLE Mesh Team
+ * @brief Header file for the user application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_MESH_H
+#define __APPLI_MESH_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "mesh_cfg_usr.h"
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* MACROS for Power Level definitions */
+#define POWER_LEVEL_LOW 0
+#define TX_POWER_LEVEL_MINUS_18DBM 0 /* = -18 dBm, */
+#define TX_POWER_LEVEL_MINUS_15DBM 1 /* = -15 dBm, */
+#define TX_POWER_LEVEL_MINUS_12DBM 2 /* = -12 dBm, */
+#define TX_POWER_LEVEL_MINUS_9DBM 3 /* = -9 dBm, */
+#define TX_POWER_LEVEL_MINUS_6DBM 4 /* = -6 dBm, */
+#define TX_POWER_LEVEL_MINUS_2DBM 5 /* = -2 dBm, */
+#define TX_POWER_LEVEL_0DBM 6 /* = 0 dBm, */
+#define TX_POWER_LEVEL_PLUS_5DBM 7 /* = 5 dBm. */
+#define POWER_LEVEL_HIGH 1
+#define TX_POWER_LEVEL_MINUS_14DBM 0 /* = -14 dBm, */
+#define TX_POWER_LEVEL_MINUS_11DBM 1 /* = -11 dBm, */
+#define TX_POWER_LEVEL_MINUS_8DBM 2 /* = -8 dBm, */
+#define TX_POWER_LEVEL_MINUS_5DBM 3 /* = -5 dBm, */
+#define TX_POWER_LEVEL_PLUS_2DBM 5 /* = 2 dBm, */
+#define TX_POWER_LEVEL_PLUS_4DBM 6 /* = 4 dBm, */
+#define TX_POWER_LEVEL_PLUS_8DBM 7 /* = 8 dBm */
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+#define POWEROFF_PIN GPIO_PIN_12
+#define POWEROFF_GPIO_PORT GPIOB
+#define POWEROFF_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define POWEROFF_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define POWEROFF_EXTI_LINE GPIO_PIN_12
+#define POWEROFF_EXTI_IRQn EXTI15_10_IRQn
+#endif
+
+typedef enum _prvn_nvm_state
+{
+ NVM_INIT = 0,
+ NVM_SAVE_PENDING,
+} prvn_nvm_state;
+
+/* Exported variables ------------------------------------------------------- */
+
+extern MOBLEUINT8 bdaddr[];
+
+typedef struct
+{
+ MOBLEUINT16 nodeAddress;
+ MOBLEUINT8 numOfElements;
+ MOBLEUINT8 Reserved1; /* For Alignment by 4*/
+ MOBLEUINT16 newNodeAddress;
+ MOBLEUINT8 newNodeElements;
+ prvn_nvm_state saveToNVM;
+ MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeUUID[UUID_SIZE];
+} NodeUnderProvisionParam_t;
+
+extern NodeUnderProvisionParam_t NodeUnderProvisionParam;
+extern MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+extern MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_BleStackInitCb(void);
+MOBLE_RESULT Appli_BleSetTxPowerCb(void);
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data);
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info);
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data);
+void Appli_BleGattConnectionCompleteCb(void);
+void Appli_BleGattDisconnectionCompleteCb(void);
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void);
+MOBLE_RESULT Appli_BleAttentionTimerCb(void);
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size);
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size);
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLEUINT8 Appli_BleDisableFilterCb(void);
+void BLEMesh_PbAdvLinkCloseCb(void);
+void Appli_IntensityControlPublishing(MOBLEUINT8* value);
+
+int Appli_CheckBdMacAddr(void);
+MOBLE_RESULT Appli_LedBlink(void);
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl);
+
+void Appli_CheckForUnprovision(void);
+void Appli_Unprovision(void);
+void Appli_Process(void);
+void Appli_LedCtrl(void);
+void Appli_Init(MOBLEUINT8 *flag);
+
+MOBLE_ADDRESS GetAddressToConfigure(void);
+MOBLE_ADDRESS GetNewAddressToProvision(void);
+void SaveProvisionedNodeAddress(void);
+MOBLEUINT8* GetNewProvNodeDevKey(void);
+MOBLEUINT8* GetNewProvNodeAppKey(void);
+void IntensityPublish(void);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
+void Start_SelfConfiguration (void);
+void Appli_ProvisionerInit(void);
+
+
+#endif /* __APPLI_MESH_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c
index 380b0e3d8..8a166ac49 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/appli_nvm.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c
@@ -33,6 +33,7 @@
#include "app_conf.h"
#include "stm32_seq.h"
#endif
+#include "config_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -44,22 +45,12 @@
/* Private define ------------------------------------------------------------*/
extern const MOBLEUINT8* _bdaddr[];
-extern const MOBLEUINT8* _prvsnr_data[];
#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
extern MOBLEUINT8 PowerOnOff_flag;
#endif
-MOBLEUINT8 PrvnFlag = 0;
-
-#if defined SAVE_EMBD_PROVISION_DATA
-MOBLEUINT8 DataCopy[2048];
-#endif
-#ifdef ENABLE_PROVISIONER_FEATURE
-extern MOBLEUINT16 nodeAddressOffset;
-#endif
extern const void* appNvmBase;
-extern const void* prvsnr_data;
/*
@@ -84,15 +75,10 @@ extern const void* prvsnr_data;
#define APP_NVM_LIGHT_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE+APP_NVM_GENERIC_MODEL_SIZE)
#define APP_NVM_LIGHT_MODEL_SIZE 16U
-/* offset defined for the embedded provisioner node */
-#define PRVN_NVM_SUBPAGE_SIZE 16U
-#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_SUBPAGE_SIZE)
-#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
-
-#define FIRST_PRVND_NODE_ADDRSS 2U
-#define LAST_PRVND_NODE_ADDRSS (unsigned int)(PRVN_NVM_MAX_SUBPAGE+FIRST_PRVND_NODE_ADDRSS)
+#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
/* Private variables ---------------------------------------------------------*/
+
typedef struct
{
MOBLEUINT8 modelData[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE];
@@ -103,29 +89,13 @@ typedef struct
/* ALIGN(4) */
__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
-typedef struct
-{
- MOBLEUINT8 prvnData[PRVN_NVM_SUBPAGE_SIZE];
- MOBLEBOOL erasePageReq;
- MOBLEBOOL writeReq;
-} PRVN_NVM_REQS;
-
-/* ALIGN(4) */
-__attribute__((aligned(4))) PRVN_NVM_REQS PrvnNvm_Reqs;
-
MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
-MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 SubPageSize,
- MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset);
-//MOBLE_RESULT AppliNvm_FindFirstValidSubPage(MOBLEINT8* subPageIndex);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
-//MOBLE_RESULT AppliNvm_LoadGenericState(uint8_t state[], uint8_t* size);
-//MOBLE_RESULT AppliNvm_LoadLightState(uint8_t state[], uint8_t* size);
-//MOBLE_RESULT AppliNvm_PrvnFindFirstValidSubPage(MOBLEINT8* subPageIndex);
-//MOBLE_RESULT AppliNvm_PrvnMarkSubpageInvalid(void);
-//MOBLE_RESULT AppliNvm_SavePrvsnerData(uint8_t* data, uint8_t size);
-MOBLEUINT32* AppliPrvnNvm_GetSubPageData(MOBLE_ADDRESS addrss);
-MOBLE_RESULT AppliPrvnNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
#if 0
/**
@@ -195,92 +165,8 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
return result;
}
-/**
-* @brief Program word (32-bit) at a PRVN_NVM_BASE_OFFSET
-* @param TypeProgram Indicate the way to program at a specified address
-* @param Address: address to write
-* @param Data: word to write
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliPrvnNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
-{
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- if (offset > PRVN_NVM_PAGE_SIZE)
- {
- result = MOBLE_RESULT_INVALIDARG;
- }
- else if (size == 0)
- {
- result = MOBLE_RESULT_FALSE;
- }
- else if (offset + size > (PRVN_NVM_BASE_OFFSET + PRVN_NVM_PAGE_SIZE))
- {
- result = MOBLE_RESULT_INVALIDARG;
- }
- else if (offset & 3)
- {
- result = MOBLE_RESULT_INVALIDARG;
- }
- else if (size & 3)
- {
- result = MOBLE_RESULT_INVALIDARG;
- }
- else
- {
- result = MoblePalNvmWrite(PRVN_NVM_BASE_OFFSET, offset, buf, size);
- }
-
- return result;
-}
-
-#if 0
-/**
-* @brief Find first valid subpage available.
-* If no valid subpage found, erase page appli nvm to reset it
-* @param pointer to variable to update first valid subpage index
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliNvm_FindFirstValidSubPage(MOBLEINT8* subPageIndex)
-{
- MOBLEUINT32 valid[2];
- MOBLEINT8 subPageIdx = -1;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- /* find valid subpage */
- for (MOBLEUINT8 count=0; count<APP_NVM_MAX_SUBPAGE; count++)
- {
- unsigned int offset = APP_NVM_SUBPAGE_OFFSET(count);
-
- memcpy((void*)&valid, (void*)(APP_NVM_BASE + offset), 8);
- if ((valid[0] == 0xFFFFFFFF) && ((valid[1] == 0xFFFFFFFF)))
- {
- subPageIdx = count;
- break;
- }
- }
-
- /* if no valid subpage found, erase all subpages and reset subPageIdx */
- if (subPageIdx < 0)
- {
- AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
-#if (LOW_POWER_FEATURE == 1)
- UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
-#endif
- result = MOBLE_RESULT_FAIL;
- }
- else
- {
- result = MOBLE_RESULT_SUCCESS;
- }
-
- *subPageIndex = subPageIdx;
-
- return result;
-}
-#endif
-/**
+/**
* @brief Mark first valid subpage as invalid.
* @param void
* @retval MOBLE_RESULT_SUCCESS on success
@@ -289,23 +175,25 @@ MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
{
MOBLEUINT32 valid = 0;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEINT8 currSubPageIdx;
+ MOBLEINT16 currSubPageIdx;
MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
/* find valid subpage */
- result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));//AppliNvm_FindFirstValidSubPage(&currSubPageIdx);
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
- if (result != MOBLE_RESULT_SUCCESS)
+ if (result == MOBLE_RESULT_OUTOFMEMORY)
{
- /* do nothing */
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
}
else
{
/* mark valid subpage as invalid */
memcpy((void*)subPageTemp,
- (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ (void*)(PRVN_NVM_BASE_OFFSET + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
APP_NVM_SUBPAGE_SIZE);
subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
@@ -328,6 +216,7 @@ MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
return result;
}
+
/**
* @brief This function writes Reset count value in flash at APP_NVM_BASE + APP_NVM_RESERVED_SIZE
* if device has been turned ON 5 times consecutively with each ON duration < 2s, reset to factory settings
@@ -338,7 +227,7 @@ MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
*/
MOBLE_RESULT AppliNvm_FactorySettingReset(void)
{
- MOBLEINT8 currSubPageIdx = 0;
+ MOBLEINT16 currSubPageIdx = 0;
MOBLE_RESULT result;
MOBLEUINT32 resetCount;
MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
@@ -443,6 +332,7 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
return result;
}
+
/**
* @brief Save model states in nvm
* @param model state buff
@@ -465,6 +355,7 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
memcpy(AppliNvm_Reqs.modelData, state, size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
#if (LOW_POWER_FEATURE == 1)
UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
#endif
@@ -473,6 +364,7 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
return result;
}
+
/**
* @brief Clear model states in nvm
* @param none
@@ -484,11 +376,13 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
- MOBLEINT8 subPageIdx;
+ MOBLEINT16 subPageIdx;
MOBLEUINT8 clearBuff[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE] = {0};
MOBLEUINT32 valid = 0;
- result = AppliNvm_FindFirstEmptyPage(&subPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
(APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
if (MOBLE_FAILED(result))
@@ -531,111 +425,6 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
return result;
}
-#if 0
-/**
-* @brief Load generic states from nvm
-* @param generic state buff
-* @param generic state buff size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliNvm_LoadGenericState(uint8_t state[], uint8_t* size)
-{
-#if (SAVE_MODEL_STATE_NVM == 1)
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
- MOBLEINT8 subPageIdx;
-
- result = AppliNvm_FindFirstValidSubPage(&subPageIdx);
- if (result == MOBLE_RESULT_SUCCESS)
- {
- if(subPageIdx > 0)
- {
- /* Not the first reset */
- /* read the previous subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
- APP_NVM_GENERIC_MODEL_SIZE);
- *size = APP_NVM_GENERIC_MODEL_SIZE;
- }
- else
- {
- /* read the current subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
- APP_NVM_GENERIC_MODEL_SIZE);
- *size = APP_NVM_GENERIC_MODEL_SIZE;
- }
- }
- return result;
-#else /* SAVE_MODEL_STATE_NVM */
- *size = 0;
- return MOBLE_RESULT_SUCCESS;
-#endif /* SAVE_MODEL_STATE_NVM */
-}
-
-/**
-* @brief Load light states from nvm
-* @param light state buff
-* @param light state buff size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliNvm_LoadLightState(uint8_t state[], uint8_t* size)
-{
-#if (SAVE_MODEL_STATE_NVM == 1)
-// MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-//
-// memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData+APP_NVM_GENERIC_MODEL_SIZE), APP_NVM_LIGHT_MODEL_SIZE);
-// *size = APP_NVM_GENERIC_MODEL_SIZE;
-//
-// return result;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
- MOBLEINT8 subPageIdx;
-
- result = AppliNvm_FindFirstValidSubPage(&subPageIdx);
- if (result == MOBLE_RESULT_SUCCESS)
- {
- if(subPageIdx > 1)
- {
- /* Not the first reset */
- /* read the previous subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_LIGHT_MODEL_OFFSET]),
- APP_NVM_LIGHT_MODEL_SIZE);
- *size = APP_NVM_LIGHT_MODEL_SIZE;
- }
- else
- {
- /* read the current subpage */
- memcpy((void*)&(subPageTemp[0]),
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
- APP_NVM_SUBPAGE_SIZE);
-
- memcpy((void*)&(state[0]),
- (void*)&(subPageTemp[APP_NVM_LIGHT_MODEL_OFFSET]),
- APP_NVM_LIGHT_MODEL_SIZE);
- *size = APP_NVM_LIGHT_MODEL_SIZE;
- }
- }
- return result;
-#else /* SAVE_MODEL_STATE_NVM */
- *size = 0;
- return MOBLE_RESULT_SUCCESS;
-#endif /* SAVE_MODEL_STATE_NVM */
- }
-#endif
/**
* @brief Load Model states from nvm
@@ -667,7 +456,7 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
void AppliNvm_Process(void)
{
MOBLE_RESULT result;
- MOBLEINT8 subPageIdx;
+ MOBLEINT16 subPageIdx;
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
@@ -707,14 +496,18 @@ void AppliNvm_Process(void)
if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
&& AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
- result = AppliNvm_FindFirstEmptyPage(&subPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));//AppliNvm_FindFirstValidSubPage(&subPageIdx);
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
#if (LOW_POWER_FEATURE == 1)
UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
#endif
+ result = MOBLE_RESULT_FAIL;
}
else
{
@@ -755,6 +548,7 @@ void AppliNvm_Process(void)
}
}
+
/**
* @brief Fuction used to set the flag which is responsible for storing the
states in flash.
@@ -769,30 +563,32 @@ void AppliNvm_SaveMessageParam (void)
}
-/********************Embedded Provisioner *******************************/
-
/**
* @brief Find first valid subpage available.
* If no valid subpage found, erase page appli nvm to reset it
* @param pointer to variable to update first valid subpage index
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 SubPageSize,
- MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset)
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset)
{
MOBLEUINT32 valid[2];
MOBLEINT8 subPageIdx = -1;
MOBLEUINT32 *subPageOffset;
- MOBLEUINT32 addrssValidPage;
+ MOBLEUINT32 addressValidPage;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (MOBLEUINT8 count=0; count<totalSubPage; count++)
+ for (MOBLEUINT16 count=0; count<totalSubPage; count++)
{
- addrssValidPage = nvmBaseOffset + SubPageSize*count;
- subPageOffset = &addrssValidPage;
+ addressValidPage = nvmBaseOffset + SubPageSize*count;
+ subPageOffset = &addressValidPage;
+
+ /* Read 8 bytes and check if it's Empty */
memcpy((void*)&valid, (void*)(*subPageOffset), 8);
- if ((valid[0] == 0xFFFFFFFF) && ((valid[1] == 0xFFFFFFFF)))
+ if ((valid[0] == FLASH_EMPTY_SIGNATURE) /*&& (valid[1] == FLASH_EMPTY_SIGNATURE)*/)
{
subPageIdx = count;
break;
@@ -801,7 +597,7 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 Sub
if (subPageIdx < 0)
{
- TRACE_M(TF_PROVISION," Warning: No Valid Page Found,Erase operation \r\n");
+ TRACE_M(TF_PROVISION,"Out of Memory, Flash page is full \r\n");
result = MOBLE_RESULT_OUTOFMEMORY;
}
else
@@ -814,214 +610,12 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT8* subPageIndex,MOBLEUINT32 Sub
return result;
}
-/**
-* @brief Load Provisioner data from nvm
-* @param model state buff
-* @param model state buff size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size)
-{
-#if (SAVE_EMBD_PROVISION_DATA == 1)
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- memcpy((void*)state, (void*)(PrvnNvm_Reqs.prvnData), PRVN_NVM_SUBPAGE_SIZE);
- *size = PRVN_NVM_SUBPAGE_SIZE;
-
- return result;
-#else /* SAVE_EMBD_PROVISION_DATA */
- *size = 0;
- return MOBLE_RESULT_SUCCESS;
-#endif /* SAVE_EMBD_PROVISION_DATA */
-}
-
-/**
-* @brief Save Embedded provisioner data in nvm
-* @param data: data buffer to be saved
-* @param size: data buffer size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data, uint8_t size)
-{
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
-
- if (size > PRVN_NVM_SUBPAGE_SIZE)
- {
- /* incorrect size */
- result = MOBLE_RESULT_FAIL;
- }
- else
- {
- memcpy(PrvnNvm_Reqs.prvnData, data, size);
- PrvnNvm_Reqs.writeReq = MOBLE_TRUE;
-#if (LOW_POWER_FEATURE == 1)
- UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
- #endif
-
- if (MOBLE_FAILED(result))
- {
- result = MOBLE_RESULT_FAIL;
- }
- else
- {
- result = MOBLE_RESULT_SUCCESS;
- }
- }
-
- return result;
-}
-
-/**
-* @brief Function to get the particular node device key with node address friom the
-* provisioner flash.
-* @param MOBLE_ADDRESS: node address
-* @retval subPageAddrss: pointer to the sub page address
-*/
-MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss)
-{
- MOBLEUINT16 subPageIndx;
- MOBLEUINT32 *subPageAddrss;
-
- subPageIndx = addrss - FIRST_PRVND_NODE_ADDRSS;
-
- if(subPageIndx >= PRVN_NVM_MAX_SUBPAGE)
- {
- TRACE_M(TF_PROVISION,"Invalid Address \r\n");
- return 0;
- }
- else
- {
- subPageAddrss = (MOBLEUINT32 *)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(subPageIndx));
- TRACE_M(TF_PROVISION,"Address Of SubPage = %p \r\n", (void *)subPageAddrss);
- }
- return subPageAddrss;
-}
-
-/**
-* @brief backup by Copy all the data from the page in RAM.
-* @param model state buff
-* @param model state buff size
-* @retval MOBLE_RESULT_SUCCESS on success
-*/
-MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size)
-{
-
-#if SAVE_EMBD_PROVISION_DATA
- MOBLEUINT8 deviceKeysSaved[2048];
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- /* find valid subpage */
- for (MOBLEUINT8 count=0; count<8; count++)
- {
- memcpy((void*)deviceKeysSaved, (void*)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(count)), PRVN_NVM_SUBPAGE_SIZE);
- }
-
- *size = PRVN_NVM_SUBPAGE_SIZE;
-
- return result;
-#else /* SAVE_EMBD_PROVISION_DATA */
- *size = 0;
- return MOBLE_RESULT_SUCCESS;
-#endif /* SAVE_EMBD_PROVISION_DATA */
-
-}
-
-/**
-* @brief Process Provisioner NVM erase and write requests
-* @param void
-* @retval void
-*/
-void AppliPrvnNvm_Process(void)
-{
- MOBLE_RESULT result;
- MOBLEINT8 subPageIdx;
-
- if ( (PrvnNvm_Reqs.erasePageReq == MOBLE_FALSE) &&
- (PrvnNvm_Reqs.writeReq == MOBLE_TRUE) )
- {
- result = AppliNvm_FindFirstEmptyPage(&subPageIdx,PRVN_NVM_SUBPAGE_SIZE,
- PRVN_NVM_MAX_SUBPAGE,PRVN_NVM_BASE_OFFSET);
-
- if (result == MOBLE_RESULT_SUCCESS)
- {
- TRACE_M(TF_PROVISION,"Saving in SubPage[%.8x] = \r\n", PRVN_NVM_SUBPAGE_OFFSET(subPageIdx));
- result = AppliPrvnNvm_FlashProgram(PRVN_NVM_SUBPAGE_OFFSET(subPageIdx),
- PrvnNvm_Reqs.prvnData,
- PRVN_NVM_SUBPAGE_SIZE);
-
- if (result == MOBLE_RESULT_SUCCESS)
- {
- PrvnNvm_Reqs.writeReq = MOBLE_FALSE;
- }
- }
- else
- {
- //AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
- }
- }
-}
/**
-* @brief This function is to save the provisioner device key in the flash.
-* @param data:Pointer to the data passed.
-* @param size:size of the data
-* @param prvnFlag:Pointer to the flag passed.
-* @retval void
+* @}
*/
-void AppliNvm_saveProvisionerDevKey(MOBLEUINT8 *data , MOBLEUINT8 size , MOBLEUINT8 *prvnFlag)
-{
- if(*prvnFlag == 1)
- {
- AppliPrvnNvm_SaveData(&data[0] ,size);
- prvnFlag = 0;
- }
-}
/**
-* @brief This function load the Provisioner nvm data to the buffer after reset.
-* @param void
-* @retval MOBLE_RESULT_SUCCESS on success
+* @}
*/
-MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8 *flag)
-{
- MOBLEINT8 currSubPageIdx;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-
- result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,PRVN_NVM_SUBPAGE_SIZE,
- PRVN_NVM_MAX_SUBPAGE,PRVN_NVM_BASE_OFFSET);
-
- if(result == MOBLE_RESULT_OUTOFMEMORY)
- {
- result = MOBLE_RESULT_FAIL;
- //AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
- }
- else
- {
- /* After reset of provisioner , retreiving the next node address to be provisioned */
-#ifdef ENABLE_PROVISIONER_FEATURE
-
- if(currSubPageIdx > 0)
- {
- nodeAddressOffset = currSubPageIdx + 1;
- }
-
-#endif
-
-
- if(currSubPageIdx > 0)
- {
- currSubPageIdx = currSubPageIdx-1;
- }
-
- /* Load model data copy from nvm */
- memcpy((void*)PrvnNvm_Reqs.prvnData,
- (void*)(PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx)),PRVN_NVM_SUBPAGE_SIZE);
-
-
- TRACE_I(TF_PROVISION,"NEXT NVM ADDRESS %.8x \r\n",PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx+PRVN_NVM_SUBPAGE_SIZE));
-
- }
-
- return result;
-}
-
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h
new file mode 100644
index 000000000..34667f26c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h
@@ -0,0 +1,92 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.h
+ * @author BLE Mesh Team
+ * @brief Header file for the NVM application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_NVM_H
+#define __APPLI_NVM_H
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+extern const void *prvsnr_data;
+
+/* offset defined for the embedded provisioner node */
+#define PRVN_NVM_PAGE_SIZE 4096U
+#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
+#define PRVN_NVM_CHUNK_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_SUBPAGE_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_CHUNK_SIZE)
+#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
+
+#define APP_NVM_BASE ((unsigned int)appNvmBase)
+#define APP_NVM_SIZE 4096U
+
+/* Exported variables ------------------------------------------------------- */
+typedef struct
+{
+ MOBLEUINT8 devKey[4+DEVICE_KEY_SIZE];
+
+#if ENABLE_SAVE_UUID_PER_NODE
+ MOBLEUINT8 node_UUID[UUID_SIZE];
+#endif
+
+} NvmPerNode_t;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FactorySettingReset(void);
+//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
+MOBLE_RESULT AppliNvm_ClearModelState(void);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+void AppliNvm_Process(void);
+void AppliNvm_SaveMessageParam (void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
+
+MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data,
+ MOBLE_ADDRESS address,
+ uint8_t* pUUID,
+ uint8_t numElements);
+
+MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
+void AppliPrvnNvm_Process(void);
+
+MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
+
+MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
+
+void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
+ MOBLE_ADDRESS address,
+ MOBLEUINT8 *prvnFlag,
+ MOBLEUINT8 numOfElements);
+
+void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+
+
+#endif /* __APPLI_NVM_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c
new file mode 100644
index 000000000..7ae8b7d10
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c
@@ -0,0 +1,633 @@
+/**
+ ******************************************************************************
+ * @file appli_sensor.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Sensor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "hal_common.h"
+#include "types.h"
+#include "sensors.h"
+#include "light_lc.h"
+#include "appli_sensor.h"
+#include "mesh_cfg.h"
+//#include "LPS25HB.h"
+#include "string.h"
+#include "common.h"
+#include "math.h"
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application_Mesh_Models
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#if 0
+/**
+* @brief PRESSURE init structure definition
+*/
+PRESSURE_InitTypeDef InitStructure =
+{
+ LPS25HB_ODR_1Hz,
+ LPS25HB_BDU_READ,
+ LPS25HB_DIFF_ENABLE,
+ LPS25HB_SPI_SIM_3W,
+ LPS25HB_P_RES_AVG_32,
+ LPS25HB_T_RES_AVG_16
+};
+#endif
+
+/* Application variables of sensor model definition */
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus;
+Appli_Sensor_SettingSet_t Appli_Sensor_SettingSet;
+
+/* By Default value used for cadence set for testing. */
+Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR] = {
+ {0x0071 , 0x2 , 2 , 2 ,2 ,0 ,0X05 , 0x64},
+ {0x2A6D , 0x2 , 1 , 1 , 1, 0, 0X258 , 0x3ED}
+};
+#endif
+
+MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
+{
+ {TEMPERATURE_PID},
+ {PRESSURE_PID}
+};
+MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
+extern MOBLEUINT8 NumberOfElements;
+extern MOBLEUINT8 ProvisionFlag;
+
+/* Temperature and Pressure init structure*/
+#if 0
+ PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
+#endif
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+/**
+* @brief Appli_Sensor_Cadence_Set: This function is callback for Application
+* when sensor cadence Set message is received
+* @param pCadence_param: Pointer to the parameters received for message
+* @param property_ID: Property is of sensor coming in data packet
+* @param length: Received data length.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param, MOBLEUINT16 property_ID, MOBLEUINT32 length)
+{
+ if(property_ID == (MOBLEUINT16)TEMPERATURE_PID)
+ {
+ Sensor_CadenceSet[0].Property_ID = pCadence_param->Property_ID;
+ Sensor_CadenceSet[0].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
+ Sensor_CadenceSet[0].StatusTriggerType = pCadence_param->StatusTriggerType ;
+ Sensor_CadenceSet[0].triggerDeltaDown = pCadence_param->triggerDeltaDown;
+ Sensor_CadenceSet[0].triggerDeltaUp = pCadence_param->triggerDeltaUp;
+ Sensor_CadenceSet[0].StatusMinInterval = pCadence_param->StatusMinInterval;
+ Sensor_CadenceSet[0].FastCadenceLow = pCadence_param->FastCadenceLow;
+ Sensor_CadenceSet[0].FastCadenceHigh = pCadence_param->FastCadenceHigh;
+ }
+ else if(property_ID == (MOBLEUINT16)PRESSURE_PID)
+ {
+
+ Sensor_CadenceSet[1].Property_ID = pCadence_param->Property_ID;
+ Sensor_CadenceSet[1].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
+ Sensor_CadenceSet[1].StatusTriggerType = pCadence_param->StatusTriggerType ;
+ Sensor_CadenceSet[1].triggerDeltaDown = pCadence_param->triggerDeltaDown;
+ Sensor_CadenceSet[1].triggerDeltaUp = pCadence_param->triggerDeltaUp;
+ Sensor_CadenceSet[1].StatusMinInterval = pCadence_param->StatusMinInterval;
+ Sensor_CadenceSet[1].FastCadenceLow = pCadence_param->FastCadenceLow;
+ Sensor_CadenceSet[1].FastCadenceHigh = pCadence_param->FastCadenceHigh;
+ }
+ else
+ {
+ /* No Comments */
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_Setting_Set: This function is callback for Application
+* when sensor setting Set message is received
+* @param pSensor_SettingParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_Sensor_SettingSet.Property_ID = pSensor_SettingParam->Property_ID;
+ Appli_Sensor_SettingSet.Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
+ Appli_Sensor_SettingSet.Sensor_Setting_Access = pSensor_SettingParam->Sensor_Setting_Access;
+ Appli_Sensor_SettingSet.Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_Data_Status: This function is callback for Application
+* when sensor get message is received
+* @param sensor_Data: Pointer to the parameters to be send in message
+* @param pLength: Length of the parameters to be sent in response
+* @param prop_ID: Property is of sensor coming in data packet
+* @param length: Received data length
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength,
+ MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLEUINT32 temperatureData = 0;
+ MOBLEUINT32 pressureData = 0;
+ MOBLEUINT8 data_Length = 0x03;
+ MOBLEUINT32 distance = 0x000000C8; // 200 cm;
+
+#if 0
+ LPS25HB_GetTemperature((float*)&temperatureData);
+
+ LPS25HB_GetPressure((float*)&pressureData);
+#endif
+
+ result = Check_Property_ID(Property_ID_Table , prop_ID);
+
+ if((prop_ID == TEMPERATURE_PID ) && (length > 0))
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ *(sensor_Data) = ((TEMPERATURE_PID & 0x07) << 5) | (data_Length <<1) ;
+ *(sensor_Data+1) = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&temperatureData,4);
+
+ *pLength =6;
+ }
+ else if((prop_ID == PRESSURE_PID) && (length > 0))
+{
+ /* Format B for Pressure sensor */
+ *(sensor_Data+0) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+1) = (MOBLEUINT8)PRESSURE_PID ;
+ *(sensor_Data+2) = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&pressureData,4);
+
+ *pLength =7;
+ }
+ else if((prop_ID == TIME_OF_FLIGHT_PID) && (length > 0))
+ {
+ /* Format B for Pressure sensor */
+ *(sensor_Data+0) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+1) = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
+ *(sensor_Data+2) = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&distance,4);
+
+ *pLength =7;
+ }
+ else if((result == MOBLE_RESULT_FALSE) && (length == 0))
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ *(sensor_Data) = ((TEMPERATURE_PID & 0x07) << 5) | (data_Length <<1) ;
+ *(sensor_Data+1) = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&temperatureData,4);
+
+ /* Format B for Pressure sensor */
+ *(sensor_Data+6) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+7) = (MOBLEUINT8)PRESSURE_PID ;
+ *(sensor_Data+8) = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[9],(void*)&pressureData,4);
+
+ /* Format B for Pressure sensor */
+ *(sensor_Data+13) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+14) = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
+ *(sensor_Data+15) = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
+
+ memcpy(&sensor_Data[16],(void*)&distance,4);
+
+ *pLength =20;
+ }
+ else
+ {
+ /* No Comments */
+ }
+
+ TRACE_M(TF_SENSOR,"the temperature reading from sender in hex 0x%08lx \n\r ", temperatureData);
+ TRACE_M(TF_SENSOR,"the pressure reading from sender in hex 0x%08lx \n\r", pressureData );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Sensor_Descriptor_Status: This function is callback for Application
+* when sensor get message is received
+* @param sensor_Descriptor: Pointer to the parameters to be send in message
+* @param pLength: Length of the parameters to be sent in response
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor , MOBLEUINT32* pLength)
+{
+ Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] = {{PRESSURE_PID,0xABC,0xDEF,0x03,0x04,0x05},
+ {TEMPERATURE_PID,0xc56,0xd78,0x06,0x07,0x08},
+ {TIME_OF_FLIGHT_PID,0xD23,0xE45,0x06,0x07,0x08}};
+ MOBLEUINT32 tolerance;
+ tolerance = Appli_Sensor_DescriptorStatus1[0].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[0].PositiveTolerance;
+
+ *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[0].Prop_ID;
+ *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[0].Prop_ID >> 8;
+ *(sensor_Descriptor+2) = tolerance;
+ *(sensor_Descriptor+3) = tolerance >> 8;
+ *(sensor_Descriptor+4) = tolerance >> 16;
+ *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[0].SamplingFunction;
+ *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[0].MeasurementPeriod;
+ *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[0].UpdateInterval;
+
+ tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
+
+ *(sensor_Descriptor+8) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
+ *(sensor_Descriptor+9) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
+ *(sensor_Descriptor+10) = tolerance;
+ *(sensor_Descriptor+11) = tolerance >> 8;
+ *(sensor_Descriptor+12) = tolerance >> 16;
+ *(sensor_Descriptor+13) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
+ *(sensor_Descriptor+14) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
+ *(sensor_Descriptor+15) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
+
+ tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+
+ *(sensor_Descriptor+16) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
+ *(sensor_Descriptor+17) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
+ *(sensor_Descriptor+18) = tolerance;
+ *(sensor_Descriptor+19) = tolerance >> 8;
+ *(sensor_Descriptor+20) = tolerance >> 16;
+ *(sensor_Descriptor+21) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
+ *(sensor_Descriptor+22) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
+ *(sensor_Descriptor+23) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
+
+ *pLength = 24;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @brief Sensor Process Function will continuously monitor the sensors.
+* Function used for the Publishing, data monitoring..
+* @param void
+* @retval void
+*/
+void Sensor_Process(void)
+{
+
+#ifdef ENABLE_SENSOR_PUBLICATION
+ float sensorValue[NUMBER_OF_SENSOR];
+ if(ProvisionFlag == 1)
+ {
+ Read_Sensor_Data(&sensorValue[0]);
+ Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ }
+#endif
+
+ /* Occupancy_Flag become True when ever sensor detect occupancy and get interrupt
+ and make flag True to run this routine.
+ */
+ if(Occupancy_Flag == MOBLE_TRUE)
+ {
+ if(BLE_waitPeriod(CONTROLLER_WAIT_TIME))
+ {
+#ifdef ENABLE_SENSOR_PUBLICATION
+ if(ProvisionFlag == 1)
+ {
+ Read_Sensor_Data(&sensorValue[0]);
+ Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ }
+#endif
+
+ /* publishing the command for LC Light occupancy set message in the sensor status
+ message .
+ */
+ Sensor_LC_Light_Publish();
+ Occupancy_Flag = MOBLE_FALSE;
+ }
+ }
+}
+
+/**
+* @brief Function check for the couupancy in the location and send the status
+ message with the ocuppancy value, when the interrupt is detected.
+* @param void
+* @retval void
+*/
+void Sensor_LC_Light_Publish(void)
+{
+ MOBLEUINT8 occupancyData = 0x1;
+ MOBLEUINT8 sensor_Data[5];
+ MOBLE_ADDRESS srcAdd;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
+ sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
+ sensor_Data[2] = occupancyData;
+
+ srcAdd = BLEMesh_GetAddress();
+
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
+ SENSOR_STATUS ,
+ sensor_Data,3,
+ MOBLE_FALSE, MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ }
+
+}
+
+#if defined ENABLE_SENSOR_PUBLICATION && defined ENABLE_SENSOR_MODEL_SERVER
+/**
+* @brief Function read the particular sensor value which are called inside.
+* @param pSensorValue: pointer to the sensor data array.
+* @retval void
+*/
+void Read_Sensor_Data(float *pSensorValue)
+{
+#if 0
+ float temp,press;
+ LPS25HB_GetTemperature(&temp);
+ pSensorValue[0] = temp;
+ LPS25HB_GetPressure(&press);
+ pSensorValue[1] = press;
+#endif
+}
+
+/**
+* @brief Sensor Publication Process function
+* @param Function will publish the sensor data according to the given conditions.
+* @param void type function pointer.
+* @param pSensorData: Pointer to the sensor data array.
+* @param pProp_ID: Pointer to the Property id of sensor array.
+* @retval void
+*/
+void Sensor_Publication_Process(float* pSensorData, MODEL_Property_IDTableParam_t* pProp_ID)
+{
+ static MOBLEUINT8 sensor_Count = 0;
+ displayFloatToInt_t out_value;
+ MOBLEUINT8 devisorValue;
+ MOBLEUINT32 publishTime;
+ static MOBLEUINT32 cadenceDurationTick[NUMBER_OF_SENSOR];
+ static float previousDataValue[NUMBER_OF_SENSOR];
+ static PublishingDataFlag_t PublishingDataFlag[NUMBER_OF_SENSOR] = {MOBLE_FALSE};
+
+ floatToInt(pSensorData[sensor_Count], &out_value, 2);
+
+ /* Taking the timestamp for the cadence publication and making flag high */
+ if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ {
+ cadenceDurationTick[sensor_Count] = Clock_Time();
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ }
+ /* Taking the sensor value and store it for comparing present sensor value with
+ particular difference of increasing or decreasing. and making flag high.
+ */
+ if(PublishingDataFlag[sensor_Count].DeltaDataFlag == MOBLE_FALSE)
+ {
+ previousDataValue[sensor_Count] = pSensorData[sensor_Count];
+ PublishingDataFlag[sensor_Count].DeltaDataFlag = MOBLE_TRUE;
+ }
+ /*
+ This condition is checking for the difference of present sensor value
+ with prestored sensor value with user defined difference,if this condition
+ is true then it publish the sensor data.And making the delta flag low again.
+ */
+ if((pSensorData[sensor_Count] >= (previousDataValue[sensor_Count] + Sensor_CadenceSet[sensor_Count].triggerDeltaUp)) ||
+ (pSensorData[sensor_Count] <= (previousDataValue[sensor_Count] - Sensor_CadenceSet[sensor_Count].triggerDeltaDown)))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+
+ PublishingDataFlag[sensor_Count].DeltaDataFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"previous value data %.3f \r\n",previousDataValue[sensor_Count]);
+ TRACE_M(TF_SENSOR,"Delta publication of data %.3f\r\n",*((float*)&pSensorData[sensor_Count]));
+ sensor_Count++;
+ }
+ /*
+ This condition is continuously checking the sensor value range, if that
+ value is within the user defined range then publishing duration or rate will
+ be divided by user definedcadence devisor value and rate of publishing will
+ become high.And making the cadence flag low again.
+ */
+ if(((out_value.out_int <= Sensor_CadenceSet[sensor_Count].FastCadenceHigh) &&
+ (out_value.out_int >= Sensor_CadenceSet[sensor_Count].FastCadenceLow)) ||
+ (Sensor_CadenceSet[sensor_Count].FastCadenceHigh < Sensor_CadenceSet[sensor_Count].FastCadenceLow))
+ {
+ devisorValue = (MOBLEUINT8)pow(2 ,Sensor_CadenceSet[sensor_Count].FastCadenceDevisor);
+ publishTime = SENSOR_PUBLISH_PERIOD/devisorValue;
+
+ if(((Clock_Time()- cadenceDurationTick[sensor_Count]) >= publishTime))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"Cadence publication of data %.2f \r\n",*((float*)&pSensorData[sensor_Count]));
+ sensor_Count++;
+ }
+ }
+ else
+ {
+ publishTime = SENSOR_PUBLISH_PERIOD ;
+
+ if(((Clock_Time()- cadenceDurationTick[sensor_Count]) >= SENSOR_PUBLISH_PERIOD))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"Regular publication of data %.3f \r\n",*((float*)&pSensorData[sensor_Count]));
+ }
+ }
+ if(sensor_Count > 1)
+ {
+ sensor_Count = 0;
+ }
+
+}
+
+/**
+* @brief BLEMesh Sensor Publication function
+* @param Function will decide the publish address and element.
+* @param pSensor_Value: Pointer to the sensor data array
+* @param pProp_ID: pointer to the property id of sensor array.
+* @retval void
+*/
+void SensorDataPublish(MOBLEUINT32 *pSensor_Value , MOBLEUINT16* pProp_ID)
+{
+ MOBLEUINT32 length;
+ MOBLEUINT8 sensor_Data[8];
+ MOBLE_ADDRESS srcAdd;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ srcAdd = BLEMesh_GetAddress();
+
+ switch(*pProp_ID)
+ {
+ case TEMPERATURE_PID:
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ sensor_Data[0] = ((TEMPERATURE_PID & 0x07) << 5) | (3 <<1) ;
+ sensor_Data[1] = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&pSensor_Value[0],4);
+ length =6;
+ break;
+ }
+ case PRESSURE_PID:
+ {
+ /* Format B for Pressure sensor */
+ sensor_Data[0] = ((0x03 <<1) | 0x01);
+ sensor_Data[1] = (MOBLEUINT8)PRESSURE_PID ;
+ sensor_Data[2] = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
+ length =7;
+ break;
+ }
+ default:
+ break;
+ }
+
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
+ SENSOR_STATUS ,
+ sensor_Data,length,
+ MOBLE_FALSE, MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ }
+
+}
+
+#endif
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+/**
+* @brief Appli_Sensor_GetSettingStatus: This function is callback for Application
+* when sensor setting numbers status message is to be provided
+* @param pSetting_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+{
+
+ *pSetting_Status = Appli_Sensor_SettingSet.Property_ID;
+ *(pSetting_Status+1) = Appli_Sensor_SettingSet.Property_ID >> 8;
+ *(pSetting_Status+2) = Appli_Sensor_SettingSet.Sensor_Setting_ID;
+ *(pSetting_Status+3) = Appli_Sensor_SettingSet.Sensor_Setting_ID >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_GetSetting_IDStatus: This function is callback for Application
+* when sensor setting numbers and row value status message is to be provided
+* @param pSetting_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status)
+{
+
+ *pSetting_Status = Appli_Sensor_SettingSet.Property_ID;
+ *(pSetting_Status+1) = Appli_Sensor_SettingSet.Property_ID >> 8;
+ *(pSetting_Status+2) = Appli_Sensor_SettingSet.Sensor_Setting_ID;
+ *(pSetting_Status+3) = Appli_Sensor_SettingSet.Sensor_Setting_ID >> 8;
+ *(pSetting_Status+4) = Appli_Sensor_SettingSet.Sensor_Setting_Access;
+ *(pSetting_Status+5) = Appli_Sensor_SettingSet.Sensor_Setting_Value;
+ *(pSetting_Status+6) = Appli_Sensor_SettingSet.Sensor_Setting_Value >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @brief Check_Property_ID: This function is used for checking the Property id
+* of sensor available in table.
+* @param prop_ID_Table: address of the property id table array.
+* @param prop_ID:received property id of sensor.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
+ , MOBLEUINT16 prop_ID)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_FALSE;
+
+ for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ {
+ if(prop_ID_Table[i].Property_ID == prop_ID)
+ {
+ status = MOBLE_RESULT_SUCCESS;
+ break;
+ }
+ }
+ return status;
+}
+
+/**
+* @brief Appli_Sensor_Init: This function is callback for Initialisation of
+* Application interface
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Init(void)
+{
+#if 0
+ LPS25HB_Init(&InitStructure);
+#endif
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h
new file mode 100644
index 000000000..d608f35e6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h
@@ -0,0 +1,103 @@
+/**
+ ******************************************************************************
+ * @file appli_sensor.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Light Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_SENSOR_H
+#define __APPLI_SENSOR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+#define CONTROLLER_WAIT_TIME 1000
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+/* Application variables------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/* Sensor Cadence set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 Prop_ID;
+ MOBLEUINT16 PositiveTolerance;
+ MOBLEUINT16 NegativeTolerance;
+ MOBLEUINT8 SamplingFunction;
+ MOBLEUINT8 MeasurementPeriod;
+ MOBLEUINT8 UpdateInterval;
+}Appli_Sensor_DescriptorStatus_t;
+
+/* Sensor Setting set */
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT16 Sensor_Setting_ID;
+ MOBLEUINT8 Sensor_Setting_Access;
+ MOBLEUINT16 Sensor_Setting_Value;
+}Appli_Sensor_SettingSet_t;
+
+
+/* structure of flags used for publishing data */
+typedef struct
+{
+ MOBLEBOOL CadenceDurationFlag ;
+ MOBLEBOOL DeltaDataFlag ;
+}PublishingDataFlag_t;
+
+/* structure for the cadence set */
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT8 FastCadenceDevisor;
+ MOBLEUINT8 StatusTriggerType;
+ MOBLEUINT8 triggerDeltaDown;
+ MOBLEUINT8 triggerDeltaUp;
+ MOBLEUINT8 StatusMinInterval;
+ float FastCadenceLow;
+ float FastCadenceHigh;
+}Sensor_CadenceSet_t;
+#pragma pack(4)
+
+MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param, MOBLEUINT16 property_ID,
+ MOBLEUINT32 length);
+MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength,
+ MOBLEUINT16 prop_ID , MOBLEUINT32 length);
+MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Discriptor ,
+ MOBLEUINT32* pLength);
+MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
+ MOBLEUINT8 OptionalValid);
+
+void Sensor_Publication_Process(float* , MODEL_Property_IDTableParam_t*);
+void SensorDataPublish(MOBLEUINT32 * , MOBLEUINT16*);
+void Read_Sensor_Data(float *);
+MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
+ , MOBLEUINT16 prop_ID);
+
+MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status);
+MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status);
+MOBLE_RESULT Appli_Sensor_Init(void);
+void Sensor_Process(void);
+void Sensor_LC_Light_Publish(void);
+
+#endif /* __APPLI_SENSOR_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c
new file mode 100644
index 000000000..405be02c8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c
@@ -0,0 +1,505 @@
+/**
+ ******************************************************************************
+ * @file appli_vendor.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Vendor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "vendor.h"
+#include "appli_vendor.h"
+#include "common.h"
+#include "appli_light.h"
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include <string.h>
+
+
+/** @addtogroup MODEL_VENDOR
+* @{
+*/
+
+/** @addtogroup Vendor_Model_Callbacks
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT16 BuffLength;
+extern MOBLEUINT8 Appli_LedState;
+extern uint16_t DUTY;
+MOBLEUINT32 TestHitCounter = 0;
+extern Appli_LightPwmValue_t Appli_LightPwmValue;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Process the Vendor Device Info Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_DeviceInfo(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLEUINT8 tempBuffer[10];
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ MOBLEUINT8 subCmd = data[0];
+ char *libVersion;
+ char *subLibVersion;
+ MOBLEUINT8 inc = 0;
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0] = subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#02-%02hx! \n\r",data[0]);
+
+ switch(subCmd)
+ {
+ case IC_TYPE:
+ {
+#ifdef BLUENRG1_DEVICE
+ ResponseBuffer[1] = BLUENRG1_BRD;
+#endif
+
+#ifdef BLUENRG2_DEVICE
+ ResponseBuffer[1] = BLUENRG2_BRD;
+#endif
+
+#ifdef BLUENRG_MS
+ ResponseBuffer[1] = BLUENRG_MS_BRD;
+#endif
+
+#ifdef STM32WB55xx
+ ResponseBuffer[1] = STM32WB55XX_BRD;
+#endif
+
+ BuffLength = 2;
+ break;
+ }
+ case LIB_VER:
+ {
+ libVersion = BLEMesh_GetLibraryVersion();
+ while(*libVersion != '\0')
+ {
+ tempBuffer[inc] = *libVersion;
+ if(tempBuffer[inc] != 0x2E)
+ {
+ tempBuffer[inc] = BLEMesh_ModelsASCII_To_Char(tempBuffer[inc]);
+ TRACE_M(TF_VENDOR,"Lib version is %x\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ else
+ {
+ TRACE_M(TF_VENDOR,"Lib version is %c\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ libVersion++;
+
+ inc++;
+ }
+ ResponseBuffer[1]= tempBuffer[0];
+ ResponseBuffer[2]= tempBuffer[1];
+ ResponseBuffer[3]= tempBuffer[3];
+ ResponseBuffer[4]= tempBuffer[4];
+ ResponseBuffer[5]= tempBuffer[6];
+ ResponseBuffer[6]= tempBuffer[7];
+ ResponseBuffer[7]= tempBuffer[8];
+ BuffLength = 8;
+ break;
+ }
+ case LIB_SUB_VER:
+ {
+ subLibVersion = BLEMesh_GetLibrarySubVersion();
+ while(*subLibVersion != '\0')
+ {
+ tempBuffer[inc] = * subLibVersion;
+ if((tempBuffer[inc] != 0x2E) && (tempBuffer[inc] != 0x52))
+ {
+ tempBuffer[inc] = BLEMesh_ModelsASCII_To_Char(tempBuffer[inc]);
+ TRACE_M(TF_VENDOR,"Sub Lib version is %x\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ else
+ {
+ TRACE_M(TF_VENDOR,"Sub Lib version is %c\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ subLibVersion++;
+ inc++;
+ }
+ ResponseBuffer[1]= tempBuffer[0];
+ ResponseBuffer[2]= tempBuffer[1];
+ ResponseBuffer[3]= tempBuffer[3];
+ ResponseBuffer[4]= tempBuffer[5];
+ ResponseBuffer[5]= tempBuffer[7];
+ ResponseBuffer[6]= tempBuffer[9];
+
+ BuffLength = 7;
+
+ break;
+ }
+ case APPLICATION_VER:
+ {
+ /*Insert Command to check Application Version*/
+ break;
+ }
+
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+
+ }
+
+ return status;
+}
+
+
+/**
+* @brief Process the Vendor Test Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#01-%02hx! \n\r",data[0]);
+ switch(subCmd)
+ {
+ case APPLI_TEST_ECHO:
+ {
+ if(length > sizeof(ResponseBuffer))
+ {
+ length = sizeof(ResponseBuffer);
+ TRACE_M(TF_VENDOR,"Length received greater than size of response buffer \r\n");
+ }
+ memcpy (&(ResponseBuffer[1]),&(data[1]),(length-1));
+ BuffLength = length;
+ break;
+ }
+ case APPLI_TEST_RANDOMIZATION_RANGE:
+ {
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_TEST_COUNTER:
+ {
+ if((DUTY <= PWM_TIME_PERIOD) && (DUTY > 1))
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ TRACE_M(TF_VENDOR,"Test Counter is running \r\n");
+ ResponseBuffer[0] = subCmd;
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_TEST_INC_COUNTER:
+ {
+
+ if((DUTY <= PWM_TIME_PERIOD) && (DUTY > 1))
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+
+ TestHitCounter++;
+ TRACE_M(TF_VENDOR,"Command received Count %.2lx \r\n",TestHitCounter);
+ ResponseBuffer[0] = subCmd;
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_MODEL_PUBLISH_SELECT:
+ {
+ for (MOBLEUINT8 idx=0; idx<length; idx++)
+ {
+ TRACE_I(TF_VENDOR,"data[%d]= %d",idx,data[idx]);
+ TRACE_I(TF_VENDOR,"\n\r");
+ }
+ break;
+ }
+
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+
+ return status;
+}
+
+
+/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementNumber : element selected for a node
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCommand;
+ subCommand = data[0];
+ MOBLEUINT16 duty;
+ MOBLEUINT16 intensityValue = 0;
+/* tClockTime delay_t = Clock_Time(); */
+
+ TRACE_M(TF_VENDOR_COMMAND,"#03-%02hx!\n\r",data[0]);
+ switch(subCommand)
+ {
+ /*
+ Message Received B0 B1 B2 B3 B4 B5 B6 B7
+ B0 - Sub-Cmd LED
+ B1-B7 - Data Bytes
+ */
+ case APPLI_CMD_LED_BULB:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+
+ /* Toggle Command */
+ case APPLI_CMD_TOGGLE:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ if(Appli_LedState == 1)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#else
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#endif
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
+ }
+
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* On Command */
+ case APPLI_CMD_ON:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+ BSP_LED_On(LED_BLUE);
+ Appli_LedState = 1;
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM3, mapped on PWM3_PIN (GPIO_2 in mapping) */
+ BSP_LED_On(LED_BLUE);
+ Appli_LedState = 1;
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* Off Command */
+ case APPLI_CMD_OFF:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#else
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#endif
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM3, mapped on PWM3_PIN (GPIO_2 in mapping) */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+
+ break;
+ }
+ /* intensity command */
+ case APPLI_CMD_LED_INTENSITY:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ intensityValue = data[2] << 8;
+ intensityValue |= data[1];
+
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* Default case - Not valid command */
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ /*Buffer will be sent for Reliable Response*/
+ /*First Byte is Sub Command and 2nd Byte is LED Status*/
+ ResponseBuffer[0] = subCommand;
+ if(subCommand == APPLI_CMD_LED_INTENSITY)
+ {
+ ResponseBuffer[1] = intensityValue >> 8 ;
+ ResponseBuffer[2] = intensityValue ;
+ BuffLength = 3;
+ }
+ else
+ {
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ }
+
+ return status;
+}
+
+/**
+* @brief Process the Vendor Data write Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_Data_write(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#0E-%02hx! \n\r",data[0]);
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
+}
+
+/**
+* @brief Appli_GetTestValue: This function is callback for Application
+* when Vensor application test command received then status message is to be provided
+* @param responseValue: Pointer to the status message
+* @retval void
+*/
+void Appli_GetTestValue (MOBLEUINT8 *responseValue)
+{
+ *responseValue = TestHitCounter;
+ *(responseValue+1) = TestHitCounter >> 8;
+ *(responseValue+2) = TestHitCounter >> 16;
+ *(responseValue+3) = TestHitCounter >> 24;
+ TestHitCounter = 0;
+}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h
new file mode 100644
index 000000000..2b9390099
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h
@@ -0,0 +1,43 @@
+/**
+ ******************************************************************************
+ * @file appli_vendor.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Vendor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_VENDOR_H
+#define __APPLI_VENDOR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+#define LED_OFF_VALUE 1U
+#define LED_ON_VALUE 32000U
+/* Private define ------------------------------------------------------------*/
+
+MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementNumber, MOBLE_ADDRESS dst_peer);
+MOBLE_RESULT Appli_Vendor_DeviceInfo(MOBLEUINT8 const *data, MOBLEUINT32 length);
+MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length);
+MOBLE_RESULT Appli_Vendor_Data_write(MOBLEUINT8 const *data, MOBLEUINT32 length);
+void Appli_GetTestValue (MOBLEUINT8 *responseValue);
+
+#endif /* __APPLI_VENDOR_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h
new file mode 100644
index 000000000..4cc3ce72b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_conf.h
@@ -0,0 +1,74 @@
+/**
+ ******************************************************************************
+ * @file ble_conf.h
+ * @author MCD Application Team
+ * @brief BLE configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_CONF_H
+#define __BLE_CONF_H
+
+#include "app_conf.h"
+
+/******************************************************************************
+ *
+ * BLE SERVICES CONFIGURATION
+ * blesvc
+ *
+ ******************************************************************************/
+#define BLE_CFG_MESH 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Peripheral Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_PERIPHERAL 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Central Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_CENTRAL 1
+
+#define BLE_CFG_BROADCASTER 1
+
+#define BLE_CFG_OBSERVER 1
+
+#define BLE_CFG_DATA_ROLE_MODE 4
+
+
+/**
+ * There is one handler per service enabled
+ * Note: There is no handler for the Device Information Service
+ *
+ * This shall take into account all registered handlers
+ * (from either the provided services or the custom services)
+ */
+#define BLE_CFG_SVC_MAX_NBR_CB 7
+
+#define BLE_CFG_CLT_MAX_NBR_CB 5
+
+/******************************************************************************
+ * GAP Service - Apprearance
+ ******************************************************************************/
+#define BLE_CFG_UNKNOWN_APPEARANCE (0)
+#define BLE_CFG_HR_SENSOR_APPEARANCE (832)
+#define BLE_CFG_GAP_APPEARANCE (BLE_CFG_UNKNOWN_APPEARANCE)
+
+#endif /*__BLE_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h
new file mode 100644
index 000000000..35a4d96ab
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/ble_dbg_conf.h
@@ -0,0 +1,207 @@
+/**
+ ******************************************************************************
+ * @file ble_dbg_conf.h
+ * @author MCD Application Team
+ * @brief BLE Debug configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_DBG_CONF_H
+#define __BLE_DBG_CONF_H
+
+/**
+ * Enable or Disable traces from BLE
+ */
+
+#define BLE_DBG_DIS_EN 0
+#define BLE_DBG_HRS_EN 0
+#define BLE_DBG_EDS_STM_EN 0
+#define BLE_DBG_LBS_STM_EN 0
+#define BLE_DBG_SVCCTL_EN 1
+#define BLE_DBG_CTS_EN 0
+#define BLE_DBG_HIDS_EN 0
+#define BLE_DBG_PASS_EN 0
+#define BLE_DBG_BLS_EN 0
+#define BLE_DBG_HTS_EN 0
+#define BLE_DBG_ANS_EN 0
+#define BLE_DBG_ESS_EN 0
+#define BLE_DBG_GLS_EN 0
+#define BLE_DBG_BAS_EN 0
+#define BLE_DBG_RTUS_EN 0
+#define BLE_DBG_HPS_EN 0
+#define BLE_DBG_TPS_EN 0
+#define BLE_DBG_LLS_EN 0
+#define BLE_DBG_IAS_EN 0
+#define BLE_DBG_DTS_EN 0
+#define BLE_DBG_WSS_EN 0
+#define BLE_DBG_LNS_EN 0
+#define BLE_DBG_SCPS_EN 0
+#define BLE_DBG_P2P_STM_EN 0
+
+
+/**
+ * Macro definition
+ */
+#if ( BLE_DBG_DIS_EN != 0 )
+#define BLE_DBG_DIS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_DIS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_HRS_EN != 0 )
+#define BLE_DBG_HRS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HRS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_P2P_STM_EN != 0 )
+#define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_EDS_STM_EN != 0 )
+#define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_LBS_STM_EN != 0 )
+#define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_SVCCTL_EN != 0 )
+#define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_CTS_EN != 0)
+#define BLE_DBG_CTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_CTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HIDS_EN != 0)
+#define BLE_DBG_HIDS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HIDS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_PASS_EN != 0)
+#define BLE_DBG_PASS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_PASS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BLS_EN != 0)
+#define BLE_DBG_BLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HTS_EN != 0)
+#define BLE_DBG_HTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ANS_EN != 0)
+#define BLE_DBG_ANS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ANS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ESS_EN != 0)
+#define BLE_DBG_ESS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ESS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_GLS_EN != 0)
+#define BLE_DBG_GLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_GLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BAS_EN != 0)
+#define BLE_DBG_BAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_RTUS_EN != 0)
+#define BLE_DBG_RTUS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_RTUS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HPS_EN != 0)
+#define BLE_DBG_HPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_TPS_EN != 0)
+#define BLE_DBG_TPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LLS_EN != 0)
+#define BLE_DBG_LLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_IAS_EN != 0)
+#define BLE_DBG_IAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_IAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_WSS_EN != 0)
+#define BLE_DBG_WSS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_WSS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LNS_EN != 0)
+#define BLE_DBG_LNS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LNS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_SCPS_EN != 0)
+#define BLE_DBG_SCPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SCPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_DTS_EN != 0)
+#define BLE_DBG_DTS_MSG PRINT_MESG_DBG
+#define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG
+#else
+#define BLE_DBG_DTS_MSG PRINT_NO_MESG
+#define BLE_DBG_DTS_BUF PRINT_NO_MESG
+#endif
+
+
+#endif /*__BLE_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h
new file mode 100644
index 000000000..3afc2e373
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/cube_hal.h
@@ -0,0 +1,47 @@
+/**
+ ******************************************************************************
+ * @file cube_hal.h
+ * @author AMS VMA RF Application team
+ * @brief
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef _CUBE_HAL_H_
+#define _CUBE_HAL_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_conf.h"
+
+#define B1_Pin GPIO_PIN_13
+#define B1_GPIO_Port GPIOC
+#define USART_TX_Pin GPIO_PIN_2
+#define USART_TX_GPIO_Port GPIOA
+#define USART_RX_Pin GPIO_PIN_3
+#define USART_RX_GPIO_Port GPIOA
+#define LD2_Pin GPIO_PIN_5
+#define LD2_GPIO_Port GPIOA
+
+#define UART_TX_TIMEOUT 5
+
+#define Uart_Irq_Handler USART2_IRQHandler
+
+
+void SystemClock_Config(void);
+void Init_Device(void);
+void MX_USART2_UART_Init(void);
+
+
+#endif /* _CUBE_HAL_H_ */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s
new file mode 100644
index 000000000..636eb47c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/data.s
@@ -0,0 +1,50 @@
+;/**
+;******************************************************************************
+;* @file data.s
+;* @author BLE Mesh Team
+;* @version V1.07.000
+;* @date 15-June-2018
+;* @brief Memory management
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+;*
+;* 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 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 STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+;*
+;* Initial BlueNRG-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+;* (MoBLE) technology. The present solution is developed and maintained for both
+;* Mesh library and Applications solely by STMicroelectronics.
+;*
+;******************************************************************************
+;*/
+_bdaddr EQU 0x0807E000
+ EXPORT _bdaddr
+
+ AREA CONFIG, READONLY
+_mobleNvmBase_data
+ EXPORT _mobleNvmBase_data
+ FILL 4096, 0x00
+
+ END
+;/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h
new file mode 100644
index 000000000..730c40219
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * @file hal_common.h
+ * @author BLE Mesh Team
+ * @brief Common functions of HAL file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef _HAL_H_
+#define _HAL_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#if defined(NUCLEO_L152RE) || defined(USE_STM32WBXX_NUCLEO) || USE_STM32WBXX_USB_DONGLE /* NUCLEO_L152RE */
+#include "user_if.h"
+#else /* not NUCLEO_L152RE */
+#if defined(BLUENRG1) || defined(BLUENRG2) /* BLUENRG1 or BLUENRG2 */
+#include "hal.h"
+#else /* not BLUENRG1 or BLUENRG2 */
+#error "Unsupported board"
+#endif /* BLUENRG1 or BLUENRG2 */
+#endif /* NUCLEO_L152RE */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "types.h"
+
+void SetLed(int state);
+BUTTON_STATE GetButtonState(void);
+BUTTON_STATE GetButton2State(void);
+bool Accel_Process(uint8_t *evt);
+bool Temperature_Read(int16_t *data);
+void InitDevice(void);
+
+void ShouldSleepFunc(void);
+
+#endif /* _HAL_H_ */
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
new file mode 100644
index 000000000..dd7ae8207
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
@@ -0,0 +1,257 @@
+/**
+ ******************************************************************************
+ * @file mesh_cfg.h
+ * @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_H
+#define __MESH_CFG_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "mesh_cfg_usr.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* Flash parameters */
+#define PAGE_SIZE 4096
+#define RESET_MANAGER_FLASH_BASE_ADDRESS (0x10040000)
+
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#define UUID_SIZE 16U
+
+#define NO_MODEL_AVLBL 0xFFFF
+
+void TraceHeader(const char* func_name, int mode);
+#define TraceB0(func_name, ...)
+#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
+#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
+#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
+
+/*Enable this Macro to enable the main function prints.
+* This trace does not print the function name and clock.
+*/
+#define TraceC0(...)
+#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
+//#define TraceCX(flags, ...) TraceC ##flags( ##__VA_ARGS__)
+#define TraceCX(flags, ...) TraceC ##flags( __VA_ARGS__)
+#define TRACE_I(flag, ...) TraceCX(flag, ##__VA_ARGS__)
+
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ #define EXTERNAL_MAC_TYPE (uint8_t)(EXTERNAL_MAC_IS_PUBLIC_ADDR<<7)
+#else
+ #define EXTERNAL_MAC_TYPE (uint8_t)0
+#endif
+
+#if (!(GENERATE_STATIC_RANDOM_MAC)) && (!(EXTERNAL_MAC_ADDR_MGMT)) && (!(INTERNAL_UNIQUE_NUMBER_MAC))
+#error "Please select atleast one MAC address Option"
+#endif
+
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+#define ENABLE_SAVE_MODEL_STATE_NVM
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+#define SAVE_MODEL_STATE_NVM 1
+#else
+#define SAVE_MODEL_STATE_NVM 0
+#endif
+
+#define TRANSMIT_RECEIVE_PARAMS \
+{ \
+ TR_GAP_BETWEEN_TRANSMISSION \
+}
+
+#ifdef ENABLE_PB_ADV
+#define PB_ADV_SUPPORTED 1
+#else
+#define PB_ADV_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PB_GATT
+#define PB_GATT_SUPPORTED 1
+#else
+#define PB_GATT_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PUB_KEY_TYPE_OOB
+#define PUB_KEY_TYPE_OOB MOBLE_TRUE
+#else
+#define PUB_KEY_TYPE_OOB MOBLE_FALSE
+#endif
+
+
+#if (PB_ADV_SUPPORTED == 0 && PB_GATT_SUPPORTED == 0)
+#error "Atleast one of PB-ADV and PB-GATT should be defined"
+#endif
+
+#define BLUENRG_MESH_PRVN_BEARER_INFO (PB_ADV_SUPPORTED << 0 | PB_GATT_SUPPORTED << 1)
+
+#ifdef ENABLE_RELAY_FEATURE
+#define RELAY_FEATURE 1
+#else
+#define RELAY_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROXY_FEATURE
+#define PROXY_FEATURE 1
+#else
+#define PROXY_FEATURE 0
+#endif
+
+#ifdef ENABLE_FRIEND_FEATURE
+#define FRIEND_FEATURE 1
+#else
+#define FRIEND_FEATURE 0
+#endif
+
+#ifdef ENABLE_LOW_POWER_FEATURE
+#define LOW_POWER_FEATURE 1
+#else
+#define LOW_POWER_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROVISIONER_FEATURE
+#define PROVISIONER_FEATURE 1
+#else
+#define PROVISIONER_FEATURE 0
+#endif
+
+#if (LOW_POWER_FEATURE && RELAY_FEATURE)
+#error "Low power node can't be relay node"
+#elif (LOW_POWER_FEATURE && PROXY_FEATURE)
+#error "Low power node can't be proxy node"
+#elif (LOW_POWER_FEATURE && FRIEND_FEATURE)
+#error "Low power node can't be friend node"
+#endif
+
+#define BLUENRG_MESH_FEATURES (RELAY_FEATURE << 0 | PROXY_FEATURE << 1 | FRIEND_FEATURE << 2 | LOW_POWER_FEATURE << 3)
+
+#define FRIEND_NODE_PARAMS \
+{ \
+ FN_NO_OF_LPNS \
+}
+
+#define LOW_POWER_NODE_PARAMS \
+{ \
+ LPN_RSSI_FACTOR_LEVEL, \
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL, \
+ LPN_MINIMUM_QUEUE_SIZE_LOG, \
+ LPN_RECEIVE_DELAY, \
+ LPN_POLL_TIMEOUT, \
+ LPN_FRIEND_REQUEST_FREQUENCY, \
+ LPN_FRIEND_POLL_FREQUENCY, \
+ LPN_RECEIVE_WINDOW_SIZE, \
+ LPN_SUBSCR_LIST_SIZE, \
+ LPN_MINIMUM_RSSI, \
+ LPN_NO_OF_RETRIES \
+}
+
+#define UNPROV_NODE_INFO_PARAMS \
+{ \
+ PUB_KEY_TYPE_OOB, \
+ PubKeyBuff, \
+ PrivKeyBuff, \
+ STATIC_OOB_SIZE, \
+ StaticOobBuff, \
+ OUTPUT_OOB_SIZE, \
+ OUTPUT_OOB_ACTION, \
+ Appli_BleOutputOOBAuthCb, \
+ INPUT_OOB_SIZE, \
+ INPUT_OOB_ACTION, \
+ Appli_BleInputOOBAuthCb \
+}
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+#define NEIGHBOR_TABLE_SUPPORTED 1
+#else
+#define NEIGHBOR_TABLE_SUPPORTED 0
+#endif
+
+#if (NEIGHBOR_TABLE_SUPPORTED == 1)
+#if (NEIGHBOR_COUNT == 0)
+#error "Number of neighbors should be nonzero"
+#endif /* NO_OF_NEIGHBORS */
+#if (NEIGHBOR_ALIVE_TIME == 0)
+#error "Number of neighbor alive time should be nonzero"
+#endif /* NEIGHBOR_ALIVE_TIME */
+#if ((NEIGHBOR_UNPRVND_DEV_BEACON_NTU == 0) && (NEIGHBOR_MSG_TTLX_NTU == 0) && (NEIGHBOR_SECURE_NET_BEACON_NTU == 0))
+#error "Atleast one of Network Table Update trigger should be enabled"
+#endif
+#if (NEIGHBOR_UNPRVND_DEV_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_UNPRVND_DEV_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_UNPRVND_DEV_BEACON_NTU */
+#if (NEIGHBOR_SECURE_NET_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_SECURE_NET_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_SECURE_NET_BEACON_NTU */
+#if (NEIGHBOR_MSG_TTLX_NTU > 2)
+#error "Invalid valid of NEIGHBOR_MSG_TTLX_NTU. Allowed value: 0, 1 and 2"
+#endif /* NEIGHBOR_MSG_TTLX_NTU */
+#endif /* NEIGHBOR_TABLE_SUPPORTED */
+
+#define NEIGHBOR_TABLE_PARAMS \
+{ \
+ NEIGHBOR_COUNT, \
+ NEIGHBOR_ALIVE_TIME, \
+ NEIGHBOR_UNPRVND_DEV_BEACON_NTU, \
+ NEIGHBOR_SECURE_NET_BEACON_NTU, \
+ NEIGHBOR_MSG_TTLX_NTU \
+}
+
+#if FRIEND_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE FN_NO_OF_LPNS*816+4
+#elif LOW_POWER_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 112U
+#else
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 4U
+#endif
+
+#define DYNAMIC_MEMORY_SIZE 4096U
+
+#define SEGMENTATION_COUNT (MAX_APPLICATION_PACKET_SIZE / 12) + 2
+#define SAR_BUFFER_SIZE ((uint8_t)SEGMENTATION_COUNT) * 40
+/* Added Interrupt handler for Uart */
+#define SdkEvalComIOUartIrqHandler UART_Handler
+
+#if NEIGHBOR_TABLE_SUPPORTED
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 32U*NEIGHBOR_COUNT
+#else
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 0
+#endif
+
+#define SdkEvalComIOUartIrqHandler UART_Handler /* Added Interrupt handler for Uart */
+/******************** Serial Interface Handling Control **********************/
+
+/* Exported variables ------------------------------------------------------- */
+
+extern const DynBufferParam_t DynBufferParam;
+extern const tr_params_t TrParams;
+extern const lpn_params_t LpnParams;
+extern const fn_params_t FnParams;
+extern const prvn_params_t PrvnParams;
+extern const neighbor_table_init_params_t NeighborTableParams;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLEUINT8 ApplicationSetNodeSigModelList(void);
+MOBLE_RESULT ApplicationInitSigModelList(void);
+MOBLE_RESULT ApplicationInitVendorModelList(void);
+
+#endif /* __MESH_CFG_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h
new file mode 100644
index 000000000..7e3de23c0
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h
@@ -0,0 +1,618 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file mesh_cfg_usr.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_USR_H
+#define __MESH_CFG_USR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+/*
+* Different features supported by BLE-Mesh. Uncomment according to application.
+* Low power feature enabled node do not support other features.
+* Do not define any other feature if Low Power feature is defined
+*/
+#define ENABLE_LOW_POWER_FEATURE
+
+/* Macros Used for user defined serial print data for models.
+Either use 0 to disable or 1 to enable
+@ TF_GENERIC is responsible for the Generic model traces.
+@ TF_LIGHT is responsible for the Light model traces.
+@ TF_SENSOR is responsible for the Sensor model traces.
+@ TF_VENDOR is responsible for the vendor model traces.
+@ TF_NEIGHBOUR is responsible for the neighbour function traces.
+@ TF_PROVISION is responsible for the Provision related function traces.
+@ TF_LPN_FRND is responsible for the Low power nodef function traces.
+@ TF_ELEMENTS is responsible for the element selection function traces.
+@ TF_ADDRESS is responsible for the address of element traces.
+@ TF_HANDLER is responsible for the interrupt file traces.
+@ TF_INIT is responsible for the main function traces.
+@ TF_MISC is responsible for the other type traces.
+
+*/
+#define TF_GENERIC 0
+#define TF_LIGHT 0
+#define TF_LIGHT_LC 0
+#define TF_SENSOR 0
+#define TF_VENDOR 0
+#define TF_COMMON 0
+#define TF_VENDOR_COMMAND 0
+#define TF_NEIGHBOUR 0
+#define TF_LPN_FRND 0
+#define TF_ELEMENTS 0
+#define TF_ADDRESS 0
+#define TF_PROVISION 0
+#define TF_HANDLER 0
+#define TF_INIT 0
+#define TF_MISC 0
+#define TF_MEMORY 0
+#define TF_SERIAL_CTRL 0
+#define TF_BEACON 0
+#define TF_GENERIC_CLIENT 0
+#define TF_LIGHT_CLIENT 0
+#define TF_CONFIG_CLIENT 0
+#define TF_LIGHT_CLIENT 0
+
+/*******************************************************************************
+*** Following section helps to select right configuration of Models ***********
+*******************************************************************************/
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the */
+/* Server Generic Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+#define ENABLE_GENERIC_MODEL_SERVER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+
+/* The Following Models are not available in this version, will be developed in
+ next version.
+*/
+/*
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_BATTERY
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION
+#define ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
+#define ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
+#define ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY
+
+*/
+
+/******************************************************************************/
+/******* Define the following Macros to enable the usage of the Light Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+
+/*
+ The following Models are managed in different file light_lc.c in middleware
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_LC
+//#define ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the Sensor Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_SENSOR_MODEL_SERVER
+//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
+
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the time and */
+/* scene Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
+
+//#define ENABLE_TIME_MODEL_SERVER
+//#define ENABLE_TIME_MODEL_SERVER_SETUP
+//#define ENABLE_SCENE_MODEL_SERVER
+//#define ENABLE_SCENE_MODEL_SERVER_SETUP
+
+/*
+ The Following Models are not available in this version
+*/
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL
+//#define ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
+
+/******* Define the following Macros to enable the vendor model ******/
+//#define ENABLE_VENDOR_MODEL_SERVER
+#define GENERIC_SERVER_MODEL_PUBLISH
+
+/******************************************************************************/
+/*
+Define the Macros for Enabling/disabling the binding of data between the Generic
+and Light model.
+@ define the Macro for enabling the binding
+@ Undefine or comment the macro for disabling the binding.
+*/
+/******************************************************************************/
+#define ENABLE_MODEL_BINDING
+
+/* Define the macros for the numbers of sensor present.*/
+#define NUMBER_OF_SENSOR 2
+//#define ENABLE_OCCUPANCY_SENSOR
+/*
+Macro is responsible for enabling and desabling the sensor publication.
+Comment this macro to disable the publication
+*/
+//#define ENABLE_SENSOR_PUBLICATION
+
+/******************************************************************************/
+
+
+/* Maximum Time period value of PWM */
+#define PWM_TIME_PERIOD 31990U
+
+/******************************************************************************/
+/***** MACROS for POWER ON-OFF CYCLE BASED UNPROVISIONING *********************/
+/******************************************************************************/
+
+/*
+Define the following Macro to check the Power-OnOff Cycles
+5 Continous cycles of OnOff with Ontime <2 sec will cause unprovisioning
+*/
+//#define ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+
+#define POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING 5
+#define MASK_BITS_FOR_POWER_ON_OFF_CYCLES (0xFFFFFFFF << POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING)
+ /* 0xFFFFFFE0 */
+#define ON_TIME_IN_SECONDS_FOR_POWER_CYCLING 2
+#define BLINK_TIMES_FOR_FACTORY_RESET 5
+
+/*
+Define the following Macro to save Generic and Light Model states in NVM
+This may result into excessive flash erase operations,
+this should be avoided to ensure flash longevity
+*/
+#define ENABLE_SAVE_MODEL_STATE_NVM
+
+/* Only one Macro will be enable at one time */
+//#define SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+//#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+
+/* Macros defined for the number of bytes saved,
+ number of bytes dedicated for generic model and light model.
+*/
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+#define APP_NVM_MODEL_SIZE 40U
+
+/*Macros are defined for the selection of the number of led and type of lighting
+ used for the application.
+*if board has one led, uncomment USER_BOARD_1LED
+*if board has cool warm leds, uncomment USER_BOARD_COOL_WHITE_LED
+*if board has RGB leds, uncomment USER_BOARD_RGB_LED
+*if board has RGB leds as well as cool warm leds,
+ uncomment USER_BOARD_COOL_WHITE_LED and USER_BOARD_RGB_LED
+*/
+/* comment ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME when using
+ USER_BOARD_COOL_WHITE_LED ,USER_BOARD_RGB_LED
+ Default transition is provided only for one led.
+*/
+#define USER_BOARD_1LED
+//#define USER_BOARD_COOL_WHITE_LED
+//#define USER_BOARD_RGB_LED
+
+/* Pulse Width Modulation support for external LED control */
+#define ENABLE_PWM_SUPPORT 0
+
+/* Note: Please use Full Library configuration in project options to use the full
+ configuration of the C/C++ runtime library
+ for printf and scanf functionality */
+
+/* Enables the serial interface using Uart */
+#define ENABLE_SERIAL_INTERFACE 1
+#define ENABLE_UT 1
+#define ENABLE_SERIAL_CONTROL 1
+#define ENABLE_APPLI_TEST 0
+
+/*******************************************************************************
+*** Following section helps to configure the Application of Mesh ***********
+*******************************************************************************/
+
+#define APPLICATION_NUMBER_OF_ELEMENTS 1
+#define APPLICATION_SIG_MODELS_MAX_COUNT 20
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT 2
+
+
+/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
+(the list is available
+@ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers)
+For STMicroelectronics : it is 0x0030 */
+#define COMPANY_ID 0x0030
+
+/* Contains a 16-bit vendor-assigned product identifier */
+#define PRODUCT_ID 0x0002
+
+/* Contains a 16-bit vendor-assigned product version ID */
+#define PRODUCT_VERSION_ID 0x010A
+
+#define MAX_APPLICATION_PACKET_SIZE 160
+
+#define TPT_SEGMENT_COUNT (((MAX_APPLICATION_PACKET_SIZE)/12)+2)
+
+/*******************************************************************************
+********** MAC Address Configuration *******************************************
+*******************************************************************************/
+
+/*
+* Define to enable external MAC handling,
+* DONT change the Values 0x01, 0x02, 0x03
+* SELECT ONLY One of the Option
+*/
+//#define GENERATE_STATIC_RANDOM_MAC 0x01
+//#define EXTERNAL_MAC_ADDR_MGMT 0x02
+#define INTERNAL_UNIQUE_NUMBER_MAC 0x03
+
+/* Declare this value as 0x01 if the External Address is PUBLIC Address */
+/* For example like this: #define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x1 */
+/* Else, by default, the external address will be treated as RANDOM */
+#define EXTERNAL_MAC_IS_PUBLIC_ADDR 0x0
+
+/******************************************************************************/
+
+
+/*******************************************************************************
+****** Following section helps to select right configuration of node ***********
+*******************************************************************************/
+/*
+* Minimum gap between successive transmissions
+* varies from 10 to 65535
+*/
+#define TR_GAP_BETWEEN_TRANSMISSION 50U
+
+
+/*
+* Different provision bearer supported by BLE-Mesh.
+* Define according to application.
+* Atleast one of PB-ADV and PB-GATT should be defined
+*/
+#define ENABLE_PB_ADV
+#define ENABLE_PB_GATT
+//#define ENABLE_PUB_KEY_TYPE_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+#define STATIC_OOB_SIZE 16U
+#else
+#define STATIC_OOB_SIZE 0U
+#endif
+/* Output OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#else
+#define OUTPUT_OOB_SIZE 0U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#endif
+
+/* Input OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#else
+#define INPUT_OOB_SIZE 0U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#endif
+
+
+/*
+* Friend node receive window size is 50 ms
+*/
+
+/*
+* Friend node subscription list size is 4
+*/
+
+/*
+* Friend node message queue is 16
+*/
+
+/*
+* Number of Low power nodes that can be associated with Friend node
+* varies from 1 to 10
+*/
+#define FN_NO_OF_LPNS 6U
+
+/*
+* For prioritizing friendship offer with good RSSI link
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RSSI_FACTOR_LEVEL 1U
+
+/*
+* For prioritizing friendship offer with good receive window factor
+* varies from 0 to 3
+* Ref @Mesh_v1.0
+* 0 -> 1
+* 1 -> 1.5
+* 2 -> 2
+* 3 -> 2.5
+*/
+#define LPN_RECIVE_WINDOW_FACTOR_LEVEL 1U
+
+/*
+* Minimum packets queue size required by Low Power node
+* varies from 1 to 7
+* Ref @Mesh_v1.0
+* 1 -> 2
+* 2 -> 4
+* 3 -> 8
+* 4 -> 16
+* 5 -> 32
+* 6 -> 64
+* 7 -> 128
+*/
+#define LPN_MINIMUM_QUEUE_SIZE_LOG 2U
+
+/*
+* (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_DELAY 150U
+
+/*
+* Poll timeout value after which friendship cease to exist (unit 100ms)
+* varies from 0x00000A to 0x34BBFF
+* Ref @Mesh_v1.0
+* 0x00000A -> 1 second
+* 0x34BBFF -> 96 hours
+*/
+#define LPN_POLL_TIMEOUT 2000U
+
+/*
+* Maximum receive window size acceptable to low power node (unit ms)
+* varies from 0x0A to 0xFF
+* Ref @Mesh_v1.0
+* 0x0A -> 10ms
+* 0xFF -> 255ms
+*/
+#define LPN_RECEIVE_WINDOW_SIZE 255U/*55U*/
+
+/*
+* Minimum friend's subscription list size capability required by lpn
+* varies from 1 to 5
+* Ref @Mesh_v1.0
+*/
+#define LPN_SUBSCR_LIST_SIZE 2U
+
+/*
+* Frequency at which low power node would send friend request (unit 100ms)
+* varies from 0 to 255
+* 100 -> 10s
+*/
+#define LPN_FRIEND_REQUEST_FREQUENCY 50U
+
+/*
+* Frequency at which low power node would poll friend node (unit 100ms)
+* should be less than poll timeout
+* 100 -> 10s
+*/
+#define LPN_FRIEND_POLL_FREQUENCY 25U
+
+/*
+* Minimum RSSI required by low power node
+* should be less than equal to -60
+*/
+#define LPN_MINIMUM_RSSI -100
+
+/*
+* Retries to be made by lpn before termination of friendship
+* varies from 2 to 10
+*/
+#define LPN_NO_OF_RETRIES 10U
+
+/*
+* Maximum address list size buffer in
+* Friend Subscription List Add Message is 10
+*/
+
+
+/*
+* Enable or disable neighbor table
+* if defined -> enabled
+* If MAC address of neighbor changes it appears as new neighbor
+* Neighbor table update can be triggered (configurable) in following cases
+* On receiving Unprovisioned device beacon
+* On receiving Secure network beacon
+* On receiving Mesh message
+* Message with any TTL
+* Message with TTL = 0
+* if not defined -> disabled
+*/
+#define ENABLE_NEIGHBOR_TABLE
+
+/*
+* Size of neighbor table
+*/
+#define NEIGHBOR_COUNT 5U
+
+/*
+* (unit s)
+* Duration (wrt appear or last refresh)
+* for which neighbor exists in neighbor table
+*/
+#define NEIGHBOR_ALIVE_TIME 20U
+
+/*
+* Enable/disable neighbor table update with unprovisioned device beacon
+* 0: Disable neighbor table update with unprovisioned device beacon
+* 1: Enable neighbor table update with unprovisioned device beacon
+*/
+#define NEIGHBOR_UNPRVND_DEV_BEACON_NTU 1U
+
+/*
+* Enable/disable neighbor table update with secure network beacon
+* 0: Disable neighbor table update with secure network beacon
+* 1: Enable neighbor table update with secure network beacon
+*/
+#define NEIGHBOR_SECURE_NET_BEACON_NTU 0U
+
+/*
+* Enable/disable neighbor table update with TTL 0 message
+* 0: Disable neighbor table update messages
+* 1: Enable neighbor table update with messages with 0 TTL
+* 2: Enable neighbor table update with messages with any TTL
+*/
+#define NEIGHBOR_MSG_TTLX_NTU 0U
+
+/*******************************************************************************
+*** Following section helps to configure the LEDs of Application of Mesh ***
+*******************************************************************************/
+
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+ #define SINGLE_LED PWM4
+ #define COOL_LED PWM0
+ #define WARM_LED PWM1
+ #define RED_LED PWM2
+ #define GREEN_LED PWM3
+ #define BLUE_LED PWM4
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (ENABLE_GENERIC_MODEL_SERVER)
+ #define ENABLE_GENERIC_MODEL_SERVER (1)
+#endif
+
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (GENERIC_SERVER_MODEL_ADD_CONFIGURATION)
+ #define GENERIC_SERVER_MODEL_ADD_CONFIGURATION (1)
+
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP) \
+ && !defined (ENABLE_LIGHT_MODEL_SERVER)
+ #define ENABLE_LIGHT_MODEL_SERVER (1)
+#endif
+
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP)
+ #define LIGHT_SERVER_MODEL_ADD_CONFIGURATION
+#endif
+
+#if defined(ENABLE_TIME_MODEL_SERVER) \
+ || defined(ENABLE_TIME_MODEL_SERVER_SETUP)\
+ || defined(ENABLE_SCENE_MODEL_SERVER)\
+ || defined(ENABLE_SCENE_MODEL_SERVER_SETUP)
+ #define ENABLE_TIME_SCENE_MODEL_SERVER
+#endif
+
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* __MESH_CFG_USR_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c
new file mode 100644
index 000000000..f82f3b293
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c
@@ -0,0 +1,627 @@
+/**
+ ******************************************************************************
+ * @file models_if.c
+ * @author BLE Mesh Team
+ * @brief Mesh Modes interface file of the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "appli_mesh.h"
+#include "vendor.h"
+#include "light.h"
+#include "sensors.h"
+#include "generic.h"
+#include "time_scene.h"
+#include "common.h"
+#include "appli_generic.h"
+#include "appli_vendor.h"
+#include "appli_light.h"
+#include "appli_sensor.h"
+#include "appli_nvm.h"
+#include "ble_hci_le.h"
+#include "models_if.h"
+
+#include "PWM_config.h"
+#include "PWM_handlers.h"
+#include "appli_light_lc.h"
+#include "light_lc.h"
+#include "appli_generic_client.h"
+#include "config_client.h"
+#include "generic_client.h"
+#include "appli_light_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+#pragma pack(1)
+typedef struct
+{
+ MOBLE_ADDRESS peer;
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 command;
+ MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
+ MOBLEUINT32 length;
+} APPLI_SEND_RESPONSE_MODULE;
+
+typedef struct
+{
+ MOBLEUINT8 packet_count;
+ MOBLEUINT32 send_time;
+ APPLI_SEND_RESPONSE_MODULE* head;
+ MOBLEUINT8 head_index;
+ APPLI_SEND_RESPONSE_MODULE packet[MAX_PENDING_PACKETS_QUE_SIZE];
+} APPLI_PENDING_PACKETS;
+#pragma pack(4)
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+
+
+/* Private variables ---------------------------------------------------------*/
+APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
+
+__attribute__((aligned(4)))
+const MOBLE_VENDOR_CB_MAP vendor_cb =
+{
+ Vendor_WriteLocalDataCb,
+ Vendor_ReadLocalDataCb,
+ Vendor_OnResponseDataCb
+};
+
+__attribute__((aligned(4)))
+const Appli_Vendor_cb_t VendorAppli_cb =
+{
+ /*Vendor Commads*/
+ Appli_Vendor_LEDControl,
+ Appli_Vendor_DeviceInfo,
+ Appli_Vendor_Test,
+ Appli_LedCtrl,
+ Appli_GetTestValue,
+ Appli_Vendor_Data_write
+};
+
+__attribute__((aligned(4)))
+const Appli_Generic_cb_t GenericAppli_cb =
+{
+ /* Generic OnOff callbacks */
+ Appli_Generic_OnOff_Set,
+ /* Generic OnOff Status callbacks */
+ Appli_Generic_OnOff_Status,
+ /* Generic Level callbacks */
+ Appli_Generic_Level_Set,
+ Appli_Generic_Delta_Set,
+ Appli_Generic_Move_Set,
+ /* Generic Level Status callbacks */
+ Appli_Generic_Level_Status,
+ /* Generic Power on off callbacks */
+ Appli_Generic_PowerOnOff_Set,
+ /* Generic Power on off callbacks */
+ Appli_Generic_PowerOnOff_Status,
+
+ /* Generic Default transition time callbacks */
+ Appli_Generic_DefaultTransitionTime_Set,
+ /* Generic Default transition time callbacks */
+ Appli_Generic_DefaultTransitionTime_Status
+};
+
+__attribute__((aligned(4)))
+const Appli_Generic_State_cb_t Appli_GenericState_cb =
+{
+
+ /* Generic Get On Off status */
+ Appli_Generic_GetOnOffStatus,
+ Appli_Generic_GetOnOffValue,
+ /* Generic Get level status */
+ Appli_Generic_GetLevelStatus,
+ /* Generic Get Power on off status */
+ Appli_Generic_GetPowerOnOffStatus,
+ /* Generic Get Default transition time status */
+ Appli_Generic_GetDefaultTransitionStatus
+};
+
+__attribute__((aligned(4)))
+const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+{
+ Appli_Light_GetLightnessStatus,
+ Appli_Light_GetLightnessLinearStatus,
+ Appli_Light_GetLightnessDefaultStatus,
+ Appli_Light_GetLightnessLastStatus,
+ Appli_Light_GetLightnessRangeStatus,
+ Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTemperatureStatus,
+ Appli_Light_GetCtlTemperatureRange,
+ Appli_Light_GetCtlDefaultStatus,
+ Appli_Light_GetHslStatus,
+ Appli_Light_GetHslHueStatus,
+ Appli_Light_GetHslSaturationStatus,
+ Appli_Light_GetHslHueRange,
+ Appli_Light_GetHslSatRange,
+ Appli_Light_GetHslDefaultStatus
+};
+
+
+__attribute__((aligned(4)))
+const Appli_Light_cb_t LightAppli_cb =
+{
+ /* Light Lightness callbacks */
+ Appli_Light_Lightness_Set,
+ Appli_Light_Lightness_Status,
+
+ Appli_Light_Lightness_Linear_Set,
+ Appli_Light_Lightness_Linear_Status,
+
+ Appli_Light_Lightness_Default_Set,
+ Appli_Light_Lightness_Default_Status,
+
+ Appli_Light_Lightness_Range_Set,
+ Appli_Light_Lightness_Range_Status,
+
+ Appli_Light_Ctl_Set,
+ Appli_Light_Ctl_Status,
+
+ Appli_Light_CtlTemperature_Set,
+ Appli_Light_CtlTemperature_Status,
+
+ Appli_Light_CtlTemperature_Range_Set,
+ Appli_Light_CtlTemperature_Range_Status,
+
+ Appli_Light_CtlDefault_Set,
+ Appli_Light_CtlDefault_Status,
+
+ Appli_Light_Hsl_Set,
+ Appli_Light_Hsl_Status,
+
+ Appli_Light_HslHue_Set,
+ Appli_Light_HslHue_Status,
+
+ Appli_Light_HslSaturation_Set,
+ Appli_Light_HslSaturation_Status,
+
+ Appli_Light_HslDefault_Set,
+ Appli_Light_HslDefault_Status,
+
+ Appli_Light_HslRange_Set,
+ Appli_Light_HslRange_Status
+};
+
+
+__attribute__((aligned(4)))
+const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+{
+ /* Light LC mode set callbacks */
+ Appli_LightLC_Mode_Set,
+ Appli_LightLC_OM_Set,
+ Appli_LightLC_OnOff_Set,
+};
+
+__attribute__((aligned(4)))
+const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+{
+ Appli_LightLC_Get_ModeStatus,
+ Appli_LightLC_Get_OMModeStatus,
+ Appli_LightLC_Get_OnOffStatus,
+ Appli_LightLC_Get_AmbientLuxLevelOutput,
+ Appli_Light_LC_PIRegulatorOutput,
+};
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+__attribute__((aligned(4)))
+const Appli_Sensor_cb_t SensorAppli_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_Cadence_Set,
+ Appli_Sensor_Data_Status,
+ Appli_Sensor_Descriptor_Status ,
+ Appli_Sensor_Setting_Set
+};
+
+__attribute__((aligned(4)))
+const Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+{
+ Appli_Sensor_GetSettingStatus,
+ Appli_Sensor_GetSetting_IDStatus
+};
+
+#endif
+
+
+__attribute__((aligned(4)))
+const MODEL_SIG_cb_t Model_SIG_cb[] =
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER
+ {
+ GenericModelServer_GetOpcodeTableCb,
+ GenericModelServer_GetStatusRequestCb,
+ GenericModelServer_ProcessMessageCb
+ },
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER
+ {
+ LightModelServer_GetOpcodeTableCb,
+ LightModelServer_GetStatusRequestCb,
+ LightModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+{
+ SensorModelServer_GetOpcodeTableCb,
+ SensorModelServer_GetStatusRequestCb,
+ SensorModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
+ {
+ Time_SceneModelServer_GetOpcodeTableCb,
+ Time_SceneModelServer_GetStatusRequestCb,
+ Time_SceneModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ {
+ Light_LC_ModelServer_GetOpcodeTableCb,
+ Light_LC_ModelServer_GetStatusRequestCb,
+ Light_LC_ModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_GENERIC_MODEL_CLIENT
+ {
+ GenericModelClient_GetOpcodeTableCb,
+ GenericModelClient_GetStatusRequestCb,
+ GenericModelClient_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_CONFIG_MODEL_CLIENT
+ {
+ ConfigClientModel_GetOpcodeTableCb,
+ ConfigClientModel_GetStatusRequestCb,
+ ConfigClientModel_ProcessMessageCb
+ },
+#endif
+
+ { 0, 0,0 }
+};
+
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+
+#define MODEL_SIG_COUNT ( ( sizeof(Model_SIG_cb)/sizeof(Model_SIG_cb[0]) - 1 ))
+
+__attribute__((aligned(4)))
+const MODEL_Vendor_cb_t Model_Vendor_cb[] =
+{
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ {
+ VendorModel_PID1_GetOpcodeTableCb,
+ VendorModel_PID1_GetStatusRequestCb,
+ VendorModel_PID1_ProcessMessageCb
+ },
+#endif
+ { 0, 0,0 }
+};
+
+#define MODEL_VENDOR_COUNT ( ( sizeof(Model_Vendor_cb)/sizeof(Model_Vendor_cb[0]) - 1 ))
+
+extern MOBLEUINT8 NumberOfElements;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUINT32* VendorModelscount)
+{
+ *pModelsTable = Model_Vendor_cb ;
+ *VendorModelscount = MODEL_VENDOR_COUNT;
+
+ TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+}
+
+/**
+* @brief Initialization Commands for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsInit(void)
+{
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+
+ MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
+
+#ifdef CLIENT
+ MOBLEUINT8 PrvnStateLoad_Size;
+ MOBLEUINT8 PrvnlStateLoadBuff[16];
+#endif
+
+ /* Callbacks used by BlueNRG-Mesh Models */
+ BLEMesh_SetSIGModelsCbMap(Model_SIG_cb, MODEL_SIG_COUNT);
+
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
+
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
+ if (modelStateLoad_Size != 0)
+ {
+ /* update states of generic model */
+ Model_RestoreStates(modelStateLoadBuff, modelStateLoad_Size);
+ }
+
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initiallization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+#endif
+}
+
+/**
+* @brief Process Commands for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsProcess(void)
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER
+ Generic_Process();
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER
+ Lighting_Process();
+#endif
+
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ Vendor_Process();
+#endif
+/* Define this Macro to enable the publication of sensors data.*/
+#if defined ENABLE_SENSOR_MODEL_SERVER
+ Sensor_Process();
+#endif
+
+#if ENABLE_APPLI_TEST
+ Test_Process();
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ ModelSave_Process();
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Light_control_Process();
+#endif
+}
+
+/**
+* @brief Publish Command for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsCommand(void)
+{
+#ifdef VENDOR_CLIENT_MODEL_PUBLISH
+ Vendor_Publish(BLEMesh_GetAddress());
+#endif
+
+#ifdef GENERIC_CLIENT_MODEL_PUBLISH
+ Appli_GenericClient_OnOff_Set();
+#endif
+
+#ifndef CLIENT
+/* if CLIENT and SERVER => Publish is already done in CLIENT */
+#ifdef GENERIC_SERVER_MODEL_PUBLISH
+ Generic_Publish(BLEMesh_GetAddress());
+#endif
+#endif
+
+}
+
+/**
+* @brief Get the Element Number for selected Model
+* @param dst_peer : Destination Address received
+* @retval MOBLEUINT8 : elementIndex
+*/
+MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
+{
+
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementNumber;
+
+ nodeAddress = BLEMesh_GetAddress();
+ elementNumber = ((dst_peer - nodeAddress)+1);
+
+ return elementNumber;
+}
+
+/**
+* @brief Check Subscription of Elements for Group Address for selected Model
+* @param dst_peer : Destination Address received
+* @param elementNumber : Number of element to check Subscription
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
+ MOBLEUINT8 elementNumber)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_FAIL;
+ MOBLE_ADDRESS subscriptionList[10] = {0};
+ MOBLEUINT8 length;
+ MOBLEUINT32 modelId = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ BLEMesh_GetSubscriptionAddress(subscriptionList,&length,elementNumber, modelId);
+
+
+ for(uint8_t list=0; list<length; list++)
+ {
+ if(dst_peer == subscriptionList[list])
+ {
+ status = MOBLE_RESULT_SUCCESS;
+ break;
+ }
+ }
+
+ return status;
+}
+
+/**
+* @brief Schedule a packet to be sent with randomized send timestamp
+* If a que is empty, random timestamp is calculated
+* Subsequent packets are sent in sequence
+* @param peer: Address of the peer
+* @param dst : Address of the node
+* @param status: Command status
+* @param data: Data buffer.
+* @param length: Length of data in bytes.
+* @retval None
+*/
+void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
+ MOBLE_ADDRESS dst,
+ MOBLEUINT8 command,
+ MOBLEUINT8 const * data,
+ MOBLEUINT32 length)
+{
+ MOBLEUINT8 random_time[8];
+
+ if (Appli_PendingPackets.packet_count == 0)
+ {
+ Appli_PendingPackets.packet_count = 1;
+ hci_le_rand(random_time);
+ Appli_PendingPackets.send_time = Clock_Time() +
+ DEFAULT_DELAY_PACKET_FROM +
+ (random_time[0] + random_time[1]*256)\
+ %DEFAULT_DELAY_PACKET_RANDOM_TIME;
+ Appli_PendingPackets.head = Appli_PendingPackets.packet;
+ Appli_PendingPackets.head_index = 0;
+ TRACE_M(TF_MISC, "Randomized time: %ld\n\r", Appli_PendingPackets.send_time - Clock_Time());
+ }
+ else
+ {
+ Appli_PendingPackets.packet_count += 1;
+ Appli_PendingPackets.packet_count = (Appli_PendingPackets.packet_count)%\
+ (MAX_PENDING_PACKETS_QUE_SIZE+1);
+
+ if (Appli_PendingPackets.head != (Appli_PendingPackets.packet + \
+ MAX_PENDING_PACKETS_QUE_SIZE - 1))
+ {
+ Appli_PendingPackets.head = Appli_PendingPackets.head +1;
+ Appli_PendingPackets.head_index = Appli_PendingPackets.head_index+1;
+ }
+ else
+ {
+ Appli_PendingPackets.head = Appli_PendingPackets.packet;
+ Appli_PendingPackets.head_index = 0;
+ }
+ }
+
+ Appli_PendingPackets.head->peer = peer;
+ Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->command = command;
+ Appli_PendingPackets.head->length = length;
+ for (MOBLEUINT8 count=0; count<length; count++)
+ Appli_PendingPackets.head->data[count] = data[count];
+}
+
+
+/**
+* @brief If send timestamp is reached and que is not empty, send all packets
+* @param None
+* @retval None
+*/
+void BLEMesh_ModelsSendDelayedPacket(void)
+{
+ APPLI_SEND_RESPONSE_MODULE* ptr;
+ MOBLEUINT8 temp_index;
+
+ if ((Appli_PendingPackets.packet_count != 0) &&
+ (Appli_PendingPackets.send_time <= Clock_Time()))
+ {
+ for (MOBLEUINT8 count=Appli_PendingPackets.packet_count; count!=0; count--)
+ {
+ TRACE_M(TF_MISC, "Sending randomized packets. Packet count: %d \n\r",\
+ Appli_PendingPackets.packet_count - count + 1);
+ temp_index = ((Appli_PendingPackets.head_index+MAX_PENDING_PACKETS_QUE_SIZE+1)\
+ -count)%MAX_PENDING_PACKETS_QUE_SIZE;
+ ptr = Appli_PendingPackets.packet + temp_index;
+
+ VendorModel_SendResponse(VENDOR_STMICRO_CID,
+ ptr->peer,
+ ptr->dst,
+ ptr->command,
+ ptr->data,
+ ptr->length);
+ }
+
+ Appli_PendingPackets.packet_count = 0;
+ }
+}
+
+/** \brief Set remote publication for the given Model ID & node Address
+* User is responsible for serializing data into \a data buffer. Vendor_WriteLocalDataCb
+* callback will be called on the remote device.
+* @param modelId ID of the model.
+* @param srcAddress element Address of the Node
+* @param command vendor model commands
+* @param data Data buffer.
+* @param length Length of data in bytes.
+* @param response If 'MOBLE_TRUE', used to get the response. If 'MOBLE_FALSE', no response
+* @return MOBLE_RESULT_SUCCESS on success.
+*/
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 elementIdx,
+ MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
+ MOBLEUINT32 length, MOBLEBOOL ack_flag,
+ MOBLEUINT8 isVendor)
+{
+ MOBLE_ADDRESS srcAddress;
+
+ srcAddress = BLEMesh_GetAddress();
+ srcAddress += elementIdx; /* Get the Address to send in the message */
+
+ return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ srcAddress ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+}
+
+/**
+* @brief Convert ASCII value into Character
+* @param tempValue : 8bit value for conversion
+* @retval MOBLEUINT8
+*/
+MOBLEUINT8 BLEMesh_ModelsASCII_To_Char(MOBLEUINT8 tempValue)
+{
+ tempValue = tempValue - 0x30;
+ return tempValue;
+}
+
+__weak void Test_Process(void)
+{
+}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h
new file mode 100644
index 000000000..486e0bcec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h
@@ -0,0 +1,50 @@
+/**
+ ******************************************************************************
+ * @file models_if.h
+ * @author BLE Mesh Team
+ * @brief Mesh Modes interface file header
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MODELS_H
+#define __MODELS_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+void BLEMesh_ModelsInit(void);
+void BLEMesh_ModelsProcess(void);
+void BLEMesh_ModelsCommand(void);
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, MOBLEUINT8 elementNumber);
+MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer, MOBLE_ADDRESS dst, MOBLEUINT8 command,
+ MOBLEUINT8 const * data, MOBLEUINT32 length);
+void BLEMesh_ModelsSendDelayedPacket(void);
+MOBLEUINT8 BLEMesh_ModelsASCII_To_Char(MOBLEUINT8 tempValue);
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLE_ADDRESS element_number,
+ MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
+ MOBLEUINT32 length, MOBLEBOOL ack_flag,
+ MOBLEUINT8 isVendor);
+
+#endif /* __MODELS_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c
new file mode 100644
index 000000000..04bc07489
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c
@@ -0,0 +1,446 @@
+/**
+ ******************************************************************************
+ * @file pal_nvm.c
+ * @author BLE Mesh Team
+ * @brief Flash management for the Controller
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "pal_nvm.h"
+#include "pal_if.h"
+#include <string.h>
+
+#include "ble.h"
+#include "shci.h"
+#include "mesh_cfg_usr.h"
+
+#include "hw_flash.h"
+
+/* Private define ------------------------------------------------------------*/
+#define FLASH_SECTOR_SIZE 0x1000
+#define MAX_NVM_PENDING_WRITE_REQS 1
+
+/* Private variables ---------------------------------------------------------*/
+typedef struct
+{
+ MOBLEUINT16 offset;
+ MOBLEUINT16 size;
+ void const *buff;
+} BNRGM_NVM_WRITE;
+
+typedef struct
+{
+ MOBLEUINT8 no_of_pages_to_be_erased;
+ MOBLEUINT8 no_of_write_reqs;
+ MOBLEBOOL backup_req;
+ BNRGM_NVM_WRITE write_req[MAX_NVM_PENDING_WRITE_REQS];
+} BNRGM_NVM_REQS;
+
+BNRGM_NVM_REQS BnrgmNvmReqs = {0};
+
+/* Private functions ---------------------------------------------------------*/
+/**
+ * @brief Gets the page of a given address
+ * @param Addr: Address of the FLASH Memory
+ * @retval The page of a given address
+ */
+static MOBLEUINT32 GetPage(MOBLEUINT32 Addr)
+{
+ MOBLEUINT32 page = 0;
+
+ if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
+ {
+ /* Bank 1 */
+ page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
+ }
+ else
+ {
+ /* Bank 2 */
+ page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
+ }
+
+ return page;
+}
+
+#if 0
+/**
+* @brief PalNvmErase
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
+ MOBLEUINT32 offset)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+ uint32_t pageError = 0;
+
+// printf("PalNvmErase >>>\r\n");
+
+ FLASH_EraseInitTypeDef erase;
+ erase.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase.Page = GetPage(address + offset); /* 126 or 127 */;
+ erase.NbPages = FLASH_SECTOR_SIZE >> 12;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON);
+
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ status = HAL_FLASHEx_Erase(&erase, &pageError);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+
+// printf("PalNvmErase <<<\r\n");
+
+ return status == HAL_OK ? MOBLE_RESULT_SUCCESS : MOBLE_RESULT_FAIL;
+}
+#endif
+
+/**
+* @brief returns NVM write protect status
+* @param None
+* @retval TRUE if flash is write protected
+*/
+MOBLEBOOL MoblePalNvmIsWriteProtected(void)
+{
+ /* All flash is writable */
+ return MOBLE_FALSE;
+}
+
+/**
+* @brief Read NVM
+* @param address: read start address of nvm
+* @param offset: offset read start address of nvm
+* @param buf: copy of read content
+* @param size: size of memory to be read
+* @param backup: If read from backup memory
+* @retval Result of read operation
+*/
+MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void *buf,
+ MOBLEUINT32 size,
+ MOBLEBOOL backup)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+// printf("MoblePalNvmRead >>>\r\n");
+
+ if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ memcpy(buf, (void *)(address + offset), size);
+ }
+
+// printf("MoblePalNvmRead <<<\r\n");
+ return result;
+}
+
+/**
+* @brief Compare with NVM
+* @param offset: start address of nvm to compare
+* @param offset: offset start address of nvm
+* @param buf: copy of content
+* @param size: size of memory to be compared
+* @param comparison: outcome of comparison
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size,
+ MOBLE_NVM_COMPARE* comparison)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+// printf("MoblePalNvmCompare >>>\r\n");
+
+ if ((comparison == NULL) || (buf == NULL))
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ *comparison = MOBLE_NVM_COMPARE_EQUAL;
+
+ uint8_t* src = (uint8_t*)buf;
+ uint8_t* dst = (uint8_t*)(address + offset);
+
+ for (MOBLEUINT32 i=0; i<size; ++i)
+ {
+ if ((src[i] != dst[i]) && (*comparison == MOBLE_NVM_COMPARE_EQUAL))
+ {
+ *comparison = MOBLE_NVM_COMPARE_NOT_EQUAL;
+ }
+ if ((src[i] & dst[i]) != dst[i])
+ {
+ *comparison = MOBLE_NVM_COMPARE_NOT_EQUAL_ERASE;
+ break;
+ }
+ }
+ }
+
+// printf("MoblePalNvmCompare <<<\r\n");
+#else
+ *comparison = MOBLE_NVM_COMPARE_EQUAL;
+#endif
+ return result;
+}
+
+/**
+* @brief Erase NVM
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmErase(MOBLEUINT32 address,
+ MOBLEUINT32 offset)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+ uint32_t pageError = 0;
+
+// printf("MoblePalNvmErase >>>\r\n");
+
+ FLASH_EraseInitTypeDef erase;
+ erase.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase.Page = GetPage(address + offset); /* 126 or 127 */;
+ erase.NbPages = FLASH_SECTOR_SIZE >> 12;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON);
+
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ status = HAL_FLASHEx_Erase(&erase, &pageError);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+
+// printf("MoblePalNvmErase <<<\r\n");
+
+ return status == HAL_OK ? MOBLE_RESULT_SUCCESS : MOBLE_RESULT_FAIL;
+}
+
+/**
+* @brief Write to NVM
+* @param offset: wrt start address of nvm
+* @param offset: offset wrt start address of nvm
+* @param buf: copy of write content
+* @param size: size of memory to be written
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 remain = 0;
+ MOBLEUINT32 nb_dword = 0;
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+
+ // printf("MoblePalNvmWrite >>>\r\n");
+
+ if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ nb_dword = (size >> 3);
+ remain = size - ((nb_dword) << 3);
+ if(remain > 0)
+ nb_dword += 1;
+
+ uint64_t* src = (uint64_t*)buf;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR | FLASH_FLAG_SIZERR | FLASH_FLAG_PGAERR);
+
+ for (size_t i = 0; i < nb_dword/*size*/; i++)
+ {
+ do
+ {
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address + offset + (i <<3), src[i]);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ } while(*((uint64_t*)(address + offset + (i <<3))) != src[i]);
+ }
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+ }
+// printf("MoblePalNvmWrite <<<\r\n");
+#endif
+
+ return result;
+}
+
+#if 0
+/**
+* @brief Backup process
+* @param None
+* @retval Result
+*/
+static MOBLE_RESULT BnrgmPalNvmBackupProcess(void)
+{
+ MOBLEUINT32 buff[4*N_BYTES_WORD];
+ static MOBLEUINT8 backup_pages_to_be_erased = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (backup_pages_to_be_erased == 0)
+ {
+ backup_pages_to_be_erased = 1;
+ }
+
+ if(backup_pages_to_be_erased != 0)
+ {
+#if 0
+ BluenrgMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ if(BluenrgMesh_IsFlashReadyToErase())
+ {
+ FLASH_ErasePage((uint16_t)((BNRGM_NVM_BACKUP_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE +
+ BNRGM_NVM_BACKUP_SIZE/PAGE_SIZE - backup_pages_to_be_erased));
+
+ if (FLASH_GetFlagStatus(Flash_CMDERR) == SET)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ backup_pages_to_be_erased--;
+ }
+ }
+ else
+ {
+ /* do nothing */
+ }
+ ATOMIC_SECTION_END();
+#else
+ result = PalNvmErase(NVM_BASE, FLASH_SECTOR_SIZE);
+ if(result == MOBLE_RESULT_SUCCESS)
+ backup_pages_to_be_erased = 0;
+#endif
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS && backup_pages_to_be_erased == 0)
+ {
+#if 0
+ BluenrgMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ if(BluenrgMesh_IsFlashReadyToErase())
+ {
+ for (size_t i = 0; i < BNRGM_NVM_BACKUP_SIZE && FLASH_GetFlagStatus(Flash_CMDERR) == RESET; )
+ {
+ memcpy((MOBLEUINT8*)buff, (void *)(BNRGM_NVM_BASE + i), 4*N_BYTES_WORD);
+ FLASH_ProgramWordBurst(BNRGM_NVM_BACKUP_BASE + i, (uint32_t*)buff);
+ i += 4*N_BYTES_WORD;
+ }
+
+ if (FLASH_GetFlagStatus(Flash_CMDERR) == SET)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ BnrgmNvmReqs.backup_req = MOBLE_FALSE;
+ }
+ }
+ else
+ {
+ /* do nothing */
+ }
+ ATOMIC_SECTION_END();
+#else
+#endif
+ }
+ return result;
+}
+#endif
+
+/**
+* @brief NVM process
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT BnrgmPalNvmProcess(void)
+{
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c
new file mode 100644
index 000000000..1dce9189e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/svcctl_conf.c
@@ -0,0 +1,82 @@
+/**
+ ******************************************************************************
+ * @file svctl_conf.c
+ * @author MCD Application Team
+ * @brief Configuration of the BLE service controller
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "app_common.h"
+
+#include "otp.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* Private variables ---------------------------------------------------------*/
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+{
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+};
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+const uint8_t* SVCCTL_GetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h
new file mode 100644
index 000000000..6df3dc0c7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_conf.h
@@ -0,0 +1,33 @@
+/**
+ ******************************************************************************
+ * @file tl_conf.h
+ * @author MCD Application Team
+ * @brief Transport Layer Configuration
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_CONF_H
+#define __TL_CONF_H
+
+/**
+ * It shall be set to 1 for power optimization when standby is supported
+ */
+#define CFG_BLE_HCI_STDBY 0
+
+
+
+#endif /*__TL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c
new file mode 100644
index 000000000..609ca64cf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_if.c
@@ -0,0 +1,47 @@
+/**
+ ******************************************************************************
+ * @file tl_if.c
+ * @author MCD Application Team
+ * @brief Transport layer interface to BLE
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "app_common.h"
+
+#include "hci_tl.h"
+#include "shci_tl.h"
+#include "tl.h"
+
+
+void hci_register_io_bus(tHciIO* fops)
+{
+ /* Register IO bus services */
+ fops->Init = TL_BLE_Init;
+ fops->Send = TL_BLE_SendCmd;
+
+ return;
+}
+
+void shci_register_io_bus(tSHciIO* fops)
+{
+ /* Register IO bus services */
+ fops->Init = TL_SYS_Init;
+ fops->Send = TL_SYS_SendCmd;
+
+ return;
+}
+
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c
new file mode 100644
index 000000000..43a0e548d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.c
@@ -0,0 +1,364 @@
+/**
+******************************************************************************
+* @file user_if.c
+* @author BLE Mesh Team
+* @version V1.09.000
+* @date 15-Oct-2018
+* @brief User interface file
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BlueNRG-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+/* Includes ------------------------------------------------------------------*/
+#include "cube_hal.h"
+#include "ble_clock.h"
+#include "hci.h"
+#include "user_if.h"
+#include "hal.h"
+#include "hal_common.h"
+#include "mesh_cfg.h"
+
+#include <stdio.h>
+#ifdef IAR
+#include <yfuns.h>
+#else
+#define _LLIO_STDIN 0
+#define _LLIO_STDOUT 1
+#define _LLIO_STDERR 2
+#define _LLIO_ERROR ((size_t)-1) /* For __read and __write. */
+#endif
+
+
+
+typedef struct _IO_ReceiveCallBack
+{
+ /**
+ * callback to notify the application with the received I/O data
+ */
+ IO_RECEIVE_DATA_USER_CALLBACK_TYPE IO_user_application;
+} IO_ReceiveCallBack;
+/**
+* @}
+*/
+
+#define READ_DATA_SIZE 1024
+#define READ_BUFFER_IS_EMPTY() (Read_ptr_in == Read_ptr_out)
+
+/* IO User Callback used to handle received data from I/O channel*/
+static uint8_t Read_Buffer [READ_DATA_SIZE];
+static uint32_t Read_ptr_in = 0;
+static uint32_t Read_ptr_out = 0;
+/*static volatile uint8_t s_SdkEvalVersion = ID_UNKNOWN;*/
+static IO_ReceiveCallBack IO_Receive_Data;
+static void SdkEval_IO_processInputData(uint8_t * rx_data, uint16_t data_size);
+
+
+/**
+* @brief SetLed Sets the state of led
+* @param int state State for the led GPIO
+* @retval void
+*/
+void SetLed(int state)
+{
+ if (state)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+}
+
+#if 0
+/**
+* @brief GetButtonState
+* @param void
+* @retval BUTTON_STATE returns the status of the userbutton GPIO
+*/
+BUTTON_STATE GetButtonState(void)
+{
+ return HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
+}
+
+/**
+* @brief InitButton initializes the GPIO for the user button
+* @param void
+* @retval void
+*/
+void InitButton(void)
+{
+ GPIO_InitTypeDef init;
+ init.Pin = GPIO_PIN_13;
+ init.Mode = GPIO_MODE_INPUT | GPIO_MODE_EVT_FALLING;
+ init.Pull = GPIO_NOPULL;
+ init.Speed = GPIO_SPEED_VERY_LOW;
+ init.Alternate = 0;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &init);
+ EXTI->FTSR |= EXTI_RTSR_TR13; /* enable wake-up event on falling edge */
+ EXTI->IMR &= ~EXTI_IMR_MR13; /* disable interrupt */
+ EXTI->EMR |= EXTI_EMR_MR13; /* enable event */
+}
+#endif
+
+/**
+* @brief processInputData
+* @param uint8_t * rx_data pointer to receive data
+* @param uint16_t data_size size of receive data
+* @retval void
+*/
+void processInputData(uint8_t * rx_data, uint16_t data_size)
+{
+ SdkEval_IO_processInputData(rx_data, data_size);
+}
+
+/**
+* @brief Configure the selected I/O communication channel
+* @param None.
+* @retval None.
+*/
+void SdkEval_IO_Config(IO_RECEIVE_DATA_USER_CALLBACK_TYPE io_receive_function)
+{
+ IO_Receive_Data.IO_user_application = io_receive_function;
+#if defined (ENABLE_USB)
+ /* Init Device Library */
+ USBD_Init(&USBD_Device, &VCP_Desc, 0);
+
+ /* Add Supported Class */
+ USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
+
+ /* Add CDC Interface Class */
+ USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
+
+ /* Start Device Process */
+ USBD_Start(&USBD_Device);
+
+#elif defined (ENABLE_USART)
+ /* Init Serial Uart */
+ MX_USART2_UART_Init();
+#endif
+}
+
+/**
+* @brief InitDevice intitializes the Device
+* @param void
+* @retval void
+*/
+void InitDevice(void)
+{
+ Init_Device(); /* Initializes HAL and System Clock */
+
+#ifndef NEWLIB_SYSCALLS
+ SdkEval_IO_Config(processInputData);
+#endif
+ /* Delay for debug purpose, in order to see printed data at startup. */
+#if defined(ENABLE_USART)
+ Clock_Wait(2000);
+#endif
+
+#if defined(ACCELEROMETER_TYPE) || defined(THERMOMETER_TYPE)
+ I2C_Reset();
+ Temperature_Init();
+ Accel_Init();
+#endif
+ InitButton();
+}
+
+
+/**
+* @brief ShouldSleepFunc sleep mode fuction
+* @param void
+* @retval void
+*/
+void ShouldSleepFunc(void)
+{
+ __disable_irq();
+ __WFE();
+ __NOP();
+ __enable_irq();
+}
+
+/**
+* @brief Receive data on selected I/O port
+* @param rx_data pointer to buffer of received
+* @param data_size number of received data
+* @retval None.
+*/
+void SdkEval_IO_Receive_Data(uint8_t * rx_data, uint16_t data_size)
+{
+ if(IO_Receive_Data.IO_user_application)
+ IO_Receive_Data.IO_user_application(rx_data,data_size);
+
+}
+/**
+* @brief Read buffer push
+* @param byte
+* @retval None.
+*/
+void Read_Buffer_Push(uint8_t byte)
+{
+ Read_Buffer[Read_ptr_in] = byte;
+
+ Read_ptr_in++;
+
+ /* To avoid buffer overflow */
+ if(Read_ptr_in == READ_DATA_SIZE)
+ {
+ Read_ptr_in = 0;
+ }
+}
+/**
+* @brief Read buffer pop
+* @param byte
+* @retval None.
+*/
+int Read_Buffer_Pop(uint8_t *byte)
+{
+ if(READ_BUFFER_IS_EMPTY())
+ return 0;
+
+ *byte = Read_Buffer[Read_ptr_out];
+
+ Read_ptr_out++;
+
+ if(Read_ptr_out == READ_DATA_SIZE)
+ Read_ptr_out = 0;
+
+ return 1;
+}
+/**
+* @brief Process input data
+* @param byte
+* @retval None.
+*/
+static void SdkEval_IO_processInputData(uint8_t * rx_data, uint16_t data_size)
+{
+ for(int i = 0; i < data_size; i++){
+ Read_Buffer_Push(rx_data[i]);
+ }
+}
+extern UART_HandleTypeDef huart2;
+#undef putchar
+/**
+* @brief Put character
+* @param byte
+* @retval None.
+*/
+int putchar(int c)
+{
+ /* wait for the transmission end */
+ while(!(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE)));
+ /* send the data */
+ HAL_UART_Transmit(&huart2, (uint8_t*)&c, 1, UART_TX_TIMEOUT);
+ return c;
+}
+
+void __io_putchar(char c)
+{
+ putchar(c);
+}
+
+/* Required for Keil */
+#ifndef __IAR_SYSTEMS_ICC__
+void _ttywrch(int ch)
+{
+ putchar(ch);
+}
+
+int fputc(int ch, FILE *f)
+{
+ _ttywrch(ch);
+ return(ch);
+}
+int fgetc(FILE *f)
+{
+ return -1;
+}
+#endif
+
+/**
+* @brief Write handle
+* @param buffer
+* @param size
+* @retval None.
+*/
+size_t _write(int handle, const unsigned char * buffer, size_t size)
+{
+ size_t nChars = 0;
+
+ if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) {
+ return _LLIO_ERROR;
+ }
+
+ if (buffer == 0) {
+ /* This means that we should flush internal buffers.
+ spin until TX complete (TX is idle)*/
+#ifdef ENABLE_USB
+ while (!USB_OUT_BUFFER_IS_EMPTY()) {}
+#endif /* ENABLE_USB */
+ return 0;
+ }
+
+ while(size--) {
+ __io_putchar(*buffer++);
+ ++nChars;
+ }
+
+ return nChars;
+}
+
+/**
+* @brief Read handle
+* @param buffer
+* @param size
+* @retval None.
+*/
+size_t __read(int handle, unsigned char * buffer, size_t size)
+{
+ size_t bytes = 0;
+
+ while(bytes < size && Read_Buffer_Pop(buffer+bytes)){
+ bytes++;
+ }
+ return bytes;
+}
+
+uint8_t __io_getcharNonBlocking(uint8_t *data)
+{
+ if (__read(_LLIO_STDIN,data,1))
+ return 1;
+ else
+ return 0;
+}/* end serialReadByte() */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h
new file mode 100644
index 000000000..773b36116
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/user_if.h
@@ -0,0 +1,62 @@
+/**
+******************************************************************************
+* @file user_if.h
+* @author BLE Mesh Team
+* @version V1.09.000
+* @date 15-Oct-2018
+* @brief Header file for User interface file
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef _USER_INTERFACE_H_
+#define _USER_INTERFACE_H_
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_conf.h"
+#include "ble_clock.h"
+
+#define BUTTON_PRESSED GPIO_PIN_RESET
+
+/* Exported typedefs ---------------------------------------------*/
+typedef GPIO_PinState BUTTON_STATE;
+typedef void (* IO_RECEIVE_DATA_USER_CALLBACK_TYPE) (uint8_t * rx_data, uint16_t data_size);
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* _USER_INTERFACE_H_ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h
new file mode 100644
index 000000000..22b6dc41c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/vcp_conf.h
@@ -0,0 +1,52 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_IdleTask_VCP_SendData)
+#define VCP_TASK_PRIO (CFG_SCH_Prio_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TimProcID_isr)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
new file mode 100644
index 000000000..7b22ea955
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
@@ -0,0 +1,517 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for BLE
+ * middleWare.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliCmdNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_CliEvtNotification();
+
+ return;
+}
+
+__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+#endif /* ZIGBEE_WB */
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.cproject b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.cproject
index ec91ca2a4..a1dbcd4ed 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.cproject
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.cproject
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
- <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.943206822">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.943206822" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" moduleId="org.eclipse.cdt.core.settings" name="Debug">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
@@ -14,29 +14,29 @@
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactExtension="elf" artifactName="BLE_MeshLightingNodeDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.943206822" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
- <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.943206822." name="/" resourcePath="">
- <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.567095402" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
- <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.993584542" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.409029130" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32WB55CGUx" valueType="string"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.board.1508607795" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="P-NUCLEO-WB55.USBDONGLE" valueType="string"/>
+ <configuration artifactExtension="elf" artifactName="BLE_MeshLightingLPNDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1472243705" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.2012243190" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.350170076" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32WB55CGUx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1066969950" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="P-NUCLEO-WB55.USBDONGLE" valueType="string"/>
<option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" useByScannerDiscovery="false" valueType="stringList">
<listOptionValue builtIn="false" value="ARM Cortex-M4"/>
<listOptionValue builtIn="false" value="CM4"/>
</option>
- <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.428755157" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.848845325" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
- <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.114526888" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.softfp" valueType="enumerated"/>
- <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.903725199" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
- <builder buildPath="${workspace_loc:/Lighting_Node}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.966627834" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1545208353" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.849017599" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.503367654" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.softfp" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.313215574" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/Lighting_LPN}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1388838888" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
<outputEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
</outputEntries>
</builder>
- <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.43426824" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
- <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.1850490719" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.debugging.level.243385980" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.include.paths.2110713991" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.788714469" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.507308354" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.1773837778" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.658170605" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
<listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
<listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
@@ -60,7 +60,7 @@
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
</option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.265442577" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1884790151" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_STM32WBXX_USB_DONGLE"/>
<listOptionValue builtIn="false" value="STM32WB55xx"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
@@ -70,14 +70,15 @@
<listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
<listOptionValue builtIn="false" value="SERVER"/>
</option>
- <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.1138494354" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.265269843" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.1172715094" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.418016678" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <option id="gnu.c.compiler.option.dialect.std.1675821413" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.2115418046" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.70637041" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
</tool>
- <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.327222719" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
- <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1730087901" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.debugging.level.179759463" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.include.paths.1779672364" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.655187957" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1658116989" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1793003576" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1289441927" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
<listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
<listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
@@ -102,7 +103,7 @@
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
</option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.779199641" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1053099556" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_STM32WBXX_USB_DONGLE"/>
<listOptionValue builtIn="false" value="STM32WB55xx"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
@@ -112,49 +113,49 @@
<listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
<listOptionValue builtIn="false" value="SERVER"/>
</option>
- <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1804387380" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.2000998723" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1655261525" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1052883489" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.587781019" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1475637392" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
</tool>
- <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1473840735" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1492427413" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
- <option id="gnu.c.link.option.libs.1185635196" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1900226888" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1374383201" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1086385097" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":libSTM32CryptographicV3.0.0_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
- <option id="gnu.c.link.option.paths.1792421290" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+ <option id="gnu.c.link.option.paths.1171847559" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
</option>
- <option id="gnu.c.link.option.ldflags.1188000064" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
- <option id="gnu.c.link.option.other.1374614904" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1759805830" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <option id="gnu.c.link.option.ldflags.584114864" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.1158103120" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1513884002" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
- <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.1201534473" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
- <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1474895099" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
- <option id="gnu.cpp.link.option.libs.2064232802" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.2018563809" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.863897384" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1214396075" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
<listOptionValue builtIn="false" value=":STM32CryptographicV3.1.1_CM4_GCC.a"/>
</option>
- <option id="gnu.cpp.link.option.paths.1876349343" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <option id="gnu.cpp.link.option.paths.1746826190" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
<listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
</option>
- <option id="gnu.cpp.link.option.flags.1277303400" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
- <option id="gnu.cpp.link.option.other.1943762915" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1350707263" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <option id="gnu.cpp.link.option.flags.327710768" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.613074149" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1396074364" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
- <tool id="fr.ac6.managedbuild.tool.gnu.archiver.2011735949" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
- <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.57349233" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
- <option id="gnu.both.asm.option.include.paths.272653714" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false"/>
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.487205253" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.1813202921" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.2035810026" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1392403353" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.1483330149" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1488646499" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.2083592722" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
</tool>
</toolChain>
</folderInfo>
@@ -167,19 +168,20 @@
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="Lighting_Node.fr.ac6.managedbuild.target.gnu.cross.exe.858144935" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
- </storageModule>
- <storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
- <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.943206822;fr.ac6.managedbuild.config.gnu.cross.exe.debug.943206822.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.43426824;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.265269843">
- <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
- </scannerConfigBuildInfo>
+ <project id="Lighting_LPN.fr.ac6.managedbuild.target.gnu.cross.exe.549494370" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope" versionNumber="2">
- <configuration artifactName="${ProjName}" configurationName="Debug">
- <resource resourceType="PROJECT" workspacePath="Lighting_Node"/>
+ <configuration configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="/Lighting_LPN"/>
</configuration>
+ <configuration configurationName="Release"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.541963203;fr.ac6.managedbuild.config.gnu.cross.exe.debug.541963203.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.2004397433;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1404205422">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
</cproject>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project
new file mode 100644
index 000000000..2473bfae2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/.project
@@ -0,0 +1,444 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Lighting_LPN</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/readme.txt</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_debug.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_entry.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_timerserver.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/lp_timer.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/lp_timer.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/main.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/main.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32_lpm_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32wbxx_it.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/syscalls.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_ll_usb.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_cdc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_core.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_ctlreq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_ioreq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_config.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_config.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_handlers.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_handlers.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/app_ble.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/app_ble.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_generic.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_sensor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_sensor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/models_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/models_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/pal_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/pal_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/target/hw_ipcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/target/hw_ipcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_seq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/common.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh_cfg.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/time_scene.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gatt_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hal_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hci_le.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_l2cap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/osal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</locationURI>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..7ac9a391f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/Lighting_LPN/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed ā€œas is,ā€ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..f79eec117
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* start address for the .MB_MEM2 section. defined in linker script */
+.word _sMB_MEM2
+/* end address for the .MB_MEM2 section. defined in linker script */
+.word _eMB_MEM2
+
+/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */
+.macro INIT_BSS start, end
+ ldr r0, =\start
+ ldr r1, =\end
+ movs r3, #0
+ bl LoopFillZerobss
+.endm
+
+/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */
+.macro INIT_DATA start, end, src
+ ldr r0, =\start
+ ldr r1, =\end
+ ldr r2, =\src
+ movs r3, #0
+ bl LoopCopyDataInit
+.endm
+
+.section .text.data_initializers
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+ bx lr
+
+FillZerobss:
+ str r3, [r0]
+ adds r0, r0, #4
+
+LoopFillZerobss:
+ cmp r0, r1
+ bcc FillZerobss
+ bx lr
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ INIT_DATA _sdata, _edata, _sidata
+
+/* Zero fill the bss segments. */
+ INIT_BSS _sbss, _ebss
+ INIT_BSS _sMB_MEM2, _eMB_MEM2
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c
new file mode 100644
index 000000000..e3c8a89f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/SW4STM32/syscalls.c
@@ -0,0 +1,204 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2014 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/readme.txt
new file mode 100644
index 000000000..dc4060555
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/readme.txt
@@ -0,0 +1,224 @@
+/**
+ @page BLE_MeshLightingDemo example
+
+ @verbatim
+ ******************** (C) COPYRIGHT 2019 STMicroelectronics *******************
+ * @file BLE/BLE_MeshLightingLPN/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE Mesh Lighting Low Power Node demo example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@par Directory contents
+ mesh_lighting_demo
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_debug.h Interface to support debug in the application
+ - BLE/BLE_MeshLightingLPN/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_MeshLightingLPN/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingLPN/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
+ - BLE/BLE_MeshLightingLPN/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingLPN/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_MeshLightingLPN/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
+ - BLE/BLE_MeshLightingLPN/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_MeshLightingLPN/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - BLE/BLE_MeshLightingLPN/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
+ - BLE/BLE_MeshLightingLPN/Core/Src/app_debug.c Interface to support debug in the application
+ - BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_MeshLightingLPN/Core/Src/hw_flash.c FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingLPN/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_MeshLightingLPN/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_MeshLightingLPN/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingLPN/Core/Src/main.c Main program
+ - BLE/BLE_MeshLightingLPN/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_MeshLightingLPN/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_MeshLightingLPN/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/hal_common.h Header for common function of HAL file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/tl_if.c Transport Layer interface
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/user_if.h Header file for User interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/user_if.c User interface file
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
+ - BLE/BLE_MeshLightingLPN/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics USB DONGLE board (MB1293C)
+ and can be easily tailored to any other supported device and development board.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+For more details refer to the Application Note:
+ AN5292_STM32WB_How_to_build_BLE_Mesh_Application
+
+@Introduction
+
+The ST BLE-Mesh library supports all of the following features in a Mesh node:
+1. Relay: to forward received network PDUs on advertising or GATT bearer, if the Proxy feature is enabled
+2. Proxy: to forward received network PDUs between GATT and advertising bearers
+3. Friend: can perform duties such as scanning for other associated nodes that are usually Low Power mode
+4. Low Power: consumes much less power as the node usually does not perform any scanning
+A typical BLE Mesh node radio should always be in scanning mode to avoid missing packets over the air, but this kind of
+operation is not supported by many devices due to continuous energy requirements.
+To enable low power operation, BLE Mesh Profile v1.0 defines the concept of Friendship.
+In a Mesh network, a Low Power feature-enabled Mesh node (LPN) offloads its packet receiving (scanning) duty to an adjacent
+Friend feature-enabled Mesh node (FN). The LPN is not always scanning and remains inactive (or sleeps) for most of its life
+cycle, significantly reducing its energy requirements. Nodes running on batteries or energy harvesting techniques usually
+support the Low Power feature.
+Once connected to each other, the FN and LPN are considered friends and their connection is known as a Friendship. At least
+one FN must be in the direct radio range of an LPN to establish Friendship.
+
+@Configuration
+
+General default setting defined in mesh_cfg_usr.h:
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF (1) /* GENERIC SERVER ONOFF MODEL ON FIRST ELEMENT */
+ APPLICATION_NUMBER_OF_ELEMENTS 1 /* NUMBER OF ELEMENT SUPPORTED */
+ APPLICATION_SIG_MODELS_MAX_COUNT 20 /* TOTAL NUMBER OF MODELS SUPPORTED */
+ APPLICATION_VENDOR_MODELS_MAX_COUNT 2 /* TOTAL NIMBER OF VENDOR MODELS SUPPORTED */
+ ENABLE_PB_ADV /* Provisioning Bearer over advertising channels support */
+ ENABLE_PB_GATT /* Provisioning Bearer over GATT proxy support */
+
+Low Power Node
+Low Power feature support is defined in mesh_cfg_usr.h by hte predefinition of ENABLE_LOW_POWER_FEATURE.
+Note: A Low Power feature-enabled node does not support any other feature: all the other features should be
+undefined.
+
+@Demo setup based on STM32WB55CG-Nucleo
+
+The following demo based on STM32WB55CG-Nucleo has been set up using one board as a Friend node and two
+boards as Low Power nodes.
+
+Low Power node setup:
+Step 1. Configure LPN parameters.
+ Change only if required ohterwise skip this step (use example parameters defined in mesh_cfg_usr.h)
+ LPN_RSSI_FACTOR_LEVEL 1
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL 1
+ LPN_MINIMUM_QUEUE_SIZE_LOG 2
+ LPN_RECEIVE_DELAY 150 ms
+ LPN_POLL_TIMEOUT 2000 (*100 ms)
+ LPN_RECEIVE_WINDOW_SIZE 55 ms
+ LPN_SUBSCR_LIST_SIZE 2
+ LPN_FRIEND_REQUEST_FREQUENCY 50 (*100 ms)
+ LPN_FRIEND_POLL_FREQUENCY 25 (*100 ms)
+ LPN_MINIMUM_RSSI -100
+ LPN_NO_OF_RETRIES 10
+Step 2. Generate and flash binary in 2 boards (LPN1, LPN2)
+
+Friend Node setup (use the Proxy Relay Friend Node BLE_MeshLightingPRFNode project):
+Step 1. Generate and flash binary in a board (FN)
+Step 2. Provision the 3 boards with the default parameters, using BLE-Mesh Android or BLE-Mesh iOS smartphone application
+ (subscribe and publish to default group)
+
+Demo operation
+After provisioning, it might take a few seconds for Friendship to be established between FN and LPNs.
+In this demo, the FN establishes Friendship with LPN1 and LPN2
+Any packet targeted to LPN1/LPN2 or to a group address subscribed by LPN1 or LPN2 is put in queue by the FN
+that forwards packets to LPN1/LPN2 as soon as it receives a Friend Poll from the respective LPN.
+The LPN is free to send packets (generate traffic) any time.
+
+By pressing [SW1] button on the Friend Node:
+1. FN publishes a LED ON command to the default group and the FN blue LED immediately turns on (when the
+FN belongs to the default group).
+2. FN forwards a LED ON command to the LPNs subscribed to the default group. As soon as the FN receives
+poll from an LPN, it sends LED ON to the respective LPN.
+
+ FN LPN1 LPN2
+ | | |
+ SW1 PUSH->| | |
+ Blue LED on->| | |
+ |<--Friend Poll--| |
+ | | |
+ |-----LED on---->|<-Blue LED on |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |-------------LED on------------>|<-Blue LED on
+ | |
+
+By pressing [SW1] button on the Low Power Node 1:
+1. LPN1 publishes an LED OFF command to the default group. LPN1 blue LED tunrs off.
+ LPN1 immediately forwards LED OFF command to the default group.
+2. FN receives an LED OFF command (as it is subscribed to the default group) and the FN blue LED turns off.
+3. FN also sends an LED OFF command to LPN2 (subscribed to the default group) as soon as FN receives
+ poll from LPN2.
+
+ FN LPN1 LPN2
+ | | |
+ | SW1 PUSH->|<-Blue LED off |
+ Blue LED off->|<----LED off----| |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |------------LED off------------>|<-Blue LED off
+ | |
+
+* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
new file mode 100644
index 000000000..9dbfbba05
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
@@ -0,0 +1,118 @@
+/**
+ ******************************************************************************
+ * @file app_common.h
+ * @author MCD Application Team
+ * @brief Common
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_COMMON_H
+#define __APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+ /* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+ /* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+ /* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+
+#define PAUSE( t ) M_BEGIN \
+ volatile int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+ /* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h
new file mode 100644
index 000000000..a9ed87c7d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h
@@ -0,0 +1,545 @@
+/**
+ ******************************************************************************
+ * @file app_conf.h
+ * @author MCD Application Team
+ * @brief Application configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_CONFIG_H
+#define __APP_CONFIG_H
+
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * MESH Application Config
+ ******************************************************************************/
+
+/**< generic parameters ******************************************************/
+
+/**
+ * Define Tx Power
+ */
+#define CFG_TX_POWER (0x18) /**< +0 dBm */
+
+/**
+ * Define Advertising parameters
+ */
+#define CFG_ADV_BD_ADDRESS (0x7257acd87a6c)
+#define CFG_FAST_CONN_ADV_INTERVAL_MIN (0x80) /**< 80ms */
+#define CFG_FAST_CONN_ADV_INTERVAL_MAX (0xA0) /**< 100ms */
+#define CFG_LP_CONN_ADV_INTERVAL_MIN (0x640) /**< 1s */
+#define CFG_LP_CONN_ADV_INTERVAL_MAX (0x640) /**< 1s */
+
+/**
+ * Define IO Authentication
+ */
+#define CFG_BONDING_MODE (1)
+#define CFG_FIXED_PIN (111111)
+#define CFG_USED_FIXED_PIN (0)
+#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
+#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
+
+/**
+ * Define IO capabilities
+ */
+#define CFG_IO_CAPABILITY_DISPLAY_ONLY (0x00)
+#define CFG_IO_CAPABILITY_DISPLAY_YES_NO (0x01)
+#define CFG_IO_CAPABILITY_KEYBOARD_ONLY (0x02)
+#define CFG_IO_CAPABILITY_NO_INPUT_NO_OUTPUT (0x03)
+#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
+
+#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY
+
+/**
+ * Define MITM modes
+ */
+#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
+#define CFG_MITM_PROTECTION_REQUIRED (0x01)
+
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
+
+
+/**
+ * Define PHY
+ */
+#define ALL_PHYS_PREFERENCE 0x00
+#define RX_2M_PREFERRED 0x02
+#define TX_2M_PREFERRED 0x02
+#define TX_1M 0x01
+#define TX_2M 0x02
+#define RX_1M 0x01
+#define RX_2M 0x02
+
+/**
+ * Generic Access Appearance
+ */
+#define CFG_UNKNOWN_APPEARANCE (0)
+#define CFG_GAP_APPEARANCE (832)
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_IRK {0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0}
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+#define CFG_BLE_ERK {0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21,0xfe,0xdc,0xba,0x09,0x87,0x65,0x43,0x21}
+
+/* USER CODE BEGIN Generic_Parameters */
+/**
+ * SMPS supply
+ * SMPS not used when Set to 0
+ * SMPS used when Set to 1
+ */
+#define CFG_USE_SMPS 1
+/* USER CODE END Generic_Parameters */
+
+/**< specific parameters ********************************************************/
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI15_10_IRQHandler
+
+#define POWEROFF_EXTI_IRQHandler EXTI2_IRQHandler
+
+#define CFG_MAX_CONNECTION 1
+
+#define RADIO_ACTIVITY_EVENT 1
+
+
+#define CONN_L(x) ((int)((x)/0.625f))
+#define CONN_P(x) ((int)((x)/1.25f))
+
+ /* L2CAP Connection Update request parameters used for test only with smart Phone */
+#define L2CAP_REQUEST_NEW_CONN_PARAM 1
+
+#define L2CAP_INTERVAL_MIN CONN_P(12) /* 1s */
+#define L2CAP_INTERVAL_MAX CONN_P(12) /* 1s */
+#define L2CAP_SLAVE_LATENCY 0x0000
+#define L2CAP_TIMEOUT_MULTIPLIER 800 /* 0x320 */
+
+
+/******************************************************************************
+ * BLE Stack
+ ******************************************************************************/
+/**
+ * Maximum number of simultaneous connections that the device will support.
+ * Valid values are from 1 to 8
+ */
+#define CFG_BLE_NUM_LINK 8
+
+/**
+ * Maximum number of Services that can be stored in the GATT database.
+ * Note that the GAP and GATT services are automatically added so this parameter should be 2 plus the number of user services
+ */
+#define CFG_BLE_NUM_GATT_SERVICES 8
+
+/**
+ * Maximum number of Attributes
+ * (i.e. the number of characteristic + the number of characteristic values + the number of descriptors, excluding the services)
+ * that can be stored in the GATT database.
+ * Note that certain characteristics and relative descriptors are added automatically during device initialization
+ * so this parameters should be 9 plus the number of user Attributes
+ */
+#define CFG_BLE_NUM_GATT_ATTRIBUTES 68
+
+/**
+ * Maximum supported ATT_MTU size
+ */
+#define CFG_BLE_MAX_ATT_MTU (23/*156*/)
+
+/**
+ * Size of the storage area for Attribute values
+ * This value depends on the number of attributes used by application. In particular the sum of the following quantities (in octets) should be made for each attribute:
+ * - attribute value length
+ * - 5, if UUID is 16 bit; 19, if UUID is 128 bit
+ * - 2, if server configuration descriptor is used
+ * - 2*DTM_NUM_LINK, if client configuration descriptor is used
+ * - 2, if extended properties is used
+ * The total amount of memory needed is the sum of the above quantities for each attribute.
+ */
+#define CFG_BLE_ATT_VALUE_ARRAY_SIZE (1344)
+
+/**
+ * Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
+ */
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+
+/**
+ * Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
+ */
+#define CFG_BLE_DATA_LENGTH_EXTENSION 1
+
+/**
+ * Sleep clock accuracy in Slave mode (ppm value)
+ */
+#define CFG_BLE_SLAVE_SCA 500
+
+/**
+ * Sleep clock accuracy in Master mode
+ * 0 : 251 ppm to 500 ppm
+ * 1 : 151 ppm to 250 ppm
+ * 2 : 101 ppm to 150 ppm
+ * 3 : 76 ppm to 100 ppm
+ * 4 : 51 ppm to 75 ppm
+ * 5 : 31 ppm to 50 ppm
+ * 6 : 21 ppm to 30 ppm
+ * 7 : 0 ppm to 20 ppm
+ */
+#define CFG_BLE_MASTER_SCA 0
+
+/**
+ * Source for the 32 kHz slow speed clock
+ * 1 : internal RO
+ * 0 : external crystal ( no calibration )
+ */
+#define CFG_BLE_LSE_SOURCE 0
+
+/**
+ * Start up time of the high speed (16 or 32 MHz) crystal oscillator in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_HSE_STARTUP_TIME 0x148
+
+/**
+ * Maximum duration of the connection event when the device is in Slave mode in units of 625/256 us (~2.44 us)
+ */
+#define CFG_BLE_MAX_CONN_EVENT_LENGTH ( 0xFFFFFFFF )
+
+/**
+ * Viterbi Mode
+ * 1 : enabled
+ * 0 : disabled
+ */
+#define CFG_BLE_VITERBI_MODE 1
+
+/**
+ * LL Only Mode
+ * 1 : LL Only
+ * 0 : LL + Host
+ */
+#define CFG_BLE_LL_ONLY 0
+
+
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TLBLE_EVT_QUEUE_LENGTH 5
+
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_BLE_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE )
+
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU hw_lpuart1
+
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 0
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 1
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 0
+
+/**
+ * When set to 1, the traces are enabled in the BLE services
+ */
+#define CFG_DEBUG_BLE_TRACE 0
+
+/**
+ * Enable or Disable traces in application
+ */
+#define CFG_DEBUG_APP_TRACE 0
+
+#if (CFG_DEBUG_APP_TRACE != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+
+#if ( (CFG_DEBUG_BLE_TRACE != 0) || (CFG_DEBUG_APP_TRACE != 0) )
+#define CFG_DEBUG_TRACE 1
+#endif
+
+#if (CFG_DEBUG_TRACE != 0)
+#undef CFG_LPM_SUPPORTED
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+#define CFG_DEBUGGER_SUPPORTED 1
+#endif
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+
+/**
+ * These are the lists of task id registered to the scheduler
+ * Each task id shall be in the range [0:31]
+ * This mechanism allows to implement a generic code in the API TL_BLE_HCI_StatusNot() to comply with
+ * the requirement that a HCI/ACI command shall never be sent if there is already one pending
+ */
+
+/**< Add in that list all tasks that may send a ACI/HCI command */
+typedef enum
+{
+ CFG_TASK_ADV_UPDATE_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_MESH_REQ_ID,
+ CFG_TASK_MESH_BEACON_REQ_ID,
+ CFG_TASK_MESH_UART_RX_REQ_ID,
+ CFG_TASK_APPLI_REQ_ID,
+ CFG_TASK_MESH_SW1_REQ_ID,
+ CFG_TASK_MESH_LPN_REQ_ID,
+
+ CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
+} CFG_Task_Id_With_HCI_Cmd_t;
+
+/**< Add in that list all tasks that never send a ACI/HCI command */
+typedef enum
+{
+ CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
+
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
+
+ CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
+} CFG_Task_Id_With_NO_HCI_Cmd_t;
+#define CFG_TASK_NBR CFG_LAST_TASK_ID_WITHO_NO_HCICMD
+
+/**
+ * This is the list of priority required by the application
+ * Each Id shall be in the range 0..31
+ */
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+/**
+ * This is a bit mapping over 32bits listing all events id supported in the application
+ */
+typedef enum
+{
+ CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
+} CFG_IdleEvt_Id_t;
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_BLE
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+#endif /*__APP_CONFIG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h
new file mode 100644
index 000000000..13485c16b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h
@@ -0,0 +1,45 @@
+
+/**
+ ******************************************************************************
+ * @file app_debug.h
+ * @author MCD Application Team
+ * @brief Interface to support debug in the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_DEBUG_H
+#define __APP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPD_Init( void );
+ void APPD_EnableCPU2( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_DEBUG_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h
new file mode 100644
index 000000000..5d85cd90c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h
@@ -0,0 +1,44 @@
+
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief Interface to the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_ENTRY_H
+#define __APP_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..1e2d7a616
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
@@ -0,0 +1,247 @@
+/**
+ ******************************************************************************
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_CONF_H
+#define __HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+/**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+#define CFG_HW_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOA
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_6
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_Channel4
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_Channel4_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_Channel4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
+
+#endif /*__HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h
new file mode 100644
index 000000000..18c088d3e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h
@@ -0,0 +1,87 @@
+/**
+******************************************************************************
+* @file hw_flash.h
+* @brief Header for hw_flash.c module
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HW_FLASH_H
+#define __HW_FLASH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Write 64 bits double word in FLASH
+ *
+ * @param FLASH destination address
+ * @param 64 bits double word data
+ * @retval result
+ */
+MOBLE_RESULT HW_FLASH_Write(uint32_t address, uint64_t data);
+
+/**
+ * @brief Erase FLASH page
+ *
+ * @param address of FLASH page
+ * @param number of page
+ * @param interrupt not used
+ * @retval result
+ */
+MOBLE_RESULT HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt);
+
+#if 0
+/**
+ * @brief Get Option Byte IPCC buffer address
+ *
+ * @param None
+ * @retval Option Byte IPCC buffer address
+ */
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void);
+
+/**
+ * @brief Get Option Byte SFSA
+ *
+ * @param None
+ * @retval Option Byte SFSA
+ */
+uint32_t HW_FLASH_OB_GetSFSA(void);
+
+/**
+ * @brief Get Option Byte SBSRA
+ *
+ * @param None
+ * @retval Option Byte SBSRA
+ */
+uint32_t HW_FLASH_OB_GetSBRSA(void);
+
+/**
+ * @brief Get Option Byte SNBRSA
+ *
+ * @param None
+ * @retval Option Byte SNBRSA
+ */
+uint32_t HW_FLASH_OB_GetSNBRSA(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__HW_FLASH_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h
new file mode 100644
index 000000000..41f226faf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h
@@ -0,0 +1,60 @@
+/**
+******************************************************************************
+* @file lp_timer.h
+* @brief Header for lp_timer.c module
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __LP_TIMER_H
+#define __LP_TIMER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+ /**
+ * @brief Initialize the low power timer
+ *
+ * @param None
+ * @retval None
+ */
+ void LpTimerInit(void);
+
+ /**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : in ms
+ * @retval None
+ */
+ void LpTimerStart(uint32_t time_to_sleep);
+
+ /**
+ * @brief Read how long the timer has run
+ *
+ * @param None
+ * @retval The time elapsed in ms
+ */
+ uint32_t LpGetElapsedTime(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__LP_TIMER_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
new file mode 100644
index 000000000..3de57ae3e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
@@ -0,0 +1,38 @@
+/**
+ ******************************************************************************
+ * @file main.h
+ * @author MCD Application Team
+ * @brief Header for main.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported variables --------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under BSD 3-Clause license,
+* the "License"; You may not use this file except in compliance with the
+* License. You may obtain a copy of the License at:
+* opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..0270583e8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,350 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_HAL_CONF_H
+#define __STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+/* #define HAL_ADC_MODULE_ENABLED */
+#define HAL_COMP_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_CRC_MODULE_ENABLED
+#define HAL_CRYP_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_IPCC_MODULE_ENABLED
+#define HAL_IRDA_MODULE_ENABLED
+#define HAL_IWDG_MODULE_ENABLED
+#define HAL_LCD_MODULE_ENABLED
+#define HAL_LPTIM_MODULE_ENABLED
+#define HAL_PCD_MODULE_ENABLED
+#define HAL_PKA_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_QSPI_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_RNG_MODULE_ENABLED
+#define HAL_RTC_MODULE_ENABLED
+#define HAL_SAI_MODULE_ENABLED
+#define HAL_SMARTCARD_MODULE_ENABLED
+#define HAL_SMBUS_MODULE_ENABLED
+/* #define HAL_SPI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+#define HAL_TSC_MODULE_ENABLED
+#define HAL_UART_MODULE_ENABLED
+#define HAL_USART_MODULE_ENABLED
+#define HAL_WWDG_MODULE_ENABLED
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0u
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0u
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0u
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0u
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0u
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0u
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0u
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0u
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0u
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0u
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0u
+#define USE_HAL_UART_REGISTER_CALLBACKS 0u
+#define USE_HAL_USART_REGISTER_CALLBACKS 0u
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0u
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE ((uint32_t)32000000) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)48000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)(1<<__NVIC_PRIO_BITS) - 1) /*!< tick interrupt priority (lowest by default) */
+#define USE_RTOS 0
+#define PREFETCH_ENABLE 0
+#define INSTRUCTION_CACHE_ENABLE 1
+#define DATA_CACHE_ENABLE 1
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1 */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 1U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(char* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..5bebf1ba6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,70 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32WBxx_IT_H
+#define __STM32WBxx_IT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+void USART1_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void LPUART1_IRQHandler(void);
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+
+void USB_LP_IRQHandler(void);
+void USB_HP_IRQHandler(void);
+void USB_FS_WKUP_IRQHandler(void);
+
+void POWEROFF_EXTI_IRQHandler(void);
+void TIM2_IRQHandler(void);
+void TIM1_CC_IRQHandler(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32WBxx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..4b9e79dde
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h
@@ -0,0 +1,53 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA_ID)
+#define VCP_TASK_PRIO (CFG_SEQ_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c
new file mode 100644
index 000000000..083cbcd94
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c
@@ -0,0 +1,350 @@
+/**
+ ******************************************************************************
+ * @file app_debug.c
+ * @author MCD Application Team
+ * @brief Debug capabilities
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "app_debug.h"
+#include "utilities_common.h"
+#include "shci.h"
+#include "tl.h"
+#include "dbg_trace.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef PACKED_STRUCT
+{
+ GPIO_TypeDef* port;
+ uint16_t pin;
+ uint8_t enable;
+ uint8_t reserved;
+} APPD_GpioConfig_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define GPIO_NBR_OF_RF_SIGNALS 9
+#define GPIO_CFG_NBR_OF_FEATURES 34
+#define NBR_OF_TRACES_CONFIG_PARAMETERS 4
+#define NBR_OF_GENERAL_CONFIG_PARAMETERS 4
+
+/**
+ * THIS SHALL BE SET TO A VALUE DIFFERENT FROM 0 ONLY ON REQUEST FROM ST SUPPORT
+ */
+#define BLE_DTB_CFG 0
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_TracesConfig_t APPD_TracesConfig={0, 0, 0, 0};
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static SHCI_C2_DEBUG_GeneralConfig_t APPD_GeneralConfig={BLE_DTB_CFG, {0, 0, 0}};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * It provides timing information on the CPU2 activity.
+ * All configuration of (port, pin) is supported for each features and can be selected by the user
+ * depending on the availability
+ */
+static const APPD_GpioConfig_t aGpioConfigList[GPIO_CFG_NBR_OF_FEATURES] =
+{
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ISR - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_TICK - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_ACL_DATA_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* SYS_CMD_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* RNG_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVM_PROCESS - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_GENERAL - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_BLE_ACL_DATA_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_SYS_EVT_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_CMD_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_OT_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_CLI_ACK_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_MEM_MANAGER_RX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IPCC_TRACES_TX - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* HARD_FAULT - Set on Entry / Reset on Exit */
+/* From v1.1.1 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* IP_CORE_LP_STATUS - Set on Entry / Reset on Exit */
+/* From v1.2.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* END_OF_CONNECTION_EVENT - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* TIMER_SERVER_CALLBACK - Toggle on Entry */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* PES_ACTIVITY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* MB_BLE_SEND_EVT - Set on Entry / Reset on Exit */
+/* From v1.3.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_NO_DELAY - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* BLE_STACK_STORE_NVM_CB - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_ONGOING - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_WRITE_COMPLETE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_CLEANUP - Set on Entry / Reset on Exit */
+/* From v1.4.0 */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* NVMA_START - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_EOP - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_WRITE - Set on Entry / Reset on Exit */
+ { GPIOA, LL_GPIO_PIN_0, 0, 0}, /* FLASH_ERASE - Set on Entry / Reset on Exit */
+};
+
+/**
+ * THE DEBUG ON GPIO FOR CPU2 IS INTENDED TO BE USED ONLY ON REQUEST FROM ST SUPPORT
+ * This table is relevant only for BLE
+ * It provides timing information on BLE RF activity.
+ * New signals may be allocated at any location when requested by ST
+ * The GPIO allocated to each signal depend on the BLE_DTB_CFG value and cannot be changed
+ */
+#if( BLE_DTB_CFG == 7)
+static const APPD_GpioConfig_t aRfConfigList[GPIO_NBR_OF_RF_SIGNALS] =
+{
+ { GPIOB, LL_GPIO_PIN_2, 0, 0}, /* DTB10 - Tx/Rx SPI */
+ { GPIOB, LL_GPIO_PIN_7, 0, 0}, /* DTB11 - Tx/Tx SPI Clk */
+ { GPIOA, LL_GPIO_PIN_8, 0, 0}, /* DTB12 - Tx/Rx Ready & SPI Select */
+ { GPIOA, LL_GPIO_PIN_9, 0, 0}, /* DTB13 - Tx/Rx Start */
+ { GPIOA, LL_GPIO_PIN_10, 0, 0}, /* DTB14 - FSM0 */
+ { GPIOA, LL_GPIO_PIN_11, 0, 0}, /* DTB15 - FSM1 */
+ { GPIOB, LL_GPIO_PIN_8, 0, 0}, /* DTB16 - FSM2 */
+ { GPIOB, LL_GPIO_PIN_11, 0, 0}, /* DTB17 - FSM3 */
+ { GPIOB, LL_GPIO_PIN_10, 0, 0}, /* DTB18 - FSM4 */
+};
+#endif
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void APPD_SetCPU2GpioConfig( void );
+static void APPD_BleDtbCfg( void );
+
+/* Functions Definition ------------------------------------------------------*/
+void APPD_Init( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+ HAL_DBGMCU_EnableDBGStopMode();
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ APPD_SetCPU2GpioConfig( );
+ APPD_BleDtbCfg( );
+
+ return;
+}
+
+void APPD_EnableCPU2( void )
+{
+ SHCI_C2_DEBUG_Init_Cmd_Packet_t DebugCmdPacket =
+ {
+ {{0,0,0}}, /**< Does not need to be initialized */
+ {(uint8_t *)aGpioConfigList,
+ (uint8_t *)&APPD_TracesConfig,
+ (uint8_t *)&APPD_GeneralConfig,
+ GPIO_CFG_NBR_OF_FEATURES,
+ NBR_OF_TRACES_CONFIG_PARAMETERS,
+ NBR_OF_GENERAL_CONFIG_PARAMETERS}
+ };
+
+ /**< Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /** GPIO DEBUG Initialization */
+ SHCI_C2_DEBUG_Init( &DebugCmdPacket );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void APPD_SetCPU2GpioConfig( void )
+{
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+ uint16_t gpioc_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+ gpioc_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_CFG_NBR_OF_FEATURES; local_loop++)
+ {
+ if( aGpioConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aGpioConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOC:
+ gpioc_pin_list |= aGpioConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ HAL_GPIO_WritePin(GPIOA, gpioa_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ HAL_GPIO_WritePin(GPIOB, gpiob_pin_list, GPIO_PIN_RESET);
+ }
+
+ if(gpioc_pin_list != 0)
+ {
+ gpio_config.Pin = gpioc_pin_list;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &gpio_config);
+ HAL_GPIO_WritePin(GPIOC, gpioc_pin_list, GPIO_PIN_RESET);
+ }
+
+ return;
+}
+
+static void APPD_BleDtbCfg( void )
+{
+#if (BLE_DTB_CFG != 0)
+ GPIO_InitTypeDef gpio_config = {0};
+ uint8_t local_loop;
+ uint16_t gpioa_pin_list;
+ uint16_t gpiob_pin_list;
+
+ gpioa_pin_list = 0;
+ gpiob_pin_list = 0;
+
+ for(local_loop = 0 ; local_loop < GPIO_NBR_OF_RF_SIGNALS; local_loop++)
+ {
+ if( aRfConfigList[local_loop].enable != 0)
+ {
+ switch((uint32_t)aRfConfigList[local_loop].port)
+ {
+ case (uint32_t)GPIOA:
+ gpioa_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ case (uint32_t)GPIOB:
+ gpiob_pin_list |= aRfConfigList[local_loop].pin;
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_AF_PP;
+ gpio_config.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ gpio_config.Alternate = GPIO_AF6_RF_DTB7;
+
+ if(gpioa_pin_list != 0)
+ {
+ gpio_config.Pin = gpioa_pin_list;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ }
+
+ if(gpiob_pin_list != 0)
+ {
+ gpio_config.Pin = gpiob_pin_list;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ }
+#endif
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+*************************************************************/
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ VCP_Init( &VcpTxBuffer[0], 0 );
+
+ return;
+}
+
+
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ VCP_SendData ( p_data , size , cb );
+
+ return;
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c
new file mode 100644
index 000000000..52d5c9dac
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c
@@ -0,0 +1,384 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_entry.c
+ * @author MCD Application Team
+ * @brief Entry point of the Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_ble.h"
+#include "ble.h"
+#include "tl.h"
+#include "stm32_seq.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "app_debug.h"
+#include "vcp.h"
+
+#include "app_debug.h"
+
+#include "appli_mesh.h"
+#include "appli_nvm.h"
+#include "pal_nvm.h"
+#include "lp_timer.h"
+#include "mesh_cfg.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc;
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+extern MOBLEUINT8 PowerOnOff_flag;
+#endif
+#ifdef ENABLE_OCCUPANCY_SENSOR
+extern MOBLEUINT8 Occupancy_Flag;
+#endif
+extern const void *mobleNvmBase;
+extern const void *appNvmBase;
+extern const void *prvsnr_data;
+#if (LOW_POWER_FEATURE == 1)
+extern __IO uint32_t uwTick;
+extern uint32_t uwTickFreq;
+#if ( CFG_LPM_SUPPORTED == 1)
+static uint32_t BleMesh_sleepTime;
+#endif
+extern volatile uint8_t BleProcessInit;
+#endif
+
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4U*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4U))
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t BleSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255];
+
+#if(CFG_DEBUG_TRACE != 0)
+static uint8_t VcpTxBuffer[MAX_DBG_TRACE_MSG_SIZE]; /* Transmit buffer over USB */
+#endif
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void SystemPower_Config( void );
+static void appe_Tl_Init( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+
+static void APPE_SysUserEvtRx( void * pPayload );
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern void MX_LPUART1_UART_Init(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern void MX_USART1_UART_Init(void);
+#endif
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+uint8_t Mesh_Stop_Mode;
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ MOBLEUINT32 last_user_flash_address = ((READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos) << 12) + FLASH_BASE;
+
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+/* USER CODE BEGIN APPE_Init_1 */
+ APPD_Init( );
+
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ Led_Init();
+
+ Button_Init();
+
+ mobleNvmBase = (const void *)(last_user_flash_address - NVM_SIZE);
+ appNvmBase = (const void *)(last_user_flash_address - NVM_SIZE - APP_NVM_SIZE);
+ prvsnr_data = (const void *)(last_user_flash_address - NVM_SIZE - APP_NVM_SIZE - PRVN_NVM_PAGE_SIZE);
+
+#if (LOW_POWER_FEATURE == 1)
+ /**
+ * Initialize the lp timer to be used when the systick is stopped in low power mode
+ */
+ LpTimerInit();
+#endif
+
+/* USER CODE END APPE_Init_1 */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = BleSpareEvtBuffer;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ UNUSED(pPayload);
+ /* Traces channel initialization */
+ /* Enable debug on CPU2 */
+ APPD_EnableCPU2( );
+
+ APP_BLE_Init( );
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+#if (LOW_POWER_FEATURE == 1)
+ if(BleProcessInit != 0)
+ {
+ BleMesh_sleepTime = (uint32_t)BLEMesh_GetSleepDuration();
+
+ if (BleMesh_sleepTime > 0)
+ {
+ LpTimerStart(BleMesh_sleepTime);
+
+ UTIL_LPM_EnterLowPower( );
+
+ uwTick += (uwTickFreq*LpGetElapsedTime());
+ }
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+ }
+#else
+ UTIL_LPM_EnterLowPower( );
+#endif
+#else
+#if (LOW_POWER_FEATURE == 1)
+ if(BleProcessInit != 0)
+ {
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+ }
+#endif
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_Run( 0 );
+#else
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+#endif
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UTIL_SEQ_SetEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UTIL_SEQ_WaitEvt( 1<< CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID );
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ case POWEROFF_PIN:
+ {
+ PowerOnOff_flag = 1;
+ }
+ break;
+#endif
+
+ case BUTTON_SW1_PIN:
+ {
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW1_REQ_ID, CFG_SCH_PRIO_0);
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c
new file mode 100644
index 000000000..882181c8c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c
@@ -0,0 +1,152 @@
+/*****************************************************************************
+ * @file hw_flash.c
+ * @author MCD Application Team
+ * @brief This file contains the FLASH driver needed by EE module
+ *****************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *****************************************************************************
+ */
+
+#include "common.h"
+#include "stm32_seq.h"
+//#include "dbg_gpio.h"
+#include "hw_flash.h"
+#include "stm32wbxx_hal.h"
+
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);
+static void HW_FLASH_PageErase(uint32_t Page);
+//static void HW_FLASH_WaitEndOfOperation(void);
+
+/*****************************************************************************/
+
+MOBLE_RESULT HW_FLASH_Write(uint32_t address, uint64_t data)
+{
+ /* Enable EOP interrupt */
+ // __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ // __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_Program_DoubleWord(address, data);
+
+ // HW_FLASH_WaitEndOfOperation();
+
+ /* Disable EOP interrupt */
+// __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the PG bit once data has been written */
+ CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
+
+ return (MOBLE_RESULT_SUCCESS);
+}
+
+/*****************************************************************************/
+
+MOBLE_RESULT HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt)
+{
+ UNUSED(interrupt);
+
+ uint32_t loop;
+
+ /* Enable EOP interrupt */
+ __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ for( loop = 0; loop < n ; loop++)
+ {
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ HW_FLASH_PageErase(page+loop);
+
+// HW_FLASH_WaitEndOfOperation();
+ }
+
+ /* Disable EOP interrupt */
+ __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP);
+
+ /* Clear the page erase bit */
+ CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));
+
+ return (MOBLE_RESULT_SUCCESS);
+}
+
+#if 0
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetIPCCBufferAddr(void)
+{
+ return READ_BIT(FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSFSA(void)
+{
+ return (READ_BIT(FLASH->SFR, FLASH_SFR_SFSA) >> FLASH_SFR_SFSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SBRSA) >> FLASH_SRRVR_SBRSA_Pos);
+}
+
+/*****************************************************************************/
+
+uint32_t HW_FLASH_OB_GetSNBRSA(void)
+{
+ return (READ_BIT(FLASH->SRRVR, FLASH_SRRVR_SNBRSA) >> FLASH_SRRVR_SNBRSA_Pos);
+}
+#endif
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * This is a copy of FLASH_Program_DoubleWord() from the HAL
+ */
+static void HW_FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_WRITE);
+
+ /* Set PG bit */
+ SET_BIT(FLASH->CR, FLASH_CR_PG);
+
+ /* Program first word */
+ *(uint32_t *)Address = (uint32_t)Data;
+
+ /* Barrier to ensure programming is performed in 2 steps, in right order
+ (independently of compiler optimization behavior) */
+ __ISB();
+
+ /* Program second word */
+ *(uint32_t *)(Address + 4U) = (uint32_t)(Data >> 32U);
+
+// DBG_GPIO_Gr2Reset(DBG_GPIO_GR2_FLASH_WRITE);
+}
+
+/**
+ * This is a copy of LASH_PageErase() from the HAL
+ */
+static void HW_FLASH_PageErase(uint32_t Page)
+{
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+
+ /* Proceed to erase the page */
+ MODIFY_REG(FLASH->CR, FLASH_CR_PNB, ((Page << FLASH_CR_PNB_Pos) | FLASH_CR_PER | FLASH_CR_STRT));
+
+// DBG_GPIO_Gr2Set(DBG_GPIO_GR2_FLASH_ERASE);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c
new file mode 100644
index 000000000..cb97bd718
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c
@@ -0,0 +1,471 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ (__HANDLE__).Init.BaudRate = CFG_HW_##__USART_BASE__##_BAUDRATE; \
+ (__HANDLE__).Init.WordLength = CFG_HW_##__USART_BASE__##_WORDLENGTH; \
+ (__HANDLE__).Init.StopBits = CFG_HW_##__USART_BASE__##_STOPBITS; \
+ (__HANDLE__).Init.Parity = CFG_HW_##__USART_BASE__##_PARITY; \
+ (__HANDLE__).Init.HwFlowCtl = CFG_HW_##__USART_BASE__##_HWFLOWCTL; \
+ (__HANDLE__).Init.Mode = CFG_HW_##__USART_BASE__##_MODE; \
+ (__HANDLE__).Init.OverSampling = CFG_HW_##__USART_BASE__##_OVERSAMPLING; \
+ (__HANDLE__).AdvancedInit.AdvFeatureInit = CFG_HW_##__USART_BASE__##_ADVFEATUREINIT; \
+ HAL_UART_Init(&(__HANDLE__)); \
+ } while(0)
+
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+#define HW_UART_MSP_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ \
+ /* Configure Tx Pin */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_TX_PIN ; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_TX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_TX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_TX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_TX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_TX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure Rx Pin */ \
+ CFG_HW_##__USART_BASE__##_RX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_RX_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_RX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_RX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_RX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_RX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_RX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure CTS Pin */ \
+ CFG_HW_##__USART_BASE__##_CTS_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_CTS_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_CTS_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_CTS_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_CTS_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_CTS_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_CTS_PORT, &GPIO_InitStruct); \
+ \
+ /* Set USART source clock */ \
+ __HAL_RCC_##__USART_BASE__##_CONFIG(CFG_HW_##__USART_BASE__##_SOURCE_CLOCK); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_CLK_ENABLE(); \
+ \
+ HAL_NVIC_SetPriority(__USART_BASE__##_IRQn, CFG_HW_##__USART_BASE__##_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(__USART_BASE__##_IRQn); \
+ } while(0)
+
+#define HW_UART_MSP_TX_DMA_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ /* Configure the DMA handler for Transmission process */ \
+ /* Enable DMA clock */ \
+ CFG_HW_##__USART_BASE__##_DMA_CLK_ENABLE(); \
+ /* Enable DMA MUX clock */ \
+ CFG_HW_##__USART_BASE__##_DMAMUX_CLK_ENABLE(); \
+ \
+ HW_hdma_##__HANDLE__##_tx.Instance = CFG_HW_##__USART_BASE__##_TX_DMA_CHANNEL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Request = CFG_HW_##__USART_BASE__##_TX_DMA_REQ; \
+ HW_hdma_##__HANDLE__##_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphInc = DMA_PINC_DISABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemInc = DMA_MINC_ENABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.Mode = DMA_NORMAL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Priority = DMA_PRIORITY_LOW; \
+ \
+ HAL_DMA_Init(&HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* Associate the initialized DMA handle to the UART handle */ \
+ __HAL_LINKDMA(huart, hdmatx, HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* NVIC configuration for DMA transfer complete interrupt */ \
+ HAL_NVIC_SetPriority(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn, CFG_HW_##__USART_BASE__##_DMA_TX_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_DMA_TX_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn); \
+ } while(0)
+
+/* Variables ------------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+ UART_HandleTypeDef huart1 = {0};
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+void (*HW_huart1RxCb)(void);
+void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ UART_HandleTypeDef hlpuart1 = {0};
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef HW_hdma_hlpuart1_tx ={0};
+#endif
+void (*HW_hlpuart1RxCb)(void);
+void (*HW_hlpuart1TxCb)(void);
+#endif
+
+void HW_UART_Init(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_INIT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_INIT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(hlpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+{
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_USART2_ENABLED == 1)
+ case hw_uart2:
+ HW_huart2TxCb = cb;
+ huart2.Instance = USART2;
+ hal_status = HAL_UART_Transmit_DMA(&huart2, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_hlpuart1TxCb = cb;
+ hlpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&hlpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+}
+
+void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&hlpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+{
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_USART2_DMA_TX_SUPPORTED == 1)
+ case hw_uart2:
+ HAL_DMA_IRQHandler(huart2.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(hlpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_MspInit(UART_HandleTypeDef *huart)
+{
+#if ( (CFG_HW_USART1_ENABLED == 1) || (CFG_HW_LPUART1_ENABLED == 1) )
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+#endif
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ HW_UART_MSP_UART_INIT( huart1, USART1 );
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( huart1, USART1 );
+#endif
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ HW_UART_MSP_UART_INIT( hlpuart1, LPUART1 );
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( hlpuart1, LPUART1 );
+#endif
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1RxCb)
+ {
+ HW_hlpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_hlpuart1TxCb)
+ {
+ HW_hlpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c
new file mode 100644
index 000000000..404bb2e3b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c
@@ -0,0 +1,134 @@
+/**
+ ***************************************************************************************
+ * File Name : lp_timer.c
+ * Description : Low power timer to be used within Mesh Application.
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "lp_timer.h"
+
+/* Exported variables --------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void LpTimerCb(void);
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ uint32_t LpTimeLeftOnEntry;
+ uint8_t LpTimer_Id;
+} LpTimerContext_t;
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static LpTimerContext_t LpTimerContext;
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Initialize the low power timer
+ *
+ * @param None
+ * @retval None
+ */
+void LpTimerInit(void)
+{
+ (void) HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(LpTimerContext.LpTimer_Id), hw_ts_SingleShot, LpTimerCb);
+
+ return;
+}
+
+/**
+ * @brief Request to start a low power timer ( running is stop mode )
+ *
+ * @param time_to_sleep : in ms
+ * @retval None
+ */
+void LpTimerStart(uint32_t time_to_sleep)
+{
+ /* Converts the number of ms into hw timer tick */
+ if(time_to_sleep > 0x400000)
+ {
+ time_to_sleep = time_to_sleep / (CFG_TS_TICK_VAL);
+ time_to_sleep *= 1000;
+ }
+ else
+ {
+ time_to_sleep *= 1000;
+ time_to_sleep = time_to_sleep / (CFG_TS_TICK_VAL);
+ }
+
+ HW_TS_Start(LpTimerContext.LpTimer_Id, time_to_sleep);
+
+ /**
+ * There might be other timers already running in the timer server that may elapse
+ * before this one.
+ * Store how long before the next event so that on wakeup, it will be possible to calculate
+ * how long the tick has been suppressed
+ */
+ LpTimerContext.LpTimeLeftOnEntry = HW_TS_RTC_ReadLeftTicksToCount();
+
+ return;
+}
+
+/**
+ * @brief Read how long the timer has run
+ *
+ * @param None
+ * @retval The time elapsed in ms
+ */
+uint32_t LpGetElapsedTime(void)
+{
+ uint32_t return_value;
+
+ return_value = (CFG_TS_TICK_VAL) * (uint32_t)(LpTimerContext.LpTimeLeftOnEntry - HW_TS_RTC_ReadLeftTicksToCount());
+ return_value = return_value / 1000;
+
+ /**
+ * The system may have been out from another reason than the timer
+ * Stop the timer after the elapsed time is calculated other wise, HW_TS_RTC_ReadLeftTicksToCount()
+ * may return 0xFFFF ( TIMER LIST EMPTY )
+ * It does not hurt stopping a timer that exists but is not running.
+ */
+ HW_TS_Stop(LpTimerContext.LpTimer_Id);
+
+ return return_value;
+}
+
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Low power timer callback
+ *
+ * @param None
+ * @retval None
+ */
+static void LpTimerCb( void )
+{
+ /**
+ * Nothing to be done
+ */
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
new file mode 100644
index 000000000..95537ac98
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
@@ -0,0 +1,432 @@
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief BLE application with BLE core
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Stack_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "app_entry.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "dbg_trace.h"
+
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include "otp.h"
+#include "stm32wbxx_hal_rcc.h"
+
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application
+* @{
+*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Global variables ---------------------------------------------------------*/
+RTC_HandleTypeDef hrtc = { 0 }; /**< RTC handler declaration */
+TIM_HandleTypeDef htim1 = { 0 };
+TIM_HandleTypeDef htim2 = { 0 };
+
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void Reset_BackupDomain( void );
+static void Init_RTC( void );
+static void SystemClock_Config( void );
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Init_Exti( void );
+void Error_Handler(void);
+void PeriphClock_Config(void);
+static void Config_HSE(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+int main( void )
+{
+ HAL_Init();
+
+ Reset_Device();
+ Config_HSE();
+
+ /**
+ * When the application is expected to run at higher speed, it should be better to set the correct system clock
+ * in system_stm32yyxx.c so that the initialization phase is running at max speed.
+ */
+ SystemClock_Config(); /**< Configure the system clock */
+
+ PeriphClock_Config();
+
+// HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_16);
+
+ Init_Exti( );
+
+ Init_RTC();
+
+ /* Enable CRC clock */
+ __HAL_RCC_CRC_CLK_ENABLE();
+
+ APPE_Init( );
+
+#if ( CFG_LPM_SUPPORTED == 1)
+// BSP_LED_On(LED_GREEN);
+#endif
+
+ while(1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_RTC( void )
+{
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+
+ __HAL_RCC_RTC_ENABLE(); /**< Enable RTC */
+
+ hrtc.Instance = RTC;
+ hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
+ hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
+ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
+ if (HAL_RTC_Init(&hrtc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+
+ return;
+}
+
+void PeriphClock_Config(void)
+{
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif
+
+ return;
+}
+
+static void Config_HSE(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ return;
+}
+
+ /**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+
+ /* USER CODE END Error_Handler_Debug */
+}
+
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+ /** Configure LSE Drive Capability
+ */
+ __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
+ /** Initializes the CPU, AHB and APB busses clocks
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
+ |RCC_OSCILLATORTYPE_LSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
+ |RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+#if ( CFG_LPM_SUPPORTED == 1)
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
+#else
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+#endif
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK2Divider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLK4Divider = RCC_SYSCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Initializes the peripherals clocks
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
+ |RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
+ |RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+#if (CFG_USE_SMPS != 0)
+ /**
+ * Configure and enable SMPS
+ *
+ * The SMPS configuration is not yet supported by CubeMx
+ */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#endif
+ /* USER CODE END Smps */
+}
+
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..02c02d26a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,265 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "stm32wbxx_it.h"
+#include "appli_mesh.h"
+#include "PWM_handlers.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+extern PCD_HandleTypeDef hpcd;
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/******************************************************************************/
+/* Cortex-M4 Processor Exceptions Handlers */
+/******************************************************************************/
+
+/**
+ * @brief This function handles NMI exception.
+ * @param None
+ * @retval None
+ */
+void NMI_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Hard Fault exception.
+ * @param None
+ * @retval None
+ */
+void HardFault_Handler(void)
+{
+ BSP_LED_On(LED_RED);
+#ifndef DISABLE_TRACES
+ printf("HARDFAULT !\r\n");
+#endif
+ /* Go to infinite loop when Hard Fault exception occurs */
+ while (1)
+ {
+ }
+}
+
+/**
+ * @brief This function handles SVCall exception.
+ * @param None
+ * @retval None
+ */
+void SVC_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Debug Monitor exception.
+ * @param None
+ * @retval None
+ */
+void DebugMon_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles PendSVC exception.
+ * @param None
+ * @retval None
+ */
+void PendSV_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles SysTick Handler.
+ * @param None
+ * @retval None
+ */
+void SysTick_Handler(void)
+{
+ HAL_IncTick();
+}
+
+/********************************************************************************/
+/* STM32WBxx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32wb55xx_cm4.s). */
+/********************************************************************************/
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void)
+{
+// HAL_GPIO_EXTI_IRQHandler(BUTTON_SW2_PIN);
+}
+
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void)
+{
+ // HAL_GPIO_EXTI_IRQHandler(BUTTON_SW3_PIN);
+}
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+/**
+ * @brief This function handles External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void POWEROFF_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(POWEROFF_PIN);
+}
+#endif
+
+/**
+ * @brief This function handles USB FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+void USB_LP_IRQHandler(void)
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+
+/**
+ * @brief This function handles USB FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+void USB_HP_IRQHandler(void)
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+
+/**
+ * @brief This function handles USB FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+void USB_FS_WKUP_IRQHandler(void)
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+
+
+#if(CFG_HW_USART1_ENABLED == 1)
+void USART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+#if(CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_USART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+#if(CFG_HW_LPUART1_ENABLED == 1)
+void LPUART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+#if(CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+/**
+ * @brief This function handles TIM2 global interrupt.
+ */
+void TIM2_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM2_IRQn 0 */
+
+ /* USER CODE END TIM2_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim2);
+ /* USER CODE BEGIN TIM2_IRQn 1 */
+
+ /* USER CODE END TIM2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles TIM1 global interrupt.
+ */
+void TIM1_CC_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM1_IRQn 0 */
+
+ /* USER CODE END TIM1_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim1);
+ /* USER CODE BEGIN TIM1_IRQn 1 */
+
+ /* USER CODE END TIM1_IRQn 1 */
+}
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..9e9b79832
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,343 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "app_common.h"
+#include "otp.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+/* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+ const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+ /**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /* FPU settings ------------------------------------------------------------*/
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+#endif
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ LL_RCC_HSE_Enable();
+
+ /**
+ * Set FLASH latency to 1WS
+ */
+ LL_FLASH_SetLatency( LL_FLASH_LATENCY_1 );
+ while( LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1 );
+
+ /**
+ * Switch to HSE
+ *
+ */
+ while(!LL_RCC_HSE_IsReady());
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSE );
+ while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+
+ /**
+ * Switch OFF MSI
+ */
+ LL_RCC_MSI_Disable();
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /*SystemCoreClock=HAL_RCC_GetSysClockFreq();*/
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd
new file mode 100644
index 000000000..b7a6cfe1b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewd
@@ -0,0 +1,2834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_PRF_Node</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB55CG.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB5xxG_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+ <configuration>
+ <name>Lighting_Provisioner</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>C-SPY</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>29</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCVariant</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>MemOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MemFile</name>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB55CG.ddf</state>
+ </option>
+ <option>
+ <name>RunToEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RunToName</name>
+ <state>main</state>
+ </option>
+ <option>
+ <name>CExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDDFArgumentProducer</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadSuppressDownload</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDownloadVerifyAll</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>OCDynDriverList</name>
+ <state>STLINK_ID</state>
+ </option>
+ <option>
+ <name>OCLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>UseFlashLoader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CLowLevel</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacFile2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CDevice</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>FlashLoadersV3</name>
+ <state>$TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32WB5xxG_M4.board</state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesSuppressCheck3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesPath3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OverrideDefFlashBoard</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesOffset1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesOffset3</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCImagesUse1</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCImagesUse3</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDeviceConfigMacroFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCDebuggerExtraOption</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAllMTBOptions</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreNrOfCores</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCMulticoreMaster</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCDownloadExtraImage</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCAttachSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MassEraseBeforeFlashing</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ARMSIM_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCSimDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCSimEnablePSP</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspOverrideConfig</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCSimPspConfigFile</name>
+ <state></state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CADI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCadiMemory</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Fast Model</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCADILogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCADILogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CMSISDAP_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CMSISDAPResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>CMSISDAPHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>CMSISDAPDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CMSISDAPProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CMSISDAPSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCMSISDAPUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>GDBSERVER_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJTagBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJTagUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IJET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>8</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCIarProbeScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetResetList</name>
+ <version>1</version>
+ <state>10</state>
+ </option>
+ <option>
+ <name>IjetHWResetDuration</name>
+ <state>300</state>
+ </option>
+ <option>
+ <name>IjetHWResetDelay</name>
+ <state>200</state>
+ </option>
+ <option>
+ <name>IjetPowerFromProbe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPowerRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>IjetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTargetEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetProtocolRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSwoPin</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetSwoPrescalerList</name>
+ <version>1</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetRestoreBreakpointsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetUpdateBreakpointsEdit</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>RDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchUndef</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchData</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchPrefetch</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>RDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>RDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CatchMMERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchNOCPERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchCHKERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSTATERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchBUSERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchINTERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchSFERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchHARDERR</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeCfgOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCProbeConfig</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IjetProbeConfigRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetMultiCPUNumber</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetSelectedCPUBehaviour</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ICpuName</name>
+ <state></state>
+ </option>
+ <option>
+ <name>OCJetEmuParams</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetPreferETB</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IjetTraceSettingsList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IjetTraceSizeList</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>FlashBoardPathSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCIjetUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>JLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>16</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>JLinkSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCJLinkDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCJLinkHWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>JLinkInitialSpeed</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCDoJlinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCScanChainNonARMDevices</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkMultiTarget</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkIRLength</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkCommRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTCPIP</name>
+ <state>aaa.bbb.ccc.ddd</state>
+ </option>
+ <option>
+ <name>CCJLinkSpeedRadioV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCUSBDevice</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRDICatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRDICatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkBreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkResetList</name>
+ <version>6</version>
+ <state>5</state>
+ </option>
+ <option>
+ <name>CCJLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkScriptFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCTcpIpAlt</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCJLinkTcpIpSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkTraceSourceDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OCJLinkDeviceName</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>LMIFTDI_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>2</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>LmiftdiSpeed</name>
+ <state>500</state>
+ </option>
+ <option>
+ <name>CCLmiftdiDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiftdiLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCLmiFtdiInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>PEMICRO_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>3</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCJPEMicroShowSettings</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>STLINK_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>4</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceRadio</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCSTLinkInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkResetList</name>
+ <version>3</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>CCCpuClockEdit</name>
+ <state>32.0</state>
+ </option>
+ <option>
+ <name>CCSwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSwoClockEdit</name>
+ <state>2000</state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCSTLinkDoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkCatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkJtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSTLinkDAPNumber</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCSTLinkDebugAccessPortRadio</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>THIRDPARTY_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CThirdPartyDriverDll</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CThirdPartyLogFileEditB</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>TIFET_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetInterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVccTypeDefault</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetVoltage</name>
+ <state>###Uninitialized###</state>
+ </option>
+ <option>
+ <name>CCMSPFetVCCDefault</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetTargetSettlingtime</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioJtagSpeedType</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCMSPFetConnection</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetUsbComPort</name>
+ <state>Automatic</state>
+ </option>
+ <option>
+ <name>CCMSPFetAllowAccessToBSL</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetDoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCMSPFetLogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCMSPFetRadioEraseFlash</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>XDS100_ID</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>6</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OCDriverInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TIPackageOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>TIPackage</name>
+ <state></state>
+ </option>
+ <option>
+ <name>BoardFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DoLogfile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>LogFile</name>
+ <state>$PROJ_DIR$\cspycomm.log</state>
+ </option>
+ <option>
+ <name>CCXds100BreakpointRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100DoUpdateBreakpoints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UpdateBreakpoints</name>
+ <state>_call_main</state>
+ </option>
+ <option>
+ <name>CCXds100CatchReset</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchUndef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSWI</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchData</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchPrefetch</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchIRQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchFIQ</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCORERESET</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchMMERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchNOCPERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchCHRERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSTATERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchBUSERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchINTERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchHARDERR</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CatchDummy</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100CpuClockEdit</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockAuto</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SwoClockEdit</name>
+ <state>1000</state>
+ </option>
+ <option>
+ <name>CCXds100HWResetDelay</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ResetList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNo</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCXds100UsbSerialNoSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100JtagSpeedList</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceRadio</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100InterfaceCmdLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100ProbeList</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPortRadio</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCXds100SWOPort</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <debuggerPlugins>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin</file>
+ <loadFlag>1</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ <plugin>
+ <file>$EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin</file>
+ <loadFlag>0</loadFlag>
+ </plugin>
+ </debuggerPlugins>
+ </configuration>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp
new file mode 100644
index 000000000..73095ee8a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp
@@ -0,0 +1,1378 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Lighting_PRF_Node</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>Lighting_PRF_Node\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Lighting_PRF_Node\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Lighting_PRF_Node\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.80.2.11970</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55CG ST STM32WB55CG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55CG ST STM32WB55CG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>USE_STM32WBXX_USB_DONGLE</state>
+ <state>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>CORE_CM4</state>
+ <state>STM32</state>
+ <state>ENABLE_USART</state>
+ <state>TRACE_ENABLE_NO_FUNCTION</state>
+ <state>SERVER</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.USBDongle</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Inc</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\app</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>BLE_MeshLightingPRFNode.hex</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>BLE_MeshLightingPRFNode.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Library\libBle_Mesh_CM4_IAR.a</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.1.3_CM4_IARv8.a</state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>Coder</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_debug.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\lp_timer.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ </group>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>app</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\app_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_generic.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_light_lc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_mesh.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_nvm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\models_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\pal_nvm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\PWM_config.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\PWM_handlers.c</name>
+ </file>
+ </group>
+ <group>
+ <name>target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.USBDongle</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.USBDongle\stm32wbxx_usb_dongle.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_i2c.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_i2c_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_tim_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_ll_usb.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_USB_Device_Library</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c</name>
+ </file>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>ble</name>
+ <group>
+ <name>blesvc</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\common.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\generic.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_lc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\mesh.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\Src\mesh_cfg.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\time_scene.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\vendor.c</name>
+ </file>
+ </group>
+ <group>
+ <name>core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_gatt_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hal_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_hci_le.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\auto\ble_l2cap_aci.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\core\template\osal.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\hci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ </group>
+ <group>
+ <name>vcp</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp\usbd_conf.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp\usbd_desc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp\vcp.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww
new file mode 100644
index 000000000..0ac00f960
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/Project.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_MeshLightingPRFNode.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,517 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+;* All rights reserved.</center></h2>
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM Interrupt
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper, TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+CRS_IRQHandler
+ B CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..5f36da686
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,40 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+/***** FLASH Part dedicated to M4 *****/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2002FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+/**** End of ICF editor section. ###ICF###*/
+
+define symbol __ICFEDIT_region_RAM_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM_SHARED_end__ = 0x200327FF;
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+define region RAM_SHARED_region = mem:[from __ICFEDIT_region_RAM_SHARED_start__ to __ICFEDIT_region_RAM_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+/* MB_MEM1 and MB_MEM2 are sections reserved to mailbox communication. It is placed in the shared memory */
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite,block CSTACK, block HEAP };
+place in RAM_SHARED_region { first section MAPPING_TABLE};
+place in RAM_SHARED_region { section MB_MEM1};
+place in RAM_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvoptx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
index 11313ade5..67f89ddc2 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/MDK-ARM/BLE_MeshLightingDemo.uvoptx
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
@@ -22,7 +22,7 @@
</DaveTm>
<Target>
- <TargetName>Lighting_Node</TargetName>
+ <TargetName>Lighting_PRFNode</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<TargetOption>
@@ -103,7 +103,7 @@
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
- <nTsel>11</nTsel>
+ <nTsel>0</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
@@ -114,18 +114,13 @@
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
- <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ <pMon>BIN\UL2CM3.DLL</pMon>
</DebugOpt>
<TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>UL2CM3</Key>
- <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4 -FS08000000 -FL0100000 -FP0($$Device:STM32WB55CGUx$CMSIS\Flash\STM32WB_M4.FLM))</Name>
- </SetRegEntry>
- <SetRegEntry>
- <Number>0</Number>
- <Key>ST-LINKIII-KEIL_SWO</Key>
- <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55CGUx$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ <Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32WB_M4 -FL01000000 -FS08000000 -FP0($$Device:STM32WB55CGUx$CMSIS\Flash\STM32WB_M4.FLM)</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
@@ -312,7 +307,7 @@
<Group>
<GroupName>Application/STM32_WPAN/app</GroupName>
- <tvExp>0</tvExp>
+ <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@@ -335,18 +330,6 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
- <PathWithFileName>../STM32_WPAN/app/appli_config_client.c</PathWithFileName>
- <FilenameWithoutPath>appli_config_client.c</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>3</GroupNumber>
- <FileNumber>13</FileNumber>
- <FileType>1</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
<PathWithFileName>../STM32_WPAN/app/appli_generic.c</PathWithFileName>
<FilenameWithoutPath>appli_generic.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@@ -354,19 +337,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>14</FileNumber>
- <FileType>1</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
- <PathWithFileName>../STM32_WPAN/app/appli_generic_client.c</PathWithFileName>
- <FilenameWithoutPath>appli_generic_client.c</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>3</GroupNumber>
- <FileNumber>15</FileNumber>
+ <FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -378,19 +349,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>16</FileNumber>
- <FileType>1</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
- <PathWithFileName>../STM32_WPAN/app/appli_light_client.c</PathWithFileName>
- <FilenameWithoutPath>appli_light_client.c</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>3</GroupNumber>
- <FileNumber>17</FileNumber>
+ <FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -402,7 +361,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>18</FileNumber>
+ <FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -414,7 +373,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>19</FileNumber>
+ <FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -426,7 +385,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>20</FileNumber>
+ <FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -438,7 +397,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>21</FileNumber>
+ <FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -450,7 +409,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>22</FileNumber>
+ <FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -462,7 +421,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>23</FileNumber>
+ <FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -474,7 +433,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>24</FileNumber>
+ <FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -486,7 +445,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>25</FileNumber>
+ <FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -506,7 +465,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -526,7 +485,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>24</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -546,7 +505,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -566,7 +525,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -586,7 +545,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -598,7 +557,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -610,7 +569,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -622,7 +581,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -634,7 +593,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -646,7 +605,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -658,7 +617,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -670,7 +629,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -682,7 +641,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -694,7 +653,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -706,7 +665,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -718,7 +677,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -730,7 +689,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -742,7 +701,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -754,7 +713,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -766,7 +725,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -778,7 +737,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -790,7 +749,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -802,7 +761,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -814,7 +773,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -826,7 +785,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -846,7 +805,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -858,7 +817,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>52</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -870,7 +829,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>53</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -882,7 +841,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>54</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -902,7 +861,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>55</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -914,19 +873,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>56</FileNumber>
- <FileType>1</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
- <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c</PathWithFileName>
- <FilenameWithoutPath>config_client.c</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>10</GroupNumber>
- <FileNumber>57</FileNumber>
+ <FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -938,19 +885,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>58</FileNumber>
- <FileType>1</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
- <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c</PathWithFileName>
- <FilenameWithoutPath>generic_client.c</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>10</GroupNumber>
- <FileNumber>59</FileNumber>
+ <FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -962,19 +897,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>60</FileNumber>
- <FileType>1</FileType>
- <tvExp>0</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <bDave2>0</bDave2>
- <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c</PathWithFileName>
- <FilenameWithoutPath>light_client.c</FilenameWithoutPath>
- <RteFlg>0</RteFlg>
- <bShared>0</bShared>
- </File>
- <File>
- <GroupNumber>10</GroupNumber>
- <FileNumber>61</FileNumber>
+ <FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -986,7 +909,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>62</FileNumber>
+ <FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -998,7 +921,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>63</FileNumber>
+ <FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1010,7 +933,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>64</FileNumber>
+ <FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1022,7 +945,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>65</FileNumber>
+ <FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1034,7 +957,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>66</FileNumber>
+ <FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1046,7 +969,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>67</FileNumber>
+ <FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1066,7 +989,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>68</FileNumber>
+ <FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1078,7 +1001,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>69</FileNumber>
+ <FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1090,7 +1013,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>70</FileNumber>
+ <FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1102,7 +1025,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>71</FileNumber>
+ <FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1114,7 +1037,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>72</FileNumber>
+ <FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1126,7 +1049,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>73</FileNumber>
+ <FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1146,7 +1069,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>74</FileNumber>
+ <FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1166,7 +1089,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>75</FileNumber>
+ <FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1178,7 +1101,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>76</FileNumber>
+ <FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1190,7 +1113,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>77</FileNumber>
+ <FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1202,7 +1125,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>78</FileNumber>
+ <FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1214,7 +1137,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>79</FileNumber>
+ <FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1234,7 +1157,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>80</FileNumber>
+ <FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1246,7 +1169,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>81</FileNumber>
+ <FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1258,7 +1181,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>82</FileNumber>
+ <FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1278,7 +1201,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>83</FileNumber>
+ <FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1290,7 +1213,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>84</FileNumber>
+ <FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1302,7 +1225,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>85</FileNumber>
+ <FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1314,7 +1237,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>86</FileNumber>
+ <FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1326,7 +1249,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>87</FileNumber>
+ <FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1338,7 +1261,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>88</FileNumber>
+ <FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1352,13 +1275,13 @@
<Group>
<GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
- <tvExp>1</tvExp>
+ <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>16</GroupNumber>
- <FileNumber>89</FileNumber>
+ <FileNumber>83</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1372,19 +1295,19 @@
<Group>
<GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
- <tvExp>1</tvExp>
+ <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>17</GroupNumber>
- <FileNumber>90</FileNumber>
+ <FileNumber>84</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
- <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</PathWithFileName>
- <FilenameWithoutPath>STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib</FilenameWithoutPath>
+ <PathWithFileName>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</PathWithFileName>
+ <FilenameWithoutPath>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx
new file mode 100644
index 000000000..cbea245f8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx
@@ -0,0 +1,907 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>Lighting_PRFNode</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+ <uAC6>0</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55CGUx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32WBxx_DFP.1.0.0</PackID>
+ <PackURL>http://www.keil.com/pack</PackURL>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll></FlashDriverDll>
+ <DeviceId></DeviceId>
+ <RegisterFile></RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32WB55CGUx$CMSIS\SVD\STM32WBxx_CM4.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>Lighting_PRFNode\Exe\</OutputDirectory>
+ <OutputName>BLE_MeshLightingPRFNodeDemo</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>1</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>0</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments> -REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments> -MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4101</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x80000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000004</StartAddress>
+ <Size>0x2fc00</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>1</v6Lang>
+ <v6LangP>1</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define>USE_STM32WBXX_USB_DONGLE,STM32WB55xx,USE_HAL_DRIVER,CORE_CM4,STM32,ENABLE_USART,TRACE_ENABLE_NO_FUNCTION,SERVER</Define>
+ <Undefine></Undefine>
+ <IncludePath>../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc;../Core/Inc;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../STM32_WPAN/app;../../../../../../Middlewares/ST/STM32_WPAN/ble;../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <uClangAs>0</uClangAs>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile>stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Application/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>app_debug.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_debug.c</FilePath>
+ </File>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>lp_timer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/lp_timer.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/STM32_WPAN/app</GroupName>
+ <Files>
+ <File>
+ <FileName>app_ble.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/app_ble.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_generic.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_generic.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_light.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light_lc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_light_lc.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_mesh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_mesh.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_nvm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_nvm.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_sensor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_sensor.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_vendor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/appli_vendor.c</FilePath>
+ </File>
+ <File>
+ <FileName>models_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/models_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>pal_nvm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/pal_nvm.c</FilePath>
+ </File>
+ <File>
+ <FileName>PWM_config.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/PWM_config.c</FilePath>
+ </File>
+ <File>
+ <FileName>PWM_handlers.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/app/PWM_handlers.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/STM32_WPAN/target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.USBDongle</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_usb_dongle.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <Files>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_i2c.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_i2c_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_ll_usb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_USB_Device_Library</GroupName>
+ <Files>
+ <File>
+ <FileName>usbd_cdc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_core.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_ctlreq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_ioreq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
+ <Files>
+ <File>
+ <FileName>common.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</FilePath>
+ </File>
+ <File>
+ <FileName>generic.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</FilePath>
+ </File>
+ <File>
+ <FileName>light.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</FilePath>
+ </File>
+ <File>
+ <FileName>light_lc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</FilePath>
+ </File>
+ <File>
+ <FileName>mesh.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</FilePath>
+ </File>
+ <File>
+ <FileName>mesh_cfg.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</FilePath>
+ </File>
+ <File>
+ <FileName>sensors.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</FilePath>
+ </File>
+ <File>
+ <FileName>svc_ctl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</FilePath>
+ </File>
+ <File>
+ <FileName>time_scene.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</FilePath>
+ </File>
+ <File>
+ <FileName>vendor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/ble/core</GroupName>
+ <Files>
+ <File>
+ <FileName>ble_gap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_gatt_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hal_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_hci_le.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</FilePath>
+ </File>
+ <File>
+ <FileName>ble_l2cap_aci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</FilePath>
+ </File>
+ <File>
+ <FileName>osal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>hci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>hci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp</GroupName>
+ <Files>
+ <File>
+ <FileName>usbd_conf.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_desc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</FilePath>
+ </File>
+ <File>
+ <FileName>vcp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/mesh/Library</GroupName>
+ <Files>
+ <File>
+ <FileName>libBle_Mesh_CM4_Keil.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
+ <Files>
+ <File>
+ <FileName>STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FileName>
+ <FileType>4</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.3.0" condition="CMSIS Core">
+ <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.5.0"/>
+ <targetInfos>
+ <targetInfo name="Lighting_PRFNode"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c
new file mode 100644
index 000000000..e9b50f44e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.c
@@ -0,0 +1,109 @@
+/**
+ *******************************************************************************
+ * @file PWM_config.c
+ * @author BLE Mesh Team
+ * @brief Configuration file for PWM.
+ *******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "PWM_config.h"
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+
+#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / 1000000) - 1)
+
+/**
+ *@brief Configure PWM sources and GPIO
+ *@retval None
+ */
+void PWM_Init()
+{
+ TIM_OC_InitTypeDef sConfigOC = {0};
+ TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+ /* GPIO Configuration */
+ GPIO_InitTypeDef GPIO_InitStructure = {0};
+
+
+ /* Configure PWM pins */
+ GPIO_InitStructure.Pin = PWM0_PIN | PWM1_PIN;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Pull = GPIO_PULLUP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
+
+ /* Configure PWM pins */
+ GPIO_InitStructure.Pin = PWM2_PIN | PWM3_PIN | PWM4_PIN;
+ GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure.Pull = GPIO_PULLUP;
+ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure.Alternate = GPIO_AF1_TIM2;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
+
+ /* MFT Configuration */
+ HAL_NVIC_SetPriority((IRQn_Type)(TIM1_CC_IRQn), 15, 0);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TIM1_CC_IRQn));
+ HAL_NVIC_SetPriority((IRQn_Type)(TIM2_IRQn), 15, 0);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TIM2_IRQn));
+
+ htim1.Instance = TIM1;
+ htim1.Init.Prescaler = 0/*PRESCALER_VALUE*/;
+ htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim1.Init.Period = TIME_PERIOD;
+ htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ HAL_TIM_PWM_Init(&htim1);
+
+ htim2.Instance = TIM2;
+ htim2.Init.Prescaler = 0/*PRESCALER_VALUE*/;
+ htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim2.Init.Period = TIME_PERIOD;
+ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ HAL_TIM_PWM_Init(&htim2);
+
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+ HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
+ HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
+
+ sConfigOC.OCMode = TIM_OCMODE_PWM1;
+ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+ sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+ sConfigOC.Pulse = MFT1_TON_1;
+ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
+ sConfigOC.Pulse = MFT2_TON_1;
+ HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
+ sConfigOC.Pulse = MFT1_TON_2;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
+ sConfigOC.Pulse = MFT2_TON_2;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2);
+ sConfigOC.Pulse = MFT2_TON_3;
+ HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
+
+ /* Start channel 1 */
+ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);
+ /* Start channel 2 */
+ HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_2);
+ /* Start channel 1 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);
+ /* Start channel 2 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_2);
+ /* Start channel 3 */
+ HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_3);
+}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h
new file mode 100644
index 000000000..a229ec666
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_config.h
@@ -0,0 +1,69 @@
+/******************** (C) COPYRIGHT 2015 STMicroelectronics ********************
+* File Name : PWM/PWM_config.c
+* Author : SNM Application Team
+* Version : V1.0.0
+* Date : September-2015
+* Description : Configuration file for PWM
+********************************************************************************
+* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+#include "mesh_cfg_usr.h"
+
+/* Macros defined for the number of PWM Provided */
+#define PWM0 0
+#define PWM1 1
+#define PWM2 2
+#define PWM3 3
+#define PWM4 4
+
+/************************************************************************/
+
+/*STM32WB
+ * This configuration given below is for the STM32WB board.
+ * Here user has selected the PWM0 in SERIAL2_MODE and PWM1 in SERIAL1_MODE.
+ * User can configure software PWM to any of the GPIO which are not used for
+ * hardware PWM.
+*/
+/* PWM pins for MFT1 and MFT2 respectively */
+#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
+
+#define PWM0_PIN GPIO_PIN_14 /* TIM1_CH1 AF1 */
+#define PWM1_PIN GPIO_PIN_15 /* TIM1_CH2 AF1 */
+
+/* GPIOs pins (SOFTWARE PWM) used to output a PWM signal */
+#define PWM2_PIN GPIO_PIN_0 /* TIM2_CH1 AF1 */
+#define PWM3_PIN GPIO_PIN_1 /* TIM2_CH2 AF1 */
+#define PWM4_PIN GPIO_PIN_2 /* TIM2_CH3 AF1 */
+#endif
+/************************************************************************/
+
+#define TIME_PERIOD 32000
+
+/* TIM1 Channel 1 Timer Ton and T0ff (ticks number) PWM0*/
+#define MFT1_TON_1 (12000 - 1)
+#define MFT1_TOFF_1 (20000 - 1)
+
+/* TIM1 Channel 2 Timer 1 Ton and T0ff (ticks number) PWM1*/
+#define MFT2_TON_1 (8000 - 1 )
+#define MFT2_TOFF_1 (24000 - 1)
+
+/* TIM2 Channel 1 Timer 2 Ton and T0ff (ticks number) PWM2*/
+#define MFT1_TON_2 (16000 - 1)
+#define MFT1_TOFF_2 (16000 -1)
+
+/* TIM2 Channel 2 Timer 2 Ton and T0ff (ticks number) PWM3*/
+#define MFT2_TON_2 (4000 - 1)
+#define MFT2_TOFF_2 (28000 - 1)
+
+/* TIM2 Channel 3 Timer 2 Ton and T0ff (ticks number) PWM4*/
+#define MFT2_TON_3 (4000 - 1)
+#define MFT2_TOFF_3 (28000 - 1)
+
+void PWM_Init(void);
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c
new file mode 100644
index 000000000..698bdced8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.c
@@ -0,0 +1,300 @@
+/**
+********************************************************************************
+* @file PWM_handlers.c
+* @author BLE Mesh Team
+* @version V1.0.0
+* @date 31-July-2018
+* @brief Handlers for PWM and other support functions.
+********************************************************************************
+* @attention
+*
+*<h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "app_conf.h"
+#include "PWM_handlers.h"
+#include "mesh_cfg_usr.h"
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim2;
+
+/* Global Variables */
+uint16_t DUTY;
+int NonZeroPWM0=0;
+int NonZeroPWM1=0;
+uint8_t Duty_flag_A = 0;
+uint16_t PWM0_on,
+ PWM1_on,
+ PWM2_on = MFT1_TON_2, /* Timer2, MFT1 */
+ PWM3_on = MFT2_TON_2, /* Timer2, MFT2 */
+ PWM4_on = MFT2_TON_3; /* Timer2, MFT2 */
+
+uint32_t channel = PWM3_PIN; /* It is the channel with initial lowest duty-cycle */
+uint32_t period = TIME_PERIOD; /* Period in ticks of the PWM signal */
+uint8_t channel_number = 0;
+
+uint32_t PWM_channels[] = {PWM3_PIN, PWM4_PIN}; /* Channels managed by MFT2 Timer 2 */
+uint16_t Ton_values[] = {MFT2_TON_2, MFT2_TON_3}; /* Sorted array containing duty-cycle values
+ respectively for PWM3_PIN and PWM4_PIN */
+uint16_t delta_1 = MFT2_TON_3 - MFT2_TON_2; /* Delta between the first two duty-cycles */
+uint16_t delta = MFT2_TON_3 - MFT2_TON_2;
+
+int number_of_channels = 2; /* Number of channels managed by MFT2 Timer 2 */
+int max_duty = MFT2_TON_3; /* Maximum duty-cycle */
+
+/**
+ *@brief PWM2 handler
+ *@retval None
+ */
+void PWM2_handler()
+{
+ if(__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1) > 0)
+ {
+ __HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC1);
+ if(Duty_flag_A == 1)
+ {
+ HAL_GPIO_WritePin(GPIOA, PWM2_PIN, GPIO_PIN_SET);
+ Duty_flag_A = 0;
+ htim1.Instance->CCR1 = PWM2_on;
+ }
+ else
+ {
+ HAL_GPIO_WritePin(GPIOA, PWM2_PIN, GPIO_PIN_RESET);
+ Duty_flag_A = 1;
+ htim1.Instance->CCR1 = TIME_PERIOD - PWM2_on;
+ }
+ }
+}
+
+/**
+ *@brief PWM3 and PWM4 handler
+ *@retval None
+ */
+void PWM3_PWM4_handler()
+{
+ /*STATE 0
+ if delta != 0, there is a channel with a duty lower than the other one.
+ So the channel with the lower duty is cleared. Delta is period - max_duty
+ (the duty of the other channel)
+ The machine passes to STATE 1.
+
+ if delta == 0, the two channel are cleared together.
+ The machine passes to STATE 2
+
+ The delta is computed for the next timer event*/
+
+ if (channel_number < number_of_channels - 1)
+ {
+ if (delta != 0)
+ {
+// HAL_GPIO_WritePin(GPIOA, channel, GPIO_PIN_RESET);
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number ++;
+ delta = period - max_duty; /*computed delta for the next reset of the counter*/
+ channel = PWM_channels[channel_number];
+ }
+ else
+ {
+// HAL_GPIO_WritePin(GPIOA, PWM3_PIN |PWM4_PIN, GPIO_PIN_RESET);
+ delta = period - max_duty;
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number = number_of_channels;
+ }
+ }
+ /*STATE 1
+ Here the channel with the max duty-cycle is cleared. The delta is that one
+ computed in STATE 0. The machine passes to STATE 2 */
+ else if (channel_number == number_of_channels - 1)
+ {
+// HAL_GPIO_WritePin(GPIOA, channel, GPIO_PIN_RESET);
+ htim2.Instance->CCR2 = delta - 1;
+ htim2.Instance->CCR3 = delta - 1;
+ channel_number ++;
+ }
+ /*STATE 2
+ All the channels have been cleared and now are set again. The machine passes to STATE 0 */
+ else
+ { /* channel_number > number_of_channels - 1 */
+ HAL_GPIO_WritePin(GPIOA, PWM3_PIN | PWM4_PIN, GPIO_PIN_SET);
+ htim2.Instance->CCR2 = Ton_values[0] - 1;
+ htim2.Instance->CCR3 = Ton_values[1] - 1;
+ Ton_sorting();
+ channel_number = 0;
+ delta = Ton_values[1] - Ton_values[0];
+ channel = PWM_channels[0];
+ }
+}
+
+/**
+ *@brief Sorting on basis of duty cycle
+ *@retval None
+ */
+
+void Ton_sorting(void)
+{
+ if (PWM3_on > PWM4_on)
+ {
+ max_duty = PWM3_on;
+ Ton_values[1] = PWM3_on;
+ Ton_values[0] = PWM4_on;
+ PWM_channels[1] = PWM3_PIN;
+ PWM_channels[0] = PWM4_PIN;
+ }
+ else
+ {
+ max_duty = PWM4_on;
+ Ton_values[0] = PWM3_on;
+ Ton_values[1] = PWM4_on;
+ PWM_channels[0] = PWM3_PIN;
+ PWM_channels[1] = PWM4_PIN;
+ }
+}
+
+
+/**
+ *@brief PWM modification
+ *@param PWM_ID: PWM number
+ *@param duty_cycle: Duty cycle at output
+ *@retval None
+ */
+void Modify_PWM(uint8_t PWM_ID, uint16_t duty_cycle)
+{
+#if ( CFG_LPM_SUPPORTED == 0)
+ GPIO_InitTypeDef GPIO_InitStructure1 = {0};
+
+ if (PWM_ID == 0) /* PD14 */
+ {
+ if (duty_cycle == 0 && NonZeroPWM0 == 0)
+ {
+ GPIO_InitStructure1.Pin = PWM0_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStructure1.Pull = GPIO_NOPULL;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+ HAL_GPIO_WritePin(GPIOD, PWM0_PIN, GPIO_PIN_RESET);
+
+ NonZeroPWM0=1;
+ }
+ else if ((duty_cycle != 0 && NonZeroPWM0 == 1))
+ {
+ GPIO_InitStructure1.Pin = PWM0_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure1.Pull = GPIO_PULLUP;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure1.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+
+ NonZeroPWM0=0;
+ }
+ }
+ else if((PWM_ID == 1)) /* GPIO3 */
+ {
+ if (duty_cycle == 0 && NonZeroPWM1 == 0)
+ {
+ GPIO_InitStructure1.Pin = PWM1_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStructure1.Pull = GPIO_NOPULL;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+ HAL_GPIO_WritePin(GPIOD, PWM1_PIN, GPIO_PIN_RESET);
+
+ NonZeroPWM1=1;
+ }
+ else if ((duty_cycle != 0 && NonZeroPWM1 == 1))
+ {
+ GPIO_InitStructure1.Pin = PWM1_PIN;
+ GPIO_InitStructure1.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStructure1.Pull = GPIO_PULLUP;
+ GPIO_InitStructure1.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStructure1.Alternate = GPIO_AF1_TIM1;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStructure1);
+
+ NonZeroPWM1=0;
+ }
+ }
+ else
+ {
+ }
+
+ DUTY = duty_cycle;
+ switch (PWM_ID)
+ {
+ case 0: /* PWM0 */
+ {
+ htim1.Instance->CCR1 = DUTY;
+ }
+ break;
+ case 1: /* PWM1 */
+ {
+ htim1.Instance->CCR2 = DUTY;
+ }
+ break;
+ case 2: /* PWM2 */
+ {
+ PWM2_on = DUTY;
+ htim2.Instance->CCR1 = PWM2_on;
+ }
+ break;
+ case 3: /* PWM3 */
+ {
+ PWM3_on = DUTY;
+ htim2.Instance->CCR2 = PWM3_on;
+ }
+ break;
+ case 4: /* PWM4 */
+ {
+ PWM4_on = DUTY;
+ htim2.Instance->CCR3 = PWM4_on;
+ }
+ break;
+ }
+#endif
+}
+
+/**
+ * @brief Period elapsed callback in non blocking mode
+ * @param htim : TIM handle
+ * @retval None
+ */
+void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
+{
+#if 0
+ if(htim->Instance == TIM1)
+ PWM2_handler();
+ else
+ PWM3_PWM4_handler();
+#endif
+}
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h
new file mode 100644
index 000000000..a27fa757b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/PWM_handlers.h
@@ -0,0 +1,35 @@
+/**
+ ******************************************************************************
+ * @file PWM/PWM_handlers.c
+* @author SNM Application Team
+* @version V1.0.0
+* @date September-2015
+ * @brief Handlers for PWM and other support functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
+ ******************************************************************************
+ */
+
+#include "PWM_config.h"
+//#include "SDK_EVAL_Config.h"
+
+/* PWM2 handler */
+void PWM2_handler(void);
+
+/* PWM3 and PWM4 handler */
+void PWM3_PWM4_handler(void);
+
+/* Here the channel with the lower duty-cycle is established*/
+void Ton_sorting(void);
+
+/* Handle modifications in duty cycle */
+void Modify_PWM(uint8_t PWM_ID, uint16_t duty_cycle);
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
new file mode 100644
index 000000000..c96144dff
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
@@ -0,0 +1,661 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.c
+ * @author MCD Application Team
+ * @brief BLE Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+#include "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+
+#include "stm32_seq.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "mesh_cfg.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+
+/**
+ * security parameters structure
+ */
+typedef struct _tSecurityParams
+{
+ /**
+ * IO capability of the device
+ */
+ uint8_t ioCapability;
+
+ /**
+ * Authentication requirement of the device
+ * Man In the Middle protection required?
+ */
+ uint8_t mitm_mode;
+
+ /**
+ * bonding mode of the device
+ */
+ uint8_t bonding_mode;
+
+ /**
+ * Flag to tell whether OOB data has
+ * to be used during the pairing process
+ */
+ uint8_t OOB_Data_Present;
+
+ /**
+ * OOB data to be used in the pairing process if
+ * OOB_Data_Present is set to TRUE
+ */
+ uint8_t OOB_Data[16];
+
+ /**
+ * this variable indicates whether to use a fixed pin
+ * during the pairing process or a passkey has to be
+ * requested to the application during the pairing process
+ * 0 implies use fixed pin and 1 implies request for passkey
+ */
+ uint8_t Use_Fixed_Pin;
+
+ /**
+ * minimum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMin;
+
+ /**
+ * maximum encryption key size requirement
+ */
+ uint8_t encryptionKeySizeMax;
+
+ /**
+ * fixed pin to be used in the pairing process if
+ * Use_Fixed_Pin is set to 1
+ */
+ uint32_t Fixed_Pin;
+
+ /**
+ * this flag indicates whether the host has to initiate
+ * the security, wait for pairing or does not have any security
+ * requirements.\n
+ * 0x00 : no security required
+ * 0x01 : host should initiate security by sending the slave security
+ * request command
+ * 0x02 : host need not send the clave security request but it
+ * has to wait for paiirng to complete before doing any other
+ * processing
+ */
+ uint8_t initiateSecurity;
+}tSecurityParams;
+
+/**
+ * global context
+ * contains the variables common to all
+ * services
+ */
+typedef struct _tBLEProfileGlobalContext
+{
+
+ /**
+ * security requirements of the host
+ */
+ tSecurityParams bleSecurityParam;
+
+ /**
+ * gap service handle
+ */
+ uint16_t gapServiceHandle;
+
+ /**
+ * device name characteristic handle
+ */
+ uint16_t devNameCharHandle;
+
+ /**
+ * appearance characteristic handle
+ */
+ uint16_t appearanceCharHandle;
+
+ /**
+ * connection handle of the current active connection
+ * When not in connection, the handle is set to 0xFFFF
+ */
+ uint16_t connectionHandle;
+
+ /**
+ * length of the UUID list to be used while advertising
+ */
+ uint8_t advtServUUIDlen;
+
+ /**
+ * the UUID list to be used while advertising
+ */
+ uint8_t advtServUUID[100];
+
+}BleGlobalContext_t;
+
+typedef struct
+{
+ BleGlobalContext_t BleApplicationContext_legacy;
+ APP_BLE_ConnStatus_t Device_Connection_Status;
+ /**
+ * ID of the Advertising Timeout
+ */
+ uint8_t Advertising_mgr_timer_Id;
+
+} BleApplicationContext_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define APPBLE_GAP_DEVICE_NAME_LENGTH 7
+#define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
+#define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
+
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* USER CODE BEGIN PD */
+#define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
+
+uint8_t Test_Status =0x00;
+
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+{
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+};
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+/**
+* Identity root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
+
+/**
+* Encryption root key used to derive LTK and CSRK
+*/
+static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Extern function prototypes -----------------------------------------------*/
+extern void HCI_Event_CB(void *pckt);
+
+/* Global variables ----------------------------------------------------------*/
+const uint8_t *bd_addr;
+
+/* Private function prototypes -----------------------------------------------*/
+static void BLE_UserEvtRx( void * pPayload );
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
+static void Ble_Tl_Init( void );
+static void Ble_Hci_Gap_Gatt_Init(void);
+static const uint8_t* BleGetBdAddress( void );
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init_1 */
+
+/* USER CODE END APP_BLE_Init_1 */
+ SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet =
+ {
+ {{0,0,0}}, /**< Header unused */
+ {0, /** pBleBufferAddress not used */
+ 0, /** BleBufferSize not used */
+ CFG_BLE_NUM_GATT_ATTRIBUTES,
+ CFG_BLE_NUM_GATT_SERVICES,
+ CFG_BLE_ATT_VALUE_ARRAY_SIZE,
+ CFG_BLE_NUM_LINK,
+ CFG_BLE_DATA_LENGTH_EXTENSION,
+ CFG_BLE_PREPARE_WRITE_LIST_SIZE,
+ CFG_BLE_MBLOCK_COUNT,
+ CFG_BLE_MAX_ATT_MTU,
+ CFG_BLE_SLAVE_SCA,
+ CFG_BLE_MASTER_SCA,
+ CFG_BLE_LSE_SOURCE,
+ CFG_BLE_MAX_CONN_EVENT_LENGTH,
+ CFG_BLE_HSE_STARTUP_TIME,
+ CFG_BLE_VITERBI_MODE,
+ CFG_BLE_LL_ONLY,
+ 0}
+ };
+
+ /**
+ * Initialize Ble Transport Layer
+ */
+ Ble_Tl_Init( );
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+
+ /**
+ * Do not allow stop mode in the application
+ */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_BLE, UTIL_LPM_DISABLE);
+#endif
+
+ /**
+ * Register the hci transport layer to handle BLE User Asynchronous Events
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, UTIL_SEQ_RFU, hci_user_evt_proc);
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ /**
+ * Initialization of HCI & GATT & GAP layer
+ */
+ Ble_Hci_Gap_Gatt_Init();
+
+ /**
+ * Initialization of the BLE Services
+ */
+ SVCCTL_Init();
+
+ /**
+ * Initialization of the BLE App Context
+ */
+ BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
+
+ /*Radio mask Activity*/
+#if(RADIO_ACTIVITY_EVENT != 0)
+ aci_hal_set_radio_activity_mask(0x00FF);
+#endif
+
+ BleApplicationContext.Device_Connection_Status = APP_BLE_FAST_ADV;
+
+/* USER CODE BEGIN APP_BLE_Init_2 */
+
+/* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
+{
+ HCI_Event_CB(pckt);
+
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+
+ return (SVCCTL_UserEvtFlowEnable);
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Ble_Tl_Init( void )
+{
+ HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
+
+ Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
+ Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
+ hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
+
+ return;
+}
+
+static void Ble_Hci_Gap_Gatt_Init(void){
+
+ uint8_t role;
+ uint8_t index;
+ uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
+ const uint8_t *bd_addr;
+ uint32_t srd_bd_addr[2];
+#ifndef BLE_CFG_MESH
+ const uint8_t mode = BLE_CFG_DATA_ROLE_MODE;
+#endif
+ uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
+
+ /**
+ * Initialize HCI layer
+ */
+ /*HCI Reset to synchronise BLE Stack*/
+ hci_reset();
+
+ /**
+ * Write the BD Address
+ */
+
+ bd_addr = BleGetBdAddress();
+ aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
+ CONFIG_DATA_PUBADDR_LEN,
+ (uint8_t*) bd_addr);
+
+ /**
+ * Static random Address
+ * The two upper bits shall be set to 1
+ * The lowest 32bits is read from the UDN to differentiate between devices
+ * The RNG may be used to provide a random number on each power on
+ */
+ srd_bd_addr[1] = 0x0000ED6E;
+ srd_bd_addr[0] = LL_FLASH_GetUDN( );
+ aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
+
+ /**
+ * Write Identity root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
+
+ /**
+ * Write Encryption root key used to derive LTK and CSRK
+ */
+ aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
+
+#ifndef BLE_CFG_MESH
+ /**
+ * Write the Role
+ */
+ aci_hal_write_config_data(CONFIG_DATA_ROLE,
+ CONFIG_DATA_ROLE_LEN,
+ (uint8_t*) &mode);
+#endif
+
+ /**
+ * Set TX Power to 0dBm.
+ */
+ aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+
+ /**
+ * Initialize GATT interface
+ */
+ aci_gatt_init();
+
+ /**
+ * Initialize GAP interface
+ */
+ role = 0;
+
+#if (BLE_CFG_PERIPHERAL == 1)
+ role |= GAP_PERIPHERAL_ROLE;
+#endif
+
+#if (BLE_CFG_CENTRAL == 1)
+ role |= GAP_CENTRAL_ROLE;
+#endif
+
+#ifdef BLE_CFG_MESH
+#if (BLE_CFG_BROADCASTER == 1)
+ role |= GAP_BROADCASTER_ROLE;
+#endif
+
+#if (BLE_CFG_OBSERVER == 1)
+ role |= GAP_OBSERVER_ROLE;
+#endif
+#endif
+
+ if (role > 0)
+ {
+ const char *name = "STM32WB";
+ aci_gap_init(role, 0,
+ APPBLE_GAP_DEVICE_NAME_LENGTH,
+ &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
+
+ if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
+ {
+ BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\n");
+ }
+ }
+
+ if(aci_gatt_update_char_value(gap_service_handle,
+ gap_appearance_char_handle,
+ 0,
+ 2,
+ (uint8_t *)&appearance))
+ {
+ BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
+ }
+/**
+ * Initialize Default PHY
+ */
+ hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
+
+ /**
+ * Initialize IO capability
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
+ aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
+
+ /**
+ * Initialize authentication
+ */
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data_Present = 0;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = 8;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = 16;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = 1;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = 111111;
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 1;
+ for (index = 0; index < 16; index++)
+ {
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
+ }
+
+ aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
+ 0,
+ 0,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
+ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
+ 0
+ );
+
+ /**
+ * Initialize whitelist
+ */
+ if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
+ {
+ aci_gap_configure_whitelist();
+ }
+}
+
+const uint8_t* BleGetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTION */
+
+/* USER CODE END FD_LOCAL_FUNCTION */
+
+/*************************************************************
+ *
+ *SPECIFIC FUNCTIONS
+ *
+ *************************************************************/
+/* USER CODE BEGIN FD_SPECIFIC_FUNCTIONS */
+
+/* USER CODE END FD_SPECIFIC_FUNCTIONS */
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void hci_notify_asynch_evt(void* pdata)
+{
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_HCI_ASYNCH_EVT_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+#if (LOW_POWER_FEATURE == 1)
+static volatile uint8_t HciResponse = 0;
+#endif
+
+void hci_cmd_resp_release(uint32_t flag)
+{
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+#else
+ HciResponse = 1;
+#endif
+ return;
+}
+
+void hci_cmd_resp_wait(uint32_t timeout)
+{
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_WaitEvt(1 << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+#else
+ while(HciResponse == 0);
+ HciResponse = 0;
+#endif
+ return;
+}
+
+static void BLE_UserEvtRx( void * pPayload )
+{
+ SVCCTL_UserEvtFlowStatus_t svctl_return_status;
+ tHCI_UserEvtRxParam *pParam;
+
+ pParam = (tHCI_UserEvtRxParam *)pPayload;
+
+ svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
+ if (svctl_return_status != SVCCTL_UserEvtFlowDisable)
+ {
+ pParam->status = HCI_TL_UserEventFlow_Enable;
+ }
+ else
+ {
+ pParam->status = HCI_TL_UserEventFlow_Disable;
+ }
+}
+
+static void BLE_StatusNot( HCI_TL_CmdStatus_t status )
+{
+ uint32_t task_id_list;
+ switch (status)
+ {
+ case HCI_TL_CmdBusy:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_PauseTask(task_id_list);
+
+ break;
+
+ case HCI_TL_CmdAvailable:
+ /**
+ * All tasks that may send an aci/hci commands shall be listed here
+ * This is to prevent a new command is sent while one is already pending
+ */
+ task_id_list = (1 << CFG_LAST_TASK_ID_WITH_HCICMD) - 1;
+ UTIL_SEQ_ResumeTask(task_id_list);
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+void SVCCTL_ResumeUserEventFlow( void )
+{
+ hci_resume_flow();
+ return;
+}
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h
new file mode 100644
index 000000000..d87d3e466
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.h
@@ -0,0 +1,79 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_ble.h
+ * @author MCD Application Team
+ * @brief Header for ble application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_BLE_H
+#define APP_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "hci_tl.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+typedef enum
+{
+ APP_BLE_IDLE,
+ APP_BLE_FAST_ADV,
+ APP_BLE_LP_ADV,
+ APP_BLE_SCAN,
+ APP_BLE_LP_CONNECTING,
+ APP_BLE_CONNECTED_SERVER,
+ APP_BLE_CONNECTED_CLIENT
+} APP_BLE_ConnStatus_t;
+
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* External variables --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions ---------------------------------------------*/
+void APP_BLE_Init( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*APP_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c
new file mode 100644
index 000000000..578a6f4bf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c
@@ -0,0 +1,1978 @@
+/**
+ ******************************************************************************
+ * @file appli_config_client.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Config CLient Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "config_client.h"
+#include "appli_config_client.h"
+#include "appli_mesh.h"
+#include "sensors.h"
+#include "light_lc.h"
+#include "vendor.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+
+#define DEFAULT_GROUP_ADDR 0xC000
+#define DEFAULT_PUBLISH_ADDR 0xC000
+#define DEFAULT_NETKEY_INDEX 0x0000
+#define DEFAULT_APPKEY_INDEX 0x0000
+#define DEFAULT_CREDENTIAL_FLAG 0x00
+#define DEFAULT_PUBLISH_TTL 0x08
+#define DEFAULT_PUBLISH_PERIOD 0x00
+#define DEFAULT_PUBLISH_RETRANSMIT_COUNT 0x00
+#define DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS 0x00
+
+#define NUM_VENDOR_MODELS_TO_SUBSCRIBE 0
+#define NUM_VENDOR_MODELS_TO_PUBLISH 0
+#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+
+const MOBLEUINT8 aConfigAppKeyDefault[19]=
+ { /* NetKeyIndexAndAppKeyIndex : 3B
+ Index of the NetKey and index of the AppKey*/
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
+ (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff),
+ /* AppKey is initialised as below = 16B */
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 };
+
+
+const MOBLEUINT8 aConfigAppKeyDeleteDefault[3]=
+ { /* NetKeyIndexAndAppKeyIndex : 3B
+ Index of the NetKey and index of the AppKey*/
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) | (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX & 0x000f) << 4),
+ (MOBLEUINT8) ((DEFAULT_APPKEY_INDEX >>4) & 0xff)};
+
+
+const MOBLEUINT8 aConfigAppKeyGetDefault[2]=
+ { /* NetKeyIndex : 2B
+ Index of the NetKey */
+ (MOBLEUINT8)(DEFAULT_NETKEY_INDEX & 0x00ff),
+ (MOBLEUINT8)((DEFAULT_NETKEY_INDEX & 0x0f00) >> 8) };
+
+const MOBLEUINT8 aNoParamDefaultConfig;
+
+const MOBLEUINT8 aNoInitParamDefault[MAX_CONFIG_PARAM_SIZE]= {0};
+
+/* Private macro -------------------------------------------------------------*/
+MOBLEUINT16 aSigModelsToBind[][MAX_ELEMENTS_PER_NODE] = {
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ },
+ {
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+ // GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+ // SENSOR_SERVER_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+ // LIGHT_MODEL_SERVER_LC_MODEL_ID
+ }
+};
+
+
+MOBLEUINT16 aPublishModels[] =
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+// SENSOR_SERVER_MODEL_ID,
+// LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
+// LIGHT_MODEL_SERVER_LC_MODEL_ID
+};
+
+MOBLEUINT16 aSubscribeModels[] =
+{
+ GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
+// GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID,
+// LIGHT_MODEL_SERVER_LC_MODEL_ID
+};
+
+const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[] = {
+ /* MOBLEUINT16 opcode,
+ MOBLEUINT8 min_payload_size,
+ MOBLEUINT8 max_payload_size;
+ Here in this array, Handler is not defined; */
+
+ /* 4.3.2.37 Config AppKey Add, Opcode = 0x00
+ The Config AppKey Add is an acknowledged message used to add an AppKey
+ to the AppKey List on a node and bind it to the NetKey identified by
+ NetKeyIndex. The added AppKey can be used by the node only as a pair with
+ the specified NetKey.
+ The AppKey is used to authenticate and decrypt messages it receives, as well
+ as authenticate and encrypt messages it sends.
+ The response to a Config AppKey Add message is a Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex: 3B : Index of the NetKey and index of the AppKey
+ AppKey 16B : AppKey value */
+ { OPCODE_CONFIG_APPKEY_ADD, 19, 19, aConfigAppKeyDefault },
+
+ /* 4.3.2.39 Config AppKey Delete, Opcode = 0x80 0x00
+ The Config AppKey Delete is an acknowledged message used to delete an
+ AppKey from the AppKey List on a node.
+ The response to a Config AppKey Delete message is a
+ Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex : 3B : Index of the NetKey and index of the AppKey
+ */
+ { OPCODE_CONFIG_APPKEY_DELETE, 3, 3, aConfigAppKeyDeleteDefault },
+
+ /* 4.3.2.41 Config AppKey Get, Opcode = 0x80 0x01
+ The AppKey Get is an acknowledged message used to report all AppKeys bound
+ to the NetKey.
+ The response to a Config AppKey Get message is a Config AppKey List message */
+ { OPCODE_CONFIG_APPKEY_GET, 2, 2, aConfigAppKeyGetDefault },
+
+ /* 4.3.2.38 Config AppKey Update, Opcode = 0x01
+ The Config AppKey Update is an acknowledged message used to update an
+ AppKey value on the AppKey List on a node. The updated AppKey is used by
+ the node to authenticate and decrypt messages it receives, as well as
+ authenticate and encrypt messages it sends, as defined by the Key Refresh procedure (see Section 3.10.4).
+ The response to an Config AppKey Update message is an Config AppKey Status message.
+
+ message parameters:
+ -------------------
+ NetKeyIndexAndAppKeyIndex: 3B : Index of the NetKey and index of the AppKey
+ AppKey 16B : AppKey value */
+ { OPCODE_CONFIG_APPKEY_UPDATE, 19, 19, aConfigAppKeyDefault },
+
+ /* 4.3.2.1 Config Beacon Get, Opcode = 0x80 0x09
+ The Config Beacon Get is an acknowledged message used to get the current
+ Secure Network Beacon state of a node (see Section 4.2.10).
+ The response to a Config Beacon Get message is a Config Beacon Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_BEACON_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.2 Config Beacon Set, Opcode = 0x80 0x0A
+ The Config Beacon Set is an acknowledged message used to set the
+ Secure Network Beacon state of a node (see Section 4.2.10).
+ The response to a Config Beacon Set message is a Config Beacon Status message.
+ Beacon : 1B: New Secure Network Beacon state*/
+ { OPCODE_CONFIG_BEACON_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.4 Config Composition Data Get, Opcode = 0x80 0x08
+ The Config Composition Data Get is an acknowledged message used to read
+ one page of the Composition Data (see Section 4.2.1).
+ The response to a Config Composition Data Get message is a
+ Config Composition Data Status message.
+ Page : 1B : Page number of the Composition Data */
+ { OPCODE_CONFIG_COMPOSITION_DATA_GET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.16 Config Model Publication Set, Opcode = 0x03
+ The Config Model Publication Set is an acknowledged message used to set the
+ Model Publication state (see Section 4.2.2) of an outgoing message that
+ originates from a model.
+ The response to a Config Model Publication Set message is a
+ Config Model Publication Status message.
+ The Config Model Publication Set message uses a single octet opcode to
+ maximize the size of a payload.
+
+ ElementAddress : 16b : Address of the element
+ PublishAddress : 16b : Value of the publish address
+ AppKeyIndex : 12b : Index of the application key
+ CredentialFlag : 1b : Value of the Friendship Credential Flag
+ RFU : 3b : Reserved for Future Use
+ PublishTTL : 8b : Default TTL value for the outgoing messages
+ PublishPeriod : 8b : Period for periodic status publishing
+ PublishRetransmitCount : 3b : Number of retransmissions for each published message
+ PublishRetransmitIntervalSteps : 5b: Number of 50-millisecond steps between retransmissions
+ ModelIdentifier: 16 or 32b: SIG Model ID or Vendor Model ID
+ */
+
+ { OPCODE_CONFIG_CONFIG_MODEL_PUBLICATION_SET, 11, 13, },
+
+ /* 4.3.2.6 Config Default TTL Get, Opcode = 0x80 0x0C
+ The Config Default TTL Get is an acknowledged message used to get the
+ current Default TTL state of a node.
+ The response to a Config Default TTL Get message is a Config Default TTL Status message.
+ There are no Parameters for this message.
+ */
+ { OPCODE_CONFIG_DEFAULT_TTL_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.7 Config Default TTL Set, Opcode = 0x80 0x0D
+ The Config Default TTL Set is an acknowledged message used to set the
+ Default TTL state of a node (see Section 4.2.7).
+ The response to a Config Default TTL Set message is a
+ Config Default TTL Status message.
+ TTL : 1B : New Default TTL value*/
+ { OPCODE_CONFIG_DEFAULT_TTL_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.55 Config Friend Get, Opcode = 0x80 0x0F
+ The Config Friend Get is an acknowledged message used to get the current
+ Friend state of a node (see Section 4.2.13).
+ The response to a Config Friend Get message is a Config Friend Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_FRIEND_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.56 Config Friend Set, Opcode = 0x80 0x10
+ The Config Friend Set is an acknowledged message used to set the
+ Friend state of a node (see Section 4.2.13).
+ The response to a Config Friend Set message is a Config Friend Status message.
+ Friend : 1B : New Friend state */
+ { OPCODE_CONFIG_FRIEND_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.9 Config GATT Proxy Get, Opcode = 0x80 0x12
+ The Config GATT Proxy Get is an acknowledged message used to get the
+ current GATT Proxy state of a node (see Section 4.2.11).
+ The response to a Config GATT Proxy Get message is a
+ Config GATT Proxy Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_GATT_PROXY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.10 Config GATT Proxy Set, Opcode = 0x80 0x12
+ The Config GATT Proxy Set is an acknowledged message used to set the
+ GATT Proxy state of a node (see Section 4.2.11).
+ The response to a Config GATT Proxy Set message is a Config GATT Proxy
+ Status message
+ GATTProxy : 1B : New GATT Proxy state */
+ { OPCODE_CONFIG_GATT_PROXY_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.61 Config Heartbeat Publication Get, Opcode = 0x80 0x38
+ The Config Heartbeat Publication Get is an acknowledged message used to get
+ the current Heartbeat Publication state of an element (see Section 4.2.17).
+ The response to a Config Heartbeat Publication Get message is a
+ Config Heartbeat Publication Status message.
+ The message has no parameters.*/
+ { OPCODE_CONFIG_HEARTBEAT_PUBLICATION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.62 Config Heartbeat Publication Set, Opcode = 0x80 0x39
+ The Config Heartbeat Publication Set is an acknowledged message used to set
+ the current Heartbeat Publication state of an element (see Section 4.2.17).
+ The response to a Config Heartbeat Publication Set message is a
+ Config Heartbeat Publication Status message.
+
+ Destination : 2B : Destination address for Heartbeat messages
+ CountLog : 1B : Number of Heartbeat messages to be sent
+ PeriodLog : 1B : Period for sending Heartbeat messages
+ TTL : 1B : TTL to be used when sending Heartbeat messages
+ Features : 2B : Bit field indicating features that trigger Heartbeat messages when changed
+ NetKeyIndex : 2B : NetKey Index
+ */
+ { OPCODE_CONFIG_HEARTBEAT_PUBLICATION_SET, 9, 9, aNoInitParamDefault },
+
+ /* 4.3.2.64 Config Heartbeat Subscription Get, Opcode = 0x80 0x3A
+ The Config Heartbeat Subscription Get is an acknowledged message used to get
+ the current Heartbeat Subscription state of an element (see Section 4.2.18).
+ The response to a Config Heartbeat Subscription Get message is a
+ Config Heartbeat Subscription Status message.
+ The message has no parameters. */
+ { OPCODE_CONFIG_HEARTBEAT_SUBSCRIPTION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.65 Config Heartbeat Subscription Set, Opcode = 0x80 0x3B
+ The Config Heartbeat Subscription Set is an acknowledged message used to
+ set the current Heartbeat Subscription state of an element (see Section 4.2.18).
+ The response to a Config Heartbeat Subscription Set message is a
+ Config Heartbeat Subscription Status message.
+
+ Source : 2B : Source address for Heartbeat messages
+ Destination : 2B : Destination address for Heartbeat messages
+ PeriodLog : 1B : Period for receiving Heartbeat messages */
+ { OPCODE_CONFIG_HEARTBEAT_SUBSCRIPTION_SET, 5, 5, aNoInitParamDefault },
+
+ /* 4.3.2.58 Config Key Refresh Phase Get, Opcode = 0x80 0x15
+ The Config Key Refresh Phase Get is an acknowledged message used to get the
+ current Key Refresh Phase state of the identified network key.
+ The response to a Config Key Refresh Phase Get message is a
+ Config Key Refresh Phase Status message.
+ NetKeyIndex : 2B : NetKey Index*/
+ { OPCODE_CONFIG_KEY_REFRESH_PHASE_GET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.59 Config Key Refresh Phase Set, Opcode = 0x80 0x16
+ The Config Key Refresh Phase Set is an acknowledged message used to set the
+ Key Refresh Phase state of the identified network key (see Section 4.2.14).
+ The response to a Config Key Refresh Phase Set message is a
+ Config Key Refresh Phase Status message.
+
+ NetKeyIndex : 2B : NetKey Index
+ Transition : 1B : New Key Refresh Phase Transition */
+ { OPCODE_CONFIG_KEY_REFRESH_PHASE_SET, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.2.67 Config Low Power Node PollTimeout Get, Opcode = 0x80 0x2D
+ The Config Low Power Node PollTimeout Get is an acknowledged message used
+ to get the current value of PollTimeout timer of the Low Power node within
+ a Friend node (see Section 3.6.6.1). The message is sent to a Friend node
+ that has claimed to be handling messages by sending ACKs On Behalf Of (OBO)
+ the indicated Low Power node. This message should only be sent to a node
+ that has the Friend feature supported and enabled.
+ The response to a Config Low Power Node PollTimeout Get message is a
+ Config Low Power Node PollTimeout Status message.
+
+ LPNAddress : 2B : The unicast address of the Low Power node */
+ { OPCODE_CONFIG_LOW_POWER_NODE_POLLTIMEOUT_GET, 2, 2, aNoInitParamDefault },
+
+
+ /* 4.3.3.12 Health Attention Get
+ The Health Attention Get is an acknowledged message used to get the current
+ Attention Timer state of an element (see Section 4.2.9).
+ The response to a Health Attention Get message is an Attention Status message.
+ There are no Parameters for this message.*/
+ { OPCODE_HEALTH_ATTENTION_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.3.13 Health Attention Set
+ The Health Attention Set is an acknowledged message used to set the
+ Attention Timer state of an element (see Section 4.2.9).
+ The response to a Health Attention Set message is a
+ Health Attention Status message
+ Attention: 1B: Value of the Attention Timer state*/
+ { OPCODE_HEALTH_ATTENTION_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.3.14 Health Attention Set Unacknowledged
+ The Health Attention Set Unacknowledged is an unacknowledged message used
+ to set the Attention Timer state of an element (see Section 4.2.9). */
+ { OPCODE_HEALTH_ATTENTION_SET_UNACKNOWLEDGED, 1, 1, aNoInitParamDefault },
+
+
+
+
+
+
+ /* 4.3.2.15 Config Model Publication Get
+ The Config Model Publication Get is an acknowledged message used to get the
+ publish address and parameters of an outgoing message that originates
+ from a model.
+ The response to a Config Model Publication Get message is a
+ Config Model Publication Status message.
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2 or 4B : SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_PUBLICATION_GET, 4, 6, aNoInitParamDefault },
+
+ /* 4.3.2.17 Config Model Publication Virtual Address Set
+ The Config Model Publication Virtual Address Set is an acknowledged message
+ used to set the model Publication state (see Section 4.2.2) of an
+ outgoing message that originates from a model.
+ The response to a Config Model Publication Virtual Address Set message is
+ a Config Model Publication Status message.
+
+ ElementAddress : 16b : Address of the element
+ PublishAddress : 128b : Value of the Label UUID publish address
+ AppKeyIndex : 12b : Index of the application key
+ CredentialFlag : 1b : Value of the Friendship Credential Flag
+ RFU : 3b : Reserved for Future Use
+ PublishTTL : 8b : Default TTL value for the outgoing messages
+ PublishPeriod : 8b : Period for periodic status publishing
+ PublishRetransmitCount : 3b : Number of retransmissions for each published message
+ PublishRetransmitIntervalSteps : 5b: Number of 50-millisecond steps between retransmissions
+ ModelIdentifier: 16 or 32b: SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_PUBLICATION_VIRTUAL_ADDRESS_SET, 25, 27, aNoInitParamDefault },
+
+ /* 4.3.2.19 Config Model Subscription Add
+ The Config Model Subscription Add is an acknowledged message used to add an
+ address to a Subscription List of a model (see Section 4.2.3).
+
+ The response to a Config Model Subscription Add message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID
+*/
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_ADD, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.21 Config Model Subscription Delete
+ The Config Model Subscription Delete is an acknowledged message used to
+ delete a subscription address from the Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Delete message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID
+ */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_DELETE, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.25 Config Model Subscription Delete All
+ The Config Model Subscription Delete All is an acknowledged message used to
+ discard the Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Delete All message is a
+ Config Model Subscription Status message.
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_DELETE_ALL, 4, 6, aNoInitParamDefault },
+
+ /* 4.3.2.23 Config Model Subscription Overwrite
+ The Config Model Subscription Overwrite is an acknowledged message used to
+ discard the Subscription List and add an address to the
+ cleared Subscription List of a model (see Section 4.2.3).
+
+ The response to a Config Model Subscription Overwrite message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ address : 2B : Value of the address
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_OVERWRITE, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.20 Config Model Subscription Virtual Address Add
+ The Config Model Subscription Virtual Address Add is an acknowledged message
+ used to add an address to a Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Add message is a
+ Config Model Subscription Status message.
+
+ ElementAddress : 2B : Address of the element
+ Label : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_ADD, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.22 Config Model Subscription Virtual Address Delete
+ The Config Model Subscription Virtual Address Delete is an acknowledged
+ message used to delete a subscription address from the
+ Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Delete message
+ is a Config Model Subscription Status message.
+ ElementAddress : 2B : Address of the element
+ Address : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_DELETE, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.24 Config Model Subscription Virtual Address Overwrite
+ The Config Model Subscription Virtual Address Overwrite is an acknowledged
+ message used to discard the Subscription List and add an address to the
+ cleared Subscription List of a model (see Section 4.2.3).
+ The response to a Config Model Subscription Virtual Address Overwrite
+ message is a Config Model Subscription Status message.
+ Element Address : 2B : Address of the element
+ Address : 16B : Value of the Label UUID
+ ModelIdentifier : 2B or 4B : SIG Model ID or Vendor Model ID */
+
+ { OPCODE_CONFIG_MODEL_SUBSCRIPTION_VIRTUAL_ADDRESS_OVERWRITE, 20, 22, aNoInitParamDefault },
+
+ /* 4.3.2.69 Config Network Transmit Get
+ The Config Network Transmit Get is an acknowledged message used to get the
+ current Network Transmit state of a node (see Section 4.2.19).
+ The response to a Config Network Transmit Get message is a Config Network
+ Transmit Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NETWORK_TRANSMIT_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.70 Config Network Transmit Set
+ The Config Network Transmit Set is an acknowledged message used to set the
+ Network Transmit state of a node (see Section 4.2.19).
+ The response to a Config Network Transmit Set message is a Config Network
+ Transmit Status message.
+
+ NetworkTransmitCount : 3b : Number of transmissions for each Network PDU originating from the node
+ NetworkTransmitIntervalSteps : 5b : Number of 10-millisecond steps between transmissions
+ */
+ { OPCODE_CONFIG_NETWORK_TRANSMIT_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.2.12 Config Relay Get
+ The Config Relay Get is an acknowledged message used to get the
+ current Relay (see Section 4.2.8) and Relay Retransmit (see Section 4.2.20)
+ states of a node.
+ The response to a Config Relay Get message is a Config Relay Status message.
+ There are no Parameters for this message.*/
+ { OPCODE_CONFIG_RELAY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.13 Config Relay Set
+ The Config Relay Set is an acknowledged message used to set the Relay
+ (see Section 4.2.8) and Relay Retransmit (see Section 4.2.20) states of a node.
+ The response to a Config Relay Set message is a Config Relay Status message.
+ Relay : 8 bits : Relay
+ RelayRetransmitCount : 3b : Number of retransmissions on advertising bearer for each Network PDU relayed by the node
+ RelayRetransmitIntervalSteps : 5b : Number of 10-millisecond steps between retransmissions
+ */
+ { OPCODE_CONFIG_RELAY_SET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.27 Config SIG Model Subscription Get
+ The Config SIG Model Subscription Get is an acknowledged message used to
+ get the list of subscription addresses of a model within the element.
+ This message is only for SIG Models.
+ The response to a Config SIG Model Subscription Get message is a Config SIG
+ Model Subscription List message.
+ Element Address : 2B : Address of the element
+ ModelIdentifier : 2B : SIG Model ID */
+
+ { OPCODE_CONFIG_SIG_MODEL_SUBSCRIPTION_GET, 4, 4, aNoInitParamDefault },
+
+ /* 4.3.2.29 Config Vendor Model Subscription Get
+ The Config Vendor Model Subscription Get is an acknowledged message used to
+ get the list of subscription addresses of a model within the element.
+ This message is only for Vendor Models.
+ The response to a Config Vendor Model Subscription Get message is a
+ Config Vendor Model Subscription List message.
+ Element Address : 2B : Address of the element
+ ModelIdentifier : 4B : Vendor Model ID */
+
+ { OPCODE_CONFIG_VENDOR_MODEL_SUBSCRIPTION_GET, 6, 6, aNoInitParamDefault },
+
+
+ /* 4.3.3.4 Health Fault Clear
+ The Health Fault Clear is an acknowledged message used to clear the current
+ Registered Fault state identified by Company ID of an element
+ (see Section 4.2.15.2).
+ The response to a Health Fault Clear message is a Health Fault Status message */
+ { OPCODE_HEALTH_FAULT_CLEAR, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.3 Health Fault Clear Unacknowledged
+ The Health Fault Clear Unacknowledged is an unacknowledged message used to
+ clear the current Registered Fault state identified by Company ID of an
+ element (see Section 4.2.15.2).
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+
+ { OPCODE_HEALTH_FAULT_CLEAR_UNACKNOWLEDGED, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.2 Health Fault Get
+ The Health Fault Get is an acknowledged message used to get the current
+ Registered Fault state identified by Company ID of an element
+ (see Section 4.2.15.2).
+ The response to a Health Fault Get message is a Health Fault Status message
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_GET, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.3.5 Health Fault Test
+ The Health Fault Test is an acknowledged message used to invoke a
+ self-test procedure of an element.
+ The procedure is implementation specific and may result in changing the
+ Health Fault state of an element (see Section 4.2.15).
+ The response to a Health Fault Test message is a Health Fault Status message.
+
+ Test ID : 1B : Identifier of a specific test to be performed
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_TEST, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.3.6 Health Fault Test Unacknowledged
+ The Health Fault Test Unacknowledged is an unacknowledged message used to
+ invoke a self-test procedure of an element. The procedure is implementation
+ specific and may result in changing the Health Fault state of an element
+ (see Section 4.2.15).
+
+ Test ID : 1B : Identifier of a specific test to be performed
+ Company ID : 2B : 16-bit Bluetooth assigned Company Identifier */
+ { OPCODE_HEALTH_FAULT_TEST_UNACKNOWLEDGED, 3, 3, aNoInitParamDefault },
+
+ /* 4.3.3.8 Health Period Get
+ The Health Period Get is an acknowledged message used to get the
+ current Health Fast Period Divisor state of an element (see Section 4.2.16).
+ The response to a Health Period Get message is a Health Period Status message.
+ There are no parameters for this message. */
+ { OPCODE_HEALTH_PERIOD_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.3.10 Health Period Set
+ The Health Period Set is an acknowledged message used to set the current
+ Health Fast Period Divisor state of an element (see Section 4.2.16).
+ The response to a Health Period Set message is a Health Period Status message
+
+ FastPeriodDivisor : 1B: Divider for the Publish Period.
+ Modified Publish Period is used for sending Current */
+ { OPCODE_HEALTH_PERIOD_SET, 1, 1, aNoInitParamDefault },
+
+ /* 4.3.3.9 Health Period Set Unacknowledged
+ The Health Period Set Unacknowledged is an unacknowledged message used to
+ set the current Health Fast Period Divisor state of an element
+ (see Section 4.2.16).
+
+ FastPeriodDivisor : 1B: Divider for the Publish Period.
+ Modified Publish Period is used for sending Current
+ Health Status messages when there are active faults to communicate */
+ { OPCODE_HEALTH_PERIOD_SET_UNACKNOWLEDGED, 1, 1, aNoInitParamDefault },
+//// { OPCODE_HEALTH_PERIOD_STATUS 0x8037
+
+
+
+ /* 4.3.2.46 Config Model App Bind
+ The Config Model App Bind is an acknowledged message used to bind an
+ AppKey to a model.
+ The response to a Config Model App Bind message is a
+ Config Model App Status message.
+
+ ElementAddress : 2B : Address of the element
+ AppKeyIndex : 2B : Index of the AppKey
+ ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID */
+
+ { OPCODE_CONFIG_MODEL_APP_BIND, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.47 Config Model App Unbind
+ The Config Model App Unbind is an acknowledged message used to remove the
+ binding between an AppKey and a model.
+ The response to a Config Model App Unbind message is a Config Model App Status message.
+
+
+ ElementAddress : 2B : Address of the element
+ AppKeyIndex : 2B : Index of the AppKey
+ ModelIdentifier : 2 or 4: SIG Model ID or Vendor Model ID */
+ { OPCODE_CONFIG_MODEL_APP_UNBIND, 6, 8, aNoInitParamDefault },
+
+ /* 4.3.2.31 Config NetKey Add
+ The Config NetKey Add is an acknowledged message used to add a NetKey
+ to a NetKey List (see Section 4.2.4) on a node.
+ The added NetKey is then used by the node to authenticate and decrypt messages it receives, as well as authenticate and encrypt messages it sends.
+ The response to a Config NetKey Add message is a Config NetKey Status message.
+ NetKeyIndex : 2B
+ NetKey : 16B NetKey */
+ { OPCODE_CONFIG_NETKEY_ADD, 18, 18, aNoInitParamDefault },
+
+ /* 4.3.2.33 Config NetKey Delete
+ The Config NetKey Delete is an acknowledged message used to delete a NetKey
+ on a NetKey List from a node.
+ The response to a Config NetKey Delete message is a
+ Config NetKey Status message.
+ NetKeyIndex : 2B */
+ { OPCODE_CONFIG_NETKEY_DELETE, 2, 2, aNoInitParamDefault },
+
+ /* 4.3.2.35 Config NetKey Get
+ The Config NetKey Get is an acknowledged message used to report all NetKeys
+ known to the node.
+ The response to a Config NetKey Get message is a Config NetKey List message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NETKEY_GET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.32 Config NetKey Update
+ The Config NetKey Update is an acknowledged message used to update a NetKey
+ on a node. The updated NetKey is then used by the node to authenticate and
+ decrypt messages it receives, as well as authenticate and encrypt messages
+ it sends, as defined by the Key Refresh procedure (see Section 3.10.4).
+ The response to a Config NetKey Update message is a Config NetKey Status message.
+ NetKeyIndex : 2B : Index of the NetKey
+ NetKey : 16B : NetKey */
+ { OPCODE_CONFIG_NETKEY_UPDATE, 18, 18, aNoInitParamDefault},
+
+ /* 4.3.2.43 Config Node Identity Get
+ The Config Node Identity Get is an acknowledged message used to get the
+ current Node Identity state for a subnet (see Section 4.2.12).
+ The response to a Config Node Identity Get message is a
+ Config Node Identity Status message.
+
+ NetKeyIndex : 2B : Index of the NetKey */
+ { OPCODE_CONFIG_NODE_IDENTITY_GET, 2, 2, aNoInitParamDefault},
+
+ /* 4.3.2.44 Config Node Identity Set
+ The Config Node Identity Set is an acknowledged message used to set the
+ current Node Identity state for a subnet (see Section 4.2.12).
+ The response to a Config Node Identity Set message is a
+ Config Node Identity Status message.
+
+ NetKeyIndex : 2B : Index of the NetKey
+ Identity : 1B : New Node Identity state */
+ { OPCODE_CONFIG_NODE_IDENTITY_SET, 3, 3, aNoInitParamDefault},
+
+ /* 4.3.2.53 Config Node Reset
+ The Config Node Reset is an acknowledged message used to reset a node
+ (other than a Provisioner) and remove it from the network.
+ The response to a Config Node Reset message is a Config Node Reset
+ Status message.
+ There are no Parameters for this message. */
+ { OPCODE_CONFIG_NODE_RESET, 0, 0, aNoInitParamDefault },
+
+ /* 4.3.2.49 Config SIG Model App Get
+ The Config SIG Model App Get is an acknowledged message used to request
+ report of all AppKeys bound to the SIG Model.
+ The response to a Config SIG Model App Get message is a Config SIG Model
+ App List message.
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 2B : SIG Model ID */
+ { OPCODE_CONFIG_SIG_MODEL_APP_GET, 4, 4, aNoInitParamDefault },
+
+ /* 4.3.2.51 Config Vendor Model App Get
+ The Config Vendor Model App Get is an acknowledged message used to request
+ report of all AppKeys bound to the model. This message is only for Vendor Models.
+ The response to a Config Vendor Model App Get message is a Config Vendor Model App List message
+
+ ElementAddress : 2B : Address of the element
+ ModelIdentifier : 4B : Vendor Model ID */
+ { OPCODE_CONFIG_VENDOR_MODEL_APP_GET, 6, 6, aNoInitParamDefault },
+
+};
+/* Private variables ---------------------------------------------------------*/
+
+eClientSendMsgState_t eClientSendMsgState; /* Keeps the state of Sent Message */
+eServerRespRecdState_t eServerRespRecdState; /* Keeps the state of Received Message */
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief This function is callback from library after the Provisioning is
+ completed by embedded Provisioner
+* @param prvState: Provisioning State of the Node. Expecting "1" when the
+ provisioning is completed
+* @retval None
+*/
+void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState)
+{
+ if (prvState==1 )
+ {
+ Appli_ConfigClient_Init();
+ eClientSendMsgState = ProvisioningDone_State;
+ NodeInfo.nodePrimaryAddress = GetAddressToConfigure();
+ }
+}
+
+
+/**
+* @brief This function is Init function for the state machine of the
+ Configuration Client. The Function shall be called everytime a new
+ node is provisioned
+* @param None
+* @retval None
+*/
+MOBLE_RESULT Appli_ConfigClient_Init(void)
+{
+ eClientSendMsgState = ClientIdle_State; /* Init the value of state machine */
+ eServerRespRecdState = NodeIdle_State; /* Init the value of state machine */
+ ConfigClient_ResetTrials();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_ConfigClient_Process: This function is Process function and
+ shall be called from while(1) loop
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_Process(void)
+{
+
+ Appli_ConfigClient_ConfigureNode();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief This function is used to configure the Node after provisioning
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 nowClockTime;
+
+ /*
+ State response called function
+ --------------------------------------------------------------------------------
+ ClientIdle_State X None
+ ProvisioningDone_State X Start the configuration
+ CompositionGet_State ConfigRespInit_State GetComposition
+ CompositionGet_State CompositionRecd_State ChangeThe State to next
+ AppKeyAdd_State X Issue AppKey
+ AppKeyAdd_State AppkeyAck_State ChangeThe State to next
+ AppBindModel_State X Issue AppKetBind
+ AppBindModel_State AppBindModelAck_State ChangeThe State to next
+ AddSubscription_State X Issue the Subscription
+ AddSubscription_State SubscriptionAck_State ChangeThe State to next
+ SetPublication_State PublicationStatus_State Issue the Subscription
+ SetPublication_State PublicationStatus_State ChangeThe State to next
+
+ */
+
+ /* If the Node is already configured, return from here */
+ if (eClientSendMsgState == ConfigurationDone_State)
+ return result;
+
+ if (eClientSendMsgState == ClientIdle_State)
+ {
+ /* Waiting for the Provisioning to be done before to Start the
+ node configuration procedure */
+ return result;
+ }
+
+ if (eServerRespRecdState == NodeNoResponse_State)
+ {
+ /* No Response received from Node under Provisioning for some config
+ messages. So, no need to do the trials */
+ return MOBLE_RESULT_FAIL;
+ }
+
+ if (eClientSendMsgState == ProvisioningDone_State)
+ {
+ /* Start the node configuration procedure */
+ eClientSendMsgState = CompositionGet_State;
+ ConfigClient_SaveMsgSendingTime();
+ }
+
+ else if (eClientSendMsgState == CompositionGet_State)
+ {
+ nowClockTime = Clock_Time();
+ if( (nowClockTime - NodeInfo.Initial_time) < CONFIGURATION_START_DELAY)
+ {
+ return result;
+ }
+ /*------------- Add the delay before to start the configuration messages */
+
+ if (eServerRespRecdState == CompositionRecdCompleted_State)
+ {
+ eClientSendMsgState = AppKeyAdd_State; /* Change the state to Next */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the GetComposition servicing */
+ Appli_ConfigClient_GetCompositionData();
+ }
+ }
+
+ else if (eClientSendMsgState == AppKeyAdd_State)
+ {
+ if (eServerRespRecdState == AppkeyAckCompleted_State)
+ {
+ eClientSendMsgState = AppBindModel_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the AppKeyAdd servicing */
+ Appli_ConfigClient_DefaultAppKeyAdd();
+ }
+ }
+
+ else if (eClientSendMsgState == AppBindModel_State)
+ {
+ if (eServerRespRecdState == AppBindModelAckCompleted_State)
+ {
+ eClientSendMsgState = AddSubscription_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the AppKeyBIND servicing */
+ Appli_ConfigClient_DefaultAppKeyBind();
+ }
+ }
+
+ else if (eClientSendMsgState == AddSubscription_State)
+ {
+ if (eServerRespRecdState == SubscriptionAckCompleted_State)
+ {
+ eClientSendMsgState = SetPublication_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ }
+ else
+ {
+ /* Continue the Subscription add servicing */
+ AppliConfigClient_SubscriptionAddDefault();
+ }
+ }
+
+ else if (eClientSendMsgState == SetPublication_State)
+ {
+ if (eServerRespRecdState == PublicationStatusCompleted_State)
+ {
+ eClientSendMsgState = ConfigurationDone_State; /* Change the send state */
+ eServerRespRecdState = NodeIdle_State;
+ TRACE_M(TF_CONFIG_CLIENT,"**Node is configured** \r\n");
+ }
+ else
+ {
+ /* Continue the Publication add servicing */
+ AppliConfigClient_PublicationSetDefault();
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief This function is called to Get the Composition data from the
+* a node under configuration
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+ MOBLEUINT16 dst_peer;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+
+ ConfigClient_SaveMsgSendingTime();
+
+ dst_peer = GetAddressToConfigure();
+
+ /* Start the Get Composition Message */
+ ConfigClient_CompositionDataGet(dst_peer);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ break;
+
+ case CompositionRecd_State:
+ /* Switch the state to next state AddAppKey_State */
+ ConfigClient_ResetTrials();
+ eServerRespRecdState = CompositionRecdCompleted_State;
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
+ }
+
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyAdd: This function is called to
+ add the default AppKeys and NetKeys to a node under configuration
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+ MOBLEUINT8 *pAppKey;
+ MOBLEUINT16 netKeyIndex = DEFAULT_NETKEY_INDEX;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLE_ADDRESS dst_addr;
+
+ pAppKey = GetNewProvNodeAppKey();
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ ConfigClient_SaveMsgSendingTime();
+
+ dst_addr = GetAddressToConfigure();
+
+ /* Start the Set Appkey message */
+ ConfigClient_AppKeyAdd ( dst_addr,
+ netKeyIndex,
+ appKeyIndex,
+ pAppKey);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ break;
+
+ case AppkeyAck_State:
+ ConfigClient_ResetTrials();
+ eServerRespRecdState = AppkeyAckCompleted_State;
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeIdle_State; /* Run next re-trial cycle again */
+ }
+
+ break;
+
+ default:
+ /* Error State */
+ break;
+}
+
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
+ function to Bind the element(node) with AppKeyIndex and Models
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
+{
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the AppBindModel_State message */
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ modelIdentifier = GetSIGModelToBindApp(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToBindApp(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeSendMessage_State:
+ /* Start the AppBindModel_State message */
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Send the Message to the server */
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ break;
+
+ case AppBindModelAck_State:
+ /* Need to check if all SIG Models are binded ? */
+
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToBindApp(elementIndex);
+ numVendorModels = GetCountVendorModelToBindApp(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ /* Switch to InProgress_State */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ /*Now, do binding for Vendor Model */
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+ if (elementIndex >= numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+
+ eServerRespRecdState = AppBindModelAckCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SubscriptionAddDefault: This function is application
+ used for adding subscription to the element(node) for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
+{
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT16 elementAddress;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the SubscriptionAdd message */
+
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ modelIdentifier = GetSIGModelToSubscribe(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeSendMessage_State:
+ elementAddress = GetServerElementAddress(elementIndex);
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+
+ break;
+
+
+ case SubscriptionAck_State:
+ /* Need to check if all SIG Models are subscribed ? */
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ numVendorModels = GetCountVendorModelToSubscribe(elementIndex);
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+
+ /* Get the Next Model and Bind it again till all SIG Models are binded */
+ eServerRespRecdState = NodeNextSigModel_State;
+
+ }
+ else if (indexVendormodels < numVendorModels)
+{
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+ if (elementIndex == numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+ eServerRespRecdState = SubscriptionAckCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ indexSIGmodels =0; /* Reset the variable again for the next element */
+ indexVendormodels = 0;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_PublicationSetDefault: This function is application
+ used for adding publication settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void)
+{
+ MOBLEUINT16 publishAddress = DEFAULT_PUBLISH_ADDR;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT8 credentialFlag = DEFAULT_CREDENTIAL_FLAG;
+ MOBLEUINT8 publishTTL = DEFAULT_PUBLISH_TTL;
+ MOBLEUINT8 publishPeriod = DEFAULT_PUBLISH_PERIOD;
+ MOBLEUINT8 publishRetransmitCount = DEFAULT_PUBLISH_RETRANSMIT_COUNT;
+ MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
+
+ static MOBLEUINT16 elementAddress;
+ static MOBLEUINT32 modelIdentifier;
+ static MOBLEUINT8 elementIndex;
+ static MOBLEUINT8 indexSIGmodels;
+ static MOBLEUINT8 indexVendormodels;
+ MOBLEUINT8 numSIGmodels;
+ MOBLEUINT8 numVendorModels;
+ MOBLEUINT8 numofElements;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 retry;
+
+ switch(eServerRespRecdState)
+ {
+ case NodeIdle_State:
+ /* Start the Publication Add message */
+
+ elementIndex = 0; /* Initialize it for the complete loop */
+ indexSIGmodels = 0; /* Initialize it for the complete loop */
+ indexVendormodels = 0;
+
+ case NodeNextSigModel_State:
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ modelIdentifier = GetSIGModelToPublish(elementIndex,
+ &indexSIGmodels,
+ numSIGmodels);
+
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+ case NodeNextVendorModel_State:
+ modelIdentifier = GetVendorModelToPublish(elementIndex,indexVendormodels);
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
+ break;
+
+
+ case NodeSendMessage_State:
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+
+ break;
+
+
+ case PublicationStatus_State:
+ /* Need to check if all SIG Models are subscribed ? */
+ ConfigClient_ResetTrials();
+
+ numSIGmodels = GetCountSIGModelToPublish(elementIndex);
+ numVendorModels = GetCountVendorModelToPublish(elementIndex);
+ elementAddress = GetServerElementAddress(elementIndex);
+
+ if (indexSIGmodels < numSIGmodels )
+ { /* Even when all SIG Models are serviced, we need to start for Vendor Models */
+ indexSIGmodels++;
+ indexVendormodels =0; /* Reset back, bcoz, we are still process the SIG Models */
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ indexVendormodels++; /* When SIG Models and Vendor Models are processed
+ the loop condition will become true */
+ }
+
+
+ if (indexSIGmodels < numSIGmodels )
+ {/* if index is still less, then we have scope of reading 1 more index */
+ eServerRespRecdState = NodeNextSigModel_State;
+ }
+ else if (indexVendormodels < numVendorModels)
+ {
+ eServerRespRecdState = NodeNextVendorModel_State;
+ }
+ else
+ {
+ /* Now, the element index is handled, change the element index */
+ elementIndex++;
+ numofElements = ConfigClient_GetNodeElements();
+
+ if (elementIndex == numofElements)
+ {/* we are comparing Index whose counting started from 0, becomes equal,
+ then exit the loop */
+ eServerRespRecdState = PublicationStatusCompleted_State;
+ }
+ else if (elementIndex < numofElements)
+ { /* When the Element Index is still less than the total number of
+ elements in the Node: So, Restart the cycle */
+
+ eServerRespRecdState = NodeNextSigModel_State;
+ indexSIGmodels =0; /* Reset the variable again for the next element */
+ indexVendormodels = 0;
+ }
+ }
+ break;
+
+ case InProgress_State:
+ /* Just wait and let the messages be completed
+ or look for timeout */
+ retry = ConfigClient_ChkRetries();
+
+ if (retry == CLIENT_TX_RETRY_ENDS)
+ {
+ eServerRespRecdState = NodeNoResponse_State;
+ }
+ else if (retry == CLIENT_TX_TIMEOUT)
+ {
+ eServerRespRecdState = NodeSendMessage_State; /* Run next re-trial cycle again */;
+ }
+ break;
+
+ default:
+ /* Error State */
+ break;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SelfPublicationSetDefault: This function is application
+ used for adding publication settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
+{
+ MOBLEUINT16 publishAddress = DEFAULT_PUBLISH_ADDR;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT8 credentialFlag = DEFAULT_CREDENTIAL_FLAG;
+ MOBLEUINT8 publishTTL = DEFAULT_PUBLISH_TTL;
+ MOBLEUINT8 publishPeriod = DEFAULT_PUBLISH_PERIOD;
+ MOBLEUINT8 publishRetransmitCount = DEFAULT_PUBLISH_RETRANSMIT_COUNT;
+ MOBLEUINT8 publishRetransmitIntervalSteps= DEFAULT_PUBLISH_RETRANSMIT_INTERVAL_STEPS;
+
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT8 elementIndex;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
+ }
+ return result;
+}
+
+
+/**
+* @brief AppliConfigClient_SelfSubscriptionSetDefault: This function is application
+ used for adding Subscription settings to the element(node)
+ for default settings
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
+{
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ /*If limit is reaching to no models*/
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
+
+ /*Checking for Vendor Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
+ }
+ }
+
+ }
+ return result;
+}
+
+
+/**
+* @brief Appli_ConfigClient_DefaultAppKeyBind: This function is application used for
+ function to Bind the element(node) with AppKeyIndex and Models
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
+{
+
+ MOBLEUINT32 modelIdentifier=0;
+ MOBLEUINT16 appKeyIndex = DEFAULT_APPKEY_INDEX;
+ MOBLEUINT16 elementAddress;
+ MOBLEUINT8 elementIndex;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ appKeyIndex = DEFAULT_APPKEY_INDEX;
+
+ for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ {
+ /*Checking for SIG Models*/
+ for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT16) Appli_SIG_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
+
+ /*Checking for VENDOR Models*/
+ for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ {
+ elementAddress = BLEMesh_GetAddress();
+ elementAddress += elementIndex;
+
+ modelIdentifier = (MOBLEUINT32) Appli_Vendor_Models[elementIndex][index];
+
+ if(modelIdentifier == NO_MODEL_AVLBL)
+ {
+ break;
+ }
+ else
+ {
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
+
+ }
+ return result;
+}
+
+/**
+* @brief Appli_CompositionDataStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
+{
+ eServerRespRecdState = CompositionRecd_State;
+}
+
+
+/**
+* @brief Appli_AppKeyStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_AppKeyStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = AppkeyAck_State;
+}
+
+
+/**
+* @brief Appli_AppBindModelStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = AppBindModelAck_State;
+}
+
+
+/**
+* @brief Appli_SubscriptionAddStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = SubscriptionAck_State;
+}
+
+
+/**
+* @brief Appli_PublicationStatusCb: This function is callback from config
+ client middleware on reception of the response
+* @param None
+* @retval MOBLE_RESULT
+*/
+void Appli_PublicationStatusCb(MOBLEUINT8 status)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = PublicationStatus_State;
+}
+
+
+/**
+* @brief Appli_NodeResetStatusCb: This function is callback from config
+ client middleware on reception of the Node Reset response
+* @param None
+* @retval None
+*/
+void Appli_NodeResetStatusCb(void)
+{
+ /* Change the received state for application */
+ eServerRespRecdState = NodeResetStatus_State;
+}
+
+
+/**
+* @brief GetSIGModelToBindApp: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+{
+
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ MOBLEUINT16 model_id;
+ MOBLEUINT8 index;
+ MOBLEUINT8 idxSIG = *pModelIndex;
+
+ for (index = idxSIG; index < numberOfModels ; index++ )
+ {
+ model_id = aNodeElements[elementIndex].aSIGModels[index];
+ if (MODEL_IS_FOUNDATION_MODEL(model_id))
+ {
+ /* Do nothing, let the next model_if be scanned */
+ model_id = 0xffff; /* Invalid Model ID */
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *pModelIndex = index;
+ return model_id;
+#else
+ return aSigModelsToBind[idxSIG][elementIdx] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[indexModels];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+/**
+* @brief GetCountSIGModelToBindApp: This function gets the NUMBER of SIG Model
+ to Bind
+* @param elementIndex Index of the Element for which the Count is needed
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToBindApp: This function gets the Vendor Model to Bind
+* @param elementIndex Index of the Element for which the Count is needed
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_BIND_APP;
+#endif
+}
+
+
+/**
+* @brief GetSIGModelToPublish: This function gets the SIG Model to Publish
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
+#else
+ return aPublishModels[idxSIG] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @param idxSIG Pointer to Index of the Model
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+
+/**
+* @brief GetCountSIGModelToPublish: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToPublish: This function gets the Vendor Model to Publish
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_PUBLISH;
+#endif
+}
+
+
+/**
+* @brief GetSIGModelToSubscribe: This function gets the SIG Model to Bind
+* @param elementIndex Index of the Element
+* @param pModelIndex Pointer to Index of the Element to be updated
+* @param numberOfModels Total number of Models to be scanned
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return GetSIGModelToBindApp(elementIndex,
+ pModelIndex,
+ numberOfModels);
+#else
+ return aSubscribeModels[idxSIG] ;
+#endif
+}
+
+
+/**
+* @brief GetVendorModelToSubscribe: This function Gets the Vendor Model ID for
+ Subscription
+* @param elementIndex Index of the Element
+* @param idxSIG Index to the Model ID to Subscribe
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 idxSIG)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].aVendorModels[idxSIG];
+#else
+ return VENDORMODEL_STMICRO_ID1 ;
+#endif
+}
+
+
+/**
+* @brief GetCountSIGModelToSubscribe: This function gets the SIG Model to Subscribe
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumSIGmodels;
+#else
+ return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
+#endif
+}
+
+
+/**
+* @brief GetCountVendorModelToPublish: This function gets the Count of the
+ Vendor Model to Subscribe
+* @param elementIndex Index of the Element
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
+{
+#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
+ return aNodeElements[elementIndex].NumVendorModels;
+#else
+ return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
+#endif
+}
+
+
+/**
+* @brief AppliConfigClient_SendMessageDefault: This function is used for sending
+ a message.
+ ** The Function is not yet written fully
+* @param None
+* @retval MOBLE_RESULT
+*/
+MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
+{
+ return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h
new file mode 100644
index 000000000..34169448c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h
@@ -0,0 +1,89 @@
+/**
+******************************************************************************
+* @file appli_config_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_CONFIG_CLIENT_H
+#define __APPLI_CONFIG_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+#include "config_client.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+#define MAX_CONFIG_PARAM_SIZE 22
+#define CONFIGURE_AS_PER_COMPOSITION_DATA
+
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Init(void);
+MOBLE_RESULT Appli_ConfigClient_Process(void);
+MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
+void Appli_CompositionDataStatusCb(MOBLE_RESULT);
+void Appli_AppKeyStatusCb(MOBLEUINT8 status);
+void Appli_AppBindModelStatusCb(MOBLEUINT8 status);
+void Appli_PublicationStatusCb(MOBLEUINT8 status);
+void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status);
+void Appli_NodeResetStatusCb(void);
+
+void Appli_ConfigClientStartNodeConfiguration(MOBLEUINT8 prvState);
+MOBLE_RESULT Appli_ConfigClient_GetCompositionData (void);
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyAdd (void);
+MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void);
+MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void);
+MOBLE_RESULT AppliConfigClient_PublicationSetDefault (void);
+MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void);
+MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void);
+MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void);
+Composition_Data_Page0_t* Appli_GetNodeCompositionBuff (void);
+
+MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIdx);
+MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIdx);
+
+MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+
+MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8);
+MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8);
+
+MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pModelIndex,
+ MOBLEUINT8 numberOfModels);
+
+MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIdx, MOBLEUINT8 idxSIG);
+MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
+
+MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+
+
+#endif /* __APPLI_CONFIG_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c
new file mode 100644
index 000000000..57c1bc7cf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c
@@ -0,0 +1,457 @@
+/**
+ ******************************************************************************
+ * @file appli_generic.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Generic Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "mesh_cfg.h"
+#include "generic.h"
+#include "light.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application_Mesh_Models
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+extern MOBLEUINT8 RestoreFlag;
+extern MOBLEUINT16 IntensityValue;
+extern MOBLEUINT8 IntensityFlag;
+extern MOBLEUINT8 PowerOnOff_flag;
+extern Appli_LightPwmValue_t Appli_LightPwmValue;
+Appli_Generic_OnOffSet AppliOnOffSet;
+Appli_Generic_LevelSet AppliLevelSet;
+Appli_Generic_PowerOnOffSet AppliPowerOnSet;
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet;
+
+/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid);
+/* Private functions ---------------------------------------------------------*/
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+/**
+* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* when Generic OnOff message is received
+* @param pGeneric_OnOffParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
+
+
+ /* This condition is applicable when user want to on off the light with some default
+ * transition value, or optionalValid =IN_TRANSITION , transition is in progress.
+ */
+ if((OptionalValid == DEFAULT_TRANSITION) || (OptionalValid == IN_TRANSITION))
+ {
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet.Present_OnOffValue;
+ Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
+ if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+ {
+ AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ }
+ else
+ {
+ AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ }
+
+ if(AppliOnOffSet.Present_OnOffValue > 16000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+ else
+ {
+ if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+
+/**
+* @brief Appli_Generic_OnOff_Status: This function is callback for Application
+* when Generic OnOff message is received
+* @param pOnOff_status: Pointer to the parameters received for message
+* @param plength: length of the data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Present OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Target OnOff value: %d\n\r", pOnOff_status[i]);
+ else if(i == 1)
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", pOnOff_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
+/**
+* @brief Appli_Generic_Level_Set: This function is callback for Application
+* when Generic Level message is received
+* @param plevelParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
+ MOBLEUINT8 OptionalValid)
+{
+ MOBLEUINT16 duty;
+ static MOBLEUINT16 previousIntensity = 0;
+
+ AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet.Present_Level16 <= 0)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+
+ IntensityValue = AppliLevelSet.Present_Level16;
+
+ if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
+ IntensityValue == INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = MOBLE_FALSE;
+ }
+ else
+ {
+ IntensityFlag = MOBLE_TRUE;
+ }
+ previousIntensity = IntensityValue;
+
+ if(AppliLevelSet.Present_Level16 < 0x00)
+ {
+ AppliLevelSet.Present_Level16 = 0;
+ }
+ duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",AppliLevelSet.Present_Level16);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_LEVEL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ /* For demo, if Level is more than 100, switch ON the LED */
+ if(AppliLevelSet.Present_Level16 >= 50)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_Delta_Set: This function is callback for Application
+* when Generic Level Delta message is received
+* @param pdeltalevelParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+
+ /* For demo, if Level is more than 50, switch ON the LED */
+ if (AppliLevelSet.Present_Level16 >= 50)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+ BSP_LED_Off(LED_BLUE);
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Generic_Move_Set: This function is callback for Application
+* when Generic Level Move message is received
+* @param pdeltaMoveParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ if(OptionalValid == 1)
+ {
+ AppliLevelSet.Present_Level16= pdeltaMoveParam->Present_Level16;
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+ /**
+* @brief Appli_Generic_Level_Status: This function is callback for Application
+* when Generic Level Move message is received
+* @param plevel_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_LEVEL */
+
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+/**
+* @brief Appli_Generic_PowerOnOff_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pPowerOnOffParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+
+ /* set the flag value for NVM store */
+ //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+/**
+* @brief Appli_Generic_PowerOnOff_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param powerOnOff_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF */
+
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+/**
+* @brief Appli_Generic_DefaultTransitionTime_Set: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pDefaultTimeParam: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
+ MOBLEUINT8 OptionalValid)
+{
+
+ AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_DefaultTransitionTime_Status: This function is callback for Application
+* when Generic Power on off set message is received
+* @param pTransition_status: Pointer to the parameters message
+* @param plength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength)
+{
+
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
+
+
+/**
+* @brief Appli_Generic_GetOnOffState: This function is callback for Application
+* when Generic on off status message is to be provided
+* @param pOnOff_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+{
+
+ *pOnOff_Status = AppliOnOffSet.Present_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
+ AppliOnOffSet.Present_OnOff);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetOnOffValue: This function is callback for Application
+ to get the PWM value for the generic on off
+* @param pOnOff_Value: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+{
+
+ *pOnOff_Value = AppliOnOffSet.Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet.Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet.TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet.TargetValue >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Value: Value %d!\n\r",
+ AppliOnOffSet.Present_OnOffValue);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetLevelStatus: This function is callback for Application
+ when Generic Level status message is to be provided
+* @param pLevel_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+{
+ *pLevel_Status = AppliLevelSet.Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
+ *pLevel_Status);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetPowerOnOffStatus: This function is callback for Application
+* when Generic Get Power status message is to be provided
+* @param pLevel_status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+{
+ *pPower_Status = AppliPowerOnSet.PowerOnState;
+ TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
+ AppliPowerOnSet.PowerOnState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Generic_GetDefaultTransitionStatus: This function is callback for
+* Application when Generic Level status message is to be provided
+* @param pTransition_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+{
+ *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
+ TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
+ AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h
new file mode 100644
index 000000000..41228825e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h
@@ -0,0 +1,115 @@
+/**
+ ******************************************************************************
+ * @file appli_generic.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Generic Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_GENERIC_H
+#define __APPLI_GENERIC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* user configuration for Battery status */
+#define BATTERY_ABSENT 0X00
+#define BATTERY_PRESENT_REMOVABLE 0X01
+#define BATTERY_PRESENT_NON_REMOVABLE 0X02
+#define BATTERY_UNKNOWN 0X03
+#define BATTERY_CRITICAL_LOW_LEVEL 0X00
+#define BATTERY_LOW_LEVEL 0X01
+#define BATTERY_GOOD_LEVEL 0X02
+#define BATTERY_LEVEL_UNKNOWN 0X03
+#define BATTERY_NOT_CHARGEABLE 0X00
+#define BATTERY_NOT_CHARGING 0X01
+#define BATTERY_IS_CHARGING 0X02
+#define BATTERY_CHARGING_UNKNOWN 0X03
+#define BATTERY_SERVICE_RFU 0X00
+#define BATTERY_REQUIRE_NO_SERVICE 0X01
+#define BATTERY_REQUIRE_SERVICE 0X02
+#define BATTERY_SERVICE_UNKNOWN 0X03
+
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 Present_OnOff;
+ MOBLEUINT16 Present_OnOffValue;
+ MOBLEUINT16 TargetValue;
+}Appli_Generic_OnOffSet;
+
+typedef struct
+{
+ MOBLEINT16 Present_Level16;
+}Appli_Generic_LevelSet;
+
+typedef struct
+{
+ MOBLEINT16 PowerOnState;
+}Appli_Generic_PowerOnOffSet;
+
+typedef struct
+{
+ MOBLEUINT8 DefaultTransitionTime;
+}Appli_Generic_DefaultTransitionSet;
+
+typedef struct
+{
+ MOBLEUINT8 Is_BatteryPresent;
+ MOBLEUINT8 Is_Chargeable;
+ MOBLEUINT8 Is_Serviceable;
+}Appli_BatteryUserflag_param_t;
+#pragma pack(4)
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*, MOBLEUINT8 );
+MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
+ MOBLEUINT32 plength);
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
+ MOBLEUINT32 plength);
+
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status) ;
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength);
+
+
+#endif /* __APPLI_GENERIC_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c
new file mode 100644
index 000000000..0c36b2294
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c
@@ -0,0 +1,101 @@
+/**
+******************************************************************************
+* @file appli_generic_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "generic_client.h"
+#include "appli_generic_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+MOBLEUINT8 Led_Value;
+/* Private function prototypes -----------------------------------------------*/
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Generic_OnOff_Set: This function is callback for Application
+* when Generic OnOff message is called
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pGeneric_OnOffParam[2];
+
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value;
+ GenericClient_OnOff_Set_Unack(elementAddr,
+ (_Generic_OnOffParam*) pGeneric_OnOffParam,
+ sizeof(pGeneric_OnOffParam) );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/**
+* @brief Appli_Generic_Level_Set: This function is callback for Application
+* when Generic Level message is called
+* @param void:
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ GenericClient_Level_Set_Unack(elementAddr,
+ (_Generic_LevelParam*) pGeneric_LevelParam,
+ sizeof(pGeneric_LevelParam));
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h
new file mode 100644
index 000000000..eb1c7dcf2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h
@@ -0,0 +1,44 @@
+/**
+******************************************************************************
+* @file appli_generic_client.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_GENERIC_CLIENT_H
+#define __APPLI_GENERIC_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
+MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void);
+
+
+#endif /* __APPLI_GENERIC_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c
new file mode 100644
index 000000000..02c6cb8c2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c
@@ -0,0 +1,1312 @@
+/**
+ ******************************************************************************
+ * @file appli_light.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Lighting Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "light.h"
+#include "appli_light.h"
+#include "appli_generic.h"
+#include "common.h"
+#include "mesh_cfg.h"
+#include "PWM_handlers.h"
+#include "PWM_config.h"
+#include "appli_nvm.h"
+#include "math.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING Lightness MODEL
+*******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+
+Appli_Light_lightnessSet ApplilightnessSet = {1,0,0,0,0,0};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet;
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
+/******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING CTL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+
+Appli_Light_CtlSet AppliCtlSet;
+Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet;
+Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
+/******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the LIGHTING HSL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+ Appli_Light_HslSet AppliHslSet;
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet = {0x7FFF,0x7FFF,0x7FFF};
+ Appli_Light_RGBSet Appli_RGBParam;
+ Appli_Light_HslRangeSet AppliHslRangeSet;
+
+/*******************************************************************************/
+#endif /*End of the LIGHTING HSL MODEL variables */
+/*******************************************************************************/
+
+/*******************************************************************************
+Following Variables are used for the RGB board.
+*******************************************************************************/
+
+Appli_LightPwmValue_t Appli_LightPwmValue;
+extern MOBLEUINT8 RestoreFlag;
+extern MOBLEUINT8 PowerOnOff_flag;
+extern MOBLEUINT8 IntensityFlag;
+extern MOBLEUINT16 IntensityValue;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+/**
+* @brief Appli_Light_Lightness_Set: This function is callback for Application
+* when Light Lightness Set message is received
+* @param pLight_LightnessParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 OptionalValid)
+{
+ MOBLEUINT16 duty;
+ static MOBLEUINT16 previousIntensity = 0;
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+
+ if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
+ {
+ ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ }
+
+ if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
+ IntensityValue == INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = MOBLE_FALSE;
+ }
+ else
+ {
+ IntensityFlag = MOBLE_TRUE;
+ }
+ previousIntensity = IntensityValue;
+
+ /* For demo, if Level is more than 100, switch ON the LED */
+ if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+
+ duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+
+/**
+* @brief Appli_Light_Lightness_Status: This function is callback for Application
+* when Light Lightness status message is received
+* @param pLightness_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+/**
+* @brief Appli_Light_Lightness_Linear_Set: This function is callback for Application
+* when Light Lightness Linear Set message is received
+* @param pLight_LightnessLinearParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
+ MOBLEUINT8 OptionalValid)
+{
+ ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Linear_Status: This function is callback for Application
+* when Light Lightness Linear status message is received
+* @param pLightnessLinear_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+/**
+* @brief Appli_Light_Lightness_Default_Set: This function is callback for Application
+* when Light Lightness Default Set message is received
+* @param pLight_LightnessDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Default_Status: This function is callback for Application
+* when Light Lightness Default status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+/**
+* @brief Appli_Light_Lightness_Range_Set: This function is callback for Application
+* when Light Lightness Range Set message is received
+* @param pLight_LightnessRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+
+ TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Lightness_Range_Status: This function is callback for Application
+* when Light Lightness range ststus message is received
+* @param pLightnessRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+/**
+* @brief Appli_Light_Ctl_Set: This function is callback for Application
+* when Light Ctl Set message is received
+* @param pLight_CtlParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
+ MOBLEUINT8 OptionalValid)
+{
+ float colourRatio;
+ float brightRatio;
+ TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+
+ AppliCtlSet.PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet.PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet.PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
+ colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+
+ Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
+ Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
+
+ Rgb_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+
+ TRACE_M(TF_SERIAL_CTRL,"#825E%04hx%04hx%04hx!\n\r",
+ AppliCtlSet.PresentLightness16,
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Ctl_Status: This function is callback for Application
+* when Light CTL status message is received
+* @param pLightCtl_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
+/**
+* @brief Appli_Light_CtlTemperature_Set: This function is callback for Application
+* when Light Ctl Temperature Set message is received
+* @param pLight_CtltempParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
+ MOBLEUINT8 OptionalValid)
+{
+ float colourRatio;
+ float brightRatio;
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
+ AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+
+ Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
+ Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
+
+ Rgb_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_CtlTemperature_Status: This function is callback for Application
+* when Light CTL temperature status message is received
+* @param pLightCtlTemp_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+/**
+* @brief Appli_Light_CtlTemperature_Range_Set: This function is callback for Application
+* when Light Ctl Temperature range Set message is received
+* @param pLight_CtlTempRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+/**
+* @brief Appli_Light_CtlTemperature_Range_Set: This function is callback for Application
+* when Light CTL temperature range status message is received
+* @param pCtlTempRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif
+/******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
+/**
+* @brief Appli_Light_CtlDefault_Set: This function is callback for Application
+* when Light Ctl Default Set message is received
+* @param pLight_CtlDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_CtlDefault_Status: This function is callback for Application
+* when Light CTL Default status message is received
+* @param pCtlDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+/**
+* @brief Appli_Light_Hsl_Set: This function is callback for Application
+* when Light Hsl Set message is received
+* @param pLight_HslParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+
+ /* Function to convert HSL values in RGB values */
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ /* when HSL is set, make CTL pwm will bw zero */
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_Hsl_Status: This function is callback for Application
+* when Light HSL status message is received
+* @param pHsl_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
+/**
+* @brief Appli_Light_HslHue_Set: This function is callback for Application
+* when Light Hsl Hue Set message is received
+* @param pLight_HslHueParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+
+}
+
+/**
+* @brief Appli_Light_HslHue_Status: This function is callback for Application
+* when Light HSL HUE status message is received
+* @param pHslHue_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
+/**
+* @brief Appli_Light_HslSaturation_Set: This function is callback for Application
+* when Light Hsl Saturation Set message is received
+* @param pLight_HslSaturationParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslSaturation_Status: This function is callback for Application
+* when Light HSL Saturation status message is received
+* @param pHslSaturation_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+/**
+* @brief Appli_Light_HslDefault_Set: This function is callback for Application
+* when Light Hsl Default Set message is received
+* @param pLight_HslDefaultParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+
+ AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
+ AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
+ AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+
+ HSL2RGB_Conversion();
+
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam.Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam.Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam.Blue_Value ,0xFFFF ,0x00);
+
+ Ctl_LedOffState();
+
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ /* set the flag value for NVM store */
+ RestoreFlag = LIGHT_HSL_NVM_FLAG;
+
+ AppliNvm_SaveMessageParam();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslDefault_Status: This function is callback for Application
+* when Light HSL Default status message is received
+* @param pHslDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
+/**
+* @brief Appli_Light_HslRange_Set: This function is callback for Application
+* when Light Hsl Range Set message is received
+* @param pLight_HslRangeParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
+ MOBLEUINT8 OptionalValid)
+{
+ TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_HslRange_Status: This function is callback for Application
+* when Light HSL range status message is received
+* @param pHslRange_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+{
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+#endif
+
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING Lightness MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+
+/**
+* @brief Appli_Light_GetLightnessStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLightnessState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+{
+ *(lLightnessState) = ApplilightnessSet.PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessLinearStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLightnessState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+{
+ *(lLightnessState) = ApplilightnessLinearSet.PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet.PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Linear Status: present: %d last: %d\n\r",
+ ApplilightnessLinearSet.PresentState16,
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+{
+ *(lDefaultState) = ApplilightnessSet.LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
+ ApplilightnessSet.LightnessDefault);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetLightnessLastStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lLastState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+{
+ *(lLastState) = ApplilightnessSet.LastLightness16;
+ *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
+
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
+ ApplilightnessSet.LastLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetLightnessRangeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lRangeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+{
+ *(lRangeState) = ApplilightnessSet.StatusCode;
+ *(lRangeState+1) = ApplilightnessSet.RangeMin;
+ *(lRangeState+2) = ApplilightnessSet.RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet.RangeMax;
+ *(lRangeState+4) = ApplilightnessSet.RangeMax >> 8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Lighness Range Status: status: %d Min: %d Max: %d\n\r",
+ ApplilightnessSet.StatusCode,
+ ApplilightnessSet.RangeMin,
+ ApplilightnessSet.RangeMax);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING CTL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
+
+/**
+* @brief Appli_Light_GetCtlLightStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlLightState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+{
+ *(lCtlLightState) = AppliCtlSet.PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet.PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet.PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet.PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet.PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet.PresentCtlDelta16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Light Status: lightness: %d temp: %d delta: %d\n\r",
+ AppliCtlSet.PresentLightness16,
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlTeperatureStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlTempState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+{
+ *(lCtlTempState) = AppliCtlSet.PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet.PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet.PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet.PresentCtlDelta16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Temperature Status: temp: %d delta: %d\n\r",
+ AppliCtlSet.PresentTemperature16,
+ AppliCtlSet.PresentCtlDelta16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlTemperatureRange: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlTempRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+{
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet.StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet.RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet.RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet.RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet.RangeMax >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Temperature Range: status: %d Min: %d Max: %d\n\r",
+ AppliCtlTemperatureRangeSet.StatusCode,
+ AppliCtlTemperatureRangeSet.RangeMin,
+ AppliCtlTemperatureRangeSet.RangeMax);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetCtlDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lCtlDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+{
+ *(lCtlDefaultState) = AppliCtlDefaultSet.CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet.CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet.CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet.CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet.CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet.CtlDefaultDeltaUv >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Ctl Default Status: lightness: %d temp: %d deltaUV: %d\n\r",
+ AppliCtlDefaultSet.CtlDefaultLightness16,
+ AppliCtlDefaultSet.CtlDefaultTemperature16,
+ AppliCtlDefaultSet.CtlDefaultDeltaUv);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
+
+/*******************************************************************************
+Following Functions are used for the LIGHTING HSL MODEL
+*******************************************************************************/
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+/**
+* @brief Appli_Light_GetHslStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+{
+ *(lHslState) = AppliHslSet.HslLightness16;
+ *(lHslState+1) = AppliHslSet.HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet.HslHueLightness16;
+ *(lHslState+3) = AppliHslSet.HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet.HslSaturation16;
+ *(lHslState+5) = AppliHslSet.HslSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Status: lightness: %d hue: %d saturation: %d\n\r",
+ AppliHslSet.HslLightness16,
+ AppliHslSet.HslHueLightness16,
+ AppliHslSet.HslSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslHueStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslHueState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+{
+ *(lHslHueState) = AppliHslSet.HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
+ AppliHslSet.HslHueLightness16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Light_GetHslSaturationStatus: This function is callback for Application
+* to get the application values in middleware used for transition change
+* @param lHslSaturationState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+{
+ *(lHslSaturationState) = AppliHslSet.HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
+ AppliHslSet.HslSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslDefaultStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslDefaultState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+{
+ *(lHslDefaultState) = Appli_HslDefaultSet.HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet.HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet.HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet.HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet.HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet.HslDefaultSaturation16 >>8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslSatRange: This function is callback for Application
+* to get the application values in middleware used for transition change
+* @param lHslSatRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+{
+ *(lHslSatRange) = AppliHslRangeSet.StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet.HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet.HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet.HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet.HslMaxSaturation16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Range: status: %d min: %d max: %d\n\r",
+ AppliHslRangeSet.StatusCode,
+ AppliHslRangeSet.HslMinSaturation16,
+ AppliHslRangeSet.HslMaxSaturation16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Light_GetHslHueRange: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param lHslHueRange: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+{
+ *(lHslHueRange) = AppliHslRangeSet.StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet.HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet.HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet.HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet.HslHueMaxRange16 >>8;
+ TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Range: status: %d min: %d max: %d\n\r",
+ AppliHslRangeSet.StatusCode,
+ AppliHslRangeSet.HslHueMinRange16,
+ AppliHslRangeSet.HslHueMaxRange16);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_SERVER_HSL */
+/******************************************************************************/
+
+/* This Function used to initialise the PWM . This is used for the RGB board */
+void Appli_Light_PwmInit()
+{
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmCoolValue = 0;
+ Appli_LightPwmValue.PwmWarmValue = 0;
+ Appli_LightPwmValue.PwmRedValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmGreenValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmBlueValue = PWM_VALUE_OFF;
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
+
+/**
+* @brief Function to convert the map the RGB values in real values.
+* @param value1: This value corresponds to red led.
+* @param value2: This value corresponds to green led .
+* @param value3: This value corresponds to blue led .
+* @retval void
+*/
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+{
+ Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+}
+
+/**
+* @brief Function to convert the HSL values in RGB values.
+* @param void
+* @retval void
+*/
+void HSL2RGB_Conversion(void)
+{
+
+ MOBLEUINT16 hueValue;
+ float lightnessvalue;
+ float saturationValue;
+ MOBLEUINT16 cValue; /* chroma */
+ MOBLEUINT16 mValue; /* intermediate value used for creating the r,g,b baseline */
+ MOBLEUINT16 xValue; /* intermediate value used for computing r,g,b */
+
+ if(AppliHslSet.HslSaturation16 == 0)
+ {
+ Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ }
+ else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ {
+ Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ }
+ else
+ {
+ /* Hue is calculated for angular value. so converting in between 0 to 360 degree */
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet.HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet.HslLightness16/65535;
+ saturationValue = (float)AppliHslSet.HslSaturation16/65535;
+
+ /* Formula to get the values used for RGB conversion */
+ cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
+ mValue = (MOBLEUINT16)((lightnessvalue * 1000) - (cValue/2));
+ xValue = (MOBLEUINT16)(cValue * (1 - fabs(fmod(hueValue / 60.0, 2.0) - 1)));
+
+ /* Conditons applied for the different angle of hue value */
+ if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
+ {
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
+ {
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
+ {
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ }
+ else if (hueValue >= (HUE_UPPER_LIMIT / 2)
+ && hueValue < (2 * HUE_UPPER_LIMIT / 3))
+ {
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ }
+ else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
+ && hueValue < (5 * HUE_UPPER_LIMIT / 6))
+ {
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ }
+ else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
+ {
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ }
+ else
+ {
+ RgbF_Create(mValue, mValue, mValue);
+ }
+ }
+}
+
+#endif
+
+/**
+* @brief Rgb_LedOffState: This function is called while using CTL, makes all the RGB
+* PWM off state for Application.
+* @param void:
+* @retval void
+*/
+void Rgb_LedOffState(void)
+{
+ Appli_LightPwmValue.PwmRedValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmGreenValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmBlueValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+}
+
+/**
+* @brief Ctl_LedOffState: This function is called while using HSL, makes all the
+* cool Warm PWM off state for Application.
+* @param void:
+* @retval void
+*/
+void Ctl_LedOffState(void)
+{
+ Appli_LightPwmValue.PwmWarmValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.PwmCoolValue = PWM_VALUE_OFF;
+ Appli_LightPwmValue.IntensityValue = PWM_VALUE_OFF;
+}
+
+/**
+* @brief Function to set the values for PWM for RGB board.
+* @param state: decided the state of PWM according to the condition.
+* @retval void
+*/
+void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
+{
+
+#ifndef USER_BOARD_1LED
+ if(light_state.IntensityValue > 0)
+ {
+#ifdef USER_BOARD_COOL_WHITE_LED
+ if((light_state.PwmCoolValue == 0) && (light_state.PwmWarmValue == 0))
+ light_state.PwmWarmValue = light_state.IntensityValue;
+#endif
+#ifdef USER_BOARD_RGB_LED
+ if((light_state.PwmRedValue == PWM_VALUE_OFF) &&
+ (light_state.PwmGreenValue == PWM_VALUE_OFF) &&
+ (light_state.PwmBlueValue == PWM_VALUE_OFF))
+ light_state.PwmBlueValue = light_state.IntensityValue;
+#endif
+ }
+#endif
+
+ if(state == RESUME_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+
+#ifdef USER_BOARD_RGB_LED
+
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+
+ }
+ else if(state == RESET_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, PWM_VALUE_OFF);
+#endif
+#ifdef USER_BOARD_COOL_WHITE_LED
+ Modify_PWM(COOL_LED, 0);
+ Modify_PWM(WARM_LED, 0);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, PWM_VALUE_OFF);
+ Modify_PWM(GREEN_LED, PWM_VALUE_OFF);
+ Modify_PWM(BLUE_LED, PWM_VALUE_OFF);
+#endif
+ }
+ else if(state == LOAD_STATE)
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+ }
+ else
+ {
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, light_state.IntensityValue);
+#endif
+
+#ifdef USER_BOARD_COOL_WHITE_LED
+ light_state.PwmCoolValue = PWM_DEFAULT_VALUE;
+
+ Modify_PWM(COOL_LED, light_state.PwmCoolValue);
+ Modify_PWM(WARM_LED, light_state.PwmWarmValue);
+#endif
+#ifdef USER_BOARD_RGB_LED
+ Modify_PWM(RED_LED, light_state.PwmRedValue);
+ Modify_PWM(GREEN_LED, light_state.PwmGreenValue);
+ Modify_PWM(BLUE_LED, light_state.PwmBlueValue);
+#endif
+ }
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h
new file mode 100644
index 000000000..aaa600146
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h
@@ -0,0 +1,196 @@
+/**
+ ******************************************************************************
+ * @file appli_light.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Light Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_H
+#define __APPLI_LIGHT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "light.h"
+
+/* Exported macro ------------------------------------------------------------*/
+#define HUE_UPPER_LIMIT 360
+/* Exported variables -------------------------------------------------------*/
+
+/* Light Lightness set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 PresentState16;
+ MOBLEUINT16 LastLightness16;
+ MOBLEUINT16 LightnessDefault;
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 RangeMin;
+ MOBLEUINT16 RangeMax;
+}Appli_Light_lightnessSet;
+
+
+/* Light Lightness Linear set */
+typedef struct
+{
+ MOBLEUINT16 PresentState16;
+}Appli_Light_lightnessLinearSet;
+
+/* Light Ctl Set */
+typedef struct
+{
+ MOBLEUINT16 PresentLightness16;
+ MOBLEUINT16 PresentTemperature16;
+ MOBLEINT16 PresentCtlDelta16;
+}Appli_Light_CtlSet;
+
+/* Light Ctl Temperature Range Set */
+typedef struct
+{
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 RangeMin;
+ MOBLEUINT16 RangeMax;
+}Appli_Light_CtlTemperatureRangeSet;
+
+/* Light Ctl Default set */
+typedef struct
+{
+ MOBLEUINT16 CtlDefaultLightness16;
+ MOBLEUINT16 CtlDefaultTemperature16;
+ MOBLEINT16 CtlDefaultDeltaUv;
+}Appli_Light_CtlDefaultSet;
+
+/* Light Hsl Hue set */
+typedef struct
+{
+ MOBLEUINT16 HslLightness16;
+ MOBLEUINT16 HslHueLightness16;
+ MOBLEUINT16 HslSaturation16;
+}Appli_Light_HslSet;
+
+/* Light Hsl Hue set */
+typedef struct
+{
+ MOBLEUINT16 HslDefaultLightness16;
+ MOBLEUINT16 HslDefaultHueLightness16;
+ MOBLEUINT16 HslDefaultSaturation16;
+}Appli_Light_HslDefaultSet;
+
+typedef struct
+{
+ MOBLEUINT16 Red_Value;
+ MOBLEUINT16 Green_Value;
+ MOBLEUINT16 Blue_Value;
+}Appli_Light_RGBSet;
+
+typedef struct
+{
+ MOBLEUINT8 StatusCode;
+ MOBLEUINT16 HslHueMinRange16;
+ MOBLEUINT16 HslHueMaxRange16;
+ MOBLEUINT16 HslMinSaturation16;
+ MOBLEUINT16 HslMaxSaturation16;
+}Appli_Light_HslRangeSet;
+
+typedef struct
+{
+ MOBLEUINT16 IntensityValue;
+ MOBLEUINT16 PwmRedValue;
+ MOBLEUINT16 PwmGreenValue;
+ MOBLEUINT16 PwmBlueValue;
+ MOBLEUINT16 PwmWarmValue;
+ MOBLEUINT16 PwmCoolValue;
+}Appli_LightPwmValue_t;
+#pragma pack(4)
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslDefaultParam,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState);
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState);
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState);
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState);
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState);
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange);
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState);
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState);
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState);
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState);
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange);
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange);
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState);
+void Appli_Light_PwmInit(void);
+void HSL2RGB_Conversion(void);
+void Ctl_LedOffState(void);
+void Rgb_LedOffState(void);
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3);
+void Light_UpdateLedValue(MOBLEUINT8 state , Appli_LightPwmValue_t light_state);
+#endif /* __APPLI_LIGHT_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c
new file mode 100644
index 000000000..96626b19a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c
@@ -0,0 +1,102 @@
+/**
+******************************************************************************
+* @file appli_light_client.c
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "generic_client.h"
+#include "appli_light_client.h"
+#include "light_client.h"
+
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+extern MOBLEUINT8 Tid_Client;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_Lightness_Set: This function is callback for Application
+* when Lightness message is called
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+{
+ MOBLE_ADDRESS elementAddr = 0;
+ MOBLEUINT8 pLightnessParam[3];
+
+ Appli_IntensityControlPublishing(pLightnessParam);
+ LightClient_Lightness_Set_Unack(elementAddr,
+ (_Light_LightnessParam*) pLightnessParam,
+ sizeof(pLightnessParam) );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h
new file mode 100644
index 000000000..f216e5175
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h
@@ -0,0 +1,62 @@
+/**
+******************************************************************************
+* @file appli_light_client.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_CLIENT_H
+#define __APPLI_LIGHT_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "generic.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+
+
+#endif /* __APPLI_LIGHT_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c
new file mode 100644
index 000000000..cd419fe7a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @file appli_light_ctrl.c
+ * @author BLE Mesh Team
+ * @brief Application interface for light LC Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "types.h"
+#include "appli_generic.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_light_lc.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variable ----------------------------------------------------------*/
+
+Appli_LightLC_Set_t Appli_LightLC_set;
+Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+
+MOBLEUINT16 AmbientLuxLevel;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Appli_Light_LCMode_Set: This function is callback for Application
+* when Light LC mode Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_mode = pLight_LC_Param->LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Mode Set: %d\n\r",
+ pLight_LC_Param->LC_mode);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OM_Set: This function is callback for Application
+* when Light LC mode Occupancy Model Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.LC_OM = pLight_LC_Param->LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"OM Set: %d\n\r",
+ pLight_LC_Param->LC_OM);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_OnOff_Set: This function is callback for Application
+* when Light LC On Off Set message is received
+* @param pLight_LC_Param: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_LightLC_set.Light_OnOffState = pLight_LC_Param->Present_Light_OnOff;
+ TRACE_M(TF_SERIAL_CTRL,"OnOff Set: %d\n\r",
+ pLight_LC_Param->Present_Light_OnOff);
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Get_AmbientLuxLevelOutput: This function is given to calculate the Ambient
+ Lux level output from the ambient sensor.
+* @param void:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void)
+{
+ /* Use AmbientLuxLevel global variable to store the value from ambient lux sensor
+ and then use this value to copmpare the lux level output from state machine.
+ */
+
+ return AmbientLuxLevel;
+}
+
+/**
+* @brief Light_LC_LuxLevelPIRegulator: This function will calculate all the parameter
+* Kid,kpu,kiu,kpd and return the value Light Lightness Linear.
+* @param tableLuxLevel:
+* @param ambientLuxLevel:
+* @retval MOBLEUINT16:
+**/
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,MOBLEUINT16 ambientLuxLevel)
+{
+ MOBLEUINT16 luxLevel = 0;
+ /* User can write their code for the calculation */
+
+
+ return luxLevel;
+}
+
+/**
+* @brief Appli_LightLC_Get_ModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+{
+ *(plcModeState) = Appli_LightLC_set.LC_mode;
+ TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_mode);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OMModeStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOM_ModeState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState)
+{
+ *(plcOM_ModeState) = Appli_LightLC_set.LC_OM;
+ TRACE_M(TF_SERIAL_CTRL,"Get OM Mode Status: %d\n\r",
+ Appli_LightLC_set.LC_OM);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_LightLC_Get_OnOffStatus: This function is callback for Application
+* to get the application values in middleware used for transition change.
+* @param plcOnOffState: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
+{
+ *(plcOnOffState) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+1) = Appli_LightLC_set.Light_OnOffState;
+ *(plcOnOffState+2) = Appli_LightLC_set.Light_OnOffState;
+ TRACE_M(TF_SERIAL_CTRL,"Get On Off Status: %d\n\r",
+ Appli_LightLC_set.Light_OnOffState);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h
new file mode 100644
index 000000000..049d95308
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h
@@ -0,0 +1,89 @@
+/**
+******************************************************************************
+* @file appli_light_ctrl.h
+* @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+* @brief Application interface for Light Control Mesh Models
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_LIGHT_LC_H
+#define __APPLI_LIGHT_LC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "light_lc.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+/*******************************************************************************
+Following Variables are used for the Light LC Mode MODEL
+*******************************************************************************/
+/* Light Lightness set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT8 LC_mode;
+ MOBLEUINT8 LC_OM;
+ MOBLEUINT8 Light_OnOffState;
+ MOBLEUINT16 Light_OnOffValue;
+}Appli_LightLC_Set_t;
+
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT16 Property_Value;
+}Appli_Light_LC_PropertySet_t;
+#pragma pack(4)
+
+
+MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
+ MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState);
+MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState);
+MOBLE_RESULT Appli_LightLC_Get_OMModeStatus(MOBLEUINT8* plcOM_ModeState);
+MOBLEUINT16 Appli_LightLC_Get_AmbientLuxLevelOutput(void);
+MOBLEUINT16 Appli_Light_LC_PIRegulatorOutput(MOBLEUINT16 tableLuxLevel,
+ MOBLEUINT16 ambientLuxLevel);
+#endif /* __APPLI_LIGHT_LC_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c
new file mode 100644
index 000000000..2b2f07087
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c
@@ -0,0 +1,1529 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.c
+ * @author BLE Mesh Team
+ * @brief User Application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Includes ------------------------------------------------------------------*/
+#include "ble_common.h"
+#include "app_conf.h"
+#include "hal_common.h"
+#include "appli_mesh.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "ble_hal_aci.h"
+#include "ble_hci_le.h"
+#include <string.h>
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include "generic.h"
+#include "common.h"
+#include "serial_if.h"
+#include "appli_nvm.h"
+#include "pal_nvm.h"
+#include "appli_config_client.h"
+#include "appli_generic_client.h"
+#include "appli_light_client.h"
+
+#include "stm32_seq.h"
+#include "PWM_config.h"
+#include "mesh_cfg_usr.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+#define APPLI_OPTIM 0
+
+/*********** Macros to be modified according to the requirement *************/
+#define BOUNCE_THRESHOLD 20U
+#define LONG_PRESS_THRESHOLD 1000U
+#define MANUAL_UNPROVISION_TIMER 3000U
+#define FLASH_ERASE_TIME 100U
+//#define DISCOVER_TIMER 10*60*1000 /* 10 minutes */
+#define DISCOVER_TIMER_INTERVAL 10*60*(1000000/CFG_TS_TICK_VAL) /* 10 minutes */
+#if (APPLI_OPTIM == 1)
+#define APPLI_MESH_TIMER_INTERVAL 1*(1000/CFG_TS_TICK_VAL) /* 1 ms */
+#endif
+#define DEFAULT_DELAY_PACKET_FROM 500U
+#define DEFAULT_DELAY_PACKET_RANDOM_TIME 500U
+#define USER_OUTPUT_OOB_APPLI_PROCESS 0U
+#define INPUT_OOB_TIMEOUT 300U /* input Oob30 Sec timeout*/
+#define PBADV_UNPROV_DEV_BEACON_INTERVAL 100U /* 100 ms */
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#if (LOW_POWER_FEATURE == 1)
+#define LPN_API_TIMER_INTERVAL 30*(1000000/CFG_TS_TICK_VAL) /* 30 secondes */
+#endif
+/* Private macro -------------------------------------------------------------*/
+#define MAX_APPLI_BUFF_SIZE 8
+#define MAX_PENDING_PACKETS_QUE_SIZE 2
+#define DATA_BUFFER_LENGTH 8
+#define MAX_NUMB_ELEMENTS APPLICATION_NUMBER_OF_ELEMENTS
+#define CUSTOM_BEACON_AD_TYPE 0x00
+#define ENABLE_CUSTOM_BEACON 0
+#define CUSTOM_BEACON_INTERVAL 2000U
+
+/**********************Friendship callbacks macros ****************************/
+#define FN_CLEARED_REPEAT_REQUEST 1
+#define FN_CLEARED_POLL_TIMEOUT 2
+#define FN_CLEARED_FRIEND_CLEAR 3
+#define LPN_CLEARED_NO_RESPONSE 1
+
+/* Private variables ---------------------------------------------------------*/
+
+enum ButtonState
+{
+ BS_OFF,
+ BS_DEBOUNCE,
+ BS_SHORT_PRESS,
+ BS_LONG_PRESS
+};
+
+enum ButtonState buttonState = BS_OFF;
+tClockTime tBounce = 0;
+MOBLEUINT8 Appli_LedState = 0;
+MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
+MOBLEUINT8 IntensityFlag = FALSE;
+MOBLEUINT8 ProxyFlag = 0;
+MOBLEUINT8 ProvisionFlag = 0;
+
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+static MOBLEUINT8 PrvngInProcess = 0;
+static MOBLEUINT32 OutputOobData = 0;
+static MOBLEUINT32 OutputOobBlinkCount = 0;
+#endif
+
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+MOBLEUINT8 InputOobData[8] = {0};
+MOBLEUINT8 inputOOBDataReady = 0;
+#endif
+
+/*Number Of Elements selected per Node. Maximum Elements supported = 3*/
+MOBLEUINT8 NumberOfElements = APPLICATION_NUMBER_OF_ELEMENTS;
+
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+/* 16 octets Static OOB information to be input here. Used during provisioning by Library */
+const MOBLEUINT8 StaticOobBuff[STATIC_OOB_SIZE] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+#else
+const MOBLEUINT8 StaticOobBuff[] = {0};
+#endif
+
+#ifdef PUB_KEY_TYPE_OOB
+/* 64 octets Public Key information to be input here. It is only required for Public Key OOB case.
+Used during provisioning by Library */
+const MOBLEUINT8 PubKeyBuff[64] = {0xF4, 0x65, 0xE4, 0x3F, 0xF2, 0x3D, 0x3F, 0x1B, 0x9D, 0xC7,
+0xDF, 0xC0, 0x4D, 0xA8, 0x75, 0x81, 0x84, 0xDB, 0xC9, 0x66, 0x20, 0x47, 0x96, 0xEC, 0xCF,
+0x0D, 0x6C, 0xF5, 0xE1, 0x65, 0x00, 0xCC, 0x02, 0x01, 0xD0, 0x48, 0xBC, 0xBB, 0xD8, 0x99,
+0xEE, 0xEF, 0xC4, 0x24, 0x16, 0x4E, 0x33, 0xC2, 0x01, 0xC2, 0xB0, 0x10, 0xCA, 0x6B, 0x4D,
+0x43, 0xA8, 0xA1, 0x55, 0xCA, 0xD8, 0xEC, 0xB2, 0x79};
+
+/* 32 octets Private Key information to be input here. It is only required for Public Key OOB case.
+Used during provisioning by Library */
+const MOBLEUINT8 PrivKeyBuff[32] = {0x52, 0x9A, 0xA0, 0x67, 0x0D, 0x72, 0xCD, 0x64, 0x97, 0x50,
+0x2E, 0xD4, 0x73, 0x50, 0x2B, 0x03, 0x7E, 0x88, 0x03, 0xB5, 0xC6, 0x08, 0x29, 0xA5, 0xA3,
+0xCA, 0xA2, 0x19, 0x50, 0x55, 0x30, 0xBA};
+#else
+const MOBLEUINT8 PubKeyBuff[] = NULL;
+const MOBLEUINT8 PrivKeyBuff[] = NULL;
+#endif
+
+
+
+/* Select Node as Sniffer, Means able to sniff all the packets
+* 0 - Filters are enabled and packets not targeted to node are filtered
+* 1 - Filters are disabled and packets not targeted to node are not filtered
+*/
+MOBLEUINT8 DisableFilter = 0;
+
+#if LOW_POWER_FEATURE
+MOBLEINT32 BLEMesh_sleepTime;
+MOBLEUINT32 SysRefCount;
+#endif
+
+MOBLEUINT8 network_conf[0x1000];
+MOBLEUINT8 nvm_operation;
+MOBLEUINT8 nvm_flash_page;
+MOBLEUINT8 provisioning_completion;
+
+/* Timer to control unprovisioned device beacons */
+#if PB_ADV_SUPPORTED
+MOBLEUINT8 discoverTimer_Id;
+tClockTime discoverTimerinterval = DISCOVER_TIMER_INTERVAL;
+#endif
+
+#if (APPLI_OPTIM == 1)
+MOBLEUINT8 appliTaskTimer_Id;
+#endif
+#if LOW_POWER_FEATURE
+volatile uint8_t BleProcessInit = 0;
+#endif
+#if (LOW_POWER_FEATURE == 1)
+MOBLEUINT8 lowPowerNodeApiTimer_Id;
+#endif
+
+/********************* Application configuration **************************/
+#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
+MOBLEUINT8 bdaddr[8];
+
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+static void Appli_GetMACfromUniqueNumber(void);
+#endif /* INTERNAL_UNIQUE_NUMBER_MAC */
+
+const void *mobleNvmBase;
+const void *appNvmBase;
+const void *prvsnr_data;
+#else
+#error "Unknown compiler"
+#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
+
+/* Private function prototypes -----------------------------------------------*/
+//static void Appli_LongButtonPress(void);
+static void Appli_ShortButtonPress(void);
+#if USER_OUTPUT_OOB_APPLI_PROCESS
+void Appli_OobAuthenticationProcess(void);
+#endif
+void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason);
+void Appli_LowPowerProcess(void);
+#if (APPLI_OPTIM == 1)
+static void AppliMeshTask(void);
+#endif
+
+/* Private functions ---------------------------------------------------------*/
+
+/************************* Button Control functions ********************/
+/**
+* @brief Function calls when a button is pressed for short duration
+* @param void
+* @retval void
+*/
+static void Appli_ShortButtonPress(void)
+{
+ BLEMesh_ModelsCommand();
+}
+
+#if 0
+/**
+* @brief Function calls when a button is pressed for Long duration
+* @param void
+* @retval void
+*/
+static void Appli_LongButtonPress(void)
+{
+ /* User Implementation */
+}
+#endif
+
+/**
+* @brief Updates the button status
+* @param int isPressed
+* @retval void
+*/
+static void Appli_UpdateButtonState(int isPressed)
+{
+ uint32_t t0 = 0,t1 = 1;
+
+ t0 = Clock_Time(); /* SW1 press timing */
+
+ while(BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED);
+ t1 = Clock_Time(); /* SW1 release timing */
+
+ if((t1 - t0) > LONG_PRESS_THRESHOLD)
+ {
+ IntensityPublish();
+ }
+ else if((t1 - t0) > BOUNCE_THRESHOLD)
+ {
+ /* Button 1 short press action */
+ Appli_ShortButtonPress();
+ }
+}
+
+/**
+* @brief task for the BLE MESH, the MESH Models and the Appli processes
+* @param void
+* @retval void
+*/
+static void Mesh_Task()
+{
+ BLEMesh_Process();
+ BLEMesh_ModelsProcess(); /* Models Processing */
+
+#if (APPLI_OPTIM == 0)
+ /* Set the task in the scheduler for the next execution */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+#endif
+}
+
+/**
+* @brief task for the BLE MESH, the MESH Models and the Appli processes
+* @param void
+* @retval void
+*/
+static void Appli_Task()
+{
+ Appli_Process();
+
+#if (APPLI_OPTIM == 0)
+ /* Set the task in the scheduler for the next execution */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+#endif
+}
+
+/************************* LED Control functions ********************/
+/**
+* @brief Controls the state of on board LED
+* @param void
+* @retval void
+*/
+void Appli_LedCtrl(void)
+{
+ if(Appli_LedState)
+ {
+ BSP_LED_On(LED_BLUE);
+
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+
+ }
+}
+
+/************* BLE-Mesh library callback functions ***************/
+
+/**
+* @brief Blinks the on board LED
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_LedBlink(void)
+{
+ /* Switch On the LED */
+ Appli_LedState = 1;
+ Appli_LedCtrl();
+ Clock_Wait(500);
+
+ /* Switch Off the LED */
+ Appli_LedState = 0;
+ Appli_LedCtrl();
+ Clock_Wait(500);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Callback function Sets the state of the bulb
+* @param MOBLEUINT16 ctrl which sets the lighting state of LED
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl)
+{
+ /* Switch On the LED */
+ if(ctrl > 0)
+ {
+ Appli_LedState = 1;
+ }
+ /* Switch Off the LED */
+ else
+ {
+ Appli_LedState = 0;
+ }
+
+ Appli_LedCtrl();
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief initializes BLE Stack
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleStackInitCb()
+{
+ /* BLE Stack initialization */
+ /* Not Required in BLE */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Sets transmission power of RF
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetTxPowerCb(void)
+{
+ tBleStatus status;
+ /* API to change the Transmission power of BLE Device */
+ /* uint8_t en_high_power, uint8_t pa_level
+ en_high_power Can be only 0 or 1. Set high power bit on or off.
+ pa_level Can be from 0 to 7. Set the PA level value
+ */
+ status = aci_hal_set_tx_power_level(1, CFG_TX_POWER);
+ if (status)
+ return MOBLE_RESULT_FAIL;
+ else
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief SET UUID value
+* @param uuid_prefix_data : Pointer of UUID buffer data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data)
+{
+ /* UUID is 128 bits (16 bytes) and can guarantee uniqueness across space and time.
+ It can be “Time-based “ UUID or “truly-random or pseudo-random numbers”
+
+ In this buffer user need to fill 10 bytes of UUID data.
+ Remaining 6 bytes, library fill this data with BDaddress.
+
+ For example :
+ F81D4FAE-7DEC-XBC4-Y12F-17D1AD07A961 (16 bytes)
+ <any number> |_| |_| <BDAddress>
+
+ X = 1 i.e. “Time Base UUID”
+ X = 4 i.e. “Random Number“
+ Y = 4 i.e. Conforming to the current spec
+ For UUID information refer RFC4122
+ */
+
+ /* copy UUID prefix data*/
+ uint8_t uuid_buff[10] = {0xF8,0x1D,0x4F,0xAE,0x7D,0xEC};/*random value by user */
+
+ uuid_buff[6] = 0x4B; /* 0x4B => 4 : Random */
+ uuid_buff[7] = 'S' ; /* User define value */
+ uuid_buff[8] = 0xA1; /* 0xA1 => A : Conforming to the current Spec */
+ uuid_buff[9] = 'T' ; /* User define value */
+
+ memcpy(uuid_prefix_data,uuid_buff,sizeof(uuid_buff));
+ memcpy(&uuid_prefix_data[10],bdaddr,6); /* Copy bdaddr to last 6 bytes of UUID */
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief SET CID , PID and VID values
+* @param company_product_info : vendor fill product information in this buffer
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info)
+{
+ /* CID : provide 16-bit company identifier assigned by the Bluetooth SIG */
+ uint16_t company_id = COMPANY_ID;
+
+ /* PID : Provide 16-bit vendor-assigned product identifier */
+ uint16_t product_id = PRODUCT_ID;
+
+ /* VID : Provide 16-bit vendor-assigned product version identifier*/
+ uint16_t product_version_id = PRODUCT_VERSION_ID;
+
+ memcpy(company_product_info + 0,(void *)&company_id,sizeof(company_id));
+ memcpy(company_product_info + 2 ,(void *)&product_id,sizeof(product_id));
+ memcpy(company_product_info + 4 ,(void *)&product_version_id,sizeof(product_version_id));
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Call back function called when GATT Connection Created
+* @param none
+* @retval none
+*/
+void Appli_BleGattConnectionCompleteCb(void)
+{
+ ProvisionFlag = 1;
+ /* Proxy Node, will be called whenever Gatt connection is established */
+ /* Turn ON Red LED*/
+ ProxyFlag = 1;
+ BSP_LED_On(LED_GREEN);
+}
+
+/**
+* @brief Call back function called when GATT Disconnection Complete
+* @param none
+* @retval none
+*/
+void Appli_BleGattDisconnectionCompleteCb(void)
+{
+ ProvisionFlag = 0;
+ /* Proxy Node, will be called whenever Gatt disconnected */
+ /* Turn Off Red LED*/
+ ProxyFlag = 0;
+ BSP_LED_Off(LED_GREEN);
+}
+
+/**
+* @brief Unprovisioned Node Identification
+* @param MOBLEUINT8 data
+* @retval none
+*/
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
+{
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 1;
+#endif
+ TRACE_M(TF_PROVISION,"Unprovisioned Node Identifier received: %02x\n\r", data);
+}
+
+/**
+* @brief Set Number of Elements in a Node
+* @param none
+* @retval Sending the value to BLE Mesh Library
+*/
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
+{
+ if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ {
+ TRACE_M(TF_ELEMENTS,"In version 1.11.00x one Element per node is supported!\r\n");
+ return MAX_NUMB_ELEMENTS;
+ }
+
+ else if(NumberOfElements == 0)
+ {
+ TRACE_M(TF_ELEMENTS,"Number Of Elements must be 1 or greater than 1!\r\n");
+ return 1;
+ }
+
+ else
+ {
+ return NumberOfElements;
+ }
+}
+
+/**
+* @brief Sets the Attention Timer Callback function
+* @param none
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_BleAttentionTimerCb(void)
+{
+/* avoid printf, if low power feature is supported */
+#if (LOW_POWER_FEATURE == 0)
+ TRACE_M(TF_MISC, " \r\n");
+#endif /* LOW_POWER_FEATURE == 0 */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Call back function to give Output OOB information
+* @param MOBLEUINT8* output_oob
+* @param MOBLEUINT8 size
+* @retval void
+*/
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size)
+{
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ uint32_t ooBData = 0;
+ for (MOBLEUINT8 i = 0; i < size; i++)
+ {
+ ooBData |= (output_oob[i] << 8*i);
+ }
+ OutputOobData = ooBData;
+ TRACE_M(TF_PROVISION,"Output OOB information for provisioner: %ld\n\r", ooBData);
+ #endif
+}
+
+
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+/**
+* @brief Process for both output and Input OOB handling
+* @param void
+* @retval void
+*/
+void Appli_OobAuthenticationProcess(void)
+{
+ if(OutputOobBlinkCount < OutputOobData)
+ {
+ OutputOobBlinkCount++;
+ Appli_LedBlink();
+ }
+ else
+ {
+ OutputOobBlinkCount++;
+ Clock_Wait(1000);
+ if(OutputOobBlinkCount > OutputOobData+3)
+ {
+ OutputOobBlinkCount = 0;
+ }
+ }
+}
+#endif
+
+
+/**
+* @brief Call back function to provide Input OOB information
+* @param MOBLEUINT8 size
+* @retval MOBLEUINT8*
+*/
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
+{
+#if defined (ENABLE_AUTH_TYPE_INPUT_OOB) && (ENABLE_SERIAL_INTERFACE)
+ MOBLEUINT16 inputTimer = 0;
+ TRACE_M(TF_PROVISION,"Input OOB information for provisioner-Size: %d\n\r", size);
+ while(1)
+ {
+ Serial_InterfaceProcess();
+ /* Check if input is completed or timeout */
+ if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
+ {
+ inputOOBDataReady = 0;
+ break;
+ }
+ Clock_Wait(100);
+ inputTimer++;
+ }
+ return InputOobData;
+#else
+ return NULL;
+#endif
+}
+
+
+/**
+* @brief Call back function to provide Input OOB information
+* @param rcvdStringBuff: buffer to store input string
+* @param rcvdStringSize: length of the input string
+* @retval void
+*/
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+ unsigned long long InputOobDatatemp;
+ sscanf(rcvdStringBuff + 5, "%lld", &InputOobDatatemp);
+ memmove(&InputOobData, &InputOobDatatemp, sizeof(InputOobDatatemp));
+ inputOOBDataReady = 1;
+#endif
+}
+
+
+/**
+* @brief Application BLE Disable Filter
+* @param none
+* @retval Status is replied
+*/
+MOBLEUINT8 Appli_BleDisableFilterCb(void)
+{
+ return DisableFilter;
+}
+
+/**
+* @brief Checks and do Manual Unprovision of board
+* @param void
+* @retval void
+*/
+void Appli_CheckForUnprovision(void)
+{
+ /* Checks if the User button is pressed or not at the startup */
+ if (BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED)
+ {
+ BSP_LED_On(LED_BLUE);
+ tClockTime t = Clock_Time();
+ int interrupted = 0;
+
+ /*Wait to check if user is pressing the button persistently*/
+ while ((Clock_Time() - t) < MANUAL_UNPROVISION_TIMER)
+ {
+ if (BSP_PB_GetState(BUTTON_SW1) != BUTTON_PRESSED)
+ {
+ interrupted = 1;
+ break;
+ }
+ }
+ /* Unprovision, show that unprovisioning is completed, and
+ wait until user releases button*/
+ if (!interrupted)
+ {
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+ t = Clock_Time();
+ while ((Clock_Time() - t) < FLASH_ERASE_TIME)
+ {
+ BLEMesh_Process();
+ }
+
+ while (BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED)
+ {
+ Appli_LedBlink();
+ }
+ }
+ BSP_LED_Off(LED_BLUE);
+ NVIC_SystemReset();
+ }
+
+ /* Register the task for all MESH dedicated processes */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_REQ_ID, UTIL_SEQ_RFU, Mesh_Task );
+ /* Set the task in the scheduler for the next scheduling */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+#else
+ BleProcessInit = 1;
+#endif
+
+ /* Register the task for all MESH dedicated processes */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_APPLI_REQ_ID, UTIL_SEQ_RFU, Appli_Task );
+ /* Set the task in the scheduler for the next scheduling */
+#if (LOW_POWER_FEATURE == 0)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+
+#if (APPLI_OPTIM == 1)
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &appliTaskTimer_Id, hw_ts_Repeated, AppliMeshTask);
+
+ HW_TS_Start(appliTaskTimer_Id, APPLI_MESH_TIMER_INTERVAL);
+#endif
+}
+
+void Appli_Unprovision(void)
+{
+ if(!ProxyFlag)
+ {
+ /* No GATT connection */
+ BLEMesh_Unprovision();
+
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+ MoblePalNvmErase(APP_NVM_BASE, 0);
+ MoblePalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+}
+
+/**
+* @brief Checks and updates Mac address to generate MAC Address
+* @param void
+* @retval MOBLEUINT8 sum return the sum calculated mac
+*/
+int Appli_CheckBdMacAddr(void)
+{
+ MOBLEUINT8 sum = 239;
+ MOBLEUINT8 result = 0;
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ memcpy(bdaddr, (MOBLEUINT8 *)CFG_ADV_BD_ADDRESS, 7);
+ bdaddr[7] = (EXTERNAL_MAC_ADDR_MGMT | EXTERNAL_MAC_TYPE);
+#endif
+
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+ aci_hal_read_config_data(0x00, &bdaddr[7], bdaddr);
+ Appli_GetMACfromUniqueNumber();
+ bdaddr[7] = INTERNAL_UNIQUE_NUMBER_MAC;
+#endif
+
+ for (int i = 0; i < 6; ++i)
+ {
+ sum = (sum << 1) + bdaddr[i];
+ }
+
+ if (sum == bdaddr[6])
+ {
+ result = 1;
+ }
+
+#if defined(EXTERNAL_MAC_ADDR_MGMT) && defined(EXTERNAL_MAC_IS_PUBLIC_ADDR)
+ /* Do nothing for modification of 2 MSb */
+#else
+ bdaddr[5] |= 0xC0; /* 2 Msb bits shall be 11b for Static Random Address */
+#endif
+
+#ifdef GENERATE_STATIC_RANDOM_MAC
+ bdaddr[7] = GENERATE_STATIC_RANDOM_MAC;
+ /* Do nothing for bdaddr, just pass the identification */
+ result = 1; /* This will overwrite the above for loop result,
+ which is redundant for this case */
+#endif
+
+ return result;
+}
+
+
+/**
+* @brief Reads the unique serial number of the device
+* @param void
+* @retval void
+*/
+#ifdef INTERNAL_UNIQUE_NUMBER_MAC
+static void Appli_GetMACfromUniqueNumber(void)
+{
+#ifdef STM32L152xE
+ /************************STM32L152RE 96 bit Unique ID addresses***************/
+#define DEVICE_ID_REG0 (0x1FF800D0)
+#define DEVICE_ID_REG1 (0x1FF800D4)
+#define DEVICE_ID_REG2 (0x1FF800E4)
+#endif
+
+ /*
+ The unique serial number is a six bytes value generated from STM32 UID
+ stored at DEVICE_ID_REG0, DEVICE_ID_REG1 and DEVICE_ID_REG2. It is generated
+ cancating 4bytes from DEVICE_ID_REG2 and first bytes of DEVICE_ID_REG0 and
+ DEVICE_ID_REG1. Since the UID at DEVICE_ID_REG0 and
+ DEVICE_ID_REG1 could be identical for same batch samples,
+ 4 bytes have been taken from DEVICE_ID_REG2
+ */
+
+ uint8_t i;
+ uint8_t sum = 239;
+#if 0
+ uint8_t *ls_addr;
+
+ ls_addr = (uint8_t*)DEVICE_ID_REG2;
+
+ for(i = 0; i < 4; i += 1)
+ {
+ bdaddr[i] = *ls_addr;
+ ls_addr++;
+ }
+
+ bdaddr[4] = *(uint8_t*)(DEVICE_ID_REG0);
+ bdaddr[5] = (*(uint8_t*)(DEVICE_ID_REG1)) | 0xC0;
+#endif
+ /* Static Device Address:
+ The two most significant bits
+ of the address shall be equal to 1,
+ hence ORed with 0xC0)*/
+
+ for (i = 0; i < 6; ++i)
+ {
+ sum = (sum << 1) + bdaddr[i];
+ }
+ bdaddr[6] = sum;
+}
+#endif
+
+
+#if 0
+/**
+* @brief provides the information of the power saving mode
+* @param sleepMode curently unused, to be used in future
+* @retval SleepModes returns the mode of the controller
+*/
+SleepModes App_SleepMode_Check(SleepModes sleepMode)
+{
+ if (buttonState == BS_OFF)
+ {
+ return SLEEPMODE_WAKETIMER;
+ }
+ else
+ {
+ return SLEEPMODE_RUNNING;
+ }
+}
+#endif
+
+/**
+* @brief callback for unprovision the node by provisioner.
+* @param status reserved for future
+* @retval void
+*/
+void BLEMesh_UnprovisionCallback(MOBLEUINT8 reason)
+{
+ ProvisionFlag = 0;
+ TRACE_I(TF_PROVISION,"Device is unprovisioned by provisioner \n\r");
+#if PB_ADV_SUPPORTED
+ BLEMesh_SetUnprovisionedDevBeaconInterval(PBADV_UNPROV_DEV_BEACON_INTERVAL);
+#endif
+ AppliNvm_ClearModelState();
+}
+
+/**
+* @brief This function scans and prints unprovisioned devices
+* @param unprovDeviceArray: Pointer of an array for filling unprovisioned device UUIDs
+* @param noOfUnprovDevices: Pointer to take total count of nearby unprovisioned devices
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices)
+{
+ MOBLE_RESULT result;
+
+ result = BLEMesh_GetNeighborState(unprovDeviceArray,noOfUnprovDevices);
+ /* Array print for testing */
+ /* Check if any unprovisioned device is available */
+ if(!(*noOfUnprovDevices))
+ {
+ TRACE_I(TF_PROVISION,"No Unprovisioned Device Nearby\r\n");
+ }
+ else
+ {
+ for(MOBLEINT8 count=0; count < *noOfUnprovDevices; count++)
+ {
+ BLEMesh_PrintStringCb("");
+ TRACE_I(TF_PROVISION,"Device-%d -> ", count);
+ BLEMesh_PrintDataCb(unprovDeviceArray[count].uuid, 16);
+ }
+ }
+ return result;
+}
+/**
+* @brief This function returns starts the provisioning of one of the devices
+* @param unprovDeviceArray: Pointer of an array having unprovisioned device UUIDs
+* @param index: Index of the device to be provisioned
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ result = BLEMesh_ProvisionRemote((unprovDeviceArray+index)->uuid);
+
+ return result;
+}
+
+/* Customized implementation for provisioning a device from mesh node - End */
+
+/**
+* @brief Call back function called when PB-ADV link Opened
+* @param none
+* @retval none
+*/
+void BLEMesh_PbAdvLinkOpenCb(void)
+{
+ ProvisionFlag = 0;
+ TRACE_M(TF_PROVISION,"PB-ADV Link opened successfully \n\r");
+ /* Turn ON Red LED*/
+#if LOW_POWER_FEATURE
+ /* do nothing */
+#else
+ BSP_LED_On(LED_RED);
+#endif
+}
+
+
+/**
+* @brief Call back function called when PB-ADV link Closed
+* @param none
+* @retval none
+*/
+void BLEMesh_PbAdvLinkCloseCb(void)
+{
+ TRACE_M(TF_PROVISION,"PB-ADV Link Closed successfully \n\r");
+ /* Turn Off Red LED*/
+#if LOW_POWER_FEATURE
+ /* do nothing */
+#else
+ BSP_LED_Off(LED_RED);
+#endif
+}
+
+
+/**
+* @brief callback for provision the node by provisioner.
+* @param void
+* @retval void
+*/
+void BLEMesh_ProvisionCallback(void)
+{
+ ProvisionFlag = 1;
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ PrvngInProcess = 0;
+#endif
+ TRACE_I(TF_PROVISION,"Device is provisioned by provisioner \r\n");
+
+#if (LOW_POWER_FEATURE == 1)
+ /* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
+ HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
+#endif
+}
+
+
+/**
+* @brief callback for friendship established by friend node
+* @param address of corresponding low power node
+* @param receive delay of low power node (unit ms)
+* @param poll timeout of low power node (unit 100ms)
+* @param number of elements of low power node
+* @param previous friend address of low power node (can be invalid address)
+* @retval void
+*/
+void BLEMesh_FnFriendshipEstablishedCallback(MOBLE_ADDRESS lpnAddress,
+ MOBLEUINT8 lpnReceiveDelay,
+ MOBLEUINT32 lpnPollTimeout,
+ MOBLEUINT8 lpnNumElements,
+ MOBLE_ADDRESS lpnPrevFriendAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship established. Low power node address 0x%.4X \r\n", lpnAddress);
+ TRACE_M(TF_LPN_FRND,"Low power node receive delay %dms \r\n", lpnReceiveDelay);
+ TRACE_M(TF_LPN_FRND,"Low power node poll timeout %ldms \r\n", lpnPollTimeout*100);
+ TRACE_M(TF_LPN_FRND,"Low power node number of elements %d \r\n", lpnNumElements);
+ if (lpnPrevFriendAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_LPN_FRND,"Low power node previous friend address 0x%.4X \r\n", lpnPrevFriendAddress);
+ }
+}
+
+/**
+* @brief callback for friendship clear by friend node
+* @param reason of friendship clear
+* 0: reserved,
+* 1: friend request received from existing low power node (friend)
+* 2: low power node poll timeout occurred
+* 3: friend clear received
+* @param previous friend address of low power node (can be invalid address)
+* @retval void
+*/
+void BLEMesh_FnFriendshipClearedCallback(MOBLEUINT8 reason, MOBLE_ADDRESS lpnAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship cleared. Low power node address 0x%.4X \r\n", lpnAddress);
+
+ switch(reason)
+ {
+ case FN_CLEARED_REPEAT_REQUEST:
+ TRACE_M(TF_LPN_FRND,"Reason: New friend request received from existing low power node \r\n");
+ break;
+ case FN_CLEARED_POLL_TIMEOUT:
+ TRACE_M(TF_LPN_FRND,"Reason: Low power node poll timeout occurred \r\n");
+ break;
+ case FN_CLEARED_FRIEND_CLEAR:
+ TRACE_M(TF_LPN_FRND,"Reason: Friend clear received \r\n");
+ break;
+ default:
+ TRACE_M(TF_LPN_FRND,"Reason: Invalid \r\n");
+ break;
+ }
+}
+
+/**
+* @brief callback for friendship established by low power node
+* @param address of corresponding friend node
+* @retval void
+*/
+void BLEMesh_LpnFriendshipEstablishedCallback(MOBLE_ADDRESS fnAddress)
+{
+ /* Friendship established */
+ TRACE_M(TF_LPN_FRND,"Friend node responding, friendship established.\r\n");
+}
+
+/**
+* @brief callback for friendship cleare by low power node
+* @param reason of friendship clear.
+* 0: reserved
+* 1: No response received from friend node
+* @retval void
+*/
+void BLEMesh_LpnFriendshipClearedCallback(MOBLEUINT8 reason, MOBLE_ADDRESS fnAddress)
+{
+ TRACE_M(TF_LPN_FRND,"Friendship cleared. Friend node address 0x%.4x \r\n", fnAddress);
+
+ if (reason == LPN_CLEARED_NO_RESPONSE)
+ {
+ TRACE_M(TF_LPN_FRND,"Reason: Friend node not responding \r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LPN_FRND,"Reason: Invalid \r\n");
+ }
+}
+
+/**
+* @brief New neighbor appeared callback in neighbor table.
+ If MAC address of neighbor changes it appears as new neighbor.
+* @param MAC address of neighbor.
+* is neighbor provisioned or unprovisioned device.
+* uuid of neighbor. NULL if not available
+* network address of neighbor. MOBLE_ADDRESS_UNASSIGNED if not available
+* last updated rssi value.
+* @retval void
+*/
+void BLEMesh_NeighborAppearedCallback(const MOBLEUINT8* bdAddr,
+ MOBLEBOOL provisioned,
+ const MOBLEUINT8* uuid,
+ MOBLE_ADDRESS networkAddress,
+ MOBLEINT8 rssi)
+{
+ TRACE_M(TF_NEIGHBOUR,"New neighbor appeared. Neighbor MAC address:");
+
+ for (MOBLEUINT8 count=0 ; count<6; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", bdAddr[count]);
+ }
+
+ if (provisioned == MOBLE_TRUE)
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Provisioned node. \n\r");
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Unprovisioned device. \n\r");
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"rssi: %d. ", rssi);
+
+ if (networkAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address: 0x%.4x\n\r", networkAddress);
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address not available\n\r");
+ }
+
+ for (MOBLEUINT8 i=0; i<16; i++)
+ {
+ if (uuid[i] == 0x00)
+ {
+ continue;
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"UUID: ");
+
+ for (MOBLEUINT8 count=0 ; count<16; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", uuid[count]);
+ }
+
+ break;
+ }
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"\n\r");
+}
+
+/**
+* @brief Existing neighbor refreshed callback in neighbor table.
+ If MAC address of neighbor changes it appears as new neighbor.
+* @param MAC address of neighbor.
+* is neighbor provisioned or unprovisioned device.
+* uuid of neighbor. NULL if not available
+* network address of neighbor. MOBLE_ADDRESS_UNASSIGNED if not available
+* last updated rssi value.
+* @retval void
+*/
+void BLEMesh_NeighborRefreshedCallback(const MOBLEUINT8* bdAddr,
+ MOBLEBOOL provisioned,
+ const MOBLEUINT8* uuid,
+ MOBLE_ADDRESS networkAddress,
+ MOBLEINT8 rssi)
+{
+ TRACE_M(TF_NEIGHBOUR,"Existing neighbor refreshed. Neighbor MAC address:");
+
+ for (MOBLEUINT8 count=0 ; count<6; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", bdAddr[count]);
+ }
+
+ if (provisioned == MOBLE_TRUE)
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Provisioned node. \n\r");
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"-> Unprovisioned device. \n\r");
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"rssi: %d. ", rssi);
+
+ if (networkAddress != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address: 0x%.4x\n\r", networkAddress);
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"Network address not available\n\r");
+ }
+
+ for (MOBLEUINT8 i=0; i<16; i++)
+ {
+ if (uuid[i] == 0x00)
+ {
+ continue;
+ }
+ else
+ {
+ TRACE_M(TF_NEIGHBOUR,"UUID: ");
+
+ for (MOBLEUINT8 count=0 ; count<16; count++)
+ {
+ TRACE_M(TF_NEIGHBOUR,"%.2x ", uuid[count]);
+ }
+
+ break;
+ }
+ }
+
+ TRACE_M(TF_NEIGHBOUR,"\n\r");
+}
+
+/**
+* @brief Beacon received callback
+* Beacons are received only if received beacon ad type is not
+* Mesh Message, Mesh Beacon or PB-ADV
+* @param MAC address
+* data
+* length of beacon
+* rssi value of beacon
+* @retval void
+*/
+#if (ENABLE_CUSTOM_BEACON == 1)
+/* BLEMesh_CustomBeaconReceivedCallback high frequency callback */
+void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
+ const MOBLEUINT8* data,
+ MOBLEUINT8 length,
+ MOBLEINT8 rssi)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (length < 2)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_BEACON, "Message is too small \r\n");
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if ((length-1) < data[0])
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
+ }
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ MOBLEUINT8 adType = data[1];
+ MOBLEUINT8 i;
+
+ if (adType == CUSTOM_BEACON_AD_TYPE)
+ {
+ TRACE_M(TF_BEACON, "Message length(%d), ad type(0x%.2x), rssi(%d) \r\n", length-2, adType, rssi);
+ TRACE_M(TF_BEACON, "Message:\r\n");
+ for(i = 0; i < length-2; i++)
+ TRACE_M(TF_BEACON, "data[%d]= %d\r\n", i, data[2+i]);
+ }
+ else
+ {
+ /* Discard, Ad type mismatch */
+ }
+ }
+}
+#endif /* BLEMesh_CustomBeaconReceivedCallback high frequency callback */
+
+/**
+* @brief Custom beacon generator
+* If size set to > 31 bytes, beacon is rejected
+* BLEMesh_SetCustomBeaconInterval should be set to get this callback
+* @param beacon data buffer. It includes length and AD type fields
+* buffer size
+* @retval void
+*/
+void BLEMesh_CustomBeaconGeneratorCallback(void* buffer, MOBLEUINT8* size)
+{
+ MOBLEUINT8 adType = CUSTOM_BEACON_AD_TYPE;
+ MOBLEUINT8 dataLength = 5;
+ MOBLEUINT8 data[5] = {0x00,0x01,0x02,0x03,0x04};
+ MOBLEUINT8* buf = (MOBLEUINT8*)buffer;
+
+ buf[0] = dataLength+1;
+ buf[1] = adType;
+ memcpy(buf+2, data, dataLength);
+
+ *size = dataLength+2;
+}
+
+/**
+* @brief Low Power mode process
+* If low power feature is supported, device enables low power mode
+* @param void
+* @retval void
+*/
+void Appli_LowPowerProcess(void)
+{
+#if 0
+#if LOW_POWER_FEATURE
+ BluenrgMesh_sleepTime = (MOBLEINT32)BluenrgMesh_GetSleepDuration();
+
+ if (BluenrgMesh_sleepTime > 0)
+ {
+ /* Timer 0 used for low power */
+ HAL_VTimerStart_ms(0, BluenrgMesh_sleepTime);
+
+ /* To start virtual timer */
+ BTLE_StackTick();
+
+ /* save virtual timer current count */
+ SysRefCount = HAL_VTimerGetCurrentTime_sysT32();
+
+ /* wakeup either from io or virtual timer */
+ BlueNRG_Sleep(SLEEPMODE_WAKETIMER, WAKEUP_IO13, WAKEUP_IOx_LOW);
+
+ /* update systick count based on updated virtual timer count */
+ Set_Clock_Time(Clock_Time() +
+ HAL_VTimerDiff_ms_sysT32(HAL_VTimerGetCurrentTime_sysT32(), SysRefCount));
+
+ /* Stop Timer 0 */
+ HAL_VTimer_Stop(0);
+ }
+#endif /* LOW_POWER_FEATURE */
+#endif
+}
+
+/**
+* @brief Appli_IntensityControlPublishing:Function is used to set the intensity value.
+* Publishing the value.
+* @param void
+* @retval void
+*/
+void Appli_IntensityControlPublishing(MOBLEUINT8* value)
+{
+
+ if(IntensityFlag == FALSE)
+ {
+
+ IntensityValue = IntensityValue + (INTENSITY_LEVEL_FULL/5);
+ value[0] = (MOBLEUINT8)IntensityValue;
+ value[1] = (MOBLEUINT8)(IntensityValue >> 8) ;
+
+ if(IntensityValue >= INTENSITY_LEVEL_FULL)
+ {
+ IntensityFlag = TRUE;
+ }
+
+ }
+ else
+ {
+
+ IntensityValue = IntensityValue - (INTENSITY_LEVEL_FULL/5);
+ value[0] = (MOBLEUINT8)IntensityValue;
+ value[1] = (MOBLEUINT8)(IntensityValue >> 8) ;
+
+ if(IntensityValue <= INTENSITY_LEVEL_ZERO)
+ {
+ IntensityFlag = FALSE;
+ }
+
+ }
+}
+
+
+/**
+* @brief Publish the intensity value for generic level or light lightness
+* This function should be called in main loop
+* @param void
+* @retval void
+*/
+void IntensityPublish(void)
+{
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ Appli_LightClient_Lightness_Set();
+#endif
+
+#ifdef GENERIC_CLIENT_MODEL_PUBLISH
+ Appli_GenericClient_Level_Set_Unack();
+#endif
+}
+
+/**
+* @brief Application processing
+* This function should be called in main loop
+* @param void
+* @retval void
+*/
+void Appli_Process(void)
+{
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ AppliNvm_Process();
+#endif
+
+ Appli_LowPowerProcess();
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ if(PrvngInProcess)
+ {
+#if USER_OUTPUT_OOB_APPLI_PROCESS
+ Appli_OobAuthenticationProcess();
+#endif
+ }
+#endif
+
+#ifdef TPT_LAYER_BUSY_TEST
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ //SdkEvalLedOn(LED1);
+ }
+ else
+ {
+ //SdkEvalLedOff(LED1);
+ }
+#endif
+}
+
+#if PB_ADV_SUPPORTED
+static void UnprovisionedDeviceBeaconApp(void)
+{
+ BLEMesh_SetUnprovisionedDevBeaconInterval(0);
+}
+
+static void UnprovisionedDeviceBeaconTask(void)
+{
+ /**
+ * The code shall be executed in the background as aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_BEACON_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+#if (APPLI_OPTIM == 1)
+static void AppliMeshTask(void)
+{
+ /* Set the task in the scheduler for the next execution */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+static void AppliMeshSW1Task(void)
+{
+ Appli_UpdateButtonState(BSP_PB_GetState(BUTTON_SW1) == BUTTON_PRESSED);
+
+ return;
+}
+
+#if (LOW_POWER_FEATURE == 1)
+static void LowPowerNodeApiApp(void)
+{
+ TRACE_I(TF_PROVISION,"Scan disabled \r\n");
+ BLEMesh_LpnDisableScan();
+ return;
+}
+
+static void LowPowerNodeApiTask(void)
+{
+ /* Set the task in the scheduler for the next execution */
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_LPN_REQ_ID, CFG_SCH_PRIO_0);
+
+ return;
+}
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+/**
+* @brief function to inintiallise the GPIO interrupt fot Power down
+* @param void
+* @retval void
+*/
+static void GPIO_InitNVICPowerOff(void)
+{
+ GPIO_InitTypeDef gpioinitstruct = {0};
+
+ /* Enable the PowerOff GPIO Clock */
+ POWEROFF_GPIO_CLK_ENABLE();
+
+ /* Configure PowerOff pin as input with External interrupt */
+ gpioinitstruct.Pin = POWEROFF_PIN;
+ gpioinitstruct.Pull = GPIO_PULLUP;
+ gpioinitstruct.Mode = GPIO_MODE_IT_FALLING;
+ HAL_GPIO_Init(POWEROFF_GPIO_PORT, &gpioinitstruct);
+
+ /* Enable and set PowerOff EXTI Interrupt to the lowest priority */
+ HAL_NVIC_SetPriority((IRQn_Type)(POWEROFF_EXTI_IRQn), 0x0F, 0x00);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(POWEROFF_EXTI_IRQn));
+}
+#endif
+
+/**
+* @brief Initializes the Application
+* @param void
+* @retval void
+*/
+void Appli_Init(MOBLEUINT8 *flag)
+{
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+ /* Hardware Factory Restore implementation */
+ AppliNvm_FactorySettingReset();
+#endif
+
+#if PB_ADV_SUPPORTED
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_BEACON_REQ_ID, UTIL_SEQ_RFU, UnprovisionedDeviceBeaconApp );
+ /**
+ * Create Timer to control unprovisioned device beacons
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &discoverTimer_Id, hw_ts_SingleShot, UnprovisionedDeviceBeaconTask);
+
+ HW_TS_Start(discoverTimer_Id, DISCOVER_TIMER_INTERVAL);
+#endif
+
+#if ENABLE_SERIAL_INTERFACE
+ Serial_Init();
+#endif
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+ GPIO_InitNVICPowerOff();
+#endif
+
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
+ __HAL_RCC_TIM1_CLK_ENABLE();
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ PWM_Init();
+#endif
+
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
+
+#if (ENABLE_CUSTOM_BEACON == 1)
+ BLEMesh_SetCustomBeaconInterval(CUSTOM_BEACON_INTERVAL);
+#endif
+
+#if (LOW_POWER_FEATURE == 1) /**
+ * Create Timer to control unprovisioned device beacons
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &lowPowerNodeApiTimer_Id, hw_ts_SingleShot, LowPowerNodeApiTask);
+
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_LPN_REQ_ID, UTIL_SEQ_RFU, LowPowerNodeApiApp );
+#endif
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h
new file mode 100644
index 000000000..ad831f2cd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * @file appli_mesh.h
+ * @author BLE Mesh Team
+ * @brief Header file for the user application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_MESH_H
+#define __APPLI_MESH_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "mesh_cfg_usr.h"
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* MACROS for Power Level definitions */
+#define POWER_LEVEL_LOW 0
+#define TX_POWER_LEVEL_MINUS_18DBM 0 /* = -18 dBm, */
+#define TX_POWER_LEVEL_MINUS_15DBM 1 /* = -15 dBm, */
+#define TX_POWER_LEVEL_MINUS_12DBM 2 /* = -12 dBm, */
+#define TX_POWER_LEVEL_MINUS_9DBM 3 /* = -9 dBm, */
+#define TX_POWER_LEVEL_MINUS_6DBM 4 /* = -6 dBm, */
+#define TX_POWER_LEVEL_MINUS_2DBM 5 /* = -2 dBm, */
+#define TX_POWER_LEVEL_0DBM 6 /* = 0 dBm, */
+#define TX_POWER_LEVEL_PLUS_5DBM 7 /* = 5 dBm. */
+#define POWER_LEVEL_HIGH 1
+#define TX_POWER_LEVEL_MINUS_14DBM 0 /* = -14 dBm, */
+#define TX_POWER_LEVEL_MINUS_11DBM 1 /* = -11 dBm, */
+#define TX_POWER_LEVEL_MINUS_8DBM 2 /* = -8 dBm, */
+#define TX_POWER_LEVEL_MINUS_5DBM 3 /* = -5 dBm, */
+#define TX_POWER_LEVEL_PLUS_2DBM 5 /* = 2 dBm, */
+#define TX_POWER_LEVEL_PLUS_4DBM 6 /* = 4 dBm, */
+#define TX_POWER_LEVEL_PLUS_8DBM 7 /* = 8 dBm */
+
+#ifdef SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
+#define POWEROFF_PIN GPIO_PIN_12
+#define POWEROFF_GPIO_PORT GPIOB
+#define POWEROFF_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define POWEROFF_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define POWEROFF_EXTI_LINE GPIO_PIN_12
+#define POWEROFF_EXTI_IRQn EXTI15_10_IRQn
+#endif
+
+typedef enum _prvn_nvm_state
+{
+ NVM_INIT = 0,
+ NVM_SAVE_PENDING,
+} prvn_nvm_state;
+
+/* Exported variables ------------------------------------------------------- */
+
+extern MOBLEUINT8 bdaddr[];
+
+typedef struct
+{
+ MOBLEUINT16 nodeAddress;
+ MOBLEUINT8 numOfElements;
+ MOBLEUINT8 Reserved1; /* For Alignment by 4*/
+ MOBLEUINT16 newNodeAddress;
+ MOBLEUINT8 newNodeElements;
+ prvn_nvm_state saveToNVM;
+ MOBLEUINT8 NewProvNodeDevKey[DEVICE_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeAppKey[APP_KEY_SIZE];
+ MOBLEUINT8 NewProvNodeUUID[UUID_SIZE];
+} NodeUnderProvisionParam_t;
+
+extern NodeUnderProvisionParam_t NodeUnderProvisionParam;
+extern MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_SIG_MODELS_MAX_COUNT];
+extern MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_BleStackInitCb(void);
+MOBLE_RESULT Appli_BleSetTxPowerCb(void);
+MOBLE_RESULT Appli_BleSetUUIDCb(MOBLEUINT8 *uuid_prefix_data);
+MOBLE_RESULT Appli_BleSetProductInfoCB(MOBLEUINT8 *company_product_info);
+void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data);
+void Appli_BleGattConnectionCompleteCb(void);
+void Appli_BleGattDisconnectionCompleteCb(void);
+MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void);
+MOBLE_RESULT Appli_BleAttentionTimerCb(void);
+void Appli_BleOutputOOBAuthCb(MOBLEUINT8* output_oob, MOBLEUINT8 size);
+MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size);
+void Appli_BleSerialInputOOBValue(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLEUINT8 Appli_BleDisableFilterCb(void);
+void BLEMesh_PbAdvLinkCloseCb(void);
+void Appli_IntensityControlPublishing(MOBLEUINT8* value);
+
+int Appli_CheckBdMacAddr(void);
+MOBLE_RESULT Appli_LedBlink(void);
+MOBLE_RESULT Appli_LedStateCtrlCb(MOBLEUINT16 ctrl);
+
+void Appli_CheckForUnprovision(void);
+void Appli_Unprovision(void);
+void Appli_Process(void);
+void Appli_LedCtrl(void);
+void Appli_Init(MOBLEUINT8 *flag);
+
+MOBLE_ADDRESS GetAddressToConfigure(void);
+MOBLE_ADDRESS GetNewAddressToProvision(void);
+void SaveProvisionedNodeAddress(void);
+MOBLEUINT8* GetNewProvNodeDevKey(void);
+MOBLEUINT8* GetNewProvNodeAppKey(void);
+void IntensityPublish(void);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
+void Start_SelfConfiguration (void);
+void Appli_ProvisionerInit(void);
+
+
+#endif /* __APPLI_MESH_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c
new file mode 100644
index 000000000..8a166ac49
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c
@@ -0,0 +1,621 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.c
+ * @author BLE Mesh Team
+ * @brief User Application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include <string.h>
+#include "hal_common.h"
+#include "ble_mesh.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "mesh_cfg.h"
+#include "pal_nvm.h"
+#include "appli_mesh.h"
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+#include "common.h"
+#endif
+#if (LOW_POWER_FEATURE == 1)
+#include "app_conf.h"
+#include "stm32_seq.h"
+#endif
+#include "config_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+/* Private define ------------------------------------------------------------*/
+
+extern const MOBLEUINT8* _bdaddr[];
+
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+extern MOBLEUINT8 PowerOnOff_flag;
+#endif
+
+extern const void* appNvmBase;
+
+
+/*
+* Page of size 4k, STM32WB, reserved for application is divided into 16 subpages of each 256 bytes
+* First subpage is reserved (for e.g. External MAC is present in this area)
+* Rest 15 subpages are used on rolling basis for application states.
+* First byte of each subpage indicates if page is valid or not
+*/
+
+#define APP_NVM_RESERVED_SIZE 256U
+#define APP_NVM_SUBPAGE_SIZE 256U
+#define APP_NVM_MAX_SUBPAGE 15U
+#define APP_NVM_SUBPAGE_OFFSET(i) (unsigned int)(APP_NVM_SUBPAGE_SIZE + APP_NVM_SUBPAGE_SIZE*(i))
+
+/* offsets defined wrt start of subpage */
+#define APP_NVM_VALID_FLAG_OFFSET 0U
+#define APP_NVM_VALID_FLAG_SIZE 4U
+#define APP_NVM_RESET_COUNT_OFFSET (unsigned int)APP_NVM_VALID_FLAG_SIZE
+#define APP_NVM_RESET_COUNT_SIZE 12U /* 12 bytes reserved for write cycle optimization */
+#define APP_NVM_GENERIC_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE)
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_OFFSET (unsigned int)(APP_NVM_VALID_FLAG_SIZE+APP_NVM_RESET_COUNT_SIZE+APP_NVM_GENERIC_MODEL_SIZE)
+#define APP_NVM_LIGHT_MODEL_SIZE 16U
+
+#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+
+/* Private variables ---------------------------------------------------------*/
+
+typedef struct
+{
+ MOBLEUINT8 modelData[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE];
+ MOBLEBOOL erasePageReq;
+ MOBLEBOOL writeReq;
+} APPLI_NVM_REQS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+
+MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+
+#if 0
+/**
+* @brief This function erases a specified flash page
+* @param Page Number
+* @retval MOBLE_RESULT_INVALIDARG if PageNumber overflow
+* MOBLE_RESULT_FALSE if flash operation is very close to next radio event
+* MOBLE_RESULT_FAIL if flash command error is set
+* MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
+{
+ MOBLE_RESULT result;
+
+ if (PageNumber < N_PAGES)
+ {
+ BLEMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ result = MoblePalNvmErase(APP_NVM_BASE, 0);
+ ATOMIC_SECTION_END();
+ }
+ else /* Invalid page no */
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+
+ return result;
+}
+#endif
+
+/**
+* @brief Program word (32-bit) at a APP_NVM_BASE + APP_NVM_RESERVED_SIZE
+* @param TypeProgram Indicate the way to program at a specified address
+* @param Address: address to write
+* @param Data: word to write
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (offset > PAGE_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > (APP_NVM_BASE + PAGE_SIZE))
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ result = MoblePalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Mark first valid subpage as invalid.
+* @param void
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void)
+{
+ MOBLEUINT32 valid = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEINT16 currSubPageIdx;
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+
+ /* find valid subpage */
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+
+ if (result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ }
+ else
+ {
+ /* mark valid subpage as invalid */
+ memcpy((void*)subPageTemp,
+ (void*)(PRVN_NVM_BASE_OFFSET + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else if (result == MOBLE_RESULT_FALSE)
+ {
+ /* radio busy, try again later */
+ }
+ else
+ {
+ /* do nothing */
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief This function writes Reset count value in flash at APP_NVM_BASE + APP_NVM_RESERVED_SIZE
+* if device has been turned ON 5 times consecutively with each ON duration < 2s, reset to factory settings
+* LED blinks 2 times to indicate device startup without reset
+* LED blinks 5 times to indicate reset at device startup
+* @param void
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FactorySettingReset(void)
+{
+ MOBLEINT16 currSubPageIdx = 0;
+ MOBLE_RESULT result;
+ MOBLEUINT32 resetCount;
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,APP_NVM_SUBPAGE_SIZE,APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ if(currSubPageIdx > 0)
+ {
+ /* Not the first reset */
+ /* read the previous subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ {
+ /* read the current subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+
+ /* read reset count from the subpage */
+ memcpy((void*)&resetCount,
+ (void*)&(subPageTemp[APP_NVM_RESET_COUNT_OFFSET]),
+ 4);
+ resetCount = resetCount << 1; /* Shifting for making Bits 0 from LSB */
+ memcpy((void*)&(subPageTemp[APP_NVM_RESET_COUNT_OFFSET]), (void*)&resetCount, 4);
+
+ /* Check for "POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING" times, that many bits shall be zero */
+ if (resetCount > MASK_BITS_FOR_POWER_ON_OFF_CYCLES)
+ {
+ /* MASK_BITS_FOR_POWER_ON_OFF_CYCLES = 0xFFFFFFE0 */
+
+ /* update reset count */
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+
+ if (!memcmp((void*)&subPageTemp[APP_NVM_RESET_COUNT_OFFSET],
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_RESET_COUNT_OFFSET),
+ 4))
+ {
+ /* updated value of reset count in flash */
+ }
+
+ /* Blink twice to indicate device startup
+ 1 second to blink once and 2 seconds to blink twice */
+ for (MOBLEUINT8 i=0; i< ON_TIME_IN_SECONDS_FOR_POWER_CYCLING; i++)
+ {
+ Appli_LedBlink();
+ }
+
+ /* Load model data copy from nvm */
+ memcpy((void*)AppliNvm_Reqs.modelData,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else /* Device is forced to factory reset, 5 LSBs are zero */
+ {
+ /* Unprovision node */
+ BLEMesh_Unprovision();
+
+ /* Clear lib data, primary and backup nvm used by BLE-Mesh lib */
+ MoblePalNvmErase(NVM_BASE, 0);
+ MoblePalNvmErase(NVM_BASE, 0x1000);
+
+ AppliNvm_ClearModelState();
+
+ BLEMesh_SetUnprovisionedDevBeaconInterval(100);
+
+ /* Blink 5 times to indicate factory setting reset */
+ for (MOBLEUINT8 i=0; i<BLINK_TIMES_FOR_FACTORY_RESET; i++)
+ {
+ Appli_LedBlink();
+ }
+
+ TRACE_M(TF_MISC, "Reset to factory settings \r\n");
+ }
+
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Save model states in nvm
+* @param model state buff
+* @param model state buff size
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL; /* if save model state not defined, return MOBLE_RESULT_FAIL */
+
+#if (SAVE_MODEL_STATE_NVM == 1)
+
+ if (size > APP_NVM_MODEL_SIZE)
+ {
+ /* incorrect size */
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ memcpy(AppliNvm_Reqs.modelData, state, size);
+
+ AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ }
+#endif /* SAVE_MODEL_STATE_NVM */
+ return result;
+}
+
+
+/**
+* @brief Clear model states in nvm
+* @param none
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_ClearModelState(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL; /* if save model state not defined, return MOBLE_RESULT_FAIL */
+
+#if (SAVE_MODEL_STATE_NVM == 1)
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+ MOBLEINT16 subPageIdx;
+ MOBLEUINT8 clearBuff[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE] = {0};
+ MOBLEUINT32 valid = 0;
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ if(subPageIdx > 1)
+ { /* Not the first subpage */
+ /* clear models states */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ memcpy((void*)&subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET],
+ (void*)(clearBuff),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ { /* First subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ memcpy((void*)&subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET],
+ (void*)(clearBuff),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint32_t*)&subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ }
+#endif /* SAVE_MODEL_STATE_NVM */
+ return result;
+}
+
+
+/**
+* @brief Load Model states from nvm
+* @param model state buff
+* @param model state buff size
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+{
+#if (SAVE_MODEL_STATE_NVM == 1)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
+
+ return result;
+#else /* SAVE_MODEL_STATE_NVM */
+ *size = 0;
+ return MOBLE_RESULT_SUCCESS;
+#endif /* SAVE_MODEL_STATE_NVM */
+}
+
+
+/**
+* @brief Process NVM erase and write requests
+* @param void
+* @retval void
+*/
+void AppliNvm_Process(void)
+{
+ MOBLE_RESULT result;
+ MOBLEINT16 subPageIdx;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+
+ /* Erase if required */
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ {
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
+
+ result = MoblePalNvmErase(APP_NVM_BASE, 0);
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ }
+ else
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
+ AppliNvm_Reqs.writeReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ /* restore reserve area */
+/* FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy); */
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ }
+ }
+ }
+
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
+ && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ {
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+#if (LOW_POWER_FEATURE == 1)
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0);
+#endif
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE];
+ MOBLEUINT32 valid = 0;
+
+ if(subPageIdx > 0)
+ {
+ /* Not the first reset */
+ /* read the previous subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx-1)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+ else
+ {
+ /* read the current subpage */
+ memcpy((void*)&(subPageTemp[0]),
+ (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(subPageIdx)),
+ APP_NVM_SUBPAGE_SIZE);
+ }
+
+ memcpy((void*)&(subPageTemp[APP_NVM_GENERIC_MODEL_OFFSET]),
+ (void*)&(AppliNvm_Reqs.modelData),
+ APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+
+ subPageTemp[APP_NVM_VALID_FLAG_OFFSET] = valid;
+
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx),
+ (uint8_t*)subPageTemp,
+ APP_NVM_SUBPAGE_SIZE);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ }
+ }
+ }
+}
+
+
+/**
+* @brief Fuction used to set the flag which is responsible for storing the
+ states in flash.
+* @param void
+* @retval void
+*/
+void AppliNvm_SaveMessageParam (void)
+{
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+ PowerOnOff_flag = FLAG_SET;
+#endif
+}
+
+
+/**
+* @brief Find first valid subpage available.
+* If no valid subpage found, erase page appli nvm to reset it
+* @param pointer to variable to update first valid subpage index
+* @retval MOBLE_RESULT_SUCCESS on success
+*/
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset)
+{
+ MOBLEUINT32 valid[2];
+ MOBLEINT8 subPageIdx = -1;
+ MOBLEUINT32 *subPageOffset;
+ MOBLEUINT32 addressValidPage;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ for (MOBLEUINT16 count=0; count<totalSubPage; count++)
+ {
+ addressValidPage = nvmBaseOffset + SubPageSize*count;
+ subPageOffset = &addressValidPage;
+
+ /* Read 8 bytes and check if it's Empty */
+ memcpy((void*)&valid, (void*)(*subPageOffset), 8);
+
+ if ((valid[0] == FLASH_EMPTY_SIGNATURE) /*&& (valid[1] == FLASH_EMPTY_SIGNATURE)*/)
+ {
+ subPageIdx = count;
+ break;
+ }
+ }
+
+ if (subPageIdx < 0)
+ {
+ TRACE_M(TF_PROVISION,"Out of Memory, Flash page is full \r\n");
+ result = MOBLE_RESULT_OUTOFMEMORY;
+ }
+ else
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ *subPageIndex = subPageIdx;
+
+ return result;
+}
+
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h
new file mode 100644
index 000000000..34667f26c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h
@@ -0,0 +1,92 @@
+/**
+ ******************************************************************************
+ * @file appli_nvm.h
+ * @author BLE Mesh Team
+ * @brief Header file for the NVM application file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_NVM_H
+#define __APPLI_NVM_H
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "mesh_cfg.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+extern const void *prvsnr_data;
+
+/* offset defined for the embedded provisioner node */
+#define PRVN_NVM_PAGE_SIZE 4096U
+#define PRVN_NVM_BASE_OFFSET ((unsigned int)prvsnr_data)
+#define PRVN_NVM_CHUNK_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_SUBPAGE_SIZE (sizeof(NvmPerNode_t)) /* Number of bytes saved per Element */
+#define PRVN_NVM_MAX_SUBPAGE (unsigned int)(PRVN_NVM_PAGE_SIZE/PRVN_NVM_CHUNK_SIZE)
+#define PRVN_NVM_SUBPAGE_OFFSET(i) (unsigned int)(PRVN_NVM_SUBPAGE_SIZE*(i))
+
+#define APP_NVM_BASE ((unsigned int)appNvmBase)
+#define APP_NVM_SIZE 4096U
+
+/* Exported variables ------------------------------------------------------- */
+typedef struct
+{
+ MOBLEUINT8 devKey[4+DEVICE_KEY_SIZE];
+
+#if ENABLE_SAVE_UUID_PER_NODE
+ MOBLEUINT8 node_UUID[UUID_SIZE];
+#endif
+
+} NvmPerNode_t;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FactorySettingReset(void);
+//MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber);
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size);
+MOBLE_RESULT AppliNvm_ClearModelState(void);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+void AppliNvm_Process(void);
+void AppliNvm_SaveMessageParam (void);
+MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
+ MOBLEUINT32 SubPageSize,
+ MOBLEUINT32 totalSubPage,
+ MOBLEUINT32 nvmBaseOffset);
+MOBLE_RESULT AppliPrvnNvm_LoadData(uint8_t state[], uint8_t* size);
+
+MOBLE_RESULT AppliPrvnNvm_SaveData(uint8_t* data,
+ MOBLE_ADDRESS address,
+ uint8_t* pUUID,
+ uint8_t numElements);
+
+MOBLEUINT32* AppliPrvnNvm_GetNodeDevKey(MOBLE_ADDRESS addrss);
+void AppliPrvnNvm_Process(void);
+
+MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8*flag);
+
+MOBLE_RESULT AppliPrvnNvm_CopyData(uint8_t state[], uint8_t* size);
+
+void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
+ MOBLE_ADDRESS address,
+ MOBLEUINT8 *prvnFlag,
+ MOBLEUINT8 numOfElements);
+
+void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+
+
+#endif /* __APPLI_NVM_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c
new file mode 100644
index 000000000..7ae8b7d10
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c
@@ -0,0 +1,633 @@
+/**
+ ******************************************************************************
+ * @file appli_sensor.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Sensor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "hal_common.h"
+#include "types.h"
+#include "sensors.h"
+#include "light_lc.h"
+#include "appli_sensor.h"
+#include "mesh_cfg.h"
+//#include "LPS25HB.h"
+#include "string.h"
+#include "common.h"
+#include "math.h"
+
+/** @addtogroup ST_BLE_Mesh
+ * @{
+ */
+
+/** @addtogroup Application_Mesh_Models
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#if 0
+/**
+* @brief PRESSURE init structure definition
+*/
+PRESSURE_InitTypeDef InitStructure =
+{
+ LPS25HB_ODR_1Hz,
+ LPS25HB_BDU_READ,
+ LPS25HB_DIFF_ENABLE,
+ LPS25HB_SPI_SIM_3W,
+ LPS25HB_P_RES_AVG_32,
+ LPS25HB_T_RES_AVG_16
+};
+#endif
+
+/* Application variables of sensor model definition */
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus;
+Appli_Sensor_SettingSet_t Appli_Sensor_SettingSet;
+
+/* By Default value used for cadence set for testing. */
+Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR] = {
+ {0x0071 , 0x2 , 2 , 2 ,2 ,0 ,0X05 , 0x64},
+ {0x2A6D , 0x2 , 1 , 1 , 1, 0, 0X258 , 0x3ED}
+};
+#endif
+
+MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
+{
+ {TEMPERATURE_PID},
+ {PRESSURE_PID}
+};
+MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
+extern MOBLEUINT8 NumberOfElements;
+extern MOBLEUINT8 ProvisionFlag;
+
+/* Temperature and Pressure init structure*/
+#if 0
+ PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
+#endif
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+/**
+* @brief Appli_Sensor_Cadence_Set: This function is callback for Application
+* when sensor cadence Set message is received
+* @param pCadence_param: Pointer to the parameters received for message
+* @param property_ID: Property is of sensor coming in data packet
+* @param length: Received data length.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param, MOBLEUINT16 property_ID, MOBLEUINT32 length)
+{
+ if(property_ID == (MOBLEUINT16)TEMPERATURE_PID)
+ {
+ Sensor_CadenceSet[0].Property_ID = pCadence_param->Property_ID;
+ Sensor_CadenceSet[0].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
+ Sensor_CadenceSet[0].StatusTriggerType = pCadence_param->StatusTriggerType ;
+ Sensor_CadenceSet[0].triggerDeltaDown = pCadence_param->triggerDeltaDown;
+ Sensor_CadenceSet[0].triggerDeltaUp = pCadence_param->triggerDeltaUp;
+ Sensor_CadenceSet[0].StatusMinInterval = pCadence_param->StatusMinInterval;
+ Sensor_CadenceSet[0].FastCadenceLow = pCadence_param->FastCadenceLow;
+ Sensor_CadenceSet[0].FastCadenceHigh = pCadence_param->FastCadenceHigh;
+ }
+ else if(property_ID == (MOBLEUINT16)PRESSURE_PID)
+ {
+
+ Sensor_CadenceSet[1].Property_ID = pCadence_param->Property_ID;
+ Sensor_CadenceSet[1].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
+ Sensor_CadenceSet[1].StatusTriggerType = pCadence_param->StatusTriggerType ;
+ Sensor_CadenceSet[1].triggerDeltaDown = pCadence_param->triggerDeltaDown;
+ Sensor_CadenceSet[1].triggerDeltaUp = pCadence_param->triggerDeltaUp;
+ Sensor_CadenceSet[1].StatusMinInterval = pCadence_param->StatusMinInterval;
+ Sensor_CadenceSet[1].FastCadenceLow = pCadence_param->FastCadenceLow;
+ Sensor_CadenceSet[1].FastCadenceHigh = pCadence_param->FastCadenceHigh;
+ }
+ else
+ {
+ /* No Comments */
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_Setting_Set: This function is callback for Application
+* when sensor setting Set message is received
+* @param pSensor_SettingParam: Pointer to the parameters received for message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
+ MOBLEUINT8 OptionalValid)
+{
+ Appli_Sensor_SettingSet.Property_ID = pSensor_SettingParam->Property_ID;
+ Appli_Sensor_SettingSet.Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
+ Appli_Sensor_SettingSet.Sensor_Setting_Access = pSensor_SettingParam->Sensor_Setting_Access;
+ Appli_Sensor_SettingSet.Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_Data_Status: This function is callback for Application
+* when sensor get message is received
+* @param sensor_Data: Pointer to the parameters to be send in message
+* @param pLength: Length of the parameters to be sent in response
+* @param prop_ID: Property is of sensor coming in data packet
+* @param length: Received data length
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength,
+ MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLEUINT32 temperatureData = 0;
+ MOBLEUINT32 pressureData = 0;
+ MOBLEUINT8 data_Length = 0x03;
+ MOBLEUINT32 distance = 0x000000C8; // 200 cm;
+
+#if 0
+ LPS25HB_GetTemperature((float*)&temperatureData);
+
+ LPS25HB_GetPressure((float*)&pressureData);
+#endif
+
+ result = Check_Property_ID(Property_ID_Table , prop_ID);
+
+ if((prop_ID == TEMPERATURE_PID ) && (length > 0))
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ *(sensor_Data) = ((TEMPERATURE_PID & 0x07) << 5) | (data_Length <<1) ;
+ *(sensor_Data+1) = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&temperatureData,4);
+
+ *pLength =6;
+ }
+ else if((prop_ID == PRESSURE_PID) && (length > 0))
+{
+ /* Format B for Pressure sensor */
+ *(sensor_Data+0) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+1) = (MOBLEUINT8)PRESSURE_PID ;
+ *(sensor_Data+2) = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&pressureData,4);
+
+ *pLength =7;
+ }
+ else if((prop_ID == TIME_OF_FLIGHT_PID) && (length > 0))
+ {
+ /* Format B for Pressure sensor */
+ *(sensor_Data+0) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+1) = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
+ *(sensor_Data+2) = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&distance,4);
+
+ *pLength =7;
+ }
+ else if((result == MOBLE_RESULT_FALSE) && (length == 0))
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ *(sensor_Data) = ((TEMPERATURE_PID & 0x07) << 5) | (data_Length <<1) ;
+ *(sensor_Data+1) = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&temperatureData,4);
+
+ /* Format B for Pressure sensor */
+ *(sensor_Data+6) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+7) = (MOBLEUINT8)PRESSURE_PID ;
+ *(sensor_Data+8) = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[9],(void*)&pressureData,4);
+
+ /* Format B for Pressure sensor */
+ *(sensor_Data+13) = ((data_Length <<1) | 0x01);
+ *(sensor_Data+14) = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
+ *(sensor_Data+15) = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
+
+ memcpy(&sensor_Data[16],(void*)&distance,4);
+
+ *pLength =20;
+ }
+ else
+ {
+ /* No Comments */
+ }
+
+ TRACE_M(TF_SENSOR,"the temperature reading from sender in hex 0x%08lx \n\r ", temperatureData);
+ TRACE_M(TF_SENSOR,"the pressure reading from sender in hex 0x%08lx \n\r", pressureData );
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief Appli_Sensor_Descriptor_Status: This function is callback for Application
+* when sensor get message is received
+* @param sensor_Descriptor: Pointer to the parameters to be send in message
+* @param pLength: Length of the parameters to be sent in response
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor , MOBLEUINT32* pLength)
+{
+ Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] = {{PRESSURE_PID,0xABC,0xDEF,0x03,0x04,0x05},
+ {TEMPERATURE_PID,0xc56,0xd78,0x06,0x07,0x08},
+ {TIME_OF_FLIGHT_PID,0xD23,0xE45,0x06,0x07,0x08}};
+ MOBLEUINT32 tolerance;
+ tolerance = Appli_Sensor_DescriptorStatus1[0].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[0].PositiveTolerance;
+
+ *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[0].Prop_ID;
+ *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[0].Prop_ID >> 8;
+ *(sensor_Descriptor+2) = tolerance;
+ *(sensor_Descriptor+3) = tolerance >> 8;
+ *(sensor_Descriptor+4) = tolerance >> 16;
+ *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[0].SamplingFunction;
+ *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[0].MeasurementPeriod;
+ *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[0].UpdateInterval;
+
+ tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
+
+ *(sensor_Descriptor+8) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
+ *(sensor_Descriptor+9) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
+ *(sensor_Descriptor+10) = tolerance;
+ *(sensor_Descriptor+11) = tolerance >> 8;
+ *(sensor_Descriptor+12) = tolerance >> 16;
+ *(sensor_Descriptor+13) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
+ *(sensor_Descriptor+14) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
+ *(sensor_Descriptor+15) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
+
+ tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
+ tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+
+ *(sensor_Descriptor+16) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
+ *(sensor_Descriptor+17) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
+ *(sensor_Descriptor+18) = tolerance;
+ *(sensor_Descriptor+19) = tolerance >> 8;
+ *(sensor_Descriptor+20) = tolerance >> 16;
+ *(sensor_Descriptor+21) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
+ *(sensor_Descriptor+22) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
+ *(sensor_Descriptor+23) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
+
+ *pLength = 24;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @brief Sensor Process Function will continuously monitor the sensors.
+* Function used for the Publishing, data monitoring..
+* @param void
+* @retval void
+*/
+void Sensor_Process(void)
+{
+
+#ifdef ENABLE_SENSOR_PUBLICATION
+ float sensorValue[NUMBER_OF_SENSOR];
+ if(ProvisionFlag == 1)
+ {
+ Read_Sensor_Data(&sensorValue[0]);
+ Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ }
+#endif
+
+ /* Occupancy_Flag become True when ever sensor detect occupancy and get interrupt
+ and make flag True to run this routine.
+ */
+ if(Occupancy_Flag == MOBLE_TRUE)
+ {
+ if(BLE_waitPeriod(CONTROLLER_WAIT_TIME))
+ {
+#ifdef ENABLE_SENSOR_PUBLICATION
+ if(ProvisionFlag == 1)
+ {
+ Read_Sensor_Data(&sensorValue[0]);
+ Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ }
+#endif
+
+ /* publishing the command for LC Light occupancy set message in the sensor status
+ message .
+ */
+ Sensor_LC_Light_Publish();
+ Occupancy_Flag = MOBLE_FALSE;
+ }
+ }
+}
+
+/**
+* @brief Function check for the couupancy in the location and send the status
+ message with the ocuppancy value, when the interrupt is detected.
+* @param void
+* @retval void
+*/
+void Sensor_LC_Light_Publish(void)
+{
+ MOBLEUINT8 occupancyData = 0x1;
+ MOBLEUINT8 sensor_Data[5];
+ MOBLE_ADDRESS srcAdd;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
+ sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
+ sensor_Data[2] = occupancyData;
+
+ srcAdd = BLEMesh_GetAddress();
+
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
+ SENSOR_STATUS ,
+ sensor_Data,3,
+ MOBLE_FALSE, MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ }
+
+}
+
+#if defined ENABLE_SENSOR_PUBLICATION && defined ENABLE_SENSOR_MODEL_SERVER
+/**
+* @brief Function read the particular sensor value which are called inside.
+* @param pSensorValue: pointer to the sensor data array.
+* @retval void
+*/
+void Read_Sensor_Data(float *pSensorValue)
+{
+#if 0
+ float temp,press;
+ LPS25HB_GetTemperature(&temp);
+ pSensorValue[0] = temp;
+ LPS25HB_GetPressure(&press);
+ pSensorValue[1] = press;
+#endif
+}
+
+/**
+* @brief Sensor Publication Process function
+* @param Function will publish the sensor data according to the given conditions.
+* @param void type function pointer.
+* @param pSensorData: Pointer to the sensor data array.
+* @param pProp_ID: Pointer to the Property id of sensor array.
+* @retval void
+*/
+void Sensor_Publication_Process(float* pSensorData, MODEL_Property_IDTableParam_t* pProp_ID)
+{
+ static MOBLEUINT8 sensor_Count = 0;
+ displayFloatToInt_t out_value;
+ MOBLEUINT8 devisorValue;
+ MOBLEUINT32 publishTime;
+ static MOBLEUINT32 cadenceDurationTick[NUMBER_OF_SENSOR];
+ static float previousDataValue[NUMBER_OF_SENSOR];
+ static PublishingDataFlag_t PublishingDataFlag[NUMBER_OF_SENSOR] = {MOBLE_FALSE};
+
+ floatToInt(pSensorData[sensor_Count], &out_value, 2);
+
+ /* Taking the timestamp for the cadence publication and making flag high */
+ if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ {
+ cadenceDurationTick[sensor_Count] = Clock_Time();
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ }
+ /* Taking the sensor value and store it for comparing present sensor value with
+ particular difference of increasing or decreasing. and making flag high.
+ */
+ if(PublishingDataFlag[sensor_Count].DeltaDataFlag == MOBLE_FALSE)
+ {
+ previousDataValue[sensor_Count] = pSensorData[sensor_Count];
+ PublishingDataFlag[sensor_Count].DeltaDataFlag = MOBLE_TRUE;
+ }
+ /*
+ This condition is checking for the difference of present sensor value
+ with prestored sensor value with user defined difference,if this condition
+ is true then it publish the sensor data.And making the delta flag low again.
+ */
+ if((pSensorData[sensor_Count] >= (previousDataValue[sensor_Count] + Sensor_CadenceSet[sensor_Count].triggerDeltaUp)) ||
+ (pSensorData[sensor_Count] <= (previousDataValue[sensor_Count] - Sensor_CadenceSet[sensor_Count].triggerDeltaDown)))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+
+ PublishingDataFlag[sensor_Count].DeltaDataFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"previous value data %.3f \r\n",previousDataValue[sensor_Count]);
+ TRACE_M(TF_SENSOR,"Delta publication of data %.3f\r\n",*((float*)&pSensorData[sensor_Count]));
+ sensor_Count++;
+ }
+ /*
+ This condition is continuously checking the sensor value range, if that
+ value is within the user defined range then publishing duration or rate will
+ be divided by user definedcadence devisor value and rate of publishing will
+ become high.And making the cadence flag low again.
+ */
+ if(((out_value.out_int <= Sensor_CadenceSet[sensor_Count].FastCadenceHigh) &&
+ (out_value.out_int >= Sensor_CadenceSet[sensor_Count].FastCadenceLow)) ||
+ (Sensor_CadenceSet[sensor_Count].FastCadenceHigh < Sensor_CadenceSet[sensor_Count].FastCadenceLow))
+ {
+ devisorValue = (MOBLEUINT8)pow(2 ,Sensor_CadenceSet[sensor_Count].FastCadenceDevisor);
+ publishTime = SENSOR_PUBLISH_PERIOD/devisorValue;
+
+ if(((Clock_Time()- cadenceDurationTick[sensor_Count]) >= publishTime))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"Cadence publication of data %.2f \r\n",*((float*)&pSensorData[sensor_Count]));
+ sensor_Count++;
+ }
+ }
+ else
+ {
+ publishTime = SENSOR_PUBLISH_PERIOD ;
+
+ if(((Clock_Time()- cadenceDurationTick[sensor_Count]) >= SENSOR_PUBLISH_PERIOD))
+ {
+ MOBLEUINT16 prop_id = pProp_ID[sensor_Count].Property_ID;
+
+ SensorDataPublish((MOBLEUINT32*)&pSensorData[sensor_Count] , &prop_id);
+
+ PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_FALSE;
+ TRACE_M(TF_SENSOR,"Regular publication of data %.3f \r\n",*((float*)&pSensorData[sensor_Count]));
+ }
+ }
+ if(sensor_Count > 1)
+ {
+ sensor_Count = 0;
+ }
+
+}
+
+/**
+* @brief BLEMesh Sensor Publication function
+* @param Function will decide the publish address and element.
+* @param pSensor_Value: Pointer to the sensor data array
+* @param pProp_ID: pointer to the property id of sensor array.
+* @retval void
+*/
+void SensorDataPublish(MOBLEUINT32 *pSensor_Value , MOBLEUINT16* pProp_ID)
+{
+ MOBLEUINT32 length;
+ MOBLEUINT8 sensor_Data[8];
+ MOBLE_ADDRESS srcAdd;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ srcAdd = BLEMesh_GetAddress();
+
+ switch(*pProp_ID)
+ {
+ case TEMPERATURE_PID:
+ {
+ /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
+ Property calculation is done like above line
+ */
+ sensor_Data[0] = ((TEMPERATURE_PID & 0x07) << 5) | (3 <<1) ;
+ sensor_Data[1] = (TEMPERATURE_PID >> 3) & 0xFF;
+
+ memcpy(&sensor_Data[2],(void*)&pSensor_Value[0],4);
+ length =6;
+ break;
+ }
+ case PRESSURE_PID:
+ {
+ /* Format B for Pressure sensor */
+ sensor_Data[0] = ((0x03 <<1) | 0x01);
+ sensor_Data[1] = (MOBLEUINT8)PRESSURE_PID ;
+ sensor_Data[2] = (MOBLEUINT8)(PRESSURE_PID >> 8);
+
+ memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
+ length =7;
+ break;
+ }
+ default:
+ break;
+ }
+
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
+ SENSOR_STATUS ,
+ sensor_Data,length,
+ MOBLE_FALSE, MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ }
+
+}
+
+#endif
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+/**
+* @brief Appli_Sensor_GetSettingStatus: This function is callback for Application
+* when sensor setting numbers status message is to be provided
+* @param pSetting_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+{
+
+ *pSetting_Status = Appli_Sensor_SettingSet.Property_ID;
+ *(pSetting_Status+1) = Appli_Sensor_SettingSet.Property_ID >> 8;
+ *(pSetting_Status+2) = Appli_Sensor_SettingSet.Sensor_Setting_ID;
+ *(pSetting_Status+3) = Appli_Sensor_SettingSet.Sensor_Setting_ID >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Appli_Sensor_GetSetting_IDStatus: This function is callback for Application
+* when sensor setting numbers and row value status message is to be provided
+* @param pSetting_Status: Pointer to the status message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status)
+{
+
+ *pSetting_Status = Appli_Sensor_SettingSet.Property_ID;
+ *(pSetting_Status+1) = Appli_Sensor_SettingSet.Property_ID >> 8;
+ *(pSetting_Status+2) = Appli_Sensor_SettingSet.Sensor_Setting_ID;
+ *(pSetting_Status+3) = Appli_Sensor_SettingSet.Sensor_Setting_ID >> 8;
+ *(pSetting_Status+4) = Appli_Sensor_SettingSet.Sensor_Setting_Access;
+ *(pSetting_Status+5) = Appli_Sensor_SettingSet.Sensor_Setting_Value;
+ *(pSetting_Status+6) = Appli_Sensor_SettingSet.Sensor_Setting_Value >> 8;
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+#endif
+
+/**
+* @brief Check_Property_ID: This function is used for checking the Property id
+* of sensor available in table.
+* @param prop_ID_Table: address of the property id table array.
+* @param prop_ID:received property id of sensor.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
+ , MOBLEUINT16 prop_ID)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_FALSE;
+
+ for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ {
+ if(prop_ID_Table[i].Property_ID == prop_ID)
+ {
+ status = MOBLE_RESULT_SUCCESS;
+ break;
+ }
+ }
+ return status;
+}
+
+/**
+* @brief Appli_Sensor_Init: This function is callback for Initialisation of
+* Application interface
+* @param void
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Sensor_Init(void)
+{
+#if 0
+ LPS25HB_Init(&InitStructure);
+#endif
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h
new file mode 100644
index 000000000..d608f35e6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h
@@ -0,0 +1,103 @@
+/**
+ ******************************************************************************
+ * @file appli_sensor.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Light Mesh Model
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_SENSOR_H
+#define __APPLI_SENSOR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+
+/* Exported macro ------------------------------------------------------------*/
+
+#define CONTROLLER_WAIT_TIME 1000
+
+/* Exported variables -------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+/* Application variables------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/* Sensor Cadence set */
+#pragma pack(1)
+typedef struct
+{
+ MOBLEUINT16 Prop_ID;
+ MOBLEUINT16 PositiveTolerance;
+ MOBLEUINT16 NegativeTolerance;
+ MOBLEUINT8 SamplingFunction;
+ MOBLEUINT8 MeasurementPeriod;
+ MOBLEUINT8 UpdateInterval;
+}Appli_Sensor_DescriptorStatus_t;
+
+/* Sensor Setting set */
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT16 Sensor_Setting_ID;
+ MOBLEUINT8 Sensor_Setting_Access;
+ MOBLEUINT16 Sensor_Setting_Value;
+}Appli_Sensor_SettingSet_t;
+
+
+/* structure of flags used for publishing data */
+typedef struct
+{
+ MOBLEBOOL CadenceDurationFlag ;
+ MOBLEBOOL DeltaDataFlag ;
+}PublishingDataFlag_t;
+
+/* structure for the cadence set */
+typedef struct
+{
+ MOBLEUINT16 Property_ID;
+ MOBLEUINT8 FastCadenceDevisor;
+ MOBLEUINT8 StatusTriggerType;
+ MOBLEUINT8 triggerDeltaDown;
+ MOBLEUINT8 triggerDeltaUp;
+ MOBLEUINT8 StatusMinInterval;
+ float FastCadenceLow;
+ float FastCadenceHigh;
+}Sensor_CadenceSet_t;
+#pragma pack(4)
+
+MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param, MOBLEUINT16 property_ID,
+ MOBLEUINT32 length);
+MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength,
+ MOBLEUINT16 prop_ID , MOBLEUINT32 length);
+MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Discriptor ,
+ MOBLEUINT32* pLength);
+MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
+ MOBLEUINT8 OptionalValid);
+
+void Sensor_Publication_Process(float* , MODEL_Property_IDTableParam_t*);
+void SensorDataPublish(MOBLEUINT32 * , MOBLEUINT16*);
+void Read_Sensor_Data(float *);
+MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
+ , MOBLEUINT16 prop_ID);
+
+MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status);
+MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status);
+MOBLE_RESULT Appli_Sensor_Init(void);
+void Sensor_Process(void);
+void Sensor_LC_Light_Publish(void);
+
+#endif /* __APPLI_SENSOR_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c
new file mode 100644
index 000000000..405be02c8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c
@@ -0,0 +1,505 @@
+/**
+ ******************************************************************************
+ * @file appli_vendor.c
+ * @author BLE Mesh Team
+ * @brief Application interface for Vendor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"
+#include "hal_common.h"
+#include "types.h"
+#include "ble_mesh.h"
+#include "appli_mesh.h"
+#include "vendor.h"
+#include "appli_vendor.h"
+#include "common.h"
+#include "appli_light.h"
+#include "models_if.h"
+#include "mesh_cfg.h"
+#include <string.h>
+
+
+/** @addtogroup MODEL_VENDOR
+* @{
+*/
+
+/** @addtogroup Vendor_Model_Callbacks
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT16 BuffLength;
+extern MOBLEUINT8 Appli_LedState;
+extern uint16_t DUTY;
+MOBLEUINT32 TestHitCounter = 0;
+extern Appli_LightPwmValue_t Appli_LightPwmValue;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief Process the Vendor Device Info Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_DeviceInfo(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLEUINT8 tempBuffer[10];
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ MOBLEUINT8 subCmd = data[0];
+ char *libVersion;
+ char *subLibVersion;
+ MOBLEUINT8 inc = 0;
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0] = subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#02-%02hx! \n\r",data[0]);
+
+ switch(subCmd)
+ {
+ case IC_TYPE:
+ {
+#ifdef BLUENRG1_DEVICE
+ ResponseBuffer[1] = BLUENRG1_BRD;
+#endif
+
+#ifdef BLUENRG2_DEVICE
+ ResponseBuffer[1] = BLUENRG2_BRD;
+#endif
+
+#ifdef BLUENRG_MS
+ ResponseBuffer[1] = BLUENRG_MS_BRD;
+#endif
+
+#ifdef STM32WB55xx
+ ResponseBuffer[1] = STM32WB55XX_BRD;
+#endif
+
+ BuffLength = 2;
+ break;
+ }
+ case LIB_VER:
+ {
+ libVersion = BLEMesh_GetLibraryVersion();
+ while(*libVersion != '\0')
+ {
+ tempBuffer[inc] = *libVersion;
+ if(tempBuffer[inc] != 0x2E)
+ {
+ tempBuffer[inc] = BLEMesh_ModelsASCII_To_Char(tempBuffer[inc]);
+ TRACE_M(TF_VENDOR,"Lib version is %x\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ else
+ {
+ TRACE_M(TF_VENDOR,"Lib version is %c\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ libVersion++;
+
+ inc++;
+ }
+ ResponseBuffer[1]= tempBuffer[0];
+ ResponseBuffer[2]= tempBuffer[1];
+ ResponseBuffer[3]= tempBuffer[3];
+ ResponseBuffer[4]= tempBuffer[4];
+ ResponseBuffer[5]= tempBuffer[6];
+ ResponseBuffer[6]= tempBuffer[7];
+ ResponseBuffer[7]= tempBuffer[8];
+ BuffLength = 8;
+ break;
+ }
+ case LIB_SUB_VER:
+ {
+ subLibVersion = BLEMesh_GetLibrarySubVersion();
+ while(*subLibVersion != '\0')
+ {
+ tempBuffer[inc] = * subLibVersion;
+ if((tempBuffer[inc] != 0x2E) && (tempBuffer[inc] != 0x52))
+ {
+ tempBuffer[inc] = BLEMesh_ModelsASCII_To_Char(tempBuffer[inc]);
+ TRACE_M(TF_VENDOR,"Sub Lib version is %x\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ else
+ {
+ TRACE_M(TF_VENDOR,"Sub Lib version is %c\n\r" ,(unsigned char)tempBuffer[inc]);
+ }
+ subLibVersion++;
+ inc++;
+ }
+ ResponseBuffer[1]= tempBuffer[0];
+ ResponseBuffer[2]= tempBuffer[1];
+ ResponseBuffer[3]= tempBuffer[3];
+ ResponseBuffer[4]= tempBuffer[5];
+ ResponseBuffer[5]= tempBuffer[7];
+ ResponseBuffer[6]= tempBuffer[9];
+
+ BuffLength = 7;
+
+ break;
+ }
+ case APPLICATION_VER:
+ {
+ /*Insert Command to check Application Version*/
+ break;
+ }
+
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+
+ }
+
+ return status;
+}
+
+
+/**
+* @brief Process the Vendor Test Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#01-%02hx! \n\r",data[0]);
+ switch(subCmd)
+ {
+ case APPLI_TEST_ECHO:
+ {
+ if(length > sizeof(ResponseBuffer))
+ {
+ length = sizeof(ResponseBuffer);
+ TRACE_M(TF_VENDOR,"Length received greater than size of response buffer \r\n");
+ }
+ memcpy (&(ResponseBuffer[1]),&(data[1]),(length-1));
+ BuffLength = length;
+ break;
+ }
+ case APPLI_TEST_RANDOMIZATION_RANGE:
+ {
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_TEST_COUNTER:
+ {
+ if((DUTY <= PWM_TIME_PERIOD) && (DUTY > 1))
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ TRACE_M(TF_VENDOR,"Test Counter is running \r\n");
+ ResponseBuffer[0] = subCmd;
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_TEST_INC_COUNTER:
+ {
+
+ if((DUTY <= PWM_TIME_PERIOD) && (DUTY > 1))
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ }
+
+ TestHitCounter++;
+ TRACE_M(TF_VENDOR,"Command received Count %.2lx \r\n",TestHitCounter);
+ ResponseBuffer[0] = subCmd;
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ /*Insert Test related Commands here*/
+ break;
+ }
+ case APPLI_MODEL_PUBLISH_SELECT:
+ {
+ for (MOBLEUINT8 idx=0; idx<length; idx++)
+ {
+ TRACE_I(TF_VENDOR,"data[%d]= %d",idx,data[idx]);
+ TRACE_I(TF_VENDOR,"\n\r");
+ }
+ break;
+ }
+
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+
+ return status;
+}
+
+
+/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementNumber : element selected for a node
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCommand;
+ subCommand = data[0];
+ MOBLEUINT16 duty;
+ MOBLEUINT16 intensityValue = 0;
+/* tClockTime delay_t = Clock_Time(); */
+
+ TRACE_M(TF_VENDOR_COMMAND,"#03-%02hx!\n\r",data[0]);
+ switch(subCommand)
+ {
+ /*
+ Message Received B0 B1 B2 B3 B4 B5 B6 B7
+ B0 - Sub-Cmd LED
+ B1-B7 - Data Bytes
+ */
+ case APPLI_CMD_LED_BULB:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+
+ /* Toggle Command */
+ case APPLI_CMD_TOGGLE:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ if(Appli_LedState == 1)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#else
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#endif
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
+ }
+
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* On Command */
+ case APPLI_CMD_ON:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+ BSP_LED_On(LED_BLUE);
+ Appli_LedState = 1;
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM3, mapped on PWM3_PIN (GPIO_2 in mapping) */
+ BSP_LED_On(LED_BLUE);
+ Appli_LedState = 1;
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* Off Command */
+ case APPLI_CMD_OFF:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#else
+ Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue); /* PWM_ID = PWM4, mapped on PWM4_PIN (GPIO_14 in mapping) */
+#endif
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue); /* PWM_ID = PWM3, mapped on PWM3_PIN (GPIO_2 in mapping) */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+
+ break;
+ }
+ /* intensity command */
+ case APPLI_CMD_LED_INTENSITY:
+ {
+ if(elementNumber == FIRST_ELEMENT)
+ {
+ intensityValue = data[2] << 8;
+ intensityValue |= data[1];
+
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+ }
+ else if(elementNumber == SECOND_ELEMENT)
+ {
+ /* user application code */
+ }
+ else if(elementNumber == THIRD_ELEMENT)
+ {
+ /* user application code */
+ }
+ break;
+ }
+ /* Default case - Not valid command */
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ /*Buffer will be sent for Reliable Response*/
+ /*First Byte is Sub Command and 2nd Byte is LED Status*/
+ ResponseBuffer[0] = subCommand;
+ if(subCommand == APPLI_CMD_LED_INTENSITY)
+ {
+ ResponseBuffer[1] = intensityValue >> 8 ;
+ ResponseBuffer[2] = intensityValue ;
+ BuffLength = 3;
+ }
+ else
+ {
+ ResponseBuffer[1] = Appli_LedState ;
+ BuffLength = 2;
+ }
+
+ return status;
+}
+
+/**
+* @brief Process the Vendor Data write Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_Data_write(MOBLEUINT8 const *data, MOBLEUINT32 length)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+ TRACE_M(TF_VENDOR_COMMAND,"#0E-%02hx! \n\r",data[0]);
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
+}
+
+/**
+* @brief Appli_GetTestValue: This function is callback for Application
+* when Vensor application test command received then status message is to be provided
+* @param responseValue: Pointer to the status message
+* @retval void
+*/
+void Appli_GetTestValue (MOBLEUINT8 *responseValue)
+{
+ *responseValue = TestHitCounter;
+ *(responseValue+1) = TestHitCounter >> 8;
+ *(responseValue+2) = TestHitCounter >> 16;
+ *(responseValue+3) = TestHitCounter >> 24;
+ TestHitCounter = 0;
+}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h
new file mode 100644
index 000000000..2b9390099
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h
@@ -0,0 +1,43 @@
+/**
+ ******************************************************************************
+ * @file appli_vendor.h
+ * @author BLE Mesh Team
+ * @brief Application interface for Vendor Mesh Models
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APPLI_VENDOR_H
+#define __APPLI_VENDOR_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "ble_mesh.h"
+
+/* Exported macro ------------------------------------------------------------*/
+#define LED_OFF_VALUE 1U
+#define LED_ON_VALUE 32000U
+/* Private define ------------------------------------------------------------*/
+
+MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementNumber, MOBLE_ADDRESS dst_peer);
+MOBLE_RESULT Appli_Vendor_DeviceInfo(MOBLEUINT8 const *data, MOBLEUINT32 length);
+MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length);
+MOBLE_RESULT Appli_Vendor_Data_write(MOBLEUINT8 const *data, MOBLEUINT32 length);
+void Appli_GetTestValue (MOBLEUINT8 *responseValue);
+
+#endif /* __APPLI_VENDOR_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h
new file mode 100644
index 000000000..4cc3ce72b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_conf.h
@@ -0,0 +1,74 @@
+/**
+ ******************************************************************************
+ * @file ble_conf.h
+ * @author MCD Application Team
+ * @brief BLE configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_CONF_H
+#define __BLE_CONF_H
+
+#include "app_conf.h"
+
+/******************************************************************************
+ *
+ * BLE SERVICES CONFIGURATION
+ * blesvc
+ *
+ ******************************************************************************/
+#define BLE_CFG_MESH 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Peripheral Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_PERIPHERAL 1
+
+/**
+ * This setting shall be set to '1' if the device needs to support the Central Role
+ * In the MS configuration, both BLE_CFG_PERIPHERAL and BLE_CFG_CENTRAL shall be set to '1'
+ */
+#define BLE_CFG_CENTRAL 1
+
+#define BLE_CFG_BROADCASTER 1
+
+#define BLE_CFG_OBSERVER 1
+
+#define BLE_CFG_DATA_ROLE_MODE 4
+
+
+/**
+ * There is one handler per service enabled
+ * Note: There is no handler for the Device Information Service
+ *
+ * This shall take into account all registered handlers
+ * (from either the provided services or the custom services)
+ */
+#define BLE_CFG_SVC_MAX_NBR_CB 7
+
+#define BLE_CFG_CLT_MAX_NBR_CB 5
+
+/******************************************************************************
+ * GAP Service - Apprearance
+ ******************************************************************************/
+#define BLE_CFG_UNKNOWN_APPEARANCE (0)
+#define BLE_CFG_HR_SENSOR_APPEARANCE (832)
+#define BLE_CFG_GAP_APPEARANCE (BLE_CFG_UNKNOWN_APPEARANCE)
+
+#endif /*__BLE_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h
new file mode 100644
index 000000000..35a4d96ab
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/ble_dbg_conf.h
@@ -0,0 +1,207 @@
+/**
+ ******************************************************************************
+ * @file ble_dbg_conf.h
+ * @author MCD Application Team
+ * @brief BLE Debug configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __BLE_DBG_CONF_H
+#define __BLE_DBG_CONF_H
+
+/**
+ * Enable or Disable traces from BLE
+ */
+
+#define BLE_DBG_DIS_EN 0
+#define BLE_DBG_HRS_EN 0
+#define BLE_DBG_EDS_STM_EN 0
+#define BLE_DBG_LBS_STM_EN 0
+#define BLE_DBG_SVCCTL_EN 1
+#define BLE_DBG_CTS_EN 0
+#define BLE_DBG_HIDS_EN 0
+#define BLE_DBG_PASS_EN 0
+#define BLE_DBG_BLS_EN 0
+#define BLE_DBG_HTS_EN 0
+#define BLE_DBG_ANS_EN 0
+#define BLE_DBG_ESS_EN 0
+#define BLE_DBG_GLS_EN 0
+#define BLE_DBG_BAS_EN 0
+#define BLE_DBG_RTUS_EN 0
+#define BLE_DBG_HPS_EN 0
+#define BLE_DBG_TPS_EN 0
+#define BLE_DBG_LLS_EN 0
+#define BLE_DBG_IAS_EN 0
+#define BLE_DBG_DTS_EN 0
+#define BLE_DBG_WSS_EN 0
+#define BLE_DBG_LNS_EN 0
+#define BLE_DBG_SCPS_EN 0
+#define BLE_DBG_P2P_STM_EN 0
+
+
+/**
+ * Macro definition
+ */
+#if ( BLE_DBG_DIS_EN != 0 )
+#define BLE_DBG_DIS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_DIS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_HRS_EN != 0 )
+#define BLE_DBG_HRS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HRS_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_P2P_STM_EN != 0 )
+#define BLE_DBG_P2P_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_P2P_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_EDS_STM_EN != 0 )
+#define BLE_DBG_EDS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_EDS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_LBS_STM_EN != 0 )
+#define BLE_DBG_LBS_STM_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LBS_STM_MSG PRINT_NO_MESG
+#endif
+
+#if ( BLE_DBG_SVCCTL_EN != 0 )
+#define BLE_DBG_SVCCTL_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SVCCTL_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_CTS_EN != 0)
+#define BLE_DBG_CTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_CTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HIDS_EN != 0)
+#define BLE_DBG_HIDS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HIDS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_PASS_EN != 0)
+#define BLE_DBG_PASS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_PASS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BLS_EN != 0)
+#define BLE_DBG_BLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HTS_EN != 0)
+#define BLE_DBG_HTS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HTS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ANS_EN != 0)
+#define BLE_DBG_ANS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ANS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_ESS_EN != 0)
+#define BLE_DBG_ESS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_ESS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_GLS_EN != 0)
+#define BLE_DBG_GLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_GLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_BAS_EN != 0)
+#define BLE_DBG_BAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_BAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_RTUS_EN != 0)
+#define BLE_DBG_RTUS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_RTUS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_HPS_EN != 0)
+#define BLE_DBG_HPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_HPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_TPS_EN != 0)
+#define BLE_DBG_TPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_TPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LLS_EN != 0)
+#define BLE_DBG_LLS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LLS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_IAS_EN != 0)
+#define BLE_DBG_IAS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_IAS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_WSS_EN != 0)
+#define BLE_DBG_WSS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_WSS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_LNS_EN != 0)
+#define BLE_DBG_LNS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_LNS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_SCPS_EN != 0)
+#define BLE_DBG_SCPS_MSG PRINT_MESG_DBG
+#else
+#define BLE_DBG_SCPS_MSG PRINT_NO_MESG
+#endif
+
+#if (BLE_DBG_DTS_EN != 0)
+#define BLE_DBG_DTS_MSG PRINT_MESG_DBG
+#define BLE_DBG_DTS_BUF PRINT_LOG_BUFF_DBG
+#else
+#define BLE_DBG_DTS_MSG PRINT_NO_MESG
+#define BLE_DBG_DTS_BUF PRINT_NO_MESG
+#endif
+
+
+#endif /*__BLE_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h
new file mode 100644
index 000000000..3afc2e373
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/cube_hal.h
@@ -0,0 +1,47 @@
+/**
+ ******************************************************************************
+ * @file cube_hal.h
+ * @author AMS VMA RF Application team
+ * @brief
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#ifndef _CUBE_HAL_H_
+#define _CUBE_HAL_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_conf.h"
+
+#define B1_Pin GPIO_PIN_13
+#define B1_GPIO_Port GPIOC
+#define USART_TX_Pin GPIO_PIN_2
+#define USART_TX_GPIO_Port GPIOA
+#define USART_RX_Pin GPIO_PIN_3
+#define USART_RX_GPIO_Port GPIOA
+#define LD2_Pin GPIO_PIN_5
+#define LD2_GPIO_Port GPIOA
+
+#define UART_TX_TIMEOUT 5
+
+#define Uart_Irq_Handler USART2_IRQHandler
+
+
+void SystemClock_Config(void);
+void Init_Device(void);
+void MX_USART2_UART_Init(void);
+
+
+#endif /* _CUBE_HAL_H_ */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s
new file mode 100644
index 000000000..636eb47c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/data.s
@@ -0,0 +1,50 @@
+;/**
+;******************************************************************************
+;* @file data.s
+;* @author BLE Mesh Team
+;* @version V1.07.000
+;* @date 15-June-2018
+;* @brief Memory management
+;******************************************************************************
+;* @attention
+;*
+;* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+;*
+;* 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 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 STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+;*
+;* Initial BlueNRG-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+;* (MoBLE) technology. The present solution is developed and maintained for both
+;* Mesh library and Applications solely by STMicroelectronics.
+;*
+;******************************************************************************
+;*/
+_bdaddr EQU 0x0807E000
+ EXPORT _bdaddr
+
+ AREA CONFIG, READONLY
+_mobleNvmBase_data
+ EXPORT _mobleNvmBase_data
+ FILL 4096, 0x00
+
+ END
+;/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h
new file mode 100644
index 000000000..730c40219
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h
@@ -0,0 +1,55 @@
+/**
+ ******************************************************************************
+ * @file hal_common.h
+ * @author BLE Mesh Team
+ * @brief Common functions of HAL file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef _HAL_H_
+#define _HAL_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#if defined(NUCLEO_L152RE) || defined(USE_STM32WBXX_NUCLEO) || USE_STM32WBXX_USB_DONGLE /* NUCLEO_L152RE */
+#include "user_if.h"
+#else /* not NUCLEO_L152RE */
+#if defined(BLUENRG1) || defined(BLUENRG2) /* BLUENRG1 or BLUENRG2 */
+#include "hal.h"
+#else /* not BLUENRG1 or BLUENRG2 */
+#error "Unsupported board"
+#endif /* BLUENRG1 or BLUENRG2 */
+#endif /* NUCLEO_L152RE */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "types.h"
+
+void SetLed(int state);
+BUTTON_STATE GetButtonState(void);
+BUTTON_STATE GetButton2State(void);
+bool Accel_Process(uint8_t *evt);
+bool Temperature_Read(int16_t *data);
+void InitDevice(void);
+
+void ShouldSleepFunc(void);
+
+#endif /* _HAL_H_ */
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h
new file mode 100644
index 000000000..dd7ae8207
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h
@@ -0,0 +1,257 @@
+/**
+ ******************************************************************************
+ * @file mesh_cfg.h
+ * @author BLE Mesh Team
+* @version V1.12.000
+* @date 06-12-2019
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MESH_CFG_H
+#define __MESH_CFG_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "mesh_cfg_usr.h"
+
+/* Exported macro ------------------------------------------------------------*/
+/* Flash parameters */
+#define PAGE_SIZE 4096
+#define RESET_MANAGER_FLASH_BASE_ADDRESS (0x10040000)
+
+
+#define DEVICE_KEY_SIZE 16U
+#define APP_KEY_SIZE 16U
+#define UUID_SIZE 16U
+
+#define NO_MODEL_AVLBL 0xFFFF
+
+void TraceHeader(const char* func_name, int mode);
+#define TraceB0(func_name, ...)
+#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
+#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
+#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
+
+/*Enable this Macro to enable the main function prints.
+* This trace does not print the function name and clock.
+*/
+#define TraceC0(...)
+#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
+//#define TraceCX(flags, ...) TraceC ##flags( ##__VA_ARGS__)
+#define TraceCX(flags, ...) TraceC ##flags( __VA_ARGS__)
+#define TRACE_I(flag, ...) TraceCX(flag, ##__VA_ARGS__)
+
+void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
+
+#ifdef EXTERNAL_MAC_ADDR_MGMT
+ #define EXTERNAL_MAC_TYPE (uint8_t)(EXTERNAL_MAC_IS_PUBLIC_ADDR<<7)
+#else
+ #define EXTERNAL_MAC_TYPE (uint8_t)0
+#endif
+
+#if (!(GENERATE_STATIC_RANDOM_MAC)) && (!(EXTERNAL_MAC_ADDR_MGMT)) && (!(INTERNAL_UNIQUE_NUMBER_MAC))
+#error "Please select atleast one MAC address Option"
+#endif
+
+#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
+#define ENABLE_SAVE_MODEL_STATE_NVM
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+#define SAVE_MODEL_STATE_NVM 1
+#else
+#define SAVE_MODEL_STATE_NVM 0
+#endif
+
+#define TRANSMIT_RECEIVE_PARAMS \
+{ \
+ TR_GAP_BETWEEN_TRANSMISSION \
+}
+
+#ifdef ENABLE_PB_ADV
+#define PB_ADV_SUPPORTED 1
+#else
+#define PB_ADV_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PB_GATT
+#define PB_GATT_SUPPORTED 1
+#else
+#define PB_GATT_SUPPORTED 0
+#endif
+
+#ifdef ENABLE_PUB_KEY_TYPE_OOB
+#define PUB_KEY_TYPE_OOB MOBLE_TRUE
+#else
+#define PUB_KEY_TYPE_OOB MOBLE_FALSE
+#endif
+
+
+#if (PB_ADV_SUPPORTED == 0 && PB_GATT_SUPPORTED == 0)
+#error "Atleast one of PB-ADV and PB-GATT should be defined"
+#endif
+
+#define BLUENRG_MESH_PRVN_BEARER_INFO (PB_ADV_SUPPORTED << 0 | PB_GATT_SUPPORTED << 1)
+
+#ifdef ENABLE_RELAY_FEATURE
+#define RELAY_FEATURE 1
+#else
+#define RELAY_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROXY_FEATURE
+#define PROXY_FEATURE 1
+#else
+#define PROXY_FEATURE 0
+#endif
+
+#ifdef ENABLE_FRIEND_FEATURE
+#define FRIEND_FEATURE 1
+#else
+#define FRIEND_FEATURE 0
+#endif
+
+#ifdef ENABLE_LOW_POWER_FEATURE
+#define LOW_POWER_FEATURE 1
+#else
+#define LOW_POWER_FEATURE 0
+#endif
+
+#ifdef ENABLE_PROVISIONER_FEATURE
+#define PROVISIONER_FEATURE 1
+#else
+#define PROVISIONER_FEATURE 0
+#endif
+
+#if (LOW_POWER_FEATURE && RELAY_FEATURE)
+#error "Low power node can't be relay node"
+#elif (LOW_POWER_FEATURE && PROXY_FEATURE)
+#error "Low power node can't be proxy node"
+#elif (LOW_POWER_FEATURE && FRIEND_FEATURE)
+#error "Low power node can't be friend node"
+#endif
+
+#define BLUENRG_MESH_FEATURES (RELAY_FEATURE << 0 | PROXY_FEATURE << 1 | FRIEND_FEATURE << 2 | LOW_POWER_FEATURE << 3)
+
+#define FRIEND_NODE_PARAMS \
+{ \
+ FN_NO_OF_LPNS \
+}
+
+#define LOW_POWER_NODE_PARAMS \
+{ \
+ LPN_RSSI_FACTOR_LEVEL, \
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL, \
+ LPN_MINIMUM_QUEUE_SIZE_LOG, \
+ LPN_RECEIVE_DELAY, \
+ LPN_POLL_TIMEOUT, \
+ LPN_FRIEND_REQUEST_FREQUENCY, \
+ LPN_FRIEND_POLL_FREQUENCY, \
+ LPN_RECEIVE_WINDOW_SIZE, \
+ LPN_SUBSCR_LIST_SIZE, \
+ LPN_MINIMUM_RSSI, \
+ LPN_NO_OF_RETRIES \
+}
+
+#define UNPROV_NODE_INFO_PARAMS \
+{ \
+ PUB_KEY_TYPE_OOB, \
+ PubKeyBuff, \
+ PrivKeyBuff, \
+ STATIC_OOB_SIZE, \
+ StaticOobBuff, \
+ OUTPUT_OOB_SIZE, \
+ OUTPUT_OOB_ACTION, \
+ Appli_BleOutputOOBAuthCb, \
+ INPUT_OOB_SIZE, \
+ INPUT_OOB_ACTION, \
+ Appli_BleInputOOBAuthCb \
+}
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+#define NEIGHBOR_TABLE_SUPPORTED 1
+#else
+#define NEIGHBOR_TABLE_SUPPORTED 0
+#endif
+
+#if (NEIGHBOR_TABLE_SUPPORTED == 1)
+#if (NEIGHBOR_COUNT == 0)
+#error "Number of neighbors should be nonzero"
+#endif /* NO_OF_NEIGHBORS */
+#if (NEIGHBOR_ALIVE_TIME == 0)
+#error "Number of neighbor alive time should be nonzero"
+#endif /* NEIGHBOR_ALIVE_TIME */
+#if ((NEIGHBOR_UNPRVND_DEV_BEACON_NTU == 0) && (NEIGHBOR_MSG_TTLX_NTU == 0) && (NEIGHBOR_SECURE_NET_BEACON_NTU == 0))
+#error "Atleast one of Network Table Update trigger should be enabled"
+#endif
+#if (NEIGHBOR_UNPRVND_DEV_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_UNPRVND_DEV_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_UNPRVND_DEV_BEACON_NTU */
+#if (NEIGHBOR_SECURE_NET_BEACON_NTU > 1)
+#error "Invalid valid of NEIGHBOR_SECURE_NET_BEACON_NTU. Allowed value: 0 and 1"
+#endif /* NEIGHBOR_SECURE_NET_BEACON_NTU */
+#if (NEIGHBOR_MSG_TTLX_NTU > 2)
+#error "Invalid valid of NEIGHBOR_MSG_TTLX_NTU. Allowed value: 0, 1 and 2"
+#endif /* NEIGHBOR_MSG_TTLX_NTU */
+#endif /* NEIGHBOR_TABLE_SUPPORTED */
+
+#define NEIGHBOR_TABLE_PARAMS \
+{ \
+ NEIGHBOR_COUNT, \
+ NEIGHBOR_ALIVE_TIME, \
+ NEIGHBOR_UNPRVND_DEV_BEACON_NTU, \
+ NEIGHBOR_SECURE_NET_BEACON_NTU, \
+ NEIGHBOR_MSG_TTLX_NTU \
+}
+
+#if FRIEND_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE FN_NO_OF_LPNS*816+4
+#elif LOW_POWER_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 112U
+#else
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE 4U
+#endif
+
+#define DYNAMIC_MEMORY_SIZE 4096U
+
+#define SEGMENTATION_COUNT (MAX_APPLICATION_PACKET_SIZE / 12) + 2
+#define SAR_BUFFER_SIZE ((uint8_t)SEGMENTATION_COUNT) * 40
+/* Added Interrupt handler for Uart */
+#define SdkEvalComIOUartIrqHandler UART_Handler
+
+#if NEIGHBOR_TABLE_SUPPORTED
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 32U*NEIGHBOR_COUNT
+#else
+#define NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE 0
+#endif
+
+#define SdkEvalComIOUartIrqHandler UART_Handler /* Added Interrupt handler for Uart */
+/******************** Serial Interface Handling Control **********************/
+
+/* Exported variables ------------------------------------------------------- */
+
+extern const DynBufferParam_t DynBufferParam;
+extern const tr_params_t TrParams;
+extern const lpn_params_t LpnParams;
+extern const fn_params_t FnParams;
+extern const prvn_params_t PrvnParams;
+extern const neighbor_table_init_params_t NeighborTableParams;
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLEUINT8 ApplicationSetNodeSigModelList(void);
+MOBLE_RESULT ApplicationInitSigModelList(void);
+MOBLE_RESULT ApplicationInitVendorModelList(void);
+
+#endif /* __MESH_CFG_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg_usr.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h
index 216d69fca..06ff9be51 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/STM32_WPAN/app/mesh_cfg_usr.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h
@@ -1,43 +1,22 @@
+/* USER CODE BEGIN Header */
/**
-******************************************************************************
-* @file mesh_cfg_usr.h
-* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
-* @brief Header file for mesh_usr_cfg.c
-******************************************************************************
-* @attention
-*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
-*
-* 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 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 STMicroelectronics nor the names of its contributors
-* may be used to endorse or promote products derived from this software
-* without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
-*
-* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
-* (MoBLE) technology. The present solution is developed and maintained for both
-* Mesh library and Applications solely by STMicroelectronics.
-*
-******************************************************************************
-*/
+ ******************************************************************************
+ * @file mesh_cfg_usr.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MESH_CFG_USR_H
@@ -48,6 +27,16 @@
/* Exported macro ------------------------------------------------------------*/
+/*
+* Different features supported by BLE-Mesh. Uncomment according to application.
+* Low power feature enabled node do not support other features.
+* Do not define any other feature if Low Power feature is defined
+*/
+#define ENABLE_RELAY_FEATURE
+#define ENABLE_PROXY_FEATURE
+#define ENABLE_FRIEND_FEATURE
+//#define ENABLE_LOW_POWER_FEATURE
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC is responsible for the Generic model traces.
@@ -90,16 +79,17 @@ Either use 0 to disable or 1 to enable
/*******************************************************************************
*** Following section helps to select right configuration of Models ***********
*******************************************************************************/
-/******* Define the following Macros to enable the usage of the Models ******/
-
-#ifdef CLIENT
-#define ENABLE_GENERIC_MODEL_SERVER_ONOFF
-#endif
+/******************************************************************************/
+/* Define the following Macros to enable the usage of the */
+/* Server Generic Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
+/******************************************************************************/
-#ifdef SERVER
-/* Define the following Macros to enable the usage of the Server Generic Models */
-#define ENABLE_GENERIC_MODEL_SERVER_ONOFF
-#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL
//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
@@ -107,10 +97,9 @@ Either use 0 to disable or 1 to enable
/* The Following Models are not available in this version, will be developed in
next version.
*/
-
-//#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
-//#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
/*
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
+#define ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
#define ENABLE_GENERIC_MODEL_SERVER_BATTERY
#define ENABLE_GENERIC_MODEL_SERVER_LOCATION
#define ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
@@ -123,10 +112,14 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
/******* Define the following Macros to enable the usage of the Light Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
/******************************************************************************/
-#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
-#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
//#define ENABLE_LIGHT_MODEL_SERVER_CTL
//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
@@ -143,13 +136,22 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
/* Define the following Macros to enable the usage of the Sensor Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
/******************************************************************************/
-//#define ENABLE_SENSOR_MODEL_SERVER
-//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
+//#define ENABLE_SENSOR_MODEL_SERVER
+//#define ENABLE_SENSOR_MODEL_SERVER_SETUP
/******************************************************************************/
-/* Define the following Macros to enable the usage of the time and scene Models */
+/* Define the following Macros to enable the usage of the time and */
+/* scene Models */
+/* Definition is a bitmap of 3 bits: bit 2 element 3 */
+/* bit 1 element 2 */
+/* bit 0 element 1 */
+/* Example: 6 means Model enabled in element 2 and 3 */
/******************************************************************************/
//#define ENABLE_TIME_MODEL_SERVER
@@ -164,40 +166,8 @@ Either use 0 to disable or 1 to enable
//#define ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
/******* Define the following Macros to enable the vendor model ******/
-//#define ENABLE_VENDOR_MODEL_SERVER
+//#define ENABLE_VENDOR_MODEL_SERVER
#define GENERIC_SERVER_MODEL_PUBLISH
-#endif
-
-#ifdef CLIENT
-/* Define the following Macros to enable the usage of the Client Generic Models */
-#define ENABLE_GENERIC_MODEL_CLIENT_ONOFF
-#define ENABLE_GENERIC_MODEL_CLIENT_LEVEL
-#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
-#define ENABLE_CONFIG_MODEL_CLIENT
-
-/******************************************************************************/
-/*
-Define the Macro for enabling/disabling the Publishing with Generic on off
-or by Vendor Model.
-@ define Macro for Vendor Publishing
-@ Undefine or comment Macro for Generic On Off Publishing
-*/
-//#define VENDOR_CLIENT_MODEL_PUBLISH
-#define GENERIC_CLIENT_MODEL_PUBLISH
-//#define LIGHT_CLIENT_MODEL_PUBLISH
-
-#if defined (ENABLE_GENERIC_MODEL_CLIENT_ONOFF) \
- || defined (ENABLE_GENERIC_MODEL_CLIENT_LEVEL)
-
- #define ENABLE_GENERIC_MODEL_CLIENT
-#endif
-
-#if defined (ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS)
-
- #define ENABLE_LIGHT_MODEL_CLIENT
-#endif
-
-#endif
/******************************************************************************/
/*
@@ -207,7 +177,7 @@ and Light model.
@ Undefine or comment the macro for disabling the binding.
*/
/******************************************************************************/
-//#define ENABLE_MODEL_BINDING
+#define ENABLE_MODEL_BINDING
/* Define the macros for the numbers of sensor present.*/
#define NUMBER_OF_SENSOR 2
@@ -242,7 +212,8 @@ Define the following Macro to check the Power-OnOff Cycles
/*
Define the following Macro to save Generic and Light Model states in NVM
-This may result into excessive flash erase operations, this should be avoided to ensure flash longevity
+This may result into excessive flash erase operations,
+this should be avoided to ensure flash longevity
*/
#define ENABLE_SAVE_MODEL_STATE_NVM
@@ -250,13 +221,8 @@ This may result into excessive flash erase operations, this should be avoided to
//#define SAVE_MODEL_STATE_FOR_ALL_MESSAGES
//#define SAVE_MODEL_STATE_POWER_FAILURE_DETECTION
-/*
-Define the following Macro to save the nodes data in provisioner in NVM
-This may result into excessive flash erase operations, this should be avoided to ensure flash longevity
-*/
-#define SAVE_EMBD_PROVISION_DATA 1
-/* Macros defined for the number of bytes saved, number of bytes dedicated for ganeric
- model and light model.
+/* Macros defined for the number of bytes saved,
+ number of bytes dedicated for generic model and light model.
*/
#define APP_NVM_GENERIC_MODEL_SIZE 16U
#define APP_NVM_LIGHT_MODEL_SIZE 16U
@@ -267,8 +233,8 @@ This may result into excessive flash erase operations, this should be avoided to
*if board has one led, uncomment USER_BOARD_1LED
*if board has cool warm leds, uncomment USER_BOARD_COOL_WHITE_LED
*if board has RGB leds, uncomment USER_BOARD_RGB_LED
-*if board has RGB leds as well as cool warm leds, uncomment USER_BOARD_COOL_WHITE_LED
- and USER_BOARD_RGB_LED
+*if board has RGB leds as well as cool warm leds,
+ uncomment USER_BOARD_COOL_WHITE_LED and USER_BOARD_RGB_LED
*/
/* comment ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME when using
USER_BOARD_COOL_WHITE_LED ,USER_BOARD_RGB_LED
@@ -278,26 +244,31 @@ This may result into excessive flash erase operations, this should be avoided to
//#define USER_BOARD_COOL_WHITE_LED
//#define USER_BOARD_RGB_LED
+/* Pulse Width Modulation support for external LED control */
+#define ENABLE_PWM_SUPPORT 0
+
/* Note: Please use Full Library configuration in project options to use the full
- configuration of the C/C++ runtime library for printf and scanf functionality */
+ configuration of the C/C++ runtime library
+ for printf and scanf functionality */
/* Enables the serial interface using Uart */
#define ENABLE_SERIAL_INTERFACE 1
-#define ENABLE_UT 0
+#define ENABLE_UT 1
#define ENABLE_SERIAL_CONTROL 1
#define ENABLE_APPLI_TEST 0
-#ifdef CLIENT
-#define ENABLE_SERIAL_PRVN 1
-#endif
/*******************************************************************************
*** Following section helps to configure the Application of Mesh ***********
*******************************************************************************/
#define APPLICATION_NUMBER_OF_ELEMENTS 1
+#define APPLICATION_SIG_MODELS_MAX_COUNT 20
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT 2
+
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
-(the list is available @ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers )
+(the list is available
+@ https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers)
For STMicroelectronics : it is 0x0030 */
#define COMPANY_ID 0x0030
@@ -343,7 +314,8 @@ For STMicroelectronics : it is 0x0030 */
/*
-* Different provision bearer supported by BLE-Mesh. Define according to application.
+* Different provision bearer supported by BLE-Mesh.
+* Define according to application.
* Atleast one of PB-ADV and PB-GATT should be defined
*/
#define ENABLE_PB_ADV
@@ -377,29 +349,17 @@ For STMicroelectronics : it is 0x0030 */
#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
#endif
-/*
-* Different features supported by BLE-Mesh. Uncomment according to application.
-* Low power feature enabled node do not support other features.
-* Do not define any other feature if Low Power feature is defined
-*/
-#define ENABLE_RELAY_FEATURE
-#define ENABLE_PROXY_FEATURE
-#define ENABLE_FRIEND_FEATURE
-//#define ENABLE_LOW_POWER_FEATURE
-#ifdef CLIENT
-#define ENABLE_PROVISIONER_FEATURE
-#endif
/*
-* Friend node receive window size is fixed at 50 ms
+* Friend node receive window size is 50 ms
*/
/*
-* Friend node subscription list size is fixed at 4
+* Friend node subscription list size is 4
*/
/*
-* Friend node maximum number of messages is fixed at 16
+* Friend node message queue is 16
*/
/*
@@ -505,7 +465,8 @@ For STMicroelectronics : it is 0x0030 */
#define LPN_NO_OF_RETRIES 10U
/*
-* Maximum address list size buffer in Friend Subscription List Add Message is 10
+* Maximum address list size buffer in
+* Friend Subscription List Add Message is 10
*/
@@ -530,7 +491,8 @@ For STMicroelectronics : it is 0x0030 */
/*
* (unit s)
-* Duration (wrt appear or last refresh) for which neighbor exists in neighbor table
+* Duration (wrt appear or last refresh)
+* for which neighbor exists in neighbor table
*/
#define NEIGHBOR_ALIVE_TIME 20U
@@ -557,17 +519,17 @@ For STMicroelectronics : it is 0x0030 */
#define NEIGHBOR_MSG_TTLX_NTU 0U
/*******************************************************************************
-*** Following section helps to configure the LEDs of Application of Mesh ***********
+*** Following section helps to configure the LEDs of Application of Mesh ***
*******************************************************************************/
#if defined USE_STM32WBXX_NUCLEO || defined USE_STM32WBXX_USB_DONGLE
- #define SINGLE_LED PWM4
- #define COOL_LED PWM0
+ #define SINGLE_LED PWM4
+ #define COOL_LED PWM0
#define WARM_LED PWM1
#define RED_LED PWM2
#define GREEN_LED PWM3
#define BLUE_LED PWM4
-#endif
+#endif
/* Following Macro helps to know if the Fixed functions are needed or not
DO NOT change or add any space at the end of the file */
@@ -584,12 +546,48 @@ For STMicroelectronics : it is 0x0030 */
|| defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
|| defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
|| defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
- || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY)
- #define ENABLE_GENERIC_MODEL_SERVER
- #define GENERIC_SERVER_MODEL_ADD_CONFIGURATION
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (ENABLE_GENERIC_MODEL_SERVER)
+ #define ENABLE_GENERIC_MODEL_SERVER (1)
+#endif
+
+#if defined (ENABLE_GENERIC_MODEL_SERVER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_BATTERY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY) \
+ || defined (ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY) \
+ && !defined (GENERIC_SERVER_MODEL_ADD_CONFIGURATION)
+ #define GENERIC_SERVER_MODEL_ADD_CONFIGURATION (1)
#endif
+/* Following Macro helps to know if the Fixed functions are needed or not
+ DO NOT change or add any space at the end of the file */
+#if defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_HUE) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
+ || defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP) \
+ && !defined (ENABLE_LIGHT_MODEL_SERVER)
+ #define ENABLE_LIGHT_MODEL_SERVER (1)
+#endif
/* Following Macro helps to know if the Fixed functions are needed or not
DO NOT change or add any space at the end of the file */
@@ -606,7 +604,6 @@ For STMicroelectronics : it is 0x0030 */
|| defined(ENABLE_LIGHT_MODEL_SERVER_LC_SETUP) \
|| defined(ENABLE_LIGHT_MODEL_SERVER_XYL) \
|| defined(ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP)
- #define ENABLE_LIGHT_MODEL_SERVER
#define LIGHT_SERVER_MODEL_ADD_CONFIGURATION
#endif
@@ -617,6 +614,7 @@ For STMicroelectronics : it is 0x0030 */
#define ENABLE_TIME_SCENE_MODEL_SERVER
#endif
+
/* Exported variables -------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c
new file mode 100644
index 000000000..f82f3b293
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c
@@ -0,0 +1,627 @@
+/**
+ ******************************************************************************
+ * @file models_if.c
+ * @author BLE Mesh Team
+ * @brief Mesh Modes interface file of the application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "hal_common.h"
+#include "appli_mesh.h"
+#include "vendor.h"
+#include "light.h"
+#include "sensors.h"
+#include "generic.h"
+#include "time_scene.h"
+#include "common.h"
+#include "appli_generic.h"
+#include "appli_vendor.h"
+#include "appli_light.h"
+#include "appli_sensor.h"
+#include "appli_nvm.h"
+#include "ble_hci_le.h"
+#include "models_if.h"
+
+#include "PWM_config.h"
+#include "PWM_handlers.h"
+#include "appli_light_lc.h"
+#include "light_lc.h"
+#include "appli_generic_client.h"
+#include "config_client.h"
+#include "generic_client.h"
+#include "appli_light_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+#pragma pack(1)
+typedef struct
+{
+ MOBLE_ADDRESS peer;
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 command;
+ MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
+ MOBLEUINT32 length;
+} APPLI_SEND_RESPONSE_MODULE;
+
+typedef struct
+{
+ MOBLEUINT8 packet_count;
+ MOBLEUINT32 send_time;
+ APPLI_SEND_RESPONSE_MODULE* head;
+ MOBLEUINT8 head_index;
+ APPLI_SEND_RESPONSE_MODULE packet[MAX_PENDING_PACKETS_QUE_SIZE];
+} APPLI_PENDING_PACKETS;
+#pragma pack(4)
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+
+
+/* Private variables ---------------------------------------------------------*/
+APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
+
+__attribute__((aligned(4)))
+const MOBLE_VENDOR_CB_MAP vendor_cb =
+{
+ Vendor_WriteLocalDataCb,
+ Vendor_ReadLocalDataCb,
+ Vendor_OnResponseDataCb
+};
+
+__attribute__((aligned(4)))
+const Appli_Vendor_cb_t VendorAppli_cb =
+{
+ /*Vendor Commads*/
+ Appli_Vendor_LEDControl,
+ Appli_Vendor_DeviceInfo,
+ Appli_Vendor_Test,
+ Appli_LedCtrl,
+ Appli_GetTestValue,
+ Appli_Vendor_Data_write
+};
+
+__attribute__((aligned(4)))
+const Appli_Generic_cb_t GenericAppli_cb =
+{
+ /* Generic OnOff callbacks */
+ Appli_Generic_OnOff_Set,
+ /* Generic OnOff Status callbacks */
+ Appli_Generic_OnOff_Status,
+ /* Generic Level callbacks */
+ Appli_Generic_Level_Set,
+ Appli_Generic_Delta_Set,
+ Appli_Generic_Move_Set,
+ /* Generic Level Status callbacks */
+ Appli_Generic_Level_Status,
+ /* Generic Power on off callbacks */
+ Appli_Generic_PowerOnOff_Set,
+ /* Generic Power on off callbacks */
+ Appli_Generic_PowerOnOff_Status,
+
+ /* Generic Default transition time callbacks */
+ Appli_Generic_DefaultTransitionTime_Set,
+ /* Generic Default transition time callbacks */
+ Appli_Generic_DefaultTransitionTime_Status
+};
+
+__attribute__((aligned(4)))
+const Appli_Generic_State_cb_t Appli_GenericState_cb =
+{
+
+ /* Generic Get On Off status */
+ Appli_Generic_GetOnOffStatus,
+ Appli_Generic_GetOnOffValue,
+ /* Generic Get level status */
+ Appli_Generic_GetLevelStatus,
+ /* Generic Get Power on off status */
+ Appli_Generic_GetPowerOnOffStatus,
+ /* Generic Get Default transition time status */
+ Appli_Generic_GetDefaultTransitionStatus
+};
+
+__attribute__((aligned(4)))
+const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+{
+ Appli_Light_GetLightnessStatus,
+ Appli_Light_GetLightnessLinearStatus,
+ Appli_Light_GetLightnessDefaultStatus,
+ Appli_Light_GetLightnessLastStatus,
+ Appli_Light_GetLightnessRangeStatus,
+ Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTemperatureStatus,
+ Appli_Light_GetCtlTemperatureRange,
+ Appli_Light_GetCtlDefaultStatus,
+ Appli_Light_GetHslStatus,
+ Appli_Light_GetHslHueStatus,
+ Appli_Light_GetHslSaturationStatus,
+ Appli_Light_GetHslHueRange,
+ Appli_Light_GetHslSatRange,
+ Appli_Light_GetHslDefaultStatus
+};
+
+
+__attribute__((aligned(4)))
+const Appli_Light_cb_t LightAppli_cb =
+{
+ /* Light Lightness callbacks */
+ Appli_Light_Lightness_Set,
+ Appli_Light_Lightness_Status,
+
+ Appli_Light_Lightness_Linear_Set,
+ Appli_Light_Lightness_Linear_Status,
+
+ Appli_Light_Lightness_Default_Set,
+ Appli_Light_Lightness_Default_Status,
+
+ Appli_Light_Lightness_Range_Set,
+ Appli_Light_Lightness_Range_Status,
+
+ Appli_Light_Ctl_Set,
+ Appli_Light_Ctl_Status,
+
+ Appli_Light_CtlTemperature_Set,
+ Appli_Light_CtlTemperature_Status,
+
+ Appli_Light_CtlTemperature_Range_Set,
+ Appli_Light_CtlTemperature_Range_Status,
+
+ Appli_Light_CtlDefault_Set,
+ Appli_Light_CtlDefault_Status,
+
+ Appli_Light_Hsl_Set,
+ Appli_Light_Hsl_Status,
+
+ Appli_Light_HslHue_Set,
+ Appli_Light_HslHue_Status,
+
+ Appli_Light_HslSaturation_Set,
+ Appli_Light_HslSaturation_Status,
+
+ Appli_Light_HslDefault_Set,
+ Appli_Light_HslDefault_Status,
+
+ Appli_Light_HslRange_Set,
+ Appli_Light_HslRange_Status
+};
+
+
+__attribute__((aligned(4)))
+const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+{
+ /* Light LC mode set callbacks */
+ Appli_LightLC_Mode_Set,
+ Appli_LightLC_OM_Set,
+ Appli_LightLC_OnOff_Set,
+};
+
+__attribute__((aligned(4)))
+const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+{
+ Appli_LightLC_Get_ModeStatus,
+ Appli_LightLC_Get_OMModeStatus,
+ Appli_LightLC_Get_OnOffStatus,
+ Appli_LightLC_Get_AmbientLuxLevelOutput,
+ Appli_Light_LC_PIRegulatorOutput,
+};
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+
+__attribute__((aligned(4)))
+const Appli_Sensor_cb_t SensorAppli_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_Cadence_Set,
+ Appli_Sensor_Data_Status,
+ Appli_Sensor_Descriptor_Status ,
+ Appli_Sensor_Setting_Set
+};
+
+__attribute__((aligned(4)))
+const Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+{
+ Appli_Sensor_GetSettingStatus,
+ Appli_Sensor_GetSetting_IDStatus
+};
+
+#endif
+
+
+__attribute__((aligned(4)))
+const MODEL_SIG_cb_t Model_SIG_cb[] =
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER
+ {
+ GenericModelServer_GetOpcodeTableCb,
+ GenericModelServer_GetStatusRequestCb,
+ GenericModelServer_ProcessMessageCb
+ },
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER
+ {
+ LightModelServer_GetOpcodeTableCb,
+ LightModelServer_GetStatusRequestCb,
+ LightModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+{
+ SensorModelServer_GetOpcodeTableCb,
+ SensorModelServer_GetStatusRequestCb,
+ SensorModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
+ {
+ Time_SceneModelServer_GetOpcodeTableCb,
+ Time_SceneModelServer_GetStatusRequestCb,
+ Time_SceneModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ {
+ Light_LC_ModelServer_GetOpcodeTableCb,
+ Light_LC_ModelServer_GetStatusRequestCb,
+ Light_LC_ModelServer_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_GENERIC_MODEL_CLIENT
+ {
+ GenericModelClient_GetOpcodeTableCb,
+ GenericModelClient_GetStatusRequestCb,
+ GenericModelClient_ProcessMessageCb
+ },
+#endif
+#ifdef ENABLE_CONFIG_MODEL_CLIENT
+ {
+ ConfigClientModel_GetOpcodeTableCb,
+ ConfigClientModel_GetStatusRequestCb,
+ ConfigClientModel_ProcessMessageCb
+ },
+#endif
+
+ { 0, 0,0 }
+};
+
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+
+#define MODEL_SIG_COUNT ( ( sizeof(Model_SIG_cb)/sizeof(Model_SIG_cb[0]) - 1 ))
+
+__attribute__((aligned(4)))
+const MODEL_Vendor_cb_t Model_Vendor_cb[] =
+{
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ {
+ VendorModel_PID1_GetOpcodeTableCb,
+ VendorModel_PID1_GetStatusRequestCb,
+ VendorModel_PID1_ProcessMessageCb
+ },
+#endif
+ { 0, 0,0 }
+};
+
+#define MODEL_VENDOR_COUNT ( ( sizeof(Model_Vendor_cb)/sizeof(Model_Vendor_cb[0]) - 1 ))
+
+extern MOBLEUINT8 NumberOfElements;
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUINT32* VendorModelscount)
+{
+ *pModelsTable = Model_Vendor_cb ;
+ *VendorModelscount = MODEL_VENDOR_COUNT;
+
+ TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+}
+
+/**
+* @brief Initialization Commands for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsInit(void)
+{
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+
+ MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
+
+#ifdef CLIENT
+ MOBLEUINT8 PrvnStateLoad_Size;
+ MOBLEUINT8 PrvnlStateLoadBuff[16];
+#endif
+
+ /* Callbacks used by BlueNRG-Mesh Models */
+ BLEMesh_SetSIGModelsCbMap(Model_SIG_cb, MODEL_SIG_COUNT);
+
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
+
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
+ if (modelStateLoad_Size != 0)
+ {
+ /* update states of generic model */
+ Model_RestoreStates(modelStateLoadBuff, modelStateLoad_Size);
+ }
+
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initiallization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+#endif
+}
+
+/**
+* @brief Process Commands for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsProcess(void)
+{
+#ifdef ENABLE_GENERIC_MODEL_SERVER
+ Generic_Process();
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER
+ Lighting_Process();
+#endif
+
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ Vendor_Process();
+#endif
+/* Define this Macro to enable the publication of sensors data.*/
+#if defined ENABLE_SENSOR_MODEL_SERVER
+ Sensor_Process();
+#endif
+
+#if ENABLE_APPLI_TEST
+ Test_Process();
+#endif
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+ ModelSave_Process();
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Light_control_Process();
+#endif
+}
+
+/**
+* @brief Publish Command for Models
+* @param void
+* @retval void
+*/
+void BLEMesh_ModelsCommand(void)
+{
+#ifdef VENDOR_CLIENT_MODEL_PUBLISH
+ Vendor_Publish(BLEMesh_GetAddress());
+#endif
+
+#ifdef GENERIC_CLIENT_MODEL_PUBLISH
+ Appli_GenericClient_OnOff_Set();
+#endif
+
+#ifndef CLIENT
+/* if CLIENT and SERVER => Publish is already done in CLIENT */
+#ifdef GENERIC_SERVER_MODEL_PUBLISH
+ Generic_Publish(BLEMesh_GetAddress());
+#endif
+#endif
+
+}
+
+/**
+* @brief Get the Element Number for selected Model
+* @param dst_peer : Destination Address received
+* @retval MOBLEUINT8 : elementIndex
+*/
+MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
+{
+
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementNumber;
+
+ nodeAddress = BLEMesh_GetAddress();
+ elementNumber = ((dst_peer - nodeAddress)+1);
+
+ return elementNumber;
+}
+
+/**
+* @brief Check Subscription of Elements for Group Address for selected Model
+* @param dst_peer : Destination Address received
+* @param elementNumber : Number of element to check Subscription
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
+ MOBLEUINT8 elementNumber)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_FAIL;
+ MOBLE_ADDRESS subscriptionList[10] = {0};
+ MOBLEUINT8 length;
+ MOBLEUINT32 modelId = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
+ BLEMesh_GetSubscriptionAddress(subscriptionList,&length,elementNumber, modelId);
+
+
+ for(uint8_t list=0; list<length; list++)
+ {
+ if(dst_peer == subscriptionList[list])
+ {
+ status = MOBLE_RESULT_SUCCESS;
+ break;
+ }
+ }
+
+ return status;
+}
+
+/**
+* @brief Schedule a packet to be sent with randomized send timestamp
+* If a que is empty, random timestamp is calculated
+* Subsequent packets are sent in sequence
+* @param peer: Address of the peer
+* @param dst : Address of the node
+* @param status: Command status
+* @param data: Data buffer.
+* @param length: Length of data in bytes.
+* @retval None
+*/
+void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
+ MOBLE_ADDRESS dst,
+ MOBLEUINT8 command,
+ MOBLEUINT8 const * data,
+ MOBLEUINT32 length)
+{
+ MOBLEUINT8 random_time[8];
+
+ if (Appli_PendingPackets.packet_count == 0)
+ {
+ Appli_PendingPackets.packet_count = 1;
+ hci_le_rand(random_time);
+ Appli_PendingPackets.send_time = Clock_Time() +
+ DEFAULT_DELAY_PACKET_FROM +
+ (random_time[0] + random_time[1]*256)\
+ %DEFAULT_DELAY_PACKET_RANDOM_TIME;
+ Appli_PendingPackets.head = Appli_PendingPackets.packet;
+ Appli_PendingPackets.head_index = 0;
+ TRACE_M(TF_MISC, "Randomized time: %ld\n\r", Appli_PendingPackets.send_time - Clock_Time());
+ }
+ else
+ {
+ Appli_PendingPackets.packet_count += 1;
+ Appli_PendingPackets.packet_count = (Appli_PendingPackets.packet_count)%\
+ (MAX_PENDING_PACKETS_QUE_SIZE+1);
+
+ if (Appli_PendingPackets.head != (Appli_PendingPackets.packet + \
+ MAX_PENDING_PACKETS_QUE_SIZE - 1))
+ {
+ Appli_PendingPackets.head = Appli_PendingPackets.head +1;
+ Appli_PendingPackets.head_index = Appli_PendingPackets.head_index+1;
+ }
+ else
+ {
+ Appli_PendingPackets.head = Appli_PendingPackets.packet;
+ Appli_PendingPackets.head_index = 0;
+ }
+ }
+
+ Appli_PendingPackets.head->peer = peer;
+ Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->command = command;
+ Appli_PendingPackets.head->length = length;
+ for (MOBLEUINT8 count=0; count<length; count++)
+ Appli_PendingPackets.head->data[count] = data[count];
+}
+
+
+/**
+* @brief If send timestamp is reached and que is not empty, send all packets
+* @param None
+* @retval None
+*/
+void BLEMesh_ModelsSendDelayedPacket(void)
+{
+ APPLI_SEND_RESPONSE_MODULE* ptr;
+ MOBLEUINT8 temp_index;
+
+ if ((Appli_PendingPackets.packet_count != 0) &&
+ (Appli_PendingPackets.send_time <= Clock_Time()))
+ {
+ for (MOBLEUINT8 count=Appli_PendingPackets.packet_count; count!=0; count--)
+ {
+ TRACE_M(TF_MISC, "Sending randomized packets. Packet count: %d \n\r",\
+ Appli_PendingPackets.packet_count - count + 1);
+ temp_index = ((Appli_PendingPackets.head_index+MAX_PENDING_PACKETS_QUE_SIZE+1)\
+ -count)%MAX_PENDING_PACKETS_QUE_SIZE;
+ ptr = Appli_PendingPackets.packet + temp_index;
+
+ VendorModel_SendResponse(VENDOR_STMICRO_CID,
+ ptr->peer,
+ ptr->dst,
+ ptr->command,
+ ptr->data,
+ ptr->length);
+ }
+
+ Appli_PendingPackets.packet_count = 0;
+ }
+}
+
+/** \brief Set remote publication for the given Model ID & node Address
+* User is responsible for serializing data into \a data buffer. Vendor_WriteLocalDataCb
+* callback will be called on the remote device.
+* @param modelId ID of the model.
+* @param srcAddress element Address of the Node
+* @param command vendor model commands
+* @param data Data buffer.
+* @param length Length of data in bytes.
+* @param response If 'MOBLE_TRUE', used to get the response. If 'MOBLE_FALSE', no response
+* @return MOBLE_RESULT_SUCCESS on success.
+*/
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 elementIdx,
+ MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
+ MOBLEUINT32 length, MOBLEBOOL ack_flag,
+ MOBLEUINT8 isVendor)
+{
+ MOBLE_ADDRESS srcAddress;
+
+ srcAddress = BLEMesh_GetAddress();
+ srcAddress += elementIdx; /* Get the Address to send in the message */
+
+ return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ srcAddress ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+}
+
+/**
+* @brief Convert ASCII value into Character
+* @param tempValue : 8bit value for conversion
+* @retval MOBLEUINT8
+*/
+MOBLEUINT8 BLEMesh_ModelsASCII_To_Char(MOBLEUINT8 tempValue)
+{
+ tempValue = tempValue - 0x30;
+ return tempValue;
+}
+
+__weak void Test_Process(void)
+{
+}
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h
new file mode 100644
index 000000000..486e0bcec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h
@@ -0,0 +1,50 @@
+/**
+ ******************************************************************************
+ * @file models_if.h
+ * @author BLE Mesh Team
+ * @brief Mesh Modes interface file header
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MODELS_H
+#define __MODELS_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+void BLEMesh_ModelsInit(void);
+void BLEMesh_ModelsProcess(void);
+void BLEMesh_ModelsCommand(void);
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, MOBLEUINT8 elementNumber);
+MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer, MOBLE_ADDRESS dst, MOBLEUINT8 command,
+ MOBLEUINT8 const * data, MOBLEUINT32 length);
+void BLEMesh_ModelsSendDelayedPacket(void);
+MOBLEUINT8 BLEMesh_ModelsASCII_To_Char(MOBLEUINT8 tempValue);
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLE_ADDRESS element_number,
+ MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
+ MOBLEUINT32 length, MOBLEBOOL ack_flag,
+ MOBLEUINT8 isVendor);
+
+#endif /* __MODELS_H */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c
new file mode 100644
index 000000000..04bc07489
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c
@@ -0,0 +1,446 @@
+/**
+ ******************************************************************************
+ * @file pal_nvm.c
+ * @author BLE Mesh Team
+ * @brief Flash management for the Controller
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+******************************************************************************
+*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "pal_nvm.h"
+#include "pal_if.h"
+#include <string.h>
+
+#include "ble.h"
+#include "shci.h"
+#include "mesh_cfg_usr.h"
+
+#include "hw_flash.h"
+
+/* Private define ------------------------------------------------------------*/
+#define FLASH_SECTOR_SIZE 0x1000
+#define MAX_NVM_PENDING_WRITE_REQS 1
+
+/* Private variables ---------------------------------------------------------*/
+typedef struct
+{
+ MOBLEUINT16 offset;
+ MOBLEUINT16 size;
+ void const *buff;
+} BNRGM_NVM_WRITE;
+
+typedef struct
+{
+ MOBLEUINT8 no_of_pages_to_be_erased;
+ MOBLEUINT8 no_of_write_reqs;
+ MOBLEBOOL backup_req;
+ BNRGM_NVM_WRITE write_req[MAX_NVM_PENDING_WRITE_REQS];
+} BNRGM_NVM_REQS;
+
+BNRGM_NVM_REQS BnrgmNvmReqs = {0};
+
+/* Private functions ---------------------------------------------------------*/
+/**
+ * @brief Gets the page of a given address
+ * @param Addr: Address of the FLASH Memory
+ * @retval The page of a given address
+ */
+static MOBLEUINT32 GetPage(MOBLEUINT32 Addr)
+{
+ MOBLEUINT32 page = 0;
+
+ if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
+ {
+ /* Bank 1 */
+ page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
+ }
+ else
+ {
+ /* Bank 2 */
+ page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
+ }
+
+ return page;
+}
+
+#if 0
+/**
+* @brief PalNvmErase
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
+ MOBLEUINT32 offset)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+ uint32_t pageError = 0;
+
+// printf("PalNvmErase >>>\r\n");
+
+ FLASH_EraseInitTypeDef erase;
+ erase.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase.Page = GetPage(address + offset); /* 126 or 127 */;
+ erase.NbPages = FLASH_SECTOR_SIZE >> 12;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON);
+
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ status = HAL_FLASHEx_Erase(&erase, &pageError);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+
+// printf("PalNvmErase <<<\r\n");
+
+ return status == HAL_OK ? MOBLE_RESULT_SUCCESS : MOBLE_RESULT_FAIL;
+}
+#endif
+
+/**
+* @brief returns NVM write protect status
+* @param None
+* @retval TRUE if flash is write protected
+*/
+MOBLEBOOL MoblePalNvmIsWriteProtected(void)
+{
+ /* All flash is writable */
+ return MOBLE_FALSE;
+}
+
+/**
+* @brief Read NVM
+* @param address: read start address of nvm
+* @param offset: offset read start address of nvm
+* @param buf: copy of read content
+* @param size: size of memory to be read
+* @param backup: If read from backup memory
+* @retval Result of read operation
+*/
+MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void *buf,
+ MOBLEUINT32 size,
+ MOBLEBOOL backup)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+// printf("MoblePalNvmRead >>>\r\n");
+
+ if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ memcpy(buf, (void *)(address + offset), size);
+ }
+
+// printf("MoblePalNvmRead <<<\r\n");
+ return result;
+}
+
+/**
+* @brief Compare with NVM
+* @param offset: start address of nvm to compare
+* @param offset: offset start address of nvm
+* @param buf: copy of content
+* @param size: size of memory to be compared
+* @param comparison: outcome of comparison
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size,
+ MOBLE_NVM_COMPARE* comparison)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+// printf("MoblePalNvmCompare >>>\r\n");
+
+ if ((comparison == NULL) || (buf == NULL))
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ *comparison = MOBLE_NVM_COMPARE_EQUAL;
+
+ uint8_t* src = (uint8_t*)buf;
+ uint8_t* dst = (uint8_t*)(address + offset);
+
+ for (MOBLEUINT32 i=0; i<size; ++i)
+ {
+ if ((src[i] != dst[i]) && (*comparison == MOBLE_NVM_COMPARE_EQUAL))
+ {
+ *comparison = MOBLE_NVM_COMPARE_NOT_EQUAL;
+ }
+ if ((src[i] & dst[i]) != dst[i])
+ {
+ *comparison = MOBLE_NVM_COMPARE_NOT_EQUAL_ERASE;
+ break;
+ }
+ }
+ }
+
+// printf("MoblePalNvmCompare <<<\r\n");
+#else
+ *comparison = MOBLE_NVM_COMPARE_EQUAL;
+#endif
+ return result;
+}
+
+/**
+* @brief Erase NVM
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmErase(MOBLEUINT32 address,
+ MOBLEUINT32 offset)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+ uint32_t pageError = 0;
+
+// printf("MoblePalNvmErase >>>\r\n");
+
+ FLASH_EraseInitTypeDef erase;
+ erase.TypeErase = FLASH_TYPEERASE_PAGES;
+ erase.Page = GetPage(address + offset); /* 126 or 127 */;
+ erase.NbPages = FLASH_SECTOR_SIZE >> 12;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON);
+
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ status = HAL_FLASHEx_Erase(&erase, &pageError);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+
+ SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF);
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+
+// printf("MoblePalNvmErase <<<\r\n");
+
+ return status == HAL_OK ? MOBLE_RESULT_SUCCESS : MOBLE_RESULT_FAIL;
+}
+
+/**
+* @brief Write to NVM
+* @param offset: wrt start address of nvm
+* @param offset: offset wrt start address of nvm
+* @param buf: copy of write content
+* @param size: size of memory to be written
+* @retval Result
+*/
+MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address,
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 remain = 0;
+ MOBLEUINT32 nb_dword = 0;
+
+#ifdef ENABLE_SAVE_MODEL_STATE_NVM
+
+ // printf("MoblePalNvmWrite >>>\r\n");
+
+ if (offset > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size == 0)
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ else if (offset + size > NVM_SIZE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (offset & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else if (size & 3)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ nb_dword = (size >> 3);
+ remain = size - ((nb_dword) << 3);
+ if(remain > 0)
+ nb_dword += 1;
+
+ uint64_t* src = (uint64_t*)buf;
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) );
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR | FLASH_FLAG_SIZERR | FLASH_FLAG_PGAERR);
+
+ for (size_t i = 0; i < nb_dword/*size*/; i++)
+ {
+ do
+ {
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address + offset + (i <<3), src[i]);
+ while(LL_FLASH_IsActiveFlag_OperationSuspended());
+ } while(*((uint64_t*)(address + offset + (i <<3))) != src[i]);
+ }
+
+ HAL_FLASH_Lock();
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 );
+ }
+// printf("MoblePalNvmWrite <<<\r\n");
+#endif
+
+ return result;
+}
+
+#if 0
+/**
+* @brief Backup process
+* @param None
+* @retval Result
+*/
+static MOBLE_RESULT BnrgmPalNvmBackupProcess(void)
+{
+ MOBLEUINT32 buff[4*N_BYTES_WORD];
+ static MOBLEUINT8 backup_pages_to_be_erased = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (backup_pages_to_be_erased == 0)
+ {
+ backup_pages_to_be_erased = 1;
+ }
+
+ if(backup_pages_to_be_erased != 0)
+ {
+#if 0
+ BluenrgMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ if(BluenrgMesh_IsFlashReadyToErase())
+ {
+ FLASH_ErasePage((uint16_t)((BNRGM_NVM_BACKUP_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE +
+ BNRGM_NVM_BACKUP_SIZE/PAGE_SIZE - backup_pages_to_be_erased));
+
+ if (FLASH_GetFlagStatus(Flash_CMDERR) == SET)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ backup_pages_to_be_erased--;
+ }
+ }
+ else
+ {
+ /* do nothing */
+ }
+ ATOMIC_SECTION_END();
+#else
+ result = PalNvmErase(NVM_BASE, FLASH_SECTOR_SIZE);
+ if(result == MOBLE_RESULT_SUCCESS)
+ backup_pages_to_be_erased = 0;
+#endif
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS && backup_pages_to_be_erased == 0)
+ {
+#if 0
+ BluenrgMesh_StopAdvScan();
+ ATOMIC_SECTION_BEGIN();
+ if(BluenrgMesh_IsFlashReadyToErase())
+ {
+ for (size_t i = 0; i < BNRGM_NVM_BACKUP_SIZE && FLASH_GetFlagStatus(Flash_CMDERR) == RESET; )
+ {
+ memcpy((MOBLEUINT8*)buff, (void *)(BNRGM_NVM_BASE + i), 4*N_BYTES_WORD);
+ FLASH_ProgramWordBurst(BNRGM_NVM_BACKUP_BASE + i, (uint32_t*)buff);
+ i += 4*N_BYTES_WORD;
+ }
+
+ if (FLASH_GetFlagStatus(Flash_CMDERR) == SET)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ BnrgmNvmReqs.backup_req = MOBLE_FALSE;
+ }
+ }
+ else
+ {
+ /* do nothing */
+ }
+ ATOMIC_SECTION_END();
+#else
+#endif
+ }
+ return result;
+}
+#endif
+
+/**
+* @brief NVM process
+* @param None
+* @retval Result
+*/
+MOBLE_RESULT BnrgmPalNvmProcess(void)
+{
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c
new file mode 100644
index 000000000..1dce9189e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/svcctl_conf.c
@@ -0,0 +1,82 @@
+/**
+ ******************************************************************************
+ * @file svctl_conf.c
+ * @author MCD Application Team
+ * @brief Configuration of the BLE service controller
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "app_common.h"
+
+#include "otp.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define BD_ADDR_SIZE_LOCAL 6
+
+/* Private variables ---------------------------------------------------------*/
+static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
+{
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
+ (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
+};
+
+static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
+
+const uint8_t* SVCCTL_GetBdAddress( void )
+{
+ uint8_t *otp_addr;
+ const uint8_t *bd_addr;
+ uint32_t udn;
+ uint32_t company_id;
+ uint32_t device_id;
+
+ udn = LL_FLASH_GetUDN();
+
+ if(udn != 0xFFFFFFFF)
+ {
+ company_id = LL_FLASH_GetSTCompanyID();
+ device_id = LL_FLASH_GetDeviceID();
+
+ bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
+ bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
+ bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
+ bd_addr_udn[3] = (uint8_t)device_id;
+ bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
+ bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
+
+ bd_addr = (const uint8_t *)bd_addr_udn;
+ }
+ else
+ {
+ otp_addr = OTP_Read(0);
+ if(otp_addr)
+ {
+ bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
+ }
+ else
+ {
+ bd_addr = M_bd_addr;
+ }
+
+ }
+
+ return bd_addr;
+}
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h
new file mode 100644
index 000000000..6df3dc0c7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_conf.h
@@ -0,0 +1,33 @@
+/**
+ ******************************************************************************
+ * @file tl_conf.h
+ * @author MCD Application Team
+ * @brief Transport Layer Configuration
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_CONF_H
+#define __TL_CONF_H
+
+/**
+ * It shall be set to 1 for power optimization when standby is supported
+ */
+#define CFG_BLE_HCI_STDBY 0
+
+
+
+#endif /*__TL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c
new file mode 100644
index 000000000..609ca64cf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_if.c
@@ -0,0 +1,47 @@
+/**
+ ******************************************************************************
+ * @file tl_if.c
+ * @author MCD Application Team
+ * @brief Transport layer interface to BLE
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "app_common.h"
+
+#include "hci_tl.h"
+#include "shci_tl.h"
+#include "tl.h"
+
+
+void hci_register_io_bus(tHciIO* fops)
+{
+ /* Register IO bus services */
+ fops->Init = TL_BLE_Init;
+ fops->Send = TL_BLE_SendCmd;
+
+ return;
+}
+
+void shci_register_io_bus(tSHciIO* fops)
+{
+ /* Register IO bus services */
+ fops->Init = TL_SYS_Init;
+ fops->Send = TL_SYS_SendCmd;
+
+ return;
+}
+
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c
new file mode 100644
index 000000000..43a0e548d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.c
@@ -0,0 +1,364 @@
+/**
+******************************************************************************
+* @file user_if.c
+* @author BLE Mesh Team
+* @version V1.09.000
+* @date 15-Oct-2018
+* @brief User interface file
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BlueNRG-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+/* Includes ------------------------------------------------------------------*/
+#include "cube_hal.h"
+#include "ble_clock.h"
+#include "hci.h"
+#include "user_if.h"
+#include "hal.h"
+#include "hal_common.h"
+#include "mesh_cfg.h"
+
+#include <stdio.h>
+#ifdef IAR
+#include <yfuns.h>
+#else
+#define _LLIO_STDIN 0
+#define _LLIO_STDOUT 1
+#define _LLIO_STDERR 2
+#define _LLIO_ERROR ((size_t)-1) /* For __read and __write. */
+#endif
+
+
+
+typedef struct _IO_ReceiveCallBack
+{
+ /**
+ * callback to notify the application with the received I/O data
+ */
+ IO_RECEIVE_DATA_USER_CALLBACK_TYPE IO_user_application;
+} IO_ReceiveCallBack;
+/**
+* @}
+*/
+
+#define READ_DATA_SIZE 1024
+#define READ_BUFFER_IS_EMPTY() (Read_ptr_in == Read_ptr_out)
+
+/* IO User Callback used to handle received data from I/O channel*/
+static uint8_t Read_Buffer [READ_DATA_SIZE];
+static uint32_t Read_ptr_in = 0;
+static uint32_t Read_ptr_out = 0;
+/*static volatile uint8_t s_SdkEvalVersion = ID_UNKNOWN;*/
+static IO_ReceiveCallBack IO_Receive_Data;
+static void SdkEval_IO_processInputData(uint8_t * rx_data, uint16_t data_size);
+
+
+/**
+* @brief SetLed Sets the state of led
+* @param int state State for the led GPIO
+* @retval void
+*/
+void SetLed(int state)
+{
+ if (state)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
+}
+
+#if 0
+/**
+* @brief GetButtonState
+* @param void
+* @retval BUTTON_STATE returns the status of the userbutton GPIO
+*/
+BUTTON_STATE GetButtonState(void)
+{
+ return HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
+}
+
+/**
+* @brief InitButton initializes the GPIO for the user button
+* @param void
+* @retval void
+*/
+void InitButton(void)
+{
+ GPIO_InitTypeDef init;
+ init.Pin = GPIO_PIN_13;
+ init.Mode = GPIO_MODE_INPUT | GPIO_MODE_EVT_FALLING;
+ init.Pull = GPIO_NOPULL;
+ init.Speed = GPIO_SPEED_VERY_LOW;
+ init.Alternate = 0;
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOC, &init);
+ EXTI->FTSR |= EXTI_RTSR_TR13; /* enable wake-up event on falling edge */
+ EXTI->IMR &= ~EXTI_IMR_MR13; /* disable interrupt */
+ EXTI->EMR |= EXTI_EMR_MR13; /* enable event */
+}
+#endif
+
+/**
+* @brief processInputData
+* @param uint8_t * rx_data pointer to receive data
+* @param uint16_t data_size size of receive data
+* @retval void
+*/
+void processInputData(uint8_t * rx_data, uint16_t data_size)
+{
+ SdkEval_IO_processInputData(rx_data, data_size);
+}
+
+/**
+* @brief Configure the selected I/O communication channel
+* @param None.
+* @retval None.
+*/
+void SdkEval_IO_Config(IO_RECEIVE_DATA_USER_CALLBACK_TYPE io_receive_function)
+{
+ IO_Receive_Data.IO_user_application = io_receive_function;
+#if defined (ENABLE_USB)
+ /* Init Device Library */
+ USBD_Init(&USBD_Device, &VCP_Desc, 0);
+
+ /* Add Supported Class */
+ USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
+
+ /* Add CDC Interface Class */
+ USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
+
+ /* Start Device Process */
+ USBD_Start(&USBD_Device);
+
+#elif defined (ENABLE_USART)
+ /* Init Serial Uart */
+ MX_USART2_UART_Init();
+#endif
+}
+
+/**
+* @brief InitDevice intitializes the Device
+* @param void
+* @retval void
+*/
+void InitDevice(void)
+{
+ Init_Device(); /* Initializes HAL and System Clock */
+
+#ifndef NEWLIB_SYSCALLS
+ SdkEval_IO_Config(processInputData);
+#endif
+ /* Delay for debug purpose, in order to see printed data at startup. */
+#if defined(ENABLE_USART)
+ Clock_Wait(2000);
+#endif
+
+#if defined(ACCELEROMETER_TYPE) || defined(THERMOMETER_TYPE)
+ I2C_Reset();
+ Temperature_Init();
+ Accel_Init();
+#endif
+ InitButton();
+}
+
+
+/**
+* @brief ShouldSleepFunc sleep mode fuction
+* @param void
+* @retval void
+*/
+void ShouldSleepFunc(void)
+{
+ __disable_irq();
+ __WFE();
+ __NOP();
+ __enable_irq();
+}
+
+/**
+* @brief Receive data on selected I/O port
+* @param rx_data pointer to buffer of received
+* @param data_size number of received data
+* @retval None.
+*/
+void SdkEval_IO_Receive_Data(uint8_t * rx_data, uint16_t data_size)
+{
+ if(IO_Receive_Data.IO_user_application)
+ IO_Receive_Data.IO_user_application(rx_data,data_size);
+
+}
+/**
+* @brief Read buffer push
+* @param byte
+* @retval None.
+*/
+void Read_Buffer_Push(uint8_t byte)
+{
+ Read_Buffer[Read_ptr_in] = byte;
+
+ Read_ptr_in++;
+
+ /* To avoid buffer overflow */
+ if(Read_ptr_in == READ_DATA_SIZE)
+ {
+ Read_ptr_in = 0;
+ }
+}
+/**
+* @brief Read buffer pop
+* @param byte
+* @retval None.
+*/
+int Read_Buffer_Pop(uint8_t *byte)
+{
+ if(READ_BUFFER_IS_EMPTY())
+ return 0;
+
+ *byte = Read_Buffer[Read_ptr_out];
+
+ Read_ptr_out++;
+
+ if(Read_ptr_out == READ_DATA_SIZE)
+ Read_ptr_out = 0;
+
+ return 1;
+}
+/**
+* @brief Process input data
+* @param byte
+* @retval None.
+*/
+static void SdkEval_IO_processInputData(uint8_t * rx_data, uint16_t data_size)
+{
+ for(int i = 0; i < data_size; i++){
+ Read_Buffer_Push(rx_data[i]);
+ }
+}
+extern UART_HandleTypeDef huart2;
+#undef putchar
+/**
+* @brief Put character
+* @param byte
+* @retval None.
+*/
+int putchar(int c)
+{
+ /* wait for the transmission end */
+ while(!(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE)));
+ /* send the data */
+ HAL_UART_Transmit(&huart2, (uint8_t*)&c, 1, UART_TX_TIMEOUT);
+ return c;
+}
+
+void __io_putchar(char c)
+{
+ putchar(c);
+}
+
+/* Required for Keil */
+#ifndef __IAR_SYSTEMS_ICC__
+void _ttywrch(int ch)
+{
+ putchar(ch);
+}
+
+int fputc(int ch, FILE *f)
+{
+ _ttywrch(ch);
+ return(ch);
+}
+int fgetc(FILE *f)
+{
+ return -1;
+}
+#endif
+
+/**
+* @brief Write handle
+* @param buffer
+* @param size
+* @retval None.
+*/
+size_t _write(int handle, const unsigned char * buffer, size_t size)
+{
+ size_t nChars = 0;
+
+ if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) {
+ return _LLIO_ERROR;
+ }
+
+ if (buffer == 0) {
+ /* This means that we should flush internal buffers.
+ spin until TX complete (TX is idle)*/
+#ifdef ENABLE_USB
+ while (!USB_OUT_BUFFER_IS_EMPTY()) {}
+#endif /* ENABLE_USB */
+ return 0;
+ }
+
+ while(size--) {
+ __io_putchar(*buffer++);
+ ++nChars;
+ }
+
+ return nChars;
+}
+
+/**
+* @brief Read handle
+* @param buffer
+* @param size
+* @retval None.
+*/
+size_t __read(int handle, unsigned char * buffer, size_t size)
+{
+ size_t bytes = 0;
+
+ while(bytes < size && Read_Buffer_Pop(buffer+bytes)){
+ bytes++;
+ }
+ return bytes;
+}
+
+uint8_t __io_getcharNonBlocking(uint8_t *data)
+{
+ if (__read(_LLIO_STDIN,data,1))
+ return 1;
+ else
+ return 0;
+}/* end serialReadByte() */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h
new file mode 100644
index 000000000..773b36116
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/user_if.h
@@ -0,0 +1,62 @@
+/**
+******************************************************************************
+* @file user_if.h
+* @author BLE Mesh Team
+* @version V1.09.000
+* @date 15-Oct-2018
+* @brief Header file for User interface file
+******************************************************************************
+* @attention
+*
+* <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+*
+* 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 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 STMicroelectronics nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+*
+* Initial BLE-Mesh is built over Motorola’s Mesh over Bluetooth Low Energy
+* (MoBLE) technology. The present solution is developed and maintained for both
+* Mesh library and Applications solely by STMicroelectronics.
+*
+******************************************************************************
+*/
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef _USER_INTERFACE_H_
+#define _USER_INTERFACE_H_
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx_hal.h"
+#include "stm32wbxx_hal_conf.h"
+#include "ble_clock.h"
+
+#define BUTTON_PRESSED GPIO_PIN_RESET
+
+/* Exported typedefs ---------------------------------------------*/
+typedef GPIO_PinState BUTTON_STATE;
+typedef void (* IO_RECEIVE_DATA_USER_CALLBACK_TYPE) (uint8_t * rx_data, uint16_t data_size);
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+
+#endif /* _USER_INTERFACE_H_ */
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h
new file mode 100644
index 000000000..22b6dc41c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/vcp_conf.h
@@ -0,0 +1,52 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+#define VCP_TX_PATH_INTERFACE_READY_SETUP_TIME (20*1000*1000/CFG_TS_TICK_VAL) /** 20s */
+#define VCP_TASK_ID (CFG_IdleTask_VCP_SendData)
+#define VCP_TASK_PRIO (CFG_SCH_Prio_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TimProcID_isr)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
new file mode 100644
index 000000000..7b22ea955
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
@@ -0,0 +1,517 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for BLE
+ * middleWare.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliCmdNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_CliEvtNotification();
+
+ return;
+}
+
+__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
+__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+#endif /* ZIGBEE_WB */
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject
new file mode 100644
index 000000000..2350584fc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.cproject
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="BLE_MeshLightingPRFNodeDemo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating hex and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1104724079." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1472243705" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.2012243190" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.350170076" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" useByScannerDiscovery="false" value="STM32WB55CGUx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.1066969950" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" useByScannerDiscovery="false" value="P-NUCLEO-WB55.USBDONGLE" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" useByScannerDiscovery="false" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.1545208353" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.849017599" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.503367654" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" useByScannerDiscovery="false" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.softfp" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.313215574" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/Lighting_PRFNode}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.1388838888" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.788714469" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.507308354" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.1773837778" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.658170605" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/app"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.1884790151" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_USB_DONGLE"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="STM32"/>
+ <listOptionValue builtIn="false" value="ENABLE_USART"/>
+ <listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
+ <listOptionValue builtIn="false" value="SERVER"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.418016678" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <option id="gnu.c.compiler.option.dialect.std.1675821413" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.2115418046" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.70637041" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.655187957" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.1658116989" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1793003576" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1289441927" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/app"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1053099556" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_USB_DONGLE"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="STM32"/>
+ <listOptionValue builtIn="false" value="ENABLE_USART"/>
+ <listOptionValue builtIn="false" value="TRACE_ENABLE_NO_FUNCTION"/>
+ <listOptionValue builtIn="false" value="SERVER"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.1052883489" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.587781019" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1475637392" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.1900226888" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.1374383201" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" useByScannerDiscovery="false" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.1086385097" name="Libraries (-l)" superClass="gnu.c.link.option.libs" useByScannerDiscovery="false" valueType="libs">
+ <listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
+ </option>
+ <option id="gnu.c.link.option.paths.1171847559" name="Library search path (-L)" superClass="gnu.c.link.option.paths" useByScannerDiscovery="false" valueType="libPaths">
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
+ </option>
+ <option id="gnu.c.link.option.ldflags.584114864" name="Linker flags" superClass="gnu.c.link.option.ldflags" useByScannerDiscovery="false" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.1158103120" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1513884002" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.2018563809" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.863897384" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1214396075" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+ <listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
+ <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.1_CM4_GCC.a"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.1746826190" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
+ </option>
+ <option id="gnu.cpp.link.option.flags.327710768" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.613074149" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1396074364" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.2035810026" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1392403353" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.1483330149" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1488646499" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.2083592722" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry excluding="Application/STM32_WPAN/app/appli_config_client.c|Application/STM32_WPAN/app/appli_generic_client.c|Application/STM32_WPAN/app/appli_light_client.c|Middlewares/STM32_WPAN/ble/blesvc/config_client.c|Middlewares/STM32_WPAN/ble/blesvc/generic_client.c|Middlewares/STM32_WPAN/ble/blesvc/light_client.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="Lighting_PRFNode.fr.ac6.managedbuild.target.gnu.cross.exe.549494370" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="/Lighting_PRFNode"/>
+ </configuration>
+ <configuration configurationName="Release"/>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.541963203;fr.ac6.managedbuild.config.gnu.cross.exe.debug.541963203.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.2004397433;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1404205422">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project
new file mode 100644
index 000000000..b3ba0f2eb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/.project
@@ -0,0 +1,444 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Lighting_PRFNode</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
+ </natures>
+ <linkedResources>
+ <link>
+ <name>Doc/readme.txt</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/readme.txt</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_debug.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/app_entry.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_timerserver.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/hw_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/lp_timer.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/lp_timer.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/main.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/main.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32_lpm_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/Core/stm32wbxx_it.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/startup_stm32wb55xx_cm4.s</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/startup_stm32wb55xx_cm4.s</locationURI>
+ </link>
+ <link>
+ <name>Application/SW4STM32/syscalls.c</name>
+ <type>1</type>
+ <locationURI>PARENT-1-PROJECT_LOC/syscalls.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_ll_usb.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_cdc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_core.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_ctlreq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_USB_Device_Library/usbd_ioreq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_config.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_config.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/PWM_handlers.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_handlers.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/app_ble.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/app_ble.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_generic.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_sensor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_sensor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/appli_vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/models_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/models_if.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/app/pal_nvm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/app/pal_nvm.c</locationURI>
+ </link>
+ <link>
+ <name>Application/STM32_WPAN/target/hw_ipcc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-2-PROJECT_LOC/STM32_WPAN/target/hw_ipcc.c</locationURI>
+ </link>
+ <link>
+ <name>Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/otp.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_lpm.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm32_seq.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/common.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/generic.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/mesh_cfg.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/time_scene.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/vendor.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_gatt_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hal_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_hci_le.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/ble_l2cap_aci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/ble/core/osal.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</locationURI>
+ </link>
+ <link>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</name>
+ <type>1</type>
+ <locationURI>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</locationURI>
+ </link>
+ </linkedResources>
+</projectDescription>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..7ac9a391f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/Lighting_PRFNode/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed ā€œas is,ā€ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..f79eec117
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,445 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* start address for the .MB_MEM2 section. defined in linker script */
+.word _sMB_MEM2
+/* end address for the .MB_MEM2 section. defined in linker script */
+.word _eMB_MEM2
+
+/* INIT_BSS macro is used to fill the specified region [start : end] with zeros */
+.macro INIT_BSS start, end
+ ldr r0, =\start
+ ldr r1, =\end
+ movs r3, #0
+ bl LoopFillZerobss
+.endm
+
+/* INIT_DATA macro is used to copy data in the region [start : end] starting from 'src' */
+.macro INIT_DATA start, end, src
+ ldr r0, =\start
+ ldr r1, =\end
+ ldr r2, =\src
+ movs r3, #0
+ bl LoopCopyDataInit
+.endm
+
+.section .text.data_initializers
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+ bx lr
+
+FillZerobss:
+ str r3, [r0]
+ adds r0, r0, #4
+
+LoopFillZerobss:
+ cmp r0, r1
+ bcc FillZerobss
+ bx lr
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ INIT_DATA _sdata, _edata, _sidata
+
+/* Zero fill the bss segments. */
+ INIT_BSS _sbss, _ebss
+ INIT_BSS _sMB_MEM2, _eMB_MEM2
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c
new file mode 100644
index 000000000..e3c8a89f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/SW4STM32/syscalls.c
@@ -0,0 +1,204 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2014 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt
new file mode 100644
index 000000000..f8f1473c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/readme.txt
@@ -0,0 +1,224 @@
+/**
+ @page BLE_MeshLightingDemo example
+
+ @verbatim
+ ******************** (C) COPYRIGHT 2019 STMicroelectronics *******************
+ * @file BLE/BLE_MeshLightingPRFNode/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the BLE Mesh Lighting Proxy Relay Friend Node demo example.
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Example Description
+This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
+
+@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
+ based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
+ a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
+ than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
+ To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
+
+@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
+ to have correct HAL operation.
+
+@par Directory contents
+ mesh_lighting_demo
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_debug.h Interface to support debug in the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_flash.h Configuration file of the FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_if.h Configuration file of the Hardware Iterface
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/lp_timer.h Configuration file of the Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h Header for main.c module
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32_lpm_if.h Configuration file of the Low layer function to enter/exit low power modes (stop, sleep).
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h Configuration file of Virtual Com Port Interface
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/app_debug.c Interface to support debug in the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c Initialization of the application
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/hw_flash.c FLASH driver needed by EE module
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/hw_uart.c UART Driver
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/lp_timer.c Low power timer to be used within Mesh Application.
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/main.c Main program
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE/BLE_MeshLightingPRFNode/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/app_ble.h Header of BLE Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_generic.c Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_generic.h Header of Application interface for Generic Mesh Models
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light.c BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light.h Header of BLE Mesh Light Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light_lc.c BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_light_lc.h Header of BLE Mesh Light Lightness Controller Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_mesh.c BLE Mesh application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_mesh.h Header of BLE Mesh application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_nvm.c BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_nvm.h Header of BLE Mesh NVM application implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_sensor.c BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_sensor.h Header of BLE Mesh Sensor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_vendor.c BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/appli_vendor.h Header of BLE Mesh Vendor Profile implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/hal_common.h Header for common function of HAL file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/mesh_cfg.h Header for Mesh configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/mesh_cfg_usr.h Header for user Mesh configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/models_if.h Header for the BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/models_if.c BLE Mesh Models Interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/pal_nvm.c BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/pal_nvm.h Header of BLE Mesh NVM management implementation
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_config.c Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_config.h Header of Pulse Width Modulation configuration
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_handlers.c Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/PWM_handlers.h Header of Pulse Width Modulation handlers
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/svcctl_conf.c Service Controller configuration API
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/tl_conf.h Configuration file of the Transport layer
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/tl_if.c Transport Layer interface
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/user_if.h Header file for User interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/user_if.c User interface file
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/App/vcp_conf.h Configuration of the vcp interface
+ - BLE/BLE_MeshLightingPRFNode/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices.
+
+ - This example has been tested with an STMicroelectronics USB DONGLE board (MB1293C)
+ and can be easily tailored to any other supported device and development board.
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_BLE_Stack_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+In order to make the program work, you must do the following:
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+For more details refer to the Application Note:
+ AN5292_STM32WB_How_to_build_BLE_Mesh_Application
+
+@Introduction
+
+The ST BLE-Mesh library supports all of the following features in a Mesh node:
+1. Relay: to forward received network PDUs on advertising or GATT bearer, if the Proxy feature is enabled
+2. Proxy: to forward received network PDUs between GATT and advertising bearers
+3. Friend: can perform duties such as scanning for other associated nodes that are usually Low Power mode
+4. Low Power: consumes much less power as the node usually does not perform any scanning
+A typical BLE Mesh node radio should always be in scanning mode to avoid missing packets over the air, but this kind of
+operation is not supported by many devices due to continuous energy requirements.
+To enable low power operation, BLE Mesh Profile v1.0 defines the concept of Friendship.
+In a Mesh network, a Low Power feature-enabled Mesh node (LPN) offloads its packet receiving (scanning) duty to an adjacent
+Friend feature-enabled Mesh node (FN). The LPN is not always scanning and remains inactive (or sleeps) for most of its life
+cycle, significantly reducing its energy requirements. Nodes running on batteries or energy harvesting techniques usually
+support the Low Power feature.
+Once connected to each other, the FN and LPN are considered friends and their connection is known as a Friendship. At least
+one FN must be in the direct radio range of an LPN to establish Friendship.
+
+@Configuration
+
+General default setting defined in mesh_cfg_usr.h:
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF (1) /* GENERIC SERVER ONOFF MODEL ON FIRST ELEMENT */
+ APPLICATION_NUMBER_OF_ELEMENTS 1 /* NUMBER OF ELEMENT SUPPORTED */
+ APPLICATION_SIG_MODELS_MAX_COUNT 20 /* TOTAL NUMBER OF MODELS SUPPORTED */
+ APPLICATION_VENDOR_MODELS_MAX_COUNT 2 /* TOTAL NIMBER OF VENDOR MODELS SUPPORTED */
+ ENABLE_PB_ADV /* Provisioning Bearer over advertising channels support */
+ ENABLE_PB_GATT /* Provisioning Bearer over GATT proxy support */
+
+Low Power Node
+Low Power feature support is defined in mesh_cfg_usr.h by hte predefinition of ENABLE_LOW_POWER_FEATURE.
+Note: A Low Power feature-enabled node does not support any other feature: all the other features should be
+undefined.
+
+@Demo setup based on STM32WB55CG-Nucleo
+
+The following demo based on STM32WB55CG-Nucleo has been set up using one board as a Friend node and two
+boards as Low Power nodes.
+
+Low Power Node setup (use the Low Power Node BLE_MeshLightingLPN project):
+Step 1. Configure LPN parameters.
+ Change only if required ohterwise skip this step (use example parameters defined in mesh_cfg_usr.h)
+ LPN_RSSI_FACTOR_LEVEL 1
+ LPN_RECIVE_WINDOW_FACTOR_LEVEL 1
+ LPN_MINIMUM_QUEUE_SIZE_LOG 2
+ LPN_RECEIVE_DELAY 150 ms
+ LPN_POLL_TIMEOUT 2000 (*100 ms)
+ LPN_RECEIVE_WINDOW_SIZE 55 ms
+ LPN_SUBSCR_LIST_SIZE 2
+ LPN_FRIEND_REQUEST_FREQUENCY 50 (*100 ms)
+ LPN_FRIEND_POLL_FREQUENCY 25 (*100 ms)
+ LPN_MINIMUM_RSSI -100
+ LPN_NO_OF_RETRIES 10
+Step 2. Generate and flash binary in 2 boards (LPN1, LPN2)
+
+Friend Node setup:
+Step 1. Generate and flash binary in a board (FN)
+Step 2. Provision the 3 boards with the default parameters, using BLE-Mesh Android or BLE-Mesh iOS smartphone application
+ (subscribe and publish to default group)
+
+Demo operation
+After provisioning, it might take a few seconds for Friendship to be established between FN and LPNs.
+In this demo, the FN establishes Friendship with LPN1 and LPN2
+Any packet targeted to LPN1/LPN2 or to a group address subscribed by LPN1 or LPN2 is put in queue by the FN
+that forwards packets to LPN1/LPN2 as soon as it receives a Friend Poll from the respective LPN.
+The LPN is free to send packets (generate traffic) any time.
+
+By pressing [SW1] button on the Friend Node:
+1. FN publishes a LED ON command to the default group and the FN blue LED immediately turns on (when the
+FN belongs to the default group).
+2. FN forwards a LED ON command to the LPNs subscribed to the default group. As soon as the FN receives
+poll from an LPN, it sends LED ON to the respective LPN.
+
+ FN LPN1 LPN2
+ | | |
+ SW1 PUSH->| | |
+ Blue LED on->| | |
+ |<--Friend Poll--| |
+ | | |
+ |-----LED on---->|<-Blue LED on |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |-------------LED on------------>|<-Blue LED on
+ | |
+
+By pressing [SW1] button on the Low Power Node 1:
+1. LPN1 publishes an LED OFF command to the default group. LPN1 blue LED tunrs off.
+ LPN1 immediately forwards LED OFF command to the default group.
+2. FN receives an LED OFF command (as it is subscribed to the default group) and the FN blue LED turns off.
+3. FN also sends an LED OFF command to LPN2 (subscribed to the default group) as soon as FN receives
+ poll from LPN2.
+
+ FN LPN1 LPN2
+ | | |
+ | SW1 PUSH->|<-Blue LED off |
+ Blue LED off->|<----LED off----| |
+ | |
+ |<----------Friend Poll----------|
+ | |
+ |------------LED off------------>|<-Blue LED off
+ | |
+
+* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/App/tm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/App/tm.c
index 22b14baaa..446c11eeb 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/App/tm.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/App/tm.c
@@ -54,7 +54,7 @@ typedef struct
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t HciAclDataBuffer[sizeof(TL_PacketHeader_t) + 5 + 251];
-static TL_CmdPacket_t SysLocalCmd;
+ALIGN(4) static TL_CmdPacket_t SysLocalCmd;
static tListNode HostTxQueue;
static TL_EvtPacket_t *pTxToHostPacket;
static MB_RefTable_t * p_RefTable;
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Binary/Thread_Cli_Cmd_reference.hex b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Binary/Thread_Cli_Cmd_reference.hex
index abe513872..379ee4a88 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Binary/Thread_Cli_Cmd_reference.hex
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Binary/Thread_Cli_Cmd_reference.hex
@@ -1,2074 +1,2093 @@
:020000040800F2
-:1000000060340020FD7E0008457D0008477D000823
-:100010001D7F0008217F0008257F000800000000E8
-:10002000000000000000000000000000497D000802
-:100030004B7D0008000000004D7D00084F7D00084A
-:10004000297F00082D7F0008317F00086B7D0008A4
-:10005000357F0008397F00083D7F0008417F000898
-:10006000457F0008497F00084D7F0008517F000848
-:10007000557F0008597F0008657D00085D7F0008F6
-:10008000617F0008657F0008697F0008797D0008AE
-:10009000777D00086D7F0008717F0008757F00087C
-:1000A000797F00087D7F0008817F0008857F000838
-:1000B000897F00088D7F0008917F0008957F0008E8
-:1000C000997F00089D7F0008A17F0008A57F000898
-:1000D000537D00085F7D0008A97F0008AD7F000800
-:1000E000B17F0008B57F0008B97F0008BD7F000818
-:1000F000737D00086F7D0008C17F0008C57F000880
-:10010000C97F0008CD7F0008D17F0008D57F000897
-:10011000D97F0008DD7F0008E17F0008E57F000847
-:10012000E97F0008ED7F0008597D0008F17F000895
-:10013000F57F0008F97F0008FD7F000838B504004E
+:100000009034002021800008697E00086B7E000883
+:100010004180000845800008498000080000000079
+:100020000000000000000000000000006D7E0008DD
+:100030006F7E000800000000717E0008737E0008DB
+:100040004D80000851800008558000088F7E000810
+:10005000598000085D800008618000086580000804
+:10006000698000086D8000087180000875800008B4
+:10007000798000087D800008897E00088180000862
+:1000800085800008898000088D8000089D7E00081A
+:100090009B7E0008918000089580000899800008E8
+:1000A0009D800008A1800008A5800008A9800008A4
+:1000B000AD800008B1800008B5800008B980000854
+:1000C000BD800008C1800008C5800008C980000804
+:1000D000777E0008837E0008CD800008D18000086C
+:1000E000D5800008D9800008DD800008E180000884
+:1000F000977E0008937E0008E5800008E9800008EC
+:10010000ED800008F1800008F5800008F980000803
+:10011000FD800008018100080581000809810008B0
+:100120000D810008118100087D7E000815810008FE
+:10013000198100081D8100082181000838B50400DC
:1001400009D004F17C05686808B900F01EF800F0D9
:1001500021F8012801D1012032BDA06A08B100F0C8
:100160002AF800F00AF821F02A01FFE7816000F088
-:100170001BF8BDE8324000F012BE2068416821F44F
+:100170001BF8BDE8324000F02CBE2068416821F435
:1001800090414160206881687047002129702046B5
-:1001900000F07BBF2420686020680168490849009E
-:1001A0000160204600F030B92068016841F001018B
-:1001B000016020467047204600F08EBD70B50446B1
+:1001900000F09DBF2420686020680168490849007C
+:1001A0000160204600F042B92068016841F0010179
+:1001B000016020467047204600F0A8BD70B5044697
:1001C00004F17C0513466868202837D151B3180024
:1001D00028D095F90000012830D001222A7004F1BE
:1001E00054062165338073800020E8602120686018
-:1001F000306AC8B1DFF8F411C162DFF8F401316A86
-:100200000863316ADFF8EC0148630020316A8863D3
-:100210002068216D00F12802306A01F0A6F818B1BB
+:1001F000306AC8B1DFF81C12C162DFF81C02316A34
+:100200000863316ADFF8140248630020316A8863AA
+:100210002068216D00F12802306A01F0C8F818B199
:1002200000F00EF8012070BD216840200862002017
:1002300028702068816841F0800108E0022070BDCC
:100240001020E860002028702020686070478160DE
-:10025000002070BD206881684A06704770B504466A
-:100260002568E9692A68AB6811F00F000CD188068F
-:1002700002D5900601D4D80079D5E16E002975D059
-:100280002046BDE8704008475B48034208BF12F4AF
-:10029000907F6CD0CE0709D5D60507D501262E62F2
-:1002A000D4F8885045F00105C4F888508D070AD568
-:1002B000DD0708D5266802253562D4F8885045F058
-:1002C0000405C4F888504D070AD5DD0708D526680F
-:1002D00004253562D4F8885045F00205C4F88850EA
-:1002E0000D070CD5950601D4034208D025680820D7
-:1002F0002862D4F8880040F00800C4F88800D4F8D8
-:10030000880000286FD0890607D5900601D4D80050
-:1003100003D5E16E09B120468847D4F888002168EA
-:100320008A68510601D400071AD5204600F0A2FDC4
-:10033000FFF790FF0FD500F061F860B1DFF8881982
-:100340008163A06F01F054F800284CD0A06F816B3E
-:10035000BDE8704008472046BDE8704001F038B95C
-:10036000204601F035F90020C4F8880070BDC802AD
-:1003700009D5580207D54FF4801028622046BDE801
-:10038000704001F063B9080609D5100601D41802BF
-:1003900005D5216F39B32046BDE8704008474806AF
-:1003A0000FD550060DD5286820F040002860202188
-:1003B000C4F88010002020672046BDE8704000F09F
-:1003C00042BF080206D5500004D52046BDE8704063
-:1003D00001F03DB9C80148BF002A04D52046BDE858
-:1003E000704001F035B970BD00000000D90E000862
-:1003F000070F00080D0F000801000010816821F0B0
-:1004000040018160A06F70472DE9F84F0446DFF886
-:10041000880A2768DFF884BA3968DFF884AA0140BF
-:10042000A06801432069014360690143E069014319
-:10043000606E0143396000267968E06821F440511C
-:1004400001437960B046A169DFF8580A87421CBFB2
-:10045000206A0143BA68DFF8500A02401143B960CC
-:100460004FF48075F96A606A090940EA0111F9627E
-:100470005F454FF400404FF400714FF480624FF439
-:1004800000634FF4805C4FF4005E4FF4804929D143
-:10049000DAF800B00BF0030BBBF1030F3ED8DFE836
-:1004A0000BF00237343A4FF0010AD4F81CB057462B
-:1004B000BBF5004F4FF6F07A40F01183012F09D0C1
-:1004C000022F00F05482042F00F08D82082F00F0DC
-:1004D000C282F5E201F025F90146606A002840F089
-:1004E0001B8242E2DFF8BCB95F4517D1DAF800A001
-:1004F0001AF4406A27D0BAF5806F09D0BAF5006FB8
-:1005000003D0BAF5406F06D008E04FF0020A07E0CA
-:100510004FF0040A04E04FF0080A01E04FF0100A1F
-:10052000DFF880B95F45C0D1BAF1000F0BD0BAF146
-:10053000020F49D0BAF1040F00F08280BAF1080F1F
-:1005400000F0B080B3E301F0E4F80146606A58B30C
-:10055000012808BF022028D0022808BF042024D088
-:10056000032808BF062020D0042808BF08201CD07C
-:10057000052808BF0A2018D0062808BF0C2014D070
-:10058000072808BF102010D0082808BF20200CD052
-:10059000092808BF402008D00A2808BF802004D0BE
-:1005A0000B2808BF284600D00120B1FBF0F000283E
-:1005B00000F07F83626802EB4201884203D311039B
-:1005C000814280F0A18072E3606AB0B3012808BF65
-:1005D000DFF8D808EED0022808BFDFF8D408E9D049
-:1005E000032808BFDFF8CC08E4D0042808BFDFF8F0
-:1005F000C808DFD0052808BFDFF8C008DAD0062811
-:1006000008BFDFF8BC08D5D0072808BFDFF8B4085A
-:10061000D0D0082808BFDFF8B008CBD0092808BF21
-:10062000DFF8A808C6D00A2808BFDFF8A408C1D0A0
-:100630000B2808BF4FF22440BCD0DFF89808B9E778
-:1006400001F01DF80146606A58B3012808BF022076
-:10065000ABD0022808BF0420A7D0032808BF06207B
-:10066000A3D0042808BF08209FD0052808BF0A206F
-:100670009BD0062808BF0C2097D0072808BF102061
-:1006800093D0082808BF20208FD0092808BF402019
-:100690008BD00A2808BF802087D00B2808BF2846A7
-:1006A00083D081E7676A002F84D0012F08BF4846B6
-:1006B000FAD0022F08BF7046F6D0032F08BF41F2D0
-:1006C0005550F1D0042F08BF6046EDD0052F08BF6C
-:1006D00040F6CC40E8D0062F08BF40F6AA2012D042
-:1006E000072F08BF18460ED0082F08BF10460AD0A3
-:1006F000092F08BF084606D00A2F08BF284602D097
-:100700000B2F00D1802055E7BAF1000F0BD0BAF1C2
-:10071000020F38D0BAF1040F00F07280BAF1080F5E
-:1007200000F0A780ECE000F0F4FF0146606A40B3FF
-:10073000012808BF02251ED0022808BF04251AD0B0
-:10074000032808BF062516D0042808BF082512D0A4
-:10075000052808BF0A250ED0062808BF0C250AD098
-:10076000072808BF102506D0082808BF202502D07A
-:10077000092808BF402572D00A280CBF80250B2805
-:100780006DD001256BE0606A002836D0012808BFD3
-:10079000DFF8D8672BD0022808BFDFF8D46726D04F
-:1007A000032808BFDFF8CC6721D0042808BFDFF892
-:1007B000C8671CD0052808BFDFF8C06717D0062817
-:1007C00008BFDFF8BC6712D0072808BFDFF8B4679E
-:1007D0000DD0082808BFDFF8B06708D0092808BF87
-:1007E000DFF8A86703D00A2808BFDFF8A4677CD029
-:1007F0000B2808BFDFF8DC6677D0DFF8986774E075
-:1008000000F03DFF0146606A40B3012808BF0225A1
-:1008100025D0022808BF042521D0032808BF0625BB
-:100820001DD0042808BF082519D0052808BF0A25AF
-:1008300015D0062808BF0C2511D0072808BF1025A1
-:100840000DD0082808BF202509D0092808BF402559
-:1008500005D00A280CBF80250B2800D0012562682E
-:10086000B1FBF5F65008002110EB062051EB1661A4
-:1008700041E0606A002836D0012808BF4FF48006A6
-:1008800033D0022808BF4FF400162ED0032808BF2B
-:10089000DFF8046729D0042808BF4FF4801624D05D
-:1008A000052808BFDFF8F4661FD0062808BFDFF868
-:1008B000F0661AD0072808BF4FF4002615D0082884
-:1008C00008BF4FF4802610D0092808BF4FF4003627
-:1008D0000BD00A2808BF4FF4803606D00B2808BF7B
-:1008E0004FF4004601D04FF40006C246002116EB3B
-:1008F00052004AEB0101002300F030FF064601E000
-:100900004FF00108A6F54070DFF89816884280F095
-:10091000CE812168CE60CCE1012808BF02251AD023
-:10092000022808BF042516D0032808BF062512D0C8
-:10093000042808BF08250ED0052808BF0A250AD0BC
-:10094000062808BF0C2506D0072808BF102502D0AE
-:10095000082808BF202575D0092808BF402571D078
-:100960000A280CBF80250B286CD001256AE0606A3C
-:10097000B0B3012808BFDFF85C0521D0022808BF0A
-:10098000DFF828051CD0032808BFDFF81C0617D0A5
-:10099000042808BFDFF8180512D0052808BFDFF8C3
-:1009A0000C060DD0062808BFDFF8080508D0072878
-:1009B00008BFDFF8040503D0082808BFDFF80405E6
-:1009C0007AD0092808BFDFF8000575D00A2808BFCB
-:1009D000DFF8F80470D00B2808BFDFF8F4046BD000
-:1009E000DFF8AC0568E000F04AFE0146606A40B3FB
-:1009F000012808BF022525D0022808BF042521D0E0
-:100A0000032808BF06251DD0042808BF082519D0D3
-:100A1000052808BF0A2515D0062808BF0C2511D0C7
-:100A2000072808BF10250DD0082808BF202509D0A9
-:100A3000092808BF402505D00A280CBF80250B28AF
-:100A400000D001256068B1FBF5F1420802EB4102DC
-:100A5000B2FBF0F632E0666A66B3012E2CD0022EAD
-:100A600008BF484628D0032E08BF42F6AA2023D04C
-:100A7000042E08BF70461FD0052E08BF41F69810FF
-:100A80001AD0062E08BF41F2545015D0072E08BFC9
-:100A9000604611D0082E08BF18460DD0092E08BF99
-:100AA000104609D00A2E08BF084605D00B2E08BFF5
-:100AB000284601D04FF4803000F008F9B6B201E0CA
-:100AC0004FF00108A6F11000504580F0F0800AEACE
-:100AD0000601C6F3420001432068C160E9E0012F2E
-:100AE00007D0022F35D0042F6DD0082F00F0A28040
-:100AF000D4E000F016FE0146606A40B3012808BF4A
-:100B0000022512D0022808BF04250ED0032808BFF2
-:100B100006250AD0042808BF082506D0052808BFE6
-:100B20000A2502D0062808BF0C257BD0072808BF5D
-:100B3000102577D0082808BF202573D0092808BFC2
-:100B400040256FD00A280CBF80250B286AD00125CC
-:100B500068E0606AA0B3012808BFDFF8501330D006
-:100B6000022808BFDFF848132BD0032808BFDFF89E
-:100B7000441326D0042808BFDFF83C1321D00528F1
-:100B800008BFDFF838131CD0062808BFDFF8301381
-:100B900017D0072808BFDFF82C1312D0082808BF89
-:100BA000DFF824130DD0092808BFC84909D00A2846
-:100BB00008BFC74905D00B2808BF4FF2244100D019
-:100BC000C449606831E000F05AFD0146606A40B3F4
-:100BD000012808BF022525D0022808BF042521D0FE
-:100BE000032808BF06251DD0042808BF082519D0F2
-:100BF000052808BF0A2515D0062808BF0C2511D0E6
-:100C0000072808BF10250DD0082808BF202509D0C7
-:100C1000092808BF402505D00A280CBF80250B28CD
-:100C200000D001256068B1FBF5F101EB5001B1FB8B
-:100C3000F0F631E0666A6EB3012E08BF484629D04F
-:100C4000022E08BF704625D0032E08BF41F2555032
-:100C500020D0042E08BF60461CD0052E08BF40F6E9
-:100C6000CC4017D0062E08BF40F6AA2012D0072E7F
-:100C700008BF18460ED0082E08BF10460AD0092E0D
-:100C800008BF084606D00A2E08BF284602D00B2E01
-:100C900008BF802000F01AF8B6B201E04FF001085A
-:100CA000A6F11000504502D22068C66001E04FF066
-:100CB000010804F1680001214180018000214160A8
-:100CC00081604046BDE8F28F5B0F0008616800EB71
-:100CD0005100B0FBF1F6704790F82810CA0706D50E
-:100CE00002685368C16A23F400330B43536090F8E1
-:100CF00028108A0706D502685368016B23F48033F5
-:100D00000B43536090F828104A0706D502685368D1
-:100D1000416B23F480230B43536090F828100A079B
-:100D200006D502685368816B23F400430B4353607C
-:100D300090F82810CA0606D502689368C16B23F4A0
-:100D400080530B43936090F828108A0606D50268FA
-:100D50009368016C23F400530B43936090F82810C0
-:100D60004A0610D502685368416C23F480130B4384
-:100D70005360416CB1F5801F05D15368816C23F439
-:100D8000C0030B43536090F828100A0606D501688B
-:100D90004A68C06C22F4002202434A607047F8B5EA
-:100DA000044604F17C050020E8606FF07E4700F007
-:100DB000EDFD0646206801680A0708D5009733460E
-:100DC00000224FF40011204600F016F860B92068A8
-:100DD00001684A070AD50097334600224FF4800184
-:100DE000204600F009F808B10320F2BD2020686019
-:100DF000A86000202870F2BD2DE9F041069C054650
-:100E00000E4690461F462868C1693140B1420CBF6A
-:100E10000120002040451CD114F1010FF3D000F057
-:100E2000B5FDC01B844201D3002CECD128680168B9
-:100E300021F4D07101602868816849084900816007
-:100E400005F17C00202141608160002101700320B8
-:100E500000E00020BDE8F08101680A6822F0C002CD
-:100E60000A6001688A6822F400028A602021C0F8C2
-:100E70008010704701680A6822F490720A60DFF8F7
-:100E80003011026893680B4093602021C0F88410F1
-:100E90000021C16670470000F369FFCF00380140B0
-:100EA0008800005800800040FFF4FF1100127A0013
-:100EB00000093D00AAB0280080841E00006A1800C6
-:100EC0005558140040420F0020A1070090D00300A5
-:100ED00048E801000024F400816A00680268930673
-:100EE00044BF084600F0AFB90020A1F856000868DA
-:100EF000826822F0800282600868FFE7016841F0A2
-:100F0000400101607047806A00F046BDF8B5846A10
-:100F100004F1800504F1560728686E6821688A6824
-:100F2000110606D5212804D1002038802046FFF77D
-:100F300093FF20688168480606D5222E04D1002040
-:100F400038812046FFF796FFA86840F01000A8609F
-:100F50002046BDE8F24000F03BBB806A00F156013C
-:100F600000220A810A8000F033BB00000000127AE0
-:100F70000000093D00AAB0280080841E00006A1805
-:100F8000005558140040420F0020A1070090D003E4
-:100F90000048E801000024F40055150000CC0C00C6
-:100FA00000AA0A0000FD0F005461510000D4300077
-:100FB000FEFFFFEFDFF8B41201E0DFF8B41281B0FA
-:100FC0000A6802430A60096808400090009801B06E
-:100FD00070474FF400414FF4E13210B1022805D0C0
-:100FE0007047DFF89002DFF8903203E0DFF88C0200
-:100FF000DFF88C320360426000228260C2600261CE
-:1010000082610C224261C16100218162FFF796B8C2
-:1010100063609A489A4B704723609648964B704796
-:1010200070B51C4600230025964E10B1022804D04E
-:101030000AE03460FFF7F1FF02E07460FFF7E9FFB8
-:101040000360FFF7BBF80346012B05D007D3032B42
-:1010500004D038BF022502E0012500E00325284620
-:1010600070BD10B1022802D07047824800E083486A
-:10107000FFF7F4B810B1022803D070477D48406FE5
-:1010800001E07E49486F00F0EAB9F8B586B0044641
-:101090006846142100F082FC2068794F7A4D7B4E1F
-:1010A000B84259D0744FB84240F0A8800220FFF7F0
-:1010B00084FF402000F0AEF8754F384600F072FC17
-:1010C0000220FFF77AFF802000F0A4F8384600F0F5
-:1010D00069FC00F09DF84FF400600221009001913E
-:1010E0000291072000F08CF8F06A8008800040F040
-:1010F0000100F0620022706840F4804070600F21AF
-:10110000706800F4804005900598242000F048FDA8
-:10111000242000F062FD0220FFF74CFF0420FFF7BF
-:1011200049FF5C4828600F2068601020A8600020FC
-:10113000E8608020286100206861A861E861286279
-:10114000284600F0ABF86567AC6200220F213A2018
-:1011500000F026FD3A204FE000F05AF8042000F09D
-:1011600064F800F055F8082000F05FF800F050F83F
-:1011700040200221009001910291082000F040F8E7
-:10118000F06A20F4406040F48060F0620022306831
-:1011900040F001003060316801F0010105910F213C
-:1011A0000598252000F0FCFC252000F016FD01200C
-:1011B000FFF700FF0420FFF7FDFE374828661120E7
-:1011C00068661020A8660020E86680202867002056
-:1011D0006867A867E867C5F8800005F1600000F05F
-:1011E0005DF805F160006067C5F8884000220F21B6
-:1011F0000E2000F0D5FC0E2000F0EFFC07B0F0BD93
-:1012000003210391049069464FF0904000F0CABB5F
-:101210000120D2E6009002210020019102900321DA
-:101220000720039104906946704700900221002036
-:1012300001910290032108200391049069464FF028
-:10124000904000F0AFBB82B000680D4A0D4990425B
-:1012500006D0094A904207D1086828B102B0004779
-:10126000486808B102B0004702B070474800005813
-:101270004C000058AC2000200038014038210020EC
-:1012800000800040182400205C1F00205C000058F3
-:1012900000040048440402404400024038B5040001
-:1012A00001D1012032BD2168DFF8FC02814204F146
-:1012B000240500F042F8022068700A68A0686FF305
-:1012C0000E120243E0680243206902436069024350
-:1012D000A0690243E0690243206A02430A60204693
-:1012E00000F039F9A068B0F5804F04BF00216160BB
-:1012F000696A207900F014F838B1052805D2204633
-:1013000000F043F900F012F803E00020286368635E
-:10131000A8630020A861012068700020287032BDF9
-:101320000860A96AE86A486060687047296B002015
-:101330000860696BA86B486070470AD2DFF86C02DE
-:1013400042181423B2FBF3F292002A62DFF8600223
-:1013500009E0DFF8600242181423B2FBF3F29200B6
-:101360002A62DFF85402E8617047F8B504460025A8
-:1013700004F124067057012801D10220F2BD012793
-:101380003770F05701282FD102277770B561206898
-:1013900007687F087F000760204600F0C0F82168DA
-:1013A000F06820B10A6842F00E020A6008E008689E
-:1013B00020F0040008602068016841F00A01016023
-:1013C000706A0168CA0303D5026842F48072026041
-:1013D000306B18B1016841F48071016020680268C7
-:1013E00042F00102026001E0357002252846F2BD9C
-:1013F00038B500F12402002492F90110022903D02B
-:1014000004209061012428E001680B6823F00E039A
-:101410000B6001680D686D086D000D60516A0B6806
-:1014200023F480730B60012192F82030D56903F01A
-:101430001C0399406960936AD16A5960116B31B19C
-:101440000B6823F480730B60536B916B596001211F
-:1014500051701470516901B18847204632BDF8B50A
-:1014600000F124010423CA6914680268156891F820
-:10147000206006F01C0603FA06F73C4210D06F0706
-:101480000ED51468A50603D4156825F0040515606B
-:1014900000F03DF8C968002938D0BDE8F44008479D
-:1014A000022303FA06F73C4213D0AF0711D51468A4
-:1014B000A50605D4156825F00A05156001224A70B5
-:1014C00000F025F800220A708968F9B1BDE8F440FF
-:1014D0000847082303FA06F6344217D02B0715D520
-:1014E000136823F00E031360012291F82030CC69B9
-:1014F00003F01C039A40626001228A614A70002254
-:101500000A70096911B1BDE8F4400847F1BD91F8CE
-:101510002020CC6902F01C0293406360704778B5CC
-:10152000C56C046D6C60446D14B1846DC56D6560EF
-:10153000012590F84440066C04F01C04A540756039
-:10154000046863608068102802D1A260E16071BD08
-:10155000A160E26071BD416C0268134B89089A4238
-:1015600034BF164B164B03EB8101816402F0FF027E
-:10157000083A1421B2FBF1F1124AC26401F01C01D5
-:10158000012202FA01F10165704701790E4A02EB6E
-:1015900081024265491E0D4A826501F00301012264
-:1015A0008A40C2657047000008040240F8FFFDBF92
-:1015B00000000240F8FBFDBF0004024000080240AA
-:1015C0001C08024080080240FC080240400902401A
-:1015D0007047F0B40246106895681318506803EB22
-:1015E0005004C00721D54D441FE0F0BC02F10C00AF
-:1015F000704713F8017B05F8017B491EF9D1A0B1B2
-:10160000B60813F8011B06F00306032E08BF13F8F3
-:10161000016B01EB06214942801C294405D011F8D9
-:10162000016B05F8016B401EF9D1A342DDD013F820
-:10163000016B16F0030104BF13F8011BC91C30092C
-:101640000F28DAD113F8010B0F30D6E77047704737
-:1016500070478268521C8260426832B10268531C33
-:10166000036011704168491E416070474FF0B040FF
-:10167000006800F0F000B02888BFB020704738B58F
-:101680004FF0B044304DA16811F00C0106D1FFF7C6
-:10169000EDFFC0F3031055F8200032BD04292B4A9A
-:1016A00005D008292A4804D12168C90222D510464C
-:1016B00032BDE16801F00301022904D0032904D1FD
-:1016C0002168C90207D5104605E0FFF7CFFFC0F338
-:1016D000031055F82000E168E268E368C1F30621D1
-:1016E0004843C2F30211491C5B0FB0FBF1F05B1CD5
-:1016F000B0FBF3F032BD80B5FFF7C1FF1149FFE742
-:10170000144A0968C1F3031152F82110B0FBF1F03B
-:1017100002BD80B5FFF7EFFF00F010F8C1F3022122
-:1017200006E080B5FFF7E7FF00F008F8C1F3C2213B
-:1017300012F8211001F01F01C84002BD0149064AFC
-:101740000968704708000058E07700080024F4009A
-:101750000048E801A0770008847E0008B3BBD9B137
-:10176000B2F5803F7DD2022A1ED98C46B1FBF2F140
-:1017700002FB11C31B0443EA1043B3FBF2FC02FB60
-:101780001C3380B240EA0343B3FBF2F002FB103299
-:1017900040EA0C4000237047022A05D98446B0FB7A
-:1017A000F2F002FB10C270474AB105D100F001020D
-:1017B00049085FEA3000704700220023704700F0BC
-:1017C00071BA0B000200002100207047904271EBBB
-:1017D000030CF6D3B3F5803F2FD2F0B5B3FA83F7FD
-:1017E000B1FA81F4A7F10F0E3D1B5340CEF1200654
-:1017F00002FA0EF2F3415340B5F10F0746D80F3C01
-:101800002C444140C4F12006A040F1414140B1FBCD
-:10181000F3F603FB1611A2FB0645001BA94102D2F9
-:10182000761E8018594180EA010221FA0EF362FA0D
-:101830000EF200215A403046F0BD30B4B1FBF3FC4B
-:1018400003FB1C11A2FB0C45001BA94103D2ACF108
-:10185000010C8018594130BC02460B4660460021FD
-:101860007047B2F1807F65D3F0B5B2FA82F7B1FA72
-:1018700081F4C7F10F063D1B22FA06F307F1110EA2
-:10188000F24120355A40B5F10F07B8D94140C4F1B3
-:101890002006A040F1414140B1FBF3FC03FB1C11C9
-:1018A000A2FB0C45001BA94103D2BCF1010C80181E
-:1018B00059410F2F12D30F3FC90341EA5041B1FBE9
-:1018C000F3F603FB1611A2FB0645D4EBC030A94189
-:1018D00002D2761E8018594146EACC3C07B34140FB
-:1018E000C7F12006B840F1414140B1FBF3F603FBDC
-:1018F0001611A2FB0645001BA94102D2761E8018D4
-:10190000594180EA010221FA0EF3C7F1200462FA7C
-:101910000EF20CFA07F05A402CFA04F13043F0BDF5
-:1019200080EA010221FA0EF3002162FA0EF260460B
-:101930005A40F0BD8C46B1FBF2F102FB11C31B0211
-:1019400043EA1063B3FBF2FC02FB1C331B024CEABC
-:10195000002043EA1063B3FBF2FC02FB1C331B02C2
-:101960004CEA002043EA1063B3FBF2FC02FB1C3399
-:101970001B024CEA002043EA1063B3FBF2FC02FBBB
-:101980001C324CEA00200023704700000148006828
-:10199000704700BF5010002070470000002200F088
-:1019A00083B900002DE9F84F4FF0000C674A684BEF
-:1019B000DFF8A0814FF00F0982460F4633E0664DF5
-:1019C000AA4514BF072504258D40254348F82E500D
-:1019D000C1431C6801EA040E7C68E50348BF40EA85
-:1019E0000E0EC3F800E05C6801EA040E7C68A503F3
-:1019F00048BF40EA0E0EC3F804E0146801EA040E82
-:101A00007C68E50248BF40EA0E0EC2F800E0546868
-:101A100001EA040E79688C0248BF40EA0E0EC2F853
-:101A200004E00CF1010C396831FA0CF000F07C8014
-:101A3000012000FA0CFE1EEA0100F2D07C68022CA4
-:101A400018BF122C4FEA8C0110D14FEADC040AEBCC
-:101A5000840401F01C05266A09FA05FB26EA0B0638
-:101A6000D7F810B00BFA05F5354325624FEA4C0460
-:101A70000325DAF8006097F804B0A540ED430BF0B9
-:101A8000030B2E400BFA04FB4BEA0606CAF8006073
-:101A90007E68012E18BF022E03D0112E18BF122E01
-:101AA00017D1DAF80860D7F80CB02E400BFA04FB17
-:101AB0004BEA0606CAF80860DAF8046026EA0E0E59
-:101AC0007E68C6F3001606FA0CF646EA0E06CAF859
-:101AD0000460DAF80C603540BE6806FA04F42C4362
-:101AE000CAF80C407C68E4009BD54FEA9C0E58F87D
-:101AF0002E5001F00C0109FA01F425EA0404BAF1B0
-:101B0000904F08BF00250ED0144DAA4508BF0125EF
-:101B100009D0134DAA4508BF022504D0114DAA458E
-:101B20007FF44DAF03254FE7BDE8F18F81B0002A68
-:101B300014BF8161816201B0704781B042690A427D
-:101B400014BF8162816101B0704700000008005835
-:101B500080080058080001400010004800040048B8
-:101B600000080048000C00480901020081B002D4BE
-:101B70004248815405E0424802F00F02104400F848
-:101B8000041C01B070473F4A13684FF6FF01000282
-:101B90000B4000F4E06018433B4908431060704775
-:101BA00038B5384B1C68C4F30223C3F10704052C75
-:101BB00028BF04241D1D072D34BF0023DB1E012573
-:101BC00005FA04F4641E2140994005FA03F35B1EF4
-:101BD0001A401143BDE83440C6E7010007D4012292
-:101BE00000F01F01294B8A40400943F8202070472C
-:101BF00001000BD4012200F01F01254B8A4040094F
-:101C000043F82020BFF34F8FBFF36F8F7047BFF3B0
-:101C10004F8F1C491F480A6802F4E06202430A60C1
-:101C2000BFF34F8F00BFFDE710B5401EB0F1807FBE
-:101C300001D3012010BD184C60600F214FF0FF3020
-:101C4000FFF792FF0022A26007202060002010BD55
-:101C5000010007D4012200F01F01104B8A40400907
-:101C600043F820207047010007D4012200F01F0133
-:101C70000B4B8A40400943F82020704700E400E005
-:101C800018ED00E00CED00E00000FA0500E100E0D6
-:101C900080E100E00400FA0510E000E000E200E06E
-:101CA00080E200E07047000000B500BF13009646D8
-:101CB0009446103928BFA0E80C50FAD85FEA417C5E
-:101CC00028BF0CC048BF40F8042BC90728BF20F824
-:101CD000022B48BF00F8012B00BD00002DE9F043A6
-:101CE0009FB00FF29C16269CDFF8E48A02918DF8D3
-:101CF0003B4000210B914FF0FF37044691461D46B3
-:101D00000AE019F8011B0298A0470028029000F091
-:101D1000A4800B98401C0B9099F8000050B1252826
-:101D2000EFD10020002105900691079008910990BD
-:101D30000A9103E00B98A7E041F0010119F8010FA7
-:101D40002028F9D023280CD02B2804D02D2805D00A
-:101D5000302809D083E041F00201EFE741F00401AF
-:101D6000ECE741F00801E9E741F01001E6E7002067
-:101D70000D900AE00D98404505DA00EB800302EB78
-:101D80004302303A0D9209F1010999F80020A2F1BD
-:101D900030000A28EED399F800002E2818BF0C97BF
-:101DA00026D119F8010F2A2808D12868286009F1DE
-:101DB000010950F8042B28600C9219E02D280CBF63
-:101DC00019F8010B002000220C920BE040B90C9A8C
-:101DD000424505DA02EB820203EB4203303B0C93EF
-:101DE00009F1010999F80030A3F130020A2AEDD374
-:101DF000ADF83810304699F8001000F081FE08B1B7
-:101E000019F8010B8DF83A009DF83A00682804BFD4
-:101E100099F80010682903D162208DF83A0008E093
-:101E20006C2804BF99F800006C2804D171218DF84A
-:101E30003A1009F1010910A804902A4619F8013B4B
-:101E40006946204600F060F838B910AA6946204675
-:101E500000F08CF900287FF55FAF384614E02A289F
-:101E600085D12A682A6052F8040B2A6000280D9058
-:101E700003D540420D9041F0040109F101098AE7C0
-:101E8000686A6C747A4C00001FB0BDE8F083622869
-:101E900020D0682811D06A2803D06C2827D0712858
-:101EA00025D10868C01D20F007000860D0E9002394
-:101EB00008300860194610467047002A0A680A6010
-:101EC000106803D0121D0A6000B217E0121D0A60EC
-:101ED00080B217E0002A0A680A60106803D0121D59
-:101EE0000A6040B20AE0121D0A60C0B20AE0002A8D
-:101EF0000A680A60106803D0121D0A60C117704793
-:101F0000121D0A600021704770B51C460D46B4F1E1
-:101F100025002E69114600F017811C386AD0001F79
-:101F2000022867D9133843D0093863D0801E16D0F1
-:101F3000401E1ED0401E02285CD9001F19D0401F31
-:101F400000F08380401E33D0401E00F0CD80C01EC4
-:101F500000F0D880801E2BD0C01E29D0FAE068691E
-:101F6000421C6A610A680A6052F8043B0A603354F2
-:101F7000FAE095F83A000122FFF789FFC5E9000170
-:101F80000023994204DA6869411C69612D210DE042
-:101F9000288F810704D56869411C69612B2105E000
-:101FA000C00722D56869411C6961202131541CE0B9
-:101FB00095F83A000022FFF76AFFC5E9000195F89D
-:101FC0003800010711D5D5E900230020834208BF5E
-:101FD00082420AD044F02000782806D16869302176
-:101FE0003154401C411C69613454214668693044B5
-:101FF000E86083E00868C01D20F007000860D0E9B1
-:10200000002308300860C5E90023D5E90001C80FA6
-:1020100004D06869411C69612D210DE0288F81077A
-:1020200004D56869411C69612B2105E0C00704D50E
-:102030006869411C69612021315468693044E86055
-:102040002146284600F0C4F98EE005F13A025078A6
-:1020500020B14FF0FF340FF648205EE01078622880
-:1020600008D0682824D06A2812D06C282ED0712875
-:102070000ED02BE00A680A6052F8040B0A6020B9FF
-:102080004FF0FF340FF6302047E0E96A01706BE053
-:102090000A680A6052F8040B0A6020B94FF0FF3456
-:1020A0000FF6142039E0EA6AD317C0E900235BE099
-:1020B0000A680A6052F8040B0A6020B94FF0FF3436
-:1020C0000FF6F41029E0E96A01804DE00A680A6021
-:1020D00052F8040B0A6020B94FF0FF340FF6D81005
-:1020E0001BE0E96A01603FE00A680A6052F8040BED
-:1020F0000A600021C5E90001EE607821284600F061
-:10210000BBF831E00868086050F8044B0860EC60E8
-:102110003CB94FF0FF340FF6B81000F0FDFC201A68
-:1021200070BD2E6B002E04D5204600F017FD04462E
-:1021300008E032460021204600F02CFD002814BFA4
-:10214000041B3446AC610FE06869411C69612521BC
-:10215000315409E06969481C6861252272542100E4
-:1021600002D0411C69613454002070BD2DE9FC414E
-:102170000F460646796B7869BC6A091A386A091AEB
-:10218000B869091A786A091AF869091A97F83800BB
-:102190000C1B410790460FD42021002C8DF8001015
-:1021A0000ADD254601236A463946304600F060FCC8
-:1021B00000285DD16D1EF5D17B6942463946304617
-:1021C00000F056FC002853D130208DF800003D6A05
-:1021D000002D09DD01236A463946304600F048FCEF
-:1021E000002845D16D1EF5D1BB69FA6839463046E5
-:1021F00000F03EFC00283BD130208DF800007D6AC5
-:10220000002D08DD01236A463946304600F030FCD7
-:1022100070BB6D1EF6D1F868B969FB694218394682
-:10222000304600F025FC18BB30208DF80000BD6A58
-:10223000002D08DD01236A463946304600F018FCBF
-:10224000B0B96D1EF6D197F8380041070DD52021A1
-:10225000002C8DF8001008DD01236A46394630460F
-:1022600000F006FC20B9641EF6D10020BDE8F6811E
-:102270004FF0FF30BDE8F6812DE9FC4707468A465E
-:102280003E69BAF16F0F08BF082405D04AF020015B
-:10229000782914BF0A2410243C25D7E90023BAF179
-:1022A000640F18BFBAF1690F9046994606D1002114
-:1022B0008B4203DAD8F1000869EB49090020814517
-:1022C00008BF80451FD1386BE8B9082C4CD197F86E
-:1022D0003800010748D530203B2586F83B0043E015
-:1022E00000280ED597F8380000F01400102808D107
-:1022F0007A6B7869121A386A121A511A0029C8BF03
-:102300003962BDE8F3878DF800A040464946224671
-:10231000E317FFF723FA3032D0B26D1E3A28019549
-:1023200004DB9DF80000A0F151018A187255404667
-:1023300049462246E317FFF711FA804689460020F6
-:10234000814508BF804503D0F86871198842DCD305
-:10235000082C09D197F83800010705D5715D30299F
-:1023600002D06D1E30207055C5F13C01B961701965
-:10237000F860386B8142B3DA411A39624FF6EF7078
-:10238000398F01403987BDE8F3872DE9D0430646F0
-:102390000F4614464FF00008DFF8389412E0E007CB
-:1023A00007D542464B463046394600F01FFC0646EC
-:1023B0000F464046494642464B4600F017FC641023
-:1023C00080468946002CEAD130463946BDE8D083A4
-:1023D0002DE9F34F054641F020048DB0D5E9008981
-:1023E000612C02AE09D0286B002848BF062003D418
-:1023F00008BF672C01D101202863D5E900235800CC
-:102400004015401C0ED119030CD00320A8619DF883
-:10241000380061381A2802D20FF2D06111E00FF2B1
-:10242000D0610EE058004015401C0FD119030DD1AA
-:102430000320A8619DF8380061381A2814D30FF2E0
-:10244000B861E868032200F0A3FCD3E1194621F04B
-:102450000043B3F5801F10460DD20027BB4208BFD2
-:10246000BA42019703D111E00FF28861E9E701AAAE
-:1024700000F0E2FC0AE0DFF8607307EB1352DFF8CC
-:102480005C3301921940DFF858331943C5E9000164
-:10249000612C0ED1E86830210170811CE9609DF843
-:1024A000381061290CBF7821582141706869801C5F
-:1024B0006861D5E900AB2BF0004300202AF0000250
-:1024C000834204BF8242002300F05A81612C40F015
-:1024D000A980286B00284CBF2120401C009040465A
-:1024E000009F7F1C49460022002300F0DDFCD946F6
-:1024F00001988DF8082038BF89F00049001F01902D
-:10250000002FD0460DF1090040F3498140F2FF71E0
-:10251000DFF8D0B20C91064640464946002200231F
-:1025200000F0DAFC80F03A814800400D00F11C0216
-:1025300010D0002A0EDD0C98824205DB09F0004025
-:1025400040EA0B01002013E0A448084040EA025191
-:1025500040460DE029F00043002028F000028342AD
-:1025600008BF82420FBF40461C22404600F0CCFC10
-:102570008046894600F066FDFF1F002F044609DDF6
-:1025800000F07EFD02460B464046494600F08AFDBB
-:1025900080468946F01D072104E004F00F0200F890
-:1025A000012D2411002C01DD491EF6D5491E5CBF0A
-:1025B000002200F8012DF9D5ECE00020194602AA0E
-:1025C0000A4400E05B1E12F80149491E8442F9D01A
-:1025D0000F2804D10DF10900425C521C425400291D
-:1025E00004D50198001D02AE5B1C0190591E12D447
-:1025F0009DF838007218147804F130085FFA88F4F6
-:10260000392CC4BFA0F13A04A044491E02F8018944
-:10261000F1D58DF83800286B002840F1B080591EA4
-:102620002963ACE0404649460022002300F03CFC10
-:10263000019938BF89F0004947F2975041436A4AEF
-:1026400091FBF2F20192D2F1070204DD40464946C5
-:10265000FFF79BFE0AE0524200206449FFF795FE17
-:1026600002460B464046494600F08EFD8046662CE9
-:10267000286BDFF87CB106BF019F0A3706273F1899
-:10268000142FC8BF142730208DF8080089460DF19B
-:10269000090000E03046002F34DD0646404649463A
-:1026A00000F096FE01460A4606F1080304200A26B9
-:1026B000B2FBF6F606EB860EA2EB4E02303203F8C2
-:1026C000012C0A22B6FBF2F202EB820EA6EB4E06BA
-:1026D0003036401E03F8026DE9D1083F002F03F1A8
-:1026E0000806D7DD084600F087FE02460B46404646
-:1026F000494600F0D7FC00225B4600F077FA80469E
-:102700008946CBE70DF10901401A0DF1090604E0F5
-:102710000199491E401E0191761C31783029F7D06D
-:10272000662C02D10199491C03E0652C0CBF0121E4
-:1027300000212B6BCB189842B8BF431E002B1ED430
-:10274000834204DAF05C3528A8BF392000DA302053
-:102750001946721E02EB010800E05B1E18F8019991
-:10276000491E8145F9D0392802D1705C401C705453
-:10277000002904D50198401C16465B1C0190019865
-:1027800000B200901BB29DF838103246284600F087
-:1027900034F82FE0C61D002F3FF7BEAE30460DF1D6
-:1027A0000901401A009903468842C8BF0B46002B16
-:1027B0000DF109063FF52FAF8342BFF6FEAE0DF1D6
-:1027C0000900C05C07287FF7F8AE0F20F6E600008E
-:1027D000CBCCCC0C0000244002FCFFFFFFFF0F809D
-:1027E0000000E03F0000F07FA08601000000F03F05
-:1027F00084D797410FB0BDE8F08F2DE9F84783B03B
-:1028000006468A461746984600F004FEB8F1000FC7
-:10281000406A356B90F8009003DC4FF001080FF22E
-:10282000DC27BDF930404AF02000662808BF641C50
-:1028300015D0672840F0848014F1040FC0F2868020
-:10284000AC4280F2838096F83800641C010702D401
-:10285000A845B8BF454620B22D1A48BF00250FFA3B
-:1028600084FAF068B169BAF1000F25DC4A1C302304
-:102870004354002D03DC96F83800010703D5F068B7
-:1028800000F80290521C15EB0A0FB8BF6C4220B240
-:10289000441941424445B8BFA046B26171620FFA83
-:1028A00088F5F561F068B3692A463946184400F0A6
-:1028B0006FFA641BB462C4E022B29045084417DA90
-:1028C0004246394600F064FAB0694044B061AAEB70
-:1028D0000801002D716203DC96F838100A0705D54F
-:1028E000F16801F80090F069401CF061B562A8E061
-:1028F000394600F04DFAB069002D5044A8EB0408A9
-:1029000003DC96F838100A0703D5F16801F8009047
-:10291000401CB0610FFA88F08542F068B369B8BF17
-:10292000A8460FFA88F207EB0A01184400F030FAC3
-:10293000B0690FFA88F10844B061681A706280E0EB
-:10294000BAF1610F14D14FF0700A16E0A84504DA0D
-:1029500096F838100A0758BF45466D1E48BF002537
-:10296000BAF1670F14BF4FF0450A4FF0650A04E053
-:10297000BAF1410F08BF4FF0500AB169F368481C23
-:10298000B061002D17F8012B5A5403DC96F838106B
-:102990000A071BD5F168431CB36101F80090002DB4
-:1029A00014DDA8F101080FFA88F08542F068B8BF7D
-:1029B000A8460FFA88F23946184400F0E9F9B069E0
-:1029C0000FFA88F108446D1AB0617562F068B16958
-:1029D0000844002C80F800A003D42B214170811CF6
-:1029E00003E02D2141706442811C00206A460AE008
-:1029F00023460A2493FBF4F404EB8405A3EB45037C
-:102A000002F8013B401C24B2002CF1DC012806DC5A
-:102A10004AF02002652A04BF302201F8012B48B990
-:102A2000302001F8010B07E0401E1DF80020303275
-:102A300001F8012B0028F7DCF068B2691044091A8C
-:102A4000F16196F8380000F0140010280DD171697A
-:102A5000B0694118706A4118F0694118B06A4118AC
-:102A6000706B8142BCBF411A316204B0BDE8F0878F
-:102A7000F8B505460E4617461C46002074B117F8F7
-:102A8000011BB068A847B06030B1F06A401CF0622A
-:102A90000020641EF3D1F2BD4FF0FF30F2BD000004
-:102AA0007072696E74665F733A20256E2064697374
-:102AB000616C6C6F776564007072696E74663A2041
-:102AC00062616420256E20617267756D656E7400A9
-:102AD0007072696E74665F733A2062616420257358
-:102AE00020617267756D656E740000006E616E0026
-:102AF0004E414E00696E6600494E460030000000AF
-:102B00000278C9B28A421AB11CBF10F8012FF9E746
-:102B100018BF00207047000080B508B90FF21C00F4
-:102B200005490B681BB122220021984701E000F003
-:102B300077FC222002BD000058240020636F6E73D2
-:102B4000747261696E742068616E646C65723A209B
-:102B5000626164206D6573736167650000F1010354
-:102B6000810704D010F8011B89B18107FAD10268EE
-:102B7000B2F10131914311F0803F04BF50F8042FAE
-:102B8000F6E710F8011B11B110F8011BFBE7C01AA2
-:102B900070470000C9B2830706D0521E22D310F836
-:102BA000013B9942F7D11FE0083A13D302F1040226
-:102BB00041EA012141EA014150F8043B121F21BFC3
-:102BC0004B40A3F1013C2CEA030C1CF0803FF3D0F6
-:102BD000C9B2001F083210F8013B521E28BF91EA0B
-:102BE000030FF8D818BF0120401E7047B0B581EA26
-:102BF000030C0CF0004C40F2FF7515EA11541DBF98
-:102C000015EA1357AC42AF4239E0E41923EA4553C1
-:102C100043F48013C90241F0004141EA505EC7020B
-:102C20001100A7FB020200284FF00000EEFB01207C
-:102C30004FF00001E3FB072118BF42F001024018EA
-:102C400000214941E3FB0E01A4F580640F0302D289
-:102C500052004041494154F101046CDD470872F1D2
-:102C6000004250F1000051EB0451A1F580115CBF0E
-:102C700041EA0C01B0BD4CEA05510020B0BD05EAA7
-:102C80001357AC4214BFAF4241E050EA410E1CBFA3
-:102C900052EA430E02E061460020B0BD24423C44AB
-:102CA0001BD15FEA070EF6D0090302BF01460020E0
-:102CB000AEF1140EB1FA81F7AEEB070401FA07FE8C
-:102CC0000C37C7F1200100FA07F7C8404EEA000EA2
-:102CD00023EA455343F48013A2E733F00043B3FAE9
-:102CE00083F704BFB2FA82FE77440B3FE41BB7F1CF
-:102CF000200E2FBF02FA0EF3BB40C7F1200E22FABE
-:102D00000EFE38BF43EA0E03BA40641C82E750EA65
-:102D1000410E14BF52EA430E6FF000014FF400174A
-:102D200017EB430F8ABF194617EB410FB5E74CEA83
-:102D300005510020B0BDD4F10104B4F120070FDA31
-:102D4000C4F12007520828BF42F0010210FA07F52B
-:102D500001FA07F7E1BF2A43E0403843E1400FE0C2
-:102D6000352C98DCC7F1200452EA400220FA07F221
-:102D700018BF42F0010231FA07F0A1400A430021D6
-:102D800072F1004250F1000051EB0C01B0BD0000A7
-:102D900062B38B0708D0521E11F8013B00F8013BCB
-:102DA00000F024808B07F6D1830740F0208000BF1D
-:102DB000103A07D330B4B1E83810103AA0E8381010
-:102DC000F9D230BC530724BFB1E80810A0E80810BE
-:102DD00044BF51F8043B40F8043BD20724BF31F80C
-:102DE000022B20F8022B44BF0B7803707047121F90
-:102DF00017D35B0009D151F8043B20F8023B1B0CB0
-:102E0000121F20F8023BF6D20BE051F8043B00F809
-:102E1000013B1B0A20F8023B1B0C121F00F8013B70
-:102E2000F3D238BF121D521E24BF11F8013B00F827
-:102E3000013BF8D87047000010B5144600F002F8C6
-:102E4000226010BDC1F30A5343B14A0012F5001FBE
-:102E500028D2A3F2FE32A1EB0251704750EA410C96
-:102E600020D001F0004C31EA0C01B1FA81F204BF2C
-:102E7000B0FA80F3D2180B3AB2F120032CBF00FA5B
-:102E800003F1914041EA0C013EBFC2F1200C20FA4F
-:102E90000CF319439040524240F2FD33D21A01EB39
-:102EA00003517047002270474FF4001C1CEB410F88
-:102EB00094BF1CEB430F09E041EA030C50EA4C0CB1
-:102EC00052EA0C0C03D2994208BF9042704714BFDB
-:102ED0008B428242704700004FF4001C1CEB410FF4
-:102EE00094BF1CEB430F09E041EA030C50EA4C0C81
-:102EF00052EA0C0C03D28B4208BF8242704714BFC7
-:102F00009942904270470000124254D440F2FF7C34
-:102F10001CEA11530FD0634531D09B1863453CBF69
-:102F200001EB0251704701F0004141EA0C510020D1
-:102F3000AFF30080704750EA410320D001F0004C0D
-:102F400091EA0C011CD0B1FA81F30B3B9A420DD9E6
-:102F5000D21A994051EA0C01C3F1200C20FA0CFC62
-:102F600061449840531C40F2FF7CD7E7914041EA0E
-:102F70000C01C2F1200C20FA0CF319439040704769
-:102F8000B0FA80F31533202BE0D3202AEED3203A79
-:102F9000203B9A4209D9D21A00FA03F141EA0C0106
-:102FA0000020531C40F2FF7CB8E700FA02F141EA2E
-:102FB0000C0100207047524240F2FF7C1CEA115382
-:102FC0000DD06345DBD0B2EB030C3CBFA1EB02514B
-:102FD00070470CF1010221EA035141F4801150EADB
-:102FE000410CCCD001F0004C352A27DC30B481EA0A
-:102FF0000C01B2F1200309DAC2F12003044601FA00
-:1030000003F5D0402843D1409C400CE0C3F120029E
-:10301000450020FA03F418BF44F0010421FA03F03C
-:1030200091400C43002174F1004550F1000051EB38
-:103030000C01244230BC7FF47BAF70476146002016
-:1030400076E70000C1F30A5340F2FE329B1A14DD0A
-:10305000D3F120034FEAE17208DDC90241EA505181
-:1030600041F00040D84080185040704703F2E130F2
-:1030700010B1D24382F0004070470020704700003A
-:10308000C11768B14840401AB0FA80F29040D21C93
-:10309000C907C2F5846241EA025202EBD021400521
-:1030A0007047000070B44FF0004591EA030F40F103
-:1030B000BB816B40841A71EB030603D2001BB14144
-:1030C000121973414FF4001C1CEB410F34BF7CEB11
-:1030D000430442E00C0DA4EB1356352E4FDC45EAB9
-:1030E000C323DB0A45EAC121C912B6F120050DDD73
-:1030F00063FA05F6EB4086EA0305124218BF45F075
-:103100000105C01851F100010CD213E062FA06F576
-:10311000F2405540F3415A40B340F3405A408018C2
-:10312000594107D349085FEA30005FEA350528BFF7
-:1031300045F0010501F58011420875F1004250F19A
-:10314000000041EB04514E0016F5001F70BC38BF63
-:1031500070470020090D090570471CEB410F10D284
-:1031600052EA43060BD0BCEB410F05D80C0DAB4324
-:10317000661E342EB6DD02E0AB438018594170BCA8
-:10318000704770BC70470000F0B540F2FF7581EAEF
-:10319000030C0CF0004C15EA11541DBF15EA13572F
-:1031A000AC42AF42E5E0BC41C1F31301C3F31303EA
-:1031B000801A994143F4801304D2641E40004941AF
-:1031C00080185941C90241EA5051B1FBF3F603FBA3
-:1031D0001611A2FB0675D7EBC020A94102D2761EBC
-:1031E00080185941C90241EA5051B1FBF3FE03FB7B
-:1031F0001E11A2FB0E75D7EBC020A94103D2AEF180
-:10320000010E80185941890241EA9051760546EA3B
-:103210008E2EB1FBF3F603FB1611A2FB0675D7EB5E
-:103220008020A94102D2761E80185941C90241EA84
-:1032300050514EEA060EB1FBF3F603FB1611A2FB4A
-:103240000675D7EBC020A94102D2761E80185941DD
-:10325000C90241EA5051B1FBF3F703FB1711A2FB7E
-:103260000735D3EBC020A94167F100070CBF00422E
-:1032700047F0010766F3D5274FEA1E31B80814F569
-:10328000806412DDBD0775F1004250EB0E5051EB2A
-:10329000045111F5801F5CBF41EA0C01F0BD4CF0F8
-:1032A0007F6141F0E0410020F0BDBD076D0840EABC
-:1032B0000E5041F48011D4F10104B4F120060ADA71
-:1032C000C4F120060200E04001FA06F3E140184391
-:1032D000B24015430EE0342C13DCC6F1200445EA5D
-:1032E00040056D0820FA06F2154321FA06F0A140C8
-:1032F0000D43002175F1004250F1000051EB0C012B
-:10330000F0BD00205FEA0C01F0BDCFB992185B411F
-:10331000B3FA83F704BFB2FA82F6BF190B3FB7F1D5
-:1033200020062FBF02FA06F3BB40C7F1200622FA9F
-:1033300006F638BF3343BA401CB1E419641E33E7C4
-:103340007F4231F00041B1FA81F404BFB0FA80F657
-:10335000A4190B3CB4F120062FBF00FA06F1A140DE
-:10336000C4F1200620FA06F638BF3143A0403C1BCA
-:103370001AE7AC421ABF05EA1357AF4212E050EA0F
-:1033800041061CBF52EA4306BFE750EA41073046F8
-:1033900061461CBF41EA0551F0BD52EA430C08BF2B
-:1033A000C143F0BD00204FF4001616EB410F98BF4B
-:1033B00016EB430F08BF16EB410F24BFC14305E0D6
-:1033C00016EB430F0CBF61464CEA0551F0BD0000FF
-:1033D000400D491840EA81200CD2490DA1F58061C9
-:1033E000491C40F0004005DBD1F11F0154BFC8402B
-:1033F000C017704700207047014648B1B0FA80F10D
-:103400008840C91CC1F58461090501EBD021400544
-:10341000704700000148704700000000741500204C
-:10342000012000F0B5B80000841A71EB030604D245
-:103430006E40001BB141121973414FF4001C1CEB8C
-:10344000410F34BF7CEB430682E00C0DA4EB135616
-:10345000362E7BDC012E45EAC32341DC43EA52537E
-:1034600012BFD20292025B08240545EAC12141EA5B
-:103470005051D2EBC020994125D407D1B0FA80F643
-:1034800010FA06F162D00020203608E0B1FA81F689
-:10349000B140C6F1200220FA02F21143B0404FEAD7
-:1034A000F474B4EB465434F001064FEA74040AD8BD
-:1034B000D6F50016760D04F00044F04061FA06F2ED
-:1034C0005040F1404840C00A40EA415021F00041DC
-:1034D00028BF5FEA500550F1000044EBD12135E0F0
-:1034E000DB0A45EAC121C90AB6F120050EDD42EA30
-:1034F0000242120CC5F1200603FA06F6EB4042EA3E
-:1035000006056D42984161F100010DE062FA06F591
-:10351000F240554063FA06FC82EA0C02F3405A403E
-:103520006D42904161EB030111F4801F05D1641ECF
-:10353000620502D06D004041494121F480114308E9
-:1035400075F1004350F1000041EB045170BC70472D
-:103550001CEB410F15D223F0004352EA43060BD077
-:103560004FEA4C0CBCEB410F04D80C0D661E342EF8
-:10357000B7DDEBE7801A994150EA410608BF002108
-:10358000E4E708BF1CEB430F28BF6FF00001DDE745
-:1035900080B5AFF30080024A11001820ABBEFBE7F4
-:1035A0002600020030B5040085B008BF012043D0DA
-:1035B00004F50A7595F9010020B90021297020460B
-:1035C00000F02CFB03206870206800F0FAFB00205C
-:1035D0000AE004EB4011283101224A700870C881CA
-:1035E0000022401C00F02AF861688842F1D30020D4
-:1035F000002208E004EB401101F594710870401CB2
-:103600004A7000F01BF861688842F3D383B0211D33
-:1036100068462022FFF7CCFB0EBC206800F0D6FBEA
-:10362000002084F8240001206870E069012804BFAC
-:10363000204600F0FEFE002005B030BDCA700A61D1
-:103640004A618A61C0B2704710B500F0CCF801D170
-:10365000022010BD00F0C1F8206800F0ABFBFFE7CE
-:10366000002084F8280210BD38B5044600F0B2F8F6
-:10367000010444BF204600F09CF900F0ABF840057F
-:103680000CD500F0A3F84FF6FF3000F09BF8204671
-:1036900000F0F2FA0021204600F0AAF800F09AF8B3
-:1036A000400405D500F092F84BF6FF7000F08AF860
-:1036B00000F090F8800405D500F088F84DF6FF7012
-:1036C00000F080F804F5187500F084F8C00420D5E7
-:1036D0002168B1F840204FF6FB700240A1F840206D
-:1036E0004FF6F770B1F840200240A1F8402095F95C
-:1036F0000000012804D100212970204600F0AEFE10
-:10370000204600F0CAFA00F061F84EF6FF7000F0B3
-:1037100059F800F05FF8000516D5206800F1400266
-:10372000118841F0080111804FF2FF7193880B401E
-:103730009380118841F00401118000F030FEC00434
-:103740005CBF204600F0A5FA00F044F8000621D541
-:10375000206800F140014FF67F708A8802408A801D
-:1037600095F9000098B90A8842F004020A80012203
-:10377000088840F0080008802A70888A800800F0D5
-:103780003C0068600121204600F068FE02E020460F
-:1037900000F07FFA00F01EF8800508D500F016F85A
-:1037A0004FF6FF5000F00EF8204600F061FA00F0EE
-:1037B00011F8C00505D500F009F84FF6FF6000F0DC
-:1037C00001F831BD0240A1F8442070472168B1F8EA
-:1037D00044207047206800F0E2BD012184F82812DF
-:1037E000206800F0D3BD044694F9280201287047F0
-:1037F00010B5FFF7F8FF01D1022010BD012284F8B7
-:10380000282284F82410206800F0BAFD28E738B593
-:10381000054601F0070005EB40100C0647BF00F11C
-:103820002804012000F59474002001F00701607065
-:1038300021702261E370607808B12178E181022B68
-:1038400004BF0020207195F92802012801D102202F
-:1038500032BD012185F828122146286800F0C8FAF7
-:1038600072E010B5044600F098F847BF28300122F6
-:1038700000F59470002201F007014270017094F984
-:103880002812012901D1022010BD00F08CF800F0AF
-:10389000E2FBE5E61CB501F0070400EB441404F577
-:1038A000947400F01BF86270217011E001F00701C0
-:1038B00000EB4110D0F8440170471CB501F007043B
-:1038C00000EB4414283400F009F8217001226270E2
-:1038D0002146006800F045FC002016BD01F00701FC
-:1038E0006261A3610022E261704738B505460C466B
-:1038F000696804F00700814201D2012032BD21062F
-:1039000005D505EB401000F12801012204E005EB8C
-:10391000441000F5947100224A700120887004F070
-:1039200007040C7095F92802012801D1022032BD4C
-:10393000012285F82822286800F0CCFC24B92868E8
-:1039400005F50C7100F02EFD002085F8280232BD2F
-:103950001CB5044601F00F0362689A4201D20120AF
-:1039600016BD00F01AF847BF2830012200F5947008
-:10397000002201F00701427000228270017094F968
-:103980002812012901D1022016BD00F00CF800F028
-:10399000BAFC002084F8280216BD01F0070004EBF1
-:1039A00040100A067047012284F828220146206848
-:1039B00070472DE9F84F00F59475064627E0018819
-:1039C0000AEA010141F40041018006F12404306853
-:1039D000B0F85010227901EBC201401800F2024009
-:1039E0000088A169C0F3090020620844A061002199
-:1039F000304600F036F9217849B1E06938B92178CC
-:103A0000306841F08001A0F84C100021217030682E
-:103A100000F144010A88130440F1E7800A8812F09B
-:103A20000F0440F68F7748F60F7A57D1D206C6D5E5
-:103A30000288130511D5898900F0E0F8EA88C3F3FC
-:103A40000903EB6106F50C7100F0C8FC306800F06A
-:103A5000CFF8304600F0F7F8D9E71104D7D500F0D9
-:103A6000C7F83068B0F8501000F0C8F8C3F3090385
-:103A7000002BEB6107D0EA88696900F0AFFC686948
-:103A8000E969084468610021304600F0E2F83068D6
-:103A9000B0F850104118286901F2064120B9088891
-:103AA00048F2FF32104009E03E2805D24208C00724
-:103AB00048BF521C900203E04009800240F40040DD
-:103AC00008804BF68F7230680188114081F44051B4
-:103AD00041F4004141F08001018098E730F82480F2
-:103AE0005FEA084106EB441957D530F824100F401F
-:103AF00047F0800720F8247009F594773068397B07
-:103B000071B9B0F85030397803EBC103C21800F036
-:103B10007DF82DD0FA8879695B4600F05FFC27E0DC
-:103B200039780B4630F823305A04B0F8503003EBA4
-:103B3000C10107D5421802F2024200F069F80AD02A
-:103B40003A8904E0421800F061F804D07A895B46B3
-:103B5000796900F043FC3168387831F8202048F664
-:103B60008F731A4042F4004242F0C00221F8202034
-:103B7000F9695944F961796901EB0B027A61BB6912
-:103B800013B139698B4504D23978304600F061F8B9
-:103B900003E039783046FFF77DFE5FEA086020D504
-:103BA000316831F824200AEA020242F4004209F1A5
-:103BB000280021F8242032680178B2F8503003EB55
-:103BC000C103D21802F2024212884369C2F3090209
-:103BD000C2611A4483694261002B304602D100F071
-:103BE00040F814E7FFF769FE11E70020BDE8F28F07
-:103BF00001880F4047F08007078070472A7801EB63
-:103C0000C201411801F206410B88704702F20642D8
-:103C10001188C1F3090BBBF1000F704780B56048F4
-:103C2000016841F0806101600022006800F080605E
-:103C30000090062100981420FDF7B2FFBDE8024075
-:103C40001420FDF7CABF00F50C71D0F8700200F027
-:103C500036BC00EB4112D0F87002D2F83C2100F0E3
-:103C600058BC00EB4112D0F87002D26B00F090BC4F
-:103C7000D0F8700200F019BD10B50446D4F87002F7
-:103C800000F0DBFCD4F87002BDE81040012100F028
-:103C9000FDBCD0F8700200F0FCBCD0F8700200F05F
-:103CA000FEBC10B53F4C40492160C4F870020821A9
-:103CB00061600021E16002212161A1600021A16118
-:103CC000C0F898422046FFF76DFC1823002200211F
-:103CD00000F012F858230022802100F00DF8C023D4
-:103CE0000022812100F008F84FF48873002201219E
-:103CF00000F002F8002010BD204600F082BB80B525
-:103D0000D0F89802FFF7A0FC002002BD10B51C46B9
-:103D10001346D0F898022246FFF779FD002010BD27
-:103D200080B5D0F89802FFF79CFD002002BD80B559
-:103D3000D0F89802FFF7D9FD002002BD80B5D0F879
-:103D40009802FFF705FE002002BD81B0D0F898026E
-:103D500001F07F0200EB421009064CBF90F82A00E8
-:103D600090F82A0101B0704780B5D0F89802FFF7AB
-:103D70003FFD002002BD80B5D0F89802FFF79DFD01
-:103D8000002002BD80B5D0F89802FFF783FD002027
-:103D900002BDD0F89802FFF789BD044870470000C3
-:103DA00058000058AC150020006800402018002082
-:103DB00070470000B0F8401041F43F4141F08001ED
-:103DC000F2E2B0F8402044F27F01F1E20EB40121AA
-:103DD00020F8401F0021018081800182018841F488
-:103DE0003F4141F080010180002003B07047000096
-:103DF0002DE9F8470B4648F68F111D780246002042
-:103E000032F825600E40D97803290CD8DFE801F09C
-:103E100002080C0546F4007606E046F4C06603E0AE
-:103E200046F4806600E0012048F28004264322F830
-:103E3000256048F68F7519780E4632F826702F40A7
-:103E40003943214322F826104BF68F76197B93F8DD
-:103E5000009000294CF2800748F6BF7C48F2C00E63
-:103E600067D1B3F806A04FF6FE7101EA0A0A597845
-:103E70000029B2F8501011441ED001EBC90101F520
-:103E80008061A1F800A0197832F82160760606D585
-:103E900032F8216035404EEA050522F821501978A4
-:103EA000DB78012B32F821300CEA03030EBF1C43F0
-:103EB00083F020031C43CAE001EBC90909F204495D
-:103EC000A9F800A0B2F8501002EB010C19780CEB25
-:103ED000C10C19690CF2064C31B9BCF800E048F28B
-:103EE000FF3101EA0E010CE03E2908D24FEA510EE3
-:103EF000C90748BF0EF1010E4FEA8E2E03E04909B3
-:103F0000890241F4004EACF800E0197832F821C083
-:103F10005FEA4C4C06D532F821C005EA0C053D435A
-:103F200022F82150197832F821301E4086F440568C
-:103F30008CE032F82910294041F4014141F0800120
-:103F400022F82910B2F85010B3F808A002EB0109CA
-:103F5000197809EBC10101F580694FF6FE7101EA9C
-:103F60000A01A9F80010B2F85010B3F80A9002EB59
-:103F70000108197808EBC10808F204484FF6FE71F1
-:103F800001EA0901A8F80010597893F80080002987
-:103F900032F828102BD1490405D532F828102940D1
-:103FA0000F4322F82870197832F821707F0606D561
-:103FB00032F821702F404EEA070722F82170197855
-:103FC00032F821703D404EEA050522F8215019785B
-:103FD00032F821502E4086F44056264322F82160C4
-:103FE000197832F821300CEA03031C432FE049040E
-:103FF00005D532F828102940394322F828101978BD
-:1040000032F821805FEA486807D532F8218005EA56
-:1040100008084EEA080E22F821E0197832F821E06B
-:1040200005EA0E053D4322F82150DD781978012D6F
-:1040300032F821500CEA050518BF85F0200525430C
-:1040400022F82150197832F821301E40344322F8EA
-:104050002140BDE8F2872DE9F041024691F800C009
-:1040600048780B7B4BF68F7E4CF2800448F2800838
-:1040700048F6BF7548F2C00648F68F77ABB90028FE
-:1040800032F82C0008D0400636D532F82C00074014
-:104090003E4322F82C602FE0400456D532F82C0025
-:1040A00007403C4322F82C404FE0002832F82C0017
-:1040B00029D1400405D532F82C003840044322F8B9
-:1040C0002C40087832F820305B0605D532F82030D5
-:1040D0003B40334322F82030087832F820301F402C
-:1040E0003E4322F82060087832F820300EEA0303BD
-:1040F00048EA030322F82030087832F820100D40F7
-:1041000048EA050128E0400405D532F82C00384083
-:10411000204322F82C00087832F820305B0605D5C1
-:1041200032F820303B401E4322F82060087832F8F5
-:1041300020301F403C4322F82040087832F82030DD
-:104140001D4048EA050522F82050087832F8201072
-:104150000EEA010148EA010122F820100020BDE822
-:10416000F081F8B50E46054672783469B069012AC7
-:1041700048F2800748D1844232BF001B0446002029
-:10418000B061307B40B9F28800F0A0F800F097F8F9
-:1041900000F2024004802EE03078C10035F82000A3
-:1041A0004206B5F85000284405D5091801F2064129
-:1041B0000C80728904E0091801F202410C803289F6
-:1041C00000F084F8707848F68F7140B9307835F88F
-:1041D0002020114041F4004141F0C00109E00128D4
-:1041E00009D1307835F82020114041F4404141F0A8
-:1041F000800125F82010317835F8212048F6BF706D
-:10420000024082F030024EE0844232BF001B04467E
-:104210000020B0616009317B8302002943F4004330
-:1042200004F001004FEA540C18D0AAB900F040F88D
-:1042300001F202413CB9B1F800E0202262F38F2E76
-:10424000A1F800E008E03E2C05D2624600B1521C05
-:1042500092020A8000E00B807178A9B900F028F87A
-:1042600001F206412CB90A88202060F38F220A80CF
-:1042700011E03E2C06D208B10CF1010C4FEA8C2063
-:10428000088008E00B8006E0012904D100F017F84F
-:1042900000F2064004804BF68F70317835F821200B
-:1042A000024082F44052174325F821700020F2BDED
-:1042B000B5F850103278691801EBC2017047B5F8B3
-:1042C00050003178281800EBC10070477169A3B223
-:1042D000284672E018B50A78497830F8224000295B
-:1042E00048F2800305D048F6BF710C4084F01004FA
-:1042F00004E04BF68F710C4084F48054234320F883
-:104300002230002012BD30B50A7B002A36D14A780F
-:104310000C78002A30F8242048F2800348F68F7584
-:1043200016D0520608D530F82420154045F4004533
-:1043300045F0C00520F82450CA78012A1ED00A781A
-:1043400030F8224048F6BF710C4084F0200412E09F
-:10435000520408D530F82420154045F4404545F076
-:10436000800520F824500A7830F822404BF68F71EF
-:104370000C4084F44054234320F82230002030BD08
-:1043800011B98021A0F84C1000207047B0F85810E7
-:1043900041F40041FFE7A0F8581000207047B0F842
-:1043A0004400704700207047A0F84010002070477C
-:1043B0000A40A0F840200020704710B580185B1C10
-:1043C00000F580605B0807E00A784C7842EA042236
-:1043D000891C20F8022B5B1EF6D110BD10B5821887
-:1043E00002F58062580806E032F8024B0C70240A8D
-:1043F0004C70891C401EF7D1D80744BF1088087044
-:1044000010BD10B50C0605D501F0070100EB4110F9
-:10441000283003E000EB411101F5947012B90273EA
-:10442000C38004E0038101211B0C01734381002040
-:1044300010BD016800F51870012282600022027030
-:10444000B1F8540040F00100A1F85400B1F8540054
-:1044500040F00200A1F8540000207047704738B5C2
-:1044600008B9022032BD00F51D74A3690BB1002507
-:10447000A56101B16161012121700270FFF711FC9A
-:10448000002032BD0246002011B1C2F88C127047E4
-:104490000220704780B5FFF732FC002002BD10B546
-:1044A000D0F88C2202241AB11268904700B9002477
-:1044B000204610BD80B5D0F88C22536801E138B594
-:1044C000044604F52075284600F0FAFA04F51B703E
-:1044D00001210160418B4160017D11F01F0003D07B
-:1044E00002280BD005D30EE02946204600F0ECF858
-:1044F0000DE02946204600F05FF908E029462046F5
-:1045000000F07FF903E001F0800100F03EF80020A8
-:1045100032BD38B5044610460A0004F51B7328D195
-:10452000196803291DD104F5A6714A680D68AA42CD
-:104530000BD2AD1A0D60954238BF2A46014692B2A1
-:10454000204600F01AFB002032BD186A016921B133
-:10455000187A032804BF20468847204600F015FB40
-:10456000F1E70529EFD100201860002100F00DF8D7
-:10457000E9E7186A82692AB1187A032802D120462D
-:104580009047E0E7022032BD80212046FFF7CFBBF5
-:1045900038B504460800134604F51B7542D1286857
-:1045A000022832D1226A616A914207D2521A2262EB
-:1045B000194692B2204600F0CEFA11E0E269B2FB51
-:1045C000F1F001FB102090B98A4210D36868824252
-:1045D0000DD200220021204600F0BDFA00206860C4
-:1045E0000023002200212046FFF7CCFB13E0286ABD
-:1045F000C16821B1287A032804BF20468847FFF705
-:10460000C3FF204600F0C8FA05E0042818BF0028C0
-:1046100001D1FFF7B9FF287B012804BF00212973CE
-:10462000002032BD286A42692AB1287A032802D1C3
-:1046300020469047F4E7022032BD10B504464023DF
-:1046400000220021FFF762FB04F5A2700121016046
-:1046500040234021C160002280212046FFF756FB05
-:104660000120A06104F51B724020606201201072DD
-:104670000020106060601061506A28B1126A6168A1
-:104680005368C9B220469847002010BD017400202D
-:10469000704700F51D7001784170042102E000F5BB
-:1046A0001D70417801700020704780B500F51D71C4
-:1046B0000A78032A03D18969C96901B188470020B2
-:1046C00002BD9847002002BD7CB50446087810F072
-:1046D000600004F51D7508D0202818BF40282DD192
-:1046E000AA6993682046984764E04878092825D845
-:1046F000DFE800F03D552450240905242B272046EF
-:1047000000F012F956E08A88002A04BFC888002801
-:1047100014D14E88802E11D22878032806F07F0607
-:104720000CD0AE7031462046FFF71EFB00F0F9F8C2
-:10473000002E14BF0220012028703BE000F077F922
-:1047400038E0204600F075F934E0C8880128F5D13A
-:104750002A78521E012A04D9921EEFD10122211D6E
-:1047600014E00020A060012204F108010EE0287886
-:10477000401E0228E2D8C8880228DFD1A86801219B
-:1047800000B10321E160022204F10C01204600F097
-:10479000DAF90FE0488801280CD1012107E02878D8
-:1047A000401E0228CAD84888012803D10021A960E8
-:1047B00000F0B7F8002076BD38B50D4604462878DD
-:1047C00010F060001CBF2028402816D104F51D728F
-:1047D0001178491E022910D8287902280DDA926929
-:1047E00093682946204698470146E888002808BF74
-:1047F000002904D100F095F801E000F017F900203D
-:1048000032BD7CB50446084604F51D730278017973
-:1048100012F0600506D0202D18BF402D64D100F0A5
-:104820007BF864E002F06002202A03D100F074F803
-:1048300040B276BD42788AB3012A12D0032A53D1FE
-:104840001A78022A13D0032A4ED142881ABB0029B3
-:1048500018BF80291FD0C088E8B92046FFF767FA43
-:1048600019E01A78022A02D0032A0CD03CE0002971
-:1048700018BF802938D02046FFF759FA80212046FA
-:10488000FFF755FA33E0408888BB11F07F0F1CBF5B
-:104890002046FFF753FA00F044F828E0142201F014
-:1048A0007F051B7855436619022B06F5A07502D0CB
-:1048B000032B10D018E0002918BF802914D1080656
-:1048C00048BF06F114050020286002222946204630
-:1048D00000F039F90BE001F00F0312FB03F20B06B5
-:1048E000224406D5926972B9014600F0A0F8002072
-:1048F00076BDD2F84421002AF6D0002918BF8029BD
-:1049000004D10020E0E706F11405F6E72046FFF7A2
-:104910001CFA00B10120D7E79A6993680146204646
-:104920001847204600F031B938B50D46044668886E
-:10493000010A012904F5227208D0022923D0032993
-:104940002FD0062959D007295FD068E000F06AF817
-:10495000136869469847BDF8001079B1E98879B1C4
-:10496000BDF80010EA88914288BF1146ADF80010EA
-:104970000146BDF80020204600F0E5F8E88808B9B7
-:10498000FFF7CFFF31BD94F9100051680028684649
-:1049900004D1896A884702214170DCE7C96A8847E7
-:1049A000F9E7C0B205283AD8DFE800F003090F158F
-:1049B0001B2100F037F8536869469847CBE700F0B1
-:1049C00031F8936869469847C5E700F02BF8D3683B
-:1049D00069469847BFE700F025F81369694698478C
-:1049E000B9E700F01FF8536969469847B3E700F04C
-:1049F00019F8936969469847ADE794F9100070B9C2
-:104A000051684A6B68469047A5E794F9100030B9A1
-:104A100051680A6B68469047072242709BE700F096
-:104A200005F831BD126894F91000704729462046F8
-:104A30005AE07CB50D460446204E688830703178C7
-:104A4000084602282DDA94F87422022A02D0032A9A
-:104A50000FD02BE041B16060032084F8740220463F
-:104A6000FFF71DFD02281CD02046BDE8764000F06F
-:104A70008CB841B9022084F874020020606020469E
-:104A8000FFF718FDF0E761688842EDD0C9B2204613
-:104A9000FFF710FD317861602046FFF700FD022826
-:104AA000E2D129462046BDE87C401DE0FFF7BEFF6D
-:104AB00031782046BDE87C40FFF7FCBC5C24002038
-:104AC0000A7802704A784270CB788A7802EB032227
-:104AD00042804B790A7902EB032282808A79C97974
-:104AE00002EB0122C280704710B504468021FFF717
-:104AF0001EF92046BDE810400021FFF718B9002834
-:104B00000B4600D1704730B50146002400E0641C1C
-:104B100011F8015B002DFAD12406E40DA41C1480C9
-:104B20001178197002220321597008E010F8011B56
-:104B3000D4B2521C1955D4B200211955521C017817
-:104B40000029F3D130BD80B513460222C0F86C2293
-:104B5000C361036201E080B513460A460021FFF7F6
-:104B60000AF9002002BD80B513460322C0F86C226A
-:104B700000F5A4721360536001E080B513460A4645
-:104B80000021FFF7FFF8002002BD80B50421C0F826
-:104B90006C1200230022E1E780B50521C0F86C12F9
-:104BA00000230022ECE70000DFF8F8140A6892B254
-:104BB00000E00246086880B28242FAD170472DE9CF
-:104BC000FC4104461825DFF8E084DFF8E064684320
-:104BD00008EB00073078062808D1317871703470FE
-:104BE00078754FF0FF307060002039E000F077F802
-:104BF000B9680918B96008F10803B96832786A43DE
-:104C00009A589142327813D308F1150315FB02FC30
-:104C100013F80C30062B25D008F108066B43F35827
-:104C2000994222BF08F115036A439A5CEED219E05B
-:104C30001146337869439A420BD008F1140308F106
-:104C4000150C5B5C15FB03F50CF805407A753B759C
-:104C500000E07A7508F114025454317871703470A0
-:104C6000BDE8F6811146694308F115035B5C062B2C
-:104C700004D008F1140615FB03F574557B753A75DD
-:104C800008F115025454EBE7F8B5DFF82034DFF8EB
-:104C900018541E78182402466243B0422A4404D1B4
-:104CA00018785870507D18700FE0167D507D92F87E
-:104CB00015C005F115076643062807F806C004D09D
-:104CC000167D143514FB00F42E550120107318784E
-:104CD000062802BF00294FF0FF315960F1BD10B521
-:104CE000DFF8C843606810F1010F0FD0FFF75CFFD9
-:104CF0006168DFF8BC23814261683CBF5388C918F2
-:104D0000081A517848431178C84000E0002080B26A
-:104D100010BD2DE9F84FDFF89853DFF898B3D5F8B8
-:104D20000880D8F80000DBF800104A0500F06CF9A4
-:104D3000DFF87863DFF870A321F4806181604FF0C1
-:104D4000180934780AF1080019FB04F14758FFF7F5
-:104D5000C6FF874217D200270121B170062C3DD033
-:104D600019FB04F40AF108010AF108020959814209
-:104D700023BF0AF108010959091A002111510AEB50
-:104D800004014C7DEAE7A9884118B94202D2AF88F4
-:104D90000021E2E73F1ADFE7022802DA287801283B
-:104DA00000D07F1ED8F80000C1684A07FAD500F08D
-:104DB00031F9DBF80C00000CBFB247EA0047CBF832
-:104DC0000C70FFF7F1FE7060A8680068816841F41C
-:104DD00080618160AFF30080BDE8F18FB8B2002838
-:104DE000DAD1FFF7E1FE70600320BDE8F24FFCF777
-:104DF0002FBF2DE9F843EFF3108872B6AC4DAA4BE4
-:104E0000A8680168CA224A6253204862A74A886893
-:104E100020F48060886018201678374647431F4486
-:104E200097F90C00022827D13C68D7F8109010564B
-:104E3000F8B197F90D20012A0AD101213046FFF778
-:104E400023FF88F310887968304600F0F0F804E01A
-:104E500088F31088304600F09BF8A8680068CA21E3
-:104E600041622246532141624846314600F02CF906
-:104E70000BE0FFF74EFF06E0C8684207FCD500F0E4
-:104E80007EF88D49086088F31088FF21A8680268C1
-:104E90005162BDE8F183F8B5854CA160CA2209686A
-:104EA0004A6253224A62834A136843F02003136024
-:104EB000136803F00703C3F10403237095682D0CF6
-:104EC00005F07F056D1C6570EDB29268C2F30E02AD
-:104ED000521C628092B2521E6A43A2F5A072DA405E
-:104EE0004FF6FF739A422CBFA380A280734A1368C7
-:104EF00043F400231360724B1D6845F400251D60C8
-:104F000048BB6A48684E0123837018254FF0FF3371
-:104F1000436000235FFA83FC06F10C0715FB0CFCD1
-:104F20004FF0000E07F80CE05B1CDFB2062FF1DB40
-:104F300006230370886820F48060886000F01FF802
-:104F4000D0600320FCF78FFEA1680868826842F4F5
-:104F50008042826005E0C868410544BF0320FCF739
-:104F600077FEA1680A68FF20506200220321032017
-:104F7000FCF716FEBDE8F2400320FCF72EBEC86821
-:104F800000F0800060F49060C8604FF4002070472B
-:104F9000F8B50746EFF3108472B60320FCF728FE3D
-:104FA000434DAE683068CA2141623A46532141629E
-:104FB000182044494243895602291BD10021384612
-:104FC000FFF762FE3948017806290ED13068394969
-:104FD0000A68530500F018F821F480618160C16807
-:104FE0004A07FCD500F016F804E04078884218BF64
-:104FF000FFF78FFEA9680A68FF2050620320FCF7C4
-:10500000ECFD84F31088F1BD02D5C1684A07FCD4D9
-:1050100081687047C16801F0800161F49061C160EE
-:105020004FF40020244908600320FCF71CBE2DE942
-:10503000F04180460F46424618201B4942438C18D7
-:1050400094F90C00022804BF4046FFF7A1FFEFF3DC
-:10505000108572B60320FCF7CBFD154EB0680068D2
-:10506000CA2141625321416202202073A760676018
-:105070004046FFF7A4FD0D490A784978914202D0D5
-:10508000FFF747FE02E0A168081AA060FF20B168A0
-:105090000A6850620320FCF7A0FD85F31088BDE884
-:1050A000F0810000282800401C2000204824002017
-:1050B00004240020082800400C080058000800586C
-:1050C00080080058282000201047000010B586B046
-:1050D00002A800F07CFA20B10121032000F060F862
-:1050E00031E00FF2E4342246012100F0A9FA0FF278
-:1050F000144200F051F89DF80A009DF80910019043
-:10510000009101219DF808300FF21442002000F0B8
-:1051100097FA9DF81100102809D0112804D05028C2
-:105120000AD10FF2444204E00FF2244201E00FF2F0
-:10513000084200F031F803E00121032000F030F8CC
-:10514000224600F029F8A64C211D04F5847000F0D9
-:1051500033FBA44820600121022000F0E0FB00F0B6
-:10516000E9F80FF291120021022000F04EFC00F04D
-:1051700017FA0FF209220021012000F046FC00225C
-:105180000FF24901002000F0A3FC18B10121012019
-:1051900000F006F806B010BD0121002000F050BA62
-:1051A00003280FD8DFE800F00205080B0FF24C20AF
-:1051B0000BE00FF26C2008E00FF2882005E00FF200
-:1051C000B02002E000210FF2CC2020E0400700D404
-:1051D000704780B5002000F093FC801E012802D9A2
-:1051E000801E08D00BE0012000F0E2FCBDE8024088
-:1051F000022000F0D3BC012000F0D0FC02E001202E
-:1052000000F0D6FCBDE80240022000F0D1BC80B521
-:10521000009103460FF28C220121002000F010FAC9
-:10522000002000F0CFFC00F00BF8012000F0CAFCD9
-:1052300000F006F8022000F0C5FC00F001F8EFE7EE
-:105240004FF4FA7000F0CABD6548016801F10C0026
-:105250007047634800E06448016801F10B00704743
-:1052600080B55F4800684FF42071A0F8091001690B
-:1052700089000831C17200F035FEBDE8024002200D
-:1052800000F0ECBB022000F0E1BB57490860486821
-:10529000401C48600021012000F0C4BB042000F045
-:1052A000DDBBF8B504460D460026A05D721C0D2836
-:1052B0000DD0AE4238BF1646F7D308E0811921441D
-:1052C00049782154401CA842F8D32846F2BDAE428A
-:1052D000FBD0464F2146381DFDF75AFD701C388023
-:1052E0000021022000F09EFBAD1B00206D1EEAE7AE
-:1052F0000000000038B53E4CFF2104F10C00FCF723
-:105300004DFB3A4D2A88291D04F10C00FDF750FD94
-:105310002888E0724FF480710020A4F809006880AA
-:105320002880281DFCF73AFBBDE8314000F0E1BDC4
-:1053300000F0EDBD2F482E49416001F586720260F4
-:1053400001F50672826000F0C3BD38B5044623A1A2
-:10535000E57A04F10C0000F057FE40B1294604F153
-:105360000C00BDE838400FF2110200F047BABDE86A
-:105370003140DDE700000000DAE7000010B51A4C0C
-:10538000606858B16268022A04D300210020FFF748
-:1053900007FF01E000F05EFE0021616010BD38B53E
-:1053A0000022154C07E0D4F80031855CE5545B1C05
-:1053B000C4F80031521C0B689A42F4D3D4F800119F
-:1053C0002046FFF76EFF30B1D4F80011884218BFB5
-:1053D000C4F80001F2D1C4F8000131BD3E20000044
-:1053E000401A00208008032010240020581D0020AF
-:1053F00074070320300B0320541C00204552524FE9
-:1054000052203A204552525F5245435F4D554C540D
-:10541000495F4D53475F46524F4D5F4D302000006E
-:105420004552524F52203A204552525F54485245FD
-:1054300041445F5345545F53544154455F434220B8
-:10544000000000004552524F52203A204552525F10
-:105450005448524541445F45524153455F5045527F
-:1054600053495354454E545F494E464F2000000067
-:105470004552524F52203A204552525F54485245AD
-:1054800041445F434845434B5F574952454C455360
-:10549000532000004552524F5220556E6B6E6F776D
-:1054A0006E2000002A2A2A2A20466174616C206539
-:1054B00072726F72203D2025732028457272203D44
-:1054C00020256429000000002A2A2A2A2A2A2A2ABA
-:1054D0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2C
-:1054E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A1C
-:1054F0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0C
-:105500002A2A0000574952454C45535320434F50D7
-:10551000524F434553534F522046573A0000000024
-:1055200056455253494F4E204944203D2025642E74
-:1055300025642E25640000004657205479706520AC
-:105540003A205468726561642046544400000000AB
-:1055500046572054797065203A205468726561641A
-:10556000204D5444000000004657205479706520B7
-:105570003A2053746174696320436F6E637572726D
-:10558000656E74204D6F646520424C452F546872DF
-:105590006561640000F05CFE9DF80E0005B000BD82
-:1055A000F8B500F003F84FF66740F3E76B460022CA
-:1055B00000217047C0B28DF800006B466A46012199
-:1055C0007047F8B5FFF7F6FF4FF66B40E2E710B50E
-:1055D000194909684FF6FC7202EA810217498A18D4
-:1055E000136819690B0A0C0E047083700C0CC1F35C
-:1055F0000313C37001F00F014470017113685969FE
-:1056000001720B0C83710C0E0B0AC3714471136889
-:1056100099694172146861680B0E83720B0C090A58
-:10562000C3720173126891680B0E0A0C4373827384
-:10563000C173002010BD00003C4000580000032052
-:1056400008B42DE9F0470546012DC9B00E461446B1
-:105650000AD00CD3032D01D003D308E00FF2481376
-:1056600007E00FF23C1304E00FF22C1301E00FF2FD
-:1056700040130FF2B4094A464FF4807108A800F0B5
-:1056800037FE761E074608A980B2042EC7F580783B
-:1056900001EB000A18D8DFE806F0130F0B07030030
-:1056A00011220FF2D80112E012220FF2BC010EE01B
-:1056B0000E220FF2A4010AE014220FF2880106E084
-:1056C00011220FF26C0102E005220FF2C4016846BC
-:1056D000FDF76EFB6B4615A21FFA88F1504600F0ED
-:1056E00007FEC7192246B9B208A8BCB251ABC1F532
-:1056F0008071204400F01EFEC71908A8BAB20D211F
-:1057000081547F1CBAB20A2181547F1CBFB2002190
-:10571000C155042D03D208A9484600F029FE49B01E
-:10572000BDE8F0075DF808FB257300002573200035
-:105730005B4D34204150504C49434154494F4E5DDC
-:10574000000000005B4D34204F50454E54485245F8
-:105750004144204150495D005B4D34204C494E4B43
-:10576000204150495D0000005B4D3420494E5354A8
-:10577000414E4345204150495D0000005B4D3420BF
-:105780004D455353414745204150495D00000000BD
-:105790005B4D345D000000001B5B303B39316D0018
-:1057A0001B5B303B39336D001B5B303B39326D0086
-:1057B0001B5B306D0000000010B5514C00222060D2
-:1057C0006160A28104F114004E49FEF748FE4E4983
-:1057D00004F11400FEF756FE04F52C7104F11400D8
-:1057E00000F0FEFE04F11400FEF754FEBDE8104088
-:1057F0000FF241020021082000F007B9F8B50C466D
-:105800001546EFF310863E4F014638682246FDF7F5
-:10581000BFFABD60FC8172B697F90C0020B101217E
-:10582000082000F0FFF801E00120787386F310886B
-:10583000F1BD000010B5324CE289216804F114007A
-:1058400000F0D5FE04F1140000F0DFFE28B1BDE841
-:1058500010400121082000F0E5B8A068BDE8104024
-:10586000004738B5264D696805F1140000F0C7FE01
-:1058700005F1140000F0E1FEEFF3108472B6012090
-:10588000287395F90D0018B10121082000F0CAF81D
-:1058900084F31088002032BD0020704710B5202806
-:1058A0001A4A02D0212812D01FE008784B788C7851
-:1058B00040EA0320CB7840EA044040EA03601060ED
-:1058C0000879107148795071887990710DE01068ED
-:1058D0000870030A4B70030C000EC8708B701079AF
-:1058E00008715079487190798871002010BD80B599
-:1058F000FFF755FD064800F0A0FE002002BD0000A5
-:10590000B41100207C1100207810002074140020B5
-:10591000C81100200C48002101604160704710B59B
-:1059200000F00CF85C6819B1012904D1204301E0B2
-:1059300024EA0000586082F3108810BDEFF3108253
-:1059400072B6014B70470000202400202DE9FC476F
-:105950004C4CDFF83491A5692840A0614FF0010A52
-:105960004FF0FF3830E0491C54F831000642FAD0BD
-:1059700004EBC107184079681040014208BFC7F81E
-:1059800004807E68304000F081F860620AFA00F01E
-:1059900086437E60EFF3108172B6626A20690AFA6C
-:1059A00002F2D24310402061022004EBC00353F8FE
-:1059B000086C1640401E43F8086CF6D181F310883D
-:1059C000606A59F82010884763692069A269184005
-:1059D000104203D0002103EA0206C5E700F041FEB1
-:1059E000EFF3108972B6216960690140A069014234
-:1059F00001BFE169206A014200F0BEFE89F3108810
-:105A000000F022FFA561BDE8F38738B51446EFF337
-:105A1000108572B600F03AF81B4941F8204085F332
-:105A2000108831BD10B5EFF3108272B6154B1C69AA
-:105A300004431C6153F83140204343F8310082F3A2
-:105A4000108810BD506181F310887047EFF310810A
-:105A500072B60C4AD3691843D061F4E770B5094CAB
-:105A6000656A266A2062012101FA05F502E02846EE
-:105A700000F083FE216AE0690842F8D0884326627C
-:105A8000E06170BD28100020C421002002460020E3
-:105A9000110C090404BF1020120412F07F4F04BF40
-:105AA000083012020FF2180112F0704F04BF001DEF
-:105AB0001201120FC0F11F00895C401A70470000EC
-:105AC00004030202010101010000000000000000C7
-:105AD00038B50C461546FFF7E1FB08480460FFF7B0
-:105AE000B3FB97210160856001214160FFF7B8FB9E
-:105AF000FFF7AFFB8068C0B232BD00006423002016
-:105B000080B5FFF7CBFBFFF79FFB5E2100F005F8A8
-:105B1000FFF79FFB806840B202BD01600021416039
-:105B2000FFF79EBB454981B00A6802430A600968D5
-:105B300008400090009801B0704778B585B00446E1
-:105B400068461421FBF72AFF0CB9012004E0012C60
-:105B500018BF022C02D10220FFF7E4FF00F012F878
-:105B600000950120019000210220039000F004F82C
-:105B700000F00EF806B070BD0291694656F8240098
-:105B8000FBF710BF0FF2C4002D4E30F814507047D1
-:105B900056F8240000222946FBF7C8BF0FF2AC01DB
-:105BA000274B31F8101053F820000122FBF7BEBF3D
-:105BB0000FF29801224B31F8101053F82000002208
-:105BC000FBF7B4BF0FF284011D4A31F8101052F8F0
-:105BD0002000FBF7B2BFF0B585B004460D4668461D
-:105BE0001421FBF7DBFE0120FFF79CFF2800154E78
-:105BF0000FF260070AD137F81400009000210191DC
-:105C00000120029002210391FFF7B7FF012D12D16D
-:105C100037F81400009001210B480190FFF7ACFF0A
-:105C20000FF23400045D00220F2160B2FBF7B8FFD1
-:105C300060B2FBF7D2FF05B0F0BD00004C00005889
-:105C40005C100020681000200000211010000100EE
-:105C500002000000000400002800000018B59BB0FE
-:105C600000F0F4FD574CE06B40010ED5E06BC00036
-:105C70000BD400F005FE00F003FEA06B40F4803072
-:105C8000A063A06B20F48030A06300F07AF807A82E
-:105C90005021FBF783FE68461821FBF77FFE00F0DA
-:105CA00068F84FF4807007900021149107A800F065
-:105CB00005FE206840F0807020604FF0005221689F
-:105CC00001F0807106910021069800914BF67F301B
-:105CD000039022210491002002902021019205913D
-:105CE000684600F04CFF00F0CBFD00F0C9FDA06B52
-:105CF00040F00100A063A06B8007FCD5E06B20F4AE
-:105D0000404040F48040E063E06B40084000E063C6
-:105D100000F02FF80022206B20F0406020632A481A
-:105D200001680260026902F05002026100F0A8FD01
-:105D300000F0A6FDA06B20F4407040F48070A063DA
-:105D40000F21A06B40F40040A063204C20488160EC
-:105D500047F6FF71C160046000F03AFFA068C00818
-:105D6000C000A06000F07EFC4FF0FF30FFF7EEFDBA
-:105D7000FAE7206C40F001002064206C8007FCD51D
-:105D80007047144881B0016841F4801101603F21DF
-:105D9000006800F48010009000980F484160416155
-:105DA000016841F47C110160026942F47C120261D5
-:105DB000016841F03F010160026942F03F02026167
-:105DC00001B0704758000058800800580028004073
-:105DD000AC23002050000058040C005838B504468D
-:105DE000FBF7D4FD14F1010F054605D0641C03E058
-:105DF0004FF0FF30FFF7AAFDFBF7C8FD401BA042A4
-:105E0000F6D331BD01F02DB876487749016001F134
-:105E10002002426001F13002826001F13C02C26066
-:105E200001F14402026101F16002426101F1640288
-:105E300082617031C16101F01CB838B56C4C6B4D9A
-:105E400007E0694605F1100001F0C0F800982168EC
-:105E5000884705F1100001F090F80028F1D031BD1D
-:105E600063484168084738B50446624D284601F04A
-:105E700081F85C48C068A1680160456001F015F8D0
-:105E80005D482168016061684160002032BD80B5D5
-:105E90005449CA6813681020187201F00CF80020E9
-:105EA00002BD5049CA68544910680B68184738B594
-:105EB000514C504D06E06946284601F087F800989D
-:105EC00061688847284601F058F80028F3D031BDB2
-:105ED0004449896842684A6002688A60806808604C
-:105EE00000F0F9BF3F498A6891680820087200F005
-:105EF000FCBF3C498A6851680A20087200F0FEBF66
-:105F000038498A6813680D20187200F0FCBF3549C3
-:105F10008A6813680D20187200F0FDBF314881684F
-:105F20008868FFF7AFB92F4881680868FFF7ADB9F7
-:105F30002C4881684868FFF708BA38B504462F4DE9
-:105F4000284601F017F82E4801F014F8254800699A
-:105F5000A1688160E168C1600561216801606168D4
-:105F60004160216941616169816131BD80B501464E
-:105F7000234801F015F8BDE802400FF2090000F0D7
-:105F8000D2BF000038B5174C1D4D08E069462846C1
-:105F900001F01CF800992069006901F001F8284619
-:105FA00000F0EBFF0028F1D031BD10B5154C2046B4
-:105FB00000F0E0FF0B4841690C60BDE8104000F0C4
-:105FC000C6BF1CB50F4C06E06946204600F0FEFF38
-:105FD000009800F0EFFB204600F0CFFF0028F3D040
-:105FE00013BD000000000320B80A0320980A032014
-:105FF00030240020B00A0320382400203C0B03206A
-:1060000028240020440B032081EA00039B0717D1BA
-:10601000820707D010F8012B11F8013BBAB19A4260
-:10602000F6D014E002680B689A42A2F1013301BF76
-:10603000934313F0803F50F8042F51F8043FF3D0FE
-:1060400010F8012B11F8013B0AB19A42F8D0D01A8E
-:1060500070470000F8B5FFF7FEF8002502685249C6
-:10606000521E142A00F29B80DFE802F00B121B265E
-:106070002C333B424950575F996771777E858C99E5
-:1060800093000A68002A02D0C1688068904787E0C0
-:1060900084680C642100FAD042690169C068A04795
-:1060A0007EE086684E6431007AD083694269016976
-:1060B000C068DBB2B04773E00120FFF782FAFBF75C
-:1060C000A6FD6DE08A68002A6AD0C16880689047A2
-:1060D00066E04B68002B63D0C26881680020984757
-:1060E0005EE0CA68002A5BD0C1688068904757E0CC
-:1060F0000A69002A54D0C1688068904750E04A6914
-:10610000002A4DD0C1688068904749E08B69002B18
-:1061100046D000F04CF8984742E0CA69002A3FD0C8
-:10612000C168836858B290473AE00C6A002C37D0B7
-:1061300000F03CF8D2B2A04732E04C6A002C2FD0DD
-:10614000876900F033F8FFB20097A04728E08C6A17
-:1061500034B300F02BF8A04722E0CA6A02B3C1684A
-:106160008368D8B290471BE00B6BCBB100F01FF8EF
-:10617000D2B2984714E04C6B94B100F017F8DBB240
-:10618000A0470DE08A6B5AB1C168806849B2904758
-:1061900006E0CB6B23B100F00AF8984700E0012538
-:1061A000FFF7AEFE2846F2BD642300204369026972
-:1061B000C1688068704700007FB50C46494D616832
-:1061C000494EE8612962284600F012FF2468746095
-:1061D00006F1080000F0CEFE012000F05FF801207B
-:1061E0003070296841B10FF2D9000FF2DD02009042
-:1061F00001920294684688477FBD3EB5394C3A4DBE
-:1062000002E00098FFF7B2FE05F1080000F0B5FECD
-:10621000E8B9285600281AD0694605F1080000F0B0
-:10622000D5FE01202870E1690029EAD0009802908B
-:1062300001A888479DF80400287095F900000028FF
-:10624000DFD1009905F1080000F0A0FEDCE737BDC2
-:106250002DE9F04105460E4690461C46002000F010
-:106260001DF8214F7868A0F80950C67232464146A1
-:106270000C30FCF78DFD1B4A136900210020984764
-:1062800048F2E80000F093FA79688A78D21C04F1A9
-:106290000800FCF77DFDBDE8F04101201CB5114967
-:1062A000124C096A20B901B188470020207013BD43
-:1062B0000120207011B1BDE81C40084713BD00004B
-:1062C000002000F071BA000010B50146064C04F140
-:1062D000080000F065FE04F10800BDE8104000F081
-:1062E0005FBA0000D0230020F42300205D240020AA
-:1062F00008B410B585B007AB0024049303940029BB
-:106300000EBF01940190491E0291009404AB01A9B3
-:10631000074878441A30FBF7E1FC019901B10C7091
-:10632000002858BF039805B010BC5DF808FB00BFFB
-:1063300023B3FFFF08B584B00023039300290EBFE9
-:1063400001930190491E0291009301A904AB0748F3
-:1063500078441830FBF7C2FC019909B100220A7099
-:10636000002858BF039805B000BD00BFE7B2FFFF8B
-:106370000EB4C0B5024603A800210190009101AB04
-:106380000121044878440C30FBF7A8FC06BC5DF8FA
-:1063900010FB00BF471B00007CB50546002695F9A1
-:1063A000100040B94FF4007300F03BF80120E862A0
-:1063B0004FF4007305E0402300F033F80120E86259
-:1063C0004023022201212846FDF7A0FC0120C5F848
-:1063D00058010823032282212846FDF797FC01205B
-:1063E00028644FF40770FDF7D8FC040005F524700D
-:1063F00008BF0126046012D040680168884704F590
-:10640000017006614661026895F9100000280CBF12
-:106410004FF40073402301212846FDF7B3FC3046BA
-:1064200076BD022281212846FDF770BC10B50446D6
-:106430008121FDF775FC0020E06201212046FDF777
-:106440006FFC0020C4F8580182212046FDF768FC4B
-:106450000020206404F52474206838B1616848681D
-:1064600080472068FDF7A4FC00202060002010BDBC
-:10647000F8B5044604F51D730D46DE6900208DF85D
-:106480000000ADF802000027297811F0600022D04A
-:1064900020283AD1EA88C2B1687809060AD51B6A71
-:1064A000D3F808C03146E047EA8831462046FEF777
-:1064B0004AFB2FE006F500710870E8884870314605
-:1064C000EA882046FEF74FFB24E01B6A68789C6848
-:1064D0002946A0471EE0687820B10A2809D00B2879
-:1064E00010D012E0187803280FD102220DF102011A
-:1064F00004E01878032808D1012269462046FEF7F7
-:1065000022FB07E01878032804D029462046FEF72E
-:10651000EBFA02273846F2BD70B5044604F5247044
-:1065200002688368CAB1142010FB01F02618F069D4
-:1065300070B103EB41139B6BB0FBF3F503FB15004C
-:1065400030B9F061002300222046FDF714FC02E080
-:106550000020C2F81402002070BD022070BD70B58A
-:1065600000F52474256805F50176FDF712FCB0608E
-:10657000206838B162683068D36805F503719847C0
-:10658000002070BD022070BD10B500F52470436876
-:106590000168002B1EBF01F500742078FF2804D08D
-:1065A00062789B689847FF202070002010BD43212F
-:1065B0000180074870474321018006487047432106
-:1065C0000180054870470A21018004487047000097
-:1065D000F4100020B0100020381100206C100020B2
-:1065E0000246022011B1C2F8941200207047D0F880
-:1065F000900200F502700160826000207047D0F8C0
-:106600009002C0F804120020704780B5D0F89012B4
-:1066100089B101F50272D16859B90123D36091683B
-:1066200001638121936812689BB2FDF7A4FB0020EF
-:1066300002BD012002BD022002BD80B5D0F890123B
-:1066400069B1D1F8042290F9101000290CBF4FF461
-:10665000007340230121FDF795FB002002BD0220BD
-:1066600002BD704710B52748274C88B0016841F437
-:1066700000410160FFF74EF900F0C4FC23490020FF
-:10668000FEF709FC00F0F1F82148016841F480317F
-:106690000160026C42F48032026400F0D8FC0121F7
-:1066A0000120FFF73CF90020FFF747FA0120FFF730
-:1066B00044FA0220FFF741FA01210020FFF78BFA8C
-:1066C000FFF7A2FB134A00210420FFF79EF904F212
-:1066D0003C500FF245010090019169460FF23D00D8
-:1066E000FFF76AFD0020029004F5C96140F23C50BA
-:1066F00005900391049402A8FFF71FFCFFF782FBAB
-:1067000008B010BD0800005820000320AC23002072
-:1067100090080058FB6100087047000080B5406891
-:1067200030F80B1F4FF41242891A02D0491E0AD0CA
-:1067300001BDFFF73AFCFEF7C9FCBDE804400021AB
-:106740000120FFF7ECB890F902307D2B04D07E2BAE
-:106750000AD10FF2B40201E00FF28802BDE808404E
-:1067600001210020FEF76CBFBDE800500FF2B80217
-:1067700001210020FEF764BF704780B5022902D0D6
-:10678000042902D006E0002006E00420FFF75EF9AD
-:10679000012001E04FF0FF30BDE80240FFF7D6B81E
-:1067A00000210420FFF73EB90120FFF74FB9012077
-:1067B000FFF754B910B5044604F10D01A27A921EF8
-:1067C000012000F054FC2046BDE81040FFF7CEBB8E
-:1067D0000220FAF7FEBB13460A4601460220FAF7EA
-:1067E0001FBC00002A2A204552525F54485245419E
-:1067F00044203A204C4C445F464154414C5F455242
-:10680000524F52200A0000002A2A204552525F545B
-:106810004852454144203A20554E4B4E4F574E5F0B
-:10682000434D44200A0000002A2A204552525F545A
-:106830004852454144203A204572726F436F646567
-:106840003D2564200A00000070470000032010B5B9
-:10685000FBF799F90F2000F039FC0024002814BF41
-:10686000012400F00BF8204610BD0348FFE7016843
-:1068700041F0010101607047042004E0704700000E
-:106880000248016841F480710160704700040058BB
-:10689000DFF830130A68030903F47F2300019A43E9
-:1068A00000F47F2000F068B9DFF818231368010CAA
-:1068B00023EA014343EA0043136070472DE9F8439C
-:1068C000054600262878DFF8FC724106B0464FF0F6
-:1068D000B0442DD5286B70B1B0F5800F06D0B0F55F
-:1068E000000F18BFB0F5400F17D01FE0E06840F46C
-:1068F0008030E060C5E0206820F080602060FBF719
-:1069000045F881462068000140F1A880FBF73EF879
-:10691000A0EB09000228F5D90326AFE0FBF736F813
-:10692000A0EB0900022840F2A180F5E70126B0465D
-:106930002868010531D5B86800F44078286C804596
-:106940002AD0FFF79DFFB8F1000FB96805D1286C78
-:1069500021F440710143B9601EE0B86840F4803012
-:10696000B86021F44071B86820F48030B860286CB9
-:106970000143B960B868C0070ED5FBF707F8804639
-:1069800041F28939B868800706D4FAF7FFFFA0EB17
-:1069900008004845F6D30326B0462878C10705D538
-:1069A0003968A869890840EA810139602878810737
-:1069B00005D53968E86921F44061014339602878D8
-:1069C000C10644BFA86AFFF76FFF2878810644BF5D
-:1069D000E86AFFF769FF2878410744BF286AFFF794
-:1069E00057FF2878010744BF686AFFF751FF2868FE
-:1069F000C1055CD53968686B21F04061014339609D
-:106A0000686BB0F1006F03D1E16841F08071E16023
-:106A1000686BB0F1806F4AD100F0A0F8064620689C
-:106A2000000135D5FAF7B2FF801B0228F7D94FF0E5
-:106A300003083CE0FAF7AAFF801B022830D9F6E7EA
-:106A4000FAF7A4FF801B022852D94FF0030861E037
-:106A5000FAF79CFF801B022855D9F6E700F075F87D
-:106A6000A86821F4781100F07FF8814620680001C1
-:106A70007FF554AF216968690143216130007FF4DB
-:106A800056AF3968286B21F44001014339604FE764
-:106A900000F05BF8E86821F0606100F065F80646F8
-:106AA00020680001C6D52169686901432161286811
-:106AB000810505D53968A86B21F040410143396053
-:106AC0002868410526D53968E86B21F0405101431B
-:106AD0003960E86BB0F1005F03D1E16841F48031C7
-:106AE000E160E86BB0F1805F14D100F037F8064642
-:106AF00020680001A4D400F028F8286921F0604142
-:106B000000F032F8064620680001A1D521696869C5
-:106B1000014321612868C10405D5F968686C21F436
-:106B200040410143F960286881040BD5616AE86C33
-:106B300021F0300101436162616AA86C890840EA72
-:106B4000810161624046BDE8F2832069696820F4F2
-:106B5000FE4040EA0120206121697047216821F050
-:106B600080612160FAF712BF01432161206840F083
-:106B700080602060FAF70ABF10430860704710B5C4
-:106B800011490A6842F080720A600B680F4A23F0CC
-:106B900080730B60046841680C4381680C43C168D2
-:106BA0000C43016944EA014454601368406923F4CA
-:106BB0007C5343EA00231360116841F060011160C7
-:106BC00010BD0000880000583800005800600040E8
-:106BD00038B5040044D094F9210028B9002184F884
-:106BE0002010204600F098F800F049F8FF2510B179
-:106BF00000F03FF834E02168DFF8B0008A68024016
-:106C00008A6021688A68636820690343A069034336
-:106C10001A438A602168E068086120680169A268F7
-:106C200041EA024101612068C16821F08001C16030
-:106C30002068C16C89088900C1642168CA6CE36955
-:106C4000606903431A43CA6420688168880609D4CE
-:106C500000F020F830B120684562042100F01FF8F0
-:106C6000012032BD20684562012184F821100020F6
-:106C700032BD20684562042184F82110704702204B
-:106C800084F82100CA20216848625320226850629B
-:106C9000204626E020460BE02068C0F8248084F8D7
-:106CA0002110002084F8200070470000BFFF8FFFF4
-:106CB00070B5044640F2E9362068C16821F0A001B1
-:106CC000C160FAF763FE05462068C168880606D4ED
-:106CD000FAF75CFE401BB042F6D3032070BD0020E3
-:106CE00070BD70B504462068C1684A0612D44FF0E2
-:106CF000FF32C26040F2E936FAF748FE05462068E6
-:106D0000C168480606D4FAF741FE401BB042F6D3EC
-:106D1000032070BD002070BD70470000C0680840AF
-:106D2000884201D10120704700207047C0690840A7
-:106D3000884201D1012070470020704710B5874C70
-:106D4000022100F042F838B16068C043810703D5E2
-:106D5000FFF7ADF8022036E0042100F036F858B114
-:106D60006068C043410707D5606840F00400606078
-:106D7000BDE81040FFF7D7B8102100F026F858B151
-:106D80006068C043C10607D5606840F010006060CD
-:106D9000BDE81040FFF7CCB8012100F016F838B17B
-:106DA0006068C043C10703D5FFF747F801200AE038
-:106DB000082100F00AF838B16068C043010703D524
-:106DC000FFF7FFF80820A06010BD2046AEE710B521
-:106DD000624C00F043F818B96068C043810316D4D0
-:106DE000042100F03CF858B96068C043410307D55E
-:106DF000606840F480206060BDE81040FFF78EB806
-:106E000000F02CF830B96068C043810302D5BDE8BA
-:106E1000104059E0082100F022F870B96068C043C2
-:106E200001030AD560684E4940F40020606008689C
-:106E300080474FF40020A06010BD202100F00FF823
-:106E400058B96068C043810207D5606840F40010FB
-:106E50006060BDE81040FFF703B810BD0221204676
-:106E60005CE740BF20BF3F48016841F4004101603A
-:106E7000704780B53C48016841F4801101600068AA
-:106E800000F48010009000983448016841F001013E
-:106E90000160026842F4803202602C20FAF79DFE05
-:106EA000BDE802402D20FAF798BE3048016821F075
-:106EB0000201016070472D484FF4003141600168C4
-:106EC00021F40031016070472848016841F4003125
-:106ED0000160FEF7E6BF2548016821F0040101606A
-:106EE000026822F010020260704720484FF48021AF
-:106EF0004160016821F48021016070471C494FF412
-:106F0000801008607047194804214160016821F031
-:106F1000040101607047154810214160016821F0AB
-:106F200010010160704738B504460C4D0821284611
-:106F3000FFF7F4FE30B10A480460686820F40020CE
-:106F4000686031BDA0474FF40021A96031BD0748FA
-:106F5000016821F00801016070470000000C005832
-:106F6000502400200C04005850000058040C005815
-:106F7000080C0058006040607047EFF3108172B653
-:106F8000026882420CBF012000201CE0EFF3108257
-:106F900072B603680B60486001600868416023E0D6
-:106FA000EFF3108272B6086043684B604160486836
-:106FB000016019E0EFF3108172B6436802681A604D
-:106FC00042680068426081F31088704710B5EFF3A3
-:106FD000108472B602680A600068FFE7FFF7EAFFF4
-:106FE00084F3108810BD086082F310887047000099
-:106FF0000249016002490161704700BF675E0008F5
-:107000008F5E0008DFF80C00FFE7016841F4806143
-:10701000016070470404005838B5EFF3108472B66D
-:10702000284D6946281D00F08CF96946281D00F09E
-:10703000E5F938B184F31088BDF80010224AFFF753
-:10704000CAFB31BD0120287084F3108831BD80B5A2
-:10705000FFF7BEFB0221009100231A4800F1240132
-:107060004FF48052001D00F053F801BD00BFF8B589
-:1070700014460026EFF3108510F1010F1FD00128F0
-:107080001CBF02284FF0FF3619D1C4B1264672B694
-:107090000C4F012392B2381D00F04EF800281CBF9F
-:1070A00097F90010002908D000223A7085F3108863
-:1070B000A1B2054AFFF78FFB01E085F31088304647
-:1070C000F2BD0000040000201970000870B50F4EDA
-:1070D0000446B0680025A8B1FAF70DFBB2684FF47A
-:1070E0007A71B1FBF2F1B0FBF1F0FAF79DFD48B90E
-:1070F000102C07D2002221464FF0FF30FAF750FD46
-:10710000746000E00125284670BD00BF50100020CB
-:1071100010B5029C016042600021C16001614161C3
-:1071200081610381A107047704D5008910B14FF074
-:10713000FF3010BD002010BD2DE9F04F064685B090
-:1071400030890C460027BB4600287169DC460CBF1D
-:107150004FF00208D84681B168B930697768451C9C
-:10716000BD4228BFED1B3768385C7D5D00EB05270D
-:10717000BF1CBFB203E0074600E000B10246306921
-:10718000F568A84223BF7568281AC01B0020154661
-:1071900008EB050903FB09FE864532BF0020B0FB62
-:1071A000F9FA09FB1A00C0B2804509DA96F81C907A
-:1071B0005FEAC97A48BF84465FEA897048BFC4461F
-:1071C000100000F0B4807068714461448842C0F0DF
-:1071D000AE8008EB020080B20390D946100AADF8E9
-:1071E00002000294ADF80020049359E0800740D5D6
-:1071F0003089002840F09B803268D018A34600F800
-:10720000024C200A32681A4402F8010C2246306807
-:107210001844FBF7BDFD706920187061B069019CCE
-:10722000401CB061200A31680C70316848701CE065
-:107230008CB3307FC207D9D5308940B93168194441
-:10724000FF2001F8020C3168194401F8010C4FF0DD
-:10725000000B7069241874612C463089002340B9F2
-:1072600031680C70210A3068417002237069801CFB
-:10727000706108EB04070021BFB231615CB1DA44F0
-:10728000029800EB0A01306822461844FBF780FDA3
-:1072900070692418746109F10109B069401CB0617A
-:1072A000049A70683169914545D2791881422CBFA2
-:1072B000081A0846306103463089A0B93068BDF825
-:1072C0000010C1545B1C70683168834228BF1B1AD0
-:1072D000BDF80200C8545B1C7068834228BF1B1AAB
-:1072E0007069801C706105FB09FA7468BDF80000C4
-:1072F000E41A844288BF0446029800EB0A01281B66
-:10730000AC42019003D093D2307F002890D13768EF
-:107310002246F818FBF73CFD706920187061A346FF
-:10732000019C039F0023A9E73068404400E000204F
-:1073300005B0BDE8F08F88448045F5D3A8EB000880
-:10734000F2E778B5028900230B80002A44690CBF5C
-:1073500002250025002C4FD0028952B9C268466828
-:10736000531CB34228BF9B1B0668B25CF35C02EB64
-:1073700003220A80027F02F00302012A25D10B8832
-:107380004FF6FF72934204BF0289002A09D0C368F6
-:1073900002699A4219D20289BAB14668F31A934235
-:1073A00013D24368C268E41A14190022C26044610F
-:1073B00002894AB902681478012B94BFC3F1010312
-:1073C0000123D25C04EB02220A80C468426806688A
-:1073D0002B19934228BF9B1A33440E884169891B9D
-:1073E000491B416105D034192D19954228BFAD1AAA
-:1073F000C5608169491E8161184672BDF8B5028970
-:1074000000230B80002A42690CBF02240024002ABA
-:107410003BD0C56802892B464AB946686A1CB2420D
-:1074200028BF921B0668775DB25C07EB02220A80D8
-:10743000067F06F00306012E20D10F884FF6FF725B
-:10744000974204BF0289002A07D142680023012A1B
-:1074500094BFC2F1010201220AE00269AA420DD2E0
-:1074600002895AB14668751B954207D2002304E091
-:1074700005682E78AA5C06EB02220A804168006843
-:10748000E4188C4228BF641A03191846F2BD0000A4
-:1074900010B50446AFF30080204600F005F804461E
-:1074A000AFF30080204610BD7CB500F10F06F60852
-:1074B000F600B04240D2082E04D2082602E008307E
-:1074C00000F047F8DFF804512C68210005D10020B6
-:1074D00007E00268B24221D2011D08680028F8D1F5
-:1074E0002068291D0A68824222D01368B34238BF3F
-:1074F000111DF7D312E093190B60801B54685C6078
-:107500000B6818601660096800291DBF48680028CC
-:10751000081D0020286002F1080076BD61B10A68EC
-:107520001068A0F10803B342E5D250680860EAE7AA
-:1075300000F04EF80028C2D1002076BD10B504003E
-:1075400006D0AFF30080204600F003F8AFF30080D0
-:1075500010BD002800D1704750B4A0F10802136894
-:10756000072B2BD913F0070F28D1184C616809B1EC
-:107570008A4202D25160626013E0486800B39042D0
-:1075800038BF0146F9D31BE0964203D11B180B60AC
-:107590000A4606E0486810B1134498420ED3506082
-:1075A0004A60506850B11368D118814206D1002159
-:1075B00021600168CB1813604068506050BC704770
-:1075C00008680E18B242DFD250BC70474024002039
-:1075D0000749086808B1002070470648C008C00085
-:1075E00008600549C908C900091A0160704700BF51
-:1075F00054240020673400206038002012200880C6
-:107600000FF200107047042008800FF20C10704732
-:1076100010B500F029F80FF2980004E010B500F062
-:1076200023F80FF2B0002146FDF769FA204610BD9D
-:1076300038B51A2008800E494C68086889680D4DD5
-:10764000081809D00822A91C00F01EF8042205F130
-:107650001201204600F018F8284632BD10B500F09F
-:1076600003F80FF28400DEE70A46034C704700007F
-:10767000107AFF1F981100205C1E002010B5FFF744
-:10768000F3FF0FF27000CEE730B5002393420DDA1E
-:10769000040F0A2C2CBF3734303401F8134001EBAF
-:1076A0004305002400016C705B1CEFE730BD000057
-:1076B00053544D3332205669727475616C20436F98
-:1076C0006D506F727420696E204653204D6F646553
-:1076D0000000000053544D6963726F656C656374FC
-:1076E000726F6E696373000056435020436F6E667D
-:1076F0006967000056435020496E74657266616385
-:10770000650000001201000202020040830440579D
-:1077100000020102030100000403090480B51C48B3
-:10772000016841F470010160002000F079F848B16F
-:1077300080791849184A0A600A6822F47C5242EAA1
-:1077400000220A604FF0B040016841F480310160CE
-:1077500012490A68D208D20042F001020A600A689F
-:1077600002F00702012AFAD101688903FCD5816879
-:107770008908890041F002018160816801F00C01F3
-:107780000829FAD1016849084900016001BD0000DB
-:1077900088ED00E09C000058FECAFECA0040005878
-:1077A00001000000030000000500000001000000CF
-:1077B00001000000060000000A0000002000000098
-:1077C000020000000400000008000000100000009B
-:1077D00040000000800000000001000000020000E6
-:1077E000A0860100400D0300801A060000350C0041
-:1077F00040420F0080841E0000093D0000127A0004
-:107800000024F40000366E010048E801006CDC0240
-:107810000000000000000000000000000000000068
-:1078200001460648064AC3798B4218BF904218BFEA
-:107830000838F8D18B4218BF00207047F873FF1F3B
-:107840000070FF1F2DE9F04107468846387810F098
-:10785000030F16461D4633D0384600F099F878BB22
-:10786000B8F1000F1CBFD8E900018619012D2ED1F7
-:107870003888C10415D5396A07F14402384600F04A
-:10788000A3F83A6B044602B93A69F968384600F041
-:107890009BF8361B341A7A69F968384600F094F878
-:1078A000261A1EB94DB916F1010F09D097F9030038
-:1078B0002A46314600F08EF8064616F1010F09D12E
-:1078C0002320AFF300804FF0FF30BDE8F081022DA0
-:1078D000E8D1EBE7388810F4405F0ED07868F860A4
-:1078E00038617861B8617868F86107F144003862FE
-:1078F00007F13000786200203863B8F1000F05D03E
-:10790000D8E9020107F13402C2E9000139884CF6D6
-:10791000FF60014039800020BDE8F08170B5054668
-:10792000AFF300802888810415D56E680024EA68CA
-:1079300095F903003146914212D2521AFFF796FB95
-:1079400010F1010F1CBF00283618F0D10FE04DF6E2
-:10795000FF70014029802846AFF30080002070BDF1
-:1079600000220021FFF782FB10F1010F00D101245A
-:107970006868E860A861E861002C2988E7D041F4D4
-:10798000007129802846AFF300804FF0FF3070BDB2
-:10799000F8B5A0B9AFF3008000250A4E08244FF0D7
-:1079A000FF37306820B1FFF7B9FF002848BF3D46D8
-:1079B000361D641EF5D1AFF300802846F2BDBDE848
-:1079C000F240ABE754150020914234BF511A002118
-:1079D000084670473EB504000D00012A02D100F0B0
-:1079E00063F807E0022A07D100940020019069465D
-:1079F0000C20ABBE2D1801E0002A0CD1009401959B
-:107A000069460A20ABBE002805D1002221002800CB
-:107A100000F027F801E00020C04303B030BD0000B3
-:107A200010B4314A002113461C6884421EBF491C11
-:107A30009C6884421EBF491C1C69844209D09C6911
-:107A4000491C844205D0491C20331029ECD310BCBA
-:107A50007047002342F8313002EBC1014B6010BC8B
-:107A6000704778B4204C002325462E688E421EBFF6
-:107A70005B1CAE688E421EBF5B1C2E698E4209D015
-:107A8000AE695B1C8E4205D05B1C2035102BECD3FD
-:107A900072BC7047054604EBC303012A04BF596852
-:107AA0004D195D6072BC704710B40F4A0021134637
-:107AB0001C6884421EBF491C9C6884421EBF491C2E
-:107AC0001C6984420AD09C69491C844206D0491C26
-:107AD00020331029ECD310BC0020704702EBC1000A
-:107AE000406810BC704700004422002010B50446D6
-:107AF000E068A169884251D3218849F202030B4012
-:107B0000022B08D008044CBF4FF400704FF484409F
-:107B1000014321803BE001F4C042B2F5C04F06D1E1
-:107B2000A168884203D32046FFF732FF78BB208844
-:107B300010F4406F02BF606804F14401884217D11D
-:107B40004FF40070FFF7A4FC606030B904F144000A
-:107B50006060E060401CA0600AE0218841F04001C4
-:107B60002180E060606100F500726068A260E06101
-:107B700060682061A068A061207841070AD50222D0
-:107B80000021204600F00CF810F1010F02D14FF057
-:107B9000FF3010BD208840F4C0402080002010BD80
-:107BA00070B504460D461646AFF3008033462A46AC
-:107BB00000212046FFF746FE05462046AFF3008031
-:107BC000284670BD38B504000ED0207810F0030FA1
-:107BD00003D094F90300002809D5AFF300802046B4
-:107BE00000F030F8AFF300804FF0FF3032BD204698
-:107BF000FFF7CEFE0546AFF300802078410644BF74
-:107C0000606800F05DF80020606094F903000228CD
-:107C100004D900F057F808B14FF0FF35E06B48B1D8
-:107C200000F05CF808B14FF0FF35E06B00F048F869
-:107C30000020E063204600F005F8AFF300802846FE
-:107C400032BD000001780A0626D51C4A13680021BF
-:107C5000834203D1002342F821301BE05368012105
-:107C600083421EBF022193688342F3D0D36803216D
-:107C700083421EBF042113698342EBD0536905215F
-:107C800083421EBF0621936983421EBF0721D36929
-:107C90008342DFD000F014B8002101804FF0FF31A3
-:107CA000C17000F144014160C160016141618161C5
-:107CB000C161016200F1300141627047541500203A
-:107CC000FFF73CBC1CB50200009269460220ABBE27
-:107CD00004001000FFF7A4FE200016BDE0B50090E0
-:107CE000FAF73CFF019069460E20ABBE03B000BD21
-:107CF00038B50C46C5B22046AFF30080E068A169F4
-:107D0000884204D32046FFF7F1FE00280FD4E06834
-:107D1000401CE06000F8015D2088010503D44005A7
-:107D20000BD50A2D09D12046FFF732FE28B1204697
-:107D3000AFF300804FF0FF3032BD2046AFF300803C
-:107D4000284632BD7047FEE770477047704700F025
-:107D500019B80020F9F785B90020F9F78BB902208E
-:107D6000F9F77FB90220F9F785B9FDF742B8FFF7B7
-:107D70002EB8FEF7E3BF00E000BF0148FBF774BC7C
-:107D8000AC15002002490A68886882180A607047AA
-:107D90005010002019E050F8042BD30744BFA9F17C
-:107DA00001039A18091F0023042942F8043BF9D261
-:107DB0005FEA817C134604D54FF0000CA2F800C0A6
-:107DC0009B1CC90744BF0021197050F8041B0029EF
-:107DD000E1D1704738B50D4D0824286800281CBF34
-:107DE000017811F0030F05D090F90310002958BF56
-:107DF000FFF7E8FE2D1D641EEFD1BDE838400022DC
-:107E000000214FF0FF30FFF731B900BF54150020BB
-:107E100010B5074979441831064C7C44163404E007
-:107E20000A68081D114488470146A142F8D110BDD7
-:107E30002C000000500000004EF68851CEF20001E8
-:107E4000086840F470000860BFF34F8FBFF36F8F76
-:107E50004FF00070E1EE100A7047000039FFFFFF9D
-:107E6000B40E0000AC150020980A0000200003208A
-:107E7000000000005F97FFFF88010000E0020000A3
-:107E800004000020000000000000000000000000CE
-:107E900000000000010000000200000003000000DC
-:107EA0000400000000F00DF8002801D0FFF7B0FF3B
-:107EB000AFF300800020AFF30080FDF7CFFE00F0AD
-:107EC00002F80120704700F001B800000746FFF7F4
-:107ED00081FF3846FBF75CFBFBE738B504460D46EF
-:107EE000284600F005F8A84218BF0024204632BDFD
-:107EF0000149FFF7FDBE00BFC414002001488047C0
-:107F0000014800471D7700080D7F0008AFF300808F
-:107F1000FFF792FFFFF7C6FF00002E00FFF7FEBF3E
-:107F2000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF85
-:107F3000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF75
-:107F4000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF65
-:107F5000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF55
-:107F6000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF45
-:107F7000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF35
-:107F8000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF25
-:107F9000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF15
-:107FA000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF05
-:107FB000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF5
-:107FC000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE5
-:107FD000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD5
-:107FE000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC5
-:107FF000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB5
-:10800000F3FF010001F1FF01F1FF01F1FF01F1FFB9
-:1080100001F1FF01F1FF01F1FF01F1FF01F1FF01AA
-:10802000F1FF01F1FF01F1FF01F1FF01F1FF01F1AA
-:10803000350152FF01ED3F101210115D5410500137
-:1080400048000404110C10020A0600020822401C19
-:108050001007996300082D6400087104212B100398
-:10806000896500081904435F6510610112B7101299
-:10807000AF0412BF0412C704100909024300020131
-:1080800000C03209046512020B101E052400100105
-:10809000052401000104240202052406000107054D
-:1080A000820308001009040100020A4E10020705AD
-:1080B00001027B200107058107F2280044224007C6
-:1080C000228107200100090744F22C04441007FD17
-:1080D000750008077600081D0412110412310412FD
-:1080E0005D04127D04F001FF1A030001F1FF01F1AC
-:1080F00098011003635800089904129D0412EF04BC
-:108100002F00C202041E08290310050000C014003D
-:1081100020C10452C00429F6A10852AC0CF10B0195
-:1081200010070204010114230020640452140421E6
-:10813000346108F0031308150020F44840030802D6
-:1081400002C422402108210421346108125048F35E
-:10815000113C1548127C6C12C404F2060C2CF0027F
-:1081600007187F0008046D5405F2001A140300007C
-:0400000508007F0D63
+:10025000002070BD206881684A067047F8B50446E2
+:1002600040F60F002568E9692A68AB6808400DD19F
+:10027000880602D5900602D4D80040F18880E16E4D
+:1002800000294FD02046BDE8F440084764480342A7
+:1002900004BF644E32427AD0CF0709D5D60507D5C0
+:1002A00001262E62D4F8885045F00105C4F8885024
+:1002B0008D070AD5DD0708D5266802253562D4F8F2
+:1002C000885045F00405C4F888504D070AD5DD076D
+:1002D00008D5266804253562D4F8885045F0020513
+:1002E000C4F888500D070CD5950601D4034208D0F8
+:1002F000256808202862D4F8880040F00800C4F877
+:10030000880008050BD5500109D525684FF4006019
+:100310002862D4F8880040F02000C4F88800D4F89F
+:10032000880000286FD0890607D5900601D4D80030
+:1003300003D5E16E09B120468847D4F888002168CA
+:100340008A68510602D410F0280F19D0204600F018
+:10035000BBFDFFF77FFF0ED500F056F858B13249CC
+:100360008163A06F01F066F800284CD0A06F816B0C
+:10037000BDE8F44008472046BDE8F24001F04AB924
+:10038000204601F047F90020C4F88800F1BDC802FA
+:1003900009D5580207D54FF4801028622046BDE8E1
+:1003A000F24001F075B9080609D5100601D418020B
+:1003B00005D5216F39B32046BDE8F440084748060B
+:1003C0000FD550060DD5286820F040002860202168
+:1003D000C4F88010002020672046BDE8F24000F0FD
+:1003E00054BF080206D5500004D52046BDE8F240AF
+:1003F00001F04FB9C80148BF002A04D52046BDE826
+:10040000F24001F047B9F1BD816821F040018160FF
+:10041000A06F70471D0F00084B0F0008510F000818
+:1004200001000010200100049F0F00082DE9F84F83
+:100430000446DFF8C0082768DFF8BCB83968DFF881
+:10044000BCA80140A06801432069014360690143E1
+:10045000E0690143606E0143396000267968E06815
+:1004600021F4405101437960B046A169DFF880086A
+:1004700087421CBF206A0143BA68DFF8700A024055
+:100480001143B9604FF48075F96A606A090940EA5E
+:100490000111F9625F454FF400404FF400714FF4D1
+:1004A00080624FF400634FF4805C4FF4005E4FF4C1
+:1004B000804929D1DAF800B00BF0030BBBF1030F30
+:1004C0003ED8DFE80BF00237343A4FF0010AD4F897
+:1004D0001CB05746BBF5004F4FF6F07A40F0118341
+:1004E000012F09D0022F00F05482042F00F08D82DA
+:1004F000082F00F0C282F5E201F035F90146606A8A
+:10050000002840F01B8242E2DFF8E4B75F4517D1D4
+:10051000DAF800A01AF4406A27D0BAF5806F09D043
+:10052000BAF5006F03D0BAF5406F06D008E04FF07F
+:10053000020A07E04FF0040A04E04FF0080A01E065
+:100540004FF0100ADFF8A8B75F45C0D1BAF1000F2D
+:100550000BD0BAF1020F49D0BAF1040F00F082803B
+:10056000BAF1080F00F0B080B5E301F0F4F80146ED
+:10057000606A58B3012808BF022028D0022808BFAB
+:10058000042024D0032808BF062020D0042808BF58
+:1005900008201CD0052808BF0A2018D0062808BF4C
+:1005A0000C2014D0072808BF102010D0082808BF3E
+:1005B00020200CD0092808BF402008D00A2808BFF6
+:1005C000802004D00B2808BF284600D00120B1FBB2
+:1005D000F0F0002800F08183626802EB420188425B
+:1005E00003D31103814280F0A18074E3606AB0B349
+:1005F000012808BFDFF8F808EED0022808BFDFF8AE
+:10060000F408E9D0032808BFDFF8EC08E4D0042898
+:1006100008BFDFF8E808DFD0052808BFDFF8E008EA
+:10062000DAD0062808BFDFF8DC08D5D0072808BFD5
+:10063000DFF8D408D0D0082808BFDFF8D008CBD026
+:10064000092808BFDFF8C808C6D00A2808BFDFF8A5
+:10065000C408C1D00B2808BF4FF22440BCD0DFF83B
+:10066000B808B9E701F02DF80146606A58B30128CF
+:1006700008BF0220ABD0022808BF0420A7D003285F
+:1006800008BF0620A3D0042808BF08209FD0052853
+:1006900008BF0A209BD0062808BF0C2097D0072847
+:1006A00008BF102093D0082808BF20208FD0092829
+:1006B00008BF40208BD00A2808BF802087D00B2895
+:1006C00008BF284683D081E7676A002F84D0012FB6
+:1006D00008BF4846FAD0022F08BF7046F6D0032F55
+:1006E00008BF41F25550F1D0042F08BF6046EDD04D
+:1006F000052F08BF40F6CC40E8D0062F08BF40F6D3
+:10070000AA2012D0072F08BF18460ED0082F08BF06
+:1007100010460AD0092F08BF084606D00A2F08BF86
+:10072000284602D00B2F00D1802055E7BAF1000FE8
+:100730000BD0BAF1020F38D0BAF1040F00F072807A
+:10074000BAF1080F00F0A780ECE001F004F80146D0
+:10075000606A40B3012808BF02251ED0022808BFE6
+:1007600004251AD0032808BF062516D0042808BF80
+:10077000082512D0052808BF0A250ED0062808BF74
+:100780000C250AD0072808BF102506D0082808BF66
+:10079000202502D0092808BF402572D00A280CBFA6
+:1007A00080250B286DD001256BE0606A002836D0CB
+:1007B000012808BFDFF8F8672BD0022808BFDFF850
+:1007C000F46726D0032808BFDFF8EC6721D004289F
+:1007D00008BFDFF8E8671CD0052808BFDFF8E0672E
+:1007E00017D0062808BFDFF8DC6712D0072808BF3B
+:1007F000DFF8D4670DD0082808BFDFF8D06708D02D
+:10080000092808BFDFF8C86703D00A2808BFDFF847
+:10081000C4677CD00B2808BFDFF8FC6677D0DFF810
+:10082000B86774E000F04DFF0146606A40B30128EC
+:1008300008BF022525D0022808BF042521D003289F
+:1008400008BF06251DD0042808BF082519D0052893
+:1008500008BF0A2515D0062808BF0C2511D0072887
+:1008600008BF10250DD0082808BF202509D0092869
+:1008700008BF402505D00A280CBF80250B2800D0D2
+:1008800001256268B1FBF5F65008002110EB062047
+:1008900051EB166141E0606A002836D0012808BF9C
+:1008A0004FF4800633D0022808BF4FF400162ED034
+:1008B000032808BFDFF8246729D0042808BF4FF4B5
+:1008C000801624D0052808BFDFF814671FD006283B
+:1008D00008BFDFF810671AD0072808BF4FF40026BA
+:1008E00015D0082808BF4FF4802610D0092808BF6B
+:1008F0004FF400360BD00A2808BF4FF4803606D0DC
+:100900000B2808BF4FF4004601D04FF40006C24642
+:10091000002116EB52004AEB0101002300F040FFDA
+:10092000064601E04FF00108A6F54070DFF8B81662
+:10093000884280F0D0812168CE60CEE1012808BFD6
+:1009400002251AD0022808BF042516D0032808BFA4
+:10095000062512D0042808BF08250ED0052808BF98
+:100960000A250AD0062808BF0C2506D0072808BF8C
+:10097000102502D0082808BF202575D0092808BFF7
+:10098000402571D00A280CBF80250B286CD001258A
+:100990006AE0606AB0B3012808BFDFF87C0521D0A7
+:1009A000022808BFDFF848051CD0032808BFDFF87D
+:1009B0003C0617D0042808BFDFF8380512D00528F8
+:1009C00008BFDFF82C060DD0062808BFDFF8280581
+:1009D00008D0072808BFDFF8240503D0082808BF7F
+:1009E000DFF824057AD0092808BFDFF8200575D084
+:1009F0000A2808BFDFF8180570D00B2808BFDFF8F9
+:100A000014056BD0DFF8CC0568E000F05AFE014613
+:100A1000606A40B3012808BF022525D0022808BF1C
+:100A2000042521D0032808BF06251DD0042808BFAF
+:100A3000082519D0052808BF0A2515D0062808BFA3
+:100A40000C2511D0072808BF10250DD0082808BF95
+:100A5000202509D0092808BF402505D00A280CBF49
+:100A600080250B2800D001256068B1FBF5F1420814
+:100A700002EB4102B2FBF0F632E0666A66B3012E89
+:100A80002CD0022E08BF484628D0032E08BF42F6BD
+:100A9000AA2023D0042E08BF70461FD0052E08BF01
+:100AA00041F698101AD0062E08BF41F2545015D0C6
+:100AB000072E08BF604611D0082E08BF18460DD07B
+:100AC000092E08BF104609D00A2E08BF084605D0D7
+:100AD0000B2E08BF284601D04FF4803000F010F9EB
+:100AE000B6B201E04FF00108A6F11000504580F0C9
+:100AF000F2800AEA0601C6F3420001432068C160A1
+:100B0000EBE0012F07D0022F35D0042F6FD0082F34
+:100B100000F0A480D6E000F026FE0146606A40B3F3
+:100B2000012808BF022512D0022808BF04250ED0D4
+:100B3000032808BF06250AD0042808BF082506D0C8
+:100B4000052808BF0A2502D0062808BF0C257DD03D
+:100B5000072808BF102579D0082808BF202575D0A0
+:100B6000092808BF402571D00A280CBF80250B2812
+:100B70006CD001256AE0606AB0B3012808BFDFF8D5
+:100B8000701332D0022808BFDFF868132DD0032875
+:100B900008BFDFF8641328D0042808BFDFF85C130F
+:100BA00023D0052808BFDFF858131ED0062808BF39
+:100BB000DFF8501319D0072808BFDFF84C1314D002
+:100BC000082808BFDFF844130FD0092808BFDFF852
+:100BD00040130AD00A2808BFDFF8381305D00B28C5
+:100BE00008BF4FF2244100D0CB49606831E000F0EB
+:100BF00068FD0146606A40B3012808BF022525D080
+:100C0000022808BF042521D0032808BF06251DD0CF
+:100C1000042808BF082519D0052808BF0A2515D0C3
+:100C2000062808BF0C2511D0072808BF10250DD0B5
+:100C3000082808BF202509D0092808BF402505D06D
+:100C40000A280CBF80250B2800D001256068B1FB65
+:100C5000F5F101EB5001B1FBF0F631E0666A6EB3DD
+:100C6000012E08BF484629D0022E08BF704625D065
+:100C7000032E08BF41F2555020D0042E08BF604615
+:100C80001CD0052E08BF40F6CC4017D0062E08BF5A
+:100C900040F6AA2012D0072E08BF18460ED0082E04
+:100CA00008BF10460AD0092E08BF084606D00A2EF3
+:100CB00008BF284602D00B2E08BF802000F020F885
+:100CC000B6B201E04FF00108A6F11000504502D283
+:100CD0002068C66001E04FF0010804F168000121BE
+:100CE000418001800021416081604046BDE8F28F73
+:100CF00000800040F369FFCF0038014088000058B1
+:100D0000616800EB5100B0FBF1F6704790F82810D5
+:100D1000CA0706D502685368C16A23F400330B433F
+:100D2000536090F828108A0706D502685368016B53
+:100D300023F480330B43536090F828104A0706D5FC
+:100D400002685368416B23F480230B43536090F88F
+:100D500028100A0706D502685368816B23F4004304
+:100D60000B43536090F82810CA0606D502689368B2
+:100D7000C16B23F480530B43936090F828108A06CC
+:100D800006D502689368016C23F400530B4393600B
+:100D900090F828104A0610D502685368416C23F475
+:100DA00080130B435360416CB1F5801F05D153682C
+:100DB000816C23F4C0030B43536090F828100A069B
+:100DC00006D501684A68C06C22F4002202434A60DA
+:100DD0007047F8B5044604F17C050020E8606FF028
+:100DE0007E4700F0F5FD0646206801680A0708D531
+:100DF0000097334600224FF40011204600F016F809
+:100E000060B9206801684A070AD500973346002276
+:100E10004FF48001204600F009F808B10320F2BD2C
+:100E200020206860A86000202870F2BD2DE9F04104
+:100E3000069C05460E4690461F462868C16931400B
+:100E4000B1420CBF0120002040451CD114F1010F1C
+:100E5000F3D000F0BDFDC01B844200D314B900F0F4
+:100E600015F80CE0286801684A07E6D5C1690A054B
+:100E7000E3D54FF40062026200F008F8C16000217F
+:100E80000170032000E00020BDE8F08128680168BF
+:100E900021F4D071016028688168490849008160A7
+:100EA00005F17C00202141608160704701680A687B
+:100EB00022F0C0020A6001688A6822F400028A6097
+:100EC0002021C0F88010704701680A6822F49072EF
+:100ED0000A60DFF82011026893680B4093602021BC
+:100EE000C0F884100021C16670470000FFF4FF11B4
+:100EF00000127A0000093D00AAB0280080841E007C
+:100F0000006A18005558140040420F0020A1070045
+:100F100090D0030048E801000024F400816A0068D2
+:100F20000268930644BF084600F0AFB90020A1F85C
+:100F300056000868826822F0800282600868FFE735
+:100F4000016841F0400101607047806A00F046BDD1
+:100F5000F8B5846A04F1800504F1560728686E68C4
+:100F600021688A68110606D5212804D1002038801E
+:100F70002046FFF79BFF20688168480606D5222E91
+:100F800004D1002038812046FFF79EFFA86840F07A
+:100F90001000A8602046BDE8F24000F03BBB806A2C
+:100FA00000F1560100220A810A8000F033BB0000E4
+:100FB0000000127A0000093D00AAB0280080841EBB
+:100FC00000006A18005558140040420F0020A10785
+:100FD0000090D0030048E801000024F400551500FB
+:100FE00000CC0C0000AA0A0000FD0F005461510063
+:100FF00000D43000FEFFFFEFDFF8B41201E0DFF8AD
+:10100000B41281B00A6802430A600968084000907F
+:10101000009801B070474FF400414FF4E13210B135
+:10102000022805D07047DFF89002DFF8903203E025
+:10103000DFF88C02DFF88C320360426000228260AD
+:10104000C260026182610C224261C1610021816241
+:10105000FFF774B863609A489A4B704723609648CC
+:10106000964B704770B51C4600230025964E10B174
+:10107000022804D00AE03460FFF7F1FF02E0746058
+:10108000FFF7E9FF0360FFF799F80346012B05D04E
+:1010900007D3032B04D038BF022502E0012500E06E
+:1010A0000325284670BD10B1022802D0704782483F
+:1010B00000E08348FFF7D2B810B1022803D0704790
+:1010C0007D48406F01E07E49486F00F0EAB9F8B50D
+:1010D00086B004466846142100F082FC2068794FEF
+:1010E0007A4D7B4EB84259D0744FB84240F0A88038
+:1010F0000220FFF784FF402000F0AEF8754F38461D
+:1011000000F072FC0220FFF77AFF802000F0A4F8C4
+:10111000384600F069FC00F09DF84FF400600221B1
+:10112000009001910291072000F08CF8F06A80088D
+:10113000800040F00100F0620022706840F48040BE
+:1011400070600F21706800F480400590059824209D
+:1011500000F048FD242000F062FD0220FFF74CFF64
+:101160000420FFF749FF5C4828600F2068601020CA
+:10117000A8600020E8608020286100206861A861E4
+:10118000E8612862284600F0ABF86567AC6200228F
+:101190000F213A2000F026FD3A204FE000F05AF8E7
+:1011A000042000F064F800F055F8082000F05FF823
+:1011B00000F050F840200221009001910291082097
+:1011C00000F040F8F06A20F4406040F48060F06283
+:1011D0000022306840F001003060316801F0010108
+:1011E00005910F210598252000F0FCFC252000F03A
+:1011F00016FD0120FFF700FF0420FFF7FDFE374832
+:101200002866112068661020A8660020E866802005
+:10121000286700206867A867E867C5F8800005F1BF
+:10122000600000F05DF805F160006067C5F8884077
+:1012300000220F210E2000F0D5FC0E2000F0EFFC64
+:1012400007B0F0BD03210391049069464FF0904030
+:1012500000F0CABB0120D2E60090022100200191DB
+:101260000290032107200391049069467047009083
+:101270000221002001910290032108200391049093
+:1012800069464FF0904000F0AFBB82B000680D4A55
+:101290000D49904206D0094A904207D1086828B10A
+:1012A00002B00047486808B102B0004702B070477A
+:1012B000480000584C000058D4200020003801405D
+:1012C000602100200080004044240020841F002072
+:1012D0005C000058000400484404024044000240FE
+:1012E00038B5040001D1012032BD2168DFF8FC02CD
+:1012F000814204F1240500F042F8022068700A6877
+:10130000A0686FF30E120243E068024320690243B3
+:1013100060690243A0690243E0690243206A024314
+:101320000A60204600F039F9A068B0F5804F04BF8C
+:1013300000216160696A207900F014F838B105284D
+:1013400005D2204600F043F900F012F803E0002037
+:1013500028636863A8630020A861012068700020EA
+:10136000287032BD0860A96AE86A48606068704702
+:10137000296B00200860696BA86B486070470AD22F
+:10138000DFF86C0242181423B2FBF3F292002A62D7
+:10139000DFF8600209E0DFF8600242181423B2FBB4
+:1013A000F3F292002A62DFF85402E8617047F8B560
+:1013B0000446002504F124067057012801D10220BB
+:1013C000F2BD01273770F05701282FD1022777701F
+:1013D000B561206807687F087F000760204600F03D
+:1013E000C0F82168F06820B10A6842F00E020A6075
+:1013F00008E0086820F0040008602068016841F0F7
+:101400000A010160706A0168CA0303D5026842F4E8
+:1014100080720260306B18B1016841F48071016024
+:101420002068026842F00102026001E03570022586
+:101430002846F2BD38B500F12402002492F90110CB
+:10144000022903D004209061012428E001680B6880
+:1014500023F00E030B6001680D686D086D000D60D0
+:10146000516A0B6823F480730B60012192F82030DD
+:10147000D56903F01C0399406960936AD16A596089
+:10148000116B31B10B6823F480730B60536B916B5C
+:101490005960012151701470516901B1884720468B
+:1014A00032BDF8B500F124010423CA69146802684A
+:1014B000156891F8206006F01C0603FA06F73C4216
+:1014C00010D06F070ED51468A50603D4156825F053
+:1014D0000405156000F03DF8C968002938D0BDE862
+:1014E000F4400847022303FA06F73C4213D0AF0743
+:1014F00011D51468A50605D4156825F00A051560F0
+:1015000001224A7000F025F800220A708968F9B1BA
+:10151000BDE8F4400847082303FA06F6344217D022
+:101520002B0715D5136823F00E031360012291F8E1
+:101530002030CC6903F01C039A40626001228A616A
+:101540004A7000220A70096911B1BDE8F4400847E9
+:10155000F1BD91F82020CC6902F01C029340636039
+:10156000704778B5C56C046D6C60446D14B1846DC2
+:10157000C56D6560012590F84440066C04F01C04BC
+:10158000A5407560046863608068102802D1A2607D
+:10159000E16071BDA160E26071BD416C0268134BF6
+:1015A00089089A4234BF164B164B03EB81018164C4
+:1015B00002F0FF02083A1421B2FBF1F1124AC264B0
+:1015C00001F01C01012202FA01F101657047017965
+:1015D0000E4A02EB81024265491E0D4A826501F006
+:1015E000030101228A40C2657047000008040240DE
+:1015F000F8FFFDBF00000240F8FBFDBF0004024001
+:10160000000802401C08024080080240FC0802401A
+:10161000400902407047F0B40246106895681318FC
+:10162000506803EB5004C00721D54D441FE0F0BCC7
+:1016300002F10C00704713F8017B05F8017B491E8D
+:10164000F9D1A0B1B60813F8011B06F00306032E6A
+:1016500008BF13F8016B01EB06214942801C2944A5
+:1016600005D011F8016B05F8016B401EF9D1A342BA
+:10167000DDD013F8016B16F0030104BF13F8011B52
+:10168000C91C30090F28DAD113F8010B0F30D6E747
+:101690007047704770478268521C8260426832B15E
+:1016A0000268531C036011704168491E4160704715
+:1016B0004FF0B040006800F0F000B02888BFB020C4
+:1016C000704738B54FF0B044304DA16811F00C01AF
+:1016D00006D1FFF7EDFFC0F3031055F8200032BD2F
+:1016E00004292B4A05D008292A4804D12168C902B7
+:1016F00022D5104632BDE16801F00301022904D071
+:10170000032904D12168C90207D5104605E0FFF777
+:10171000CFFFC0F3031055F82000E168E268E368EA
+:10172000C1F306214843C2F30211491C5B0FB0FB11
+:10173000F1F05B1CB0FBF3F032BD80B5FFF7C1FFE9
+:101740001149FFE7144A0968C1F3031152F8211047
+:10175000B0FBF1F002BD80B5FFF7EFFF00F010F82D
+:10176000C1F3022106E080B5FFF7E7FF00F008F8BB
+:10177000C1F3C22112F8211001F01F01C84002BDBF
+:101780000149064A096870470800005804790008B2
+:101790000024F4000048E801C4780008A87F00088D
+:1017A000B3BBD9B1B2F5803F7DD2022A1ED98C4697
+:1017B000B1FBF2F102FB11C31B0443EA1043B3FB7C
+:1017C000F2FC02FB1C3380B240EA0343B3FBF2F0AD
+:1017D00002FB103240EA0C4000237047022A05D970
+:1017E0008446B0FBF2F002FB10C270474AB105D14B
+:1017F00000F0010249085FEA300070470022002330
+:10180000704700F071BA0B00020000210020704701
+:10181000904271EB030CF6D3B3F5803F2FD2F0B5B5
+:10182000B3FA83F7B1FA81F4A7F10F0E3D1B5340D1
+:10183000CEF1200602FA0EF2F3415340B5F10F0744
+:1018400046D80F3C2C444140C4F12006A040F14151
+:101850004140B1FBF3F603FB1611A2FB0645001B4A
+:10186000A94102D2761E8018594180EA010221FA6C
+:101870000EF362FA0EF200215A403046F0BD30B449
+:10188000B1FBF3FC03FB1C11A2FB0C45001BA9419F
+:1018900003D2ACF1010C8018594130BC02460B4612
+:1018A000604600217047B2F1807F65D3F0B5B2FA8F
+:1018B00082F7B1FA81F4C7F10F063D1B22FA06F355
+:1018C00007F1110EF24120355A40B5F10F07B8D992
+:1018D0004140C4F12006A040F1414140B1FBF3FC7E
+:1018E00003FB1C11A2FB0C45001BA94103D2BCF158
+:1018F000010C801859410F2F12D30F3FC90341EA41
+:101900005041B1FBF3F603FB1611A2FB0645D4EBE5
+:10191000C030A94102D2761E8018594146EACC3C1B
+:1019200007B34140C7F12006B840F1414140B1FB47
+:10193000F3F603FB1611A2FB0645001BA94102D2D8
+:10194000761E8018594180EA010221FA0EF3C7F190
+:10195000200462FA0EF20CFA07F05A402CFA04F155
+:101960003043F0BD80EA010221FA0EF3002162FA51
+:101970000EF260465A40F0BD8C46B1FBF2F102FB1C
+:1019800011C31B0243EA1063B3FBF2FC02FB1C33DE
+:101990001B024CEA002043EA1063B3FBF2FC02FB9B
+:1019A0001C331B024CEA002043EA1063B3FBF2FC39
+:1019B00002FB1C331B024CEA002043EA1063B3FB1A
+:1019C000F2FC02FB1C324CEA0020002370470000AE
+:1019D00001480068704700BF5010002070470000A9
+:1019E000002200F083B900002DE9F84F4FF0000C01
+:1019F000674A684BDFF8A0814FF00F0982460F4617
+:101A000033E0664DAA4514BF072504258D402543C4
+:101A100048F82E50C1431C6801EA040E7C68E503B7
+:101A200048BF40EA0E0EC3F800E05C6801EA040E0D
+:101A30007C68A50348BF40EA0E0EC3F804E01468B2
+:101A400001EA040E7C68E50248BF40EA0E0EC2F8C7
+:101A500000E0546801EA040E79688C0248BF40EA4D
+:101A60000E0EC2F804E00CF1010C396831FA0CF0EA
+:101A700000F07C80012000FA0CFE1EEA0100F2D08A
+:101A80007C68022C18BF122C4FEA8C0110D14FEA4F
+:101A9000DC040AEB840401F01C05266A09FA05FB44
+:101AA00026EA0B06D7F810B00BFA05F53543256288
+:101AB0004FEA4C040325DAF8006097F804B0A5401B
+:101AC000ED430BF0030B2E400BFA04FB4BEA06062A
+:101AD000CAF800607E68012E18BF022E03D0112EB6
+:101AE00018BF122E17D1DAF80860D7F80CB02E40C4
+:101AF0000BFA04FB4BEA0606CAF80860DAF8046041
+:101B000026EA0E0E7E68C6F3001606FA0CF646EAC2
+:101B10000E06CAF80460DAF80C603540BE6806FAB2
+:101B200004F42C43CAF80C407C68E4009BD54FEACF
+:101B30009C0E58F82E5001F00C0109FA01F425EA28
+:101B40000404BAF1904F08BF00250ED0144DAA45E9
+:101B500008BF012509D0134DAA4508BF022504D0AE
+:101B6000114DAA457FF44DAF03254FE7BDE8F18F36
+:101B700081B0002A14BF8161816201B0704781B0D9
+:101B800042690A4214BF8162816101B0704700005E
+:101B90000008005880080058080001400010004864
+:101BA0000004004800080048000C00480901020039
+:101BB00081B002D44248815405E0424802F00F024D
+:101BC000104400F8041C01B070473F4A13684FF6F8
+:101BD000FF0100020B4000F4E06018433B4908435A
+:101BE0001060704738B5384B1C68C4F30223C3F14A
+:101BF0000704052C28BF04241D1D072D34BF002316
+:101C0000DB1E012505FA04F4641E2140994005FA03
+:101C100003F35B1E1A401143BDE83440C6E70100E0
+:101C200007D4012200F01F01294B8A40400943F8E4
+:101C30002020704701000BD4012200F01F01254B2A
+:101C40008A40400943F82020BFF34F8FBFF36F8FC6
+:101C50007047BFF34F8F1C491F480A6802F4E062C7
+:101C600002430A60BFF34F8F00BFFDE710B5401E6F
+:101C7000B0F1807F01D3012010BD184C60600F21AE
+:101C80004FF0FF30FFF792FF0022A2600720206094
+:101C9000002010BD010007D4012200F01F01104BED
+:101CA0008A40400943F820207047010007D40122F0
+:101CB00000F01F010B4B8A40400943F82020704779
+:101CC00000E400E018ED00E00CED00E00000FA0593
+:101CD00000E100E080E100E00400FA0510E000E02F
+:101CE00000E200E080E200E07047000000B500BFC5
+:101CF000130096469446103928BFA0E80C50FAD835
+:101D00005FEA417C28BF0CC048BF40F8042BC907DC
+:101D100028BF20F8022B48BF00F8012B00BD0000AF
+:101D20002DE9F0439FB00FF29C16269CDFF8E48A61
+:101D300002918DF83B4000210B914FF0FF37044694
+:101D400091461D460AE019F8011B0298A047002899
+:101D5000029000F0A4800B98401C0B9099F80000B2
+:101D600050B12528EFD10020002105900691079061
+:101D7000089109900A9103E00B98A7E041F0010156
+:101D800019F8010F2028F9D023280CD02B2804D0D3
+:101D90002D2805D0302809D083E041F00201EFE77B
+:101DA00041F00401ECE741F00801E9E741F01001DE
+:101DB000E6E700200D900AE00D98404505DA00EBBB
+:101DC000800302EB4302303A0D9209F1010999F8C0
+:101DD0000020A2F130000A28EED399F800002E2846
+:101DE00018BF0C9726D119F8010F2A2808D12868A6
+:101DF000286009F1010950F8042B28600C9219E0C1
+:101E00002D280CBF19F8010B002000220C920BE0CA
+:101E100040B90C9A424505DA02EB820203EB420319
+:101E2000303B0C9309F1010999F80030A3F130021D
+:101E30000A2AEDD3ADF83810304699F8001000F0BA
+:101E400081FE08B119F8010B8DF83A009DF83A00AF
+:101E5000682804BF99F80010682903D162208DF822
+:101E60003A0008E06C2804BF99F800006C2804D1FF
+:101E700071218DF83A1009F1010910A804902A4641
+:101E800019F8013B6946204600F060F838B910AAFD
+:101E90006946204600F08CF900287FF55FAF384690
+:101EA00014E02A2885D12A682A6052F8040B2A6097
+:101EB00000280D9003D540420D9041F0040109F136
+:101EC00001098AE7686A6C747A4C00001FB0BDE8AB
+:101ED000F083622820D0682811D06A2803D06C28AB
+:101EE00027D0712825D10868C01D20F007000860A0
+:101EF000D0E9002308300860194610467047002AD0
+:101F00000A680A60106803D0121D0A6000B217E068
+:101F1000121D0A6080B217E0002A0A680A60106881
+:101F200003D0121D0A6040B20AE0121D0A60C0B25E
+:101F30000AE0002A0A680A60106803D0121D0A60CD
+:101F4000C1177047121D0A600021704770B51C460A
+:101F50000D46B4F125002E69114600F017811C389A
+:101F60006AD0001F022867D9133843D0093863D0DC
+:101F7000801E16D0401E1ED0401E02285CD9001FB5
+:101F800019D0401F00F08380401E33D0401E00F067
+:101F9000CD80C01E00F0D880801E2BD0C01E29D05E
+:101FA000FAE06869421C6A610A680A6052F8043BF8
+:101FB0000A603354FAE095F83A000122FFF789FFEE
+:101FC000C5E900010023994204DA6869411C69618E
+:101FD0002D210DE0288F810704D56869411C6961B6
+:101FE0002B2105E0C00722D56869411C69612021C9
+:101FF00031541CE095F83A000022FFF76AFFC5E96A
+:10200000000195F83800010711D5D5E9002300201B
+:10201000834208BF82420AD044F02000782806D1CB
+:10202000686930213154401C411C69613454214697
+:1020300068693044E86083E00868C01D20F007004C
+:102040000860D0E9002308300860C5E90023D5E91D
+:102050000001C80F04D06869411C69612D210DE0A1
+:10206000288F810704D56869411C69612B2105E02F
+:10207000C00704D56869411C696120213154686931
+:102080003044E8602146284600F0C4F98EE005F1AE
+:102090003A02507820B14FF0FF340FF648205EE04E
+:1020A0001078622808D0682824D06A2812D06C28BA
+:1020B0002ED071280ED02BE00A680A6052F8040B6B
+:1020C0000A6020B94FF0FF340FF6302047E0E96A8C
+:1020D00001706BE00A680A6052F8040B0A6020B9CC
+:1020E0004FF0FF340FF6142039E0EA6AD317C0E945
+:1020F00000235BE00A680A6052F8040B0A6020B90A
+:102100004FF0FF340FF6F41029E0E96A01804DE04A
+:102110000A680A6052F8040B0A6020B94FF0FF34D5
+:102120000FF6D8101BE0E96A01603FE00A680A6018
+:1021300052F8040B0A600021C5E90001EE60782125
+:10214000284600F0BBF831E00868086050F8044BFE
+:102150000860EC603CB94FF0FF340FF6B81000F0A7
+:10216000FDFC201A70BD2E6B002E04D5204600F019
+:1021700017FD044608E032460021204600F02CFD01
+:10218000002814BF041B3446AC610FE06869411C91
+:1021900069612521315409E06969481C686125227B
+:1021A0007254210002D0411C69613454002070BD7A
+:1021B0002DE9FC410F460646796B7869BC6A091A1D
+:1021C000386A091AB869091A786A091AF869091A7D
+:1021D00097F838000C1B410790460FD42021002CA3
+:1021E0008DF800100ADD254601236A46394630463F
+:1021F00000F060FC00285DD16D1EF5D17B69424680
+:102200003946304600F056FC002853D130208DF876
+:1022100000003D6A002D09DD01236A46394630463B
+:1022200000F048FC002845D16D1EF5D1BB69FA6865
+:102230003946304600F03EFC00283BD130208DF876
+:1022400000007D6A002D08DD01236A4639463046CC
+:1022500000F030FC70BB6D1EF6D1F868B969FB69FF
+:1022600042183946304600F025FC18BB30208DF866
+:102270000000BD6A002D08DD01236A46394630465C
+:1022800000F018FCB0B96D1EF6D197F83800410780
+:102290000DD52021002C8DF8001008DD01236A46A1
+:1022A0003946304600F006FC20B9641EF6D1002005
+:1022B000BDE8F6814FF0FF30BDE8F6812DE9FC471F
+:1022C00007468A463E69BAF16F0F08BF082405D059
+:1022D0004AF02001782914BF0A2410243C25D7E9AC
+:1022E0000023BAF1640F18BFBAF1690F90469946FE
+:1022F00006D100218B4203DAD8F1000869EB4909C5
+:102300000020814508BF80451FD1386BE8B9082CF3
+:102310004CD197F83800010748D530203B2586F886
+:102320003B0043E000280ED597F8380000F0140079
+:10233000102808D17A6B7869121A386A121A511A61
+:102340000029C8BF3962BDE8F3878DF800A0404678
+:1023500049462246E317FFF723FA3032D0B26D1E0A
+:102360003A28019504DB9DF80000A0F151018A187C
+:102370007255404649462246E317FFF711FA804658
+:1023800089460020814508BF804503D0F86871194F
+:102390008842DCD3082C09D197F83800010705D50D
+:1023A000715D302902D06D1E30207055C5F13C01A1
+:1023B000B9617019F860386B8142B3DA411A396239
+:1023C0004FF6EF70398F01403987BDE8F3872DE96B
+:1023D000D04306460F4614464FF00008DFF8389405
+:1023E00012E0E00707D542464B463046394600F03A
+:1023F0001FFC06460F464046494642464B4600F003
+:1024000017FC641080468946002CEAD130463946D4
+:10241000BDE8D0832DE9F34F054641F020048DB08F
+:10242000D5E90089612C02AE09D0286B002848BF8D
+:10243000062003D408BF672C01D101202863D5E909
+:10244000002358004015401C0ED119030CD0032066
+:10245000A8619DF8380061381A2802D20FF2D061C5
+:1024600011E00FF2D0610EE058004015401C0FD172
+:1024700019030DD10320A8619DF8380061381A288E
+:1024800014D30FF2B861E868032200F0A3FCD3E193
+:10249000194621F00043B3F5801F10460DD20027E6
+:1024A000BB4208BFBA42019703D111E00FF2886125
+:1024B000E9E701AA00F0E2FC0AE0DFF8607307EB4D
+:1024C0001352DFF85C3301921940DFF85833194397
+:1024D000C5E90001612C0ED1E86830210170811C32
+:1024E000E9609DF8381061290CBF782158214170AE
+:1024F0006869801C6861D5E900AB2BF000430020BF
+:102500002AF00002834204BF8242002300F05A8175
+:10251000612C40F0A980286B00284CBF2120401C72
+:1025200000904046009F7F1C49460022002300F097
+:10253000DDFCD94601988DF8082038BF89F00049A4
+:10254000001F0190002FD0460DF1090040F3498192
+:1025500040F2FF71DFF8D0B20C9106464046494682
+:102560000022002300F0DAFC80F03A814800400DA0
+:1025700000F11C0210D0002A0EDD0C98824205DB0F
+:1025800009F0004040EA0B01002013E0A448084095
+:1025900040EA025140460DE029F00043002028F0B7
+:1025A0000002834208BF82420FBF40461C224046C1
+:1025B00000F0CCFC8046894600F066FDFF1F002F2E
+:1025C000044609DD00F07EFD02460B4640464946C2
+:1025D00000F08AFD80468946F01D072104E004F0E2
+:1025E0000F0200F8012D2411002C01DD491EF6D543
+:1025F000491E5CBF002200F8012DF9D5ECE0002057
+:10260000194602AA0A4400E05B1E12F80149491E5D
+:102610008442F9D00F2804D10DF10900425C521C0C
+:102620004254002904D50198001D02AE5B1C0190A4
+:10263000591E12D49DF838007218147804F130082D
+:102640005FFA88F4392CC4BFA0F13A04A044491EB3
+:1026500002F80189F1D58DF83800286B002840F187
+:10266000B080591E2963ACE0404649460022002351
+:1026700000F03CFC019938BF89F0004947F29750BF
+:1026800041436A4A91FBF2F20192D2F1070204DD62
+:1026900040464946FFF79BFE0AE05242002064494B
+:1026A000FFF795FE02460B464046494600F08EFD78
+:1026B0008046662C286BDFF87CB106BF019F0A3785
+:1026C00006273F18142FC8BF142730208DF80800A4
+:1026D00089460DF1090000E03046002F34DD064642
+:1026E0004046494600F096FE01460A4606F10803B8
+:1026F00004200A26B2FBF6F606EB860EA2EB4E028B
+:10270000303203F8012C0A22B6FBF2F202EB820E01
+:10271000A6EB4E063036401E03F8026DE9D1083FA5
+:10272000002F03F10806D7DD084600F087FE0246B9
+:102730000B464046494600F0D7FC00225B4600F0BD
+:1027400077FA80468946CBE70DF10901401A0DF171
+:10275000090604E00199491E401E0191761C31785A
+:102760003029F7D0662C02D10199491C03E0652C71
+:102770000CBF012100212B6BCB189842B8BF431E20
+:10278000002B1ED4834204DAF05C3528A8BF392020
+:1027900000DA30201946721E02EB010800E05B1ED1
+:1027A00018F80199491E8145F9D0392802D1705C89
+:1027B000401C7054002904D50198401C16465B1C2F
+:1027C0000190019800B200901BB29DF8381032467B
+:1027D000284600F034F82FE0C61D002F3FF7BEAEAC
+:1027E00030460DF10901401A009903468842C8BFDE
+:1027F0000B46002B0DF109063FF52FAF8342BFF6C4
+:10280000FEAE0DF10900C05C07287FF7F8AE0F207F
+:10281000F6E60000CBCCCC0C0000244002FCFFFF0D
+:10282000FFFF0F800000E03F0000F07FA086010066
+:102830000000F03F84D797410FB0BDE8F08F2DE93D
+:10284000F84783B006468A461746984600F004FECD
+:10285000B8F1000F406A356B90F8009003DC4FF040
+:1028600001080FF2DC27BDF930404AF0200066284D
+:1028700008BF641C15D0672840F0848014F1040F51
+:10288000C0F28680AC4280F2838096F83800641CE7
+:10289000010702D4A845B8BF454620B22D1A48BF4B
+:1028A00000250FFA84FAF068B169BAF1000F25DC4F
+:1028B0004A1C30234354002D03DC96F838000107EE
+:1028C00003D5F06800F80290521C15EB0A0FB8BF50
+:1028D0006C4220B2441941424445B8BFA046B2619F
+:1028E00071620FFA88F5F561F068B3692A463946D6
+:1028F000184400F06FFA641BB462C4E022B2904541
+:10290000084417DA4246394600F064FAB069404498
+:10291000B061AAEB0801002D716203DC96F8381053
+:102920000A0705D5F16801F80090F069401CF061D4
+:10293000B562A8E0394600F04DFAB069002D504468
+:10294000A8EB040803DC96F838100A0703D5F168F1
+:1029500001F80090401CB0610FFA88F08542F068E1
+:10296000B369B8BFA8460FFA88F207EB0A0118440A
+:1029700000F030FAB0690FFA88F10844B061681AC3
+:10298000706280E0BAF1610F14D14FF0700A16E066
+:10299000A84504DA96F838100A0758BF45466D1E58
+:1029A00048BF0025BAF1670F14BF4FF0450A4FF03A
+:1029B000650A04E0BAF1410F08BF4FF0500AB1694F
+:1029C000F368481CB061002D17F8012B5A5403DC42
+:1029D00096F838100A071BD5F168431CB36101F85B
+:1029E0000090002D14DDA8F101080FFA88F085424F
+:1029F000F068B8BFA8460FFA88F23946184400F0CC
+:102A0000E9F9B0690FFA88F108446D1AB06175628E
+:102A1000F068B1690844002C80F800A003D42B2191
+:102A20004170811C03E02D2141706442811C002013
+:102A30006A460AE023460A2493FBF4F404EB840577
+:102A4000A3EB450302F8013B401C24B2002CF1DC4F
+:102A5000012806DC4AF02002652A04BF302201F872
+:102A6000012B48B9302001F8010B07E0401E1DF88A
+:102A70000020303201F8012B0028F7DCF068B26941
+:102A80001044091AF16196F8380000F0140010287B
+:102A90000DD17169B0694118706A4118F069411827
+:102AA000B06A4118706B8142BCBF411A316204B0F8
+:102AB000BDE8F087F8B505460E4617461C460020CF
+:102AC00074B117F8011BB068A847B06030B1F06A64
+:102AD000401CF0620020641EF3D1F2BD4FF0FF30C5
+:102AE000F2BD00007072696E74665F733A20256EE5
+:102AF00020646973616C6C6F776564007072696ED5
+:102B000074663A2062616420256E20617267756D7B
+:102B1000656E74007072696E74665F733A206261EC
+:102B20006420257320617267756D656E7400000006
+:102B30006E616E004E414E00696E6600494E460061
+:102B4000300000000278C9B28A421AB11CBF10F8E6
+:102B5000012FF9E718BF00207047000080B508B9C1
+:102B60000FF21C0005490B681BB122220021984777
+:102B700001E000F077FC222002BD00008424002048
+:102B8000636F6E73747261696E742068616E646CD9
+:102B900065723A20626164206D65737361676500D8
+:102BA00000F10103810704D010F8011B89B18107EE
+:102BB000FAD10268B2F10131914311F0803F04BFB4
+:102BC00050F8042FF6E710F8011B11B110F8011BA3
+:102BD000FBE7C01A70470000C9B2830706D0521E37
+:102BE00022D310F8013B9942F7D11FE0083A13D3E2
+:102BF00002F1040241EA012141EA014150F8043B9B
+:102C0000121F21BF4B40A3F1013C2CEA030C1CF026
+:102C1000803FF3D0C9B2001F083210F8013B521EAA
+:102C200028BF91EA030FF8D818BF0120401E704753
+:102C3000B0B581EA030C0CF0004C40F2FF7515EAC8
+:102C400011541DBF15EA1357AC42AF4239E0E419E5
+:102C500023EA455343F48013C90241F0004141EA9D
+:102C6000505EC7021100A7FB020200284FF00000CF
+:102C7000EEFB01204FF00001E3FB072118BF42F0FB
+:102C80000102401800214941E3FB0E01A4F58064D4
+:102C90000F0302D252004041494154F101046CDD5E
+:102CA000470872F1004250F1000051EB0451A1F5C8
+:102CB00080115CBF41EA0C01B0BD4CEA0551002017
+:102CC000B0BD05EA1357AC4214BFAF4241E050EA31
+:102CD000410E1CBF52EA430E02E061460020B0BD27
+:102CE00024423C441BD15FEA070EF6D0090302BF21
+:102CF00001460020AEF1140EB1FA81F7AEEB0704E5
+:102D000001FA07FE0C37C7F1200100FA07F7C840A7
+:102D10004EEA000E23EA455343F48013A2E733F052
+:102D20000043B3FA83F704BFB2FA82FE77440B3F45
+:102D3000E41BB7F1200E2FBF02FA0EF3BB40C7F120
+:102D4000200E22FA0EFE38BF43EA0E03BA40641C7E
+:102D500082E750EA410E14BF52EA430E6FF00001C1
+:102D60004FF4001717EB430F8ABF194617EB410FBB
+:102D7000B5E74CEA05510020B0BDD4F10104B4F12F
+:102D800020070FDAC4F12007520828BF42F00102E1
+:102D900010FA07F501FA07F7E1BF2A43E04038438C
+:102DA000E1400FE0352C98DCC7F1200452EA4002E4
+:102DB00020FA07F218BF42F0010231FA07F0A140F1
+:102DC0000A43002172F1004250F1000051EB0C0166
+:102DD000B0BD000062B38B0708D0521E11F8013B52
+:102DE00000F8013B00F024808B07F6D1830740F008
+:102DF000208000BF103A07D330B4B1E83810103A41
+:102E0000A0E83810F9D230BC530724BFB1E808104D
+:102E1000A0E8081044BF51F8043B40F8043BD20737
+:102E200024BF31F8022B20F8022B44BF0B7803702B
+:102E30007047121F17D35B0009D151F8043B20F8EB
+:102E4000023B1B0C121F20F8023BF6D20BE051F89C
+:102E5000043B00F8013B1B0A20F8023B1B0C121F2D
+:102E600000F8013BF3D238BF121D521E24BF11F8E7
+:102E7000013B00F8013BF8D87047000010B514463C
+:102E800000F002F8226010BDC1F30A5343B14A00BA
+:102E900012F5001F28D2A3F2FE32A1EB02517047B7
+:102EA00050EA410C20D001F0004C31EA0C01B1FA9B
+:102EB00081F204BFB0FA80F3D2180B3AB2F12003CA
+:102EC0002CBF00FA03F1914041EA0C013EBFC2F170
+:102ED000200C20FA0CF319439040524240F2FD338B
+:102EE000D21A01EB03517047002270474FF4001CC7
+:102EF0001CEB410F94BF1CEB430F09E041EA030CAC
+:102F000050EA4C0C52EA0C0C03D2994208BF904292
+:102F1000704714BF8B428242704700004FF4001C80
+:102F20001CEB410F94BF1CEB430F09E041EA030C7B
+:102F300050EA4C0C52EA0C0C03D28B4208BF82427E
+:102F4000704714BF9942904270470000124254D417
+:102F500040F2FF7C1CEA11530FD0634531D09B181F
+:102F600063453CBF01EB0251704701F0004141EA6B
+:102F70000C510020AFF30080704750EA410320D08D
+:102F800001F0004C91EA0C011CD0B1FA81F30B3B2B
+:102F90009A420DD9D21A994051EA0C01C3F1200C82
+:102FA00020FA0CFC61449840531C40F2FF7CD7E7A8
+:102FB000914041EA0C01C2F1200C20FA0CF31943B4
+:102FC00090407047B0FA80F31533202BE0D3202ACD
+:102FD000EED3203A203B9A4209D9D21A00FA03F1E3
+:102FE00041EA0C010020531C40F2FF7CB8E700FAD4
+:102FF00002F141EA0C0100207047524240F2FF7C8E
+:103000001CEA11530DD06345DBD0B2EB030C3CBF7F
+:10301000A1EB025170470CF1010221EA035141F486
+:10302000801150EA410CCCD001F0004C352A27DC4D
+:1030300030B481EA0C01B2F1200309DAC2F12003B5
+:10304000044601FA03F5D0402843D1409C400CE0EF
+:10305000C3F12002450020FA03F418BF44F0010434
+:1030600021FA03F091400C43002174F1004550F126
+:10307000000051EB0C01244230BC7FF47BAF704761
+:103080006146002076E70000C1F30A5340F2FE32A9
+:103090009B1A14DDD3F120034FEAE17208DDC90267
+:1030A00041EA505141F00040D840801850407047EC
+:1030B00003F2E13010B1D24382F0004070470020AB
+:1030C00070470000C11768B14840401AB0FA80F25A
+:1030D0009040D21CC907C2F5846241EA025202EB59
+:1030E000D02140057047000070B44FF0004591EAD0
+:1030F000030F40F1BB816B40841A71EB030603D2CE
+:10310000001BB141121973414FF4001C1CEB410F1D
+:1031100034BF7CEB430442E00C0DA4EB1356352E78
+:103120004FDC45EAC323DB0A45EAC121C912B6F1E7
+:1031300020050DDD63FA05F6EB4086EA0305124231
+:1031400018BF45F00105C01851F100010CD213E081
+:1031500062FA06F5F2405540F3415A40B340F3405D
+:103160005A408018594107D349085FEA30005FEAA6
+:10317000350528BF45F0010501F58011420875F1BC
+:10318000004250F1000041EB04514E0016F5001FC3
+:1031900070BC38BF70470020090D090570471CEB53
+:1031A000410F10D252EA43060BD0BCEB410F05D8B9
+:1031B0000C0DAB43661E342EB6DD02E0AB43801827
+:1031C000594170BC704770BC70470000F0B540F2C8
+:1031D000FF7581EA030C0CF0004C15EA11541DBF79
+:1031E00015EA1357AC42AF42E5E0BC41C1F313010D
+:1031F000C3F31303801A994143F4801304D2641E6D
+:103200004000494180185941C90241EA5051B1FB7F
+:10321000F3F603FB1611A2FB0675D7EBC020A941FC
+:1032200002D2761E80185941C90241EA5051B1FBC1
+:10323000F3FE03FB1E11A2FB0E75D7EBC020A941C4
+:1032400003D2AEF1010E80185941890241EA905132
+:10325000760546EA8E2EB1FBF3F603FB1611A2FBB0
+:103260000675D7EB8020A94102D2761E80185941FD
+:10327000C90241EA50514EEA060EB1FBF3F603FBD8
+:103280001611A2FB0675D7EBC020A94102D2761E0B
+:1032900080185941C90241EA5051B1FBF3F703FBD1
+:1032A0001711A2FB0735D3EBC020A94167F1000736
+:1032B0000CBF004247F0010766F3D5274FEA1E31E5
+:1032C000B80814F5806412DDBD0775F1004250EBBB
+:1032D0000E5051EB045111F5801F5CBF41EA0C0107
+:1032E000F0BD4CF07F6141F0E0410020F0BDBD0732
+:1032F0006D0840EA0E5041F48011D4F10104B4F19C
+:1033000020060ADAC4F120060200E04001FA06F3C2
+:10331000E1401843B24015430EE0342C13DCC6F1F3
+:10332000200445EA40056D0820FA06F2154321FA0B
+:1033300006F0A1400D43002175F1004250F100005C
+:1033400051EB0C01F0BD00205FEA0C01F0BDCFB9DC
+:1033500092185B41B3FA83F704BFB2FA82F6BF1941
+:103360000B3FB7F120062FBF02FA06F3BB40C7F1AF
+:10337000200622FA06F638BF3343BA401CB1E419DE
+:10338000641E33E77F4231F00041B1FA81F404BF9B
+:10339000B0FA80F6A4190B3CB4F120062FBF00FA56
+:1033A00006F1A140C4F1200620FA06F638BF3143E9
+:1033B000A0403C1B1AE7AC421ABF05EA1357AF42C4
+:1033C00012E050EA41061CBF52EA4306BFE750EA4A
+:1033D0004107304661461CBF41EA0551F0BD52EA43
+:1033E000430C08BFC143F0BD00204FF4001616EB9C
+:1033F000410F98BF16EB430F08BF16EB410F24BFD8
+:10340000C14305E016EB430F0CBF61464CEA055182
+:10341000F0BD0000400D491840EA81200CD2490D52
+:10342000A1F58061491C40F0004005DBD1F11F018E
+:1034300054BFC840C017704700207047014648B1CC
+:10344000B0FA80F18840C91CC1F58461090501EB1F
+:10345000D02140057047000001487047000000007F
+:103460009C150020012000F0B5B80000841A71EB13
+:10347000030604D26E40001BB141121973414FF490
+:10348000001C1CEB410F34BF7CEB430682E00C0DAB
+:10349000A4EB1356362E7BDC012E45EAC32341DC18
+:1034A00043EA525312BFD20292025B08240545EA56
+:1034B000C12141EA5051D2EBC020994125D407D116
+:1034C000B0FA80F610FA06F162D00020203608E04B
+:1034D000B1FA81F6B140C6F1200220FA02F211439E
+:1034E000B0404FEAF474B4EB465434F001064FEAAE
+:1034F00074040AD8D6F50016760D04F00044F040A6
+:1035000061FA06F25040F1404840C00A40EA41509A
+:1035100021F0004128BF5FEA500550F1000044EB64
+:10352000D12135E0DB0A45EAC121C90AB6F12005FF
+:103530000EDD42EA0242120CC5F1200603FA06F63D
+:10354000EB4042EA06056D42984161F100010DE051
+:1035500062FA06F5F240554063FA06FC82EA0C0274
+:10356000F3405A406D42904161EB030111F4801F1A
+:1035700005D1641E620502D06D004041494121F42D
+:103580008011430875F1004350F1000041EB0451F4
+:1035900070BC70471CEB410F15D223F0004352EA78
+:1035A00043060BD04FEA4C0CBCEB410F04D80C0D7A
+:1035B000661E342EB7DDEBE7801A994150EA4106CA
+:1035C00008BF0021E4E708BF1CEB430F28BF6FF0E2
+:1035D0000001DDE780B5AFF30080024A110018203A
+:1035E000ABBEFBE72600020030B5040085B008BF83
+:1035F000012043D004F50A7595F9010020B9002196
+:103600002970204600F02EFB03206870206800F02F
+:10361000FCFB00200AE004EB4011283101224A7033
+:103620000870C8810022401C00F02AF861688842B6
+:10363000F1D30020002208E004EB401101F5947161
+:103640000870401C4A7000F01BF861688842F3D390
+:1036500083B0211D68462022FFF7CCFB0EBC2068FA
+:1036600000F0D8FB002084F8240001206870E06995
+:10367000012804BF204600F000FF002005B030BD47
+:10368000CA700A614A618A61C0B2704710B500F021
+:10369000CCF801D1022010BD00F0C1F8206800F084
+:1036A000ADFBFFE7002084F8280210BD38B50446C2
+:1036B00000F0B2F8010444BF204600F09CF900F08D
+:1036C000ABF840050CD500F0A3F84FF6FF3000F042
+:1036D0009BF8204600F0F4FA0021204600F0AAF8FA
+:1036E00000F09AF8400405D500F092F84BF6FF7010
+:1036F00000F08AF800F090F8800405D500F088F812
+:103700004DF6FF7000F080F804F5187500F084F8AD
+:10371000C00420D52168B1F840204FF6FB7002406C
+:10372000A1F840204FF6F770B1F840200240A1F810
+:10373000402095F90000012804D10021297020467D
+:1037400000F0B0FE204600F0CCFA00F061F84EF632
+:10375000FF7000F059F800F05FF8000516D52068FA
+:1037600000F14002118841F0080111804FF2FF7111
+:1037700093880B409380118841F00401118000F080
+:1037800032FEC0045CBF204600F0A7FA00F044F807
+:10379000000621D5206800F140014FF67F708A882D
+:1037A00002408A8095F9000098B90A8842F0040224
+:1037B0000A800122088840F0080008802A70888A60
+:1037C000800800F03C0068600121204600F06AFE9D
+:1037D00002E0204600F081FA00F01EF8800508D5CE
+:1037E00000F016F84FF6FF5000F00EF8204600F0FB
+:1037F00063FA00F011F8C00505D500F009F84FF69E
+:10380000FF6000F001F831BD0240A1F8442070478C
+:103810002168B1F844207047206800F0E4BD012120
+:1038200084F82812206800F0D5BD044694F92802D7
+:103830000128704710B5FFF7F8FF01D1022010BD35
+:10384000012284F8282284F82410206800F0BCFDAE
+:1038500028E738B5054601F0070005EB40100C06D7
+:1038600047BF00F12804012000F59474002001F006
+:103870000701607021702261E370607808B12178DF
+:10388000E181022B04BF0020207195F92802012854
+:1038900001D1022032BD012185F828122146286875
+:1038A00000F0CAFA72E010B5044600F098F847BF7D
+:1038B0002830012200F59470002201F007014270C7
+:1038C000017094F92812012901D1022010BD00F0E5
+:1038D0008CF800F0E4FBE5E61CB501F0070400EB12
+:1038E000441404F5947400F01BF86270217011E028
+:1038F00001F0070100EB4110D0F8440170471CB5FE
+:1039000001F0070400EB4414283400F009F821709A
+:10391000012262702146006800F047FC002016BDBD
+:1039200001F007016261A3610022E261704738B5CE
+:1039300005460C46696804F00700814201D2012067
+:1039400032BD210605D505EB401000F1280101220A
+:1039500004E005EB441000F5947100224A70012048
+:10396000887004F007040C7095F92802012801D131
+:10397000022032BD012285F82822286800F0CEFC02
+:1039800024B9286805F50C7100F030FD002085F899
+:10399000280232BD1CB5044601F00F0362689A424A
+:1039A00001D2012016BD00F01AF847BF28300122CD
+:1039B00000F59470002201F007014270002282702D
+:1039C000017094F92812012901D1022016BD00F0DE
+:1039D0000CF800F0BCFC002084F8280216BD01F0B1
+:1039E000070004EB40100A067047012284F82822E1
+:1039F0000146206870472DE9F84F00F5947506469A
+:103A000027E001880AEA010141F40041018006F142
+:103A100024043068B0F85010227901EBC20140183C
+:103A200000F202400088A169C0F309002062084446
+:103A3000A0610021304600F038F9217849B1E069F1
+:103A400038B92178306841F08001A0F84C1000218D
+:103A50002170306800F144010A88130440F1E980C4
+:103A60000A8812F00F0440F68F7748F60F7A59D182
+:103A7000D206C6D50288130511D5898900F0E2F86F
+:103A8000EA88C3F30903EB6106F50C7100F0CAFC88
+:103A9000306800F0D1F8304600F0F9F8D9E71104A9
+:103AA000D7D500F0C9F83068B0F8501000F0CAF867
+:103AB000C3F30903002BEB611CBF696900290AD01D
+:103AC000EA8800F0AFFC6869E96908446861002190
+:103AD000304600F0E2F83068B0F85010411828691C
+:103AE00001F2064120B9088848F2FF32104009E08F
+:103AF0003E2805D24208C00748BF521C900203E08E
+:103B00004009800240F4004008804BF68F72306814
+:103B10000188114081F4405141F4004141F080019D
+:103B2000018096E730F824805FEA084106EB4419EB
+:103B300057D530F824100F4047F0800720F8247044
+:103B400009F594773068397B71B9B0F8503039781D
+:103B500003EBC103C21800F07DF82DD0FA88796913
+:103B60005B4600F05FFC27E039780B4630F82330E5
+:103B70005A04B0F8503003EBC10107D5421802F2E5
+:103B8000024200F069F80AD03A8904E0421800F0D5
+:103B900061F804D07A895B46796900F043FC3168AA
+:103BA000387831F8202048F68F731A4042F40042EA
+:103BB00042F0C00221F82020F9695944F96179697D
+:103BC00001EB0B027A61BB6913B139698B4504D2F1
+:103BD0003978304600F061F803E039783046FFF775
+:103BE0007BFE5FEA086020D5316831F824200AEABC
+:103BF000020242F4004209F1280021F82420326830
+:103C00000178B2F8503003EBC103D21802F202423D
+:103C100012884369C2F30902C2611A44836942618E
+:103C2000002B304602D100F040F812E7FFF767FEA4
+:103C30000FE70020BDE8F28F01880F4047F08007B2
+:103C4000078070472A7801EBC201411801F2064152
+:103C50000B88704702F206421188C1F3090BBBF1D1
+:103C6000000F704780B56048016841F080610160D5
+:103C70000022006800F08060009006210098142067
+:103C8000FDF7B0FFBDE802401420FDF7C8BF00F506
+:103C90000C71D0F8700200F036BC00EB4112D0F885
+:103CA0007002D2F83C2100F058BC00EB4112D0F871
+:103CB0007002D26B00F090BCD0F8700200F01EBD14
+:103CC00010B50446D4F8700200F0DBFCD4F87002A2
+:103CD000BDE81040012100F0FDBCD0F8700200F0FA
+:103CE000FCBCD0F8700200F000BD10B53F4C40495C
+:103CF0002160C4F87002082161600021E1600221A6
+:103D00002161A1600021A161C0F8C0422046FFF7F7
+:103D10006BFC18230022002100F012F85823002227
+:103D2000802100F00DF8C0230022812100F008F866
+:103D30004FF488730022012100F002F8002010BD2A
+:103D4000204600F082BB80B5D0F8C002FFF79EFC91
+:103D5000002002BD10B51C461346D0F8C002224612
+:103D6000FFF777FD002010BD80B5D0F8C002FFF747
+:103D70009AFD002002BD80B5D0F8C002FFF7D7FD44
+:103D8000002002BD80B5D0F8C002FFF703FE00207E
+:103D900002BD81B0D0F8C00201F07F0200EB4210FA
+:103DA00009064CBF90F82A0090F82A0101B070472C
+:103DB00080B5D0F8C002FFF73DFD002002BD80B500
+:103DC000D0F8C002FFF79BFD002002BD80B5D0F8FF
+:103DD000C002FFF781FD002002BDD0F8C002FFF74E
+:103DE00087BD04487047000058000058D4150020D3
+:103DF000006800404818002070470000B0F84010EC
+:103E000041F43F4141F08001F2E2B0F8402044F239
+:103E10007F01F1E20EB4012120F8401F0021018052
+:103E200081800182018841F43F4141F0800101809D
+:103E3000002003B0704700002DE9F8470B4648F614
+:103E40008F111D780246002032F825600E40D97887
+:103E500003290CD8DFE801F002080C0546F40076CF
+:103E600006E046F4C06603E046F4806600E0012008
+:103E700048F28004264322F8256048F68F751978A9
+:103E80000E4632F826702F403943214322F826107F
+:103E90004BF68F76197B93F8009000294CF280073F
+:103EA00048F6BF7C48F2C00E67D1B3F806A04FF6C3
+:103EB000FE7101EA0A0A59780029B2F8501011443B
+:103EC0001ED001EBC90101F58061A1F800A01978AD
+:103ED00032F82160760606D532F8216035404EEA88
+:103EE000050522F821501978DB78012B32F82130B2
+:103EF0000CEA03030EBF1C4383F020031C43CAE0FB
+:103F000001EBC90909F20449A9F800A0B2F8501060
+:103F100002EB010C19780CEBC10C19690CF2064C80
+:103F200031B9BCF800E048F2FF3101EA0E010CE0C3
+:103F30003E2908D24FEA510EC90748BF0EF1010EC3
+:103F40004FEA8E2E03E04909890241F4004EACF895
+:103F500000E0197832F821C05FEA4C4C06D532F8FF
+:103F600021C005EA0C053D4322F82150197832F8AA
+:103F700021301E4086F440568CE032F8291029404A
+:103F800041F4014141F0800122F82910B2F85010AB
+:103F9000B3F808A002EB0109197809EBC10101F59A
+:103FA00080694FF6FE7101EA0A01A9F80010B2F823
+:103FB0005010B3F80A9002EB0108197808EBC10819
+:103FC00008F204484FF6FE7101EA0901A8F8001052
+:103FD000597893F80080002932F828102BD1490431
+:103FE00005D532F8281029400F4322F82870197897
+:103FF00032F821707F0606D532F821702F404EEA44
+:10400000070722F82170197832F821703D404EEAF6
+:10401000050522F82150197832F821502E4086F4F7
+:104020004056264322F82160197832F821300CEAF4
+:1040300003031C432FE0490405D532F8281029401A
+:10404000394322F82810197832F821805FEA48684D
+:1040500007D532F8218005EA08084EEA080E22F852
+:1040600021E0197832F821E005EA0E053D4322F8F7
+:104070002150DD781978012D32F821500CEA050520
+:1040800018BF85F02005254322F82150197832F811
+:1040900021301E40344322F82140BDE8F2872DE94B
+:1040A000F041024691F800C048780B7B4BF68F7EBA
+:1040B0004CF2800448F2800848F6BF7548F2C0060A
+:1040C00048F68F77ABB9002832F82C0008D04006AC
+:1040D00036D532F82C0007403E4322F82C602FE002
+:1040E000400456D532F82C0007403C4322F82C40BF
+:1040F0004FE0002832F82C0029D1400405D532F8D1
+:104100002C003840044322F82C40087832F8203044
+:104110005B0605D532F820303B40334322F820308F
+:10412000087832F820301F403E4322F8206008789B
+:1041300032F820300EEA030348EA030322F8203065
+:10414000087832F820100D4048EA050128E04004C4
+:1041500005D532F82C003840204322F82C0008788E
+:1041600032F820305B0605D532F820303B401E4344
+:1041700022F82060087832F820301F403C4322F8B3
+:104180002040087832F820301D4048EA050522F822
+:104190002050087832F820100EEA010148EA0101A7
+:1041A00022F820100020BDE8F081F8B50E46054643
+:1041B00072783469B069012A48F2800748D1844294
+:1041C00032BF001B04460020B061307B40B9F2884A
+:1041D00000F0A0F800F097F800F2024004802EE012
+:1041E0003078C10035F820004206B5F85000284468
+:1041F00005D5091801F206410C80728904E00918FE
+:1042000001F202410C80328900F084F8707848F69F
+:104210008F7140B9307835F82020114041F40041C9
+:1042200041F0C00109E0012809D1307835F820209B
+:10423000114041F4404141F0800125F820103178CF
+:1042400035F8212048F6BF70024082F030024EE07F
+:10425000844232BF001B04460020B0616009317BFC
+:104260008302002943F4004304F001004FEA540C98
+:1042700018D0AAB900F040F801F202413CB9B1F8F7
+:1042800000E0202262F38F2EA1F800E008E03E2C2F
+:1042900005D2624600B1521C92020A8000E00B80F7
+:1042A0007178A9B900F028F801F206412CB90A8802
+:1042B000202060F38F220A8011E03E2C06D208B144
+:1042C0000CF1010C4FEA8C20088008E00B8006E01E
+:1042D000012904D100F017F800F2064004804BF6E3
+:1042E0008F70317835F82120024082F44052174314
+:1042F00025F821700020F2BDB5F850103278691809
+:1043000001EBC2017047B5F850003178281800EB76
+:10431000C10070477169A3B2284672E018B50A78E7
+:10432000497830F82240002948F2800305D048F649
+:10433000BF710C4084F0100404E04BF68F710C4008
+:1043400084F48054234320F82230002012BD30B57D
+:104350000A7B002A36D14A780C78002A30F82420CB
+:1043600048F2800348F68F7516D0520608D530F80B
+:104370002420154045F4004545F0C00520F82450A0
+:10438000CA78012A1ED00A7830F8224048F6BF7158
+:104390000C4084F0200412E0520408D530F82420A8
+:1043A000154045F4404545F0800520F824500A7832
+:1043B00030F822404BF68F710C4084F44054234374
+:1043C00020F82230002030BD11B98021A0F84C1017
+:1043D00000207047B0F8581041F40041FFE7A0F802
+:1043E000581000207047B0F8440070470020704714
+:1043F000A0F84010002070470A40A0F8402000209C
+:10440000704710B580185B1C00F580605B0807E002
+:104410000A784C7842EA0422891C20F8022B5B1EA1
+:10442000F6D110BD10B5821802F58062580806E07A
+:1044300032F8024B0C70240A4C70891C401EF7D1D4
+:10444000D80744BF1088087010BD10B50C0605D5FC
+:1044500001F0070100EB4110283003E000EB4111AF
+:1044600001F5947012B90273C38004E00381012145
+:104470001B0C01734381002010BD016800F518700A
+:104480000122826000220270B1F8540040F0010065
+:10449000A1F85400B1F8540040F00200A1F8540013
+:1044A00000207047704738B508B9022032BD00F5CA
+:1044B0002774A3690BB10025A56101B161610121D8
+:1044C00021700270FFF711FC002032BD024600206F
+:1044D00011B1C2F8B41270470220704780B5FFF7DF
+:1044E00032FC002002BD10B5D0F8B42202241AB16B
+:1044F0001268904700B90024204610BD80B5D0F85E
+:10450000B422536806E138B5044604F52A752846F6
+:1045100000F00CFB04F5257001210160418B416026
+:10452000017D11F01F0003D002280BD005D30EE04F
+:104530002946204600F0F2F80DE02946204600F01A
+:1045400065F908E02946204600F085F903E001F00E
+:10455000800100F03EF8002032BD38B50446104618
+:104560000A0004F5257328D1196803291DD104F523
+:10457000B0714A680D68AA420BD2AD1A0D6095421F
+:1045800038BF2A46014692B2204600F02CFB00209C
+:1045900032BD186A016921B1187A032804BF204688
+:1045A0008847204600F027FBF1E70529EFD10020DE
+:1045B0001860002100F00DF8E9E7186A82692AB155
+:1045C000187A032802D120469047E0E7022032BD46
+:1045D00080212046FFF7CFBB38B5044608001346BC
+:1045E00004F5257542D12868022832D1226A616A11
+:1045F000914207D2521A2262194692B2204600F026
+:10460000E0FA11E0E269B2FBF1F001FB102090B991
+:104610008A4210D3686882420DD2002200212046CF
+:1046200000F0CFFA0020686000230022002120461D
+:10463000FFF7CCFB13E0286AC16821B1287A032870
+:1046400004BF20468847FFF7C3FF204600F0DAFA90
+:1046500005E0042818BF002801D1FFF7B9FF287B27
+:10466000012804BF00212973002032BD286A426955
+:104670002AB1287A032802D120469047F4E7022085
+:1046800032BD10B50446402300220021FFF762FB33
+:1046900004F5AC700121016040234021C16000227B
+:1046A00080212046FFF756FB0120A06104F525720A
+:1046B0004020606201201072002010606060106174
+:1046C000506A28B1126A61685368C9B22046984797
+:1046D000002010BD01740020704700F5277001789C
+:1046E0004170042101700020704700F527700178A7
+:1046F000042904BF427802700020704780B500F59D
+:1047000027710A78032A03D18969C96901B18847E9
+:10471000002002BD9847002002BD00007CB5044681
+:10472000087810F0600004F5277508D0202818BF1D
+:1047300040282DD1AA6993682046984764E04878BC
+:10474000092825D8DFE800F03D5524502409052428
+:104750002B27204600F012F956E08A88002A04BF71
+:10476000C888002814D14E88802E11D228780328BA
+:1047700006F07F060CD0AE7031462046FFF718FBDE
+:1047800000F0F9F8002E14BF0220012028703BE051
+:1047900000F083F938E0204600F081F934E0C88861
+:1047A0000128F5D12A78521E012A04D9921EEFD190
+:1047B0000122211D14E00020A060012204F1080163
+:1047C0000EE02878401E0228E2D8C8880228DFD1EF
+:1047D000A868012100B10321E160022204F10C016B
+:1047E000204600F0E6F90FE0488801280CD10121AD
+:1047F00007E02878401E0228CAD84888012803D13B
+:104800000021A96000F0B7F8002076BD38B50D464C
+:104810000446287810F060001CBF2028402816D1DC
+:1048200004F527721178491E022910D82879022828
+:104830000DDA926993682946204698470146E88830
+:10484000002808BF002904D100F095F801E000F02D
+:1048500023F9002032BD7CB50446084604F52773D1
+:104860000278017912F0600506D0202D18BF402D86
+:1048700064D100F07BF864E002F06002202A03D1EA
+:1048800000F074F840B276BD42788AB3012A12D0A3
+:10489000032A53D11A78022A13D0032A4ED1428810
+:1048A0001ABB002918BF80291FD0C088E8B920464C
+:1048B000FFF761FA19E01A78022A02D0032A0CD015
+:1048C0003CE0002918BF802938D02046FFF753FA72
+:1048D00080212046FFF74FFA33E0408888BB11F073
+:1048E0007F0F1CBF2046FFF74DFA00F044F828E088
+:1048F000142201F07F051B7855436619022B06F53B
+:10490000AA7502D0032B10D018E0002918BF802907
+:1049100014D1080648BF06F11405002028600222C1
+:104920002946204600F045F90BE001F00F0312FB89
+:1049300003F20B06224406D5926972B9014600F0D3
+:10494000ACF8002076BDD2F85821002AF6D0002914
+:1049500018BF802904D10020E0E706F11405F6E72E
+:104960002046FFF716FA00B10120D7E79A6993684D
+:10497000014620461847204600F03DB938B50446A8
+:1049800000200D46ADF8000004F52C726888010A7D
+:10499000012908D0022924D0032930D0062962D069
+:1049A000072968D071E0126894F91000136869460D
+:1049B0009847BDF8001079B1E98879B1BDF80010C9
+:1049C000EA88914288BF1146ADF800100146BDF853
+:1049D0000020204600F0EDF8E88808B9FFF7CBFF8B
+:1049E00031BD94F9100051680028684604D1896AE5
+:1049F000884702214170DCE7C96A8847F9E7C0B2FD
+:104A0000052842D8DFE800F0030B131A21281068AC
+:104A10004268002A39D000F03BF89047C9E7106897
+:104A20008268002A31D000F033F89047C1E710685F
+:104A3000C26852B300F02CF89047BAE710680269D8
+:104A40001AB300F025F89047B3E710684269E2B165
+:104A500000F01EF89047ACE710688269AAB100F038
+:104A600017F89047A5E794F9100070B951684A6BA0
+:104A7000684690479DE794F9100030B951680A6B79
+:104A8000684690470722427093E700F005F831BD71
+:104A900094F9100069467047294620465AE07CB5D3
+:104AA0000D460446204E688830703178084602284A
+:104AB0002DDA94F89C22022A02D0032A0FD02BE090
+:104AC00041B16060032084F89C022046FFF70BFD93
+:104AD00002281CD02046BDE8764000F08CB841B9D1
+:104AE000022084F89C02002060602046FFF706FD4B
+:104AF000F0E761688842EDD0C9B22046FFF7FEFCBE
+:104B0000317861602046FFF7EEFC0228E2D12946A9
+:104B10002046BDE87C401DE0FFF7BEFF317820460F
+:104B2000BDE87C40FFF7EABC882400200A780270C8
+:104B30004A784270CB788A7802EB032242804B7924
+:104B40000A7902EB032282808A79C97902EB012279
+:104B5000C280704710B504468021FFF70CF920464B
+:104B6000BDE810400021FFF706B900280B4600D130
+:104B7000704730B50146002400E0641C11F8015B69
+:104B8000002DFAD12406E40DA41C148011781970AC
+:104B900002220321597008E010F8011BD4B2521C04
+:104BA0001955D4B200211955521C01780029F3D1AE
+:104BB00030BD80B513460222C0F89422C36103625F
+:104BC00001E080B513460A460021FFF7F8F80020FF
+:104BD00002BD80B513460322C0F8942200F5AE72E0
+:104BE0001360536001E080B513460A460021FFF7C9
+:104BF000EDF8002002BD80B50421C0F89412002316
+:104C00000022E1E780B50521C0F8941200230022BC
+:104C1000ECE70000DFF8F8140A6892B200E0024600
+:104C2000086880B28242FAD170472DE9FC410446FF
+:104C30001825DFF8E084DFF8E064684308EB00073C
+:104C40003078062808D131787170347078754FF05B
+:104C5000FF307060002039E000F077F8B96809187B
+:104C6000B96008F10803B96832786A439A589142EA
+:104C7000327813D308F1150315FB02FC13F80C303E
+:104C8000062B25D008F108066B43F358994222BF42
+:104C900008F115036A439A5CEED219E011463378A5
+:104CA00069439A420BD008F1140308F1150C5B5CC0
+:104CB00015FB03F50CF805407A753B7500E07A7535
+:104CC00008F114025454317871703470BDE8F681E3
+:104CD0001146694308F115035B5C062B04D008F10B
+:104CE000140615FB03F574557B753A7508F115022A
+:104CF0005454EBE7F8B5DFF82034DFF818541E7889
+:104D0000182402466243B0422A4404D118785870ED
+:104D1000507D18700FE0167D507D92F815C005F19A
+:104D200015076643062807F806C004D0167D14351B
+:104D300014FB00F42E55012010731878062802BFCA
+:104D400000294FF0FF315960F1BD10B5DFF8C843BD
+:104D5000606810F1010F0FD0FFF75CFF6168DFF8AA
+:104D6000BC23814261683CBF5388C918081A517836
+:104D700048431178C84000E0002080B210BD2DE902
+:104D8000F84FDFF89853DFF898B3D5F80880D8F8D3
+:104D90000000DBF800104A0500F06CF9DFF87863DA
+:104DA000DFF870A321F4806181604FF01809347836
+:104DB0000AF1080019FB04F14758FFF7C6FF8742C4
+:104DC00017D200270121B170062C3DD019FB04F445
+:104DD0000AF108010AF108020959814223BF0AF1C8
+:104DE00008010959091A002111510AEB04014C7DEF
+:104DF000EAE7A9884118B94202D2AF880021E2E768
+:104E00003F1ADFE7022802DA2878012800D07F1E47
+:104E1000D8F80000C1684A07FAD500F031F9DBF88C
+:104E20000C00000CBFB247EA0047CBF80C70FFF74C
+:104E3000F1FE7060A8680068816841F4806181605B
+:104E4000AFF30080BDE8F18FB8B20028DAD1FFF7E8
+:104E5000E1FE70600320BDE8F24FFCF71BBF2DE9B7
+:104E6000F843EFF3108872B6AC4DAA4BA8680168FE
+:104E7000CA224A6253204862A74A886820F48060A8
+:104E8000886018201678374647431F4497F90C006E
+:104E9000022827D13C68D7F810901056F8B197F93E
+:104EA0000D20012A0AD101213046FFF723FF88F3A4
+:104EB00010887968304600F0F0F804E088F3108834
+:104EC000304600F09BF8A8680068CA21416222467B
+:104ED000532141624846314600F02CF90BE0FFF7C0
+:104EE0004EFF06E0C8684207FCD500F07EF88D4909
+:104EF000086088F31088FF21A86802685162BDE845
+:104F0000F183F8B5854CA160CA2209684A62532230
+:104F10004A62834A136843F020031360136803F066
+:104F20000703C3F10403237095682D0C05F07F057A
+:104F30006D1C6570EDB29268C2F30E02521C628065
+:104F400092B2521E6A43A2F5A072DA404FF6FF7386
+:104F50009A422CBFA380A280734A136843F40023B3
+:104F60001360724B1D6845F400251D6048BB6A48FC
+:104F7000684E0123837018254FF0FF3343600023F0
+:104F80005FFA83FC06F10C0715FB0CFC4FF0000EDA
+:104F900007F80CE05B1CDFB2062FF1DB0623037081
+:104FA000886820F48060886000F01FF8D0600320DB
+:104FB000FCF77BFEA1680868826842F48042826048
+:104FC00005E0C868410544BF0320FCF763FEA16803
+:104FD0000A68FF205062002203210320FCF702FE32
+:104FE000BDE8F2400320FCF71ABEC86800F080005C
+:104FF00060F49060C8604FF400207047F8B5074631
+:10500000EFF3108472B60320FCF714FE434DAE6834
+:105010003068CA2141623A4653214162182044490E
+:105020004243895602291BD100213846FFF762FE10
+:105030003948017806290ED1306839490A68530584
+:1050400000F018F821F480618160C1684A07FCD53E
+:1050500000F016F804E04078884218BFFFF78FFE92
+:10506000A9680A68FF2050620320FCF7D8FD84F38A
+:105070001088F1BD02D5C1684A07FCD48168704729
+:10508000C16801F0800161F49061C1604FF40020BB
+:10509000244908600320FCF708BE2DE9F041804652
+:1050A0000F46424618201B4942438C1894F90C00C5
+:1050B000022804BF4046FFF7A1FFEFF3108572B648
+:1050C0000320FCF7B7FD154EB0680068CA214162A5
+:1050D0005321416202202073A76067604046FFF7BA
+:1050E000A4FD0D490A784978914202D0FFF747FEA6
+:1050F00002E0A168081AA060FF20B1680A68506247
+:105100000320FCF78CFD85F31088BDE8F0810000DA
+:10511000282800404420002074240020302400204F
+:10512000082800400C080058000800588008005863
+:10513000502000201047000010B586B002A800F0F3
+:105140007CFA20B10121032000F060F831E00FF279
+:10515000E4342246012100F0A9FA0FF2144200F0D3
+:1051600051F89DF80A009DF8091001900091012165
+:105170009DF808300FF21442002000F097FA9DF8D5
+:105180001100102809D0112804D050280AD10FF29C
+:10519000444204E00FF2244201E00FF2084200F022
+:1051A00031F803E00121032000F030F8224600F03E
+:1051B00029F8A64C211D04F5847000F033FBA448A7
+:1051C00020600121022000F0E0FB00F0E9F80FF27E
+:1051D00091120021022000F052FC00F017FA0FF2A9
+:1051E00009220021012000F04AFC00220FF24901AF
+:1051F000002000F0AFFC18B10121012000F006F8FA
+:1052000006B010BD0121002000F050BA03280FD8CD
+:10521000DFE800F00205080B0FF24C200BE00FF264
+:105220006C2008E00FF2882005E00FF2B02002E0C9
+:1052300000210FF2CC2020E0400700D4704780B559
+:10524000002000F09FFC801E012802D9801E08D09B
+:105250000BE0012000F0EEFCBDE80240022000F06F
+:10526000DFBC012000F0DCFC02E0012000F0E2FCE9
+:10527000BDE80240022000F0DDBC80B5009103468D
+:105280000FF28C220121002000F010FA002000F023
+:10529000DBFC00F00BF8012000F0D6FC00F006F873
+:1052A000022000F0D1FC00F001F8EFE74FF4FA70B3
+:1052B00000F0CABD6548016801F10C007047634801
+:1052C00000E06448016801F10B00704780B55F4859
+:1052D00000684FF42071A0F80910016989000831B5
+:1052E000C17200F04EFEBDE80240022000F0F0BBAB
+:1052F000022000F0E5BB574908604868401C486040
+:105300000021012000F0C8BB042000F0E1BBF8B58B
+:1053100004460D460026A05D721C0D280DD0AE423D
+:1053200038BF1646F7D308E0811921444978215443
+:10533000401CA842F8D32846F2BDAE42FBD0464FEF
+:105340002146381DFDF746FD701C388000210220E3
+:1053500000F0A2FBAD1B00206D1EEAE7000000007C
+:1053600038B53E4CFF2104F10C00FCF739FB3A4DF7
+:105370002A88291D04F10C00FDF73CFD2888E07205
+:105380004FF480710020A4F8090068802880281D4F
+:10539000FCF726FBBDE8314000F0FABD00F006BE88
+:1053A0002F482E49416001F58672026001F50672B0
+:1053B000826000F0DCBD38B5044623A1E57A04F133
+:1053C0000C0000F071FE40B1294604F10C00BDE86C
+:1053D00038400FF2110200F047BABDE83140DDE776
+:1053E00000000000DAE7000010B51A4C606858B100
+:1053F0006268022A04D300210020FFF707FF01E0C2
+:1054000000F078FE0021616010BD38B50022154C17
+:1054100007E0D4F80031855CE5545B1CC4F800312A
+:10542000521C0B689A42F4D3D4F800112046FFF7BF
+:105430006EFF30B1D4F80011884218BFC4F80001E3
+:10544000F2D1C4F8000131BD3E200000681A0020EE
+:10545000840803203C240020801D002078070320BE
+:10546000400B03207C1C00204552524F52203A2012
+:105470004552525F5245435F4D554C54495F4D5321
+:10548000475F46524F4D5F4D302000004552524F0E
+:1054900052203A204552525F5448524541445F538E
+:1054A00045545F53544154455F434220000000007F
+:1054B0004552524F52203A204552525F544852456D
+:1054C00041445F45524153455F50455253495354FF
+:1054D000454E545F494E464F200000004552524F02
+:1054E00052203A204552525F5448524541445F434E
+:1054F0004845434B5F574952454C455353200000A4
+:105500004552524F5220556E6B6E6F776E200000E1
+:105510002A2A2A2A20466174616C206572726F7291
+:10552000203D2025732028457272203D20256429C6
+:10553000000000002A2A2A2A2A2A2A2A2A2A2A2A73
+:105540002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ABB
+:105550002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AAB
+:105560002A2A2A2A2A2A2A2A2A2A2A2A2A2A0000EF
+:10557000574952454C45535320434F50524F434592
+:1055800053534F522046573A00000000564552539D
+:10559000494F4E204944203D2025642E25642E2568
+:1055A0006400000046572054797065203A20546802
+:1055B0007265616420465444000000004657205440
+:1055C000797065203A20546872656164204D5444B6
+:1055D0000000000046572054797065203A2053742B
+:1055E0006174696320436F6E63757272656E7420B7
+:1055F0004D6F646520424C452F54687265616400AC
+:1056000000F08CFE9DF80E0005B000BDF8B500F06E
+:1056100003F84FF66740F3E76B460022002170471E
+:10562000C0B28DF800006B466A4601217047F8B59C
+:10563000FFF7F6FF4FF66B40E2E710B5194909682E
+:105640004FF6FC7202EA810217498A181368196939
+:105650000B0A0C0E047083700C0CC1F30313C3709F
+:1056600001F00F01447001711368596901720B0C4C
+:1056700083710C0E0B0AC3714471136899694172EE
+:10568000146861680B0E83720B0C090AC3720173F4
+:10569000126891680B0E0A0C43738273C173002069
+:1056A00010BD00003C4000580000032008B42DE964
+:1056B000F0470546012DC9B00E4614460AD00CD35A
+:1056C000032D01D003D308E00FF2481307E00FF2D7
+:1056D0003C1304E00FF22C1301E00FF240130FF221
+:1056E000B4094A464FF4807108A800F067FE761EA0
+:1056F000074608A980B2042EC7F5807801EB000A9E
+:1057000018D8DFE806F0130F0B07030011220FF281
+:10571000D80112E012220FF2BC010EE00E220FF2AD
+:10572000A4010AE014220FF2880106E011220FF210
+:105730006C0102E005220FF2C4016846FDF75AFB36
+:105740006B4615A21FFA88F1504600F037FEC719C4
+:105750002246B9B208A8BCB251ABC1F58071204451
+:1057600000F04EFEC71908A8BAB20D2181547F1C63
+:10577000BAB20A2181547F1CBFB20021C155042D49
+:1057800003D208A9484600F059FE49B0BDE8F00729
+:105790005DF808FB25730000257320005B4D342065
+:1057A0004150504C49434154494F4E5D0000000068
+:1057B0005B4D34204F50454E5448524541442041A2
+:1057C00050495D005B4D34204C494E4B20415049BF
+:1057D0005D0000005B4D3420494E5354414E43451B
+:1057E000204150495D0000005B4D34204D4553532E
+:1057F000414745204150495D000000005B4D345D4C
+:10580000000000001B5B303B39316D001B5B303BFF
+:1058100039336D001B5B303B39326D001B5B306DE3
+:105820000000000010B5514C002220606160A28190
+:1058300004F114004E49FEF736FE4E4904F11400FF
+:10584000FEF744FE04F5367104F1140000F02EFF5B
+:1058500004F11400FEF742FEBDE810400FF24102D1
+:105860000021082000F00BB9F8B50C461546EFF3FF
+:1058700010863E4F014638682246FDF7ABFABD6000
+:10588000FC8172B697F90C0020B10121082000F0CC
+:1058900003F901E00120787386F31088F1BD000060
+:1058A00010B5324CE289216804F1140000F005FFC4
+:1058B00004F1140000F00FFF28B1BDE810400121F1
+:1058C000082000F0E9B8A068BDE81040004738B5EE
+:1058D000264D696805F1140000F0F7FE05F114008B
+:1058E00000F011FFEFF3108472B60120287395F9D0
+:1058F0000D0018B10121082000F0CEF884F31088C3
+:10590000002032BD0020704710B520281A4A02D06E
+:10591000212812D01FE008784B788C7840EA0320C9
+:10592000CB7840EA044040EA0360106008791071C7
+:1059300048795071887990710DE010680870030AF9
+:105940004B70030C000EC8708B7010790871507981
+:10595000487190798871002010BD80B5FFF755FD22
+:10596000064800F0D0FE002002BD0000B411002067
+:105970007C110020781000209C140020C811002009
+:105980000C48002101604160704710B500F00CF830
+:105990005C6819B1012904D1204301E024EA000028
+:1059A000586082F3108810BDEFF3108272B6014B7D
+:1059B000704700004C2400202DE9FC47524CDFF8D2
+:1059C0004C91A5692840A0614FF0010A4FF0FF38C3
+:1059D00030E0491C54F831000642FAD004EBC1070C
+:1059E000184079681040014208BFC7F804807E68FB
+:1059F000304000F08DF860620AFA00F086437E6065
+:105A0000EFF3108172B6626A20690AFA02F2D24399
+:105A100010402061022004EBC00353F8086C1640CC
+:105A2000401E43F8086CF6D181F31088606A59F87B
+:105A30002010884763692069A2691840104207D086
+:105A4000E069216A084203D1002103EA0206C1E7A6
+:105A500000F06DFEEFF3108972B6216960690140B4
+:105A6000A069014201BFE169206A014200F0E9FE3C
+:105A700089F3108800F04CFFA561BDE8F38738B5C5
+:105A80001446EFF3108572B600F042F81F4941F852
+:105A9000204085F3108831BD10B5EFF3108272B647
+:105AA000194B1C6904431C6153F83140204343F8EF
+:105AB000310082F3108810BD506181F31088704767
+:105AC000EFF3108172B6104AD3691843D061F4E73E
+:105AD0002DE9F0410C4C626A266A2062012101FA2C
+:105AE00002F803E03946404600F0ACFE276AE5695B
+:105AF0003D42F7D0404600F00BF825EA0707E76182
+:105B000026626062BDE8F08128100020EC210020B0
+:105B100002460020110C090404BF1020120412F0E8
+:105B20007F4F04BF083012020FF2180112F0704FBD
+:105B300004BF001D1201120FC0F11F00895C401A42
+:105B4000704700000403020201010101000000008F
+:105B50000000000038B50C461546FFF7D5FB084895
+:105B60000460FFF7A7FB9721016085600121416078
+:105B7000FFF7ACFBFFF7A3FB8068C0B232BD0000AB
+:105B80008C23002080B5FFF7BFFBFFF793FB5E215E
+:105B900000F005F8FFF793FB806840B202BD01609A
+:105BA00000214160FFF792BB454981B00A6802437A
+:105BB0000A60096808400090009801B0704778B505
+:105BC00085B0044668461421FBF70AFF0CB9012092
+:105BD00004E0012C18BF022C02D10220FFF7E4FFE1
+:105BE00000F012F80095012001900021022003909E
+:105BF00000F004F800F00EF806B070BD029169469E
+:105C000056F82400FBF7F0BE0FF2C4002D4E30F81A
+:105C10001450704756F8240000222946FBF7A8BF0D
+:105C20000FF2AC01274B31F8101053F8200001227D
+:105C3000FBF79EBF0FF29801224B31F8101053F87A
+:105C400020000022FBF794BF0FF284011D4A31F8B7
+:105C5000101052F82000FBF792BFF0B585B0044653
+:105C60000D4668461421FBF7BBFE0120FFF79CFFA1
+:105C70002800154E0FF260070AD137F81400009083
+:105C8000002101910120029002210391FFF7B7FF4B
+:105C9000012D12D137F81400009001210B4801901A
+:105CA000FFF7ACFF0FF23400045D00220F2160B259
+:105CB000FBF798FF60B2FBF7B2FF05B0F0BD000044
+:105CC0004C0000585C1000206810002000002110DB
+:105CD0001000010002000000000400002800000085
+:105CE00018B59BB000F016FE634CE06B40010ED57A
+:105CF000E06BC0000BD400F02DFE00F02BFEA06B7B
+:105D000040F48030A063A06B20F48030A06300F0EA
+:105D100055F807A85021FBF763FE68461821FBF7EA
+:105D20005FFE56480168216C41F001012164206C3E
+:105D30008007FCD54FF4807007900021149107A8CC
+:105D400000F026FE206840F0807020604FF0005286
+:105D5000216801F0807106910021069800914BF6B0
+:105D60007F30039022210491002002902021019293
+:105D70000591684600F087FF00F0ECFD00F0EAFDB9
+:105D8000A06B40F00100A063A06B8007FCD500224F
+:105D9000E06B20F4404040F48040E0633848016804
+:105DA0000260026902F05002026100F028F800F07F
+:105DB000BFFC4FF0FF30FFF7FFFDFAE7314881B03D
+:105DC000016841F4801101603F21006800F48010F7
+:105DD000009000982C4841604161016841F47C11B9
+:105DE0000160026942F47C120261016841F03F01E6
+:105DF0000160026942F03F02026101B0704710B5D4
+:105E000000F0A8FD00F0A6FD2048214C016821F417
+:105E1000407141F4807101600F21026842F4004238
+:105E200002601C48816047F6FF71C160046000F0A9
+:105E300053FFCA206062FF2153206062A068C0083F
+:105E4000C000A060616210BD38B50446FBF7C0FD1C
+:105E500014F1010F054609D000F06BFD041905E0AF
+:105E60000D48016821F00401016030BFFBF7B0FD6F
+:105E7000401BA042F4D331BD580000589414005880
+:105E80008008005850000058040C0058900000583A
+:105E900000280040D823002010ED00E001F065B894
+:105EA00078487949016001F12002426001F1300235
+:105EB000826001F13C02026201F14402C26001F120
+:105EC0004C02026101F16802426101F16C028261DF
+:105ED0007831C16101F05BB838B56D4C6B4D07E0AE
+:105EE000694605F1100001F003F900982168884720
+:105EF00005F1100001F0D3F80028F1D031BD64485D
+:105F00004168084738B50446624D284601F0C4F898
+:105F10005C48C068A1680160456001F054F85E48C3
+:105F20002168016061684160002032BD80B555493B
+:105F3000CA6813681020187201F04BF8002002BDE7
+:105F40005049CA68544910680B68184738B5524C14
+:105F5000504D06E06946284601F0CAF8009861688D
+:105F60008847284601F09BF80028F3D031BD454909
+:105F7000896842684A6002688A608068086001F047
+:105F800038B840498A6891680820087201F03BB827
+:105F90003C498A6851680A20087201F03DB83949C5
+:105FA0008A6813680D20187201F03BB835498A6879
+:105FB00013680D20187201F03CB832488168886877
+:105FC000FFF796B92F4881680868FFF794B92D4804
+:105FD00081684868FFF7EFB938B504462F4D284669
+:105FE00001F05AF82E4801F057F826480069A168D8
+:105FF0008160E168C160056121680160616841609C
+:10600000216941616169816131BD80B501462448E2
+:1060100001F058F8BDE802400FF2090001F011B894
+:106020000000000038B5174C1D4D08E069462846B1
+:1060300001F05EF800992069006901F043F82846F4
+:1060400001F02DF80028F1D031BD10B5154C2046D7
+:1060500001F022F80B4841690C60BDE8104001F0E6
+:1060600004B81CB50F4C06E06946204601F040F824
+:10607000009800F004FC204601F011F80028F3D04D
+:1060800013BD000000000320BC0A03209C0A03206B
+:106090005C240020B40A0320642400204C0B03205D
+:1060A00054240020540B032081EA00039B0717D1DE
+:1060B000820707D010F8012B11F8013BBAB19A42C0
+:1060C000F6D014E002680B689A42A2F1013301BFD6
+:1060D000934313F0803F50F8042F51F8043FF3D05E
+:1060E00010F8012B11F8013B0AB19A42F8D0D01AEE
+:1060F00070470000F8B5FFF7E4F80025026858493A
+:10610000521E172A00F2A680DFE802F00C13232E9D
+:10611000343B434A51586068A4707A80878F96A4B4
+:106120009DA4A41C0A68002A02D0C1688068904718
+:1061300091E084680C642100FAD042690169C0686A
+:10614000A04788E04C6C002CFBD000F08BF8A047F7
+:1061500081E086688E6431007DD08369426901697F
+:10616000C068DBB2B04776E00120FFF760FAFBF7CA
+:1061700070FD70E08A68002A6DD0C1688068904721
+:1061800069E04B68002B66D0C268816800209847A0
+:1061900061E0CA68002A5ED0C168806890475AE012
+:1061A0000A69002A57D0C1688068904753E04A695D
+:1061B000002A50D0C168806890474CE08B69002B62
+:1061C00049D00269C1688068984744E0CA69002ADA
+:1061D00041D0C168836858B290473CE00C6A002CFB
+:1061E00039D000F03FF8D2B2A04734E04C6A002C1E
+:1061F00031D0876900F036F8FFB20097A0472AE057
+:106200008C6A44B300F02EF8A04724E0CA6A12B3A7
+:10621000C1688368D8B290471DE00B6BDBB102699F
+:10622000C1688068D2B2984715E04C6B9CB100F011
+:1062300019F8DBB2A0470EE08A6B62B1C1688068D2
+:1062400049B2904707E0CB6B2BB10269C168806807
+:10625000984700E00125FFF7A2FE2846F2BD0000A6
+:106260008C23002043690269C16880687047000080
+:106270007FB50C464E4D61684E4EE8612962284656
+:1062800000F048FF2468746006F1080000F004FF85
+:10629000012000F069F801203070296841B10FF247
+:1062A000ED000FF2F10200900192029468468847D7
+:1062B0007FBD1FB53F4C04F1080000F0F0FE08BBA5
+:1062C0002156F9B1694604F1080000F011FF384881
+:1062D000C16949B10098029001228DF8042001A8FB
+:1062E00088479DF9040000E00120207094F9000027
+:1062F00018B10098FFF789FE04E0009904F1080046
+:1063000000F0D6FE04F1080000F0C9FE28B92056BE
+:1063100018B104F1080000F0A8FA1FBD2DE9F04102
+:1063200005460E4690461C46002000F01DF8214F01
+:106330007868A0F80950C672324641460C30FCF726
+:1063400049FD1B4A136900210020984748F2E800E4
+:1063500000F092FA79688A78D21C04F10800FCF700
+:1063600039FDBDE8F04101201CB51149124C096A04
+:1063700020B901B188470020207013BD0120207092
+:1063800011B1BDE81C40084713BD0000002000F01B
+:1063900070BA000010B50146064C04F1080000F088
+:1063A00091FE04F10800BDE8104000F05EBA000064
+:1063B000FC230020202400208924002008B410B5EC
+:1063C00085B007AB00240493039400290EBF019409
+:1063D0000190491E0291009404AB01A9074878443A
+:1063E0001A30FBF79DFC019901B10C70002858BFD1
+:1063F000039805B010BC5DF808FB00BF9BB2FFFF1F
+:1064000008B584B00023039300290EBF01930190C7
+:10641000491E0291009301A904AB07487844183043
+:10642000FBF77EFC019909B100220A70002858BFD1
+:10643000039805B000BD00BF5FB2FFFF0EB4C0B54A
+:10644000024603A800210190009101AB01210448FC
+:1064500078440C30FBF764FC06BC5DF810FB00BF11
+:106460009F1B00007CB50546002695F9100040B939
+:106470004FF4007300F03BF80120E8624FF4007322
+:1064800005E0402300F033F80120E86240230222B7
+:1064900001212846FDF75EFC0120C5F86C010823A8
+:1064A000032282212846FDF755FC012028644FF481
+:1064B0000770FDF796FC040005F52E7008BF012655
+:1064C000046012D040680168884704F501700661D5
+:1064D0004661026895F9100000280CBF4FF4007364
+:1064E000402301212846FDF771FC304676BD02228B
+:1064F00081212846FDF72EBC10B504468121FDF709
+:1065000033FC0020E06201212046FDF72DFC002035
+:10651000C4F86C0182212046FDF726FC002020648F
+:1065200004F52E74206838B1616848688047206897
+:10653000FDF762FC00202060002010BDF8B5044685
+:1065400004F527730D46DE6900208DF80000ADF8D4
+:1065500002000027297811F0600022D020283AD1CB
+:10656000EA88C2B1687809060AD51B6AD3F808C060
+:106570003146E047EA8831462046FEF71AFB2FE015
+:1065800006F500710870E88848703146EA882046B0
+:10659000FEF71FFB24E01B6A68789C682946A04729
+:1065A0001EE0687820B10A2809D00B2810D012E02C
+:1065B000187803280FD102220DF1020104E01878A7
+:1065C000032808D1012269462046FEF7F2FA07E0C7
+:1065D0001878032804D029462046FEF7BBFA022784
+:1065E0003846F2BD70B5044604F52E700268836823
+:1065F000CAB1142010FB01F02618F06970B103EB4A
+:1066000041139B6BB0FBF3F503FB150030B9F06150
+:10661000002300222046FDF7D2FB02E00020C2F852
+:106620001402002070BD022070BD70B500F52E74FC
+:10663000256805F50176FDF7D0FBB060206838B11C
+:1066400062683068D36805F503719847002070BD13
+:10665000022070BD10B500F52E7043680168002B54
+:106660001EBF01F500742078FF2804D062789B6873
+:106670009847FF202070002010BD4321018007486B
+:106680007047432101800648704743210180054837
+:1066900070470A210180044870470000F410002070
+:1066A000B0100020381100206C100020024602209B
+:1066B00011B1C2F8BC1200207047D0F8B80200F542
+:1066C00002700160826000207047D0F8B802C0F804
+:1066D00004120020704780B5D0F8B81289B101F5D6
+:1066E0000272D16859B90123D36091680163812195
+:1066F000936812689BB2FDF762FB002002BD012087
+:1067000002BD022002BD80B5D0F8B81269B1D1F83F
+:10671000042290F9101000290CBF4FF4007340239D
+:106720000121FDF753FB002002BD022002BD70478E
+:1067300010B52748274C88B0016841F4004101603A
+:10674000FFF71EF900F0F0FC23490020FEF7D9FB0B
+:1067500000F0F2F82148016841F480310160026CD8
+:1067600042F48032026400F004FD01210120FFF7B1
+:106770000CF90020FFF723FA0120FFF720FA02208E
+:10678000FFF71DFA01210020FFF767FAFFF788FBEA
+:10679000134A00210420FFF772F904F23C500FF273
+:1067A00045010090019169460FF23D00FFF760FD41
+:1067B0000020029004F5C96140F23C50059003911D
+:1067C000049402A8FFF708FCFFF768FB08B010BDAF
+:1067D0000800005824000320D82300209008005807
+:1067E000B36200087047000080B5406830F80B1FA6
+:1067F0004FF41242891A02D0491E0AD001BDFFF798
+:1068000024FCFEF799FCBDE8044000210120FFF7BD
+:10681000BCB883787D2B04D07E2B0AD10FF2B00256
+:1068200001E00FF28802BDE8084001210020FEF7D8
+:106830003DBFBDE800500FF2B80201210020FEF775
+:1068400035BF704780B5022902D0042902D006E086
+:10685000002006E00420FFF733F9012001E04FF0AB
+:10686000FF30BDE80240FFF7A7B800210420FFF782
+:1068700013B90120FFF724B90120FFF729B910B59A
+:10688000044604F10D01A27A921E012000F081FC61
+:106890002046BDE81040FFF7B8BB0220FAF7BBBBAB
+:1068A00013460A4601460220FAF7DCBB2A2A204595
+:1068B00052525F544852454144203A204C4C445F68
+:1068C000464154414C5F4552524F52200A0000004D
+:1068D0002A2A204552525F544852454144203A20CA
+:1068E000554E4B4E4F574E5F434D44200A0000001B
+:1068F0002A2A204552525F544852454144203A20AA
+:106900004572726F436F64653D2564200A00000084
+:1069100070470000032010B5FBF757F90F2000F077
+:1069200067FC0024002814BF012400F011F8204661
+:1069300010BD0548806870470448FFE7016841F0D2
+:10694000010101607047000050100020042004E0A5
+:10695000704700000248016841F48071016070478F
+:1069600000040058DFF864130A68030903F47F2366
+:1069700000019A4300F47F2000F082B9DFF84C2335
+:106980001368010C23EA014343EA00431360704794
+:106990002DE9F843054600242878DFF830634106E6
+:1069A000A0464FF0B0472DD5286B70B1B0F5800FE1
+:1069B00006D0B0F5000F18BFB0F5400F17D01FE09C
+:1069C000F86840F48030F860EDE0386820F08060CE
+:1069D0003860FAF7FDFF81463868000140F1D08049
+:1069E000FAF7F6FFA0EB09000228F5D90324D7E057
+:1069F000FAF7EEFFA0EB0900022840F2C980F5E7A4
+:106A00000124A0462868010531D5B06800F440781B
+:106A1000286C80452AD0FFF79DFFB8F1000FB168C0
+:106A200005D1286C21F440710143B1601EE0B068CB
+:106A300040F48030B06021F44071B06820F48030C0
+:106A4000B060286C0143B160B068C0070ED5FAF79A
+:106A5000BFFF804641F28939B068800706D4FAF753
+:106A6000B7FFA0EB08004845F6D30324A0462878DA
+:106A7000C10705D53168A869890840EA81013160FC
+:106A80002878810705D53168E86921F44061014320
+:106A900031602878C10644BFA86AFFF76FFF2878E5
+:106AA000810644BFE86AFFF769FF2878410744BFC1
+:106AB000286AFFF757FF2878010744BF686AFFF785
+:106AC00051FF2868C1051BD53168686B21F0406112
+:106AD00001433160686BB0F1006F00F0BDF8686B86
+:106AE000B0F1806F75D100F0BDF804463868000140
+:106AF00060D5FAF76DFF001B0228F7D94FF00308A5
+:106B000067E0FAF765FF001B02285BD9F6E73168FA
+:106B100021F04041316020F08050326822F0406224
+:106B200010433060A86BB0F1C05F00F095F82868A2
+:106B300041056DD53168E86B21F04051014331606A
+:106B4000E86BB0F1005F03D1F96841F48031F9607E
+:106B5000E86BB0F1805F5BD100F084F804463868E0
+:106B6000000146D5FAF734FF001B0228F7D94FF091
+:106B700003084DE0FAF72CFF001B022841D9F6E785
+:106B800000F061F8A86821F4781100F071F88146EE
+:106B9000386800017FF52CAF3969686901433961B4
+:106BA000002C7FF42EAF3168286B21F440010143A3
+:106BB000316027E700F047F8E86821F0606100F0F5
+:106BC00057F80446386800019BD539696869014364
+:106BD000396128688105AAD5A86BB0F1804F1CBF28
+:106BE000B0F1004F002892D1316821F040410843B4
+:106BF00097E700F028F8286921F0604100F038F8A4
+:106C0000044638680001B5D53969686901433961BE
+:106C10002868C10405D5F168686C21F4404101433E
+:106C2000F160286881040BD5796AE86C21F03001A5
+:106C300001437962796AA86C890840EA8101796226
+:106C40004046BDE8F2833869696820F4FE4040EAB6
+:106C5000012038613969704703D1F96841F08071CA
+:106C6000F9607047396821F080613960FAF7B0BE89
+:106C700001433961386840F080603860FAF7A8BE97
+:106C800010430860704710B511490A6842F08072DD
+:106C90000A600B680F4A23F080730B600468416838
+:106CA0000C4381680C43C1680C43016944EA014408
+:106CB00054601368406923F47C5343EA0023136053
+:106CC000116841F06001116010BD0000880000589B
+:106CD000380000580060004038B5040044D094F9F2
+:106CE000210028B9002184F82010204600F098F8EF
+:106CF00000F049F8FF2510B100F03FF834E02168BA
+:106D0000DFF8B0008A6802408A6021688A68636898
+:106D100020690343A06903431A438A602168E0683D
+:106D2000086120680169A26841EA024101612068A6
+:106D3000C16821F08001C1602068C16C89088900A8
+:106D4000C1642168CA6CE369606903431A43CA6479
+:106D500020688168880609D400F020F830B12068E6
+:106D60004562042100F01FF8012032BD2068456211
+:106D7000012184F82110002032BD206845620421E1
+:106D800084F821107047022084F82100CA2021686D
+:106D90004862532022685062204626E020460BE0DD
+:106DA0002068C0F8248084F82110002084F8200096
+:106DB00070470000BFFF8FFF70B5044640F2E93610
+:106DC0002068C16821F0A001C160FAF701FE054604
+:106DD0002068C168880606D4FAF7FAFD401BB04265
+:106DE000F6D3032070BD002070BD70B50446206846
+:106DF000C1684A0612D44FF0FF32C26040F2E93651
+:106E0000FAF7E6FD05462068C168480606D4FAF799
+:106E1000DFFD401BB042F6D3032070BD002070BDE3
+:106E200070470000C0680840884201D101207047C7
+:106E300000207047C0690840884201D10120704796
+:106E40000020704710B58C4C022100F042F838B198
+:106E50006068C043810703D5FFF778F8022036E069
+:106E6000042100F036F858B16068C043410707D5E7
+:106E7000606840F004006060BDE81040FFF7A2B811
+:106E8000102100F026F858B16068C043C10607D54C
+:106E9000606840F010006060BDE81040FFF797B8F0
+:106EA000012100F016F838B16068C043C10703D56E
+:106EB000FFF712F801200AE0082100F00AF838B1C3
+:106EC0006068C043010703D5FFF7CBF80820A06036
+:106ED00010BD2046AEE710B5674C00F043F818B976
+:106EE0006068C043810316D4042100F03CF858B90F
+:106EF0006068C043410307D5606840F4802060604B
+:106F0000BDE81040FFF759B800F02CF830B96068C0
+:106F1000C043810302D5BDE8104063E0082100F0C2
+:106F200022F870B96068C04301030AD5606853490C
+:106F300040F400206060086880474FF40020A060A3
+:106F400010BD202100F00FF858B96068C0438102DD
+:106F500007D5606840F400106060BDE81040FEF79F
+:106F6000CEBF10BD022120465CE74548016841F4D0
+:106F7000007101604348026842F40072026040BF41
+:106F800020BF4148016841F400410160704780B56D
+:106F90003E48016841F480110160006800F48010EF
+:106FA000009000983448016841F0010101600268D6
+:106FB00042F4803202602C20FAF731FEBDE8024034
+:106FC0002D20FAF72CBE3248016821F00201016041
+:106FD00070472F484FF400314160016821F40031BF
+:106FE000016070472A48016841F400310160FEF7F2
+:106FF000A7BF2748016821F004010160026822F060
+:1070000010020260704722484FF4802141600168FD
+:1070100021F48021016070471E494FF48010086000
+:1070200070471B4804214160016821F004010160A0
+:107030007047174810214160016821F0100101607C
+:10704000704738B504460C4D08212846FFF7EAFE84
+:1070500030B10A480460686820F40020686031BDDF
+:10706000A0474FF40021A96031BD0948016821F013
+:107070000801016070470000000C00587C240020CB
+:10708000D4080058200800580C040058500000583C
+:10709000040C0058080C0058006040607047EFF383
+:1070A000108172B6026882420CBF012000201CE0F1
+:1070B000EFF3108272B603680B60486001600868E5
+:1070C000416023E0EFF3108272B6086043684B60C2
+:1070D00041604868016019E0EFF3108172B64368BF
+:1070E00002681A6042680068426081F31088704745
+:1070F00010B5EFF3108472B602680A600068FFE70B
+:10710000FFF7EAFF84F3108810BD086082F310884F
+:10711000704700000249016002490161704700BFE9
+:10712000055F00082D5F0008DFF80C00FFE701682D
+:1071300041F48061016070470404005838B5EFF3F2
+:10714000108472B6284D6946281D00F08CF96946F6
+:10715000281D00F0E5F938B184F31088BDF800105F
+:10716000224AFFF79DFB31BD0120287084F310886F
+:1071700031BD80B5FFF791FB0221009100231A4831
+:1071800000F124014FF48052001D00F053F801BDBE
+:1071900000BFF8B514460026EFF3108510F1010F7B
+:1071A0001FD001281CBF02284FF0FF3619D1C4B1EF
+:1071B000264672B60C4F012392B2381D00F04EF8ED
+:1071C00000281CBF97F90010002908D000223A704F
+:1071D00085F31088A1B2054AFFF762FB01E085F351
+:1071E00010883046F2BD0000040000203D71000808
+:1071F00070B50F4E0446B0680025A8B1FAF79DFAA5
+:10720000B2684FF47A71B1FBF2F1B0FBF1F0FAF72A
+:107210002DFD48B9102C07D2002221464FF0FF3037
+:10722000FAF7E0FC746000E00125284670BD00BF5D
+:107230005010002010B5029C016042600021C16026
+:107240000161416181610381A107047704D500894F
+:1072500010B14FF0FF3010BD002010BD2DE9F04FF0
+:10726000064685B030890C460027BB460028716968
+:10727000DC460CBF4FF00208D84681B168B93069CE
+:107280007768451CBD4228BFED1B3768385C7D5DC3
+:1072900000EB0527BF1CBFB203E0074600E000B1CA
+:1072A00002463069F568A84223BF7568281AC01BDA
+:1072B0000020154608EB050903FB09FE864532BF91
+:1072C0000020B0FBF9FA09FB1A00C0B2804509DAC8
+:1072D00096F81C905FEAC97A48BF84465FEA8970D5
+:1072E00048BFC446100000F0B48070687144614427
+:1072F0008842C0F0AE8008EB020080B20390D9460D
+:10730000100AADF802000294ADF80020049359E091
+:10731000800740D53089002840F09B803268D01823
+:10732000A34600F8024C200A32681A4402F8010C05
+:10733000224630681844FBF74DFD706920187061D3
+:10734000B069019C401CB061200A31680C70316842
+:1073500048701CE08CB3307FC207D9D5308940B962
+:1073600031681944FF2001F8020C3168194401F812
+:10737000010C4FF0000B7069241874612C463089A1
+:10738000002340B931680C70210A30684170022333
+:107390007069801C706108EB04070021BFB2316185
+:1073A0005CB1DA44029800EB0A01306822461844C6
+:1073B000FBF710FD70692418746109F10109B069C7
+:1073C000401CB061049A70683169914545D27918C2
+:1073D00081422CBF081A0846306103463089A0B9A3
+:1073E0003068BDF80010C1545B1C7068316883427E
+:1073F00028BF1B1ABDF80200C8545B1C706883428A
+:1074000028BF1B1A7069801C706105FB09FA74683B
+:10741000BDF80000E41A844288BF0446029800EBDD
+:107420000A01281BAC42019003D093D2307F002880
+:1074300090D137682246F818FBF7CCFC7069201809
+:107440007061A346019C039F0023A9E73068404474
+:1074500000E0002005B0BDE8F08F88448045F5D3FA
+:10746000A8EB0008F2E778B5028900230B80002A18
+:1074700044690CBF02250025002C4FD0028952B967
+:10748000C2684668531CB34228BF9B1B0668B25CA7
+:10749000F35C02EB03220A80027F02F00302012A5E
+:1074A00025D10B884FF6FF72934204BF0289002A50
+:1074B00009D0C36802699A4219D20289BAB14668F2
+:1074C000F31A934213D24368C268E41A14190022D3
+:1074D000C260446102894AB902681478012B94BFE2
+:1074E000C3F101030123D25C04EB02220A80C468C9
+:1074F000426806682B19934228BF9B1A33440E88B2
+:107500004169891B491B416105D034192D199542E8
+:1075100028BFAD1AC5608169491E8161184672BDD8
+:10752000F8B5028900230B80002A42690CBF0224AF
+:107530000024002A3BD0C56802892B464AB9466818
+:107540006A1CB24228BF921B0668775DB25C07EBEB
+:1075500002220A80067F06F00306012E20D10F8842
+:107560004FF6FF72974204BF0289002A07D1426892
+:107570000023012A94BFC2F1010201220AE002693C
+:10758000AA420DD202895AB14668751B954207D2AC
+:10759000002304E005682E78AA5C06EB02220A802C
+:1075A00041680068E4188C4228BF641A0319184621
+:1075B000F2BD000010B50446AFF30080204600F095
+:1075C00005F80446AFF30080204610BD7CB500F1FD
+:1075D0000F06F608F600B04240D2082E04D2082664
+:1075E00002E0083000F047F8DFF804512C68210071
+:1075F00005D1002007E00268B24221D2011D0868CF
+:107600000028F8D12068291D0A68824222D0136818
+:10761000B34238BF111DF7D312E093190B60801BE2
+:1076200054685C600B6818601660096800291DBF0B
+:1076300048680028081D0020286002F1080076BD77
+:1076400061B10A681068A0F10803B342E5D250683E
+:107650000860EAE700F04EF80028C2D1002076BDAD
+:1076600010B5040006D0AFF30080204600F003F808
+:10767000AFF3008010BD002800D1704750B4A0F1D6
+:1076800008021368072B2BD913F0070F28D1184CC9
+:10769000616809B18A4202D25160626013E04868B1
+:1076A00000B3904238BF0146F9D31BE0964203D1A4
+:1076B0001B180B600A4606E0486810B11344984254
+:1076C0000ED350604A60506850B11368D11881429F
+:1076D00006D1002121600168CB181360406850601A
+:1076E00050BC704708680E18B242DFD250BC7047D9
+:1076F0006C2400200749086808B10020704706483C
+:10770000C008C00008600549C908C900091A01601D
+:10771000704700BF8024002097340020903800205C
+:10772000122008800FF200107047042008800FF22A
+:107730000C10704710B500F029F80FF2980004E023
+:1077400010B500F023F80FF2B0002146FDF70DFA56
+:10775000204610BD38B51A2008800E494C680868CC
+:1077600089680D4D081809D00822A91C00F01EF8E0
+:10777000042205F11201204600F018F8284632BD17
+:1077800010B500F003F80FF28400DEE70A46034C60
+:1077900070470000107AFF1F98110020841E0020FF
+:1077A00010B5FFF7F3FF0FF27000CEE730B50023FE
+:1077B00093420DDA040F0A2C2CBF3734303401F811
+:1077C000134001EB4305002400016C705B1CEFE7E4
+:1077D00030BD000053544D333220566972747561C8
+:1077E0006C20436F6D506F727420696E2046532079
+:1077F0004D6F64650000000053544D6963726F65FE
+:107800006C656374726F6E69637300005643502039
+:10781000436F6E666967000056435020496E746579
+:1078200072666163650000001201000202020040FE
+:10783000830440570002010203010000040309040D
+:1078400080B51C48016841F470010160002000F01F
+:1078500079F848B180791849184A0A600A6822F410
+:107860007C5242EA00220A604FF0B040016841F4C5
+:107870008031016012490A68D208D20042F0010248
+:107880000A600A6802F00702012AFAD10168890336
+:10789000FCD581688908890041F002018160816816
+:1078A00001F00C010829FAD101684908490001607A
+:1078B00001BD000088ED00E09C000058FECAFECA31
+:1078C0000040005801000000030000000500000017
+:1078D0000100000001000000060000000A00000096
+:1078E000200000000200000004000000080000006A
+:1078F00010000000400000008000000000010000B7
+:1079000000020000A0860100400D0300801A06005E
+:1079100000350C0040420F0080841E0000093D002D
+:1079200000127A000024F40000366E010048E801DD
+:10793000006CDC02000000000000000000000000FD
+:107940000000000001460648064AC3798B4218BF72
+:10795000904218BF0838F8D18B4218BF00207047FA
+:10796000F873FF1F0070FF1F2DE9F041074688469E
+:10797000387810F0030F16461D4633D0384600F015
+:1079800099F878BBB8F1000F1CBFD8E9000186193F
+:10799000012D2ED13888C10415D5396A07F144026A
+:1079A000384600F0A3F83A6B044602B93A69F96820
+:1079B000384600F09BF8361B341A7A69F968384665
+:1079C00000F094F8261A1EB94DB916F1010F09D02E
+:1079D00097F903002A46314600F08EF8064616F164
+:1079E000010F09D12320AFF300804FF0FF30BDE835
+:1079F000F081022DE8D1EBE7388810F4405F0ED01B
+:107A00007868F86038617861B8617868F86107F182
+:107A10004400386207F13000786200203863B8F122
+:107A2000000F05D0D8E9020107F13402C2E90001D4
+:107A300039884CF6FF60014039800020BDE8F081B4
+:107A400070B50546AFF300802888810415D56E68AF
+:107A50000024EA6895F903003146914212D2521A85
+:107A6000FFF796FB10F1010F1CBF00283618F0D16C
+:107A70000FE04DF6FF70014029802846AFF30080EB
+:107A8000002070BD00220021FFF782FB10F1010FE2
+:107A900000D101246868E860A861E861002C2988A9
+:107AA000E7D041F4007129802846AFF300804FF001
+:107AB000FF3070BDF8B5A0B9AFF3008000250A4EC5
+:107AC00008244FF0FF37306820B1FFF7B9FF0028D6
+:107AD00048BF3D46361D641EF5D1AFF300802846F1
+:107AE000F2BDBDE8F240ABE77C150020914234BF07
+:107AF000511A0021084670473EB504000D00012AC6
+:107B000002D100F063F807E0022A07D100940020B8
+:107B1000019069460C20ABBE2D1801E0002A0CD163
+:107B20000094019569460A20ABBE002805D10022C9
+:107B30002100280000F027F801E00020C04303B036
+:107B400030BD000010B4314A002113461C68844245
+:107B50001EBF491C9C6884421EBF491C1C6984428C
+:107B600009D09C69491C844205D0491C2033102946
+:107B7000ECD310BC7047002342F8313002EBC10156
+:107B80004B6010BC704778B4204C002325462E680B
+:107B90008E421EBF5B1CAE688E421EBF5B1C2E69F0
+:107BA0008E4209D0AE695B1C8E4205D05B1C20352D
+:107BB000102BECD372BC7047054604EBC303012ABB
+:107BC00004BF59684D195D6072BC704710B40F4A0C
+:107BD000002113461C6884421EBF491C9C688442D5
+:107BE0001EBF491C1C6984420AD09C69491C8442FE
+:107BF00006D0491C20331029ECD310BC002070475C
+:107C000002EBC100406810BC704700006C220020ED
+:107C100010B50446E068A169884251D3218849F231
+:107C200002030B40022B08D008044CBF4FF4007035
+:107C30004FF48440014321803BE001F4C042B2F59F
+:107C4000C04F06D1A168884203D32046FFF732FF18
+:107C500078BB208810F4406F02BF606804F14401D3
+:107C6000884217D14FF40070FFF7A4FC606030B970
+:107C700004F144006060E060401CA0600AE02188DC
+:107C800041F040012180E060606100F500726068B1
+:107C9000A260E06160682061A068A061207841076F
+:107CA0000AD502220021204600F00CF810F1010F45
+:107CB00002D14FF0FF3010BD208840F4C04020803A
+:107CC000002010BD70B504460D461646AFF3008087
+:107CD00033462A4600212046FFF746FE0546204649
+:107CE000AFF30080284670BD38B504000ED0207870
+:107CF00010F0030F03D094F90300002809D5AFF367
+:107D00000080204600F030F8AFF300804FF0FF30E5
+:107D100032BD2046FFF7CEFE0546AFF30080207847
+:107D2000410644BF606800F05DF80020606094F98F
+:107D30000300022804D900F057F808B14FF0FF35CE
+:107D4000E06B48B100F05CF808B14FF0FF35E06B34
+:107D500000F048F80020E063204600F005F8AFF39B
+:107D60000080284632BD000001780A0626D51C4A4C
+:107D700013680021834203D1002342F821301BE025
+:107D80005368012183421EBF022193688342F3D0CE
+:107D9000D368032183421EBF042113698342EBD0C1
+:107DA0005369052183421EBF0621936983421EBF8A
+:107DB0000721D3698342DFD000F014B8002101808D
+:107DC0004FF0FF31C17000F144014160C1600161B9
+:107DD00041618161C161016200F13001416270471E
+:107DE0007C150020FFF73CBC1CB5020000926946E0
+:107DF0000220ABBE04001000FFF7A4FE200016BD59
+:107E0000E0B50090FAF7CCFE019069460E20ABBEBB
+:107E100003B000BD38B50C46C5B22046AFF30080B4
+:107E2000E068A169884204D32046FFF7F1FE0028EC
+:107E30000FD4E068401CE06000F8015D2088010577
+:107E400003D440050BD50A2D09D12046FFF732FE99
+:107E500028B12046AFF300804FF0FF3032BD2046FE
+:107E6000AFF30080284632BD7047FEE77047704789
+:107E7000704700F019B80020F9F715B90020F9F79C
+:107E80001BB90220F9F70FB90220F9F715B9FCF771
+:107E9000E6BFFFF720B8FEF7D5BF00E000BF0148FE
+:107EA000FBF704BCD415002002490A6888688218D0
+:107EB0000A6070475010002019E050F8042BD307D7
+:107EC00044BFA9F101039A18091F0023042942F8AD
+:107ED000043BF9D25FEA817C134604D54FF0000CD5
+:107EE000A2F800C09B1CC90744BF0021197050F8BC
+:107EF000041B0029E1D1704738B50D4D08242868CE
+:107F000000281CBF017811F0030F05D090F9031071
+:107F1000002958BFFFF7E8FE2D1D641EEFD1BDE814
+:107F20003840002200214FF0FF30FFF731B900BF89
+:107F30007C15002010B5074979441831064C7C4463
+:107F4000163404E00A68081D114488470146A1421E
+:107F5000F8D110BD2C000000500000004EF68851F2
+:107F6000CEF20001086840F470000860BFF34F8F44
+:107F7000BFF36F8F4FF00070E1EE100A7047000002
+:107F800039FFFFFFB80E0000D4150020980A00004A
+:107F900024000320000000007F96FFFF88010000FE
+:107FA000E2020000040000200000000000000000C9
+:107FB00000000000000000000100000002000000BE
+:107FC000030000000400000000F00DF8002801D0BC
+:107FD000FFF7B0FFAFF300800020AFF30080FDF7A4
+:107FE0007FFE00F002F80120704700F001B80000A9
+:107FF0000746FFF781FF3846FBF7ECFAFBE738B599
+:1080000004460D46284600F005F8A84218BF002493
+:10801000204632BD0149FFF7FDBE00BFEC14002031
+:108020000148804701480047417800083180000836
+:10803000AFF30080FFF792FFFFF7C6FF00002E00AE
+:10804000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF64
+:10805000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF54
+:10806000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF44
+:10807000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF34
+:10808000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF24
+:10809000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF14
+:1080A000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF04
+:1080B000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF4
+:1080C000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE4
+:1080D000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD4
+:1080E000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC4
+:1080F000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB4
+:10810000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA3
+:10811000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF93
+:10812000FFF7FEBFF3FF010001F1FF01F1FF01F1D5
+:10813000FF01F1FF01F1FF01F1FF01F1FF01F1FF8B
+:1081400001F1FF01F1FF01F1FF01F1FF01F1FF0179
+:10815000F1FF01F1350152FF01ED3F101210115DE9
+:108160005410500148000404110C10020A060002C9
+:108170000822401C100365640008F90420023D65D4
+:1081800000082B100355660008E50C432B661061B0
+:1081900001128310127B04128B041293041009093C
+:1081A000024300020100C03209046512020B101ED6
+:1081B0000524001001052401000104240202052405
+:1081C0000600010705820308001009040100020AE5
+:1081D0004E1002070501027B200107058107F228E6
+:1081E0000044224007228107200100090744F22CA5
+:1081F0000444132177F0110412410412350412557E
+:108200000412810412A104F001FF1A030001F1FF1E
+:1082100001F1C0011C04CF5800080559E403110402
+:10822000125B042F00C22A041E085103100500002F
+:10823000E8140020E90452E80443000014610852E5
+:10824000D40CF10B011007020401013C2300208C27
+:1082500004523C0421346108F00412301500201C43
+:1082600015484003080202EC224021082104213471
+:108270006108127844F212644812A4B412EC04F2B9
+:1082800006342CF002073C800008046D7C05F200E7
+:058290003E1403000094
+:04000005080080313E
:00000001FF
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h
new file mode 100644
index 000000000..35b82b282
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h
@@ -0,0 +1,117 @@
+/**
+ ******************************************************************************
+ * @file app_common.h
+ * @author MCD Application Team
+ * @brief Common
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_COMMON_H
+#define APP_COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "app_conf.h"
+
+/* -------------------------------- *
+ * Basic definitions *
+ * -------------------------------- */
+
+#undef NULL
+#define NULL 0
+
+#undef FALSE
+#define FALSE 0
+
+#undef TRUE
+#define TRUE (!0)
+
+ /* -------------------------------- *
+ * Critical Section definition *
+ * -------------------------------- */
+#define BACKUP_PRIMASK() uint32_t primask_bit= __get_PRIMASK()
+#define DISABLE_IRQ() __disable_irq()
+#define RESTORE_PRIMASK() __set_PRIMASK(primask_bit)
+
+/* -------------------------------- *
+ * Macro delimiters *
+ * -------------------------------- */
+
+#define M_BEGIN do {
+
+#define M_END } while(0)
+
+
+/* -------------------------------- *
+ * Some useful macro definitions *
+ * -------------------------------- */
+
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+
+#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
+
+#define MODDEC( a, m ) M_BEGIN if ((a)==0) (a)=(m); (a)--; M_END
+
+#define MODADD( a, b, m ) M_BEGIN (a)+=(b); if ((a)>=(m)) (a)-=(m); M_END
+
+#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
+
+
+#define PAUSE( t ) M_BEGIN \
+ __IO int _i; \
+ for ( _i = t; _i > 0; _i -- ); \
+ M_END
+
+#define DIVF( x, y ) ((x)/(y))
+
+#define DIVC( x, y ) (((x)+(y)-1)/(y))
+
+#define DIVR( x, y ) (((x)+((y)/2))/(y))
+
+#define SHRR( x, n ) ((((x)>>((n)-1))+1)>>1)
+
+#define BITN( w, n ) (((w)[(n)/32] >> ((n)%32)) & 1)
+
+#define BITNSET( w, n, b ) M_BEGIN (w)[(n)/32] |= ((U32)(b))<<((n)%32); M_END
+
+/* -------------------------------- *
+ * Compiler *
+ * -------------------------------- */
+#define PLACE_IN_SECTION( __x__ ) __attribute__((section (__x__)))
+
+#ifdef WIN32
+#define ALIGN(n)
+#else
+#define ALIGN(n) __attribute__((aligned(n)))
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_COMMON_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h
new file mode 100644
index 000000000..f7394d2c6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h
@@ -0,0 +1,378 @@
+/**
+ ******************************************************************************
+ * @file app_conf.h
+ * @author MCD Application Team
+ * @brief Application configuration file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_CONF_H
+#define APP_CONF_H
+
+ /* Includes ------------------------------------------------------------------*/
+#include "hw.h"
+#include "hw_conf.h"
+#include "hw_if.h"
+
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of BLE Event
+ * This parameter defines the number of asynchronous events that can be stored in the HCI layer before
+ * being reported to the application. When a command is sent to the BLE core coprocessor, the HCI layer
+ * is waiting for the event with the Num_HCI_Command_Packets set to 1. The receive queue shall be large
+ * enough to store all asynchronous events received in between.
+ * When CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE is set to 27, this allow to store three 255 bytes long asynchronous events
+ * between the HCI command and its event.
+ * This parameter depends on the value given to CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE. When the queue size is to small,
+ * the system may hang if the queue is full with asynchronous events and the HCI layer is still waiting
+ * for a CC/CS event, In that case, the notification TL_BLE_HCI_ToNot() is called to indicate
+ * to the application a HCI command did not receive its command event within 30s (Default HCI Timeout).
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 5
+
+/**
+ * This parameter should be set to fit most events received by the HCI layer. It defines the buffer size of each element
+ * allocated in the queue of received events and can be used to optimize the amount of RAM allocated by the Memory Manager.
+ * It should not exceed 255 which is the maximum HCI packet payload size (a greater value is a lost of memory as it will
+ * never be used)
+ * It shall be at least 4 to receive the command status event in one frame.
+ * The default value is set to 27 to allow receiving an event of MTU size in a single buffer. This value maybe reduced
+ * further depending on the application.
+ *
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
+
+#define TL_EVENT_FRAME_SIZE ( TL_EVT_HDR_SIZE + CFG_TL_MOST_EVENT_PAYLOAD_SIZE )
+
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+/**
+ * Select UART interfaces
+ */
+#define CFG_DEBUG_TRACE_UART hw_lpuart1
+#define CFG_CLI_UART hw_uart1
+
+/******************************************************************************
+ * USB interface
+ ******************************************************************************/
+/**
+ * Enable/Disable USB interface
+ */
+#define CFG_USB_INTERFACE_ENABLE 1
+
+/******************************************************************************
+ * Low Power
+ ******************************************************************************/
+/**
+ * When set to 1, the low power mode is enable
+ * When set to 0, the device stays in RUN mode
+ */
+#define CFG_LPM_SUPPORTED 0
+
+/******************************************************************************
+ * Timer Server
+ ******************************************************************************/
+/**
+ * CFG_RTC_WUCKSEL_DIVIDER: This sets the RTCCLK divider to the wakeup timer.
+ * The higher is the value, the better is the power consumption and the accuracy of the timerserver
+ * The lower is the value, the finest is the granularity
+ *
+ * CFG_RTC_ASYNCH_PRESCALER: This sets the asynchronous prescaler of the RTC. It should as high as possible ( to ouput
+ * clock as low as possible) but the output clock should be equal or higher frequency compare to the clock feeding
+ * the wakeup timer. A lower clock speed would impact the accuracy of the timer server.
+ *
+ * CFG_RTC_SYNCH_PRESCALER: This sets the synchronous prescaler of the RTC.
+ * When the 1Hz calendar clock is required, it shall be sets according to other settings
+ * When the 1Hz calendar clock is not needed, CFG_RTC_SYNCH_PRESCALER should be set to 0x7FFF (MAX VALUE)
+ *
+ * CFG_RTCCLK_DIVIDER_CONF:
+ * Shall be set to either 0,2,4,8,16
+ * When set to either 2,4,8,16, the 1Hhz calendar is supported
+ * When set to 0, the user sets its own configuration
+ *
+ * The following settings are computed with LSI as input to the RTC
+ */
+#define CFG_RTCCLK_DIVIDER_CONF 0
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 0)
+/**
+ * Custom configuration
+ * It does not support 1Hz calendar
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTCCLK_DIV (16)
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (0x7FFF)
+
+#else
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 2)
+/**
+ * It divides the RTC CLK by 2
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (3)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 4)
+/**
+ * It divides the RTC CLK by 4
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (2)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 8)
+/**
+ * It divides the RTC CLK by 8
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (1)
+#endif
+
+#if (CFG_RTCCLK_DIVIDER_CONF == 16)
+/**
+ * It divides the RTC CLK by 16
+ */
+#define CFG_RTC_WUCKSEL_DIVIDER (0)
+#endif
+
+#define CFG_RTCCLK_DIV CFG_RTCCLK_DIVIDER_CONF
+#define CFG_RTC_ASYNCH_PRESCALER (CFG_RTCCLK_DIV - 1)
+#define CFG_RTC_SYNCH_PRESCALER (DIVR( LSE_VALUE, (CFG_RTC_ASYNCH_PRESCALER+1) ) - 1 )
+
+#endif
+
+/** tick timer value in us */
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
+typedef enum
+{
+ CFG_TIM_PROC_ID_ISR,
+} CFG_TimProcID_t;
+
+/******************************************************************************
+ * Debug
+ ******************************************************************************/
+/**
+ * When set, this resets some hw resources to set the device in the same state than the power up
+ * The FW resets only register that may prevent the FW to run properly
+ *
+ * This shall be set to 0 in a final product
+ *
+ */
+#define CFG_HW_RESET_BY_FW 1
+
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+
+/**
+ * keep debugger enabled while in any low power mode when set to 1
+ * should be set to 0 in production
+ */
+#define CFG_DEBUGGER_SUPPORTED 1
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGTH is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGTH 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+/* Define platform used: only ARM supported for TRACE trace */
+#define CFG_PLATFORM_LINUX (0x01)
+#define CFG_PLATFORM_WINDOWS (0x02)
+#define CFG_PLATFORM_ARM (0x03)
+
+#define CFG_PLATFORM_TYPE (CFG_PLATFORM_ARM)
+
+/**
+ * Enable or Disable traces in application
+ */
+#define APP_DBG_EN 1
+
+#if (APP_DBG_EN != 0)
+#define APP_DBG_MSG PRINT_MESG_DBG
+#else
+#define APP_DBG_MSG PRINT_NO_MESG
+#endif
+
+#if (( CFG_DEBUG_TRACE_FULL == 1 ) || ( CFG_DEBUG_TRACE_LIGTH == 1 ))
+#define CFG_DEBUG_TRACE 1
+
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 0
+
+#undef CFG_DEBUGGER_SUPPORTED
+#define CFG_DEBUGGER_SUPPORTED 1
+
+#undef CFG_PLATFORM_TYPE
+#define CFG_PLATFORM_TYPE (CFG_PLATFORM_ARM)
+
+#else
+#define CFG_DEBUG_TRACE 0
+#endif
+
+
+
+/**
+ * When CFG_DEBUG_TRACE_FULL is set to 1, the trace are output with the API name, the file name and the line number
+ * When CFG_DEBUG_TRACE_LIGHT is set to 1, only the debug message is output
+ *
+ * When both are set to 0, no trace are output
+ * When both are set to 1, CFG_DEBUG_TRACE_FULL is selected
+ */
+#define CFG_DEBUG_TRACE_LIGHT 1
+#define CFG_DEBUG_TRACE_FULL 0
+
+#if (( CFG_DEBUG_TRACE != 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ) && (CFG_DEBUG_TRACE_FULL == 0))
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 1
+#endif
+
+#if ( CFG_DEBUG_TRACE == 0 )
+#undef CFG_DEBUG_TRACE_FULL
+#undef CFG_DEBUG_TRACE_LIGHT
+#define CFG_DEBUG_TRACE_FULL 0
+#define CFG_DEBUG_TRACE_LIGHT 0
+#endif
+
+/**
+ * When not set, the traces is looping on sending the trace over UART
+ */
+#define DBG_TRACE_USE_CIRCULAR_QUEUE 1
+
+/**
+ * max buffer Size to queue data traces and max data trace allowed.
+ * Only Used if DBG_TRACE_USE_CIRCULAR_QUEUE is defined
+ */
+#define DBG_TRACE_MSG_QUEUE_SIZE 4096
+#define MAX_DBG_TRACE_MSG_SIZE 1024
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/* USER CODE BEGIN Defines */
+/******************************************************************************
+ * User interaction
+ * When CFG_LED_SUPPORTED is set, LEDS are activated if requested
+ * When CFG_BUTTON_SUPPORTED is set, the push button are activated if requested
+ ******************************************************************************/
+#if (CFG_FULL_LOW_POWER == 1)
+#define CFG_LED_SUPPORTED 0
+#define CFG_BUTTON_SUPPORTED 0
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+/* USER CODE END Defines */
+
+/******************************************************************************
+ * Scheduler
+ ******************************************************************************/
+ /**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
+
+typedef enum
+{
+ CFG_TASK_MSG_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_SEND_BUFFER,
+ CFG_TASK_PROVISIONING,
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ CFG_TASK_VCP_SEND_DATA,
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+
+typedef enum
+{
+ CFG_SCH_PRIO_0,
+ CFG_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+
+#define TASK_SEND_BUFFER (1U << CFG_TASK_SEND_BUFFER)
+#define TASK_PROVISIONING (1U << CFG_TASK_PROVISIONING)
+/**
+* This is a bit mapping over 32bits listing all events id supported in the application
+*/
+typedef enum
+{
+ CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP,
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_RESPONSE_ACK,
+} CFG_IdleEvt_Id_t;
+
+
+#define EVENT_ACK_FROM_M0_EVT (1U << CFG_EVT_ACK_FROM_M0_EVT)
+#define EVENT_SYNCHRO_BYPASS_IDLE (1U << CFG_EVT_SYNCHRO_BYPASS_IDLE)
+#define EVENT_RESPONSE_ACK (1U << CFG_EVT_RESPONSE_ACK)
+
+
+
+/******************************************************************************
+ * Configure Log level for Application
+ ******************************************************************************/
+#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
+#define APPLI_PRINT_FILE_FUNC_LINE 0
+
+/******************************************************************************
+ * LOW POWER
+ ******************************************************************************/
+/**
+ * Supported requester to the MCU Low Power Manager - can be increased up to 32
+ * It lits a bit mapping of all user of the Low Power Manager
+ */
+typedef enum
+{
+ CFG_LPM_APP,
+ CFG_LPM_APP_THREAD,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+/******************************************************************************
+ * OTP manager
+ ******************************************************************************/
+#define CFG_OTP_BASE_ADDRESS OTP_AREA_BASE
+
+#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
+
+
+
+
+#endif /* APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h
new file mode 100644
index 000000000..0fbf65bda
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h
@@ -0,0 +1,45 @@
+/**
+ ******************************************************************************
+ * @file app_entry.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of functions used for the
+ * overall system infrastructure (scheduler, synchro with the M0, etc..)
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_ENTRY_H
+#define APP_ENTRY_H
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+
+void APPE_Init( void );
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..a140b3084
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h
@@ -0,0 +1,250 @@
+/**
+ ******************************************************************************
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_CONF_H
+#define HW_CONF_H
+
+/******************************************************************************
+* Semaphores
+* THIS SHALL NO BE CHANGED AS THESE SEMAPHORES ARE USED AS WELL ON THE CM0+
+*****************************************************************************/
+/**
+* Index of the semaphore used by CPU2 to prevent the CPU1 to either write or erase data in flash
+* The CPU1 shall not either write or erase in flash when this semaphore is taken by the CPU2
+* When the CPU1 needs to either write or erase in flash, it shall first get the semaphore and release it just
+* after writing a raw (64bits data) or erasing one sector.
+* On v1.4.0 and older CPU2 wireless firmware, this semaphore is unused and CPU2 is using PES bit.
+* By default, CPU2 is using the PES bit to protect its timing. The CPU1 may request the CPU2 to use the semaphore
+* instead of the PES bit by sending the system command SHCI_C2_SetFlashActivityControl()
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU2_SEMID 7
+
+/**
+* Index of the semaphore used by CPU1 to prevent the CPU2 to either write or erase data in flash
+* In order to protect its timing, the CPU1 may get this semaphore to prevent the CPU2 to either
+* write or erase in flash (as this will stall both CPUs)
+* The PES bit shall not be used as this may stall the CPU2 in some cases.
+*/
+#define CFG_HW_BLOCK_FLASH_REQ_BY_CPU1_SEMID 6
+
+/**
+* Index of the semaphore used to manage the CLK48 clock configuration
+* When the USB is required, this semaphore shall be taken before configuring te CLK48 for USB
+* and should be released after the application switch OFF the clock when the USB is not used anymore
+* When using the RNG, it is good enough to use CFG_HW_RNG_SEMID to control CLK48.
+* More details in AN5289
+*/
+#define CFG_HW_CLK48_CONFIG_SEMID 5
+
+/* Index of the semaphore used to manage the entry Stop Mode procedure */
+#define CFG_HW_ENTRY_STOP_MODE_SEMID 4
+
+/* Index of the semaphore used to access the RCC */
+#define CFG_HW_RCC_SEMID 3
+
+/* Index of the semaphore used to access the FLASH */
+#define CFG_HW_FLASH_SEMID 2
+
+/* Index of the semaphore used to access the PKA */
+#define CFG_HW_PKA_SEMID 1
+
+/* Index of the semaphore used to access the RNG */
+#define CFG_HW_RNG_SEMID 0
+
+/******************************************************************************
+ * HW TIMER SERVER
+ *****************************************************************************/
+/**
+ * The user may define the maximum number of virtual timers supported.
+ * It shall not exceed 255
+ */
+#define CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER 6
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the preemptpriority part of the NVIC.
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+
+/**
+ * The user may define the priority in the NVIC of the RTC_WKUP interrupt handler that is used to manage the
+ * wakeup timer.
+ * This setting is the subpriority part of the NVIC. It does not exist on all processors. When it is not supported
+ * on the CPU, the setting is ignored
+ */
+#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
+
+/**
+ * Define a critical section in the Timer server
+ * The Timer server does not support the API to be nested
+ * The Application shall either:
+ * a) Ensure this will never happen
+ * b) Define the critical section
+ * The default implementations is masking all interrupts using the PRIMASK bit
+ * The TimerServer driver uses critical sections to avoid context corruption. This is achieved with the macro
+ * TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION. When CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION is set
+ * to 1, all STM32 interrupts are masked with the PRIMASK bit of the CortexM CPU. It is possible to use the BASEPRI
+ * register of the CortexM CPU to keep allowed some interrupts with high priority. In that case, the user shall
+ * re-implement TIMER_ENTER_CRITICAL_SECTION and TIMER_EXIT_CRITICAL_SECTION and shall make sure that no TimerServer
+ * API are called when the TIMER critical section is entered
+ */
+#define CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION 1
+
+/**
+ * This value shall reflect the maximum delay there could be in the application between the time the RTC interrupt
+ * is generated by the Hardware and the time when the RTC interrupt handler is called. This time is measured in
+ * number of RTCCLK ticks.
+ * A relaxed timing would be 10ms
+ * When the value is too short, the timerserver will not be able to count properly and all timeout may be random.
+ * When the value is too long, the device may wake up more often than the most optimal configuration. However, the
+ * impact on power consumption would be marginal (unless the value selected is extremely too long). It is strongly
+ * recommended to select a value large enough to make sure it is not too short to ensure reliability of the system
+ * as this will have marginal impact on low power mode
+ */
+#define CFG_HW_TS_RTC_HANDLER_MAX_DELAY ( 10 * (LSI_VALUE/1000) )
+
+/**
+ * Interrupt ID in the NVIC of the RTC Wakeup interrupt handler
+ * It shall be type of IRQn_Type
+ */
+#define CFG_HW_TS_RTC_WAKEUP_HANDLER_ID RTC_WKUP_IRQn
+
+/******************************************************************************
+ * HW UART
+ *****************************************************************************/
+
+/* For release: set to 1 CFG_HW_LPUART1_ENABLED and CFG_HW_LPUART1_DMA_TX_SUPPORTED */
+/* CLI = LPUART1
+ * TRACES = USART1
+ */
+#define CFG_HW_LPUART1_ENABLED 1
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
+
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
+
+/**
+ * LPUART1
+ */
+#define CFG_HW_LPUART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_SUBPRIORITY 0
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_LPUART1_BAUDRATE 115200
+#define CFG_HW_LPUART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_LPUART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_LPUART1_PARITY UART_PARITY_NONE
+#define CFG_HW_LPUART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_LPUART1_MODE UART_MODE_TX_RX
+#define CFG_HW_LPUART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_LPUART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_LPUART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_PORT GPIOA
+#define CFG_HW_LPUART1_TX_PIN GPIO_PIN_2
+#define CFG_HW_LPUART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_TX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_RX_PORT GPIOA
+#define CFG_HW_LPUART1_RX_PIN GPIO_PIN_3
+#define CFG_HW_LPUART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_LPUART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_RX_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_LPUART1_CTS_PORT GPIOA
+#define CFG_HW_LPUART1_CTS_PIN GPIO_PIN_6
+#define CFG_HW_LPUART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_LPUART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_LPUART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_LPUART1_CTS_ALTERNATE GPIO_AF8_LPUART1
+
+#define CFG_HW_LPUART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_LPUART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_LPUART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_LPUART1_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE
+#define CFG_HW_LPUART1_TX_DMA_REQ DMA_REQUEST_LPUART1_TX
+#define CFG_HW_LPUART1_TX_DMA_CHANNEL DMA1_Channel4
+#define CFG_HW_LPUART1_TX_DMA_IRQn DMA1_Channel4_IRQn
+#define CFG_HW_LPUART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler
+
+/**
+ * UART1
+ */
+#define CFG_HW_USART1_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_SUBPRIORITY 0
+/** < The application shall check the selected source clock is enable */
+#define CFG_HW_USART1_SOURCE_CLOCK RCC_USART1CLKSOURCE_SYSCLK
+
+#define CFG_HW_USART1_BAUDRATE 115200
+#define CFG_HW_USART1_WORDLENGTH UART_WORDLENGTH_8B
+#define CFG_HW_USART1_STOPBITS UART_STOPBITS_1
+#define CFG_HW_USART1_PARITY UART_PARITY_NONE
+#define CFG_HW_USART1_HWFLOWCTL UART_HWCONTROL_NONE
+#define CFG_HW_USART1_MODE UART_MODE_TX_RX
+#define CFG_HW_USART1_ADVFEATUREINIT UART_ADVFEATURE_NO_INIT
+#define CFG_HW_USART1_OVERSAMPLING UART_OVERSAMPLING_8
+
+#define CFG_HW_USART1_TX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_TX_PORT GPIOB
+#define CFG_HW_USART1_TX_PIN GPIO_PIN_6
+#define CFG_HW_USART1_TX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_TX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_TX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_TX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_RX_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE
+#define CFG_HW_USART1_RX_PORT GPIOB
+#define CFG_HW_USART1_RX_PIN GPIO_PIN_7
+#define CFG_HW_USART1_RX_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_RX_PULL GPIO_NOPULL
+#define CFG_HW_USART1_RX_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_RX_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_CTS_PORT_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE
+#define CFG_HW_USART1_CTS_PORT GPIOA
+#define CFG_HW_USART1_CTS_PIN GPIO_PIN_11
+#define CFG_HW_USART1_CTS_MODE GPIO_MODE_AF_PP
+#define CFG_HW_USART1_CTS_PULL GPIO_PULLDOWN
+#define CFG_HW_USART1_CTS_SPEED GPIO_SPEED_FREQ_VERY_HIGH
+#define CFG_HW_USART1_CTS_ALTERNATE GPIO_AF7_USART1
+
+#define CFG_HW_USART1_DMA_TX_PREEMPTPRIORITY 0x0F
+#define CFG_HW_USART1_DMA_TX_SUBPRIORITY 0
+
+#define CFG_HW_USART1_DMAMUX_CLK_ENABLE __HAL_RCC_DMAMUX1_CLK_ENABLE
+#define CFG_HW_USART1_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define CFG_HW_USART1_TX_DMA_REQ DMA_REQUEST_USART1_TX
+#define CFG_HW_USART1_TX_DMA_CHANNEL DMA2_Channel4
+#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
+#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
+
+
+#endif /* HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/hw_if.h
@@ -0,0 +1,250 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hw_if.h
+ * @author MCD Application Team
+ * @brief Hardware Interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef HW_IF_H
+#define HW_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+#include "stm32wbxx.h"
+#include "stm32wbxx_ll_exti.h"
+#include "stm32wbxx_ll_system.h"
+#include "stm32wbxx_ll_rcc.h"
+#include "stm32wbxx_ll_ipcc.h"
+#include "stm32wbxx_ll_bus.h"
+#include "stm32wbxx_ll_pwr.h"
+#include "stm32wbxx_ll_cortex.h"
+#include "stm32wbxx_ll_utils.h"
+#include "stm32wbxx_ll_hsem.h"
+#include "stm32wbxx_ll_gpio.h"
+#include "stm32wbxx_ll_rtc.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#include "stm32wbxx_nucleo.h"
+#endif
+#ifdef USE_X_NUCLEO_EPD
+#include "x_nucleo_epd.h"
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+ /******************************************************************************
+ * HW UART
+ ******************************************************************************/
+ typedef enum
+ {
+ hw_uart1,
+ hw_uart2,
+ hw_lpuart1,
+ } hw_uart_id_t;
+
+ typedef enum
+ {
+ hw_uart_ok,
+ hw_uart_error,
+ hw_uart_busy,
+ hw_uart_to,
+ } hw_status_t;
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id);
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id);
+
+ /******************************************************************************
+ * HW TimerServer
+ ******************************************************************************/
+ /* Exported types ------------------------------------------------------------*/
+ /**
+ * This setting is used when standby mode is supported.
+ * hw_ts_InitMode_Limited should be used when the device restarts from Standby Mode. In that case, the Timer Server does
+ * not re-initialized its context. Only the Hardware register which content has been lost is reconfigured
+ * Otherwise, hw_ts_InitMode_Full should be requested (Start from Power ON) and everything is re-initialized.
+ */
+ typedef enum
+ {
+ hw_ts_InitMode_Full,
+ hw_ts_InitMode_Limited,
+ } HW_TS_InitMode_t;
+
+ /**
+ * When a Timer is created as a SingleShot timer, it is not automatically restarted when the timeout occurs. However,
+ * the timer is kept reserved in the list and could be restarted at anytime with HW_TS_Start()
+ *
+ * When a Timer is created as a Repeated timer, it is automatically restarted when the timeout occurs.
+ */
+ typedef enum
+ {
+ hw_ts_SingleShot,
+ hw_ts_Repeated
+ } HW_TS_Mode_t;
+
+ /**
+ * hw_ts_Successful is returned when a Timer has been successfully created with HW_TS_Create(). Otherwise, hw_ts_Failed
+ * is returned. When hw_ts_Failed is returned, that means there are not enough free slots in the list to create a
+ * Timer. In that case, CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER should be increased
+ */
+ typedef enum
+ {
+ hw_ts_Successful,
+ hw_ts_Failed,
+ }HW_TS_ReturnStatus_t;
+
+ typedef void (*HW_TS_pTimerCb_t)(void);
+
+ /**
+ * @brief Initialize the timer server
+ * This API shall be called by the application before any timer is requested to the timer server. It
+ * configures the RTC module to be connected to the LSI input clock.
+ *
+ * @param TimerInitMode: When the device restarts from Standby, it should request hw_ts_InitMode_Limited so that the
+ * Timer context is not re-initialized. Otherwise, hw_ts_InitMode_Full should be requested
+ * @param hrtc: RTC Handle
+ * @retval None
+ */
+ void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc);
+
+ /**
+ * @brief Interface to create a virtual timer
+ * The user shall call this API to create a timer. Once created, the timer is reserved to the module until it
+ * has been deleted. When creating a timer, the user shall specify the mode (single shot or repeated), the
+ * callback to be notified when the timer expires and a module ID to identify in the timer interrupt handler
+ * which module is concerned. In return, the user gets a timer ID to handle it.
+ *
+ * @param TimerProcessID: This is an identifier provided by the user and returned in the callback to allow
+ * identification of the requester
+ * @param pTimerId: Timer Id returned to the user to request operation (start, stop, delete)
+ * @param TimerMode: Mode of the virtual timer (Single shot or repeated)
+ * @param pTimerCallBack: Callback when the virtual timer expires
+ * @retval HW_TS_ReturnStatus_t: Return whether the creation is sucessfull or not
+ */
+ HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Stop a virtual timer
+ * This API may be used to stop a running timer. A timer which is stopped is move to the pending state.
+ * A pending timer may be restarted at any time with a different timeout value but the mode cannot be changed.
+ * Nothing is done when it is called to stop a timer which has been already stopped
+ *
+ * @param TimerID: Id of the timer to stop
+ * @retval None
+ */
+ void HW_TS_Stop(uint8_t TimerID);
+
+ /**
+ * @brief Start a virtual timer
+ * This API shall be used to start a timer. The timeout value is specified and may be different each time.
+ * When the timer is in the single shot mode, it will move to the pending state when it expires. The user may
+ * restart it at any time with a different timeout value. When the timer is in the repeated mode, it always
+ * stay in the running state. When the timer expires, it will be restarted with the same timeout value.
+ * This API shall not be called on a running timer.
+ *
+ * @param TimerID: The ID Id of the timer to start
+ * @param timeout_ticks: Number of ticks of the virtual timer (Maximum value is (0xFFFFFFFF-0xFFFF = 0xFFFF0000)
+ * @retval None
+ */
+ void HW_TS_Start(uint8_t TimerID, uint32_t timeout_ticks);
+
+ /**
+ * @brief Delete a virtual timer from the list
+ * This API should be used when a timer is not needed anymore by the user. A deleted timer is removed from
+ * the timer list managed by the timer server. It cannot be restarted again. The user has to go with the
+ * creation of a new timer if required and may get a different timer id
+ *
+ * @param TimerID: The ID of the timer to remove from the list
+ * @retval None
+ */
+ void HW_TS_Delete(uint8_t TimerID);
+
+ /**
+ * @brief Schedule the timer list on the timer interrupt handler
+ * This interrupt handler shall be called by the application in the RTC interrupt handler. This handler takes
+ * care of clearing all status flag required in the RTC and EXTI peripherals
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_Wakeup_Handler(void);
+
+ /**
+ * @brief Return the number of ticks to count before the interrupt
+ * This API returns the number of ticks left to be counted before an interrupt is generated by the
+ * Timer Server. This API may be used by the application for power management optimization. When the system
+ * enters low power mode, the mode selection is a tradeoff between the wakeup time where the CPU is running
+ * and the time while the CPU will be kept in low power mode before next wakeup. The deeper is the
+ * low power mode used, the longer is the wakeup time. The low power mode management considering wakeup time
+ * versus time in low power mode is implementation specific
+ * When the timer is disabled (No timer in the list), it returns 0xFFFF
+ *
+ * @param None
+ * @retval The number of ticks left to count
+ */
+ uint16_t HW_TS_RTC_ReadLeftTicksToCount(void);
+
+ /**
+ * @brief Notify the application that a registered timer has expired
+ * This API shall be implemented by the user application.
+ * This API notifies the application that a timer expires. This API is running in the RTC Wakeup interrupt
+ * context. The application may implement an Operating System to change the context priority where the timer
+ * callback may be handled. This API provides the module ID to identify which module is concerned and to allow
+ * sending the information to the correct task
+ *
+ * @param TimerProcessID: The TimerProcessId associated with the timer when it has been created
+ * @param TimerID: The TimerID of the expired timer
+ * @param pTimerCallBack: The Callback associated with the timer when it has been created
+ * @retval None
+ */
+ void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack);
+
+ /**
+ * @brief Notify the application that the wakeupcounter has been updated
+ * This API should be implemented by the user application
+ * This API notifies the application that the counter has been updated. This is expected to be used along
+ * with the HW_TS_RTC_ReadLeftTicksToCount () API. It could be that the counter has been updated since the
+ * last call of HW_TS_RTC_ReadLeftTicksToCount () and before entering low power mode. This notification
+ * provides a way to the application to solve that race condition to reevaluate the counter value before
+ * entering low power mode
+ *
+ * @param None
+ * @retval None
+ */
+ void HW_TS_RTC_CountUpdated_AppNot(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h
new file mode 100644
index 000000000..c838d3bc5
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/main.h
@@ -0,0 +1,55 @@
+ /* @file main.h
+ * @author MCD Application Team
+ * @brief This file contains all the functions prototypes for the main.c
+ * file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef MAIN_H
+#define MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include <stdio.h>
+#include <string.h>
+#include "app_common.h"
+#include "app_entry.h"
+#include "otp.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "stm32wbxx_hal.h"
+#include "dbg_trace.h"
+#include "stm_logging.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported variables --------------------------------------------------------*/
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MAIN_H */
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+******************************************************************************
+* @file stm32_lpm_if.h
+* @brief Header for stm32_lpm_if.c module (device specific LP management)
+******************************************************************************
+* @attention
+*
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+* All rights reserved.</center></h2>
+*
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+*
+******************************************************************************
+*/
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32_LPM_IF_H
+#define __STM32_LPM_IF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void );
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void );
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void );
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void );
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void );
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32_LPM_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..ec0f85423
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,351 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef STM32WBxx_HAL_CONF_H
+#define STM32WBxx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+#define HAL_ADC_MODULE_ENABLED
+#define HAL_COMP_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_CRC_MODULE_ENABLED
+#define HAL_CRYP_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_IPCC_MODULE_ENABLED
+#define HAL_IRDA_MODULE_ENABLED
+#define HAL_IWDG_MODULE_ENABLED
+/* #define HAL_LCD_MODULE_ENABLED */
+/* #define HAL_LPTIM_MODULE_ENABLED */
+#define HAL_PCD_MODULE_ENABLED
+/* #define HAL_PKA_MODULE_ENABLED */
+#define HAL_PWR_MODULE_ENABLED
+/* #define HAL_QSPI_MODULE_ENABLED */
+#define HAL_RCC_MODULE_ENABLED
+/* #define HAL_RNG_MODULE_ENABLED */
+#define HAL_RTC_MODULE_ENABLED
+/* #define HAL_SAI_MODULE_ENABLED */
+/* #define HAL_SMARTCARD_MODULE_ENABLED */
+/* #define HAL_SMBUS_MODULE_ENABLED */
+/* #define HAL_SPI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+/* #define HAL_TSC_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/* #define HAL_USART_MODULE_ENABLED */
+/* #define HAL_WWDG_MODULE_ENABLED */
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0
+#define USE_HAL_TSC_REGISTER_CALLBACKS 0
+#define USE_HAL_UART_REGISTER_CALLBACKS 0
+#define USE_HAL_USART_REGISTER_CALLBACKS 0
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE ((uint32_t)32000000) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal Multiple Speed oscillator (MSI) default value.
+ * This value is the default MSI range value after Reset.
+ */
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE ((uint32_t)32000) /*!< LSI1 Typical Value in Hz*/
+#endif /* LSI1_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief Internal Low Speed oscillator (LSI2) value.
+ */
+#if !defined (LSI2_VALUE)
+ #define LSI2_VALUE ((uint32_t)32000) /*!< LSI2 Typical Value in Hz*/
+#endif /* LSI2_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @brief Internal Multiple Speed oscillator (HSI48) default value.
+ * This value is the default HSI48 range value after Reset.
+ */
+#if !defined (HSI48_VALUE)
+ #define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for SAI1 peripheral
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
+ * frequency.
+ */
+#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
+ #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)48000) /*!< Value of the SAI1 External clock source in Hz*/
+#endif /* EXTERNAL_SAI1_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)(1<<__NVIC_PRIO_BITS) - 1) /*!< tick interrupt priority (lowest by default) */
+#define USE_RTOS 0
+#define PREFETCH_ENABLE 0
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+
+#define USE_SPI_CRC 1U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32wbxx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32wbxx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32wbxx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32wbxx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32wbxx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32wbxx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32wbxx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32wbxx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32wbxx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32wbxx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32wbxx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_IPCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_ipcc.h"
+#endif /* HAL_IPCC_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32wbxx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_lcd.h"
+#endif /* HAL_LCD_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32wbxx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_PKA_MODULE_ENABLED
+ #include "stm32wbxx_hal_pka.h"
+#endif /* HAL_PKA_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32wbxx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32wbxx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32wbxx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32wbxx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32wbxx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32wbxx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32wbxx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32wbxx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_TSC_MODULE_ENABLED
+ #include "stm32wbxx_hal_tsc.h"
+#endif /* HAL_TSC_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32wbxx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32wbxx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32wbxx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0 : assert_failed((char *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(char* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* STM32WBxx_HAL_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..70f25218d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,77 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_it.h
+ * @author MCD Application Team
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef STM32WB_IT_H
+#define STM32WB_IT_H
+
+#include "stm32wbxx_hal.h"
+#include "hw_conf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* External variable ----------------------------------------------------------*/
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+extern PCD_HandleTypeDef hpcd; /* Defined in the Thread Middleware */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/* Exported functions ------------------------------------------------------- */
+
+void NMI_Handler(void);
+void HardFault_Handler(void);
+
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+
+#if(CFG_HW_USART1_ENABLED == 1)
+void USART1_IRQHandler(void);
+#endif
+#if(CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_USART1_DMA_TX_IRQHandler(void);
+#endif
+#if(CFG_HW_LPUART1_ENABLED == 1)
+void LPUART1_IRQHandler(void);
+#endif
+#if(CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_LPUART1_DMA_TX_IRQHandler(void);
+#endif
+
+void RTC_WKUP_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+void USB_LP_IRQHandler(void);
+void USB_HP_IRQHandler(void);
+void USB_FS_WKUP_IRQHandler(void);
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* STM32WB_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..bf6d777b4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * @file stm_logging.h
+ * @author MCD Application Team
+ * @brief Application header file for logging
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+#ifndef STM_LOGGING_H_
+#define STM_LOGGING_H_
+
+#define LOG_LEVEL_NONE 0 /* None */
+#define LOG_LEVEL_CRIT 1U /* Critical */
+#define LOG_LEVEL_WARN 2U /* Warning */
+#define LOG_LEVEL_INFO 3U /* Info */
+#define LOG_LEVEL_DEBG 4U /* Debug */
+
+
+#define APP_DBG_FULL(level, region, ...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(level, region, __VA_ARGS__);
+
+#define APP_DBG(...) \
+ if (APPLI_PRINT_FILE_FUNC_LINE == 1U) \
+ { \
+ printf("\r\n[%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__); \
+ } \
+ logApplication(LOG_LEVEL_NONE, APPLI_LOG_REGION_GENERAL, __VA_ARGS__);
+
+/**
+ * This enumeration represents log regions.
+ *
+ */
+typedef enum
+{
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_OPENTHREAD_API = 2U, /* OpenThread API */
+ APPLI_LOG_REGION_OT_API_LINK = 3U, /* OpenThread Link API */
+ APPLI_LOG_REGION_OT_API_INSTANCE = 4U, /* OpenThread Instance API */
+ APPLI_LOG_REGION_OT_API_MESSAGE = 5U /* OpenThread Message API */
+} appliLogRegion_t;
+
+typedef uint8_t appliLogLevel_t;
+
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
+
+#endif /* STM_LOGGING_H_ */
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : utilities_conf.h
+ * Description : Configuration file for STM32 Utilities.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef UTILITIES_CONF_H
+#define UTILITIES_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmsis_compiler.h"
+#include "string.h"
+
+/******************************************************************************
+ * common
+ ******************************************************************************/
+#define UTILS_ENTER_CRITICAL_SECTION( ) uint32_t primask_bit = __get_PRIMASK( );\
+ __disable_irq( )
+
+#define UTILS_EXIT_CRITICAL_SECTION( ) __set_PRIMASK( primask_bit )
+
+#define UTILS_MEMSET8( dest, value, size ) memset( dest, value, size);
+
+/******************************************************************************
+ * tiny low power manager
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_LPM_INIT_CRITICAL_SECTION( )
+#define UTIL_LPM_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_LPM_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+
+/******************************************************************************
+ * sequencer
+ * (any macro that does not need to be modified can be removed)
+ ******************************************************************************/
+#define UTIL_SEQ_INIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_ENTER_CRITICAL_SECTION( ) UTILS_ENTER_CRITICAL_SECTION( )
+#define UTIL_SEQ_EXIT_CRITICAL_SECTION( ) UTILS_EXIT_CRITICAL_SECTION( )
+#define UTIL_SEQ_CONF_TASK_NBR (32)
+#define UTIL_SEQ_CONF_PRIO_NBR (2)
+#define UTIL_SEQ_MEMSET8( dest, value, size ) UTILS_MEMSET8( dest, value, size )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*UTILITIES_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h
new file mode 100644
index 000000000..22607b351
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/vcp_conf.h
@@ -0,0 +1,54 @@
+/**
+ ******************************************************************************
+ * @file vcp_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of the vcp interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __VCP_CONF_H
+#define __VCP_CONF_H
+
+#include "app_thread.h"
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+#define VCP_BAUD_RATE (115200)
+
+#define VCP_TASK_ID (CFG_TASK_VCP_SEND_DATA)
+#define VCP_TASK_PRIO (CFG_SCH_PRIO_1)
+
+#ifdef VCP_TX_PATH_INTERFACE_READY_SETUP_TIME
+#define VCP_TIMER_PROC_ID (CFG_TIM_PROC_ID_ISR)
+#endif
+
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__VCP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c
new file mode 100644
index 000000000..66db7c39a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c
@@ -0,0 +1,431 @@
+/**
+ ******************************************************************************
+ * @file app_entry.c
+ * @author MCD Application Team
+ * @brief Entry point of the Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_thread.h"
+#include "app_conf.h"
+#include "hw_conf.h"
+#include "stm32_seq.h"
+#include "stm_logging.h"
+#include "dbg_trace.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#include "shci.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC(( sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE ), 4U))
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+/* Private variables -------------------------------------------------*/
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t EvtPool[POOL_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t SystemCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t SystemSpareEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Global function prototypes -----------------------------------------------*/
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+
+/* Private function prototypes -----------------------------------------------*/
+static void SystemPower_Config( void );
+static void Init_Debug( void );
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status );
+static void APPE_SysUserEvtRx( void * pPayload );
+static void APPE_SysEvtReadyProcessing( void );
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode);
+
+static void appe_Tl_Init( void );
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ SystemPower_Config(); /**< Configure the system Power Mode */
+
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+
+ Init_Debug();
+/* USER CODE BEGIN APPE_Init_1 */
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ Led_Init();
+ Button_Init();
+/* USER CODE END APPE_Init_1 */
+ /**
+ * The Standby mode should not be entered before the initialization is over
+ * The default state of the Low Power Manager is to allow the Standby Mode so an request is needed here
+ */
+ appe_Tl_Init(); /* Initialize all transport layers */
+
+ /**
+ * From now, the application is waiting for the ready event ( VS_HCI_C2_Ready )
+ * received on the system channel before starting the Stack
+ * This system event is received with APPE_SysUserEvtRx()
+ */
+/* USER CODE BEGIN APPE_Init_2 */
+
+/* USER CODE END APPE_Init_2 */
+ return;
+}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Init_Debug( void )
+{
+#if (CFG_DEBUGGER_SUPPORTED == 1)
+ /**
+ * Keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_EnableDBGSleepMode();
+
+
+ /***************** ENABLE DEBUGGER *************************************/
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+
+ GPIO_InitTypeDef gpio_config = {0};
+
+ gpio_config.Pull = GPIO_NOPULL;
+ gpio_config.Mode = GPIO_MODE_ANALOG;
+
+ gpio_config.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13;
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOA, &gpio_config);
+ __HAL_RCC_GPIOA_CLK_DISABLE();
+
+ gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_3;
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ HAL_GPIO_Init(GPIOB, &gpio_config);
+ __HAL_RCC_GPIOB_CLK_DISABLE();
+
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Configure the system for power optimization
+ *
+ * @note This API configures the system to be ready for low power mode
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemPower_Config( void )
+{
+
+ /**
+ * Select HSI as system clock source after Wake Up from Stop mode
+ */
+ LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
+
+ /* Initialize low power manager */
+ UTIL_LPM_Init( );
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ /**
+ * Enable USB power
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ return;
+}
+
+static void appe_Tl_Init( void )
+{
+ TL_MM_Config_t tl_mm_config;
+ SHCI_TL_HciInitConf_t SHci_Tl_Init_Conf;
+
+ /**< Reference table initialization */
+ TL_Init();
+
+ /**< System channel initialization */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, UTIL_SEQ_RFU, shci_user_evt_proc );
+ SHci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&SystemCmdBuffer;
+ SHci_Tl_Init_Conf.StatusNotCallBack = APPE_SysStatusNot;
+ shci_init(APPE_SysUserEvtRx, (void*) &SHci_Tl_Init_Conf);
+
+ /**< Memory Manager channel initialization */
+ tl_mm_config.p_BleSpareEvtBuffer = 0;
+ tl_mm_config.p_SystemSpareEvtBuffer = SystemSpareEvtBuffer;
+ tl_mm_config.p_AsynchEvtPool = EvtPool;
+ tl_mm_config.AsynchEvtPoolSize = POOL_SIZE;
+ TL_MM_Init( &tl_mm_config );
+
+ TL_Enable();
+
+ return;
+}
+
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
+{
+ UNUSED(status);
+ return;
+}
+
+/**
+ * @brief Trap a notification coming from the M0 firmware
+ * @param pPayload : payload associated to the notification
+ *
+ * @retval None
+ */
+/**
+ * The type of the payload for a system user event is tSHCI_UserEvtRxParam
+ * When the system event is both :
+ * - a ready event (subevtcode = SHCI_SUB_EVT_CODE_READY)
+ * - reported by the FUS (sysevt_ready_rsp == RSS_FW_RUNNING)
+ * The buffer shall not be released
+ * ( eg ((tSHCI_UserEvtRxParam*)pPayload)->status shall be set to SHCI_TL_UserEventFlow_Disable )
+ * When the status is not filled, the buffer is released by default
+ */
+static void APPE_SysUserEvtRx( void * pPayload )
+{
+ TL_AsynchEvt_t *p_sys_event;
+ p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+
+ switch(p_sys_event->subevtcode)
+ {
+ case SHCI_SUB_EVT_CODE_READY:
+ APPE_SysEvtReadyProcessing();
+ break;
+ case SHCI_SUB_EVT_ERROR_NOTIF:
+ APPE_SysEvtError((SCHI_SystemErrCode_t) (p_sys_event->payload[0]));
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+/**
+ * @brief Notify a system error coming from the M0 firmware
+ * @param ErrorCode : errorCode detected by the M0 firmware
+ *
+ * @retval None
+ */
+static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
+{
+ switch(ErrorCode)
+ {
+ case ERR_THREAD_LLD_FATAL_ERROR:
+ APP_DBG("** ERR_THREAD : LLD_FATAL_ERROR \n");
+ break;
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_THREAD : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_THREAD : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ APP_THREAD_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+
+ BSP_LED_Init(LED_BLUE);
+ BSP_LED_Init(LED_GREEN);
+ BSP_LED_Init(LED_RED);
+
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ /**
+ * Button Initialization
+ */
+
+ BSP_PB_Init(BUTTON_SW1, BUTTON_MODE_EXTI);
+#endif
+
+ return;
+}
+
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+#if ( CFG_LPM_SUPPORTED == 1)
+ UTIL_LPM_EnterLowPower( );
+#endif
+ return;
+}
+
+/**
+ * @brief This function is called by the scheduler each time an event
+ * is pending.
+ *
+ * @param evt_waited_bm : Event pending.
+ * @retval None
+ */
+void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm )
+{
+ switch(evt_waited_bm)
+ {
+ case EVENT_ACK_FROM_M0_EVT:
+ /* Does not allow other tasks when waiting for OT Cmd response */
+ UTIL_SEQ_Run(0);
+ break;
+ case EVENT_SYNCHRO_BYPASS_IDLE:
+ UTIL_SEQ_SetEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+ /* Run only the task CFG_TASK_MSG_FROM_M0_TO_M4 */
+ UTIL_SEQ_Run(TASK_MSG_FROM_M0_TO_M4);
+ break;
+ default :
+ /* default case */
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ break;
+ }
+}
+
+void shci_notify_asynch_evt(void* pdata)
+{
+ UNUSED(pdata);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SYSTEM_HCI_ASYNCH_EVT, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_SYSTEM_HCI_CMD_EVT_RESP);
+ return;
+}
+
+/* Received trace buffer from M0 */
+void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
+{
+#if(CFG_DEBUG_TRACE != 0)
+ /* Call write/print function using DMA from dbg_trace */
+ /* - Cast to TL_AsynchEvt_t* to get "real" payload (without Sub Evt code 2bytes),
+ - (-2) to size to remove Sub Evt Code */
+ DbgTraceWrite(1U, (const unsigned char *) ((TL_AsynchEvt_t *)(hcievt->evtserial.evt.payload))->payload, hcievt->evtserial.evt.plen - 2U);
+#endif /* CFG_DEBUG_TRACE */
+ /* Release buffer */
+ TL_MM_EvtDone( hcievt );
+}
+/**
+ * @brief Initialisation of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+ HW_UART_Init(CFG_DEBUG_TRACE_UART);
+ return;
+}
+
+/**
+ * @brief Management of the traces
+ * @param p_data : data
+ * @param size : size
+ * @param call-back :
+ * @retval None
+ */
+void DbgOutputTraces( uint8_t *p_data, uint16_t size, void (*cb)(void) )
+{
+ HW_UART_Transmit_DMA(CFG_DEBUG_TRACE_UART, p_data, size, cb);
+
+ return;
+}
+#endif
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_timerserver.c
@@ -0,0 +1,893 @@
+/**
+ ******************************************************************************
+ * File Name : hw_timerserver.c
+ * Description : Hardware timerserver source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TimerID_Free,
+ TimerID_Created,
+ TimerID_Running
+}TimerIDStatus_t;
+
+typedef enum
+{
+ SSR_Read_Requested,
+ SSR_Read_Not_Requested
+}RequestReadSSR_t;
+
+typedef enum
+{
+ WakeupTimerValue_Overpassed,
+ WakeupTimerValue_LargeEnough
+}WakeupTimerLimitation_Status_t;
+
+typedef struct
+{
+ HW_TS_pTimerCb_t pTimerCallBack;
+ uint32_t CounterInit;
+ uint32_t CountLeft;
+ TimerIDStatus_t TimerIDStatus;
+ HW_TS_Mode_t TimerMode;
+ uint32_t TimerProcessID;
+ uint8_t PreviousID;
+ uint8_t NextID;
+}TimerContext_t;
+
+/* Private defines -----------------------------------------------------------*/
+#define SSR_FORBIDDEN_VALUE 0xFFFFFFFF
+#define TIMER_LIST_EMPTY 0xFFFF
+
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/**
+ * START of Section TIMERSERVER_CONTEXT
+ */
+
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile TimerContext_t aTimerContext[CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER];
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t CurrentRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint8_t PreviousRunningTimerID;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile uint32_t SSRValueOnLastSetup;
+PLACE_IN_SECTION("TIMERSERVER_CONTEXT") static volatile WakeupTimerLimitation_Status_t WakeupTimerLimitation;
+
+/**
+ * END of Section TIMERSERVER_CONTEXT
+ */
+
+static RTC_HandleTypeDef *phrtc; /**< RTC handle */
+static uint8_t WakeupTimerDivider;
+static uint8_t AsynchPrescalerUserConfig;
+static uint16_t SynchPrescalerUserConfig;
+static volatile uint16_t MaxWakeupTimerSetup;
+
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void RestartWakeupCounter(uint16_t Value);
+static uint16_t ReturnTimeElapsed(void);
+static void RescheduleTimerList(void);
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR);
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID);
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID);
+static uint16_t linkTimer(uint8_t TimerID);
+static uint32_t ReadRtcSsrValue(void);
+
+__weak void HW_TS_RTC_CountUpdated_AppNot(void);
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Read the RTC_SSR value
+ * As described in the reference manual, the RTC_SSR shall be read twice to ensure
+ * reliability of the value
+ * @param None
+ * @retval SSR value read
+ */
+static uint32_t ReadRtcSsrValue(void)
+{
+ uint32_t first_read;
+ uint32_t second_read;
+
+ first_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+
+ while(first_read != second_read)
+ {
+ first_read = second_read;
+
+ second_read = (uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS));
+ }
+
+ return second_read;
+}
+
+/**
+ * @brief Insert a Timer in the list after the Timer ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked after
+ * @retval None
+ */
+static void LinkTimerAfter(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t next_id;
+
+ next_id = aTimerContext[RefTimerID].NextID;
+
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = TimerID;
+ }
+ aTimerContext[TimerID].NextID = next_id;
+ aTimerContext[TimerID].PreviousID = RefTimerID ;
+ aTimerContext[RefTimerID].NextID = TimerID;
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list before the ID specified
+ * @param TimerID: The ID of the Timer
+ * @param RefTimerID: The ID of the Timer to be linked before
+ * @retval None
+ */
+static void LinkTimerBefore(uint8_t TimerID, uint8_t RefTimerID)
+{
+ uint8_t previous_id;
+
+ if(RefTimerID != CurrentRunningTimerID)
+ {
+ previous_id = aTimerContext[RefTimerID].PreviousID;
+
+ aTimerContext[previous_id].NextID = TimerID;
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[TimerID].PreviousID = previous_id ;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+ else
+ {
+ aTimerContext[TimerID].NextID = RefTimerID;
+ aTimerContext[RefTimerID].PreviousID = TimerID;
+ }
+
+ return;
+}
+
+/**
+ * @brief Insert a Timer in the list
+ * @param TimerID: The ID of the Timer
+ * @retval None
+ */
+static uint16_t linkTimer(uint8_t TimerID)
+{
+ uint32_t time_left;
+ uint16_t time_elapsed;
+ uint8_t timer_id_lookup;
+ uint8_t next_id;
+
+ if(CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * No timer in the list
+ */
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ aTimerContext[TimerID].NextID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER;
+
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ time_elapsed = 0;
+ }
+ else
+ {
+ time_elapsed = ReturnTimeElapsed();
+
+ /**
+ * update count of the timer to be linked
+ */
+ aTimerContext[TimerID].CountLeft += time_elapsed;
+ time_left = aTimerContext[TimerID].CountLeft;
+
+ /**
+ * Search for index where the new timer shall be linked
+ */
+ if(aTimerContext[CurrentRunningTimerID].CountLeft <= time_left)
+ {
+ /**
+ * Search for the ID after the first one
+ */
+ timer_id_lookup = CurrentRunningTimerID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ while((next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[next_id].CountLeft <= time_left))
+ {
+ timer_id_lookup = aTimerContext[timer_id_lookup].NextID;
+ next_id = aTimerContext[timer_id_lookup].NextID;
+ }
+
+ /**
+ * Link after the ID
+ */
+ LinkTimerAfter(TimerID, timer_id_lookup);
+ }
+ else
+ {
+ /**
+ * Link before the first ID
+ */
+ LinkTimerBefore(TimerID, CurrentRunningTimerID);
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = TimerID;
+ }
+ }
+
+ return time_elapsed;
+}
+
+/**
+ * @brief Remove a Timer from the list
+ * @param TimerID: The ID of the Timer
+ * @param RequestReadSSR: Request to read the SSR register or not
+ * @retval None
+ */
+static void UnlinkTimer(uint8_t TimerID, RequestReadSSR_t RequestReadSSR)
+{
+ uint8_t previous_id;
+ uint8_t next_id;
+
+ if(TimerID == CurrentRunningTimerID)
+ {
+ PreviousRunningTimerID = CurrentRunningTimerID;
+ CurrentRunningTimerID = aTimerContext[TimerID].NextID;
+ }
+ else
+ {
+ previous_id = aTimerContext[TimerID].PreviousID;
+ next_id = aTimerContext[TimerID].NextID;
+
+ aTimerContext[previous_id].NextID = aTimerContext[TimerID].NextID;
+ if(next_id != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[next_id].PreviousID = aTimerContext[TimerID].PreviousID;
+ }
+ }
+
+ /**
+ * Timer is out of the list
+ */
+ aTimerContext[TimerID].TimerIDStatus = TimerID_Created;
+
+ if((CurrentRunningTimerID == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (RequestReadSSR == SSR_Read_Requested))
+ {
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+ }
+
+ return;
+}
+
+/**
+ * @brief Return the number of ticks counted by the wakeuptimer since it has been started
+ * @note The API is reading the SSR register to get how many ticks have been counted
+ * since the time the timer has been started
+ * @param None
+ * @retval Time expired in Ticks
+ */
+static uint16_t ReturnTimeElapsed(void)
+{
+ uint32_t return_value;
+ uint32_t wrap_counter;
+
+ if(SSRValueOnLastSetup != SSR_FORBIDDEN_VALUE)
+ {
+ return_value = ReadRtcSsrValue(); /**< Read SSR register first */
+
+ if (SSRValueOnLastSetup >= return_value)
+ {
+ return_value = SSRValueOnLastSetup - return_value;
+ }
+ else
+ {
+ wrap_counter = SynchPrescalerUserConfig - return_value;
+ return_value = SSRValueOnLastSetup + wrap_counter;
+ }
+
+ /**
+ * At this stage, ReturnValue holds the number of ticks counted by SSR
+ * Need to translate in number of ticks counted by the Wakeuptimer
+ */
+ return_value = return_value*AsynchPrescalerUserConfig;
+ return_value = return_value >> WakeupTimerDivider;
+ }
+ else
+ {
+ return_value = 0;
+ }
+
+ return (uint16_t)return_value;
+}
+
+/**
+ * @brief Set the wakeup counter
+ * @note The API is writing the counter value so that the value is decreased by one to cope with the fact
+ * the interrupt is generated with 1 extra clock cycle (See RefManuel)
+ * It assumes all condition are met to be allowed to write the wakeup counter
+ * @param Value: Value to be written in the counter
+ * @retval None
+ */
+static void RestartWakeupCounter(uint16_t Value)
+{
+ /**
+ * The wakeuptimer has been disabled in the calling function to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ * __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+ */
+
+ if(Value == 0)
+ {
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ else
+ {
+ if((Value > 1) ||(WakeupTimerDivider != 1))
+ {
+ Value -= 1;
+ }
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+
+ MODIFY_REG(RTC->WUTR, RTC_WUTR_WUT, Value);
+
+ /**
+ * Update the value here after the WUTWF polling that may take some time
+ */
+ SSRValueOnLastSetup = ReadRtcSsrValue();
+
+ __HAL_RTC_WAKEUPTIMER_ENABLE(phrtc); /**< Enable the Wakeup Timer */
+
+ HW_TS_RTC_CountUpdated_AppNot();
+ }
+
+ return ;
+}
+
+/**
+ * @brief Reschedule the list of timer
+ * @note 1) Update the count left for each timer in the list
+ * 2) Setup the wakeuptimer
+ * @param None
+ * @retval None
+ */
+static void RescheduleTimerList(void)
+{
+ uint8_t localTimerID;
+ uint32_t timecountleft;
+ uint16_t wakeup_timer_value;
+ uint16_t time_elapsed;
+
+ /**
+ * The wakeuptimer is disabled now to reduce the time to poll the WUTWF
+ * FLAG when the new value will have to be written
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ localTimerID = CurrentRunningTimerID;
+
+ /**
+ * Calculate what will be the value to write in the wakeuptimer
+ */
+ timecountleft = aTimerContext[localTimerID].CountLeft;
+
+ /**
+ * Read how much has been counted
+ */
+ time_elapsed = ReturnTimeElapsed();
+
+ if(timecountleft < time_elapsed )
+ {
+ /**
+ * There is no tick left to count
+ */
+ wakeup_timer_value = 0;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+ else
+ {
+ if(timecountleft > (time_elapsed + MaxWakeupTimerSetup))
+ {
+ /**
+ * The number of tick left is greater than the Wakeuptimer maximum value
+ */
+ wakeup_timer_value = MaxWakeupTimerSetup;
+
+ WakeupTimerLimitation = WakeupTimerValue_Overpassed;
+ }
+ else
+ {
+ wakeup_timer_value = timecountleft - time_elapsed;
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ }
+
+ }
+
+ /**
+ * update ticks left to be counted for each timer
+ */
+ while(localTimerID != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ if (aTimerContext[localTimerID].CountLeft < time_elapsed)
+ {
+ aTimerContext[localTimerID].CountLeft = 0;
+ }
+ else
+ {
+ aTimerContext[localTimerID].CountLeft -= time_elapsed;
+ }
+ localTimerID = aTimerContext[localTimerID].NextID;
+ }
+
+ /**
+ * Write next count
+ */
+ RestartWakeupCounter(wakeup_timer_value);
+
+ return ;
+}
+
+/* Public functions ----------------------------------------------------------*/
+
+/**
+ * For all public interface except that may need write access to the RTC, the RTC
+ * shall be unlock at the beginning and locked at the output
+ * In order to ease maintainability, the unlock is done at the top and the lock at then end
+ * in case some new implementation is coming in the future
+ */
+
+void HW_TS_RTC_Wakeup_Handler(void)
+{
+ HW_TS_pTimerCb_t ptimer_callback;
+ uint32_t timer_process_id;
+ uint8_t local_current_running_timer_id;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+/* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ /**
+ * Disable the Wakeup Timer
+ * This may speed up a bit the processing to wait the timer to be disabled
+ * The timer is still counting 2 RTCCLK
+ */
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc);
+
+ local_current_running_timer_id = CurrentRunningTimerID;
+
+ if(aTimerContext[local_current_running_timer_id].TimerIDStatus == TimerID_Running)
+ {
+ ptimer_callback = aTimerContext[local_current_running_timer_id].pTimerCallBack;
+ timer_process_id = aTimerContext[local_current_running_timer_id].TimerProcessID;
+
+ /**
+ * It should be good to check whether the TimeElapsed is greater or not than the tick left to be counted
+ * However, due to the inaccuracy of the reading of the time elapsed, it may return there is 1 tick
+ * to be left whereas the count is over
+ * A more secure implementation has been done with a flag to state whereas the full count has been written
+ * in the wakeuptimer or not
+ */
+ if(WakeupTimerLimitation != WakeupTimerValue_Overpassed)
+ {
+ if(aTimerContext[local_current_running_timer_id].TimerMode == hw_ts_Repeated)
+ {
+ UnlinkTimer(local_current_running_timer_id, SSR_Read_Not_Requested);
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Start(local_current_running_timer_id, aTimerContext[local_current_running_timer_id].CounterInit);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ HW_TS_Stop(local_current_running_timer_id);
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+ }
+
+ HW_TS_RTC_Int_AppNot(timer_process_id, local_current_running_timer_id, ptimer_callback);
+ }
+ else
+ {
+ RescheduleTimerList();
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+ }
+ else
+ {
+ /**
+ * We should never end up in this case
+ * However, if due to any bug in the timer server this is the case, the mistake may not impact the user.
+ * We could just clean the interrupt flag and get out from this unexpected interrupt
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ return;
+}
+
+void HW_TS_Init(HW_TS_InitMode_t TimerInitMode, RTC_HandleTypeDef *hrtc)
+{
+ uint8_t loop;
+ uint32_t localmaxwakeuptimersetup;
+
+ /**
+ * Get RTC handler
+ */
+ phrtc = hrtc;
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
+
+ /**
+ * Readout the user config
+ */
+ WakeupTimerDivider = (4 - ((uint32_t)(READ_BIT(RTC->CR, RTC_CR_WUCKSEL))));
+
+ AsynchPrescalerUserConfig = (uint8_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_A) >> (uint32_t)POSITION_VAL(RTC_PRER_PREDIV_A)) + 1;
+
+ SynchPrescalerUserConfig = (uint16_t)(READ_BIT(RTC->PRER, RTC_PRER_PREDIV_S)) + 1;
+
+ /**
+ * Margin is taken to avoid wrong calculation when the wrap around is there and some
+ * application interrupts may have delayed the reading
+ */
+ localmaxwakeuptimersetup = ((((SynchPrescalerUserConfig - 1)*AsynchPrescalerUserConfig) - CFG_HW_TS_RTC_HANDLER_MAX_DELAY) >> WakeupTimerDivider);
+
+ if(localmaxwakeuptimersetup >= 0xFFFF)
+ {
+ MaxWakeupTimerSetup = 0xFFFF;
+ }
+ else
+ {
+ MaxWakeupTimerSetup = (uint16_t)localmaxwakeuptimersetup;
+ }
+
+ /**
+ * Configure EXTI module
+ */
+ LL_EXTI_EnableRisingTrig_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+ LL_EXTI_EnableIT_0_31(RTC_EXTI_LINE_WAKEUPTIMER_EVENT);
+
+ if(TimerInitMode == hw_ts_InitMode_Full)
+ {
+ WakeupTimerLimitation = WakeupTimerValue_LargeEnough;
+ SSRValueOnLastSetup = SSR_FORBIDDEN_VALUE;
+
+ /**
+ * Initialize the timer server
+ */
+ for(loop = 0; loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; loop++)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Free;
+ }
+
+ CurrentRunningTimerID = CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER; /**< Set ID to non valid value */
+
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ __HAL_RTC_WAKEUPTIMER_ENABLE_IT(phrtc, RTC_IT_WUT); /**< Enable interrupt in RTC module */
+ }
+ else
+ {
+ if(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTF) != RESET)
+ {
+ /**
+ * Simulate that the Timer expired
+ */
+ HAL_NVIC_SetPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID);
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_SetPriority(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO, CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO); /**< Set NVIC priority */
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+ return;
+}
+
+HW_TS_ReturnStatus_t HW_TS_Create(uint32_t TimerProcessID, uint8_t *pTimerId, HW_TS_Mode_t TimerMode, HW_TS_pTimerCb_t pftimeout_handler)
+{
+ HW_TS_ReturnStatus_t localreturnstatus;
+ uint8_t loop = 0;
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ while((loop < CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER) && (aTimerContext[loop].TimerIDStatus != TimerID_Free))
+ {
+ loop++;
+ }
+
+ if(loop != CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ aTimerContext[loop].TimerIDStatus = TimerID_Created;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ aTimerContext[loop].TimerProcessID = TimerProcessID;
+ aTimerContext[loop].TimerMode = TimerMode;
+ aTimerContext[loop].pTimerCallBack = pftimeout_handler;
+ *pTimerId = loop;
+
+ localreturnstatus = hw_ts_Successful;
+ }
+ else
+ {
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ localreturnstatus = hw_ts_Failed;
+ }
+
+ return(localreturnstatus);
+}
+
+void HW_TS_Delete(uint8_t timer_id)
+{
+ HW_TS_Stop(timer_id);
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Free; /**< release ID */
+
+ return;
+}
+
+void HW_TS_Stop(uint8_t timer_id)
+{
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ UnlinkTimer(timer_id, SSR_Read_Requested);
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(localcurrentrunningtimerid == CFG_HW_TS_MAX_NBR_CONCURRENT_TIMER)
+ {
+ /**
+ * List is empty
+ */
+
+ /**
+ * Disable the timer
+ */
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ /**
+ * Wait for the flag to be back to 0 when the wakeup timer is enabled
+ */
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == SET);
+ }
+ __HAL_RTC_WAKEUPTIMER_DISABLE(phrtc); /**< Disable the Wakeup Timer */
+
+ while(__HAL_RTC_WAKEUPTIMER_GET_FLAG(phrtc, RTC_FLAG_WUTWF) == RESET);
+
+ /**
+ * make sure to clear the flags after checking the WUTWF.
+ * It takes 2 RTCCLK between the time the WUTE bit is disabled and the
+ * time the timer is disabled. The WUTWF bit somehow guarantee the system is stable
+ * Otherwise, when the timer is periodic with 1 Tick, it may generate an extra interrupt in between
+ * due to the autoreload feature
+ */
+ __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(phrtc, RTC_FLAG_WUTF); /**< Clear flag in RTC module */
+ __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); /**< Clear flag in EXTI module */
+ HAL_NVIC_ClearPendingIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Clear pending bit in NVIC */
+ }
+ else if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+void HW_TS_Start(uint8_t timer_id, uint32_t timeout_ticks)
+{
+ uint16_t time_elapsed;
+ uint8_t localcurrentrunningtimerid;
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ uint32_t primask_bit;
+#endif
+
+ if(aTimerContext[timer_id].TimerIDStatus == TimerID_Running)
+ {
+ HW_TS_Stop( timer_id );
+ }
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+#endif
+
+ HAL_NVIC_DisableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Disable NVIC */
+
+ /* Disable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_DISABLE( phrtc );
+
+ aTimerContext[timer_id].TimerIDStatus = TimerID_Running;
+
+ aTimerContext[timer_id].CountLeft = timeout_ticks;
+ aTimerContext[timer_id].CounterInit = timeout_ticks;
+
+ time_elapsed = linkTimer(timer_id);
+
+ localcurrentrunningtimerid = CurrentRunningTimerID;
+
+ if(PreviousRunningTimerID != localcurrentrunningtimerid)
+ {
+ RescheduleTimerList();
+ }
+ else
+ {
+ aTimerContext[timer_id].CountLeft -= time_elapsed;
+ }
+
+ /* Enable the write protection for RTC registers */
+ __HAL_RTC_WRITEPROTECTION_ENABLE( phrtc );
+
+ HAL_NVIC_EnableIRQ(CFG_HW_TS_RTC_WAKEUP_HANDLER_ID); /**< Enable NVIC */
+
+#if (CFG_HW_TS_USE_PRIMASK_AS_CRITICAL_SECTION == 1)
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+#endif
+
+ return;
+}
+
+uint16_t HW_TS_RTC_ReadLeftTicksToCount(void)
+{
+ uint32_t primask_bit;
+ uint16_t return_value, auro_reload_value, elapsed_time_value;
+
+ primask_bit = __get_PRIMASK(); /**< backup PRIMASK bit */
+ __disable_irq(); /**< Disable all interrupts by setting PRIMASK bit on Cortex*/
+
+ if((READ_BIT(RTC->CR, RTC_CR_WUTE) == (RTC_CR_WUTE)) == SET)
+ {
+ auro_reload_value = (uint32_t)(READ_BIT(RTC->WUTR, RTC_WUTR_WUT));
+
+ elapsed_time_value = ReturnTimeElapsed();
+
+ if(auro_reload_value > elapsed_time_value)
+ {
+ return_value = auro_reload_value - elapsed_time_value;
+ }
+ else
+ {
+ return_value = 0;
+ }
+ }
+ else
+ {
+ return_value = TIMER_LIST_EMPTY;
+ }
+
+ __set_PRIMASK(primask_bit); /**< Restore PRIMASK bit*/
+
+ return (return_value);
+}
+
+__weak void HW_TS_RTC_Int_AppNot(uint32_t TimerProcessID, uint8_t TimerID, HW_TS_pTimerCb_t pTimerCallBack)
+{
+ pTimerCallBack();
+
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c
new file mode 100644
index 000000000..775aa241d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c
@@ -0,0 +1,471 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "hw_conf.h"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ (__HANDLE__).Init.BaudRate = CFG_HW_##__USART_BASE__##_BAUDRATE; \
+ (__HANDLE__).Init.WordLength = CFG_HW_##__USART_BASE__##_WORDLENGTH; \
+ (__HANDLE__).Init.StopBits = CFG_HW_##__USART_BASE__##_STOPBITS; \
+ (__HANDLE__).Init.Parity = CFG_HW_##__USART_BASE__##_PARITY; \
+ (__HANDLE__).Init.HwFlowCtl = CFG_HW_##__USART_BASE__##_HWFLOWCTL; \
+ (__HANDLE__).Init.Mode = CFG_HW_##__USART_BASE__##_MODE; \
+ (__HANDLE__).Init.OverSampling = CFG_HW_##__USART_BASE__##_OVERSAMPLING; \
+ (__HANDLE__).AdvancedInit.AdvFeatureInit = CFG_HW_##__USART_BASE__##_ADVFEATUREINIT; \
+ HAL_UART_Init(&(__HANDLE__)); \
+ } while(0)
+
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Receive_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##TxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ HAL_UART_Transmit_IT(&(__HANDLE__), p_data, size); \
+ } while(0)
+
+#define HW_UART_TX(__HANDLE__, __USART_BASE__) \
+ do{ \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = HAL_UART_Transmit(&(__HANDLE__), p_data, size, timeout); \
+ } while(0)
+
+#define HW_UART_MSP_UART_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ \
+ /* Configure Tx Pin */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_TX_PIN ; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_TX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_TX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_TX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_TX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_TX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure Rx Pin */ \
+ CFG_HW_##__USART_BASE__##_RX_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_RX_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_RX_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_RX_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_RX_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_RX_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_RX_PORT, &GPIO_InitStruct); \
+ \
+ \
+ /* Configure CTS Pin */ \
+ CFG_HW_##__USART_BASE__##_CTS_PORT_CLK_ENABLE(); \
+ \
+ GPIO_InitStruct.Pin = CFG_HW_##__USART_BASE__##_CTS_PIN; \
+ GPIO_InitStruct.Mode = CFG_HW_##__USART_BASE__##_CTS_MODE; \
+ GPIO_InitStruct.Pull = CFG_HW_##__USART_BASE__##_CTS_PULL; \
+ GPIO_InitStruct.Speed = CFG_HW_##__USART_BASE__##_CTS_SPEED; \
+ GPIO_InitStruct.Alternate = CFG_HW_##__USART_BASE__##_CTS_ALTERNATE; \
+ HAL_GPIO_Init(CFG_HW_##__USART_BASE__##_CTS_PORT, &GPIO_InitStruct); \
+ \
+ /* Set USART source clock */ \
+ __HAL_RCC_##__USART_BASE__##_CONFIG(CFG_HW_##__USART_BASE__##_SOURCE_CLOCK); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_CLK_ENABLE(); \
+ \
+ HAL_NVIC_SetPriority(__USART_BASE__##_IRQn, CFG_HW_##__USART_BASE__##_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(__USART_BASE__##_IRQn); \
+ } while(0)
+
+#define HW_UART_MSP_TX_DMA_INIT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ /* Configure the DMA handler for Transmission process */ \
+ /* Enable DMA clock */ \
+ CFG_HW_##__USART_BASE__##_DMA_CLK_ENABLE(); \
+ /* Enable DMA MUX clock */ \
+ CFG_HW_##__USART_BASE__##_DMAMUX_CLK_ENABLE(); \
+ \
+ HW_hdma_##__HANDLE__##_tx.Instance = CFG_HW_##__USART_BASE__##_TX_DMA_CHANNEL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Request = CFG_HW_##__USART_BASE__##_TX_DMA_REQ; \
+ HW_hdma_##__HANDLE__##_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphInc = DMA_PINC_DISABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemInc = DMA_MINC_ENABLE; \
+ HW_hdma_##__HANDLE__##_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; \
+ HW_hdma_##__HANDLE__##_tx.Init.Mode = DMA_NORMAL; \
+ HW_hdma_##__HANDLE__##_tx.Init.Priority = DMA_PRIORITY_LOW; \
+ \
+ HAL_DMA_Init(&HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* Associate the initialized DMA handle to the UART handle */ \
+ __HAL_LINKDMA(huart, hdmatx, HW_hdma_##__HANDLE__##_tx); \
+ \
+ /* NVIC configuration for DMA transfer complete interrupt */ \
+ HAL_NVIC_SetPriority(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn, CFG_HW_##__USART_BASE__##_DMA_TX_PREEMPTPRIORITY, CFG_HW_##__USART_BASE__##_DMA_TX_SUBPRIORITY); \
+ HAL_NVIC_EnableIRQ(CFG_HW_##__USART_BASE__##_TX_DMA_IRQn); \
+ } while(0)
+
+/* Variables ------------------------------------------------------------------*/
+#if (CFG_HW_USART1_ENABLED == 1)
+ UART_HandleTypeDef huart1 = {0};
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_huart1_tx ={0};
+#endif
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ UART_HandleTypeDef lpuart1 = {0};
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ DMA_HandleTypeDef HW_hdma_lpuart1_tx ={0};
+#endif
+ void (*HW_lpuart1RxCb)(void);
+ void (*HW_lpuart1TxCb)(void);
+#endif
+
+ void HW_UART_Init(hw_uart_id_t hw_uart_id)
+ {
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_INIT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_INIT(lpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ void HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+ {
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_RX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_RX_IT(lpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ void HW_UART_Transmit_IT(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+ {
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX_IT(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX_IT(lpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ hw_status_t HW_UART_Transmit(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, uint32_t timeout)
+ {
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_UART_TX(huart1, USART1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_UART_TX(lpuart1, LPUART1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+ }
+
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*cb)(void))
+ {
+ HAL_StatusTypeDef hal_status = HAL_OK;
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HW_huart1TxCb = cb;
+ huart1.Instance = USART1;
+ hal_status = HAL_UART_Transmit_DMA(&huart1, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_USART2_ENABLED == 1)
+ case hw_uart2:
+ HW_huart2TxCb = cb;
+ huart2.Instance = USART2;
+ hal_status = HAL_UART_Transmit_DMA(&huart2, p_data, size);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HW_lpuart1TxCb = cb;
+ lpuart1.Instance = LPUART1;
+ hal_status = HAL_UART_Transmit_DMA(&lpuart1, p_data, size);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ switch (hal_status)
+ {
+ case HAL_OK:
+ hw_status = hw_uart_ok;
+ break;
+
+ case HAL_ERROR:
+ hw_status = hw_uart_error;
+ break;
+
+ case HAL_BUSY:
+ hw_status = hw_uart_busy;
+ break;
+
+ case HAL_TIMEOUT:
+ hw_status = hw_uart_to;
+ break;
+
+ default:
+ break;
+ }
+
+ return hw_status;
+ }
+
+ void HW_UART_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+ {
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ HAL_UART_IRQHandler(&huart1);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ HAL_UART_IRQHandler(&lpuart1);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ void HW_UART_DMA_Interrupt_Handler(hw_uart_id_t hw_uart_id)
+ {
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ case hw_uart1:
+ HAL_DMA_IRQHandler(huart1.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_USART2_DMA_TX_SUPPORTED == 1)
+ case hw_uart2:
+ HAL_DMA_IRQHandler(huart2.hdmatx);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ case hw_lpuart1:
+ HAL_DMA_IRQHandler(lpuart1.hdmatx);
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ void HAL_UART_MspInit(UART_HandleTypeDef *huart)
+ {
+#if ( (CFG_HW_USART1_ENABLED == 1) || (CFG_HW_LPUART1_ENABLED == 1) )
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+#endif
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ HW_UART_MSP_UART_INIT( huart1, USART1 );
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( huart1, USART1 );
+#endif
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ HW_UART_MSP_UART_INIT( lpuart1, LPUART1 );
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HW_UART_MSP_TX_DMA_INIT( lpuart1, LPUART1 );
+#endif
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+ {
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1RxCb)
+ {
+ HW_huart1RxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_lpuart1RxCb)
+ {
+ HW_lpuart1RxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+ {
+ switch ((uint32_t)huart->Instance)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case (uint32_t)USART1:
+ if(HW_huart1TxCb)
+ {
+ HW_huart1TxCb();
+ }
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case (uint32_t)LPUART1:
+ if(HW_lpuart1TxCb)
+ {
+ HW_lpuart1TxCb();
+ }
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c
new file mode 100644
index 000000000..9f1faa6ad
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/main.c
@@ -0,0 +1,333 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_Thread_FTD_fw.bin binary
+ flashed on the Wireless Coprocessor.
+ If it is not the case, you need to use STM32CubeProgrammer to load the appropriate
+ binary.
+
+ All available binaries are located under following directory:
+ /Projects/STM32_Copro_Wireless_Binaries
+
+ Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+ Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the
+ detailed procedure to change the Wireless Coprocessor binary.
+
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* Private typedef -----------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Global variables ---------------------------------------------------------*/
+RTC_HandleTypeDef hrtc = { 0 }; /**< RTC handler declaration */
+
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static void Reset_BackupDomain( void );
+static void Init_RTC( void );
+static void SystemClock_Config( void );
+static void Reset_Device( void );
+static void Reset_IPCC( void );
+static void Init_Exti( void );
+
+
+/**
+ * @brief Main function
+ *
+ * @param None
+ * @retval 0
+ */
+
+int main( void )
+{
+ HAL_Init();
+
+ Reset_Device();
+
+ /**
+ * When the application is expected to run at higher speed, it should be better to set the correct system clock
+ * in system_stm32yyxx.c so that the initialization phase is running at max speed.
+ */
+ SystemClock_Config(); /**< Configure the system clock */
+
+ Init_Exti( );
+
+ Init_RTC();
+
+ APPE_Init( );
+
+ while(1)
+ {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Reset_Device( void )
+{
+#if ( CFG_HW_RESET_BY_FW == 1 )
+ Reset_BackupDomain();
+
+ Reset_IPCC();
+#endif
+
+ return;
+}
+
+/**
+ * @brief Reset IPCC
+ *
+ * @note
+ *
+ * @param None
+ * @retval None
+ */
+static void Reset_IPCC( void )
+{
+ LL_AHB3_GRP1_EnableClock(LL_AHB3_GRP1_PERIPH_IPCC);
+
+ LL_C1_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_ClearFlag_CHx(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableTransmitChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C1_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ LL_C2_IPCC_DisableReceiveChannel(
+ IPCC,
+ LL_IPCC_CHANNEL_1 | LL_IPCC_CHANNEL_2 | LL_IPCC_CHANNEL_3 | LL_IPCC_CHANNEL_4
+ | LL_IPCC_CHANNEL_5 | LL_IPCC_CHANNEL_6);
+
+ return;
+}
+
+/**
+ * @brief Reset the backup domain
+ *
+ * @note
+ *
+ * @param None
+ * @retval None
+ */
+static void Reset_BackupDomain( void )
+{
+ if ((LL_RCC_IsActiveFlag_PINRST() != FALSE) && (LL_RCC_IsActiveFlag_SFTRST() == FALSE))
+ {
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_BACKUPRESET_FORCE();
+ __HAL_RCC_BACKUPRESET_RELEASE();
+ }
+
+ return;
+}
+
+static void Init_RTC( void )
+{
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge
+ * This bit shall be written in the register before writing the next one
+ */
+ HAL_PWR_EnableBkUpAccess();
+
+ __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); /**< Select LSI as RTC Input */
+
+ __HAL_RCC_RTC_ENABLE(); /**< Enable RTC */
+
+ hrtc.Instance = RTC; /**< Define instance */
+
+ /**
+ * Set the Asynchronous prescaler
+ */
+ hrtc.Init.AsynchPrediv = CFG_RTC_ASYNCH_PRESCALER;
+ hrtc.Init.SynchPrediv = CFG_RTC_SYNCH_PRESCALER;
+ HAL_RTC_Init(&hrtc);
+
+ /* Disable RTC registers write protection */
+ LL_RTC_DisableWriteProtection(RTC);
+
+ LL_RTC_WAKEUP_SetClock(RTC, CFG_RTC_WUCKSEL_DIVIDER);
+
+ /* Enable RTC registers write protection */
+ LL_RTC_EnableWriteProtection(RTC);
+
+ return;
+}
+
+/**
+ * @brief Configure the system clock
+ *
+ * @note This API configures
+ * - The system clock source
+ * - The AHBCLK, APBCLK dividers
+ * - The flash latency
+ * - The PLL settings (when required)
+ *
+ * @param None
+ * @retval None
+ */
+static void SystemClock_Config( void )
+{
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
+ RCC_CRSInitTypeDef RCC_CRSInitStruct = { 0 };
+
+ /**
+ * This prevents the CPU2 to disable the HSI48 oscillator when
+ * it does not use anymore the RNG IP
+ */
+ LL_HSEM_1StepLock( HSEM, 5 );
+
+ LL_RCC_HSI48_Enable();
+
+ while(!LL_RCC_HSI48_IsReady());
+
+ /* Select HSI48 as USB clock source */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
+ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
+
+ /*Configure the clock recovery system (CRS)**********************************/
+
+ /* Enable CRS Clock */
+ __HAL_RCC_CRS_CLK_ENABLE();
+
+ /* Default Synchro Signal division factor (not divided) */
+ RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
+
+ /* Set the SYNCSRC[1:0] bits according to CRS_Source value */
+ RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
+
+ /* HSI48 is synchronized with USB SOF at 1KHz rate */
+ RCC_CRSInitStruct.ReloadValue = RCC_CRS_RELOADVALUE_DEFAULT;
+ RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;
+
+ RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
+
+ /* Set the TRIM[5:0] to the default value*/
+ RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;
+
+ /* Start automatic synchronization */
+ HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+ /**
+ * Write twice the value to flush the APB-AHB bridge to ensure the bit is written
+ */
+ HAL_PWR_EnableBkUpAccess(); /**< Enable access to the RTC registers */
+ HAL_PWR_EnableBkUpAccess();
+
+ /**
+ * Select LSE clock
+ */
+ LL_RCC_LSE_Enable();
+ while(!LL_RCC_LSE_IsReady());
+
+ /**
+ * Select wakeup source of BLE RF
+ */
+ LL_RCC_SetRFWKPClockSource(LL_RCC_RFWKP_CLKSOURCE_LSE);
+
+ return;
+}
+
+static void Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31(~0);
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+void HAL_Delay(uint32_t Delay)
+{
+ uint32_t tickstart = HAL_GetTick();
+ uint32_t wait = Delay;
+
+ /* Add a freq to guarantee minimum wait */
+ if (wait < HAL_MAX_DELAY)
+ {
+ wait += HAL_GetTickFreq();
+ }
+
+ while ((HAL_GetTick() - tickstart) < wait)
+ {
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+ #if defined ( __CC_ARM)
+ __force_stores();
+ #endif
+
+ __WFI( );
+ }
+}
+
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..1418e0a36
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,297 @@
+/* USER CODE BEGIN Header */
+/**
+ ***************************************************************************************
+ * File Name : stm32_lpm_if.c
+ * Description : Low layer function to enter/exit low power modes (stop, sleep).
+ ***************************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32_lpm_if.h"
+#include "stm32_lpm.h"
+#include "app_conf.h"
+/* USER CODE BEGIN include */
+
+/* USER CODE END include */
+
+/* Exported variables --------------------------------------------------------*/
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+{
+ PWR_EnterSleepMode,
+ PWR_ExitSleepMode,
+
+ PWR_EnterStopMode,
+ PWR_ExitStopMode,
+
+ PWR_EnterOffMode,
+ PWR_ExitOffMode,
+};
+
+/* Private function prototypes -----------------------------------------------*/
+static void Switch_On_HSI( void );
+/* USER CODE BEGIN Private_Function_Prototypes */
+
+/* USER CODE END Private_Function_Prototypes */
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN Private_Typedef */
+
+/* USER CODE END Private_Typedef */
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Define */
+
+/* USER CODE END Private_Define */
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Private_Macro */
+
+/* USER CODE END Private_Macro */
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN Private_Variables */
+
+/* USER CODE END Private_Variables */
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Enters Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_EnterOffMode( void )
+{
+/* USER CODE BEGIN PWR_EnterOffMode */
+
+ /**
+ * The systick should be disabled for the same reason than when the device enters stop mode because
+ * at this time, the device may enter either OffMode or StopMode.
+ */
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER OFF MODE
+ ***********************************************************************************/
+ /*
+ * There is no risk to clear all the WUF here because in the current implementation, this API is called
+ * in critical section. If an interrupt occurs while in that critical section before that point,
+ * the flag is set and will be cleared here but the system will not enter Off Mode
+ * because an interrupt is pending in the NVIC. The ISR will be executed when moving out
+ * of this critical section
+ */
+ LL_PWR_ClearFlag_WU( );
+
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STANDBY );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterOffMode */
+}
+
+/**
+ * @brief Exits Low Power Off Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitOffMode( void )
+{
+/* USER CODE BEGIN PWR_ExitOffMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitOffMode */
+}
+
+/**
+ * @brief Enters Low Power Stop Mode
+ * @note ARM exists the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterStopMode( void )
+{
+/* USER CODE BEGIN PWR_EnterStopMode */
+ /**
+ * When HAL_DBGMCU_EnableDBGStopMode() is called to keep the debugger active in Stop Mode,
+ * the systick shall be disabled otherwise the cpu may crash when moving out from stop mode
+ *
+ * When in production, the HAL_DBGMCU_EnableDBGStopMode() is not called so that the device can reach best power consumption
+ * However, the systick should be disabled anyway to avoid the case when it is about to expire at the same time the device enters
+ * stop mode ( this will abort the Stop Mode entry ).
+ */
+ HAL_SuspendTick();
+
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if ( ! LL_HSEM_1StepLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID ) )
+ {
+ if( LL_PWR_IsActiveFlag_C2DS( ) )
+ {
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required on Cut2.0
+ * It is useless from Cut2.1
+ */
+ Switch_On_HSI( );
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ LL_PWR_SetPowerMode( LL_PWR_MODE_STOP2 );
+
+ LL_LPM_EnableDeepSleep( ); /**< Set SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores( );
+#endif
+
+ __WFI();
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @note Enable the pll at 32MHz
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+ /**
+ * This function is called from CRITICAL SECTION
+ */
+
+ /* Release ENTRY_STOP_MODE semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0 );
+
+ while( LL_HSEM_1StepLock( HSEM, CFG_HW_RCC_SEMID ) );
+
+ if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ {
+ LL_RCC_HSE_Enable( );
+ while(!LL_RCC_HSE_IsReady( ));
+ LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSE);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+ }
+ else
+ {
+ /**
+ * As long as the current application is fine with HSE as system clock source,
+ * there is nothing to do here
+ */
+ }
+
+ /* Release RCC semaphore */
+ LL_HSEM_ReleaseLock( HSEM, CFG_HW_RCC_SEMID, 0 );
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitStopMode */
+}
+
+/**
+ * @brief Enters Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_EnterSleepMode( void )
+{
+/* USER CODE BEGIN PWR_EnterSleepMode */
+
+ HAL_SuspendTick();
+
+ /************************************************************************************
+ * ENTER SLEEP MODE
+ ***********************************************************************************/
+ LL_LPM_EnableSleep( ); /**< Clear SLEEPDEEP bit of Cortex System Control Register */
+
+ /**
+ * This option is used to ensure that store operations are completed
+ */
+#if defined ( __CC_ARM)
+ __force_stores();
+#endif
+
+ __WFI( );
+/* USER CODE END PWR_EnterSleepMode */
+}
+
+/**
+ * @brief Exits Low Power Sleep Mode
+ * @note ARM exits the function when waking up
+ * @param none
+ * @retval none
+ */
+void PWR_ExitSleepMode( void )
+{
+/* USER CODE BEGIN PWR_ExitSleepMode */
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Switch the system clock on HSI
+ * @param none
+ * @retval none
+ */
+static void Switch_On_HSI( void )
+{
+ LL_RCC_HSI_Enable( );
+ while(!LL_RCC_HSI_IsReady( ));
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSI );
+ LL_RCC_SetSMPSClockSource(LL_RCC_SMPS_CLKSOURCE_HSI);
+ while (LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSI);
+}
+
+/* USER CODE BEGIN Private_Functions */
+
+/* USER CODE END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..2c41f893c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,191 @@
+/**
+ ******************************************************************************
+ * @file stm32xx_it.c
+ * @author MCD Application Team
+ * @brief Main Interrupt Service Routines.
+ * This file provides template for all exceptions handler and
+ * peripherals interrupt service routine.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "stm32wbxx_it.h"
+
+/******************************************************************************/
+/* Cortex-M4+ Processor Exceptions Handlers */
+/******************************************************************************/
+
+
+/**
+ * @brief This function handles NMI exception.
+ * @param None
+ * @retval None
+ */
+void NMI_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Hard Fault exception.
+ * @param None
+ * @retval None
+ */
+void HardFault_Handler(void)
+{
+ while(1 == 1);
+}
+
+
+/**
+ * @brief This function handles SVCall exception.
+ * @param None
+ * @retval None
+ */
+void SVC_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles Debug Monitor exception.
+ * @param None
+ * @retval None
+ */
+void DebugMon_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles PendSVC exception.
+ * @param None
+ * @retval None
+ */
+void PendSV_Handler(void)
+{
+}
+
+/**
+ * @brief This function handles SysTick exception.
+ * @param None
+ * @retval None
+ */
+void SysTick_Handler(void)
+{
+ HAL_IncTick();
+}
+
+/**
+ * @brief This function handles the UART1 IT handler.
+ * @param None
+ * @retval None
+ */
+#if(CFG_HW_USART1_ENABLED == 1)
+void USART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+/**
+ * @brief This function handles the UART1 DMA IT handler.
+ * @param None
+ * @retval None
+ */
+#if(CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_USART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_uart1);
+}
+#endif
+
+/**
+ * @brief This function handles the LPUART1 IT handler.
+ * @param None
+ * @retval None
+ */
+#if(CFG_HW_LPUART1_ENABLED == 1)
+void LPUART1_IRQHandler(void)
+{
+ HW_UART_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+/**
+ * @brief This function handles the LPUART1 DMA IT handler.
+ * @param None
+ * @retval None
+ */
+#if(CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+void CFG_HW_LPUART1_DMA_TX_IRQHandler( void )
+{
+ HW_UART_DMA_Interrupt_Handler(hw_lpuart1);
+}
+#endif
+
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+void IPCC_C1_TX_IRQHandler(void)
+{
+ HW_IPCC_Tx_Handler();
+
+ return;
+}
+
+void IPCC_C1_RX_IRQHandler(void)
+{
+ HW_IPCC_Rx_Handler();
+ return;
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief This function handles USB FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+void USB_LP_IRQHandler(void)
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief This function handles USB FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+void USB_HP_IRQHandler(void)
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief This function handles USB FS global interrupt request.
+ * @param None
+ * @retval None
+ */
+void USB_FS_WKUP_IRQHandler(void)
+{
+ HAL_PCD_IRQHandler(&hpcd);
+}
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c
new file mode 100644
index 000000000..5374fcbab
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c
@@ -0,0 +1,211 @@
+/**
+ ******************************************************************************
+ * File Name : stm_logging.c
+ * Description : This file contains all the defines and functions used
+ * for logging on Application examples.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/**
+ * @file
+ * This file implements logging functions to be used in Application examples.
+ *
+ */
+
+#include <ctype.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "app_conf.h"
+#include "stm_logging.h"
+
+#define LOG_PARSE_BUFFER_SIZE 256U
+
+#define LOG_TIMESTAMP_ENABLE 0
+#define LOG_REGION_ENABLE 1U
+#define LOG_RTT_COLOR_ENABLE 1U
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#define RTT_COLOR_CODE_DEFAULT "\x1b[0m"
+#define RTT_COLOR_CODE_RED "\x1b[0;91m"
+#define RTT_COLOR_CODE_GREEN "\x1b[0;92m"
+#define RTT_COLOR_CODE_YELLOW "\x1b[0;93m"
+#define RTT_COLOR_CODE_CYAN "\x1b[0;96m"
+
+#else /* LOG_RTT_COLOR_ENABLE == 1 */
+#define RTT_COLOR_CODE_DEFAULT ""
+#define RTT_COLOR_CODE_RED ""
+#define RTT_COLOR_CODE_GREEN ""
+#define RTT_COLOR_CODE_YELLOW ""
+#define RTT_COLOR_CODE_CYAN ""
+#endif /* LOG_RTT_COLOR_ENABLE == 1 */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for outputting code region string.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] otLogRegion The region ID.
+ *
+ * @returns String with a log level color value.
+ */
+static inline uint16_t logRegion(char *aLogString, uint16_t aMaxSize,
+ appliLogRegion_t aLogRegion)
+{
+ char logRegionString[30U];
+
+ switch (aLogRegion)
+ {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ case APPLI_LOG_REGION_OPENTHREAD_API:
+ strcpy(logRegionString, "[M4 OPENTHREAD API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_LINK:
+ strcpy(logRegionString, "[M4 LINK API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_INSTANCE:
+ strcpy(logRegionString, "[M4 INSTANCE API]");
+ break;
+ case APPLI_LOG_REGION_OT_API_MESSAGE:
+ strcpy(logRegionString, "[M4 MESSAGE API]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for getting color of a given level log.
+ *
+ * @param[in] aLogLevel The log level.
+ *
+ * @returns String with a log level color value.
+ */
+static inline const char *levelToString(appliLogLevel_t aLogLevel)
+{
+ switch (aLogLevel)
+ {
+ case LOG_LEVEL_CRIT:
+ return RTT_COLOR_CODE_RED;
+
+ case LOG_LEVEL_WARN:
+ return RTT_COLOR_CODE_YELLOW;
+
+ case LOG_LEVEL_INFO:
+ return RTT_COLOR_CODE_GREEN;
+
+ case LOG_LEVEL_DEBG:
+ default:
+ return RTT_COLOR_CODE_DEFAULT;
+ }
+}
+#endif /* CFG_DEBUG_TRACE */
+
+#if (CFG_DEBUG_TRACE != 0)
+/**
+ * Function for printing log level.
+ *
+ * @param[inout] aLogString Pointer to log buffer.
+ * @param[in] aMaxSize Maximum size of log buffer.
+ * @param[in] aLogLevel Log level.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logLevel(char *aLogString, uint16_t aMaxSize,
+ appliLogLevel_t aLogLevel)
+{
+ return snprintf(aLogString, aMaxSize, "%s", levelToString(aLogLevel));
+}
+#endif /* CFG_DEBUG_TRACE */
+#endif /* LOG_RTT_COLOR_ENABLE */
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+/**
+ * Function for printing actual timestamp.
+ *
+ * @param[inout] aLogString Pointer to the log buffer.
+ * @param[in] aMaxSize Maximum size of the log buffer.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+static inline uint16_t logTimestamp(char *aLogString, uint16_t aMaxSize)
+{
+ return snprintf(aLogString, aMaxSize, "%s[%010ld]", RTT_COLOR_CODE_DEFAULT,
+ otPlatAlarmMilliGetNow());
+}
+#endif /* LOG_TIMESTAMP_ENABLE */
+
+/**
+ * Function for printing application log
+ *
+ * @param[in] aLogLevel Log level.
+ * @param[in] aLogRegion The region ID.
+ * @param[in] aFormat User string format.
+ *
+ * @returns Number of bytes successfully written to the log buffer.
+ */
+void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...)
+{
+#if (CFG_DEBUG_TRACE != 0) /* Since the traces are disabled, there is nothing to print */
+ uint16_t length = 0;
+ char logString[LOG_PARSE_BUFFER_SIZE + 1U];
+
+#if (LOG_TIMESTAMP_ENABLE == 1U)
+ length += logTimestamp(logString, LOG_PARSE_BUFFER_SIZE);
+#endif
+
+#if (LOG_RTT_COLOR_ENABLE == 1U)
+ /* Add level information */
+ length += logLevel(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogLevel);
+#endif
+
+#if (LOG_REGION_ENABLE == 1U)
+ /* Add Region information */
+ length += logRegion(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aLogRegion);
+#endif
+
+ /* Parse user string */
+ va_list paramList;
+ va_start(paramList, aFormat);
+ length += vsnprintf(&logString[length], (LOG_PARSE_BUFFER_SIZE - length),
+ aFormat, paramList);
+ logString[length++] = '\r';
+ logString[length++] = '\n';
+ logString[length++] = 0;
+ va_end(paramList);
+
+ if (aLogLevel <= APPLI_CONFIG_LOG_LEVEL)
+ {
+ printf("%s", logString);
+ }else
+ {
+ /* Print nothing */
+ }
+#endif /* CFG_DEBUG_TRACE */
+}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..e3025c7f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,343 @@
+/**
+ ******************************************************************************
+ * @file system_stm32wbxx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex Device Peripheral Access Layer System Source File
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32wbxx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * After each device reset the MSI (4 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * This file configures the system clock as follows:
+ *=============================================================================
+ *-----------------------------------------------------------------------------
+ * System Clock source | MSI
+ *-----------------------------------------------------------------------------
+ * SYSCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * HCLK(Hz) | 4000000
+ *-----------------------------------------------------------------------------
+ * AHB Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB1 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * APB2 Prescaler | 1
+ *-----------------------------------------------------------------------------
+ * PLL_M | 1
+ *-----------------------------------------------------------------------------
+ * PLL_N | 8
+ *-----------------------------------------------------------------------------
+ * PLL_P | 7
+ *-----------------------------------------------------------------------------
+ * PLL_Q | 2
+ *-----------------------------------------------------------------------------
+ * PLL_R | 2
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_P | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_Q | NA
+ *-----------------------------------------------------------------------------
+ * PLLSAI1_R | NA
+ *-----------------------------------------------------------------------------
+ * Require 48MHz for USB OTG FS, | Disabled
+ * SDIO and RNG clock |
+ *-----------------------------------------------------------------------------
+ *=============================================================================
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_system
+ * @{
+ */
+
+/** @addtogroup stm32WBxx_System_Private_Includes
+ * @{
+ */
+
+#include "app_common.h"
+#include "otp.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (MSI_VALUE)
+ #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* MSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/
+#endif /* LSI_VALUE */
+
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/
+#endif /* LSE_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Defines
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32WBxx_System_Private_Variables
+ * @{
+ */
+/* The SystemCoreClock variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 4000000UL ; /*CPU1: M4 on MSI clock after startup (4MHz)*/
+
+ const uint32_t AHBPrescTable[16UL] = {1UL, 3UL, 5UL, 1UL, 1UL, 6UL, 10UL, 32UL, 2UL, 4UL, 8UL, 16UL, 64UL, 128UL, 256UL, 512UL};
+
+ const uint32_t APBPrescTable[8UL] = {0UL, 0UL, 0UL, 0UL, 1UL, 2UL, 3UL, 4UL};
+
+const uint32_t MSIRangeTable[16UL] = {100000UL, 200000UL, 400000UL, 800000UL, 1000000UL, 2000000UL, \
+ 4000000UL, 8000000UL, 16000000UL, 24000000UL, 32000000UL, 48000000UL, 0UL, 0UL, 0UL, 0UL}; /* 0UL values are incorrect cases */
+
+ const uint32_t SmpsPrescalerTable[4UL][6UL]={{1UL,3UL,2UL,2UL,1UL,2UL}, \
+ {2UL,6UL,4UL,3UL,2UL,4UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}, \
+ {4UL,12UL,8UL,6UL,4UL,8UL}};
+
+/**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+ /**
+ * @}
+ */
+
+ /** @addtogroup STM32WBxx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ OTP_ID0_t * p_otp;
+
+ /* FPU settings ------------------------------------------------------------*/
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10UL*2UL))|(3UL << (11UL*2UL))); /* set CP10 and CP11 Full Access */
+#endif
+
+ /**
+ * Read HSE_Tuning from OTP
+ */
+ p_otp = (OTP_ID0_t *) OTP_Read(0);
+ if (p_otp)
+ {
+ LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);
+ }
+
+ LL_RCC_HSE_Enable();
+
+ /**
+ * Set FLASH latency to 1WS
+ */
+ LL_FLASH_SetLatency( LL_FLASH_LATENCY_1 );
+ while( LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1 );
+
+ /**
+ * Switch to HSE
+ *
+ */
+ while(!LL_RCC_HSE_IsReady());
+ LL_RCC_SetSysClkSource( LL_RCC_SYS_CLKSOURCE_HSE );
+ while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSE);
+
+ /**
+ * Switch OFF MSI
+ */
+ LL_RCC_MSI_Disable();
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***)
+ * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value
+ * 32 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp, msirange, pllvco, pllr, pllsource , pllm;
+
+ /* Get MSI Range frequency--------------------------------------------------*/
+
+ /*MSI frequency range in Hz*/
+ msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos];
+
+ /*SystemCoreClock=HAL_RCC_GetSysClockFreq();*/
+ /* Get SYSCLK source -------------------------------------------------------*/
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case 0x00: /* MSI used as system clock source */
+ SystemCoreClock = msirange;
+ break;
+
+ case 0x04: /* HSI used as system clock source */
+ /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+
+ case 0x08: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+
+ case 0x0C: /* PLL used as system clock source */
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC);
+ pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL ;
+
+ if(pllsource == 0x02UL) /* HSI used as PLL clock source */
+ {
+ pllvco = (HSI_VALUE / pllm);
+ }
+ else if(pllsource == 0x03UL) /* HSE used as PLL clock source */
+ {
+ pllvco = (HSE_VALUE / pllm);
+ }
+ else /* MSI used as PLL clock source */
+ {
+ pllvco = (msirange / pllm);
+ }
+
+ pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos);
+ pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL);
+
+ SystemCoreClock = pllvco/pllr;
+ break;
+
+ default:
+ SystemCoreClock = msirange;
+ break;
+ }
+
+ /* Compute HCLK clock frequency --------------------------------------------*/
+ /* Get HCLK1 prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
+ /* HCLK clock frequency */
+ SystemCoreClock = SystemCoreClock / tmp;
+
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewd b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewd
index da150faa3..cf5e5696b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingDemo/EWARM/BLE_MeshLightingDemo.ewd
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewd
@@ -2,7 +2,7 @@
<project>
<fileVersion>3</fileVersion>
<configuration>
- <name>Lighting_Node</name>
+ <name>STM32WBxx_USBD_Thread_Coap_DataTransfer</name>
<toolchain>
<name>ARM</name>
</toolchain>
@@ -44,7 +44,7 @@
</option>
<option>
<name>MemFile</name>
- <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB55_CM4.ddf</state>
+ <state>$TOOLKIT_DIR$\CONFIG\debugger\ST\STM32WB_M4.ddf</state>
</option>
<option>
<name>RunToEnable</name>
@@ -1353,11 +1353,6 @@
</option>
</data>
</settings>
- <settings>
- <name>NULINK_ID</name>
- <archiveVersion>2</archiveVersion>
- <data />
- </settings>
<debuggerPlugins>
<plugin>
<file>$TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin</file>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewp
new file mode 100644
index 000000000..83863ac0b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.ewp
@@ -0,0 +1,1383 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>STM32WBxx_USBD_Thread_Coap_DataTransfer</name>
+ <toolchain>
+ <name>ARM</name>
+ </toolchain>
+ <debug>0</debug>
+ <settings>
+ <name>General</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <version>30</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>ExePath</name>
+ <state>STM32WBxx_USBD\Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>STM32WBxx_USBD\Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>STM32WBxx_USBD\List</state>
+ </option>
+ <option>
+ <name>GEndianMode</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>Input description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>Output description</name>
+ <state>Automatic choice of formatter, without multibyte support.</state>
+ </option>
+ <option>
+ <name>GOutputBinary</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGCoreOrChip</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelect</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>GRuntimeLibSelectSlave</name>
+ <version>0</version>
+ <state>2</state>
+ </option>
+ <option>
+ <name>RTDescription</name>
+ <state>Use the full configuration of the C/C++ runtime library. Full locale interface, C locale, file descriptor support, multibytes in printf and scanf, and hex floats in strtod.</state>
+ </option>
+ <option>
+ <name>OGProductVersion</name>
+ <state>7.60.2.11347</state>
+ </option>
+ <option>
+ <name>OGLastSavedByProductVersion</name>
+ <state>8.20.2.14834</state>
+ </option>
+ <option>
+ <name>GeneralEnableMisra</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraVerbose</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGChipSelectEditMenu</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>GenLowLevelInterface</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>GEndianModeBE</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OGBufferedTerminalOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenStdoutInterface</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>GeneralMisraVer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GeneralMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>RTConfigPath2</name>
+ <state>$TOOLKIT_DIR$\INC\c\DLib_Config_Full.h</state>
+ </option>
+ <option>
+ <name>GBECoreSlave</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGUseCmsis</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGUseCmsisDspLib</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GRuntimeLibThreads</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CoreVariant</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>GFPUDeviceSlave</name>
+ <state>STM32WB55RG ST STM32WB55RG</state>
+ </option>
+ <option>
+ <name>FPU2</name>
+ <version>0</version>
+ <state>4</state>
+ </option>
+ <option>
+ <name>NrRegs</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>NEON</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GFPUCoreSlave2</name>
+ <version>26</version>
+ <state>39</state>
+ </option>
+ <option>
+ <name>OGCMSISPackSelectDevice</name>
+ </option>
+ <option>
+ <name>OgLibHeap</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGLibAdditionalLocale</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGPrintfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfVariant</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OGScanfMultibyteSupport</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>GenLocaleTags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>GenLocaleDisplayOnly</name>
+ <state></state>
+ </option>
+ <option>
+ <name>DSPExtension</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>TrustZone</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>ICCARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>34</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>CCDefines</name>
+ <state>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>USE_STM32WBXX_USB_DONGLE</state>
+ <state>THREAD_WB</state>
+ <state>STM32WB55xx</state>
+ <state>ST_OT_DEBUG</state>
+ <state>FRAMEWORK_1</state>
+ <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</state>
+ </option>
+ <option>
+ <name>CCPreprocFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocComments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPreprocLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMnemonics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListCMessages</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCListAssSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCDiagSuppress</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagRemark</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagWarning</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCDiagError</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCAllowList</name>
+ <version>1</version>
+ <state>11111110</state>
+ </option>
+ <option>
+ <name>CCDebugInfo</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IEndianMode</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IExtraOptionsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CCLangConformance</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCSignedPlainChar</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCRequirePrototypes</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCDiagWarnAreErr</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCompilerRuntimeInfo</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>CCLibConfigHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>PreInclude</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CompilerMisraOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCIncludePath2</name>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32WBxx\Include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.USBDongle\</state>
+ <state>$PROJ_DIR$\..\Core\Inc</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\App</state>
+ <state>$PROJ_DIR$\..\STM32_WPAN\Target</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\stack\include</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\stack\include\openthread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Inc</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc</state>
+ </option>
+ <option>
+ <name>CCStdIncCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCCodeSection</name>
+ <state>.text</state>
+ </option>
+ <option>
+ <name>IProcessorMode2</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevel</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CCOptStrategy</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCOptLevelSlave</name>
+ <state>3</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules98</name>
+ <version>0</version>
+ <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
+ </option>
+ <option>
+ <name>CompilerMisraRules04</name>
+ <version>0</version>
+ <state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
+ </option>
+ <option>
+ <name>CCPosIndRopi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndRwpi</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCPosIndNoDynInit</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccLang</name>
+ <state>2</state>
+ </option>
+ <option>
+ <name>IccCDialect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccAllowVLA</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccStaticDestr</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCppInlineSemantics</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IccFloatSemantics</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptimizationNoSizeConstraints</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCOptStrategySlave</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCGuardCalls</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncSource</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CCEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CCEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccExceptions2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IccRTTI2</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>AARM</name>
+ <archiveVersion>2</archiveVersion>
+ <data>
+ <version>10</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>AObjPrefix</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AEndian</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>ACaseSensitivity</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacroChars</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnWhat</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AWarnOne</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange1</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AWarnRange2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>ADebug</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AltRegisterNames</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ADefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AList</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AListHeader</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AListing</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>Includes</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacDefs</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MacExps</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>MacExec</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>OnlyAssed</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>MultiLine</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLengthCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>PageLength</name>
+ <state>80</state>
+ </option>
+ <option>
+ <name>TabSpacing</name>
+ <state>8</state>
+ </option>
+ <option>
+ <name>AXRef</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDefines</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefInternal</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AXRefDual</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AFpuProcessor</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>AOutputFile</name>
+ <state>$FILE_BNAME$.o</state>
+ </option>
+ <option>
+ <name>ALimitErrorsCheck</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>ALimitErrorsEdit</name>
+ <state>100</state>
+ </option>
+ <option>
+ <name>AIgnoreStdInclude</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AUserIncludes</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AExtraOptionsCheckV2</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>AExtraOptionsV2</name>
+ <state></state>
+ </option>
+ <option>
+ <name>AsmNoLiteralPool</name>
+ <state>0</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>OBJCOPY</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>1</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>OOCOutputFormat</name>
+ <version>3</version>
+ <state>3</state>
+ </option>
+ <option>
+ <name>OCOutputOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCOutputFile</name>
+ <state>Project.bin</state>
+ </option>
+ <option>
+ <name>OOCCommandLineProducer</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>OOCObjCopyEnable</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>CUSTOM</name>
+ <archiveVersion>3</archiveVersion>
+ <data>
+ <extensions></extensions>
+ <cmdline></cmdline>
+ <hasPrio>0</hasPrio>
+ </data>
+ </settings>
+ <settings>
+ <name>BICOMP</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ <settings>
+ <name>BUILDACTION</name>
+ <archiveVersion>1</archiveVersion>
+ <data>
+ <prebuild></prebuild>
+ <postbuild></postbuild>
+ </data>
+ </settings>
+ <settings>
+ <name>ILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>20</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IlinkLibIOConfig</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>XLinkMisraHandler</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkInputFileSlave</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOutputFile</name>
+ <state>Project.out</state>
+ </option>
+ <option>
+ <name>IlinkDebugInfoEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkKeepSymbols</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySymbol</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinarySegment</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkRawBinaryAlign</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkConfigDefines</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkMapFile</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogFile</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogInitialization</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogModule</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogSection</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogVeneer</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfOverride</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile</name>
+ <state>$PROJ_DIR$\stm32wb55xx_flash_cm4.icf</state>
+ </option>
+ <option>
+ <name>IlinkIcfFileSlave</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEnableRemarks</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkSuppressDiags</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsRem</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsWarn</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkTreatAsErr</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkWarningsAreErrors</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkUseExtraOptions</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkExtraOptions</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkLowLevelInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAutoLibEnable</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkAdditionalLibs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkOverrideProgramEntryLabel</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabelSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkProgramEntryLabel</name>
+ <state>__iar_program_start</state>
+ </option>
+ <option>
+ <name>DoFill</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>FillerByte</name>
+ <state>0xFF</state>
+ </option>
+ <option>
+ <name>FillerStart</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>FillerEnd</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>CrcSize</name>
+ <version>0</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcAlign</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcPoly</name>
+ <state>0x11021</state>
+ </option>
+ <option>
+ <name>CrcCompl</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcBitOrder</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>CrcInitialValue</name>
+ <state>0x0</state>
+ </option>
+ <option>
+ <name>DoCrc</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkBE8Slave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkBufferedTerminalOutput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkStdoutInterfaceSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcFullSize</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIElfToolPostProcess</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogAutoLibSelect</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogRedirSymbols</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkLogUnusedFragments</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcReverseByteOrder</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCrcUseAsInput</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptInline</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsAllow</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptExceptionsForce</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkCmsis</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptMergeDuplSections</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkOptUseVfe</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkOptForceVfe</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackAnalysisEnable</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkStackControlFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkStackCallGraphFile</name>
+ <state></state>
+ </option>
+ <option>
+ <name>CrcAlgorithm</name>
+ <version>1</version>
+ <state>1</state>
+ </option>
+ <option>
+ <name>CrcUnitSize</name>
+ <version>0</version>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkThreadsSlave</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLogCallGraph</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkIcfFile_AltDefault</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IlinkEncInput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutput</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IlinkEncOutputBom</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkHeapSelect</name>
+ <state>1</state>
+ </option>
+ <option>
+ <name>IlinkLocaleSelect</name>
+ <state>1</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>IARCHIVE</name>
+ <archiveVersion>0</archiveVersion>
+ <data>
+ <version>0</version>
+ <wantNonLocal>1</wantNonLocal>
+ <debug>0</debug>
+ <option>
+ <name>IarchiveInputs</name>
+ <state></state>
+ </option>
+ <option>
+ <name>IarchiveOverride</name>
+ <state>0</state>
+ </option>
+ <option>
+ <name>IarchiveOutput</name>
+ <state>###Unitialized###</state>
+ </option>
+ </data>
+ </settings>
+ <settings>
+ <name>BILINK</name>
+ <archiveVersion>0</archiveVersion>
+ <data />
+ </settings>
+ </configuration>
+ <group>
+ <name>Application</name>
+ <group>
+ <name>EWARM</name>
+ <file>
+ <name>$PROJ_DIR$\startup_stm32wb55xx_cm4.s</name>
+ </file>
+ </group>
+ <group>
+ <name>User</name>
+ <group>
+ <name>Core</name>
+ <group>
+ <name>src</name>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_entry.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32_lpm_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_timerserver.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\main.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm32wbxx_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>app</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_thread.c</name>
+ </file>
+ </group>
+ <group>
+ <name>target</name>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\Target\hw_ipcc.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Doc</name>
+ <file>
+ <name>$PROJ_DIR$\..\readme.txt</name>
+ </file>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <group>
+ <name>P-NUCLEO-WB55.USBDongle</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.USBDongle\stm32wbxx_usb_dongle.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>CMSIS</name>
+ </group>
+ <group>
+ <name>STM32WBxx_HAL_Driver</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_cortex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_dma.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_flash_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_gpio.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_ipcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pwr_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rcc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_rtc_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_uart_ex.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_ll_usb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\STM32WBxx_HAL_Driver\Src\stm32wbxx_hal_pcd_ex.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Middlewares</name>
+ <group>
+ <name>STM32_USB_Device_Library</name>
+ <group>
+ <name>Class</name>
+ <group>
+ <name>CDC</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Class\CDC\Src\usbd_cdc.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>Core</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c</name>
+ </file>
+ </group>
+ </group>
+ <group>
+ <name>STM32_WPAN</name>
+ <group>
+ <name>interface</name>
+ <group>
+ <name>patterns</name>
+ <group>
+ <name>ble_thread</name>
+ <group>
+ <name>shci</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\shci\shci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>tl</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\shci_tl_if.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_mbox.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\tl\tl_thread_hci.c</name>
+ </file>
+ </group>
+ <group>
+ <name>vcp</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp\usbd_conf.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp\usbd_desc.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\interface\patterns\ble_thread\vcp\vcp.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>thread</name>
+ <group>
+ <name>openthread</name>
+ <group>
+ <name>core</name>
+ <group>
+ <name>openthread_api</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_manager.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\channel_monitor.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\child_supervision.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\coap.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\commissioner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\crypto.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dataset_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_client.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dhcp6_server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\diag.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\dns.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\icmp6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\instance.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\ip6.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\jam_detection.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\joiner.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\link_raw.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\message.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\netdata.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\network_time.cpp</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\openthread_api_wb.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\server.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\tasklet.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\thread_ftd.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\udp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\thread\openthread\core\openthread_api\radio.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\dbg_trace.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\otp.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_list.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\utilities\stm_queue.c</name>
+ </file>
+ </group>
+ </group>
+ </group>
+ <group>
+ <name>Utilities</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\lpm\tiny_lpm\stm32_lpm.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Utilities\sequencer\stm32_seq.c</name>
+ </file>
+ </group>
+</project>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww
new file mode 100644
index 000000000..e0fd14b2a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/Project.eww
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<workspace>
+ <project>
+ <path>$WS_DIR$\Project.ewp</path>
+ </project>
+ <batchBuild/>
+</workspace>
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,528 @@
+;/********************* COPYRIGHT(c) 2019 STMicroelectronics ********************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : M4 core vector table of the STM32WB55xx devices for the
+;* IAR (EWARM) toolchain.
+;*
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == _iar_program_start,
+;* - Set the vector table entries with the exceptions ISR
+;* address.
+;* - Branches to main in the C library (which eventually
+;* calls main()).
+;* After Reset the Cortex-M4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;********************************************************************************
+;*
+;* 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 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 STMicroelectronics nor the names of its contributors
+;* may be used to endorse or promote products derived from this software
+;* without specific prior written permission.
+;*
+;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+;*
+;*******************************************************************************
+;
+;
+; The modules in this file are included in the libraries, and may be replaced
+; by any user-defined modules that define the PUBLIC symbol _program_start or
+; a user defined start symbol.
+; To override the cstartup defined in the library, simply add your modified
+; version to the workbench project.
+;
+; The vector table is normally located at address 0.
+; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
+; The name "__vector_table" has special meaning for C-SPY:
+; it is where the SP start value is found, and the NVIC vector
+; table register (VTOR) is initialized to this address if != 0.
+;
+; Cortex-M version
+;
+
+ MODULE ?cstartup
+
+ ;; Forward declaration of sections.
+ SECTION CSTACK:DATA:NOROOT(3)
+
+ SECTION .intvec:CODE:NOROOT(2)
+
+ EXTERN __iar_program_start
+ EXTERN SystemInit
+ PUBLIC __vector_table
+
+ DATA
+__vector_table
+ DCD sfe(CSTACK)
+ DCD Reset_Handler ; Reset Handler
+
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD USB_FS_WKUP_CRS_IRQHandler ; USB Full speed wakeup
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Default interrupt handlers.
+;;
+ THUMB
+ PUBWEAK Reset_Handler
+ SECTION .text:CODE:NOROOT:REORDER(2)
+Reset_Handler
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__iar_program_start
+ BX R0
+
+ PUBWEAK NMI_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+NMI_Handler
+ B NMI_Handler
+
+ PUBWEAK HardFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HardFault_Handler
+ B HardFault_Handler
+
+ PUBWEAK MemManage_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+MemManage_Handler
+ B MemManage_Handler
+
+ PUBWEAK BusFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+BusFault_Handler
+ B BusFault_Handler
+
+ PUBWEAK UsageFault_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+UsageFault_Handler
+ B UsageFault_Handler
+
+ PUBWEAK SVC_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SVC_Handler
+ B SVC_Handler
+
+ PUBWEAK DebugMon_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DebugMon_Handler
+ B DebugMon_Handler
+
+ PUBWEAK PendSV_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PendSV_Handler
+ B PendSV_Handler
+
+ PUBWEAK SysTick_Handler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SysTick_Handler
+ B SysTick_Handler
+
+ PUBWEAK WWDG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+WWDG_IRQHandler
+ B WWDG_IRQHandler
+
+ PUBWEAK PVD_PVM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PVD_PVM_IRQHandler
+ B PVD_PVM_IRQHandler
+
+ PUBWEAK TAMP_STAMP_LSECSS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TAMP_STAMP_LSECSS_IRQHandler
+ B TAMP_STAMP_LSECSS_IRQHandler
+
+ PUBWEAK RTC_WKUP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_WKUP_IRQHandler
+ B RTC_WKUP_IRQHandler
+
+ PUBWEAK FLASH_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FLASH_IRQHandler
+ B FLASH_IRQHandler
+
+ PUBWEAK RCC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RCC_IRQHandler
+ B RCC_IRQHandler
+
+ PUBWEAK EXTI0_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI0_IRQHandler
+ B EXTI0_IRQHandler
+
+ PUBWEAK EXTI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI1_IRQHandler
+ B EXTI1_IRQHandler
+
+ PUBWEAK EXTI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI2_IRQHandler
+ B EXTI2_IRQHandler
+
+ PUBWEAK EXTI3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI3_IRQHandler
+ B EXTI3_IRQHandler
+
+ PUBWEAK EXTI4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI4_IRQHandler
+ B EXTI4_IRQHandler
+
+ PUBWEAK DMA1_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel1_IRQHandler
+ B DMA1_Channel1_IRQHandler
+
+ PUBWEAK DMA1_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel2_IRQHandler
+ B DMA1_Channel2_IRQHandler
+
+ PUBWEAK DMA1_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel3_IRQHandler
+ B DMA1_Channel3_IRQHandler
+
+ PUBWEAK DMA1_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel4_IRQHandler
+ B DMA1_Channel4_IRQHandler
+
+ PUBWEAK DMA1_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel5_IRQHandler
+ B DMA1_Channel5_IRQHandler
+
+ PUBWEAK DMA1_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel6_IRQHandler
+ B DMA1_Channel6_IRQHandler
+
+ PUBWEAK DMA1_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA1_Channel7_IRQHandler
+ B DMA1_Channel7_IRQHandler
+
+ PUBWEAK ADC1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+ADC1_IRQHandler
+ B ADC1_IRQHandler
+
+ PUBWEAK USB_HP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_HP_IRQHandler
+ B USB_HP_IRQHandler
+
+ PUBWEAK USB_LP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_LP_IRQHandler
+ B USB_LP_IRQHandler
+
+ PUBWEAK C2SEV_PWR_C2H_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+C2SEV_PWR_C2H_IRQHandler
+ B C2SEV_PWR_C2H_IRQHandler
+
+ PUBWEAK COMP_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+COMP_IRQHandler
+ B COMP_IRQHandler
+
+ PUBWEAK EXTI9_5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI9_5_IRQHandler
+ B EXTI9_5_IRQHandler
+
+ PUBWEAK TIM1_BRK_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_BRK_IRQHandler
+ B TIM1_BRK_IRQHandler
+
+ PUBWEAK TIM1_UP_TIM16_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_UP_TIM16_IRQHandler
+ B TIM1_UP_TIM16_IRQHandler
+
+ PUBWEAK TIM1_TRG_COM_TIM17_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_TRG_COM_TIM17_IRQHandler
+ B TIM1_TRG_COM_TIM17_IRQHandler
+
+ PUBWEAK TIM1_CC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM1_CC_IRQHandler
+ B TIM1_CC_IRQHandler
+
+ PUBWEAK TIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TIM2_IRQHandler
+ B TIM2_IRQHandler
+
+ PUBWEAK PKA_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PKA_IRQHandler
+ B PKA_IRQHandler
+
+ PUBWEAK I2C1_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_EV_IRQHandler
+ B I2C1_EV_IRQHandler
+
+ PUBWEAK I2C1_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C1_ER_IRQHandler
+ B I2C1_ER_IRQHandler
+
+ PUBWEAK I2C3_EV_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_EV_IRQHandler
+ B I2C3_EV_IRQHandler
+
+ PUBWEAK I2C3_ER_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+I2C3_ER_IRQHandler
+ B I2C3_ER_IRQHandler
+
+ PUBWEAK SPI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI1_IRQHandler
+ B SPI1_IRQHandler
+
+ PUBWEAK SPI2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SPI2_IRQHandler
+ B SPI2_IRQHandler
+
+ PUBWEAK USART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USART1_IRQHandler
+ B USART1_IRQHandler
+
+ PUBWEAK LPUART1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPUART1_IRQHandler
+ B LPUART1_IRQHandler
+
+ PUBWEAK SAI1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+SAI1_IRQHandler
+ B SAI1_IRQHandler
+
+ PUBWEAK TSC_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+TSC_IRQHandler
+ B TSC_IRQHandler
+
+ PUBWEAK EXTI15_10_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+EXTI15_10_IRQHandler
+ B EXTI15_10_IRQHandler
+
+ PUBWEAK RTC_Alarm_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RTC_Alarm_IRQHandler
+ B RTC_Alarm_IRQHandler
+
+ PUBWEAK USB_FS_WKUP_CRS_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+USB_FS_WKUP_CRS_IRQHandler
+ B USB_FS_WKUP_CRS_IRQHandler
+
+ PUBWEAK PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ B PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+
+ PUBWEAK IPCC_C1_RX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_RX_IRQHandler
+ B IPCC_C1_RX_IRQHandler
+
+ PUBWEAK IPCC_C1_TX_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+IPCC_C1_TX_IRQHandler
+ B IPCC_C1_TX_IRQHandler
+
+ PUBWEAK HSEM_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+HSEM_IRQHandler
+ B HSEM_IRQHandler
+
+ PUBWEAK LPTIM1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM1_IRQHandler
+ B LPTIM1_IRQHandler
+
+ PUBWEAK LPTIM2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LPTIM2_IRQHandler
+ B LPTIM2_IRQHandler
+
+ PUBWEAK LCD_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+LCD_IRQHandler
+ B LCD_IRQHandler
+
+ PUBWEAK QUADSPI_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+QUADSPI_IRQHandler
+ B QUADSPI_IRQHandler
+
+ PUBWEAK AES1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES1_IRQHandler
+ B AES1_IRQHandler
+
+ PUBWEAK AES2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+AES2_IRQHandler
+ B AES2_IRQHandler
+
+ PUBWEAK RNG_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+RNG_IRQHandler
+ B RNG_IRQHandler
+
+ PUBWEAK FPU_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+FPU_IRQHandler
+ B FPU_IRQHandler
+
+ PUBWEAK DMA2_Channel1_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel1_IRQHandler
+ B DMA2_Channel1_IRQHandler
+
+ PUBWEAK DMA2_Channel2_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel2_IRQHandler
+ B DMA2_Channel2_IRQHandler
+
+ PUBWEAK DMA2_Channel3_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel3_IRQHandler
+ B DMA2_Channel3_IRQHandler
+
+ PUBWEAK DMA2_Channel4_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel4_IRQHandler
+ B DMA2_Channel4_IRQHandler
+
+ PUBWEAK DMA2_Channel5_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel5_IRQHandler
+ B DMA2_Channel5_IRQHandler
+
+ PUBWEAK DMA2_Channel6_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel6_IRQHandler
+ B DMA2_Channel6_IRQHandler
+
+ PUBWEAK DMA2_Channel7_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMA2_Channel7_IRQHandler
+ B DMA2_Channel7_IRQHandler
+
+ PUBWEAK DMAMUX1_OVR_IRQHandler
+ SECTION .text:CODE:NOROOT:REORDER(1)
+DMAMUX1_OVR_IRQHandler
+ B DMAMUX1_OVR_IRQHandler
+ END
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..97193b314
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,47 @@
+ /* Memory map of the FW_M4
+ *
+ * 0x2003FFFF---------------------------------------|
+ * | REGION_SECURE MO |
+ * 0x200327FF---------------------------------------|
+ * | Region_RAM2aRet_SHARED |
+ * 0x20030000---------------------------------------|
+
+ /*-CPU Vector Table-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+
+/*-Memory Regions- read only */
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF;
+
+/*-Memory Regions- read write */
+define symbol __ICFEDIT_region_RAM1_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM1_end__ = 0x2002FFFF;
+
+define symbol __ICFEDIT_region_RAM2aRet_SHARED_start__ = 0x20030000;
+define symbol __ICFEDIT_region_RAM2aRet_SHARED_end__ = 0x200327FF;
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 0x400;
+
+define memory mem with size = 4G;
+
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];
+define region RAM2aRet_SHARED_region = mem:[from __ICFEDIT_region_RAM2aRet_SHARED_start__ to __ICFEDIT_region_RAM2aRet_SHARED_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
+
+initialize by copy { readwrite };
+do not initialize { section .noinit,
+ section MAPPING_TABLE,
+ section MB_MEM1 };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM1_region { readwrite,block CSTACK, block HEAP };
+place in RAM2aRet_SHARED_region { first section MAPPING_TABLE};
+place in RAM2aRet_SHARED_region { section MB_MEM1};
+place in RAM2aRet_SHARED_region { section MB_MEM2};
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvoptx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvoptx
new file mode 100644
index 000000000..b09be6b4e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvoptx
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+ <Target>
+ <TargetName>STM32WBxx_USBD_Thread_Coap_DataTransfer</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath />
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>0</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <nTsel>13</nTsel>
+ <sDll />
+ <sDllPa />
+ <sDlgDll />
+ <sDlgPa />
+ <sIfile />
+ <tDll />
+ <tDllPa />
+ <tDlgDll />
+ <tDlgPa />
+ <tIfile />
+ <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ST-LINKIII-KEIL_SWO</Key>
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RG$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key />
+ <Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32WB_M4.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32WB55RG$CMSIS\Flash\STM32WB_M4.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>0</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>0</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>0</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable />
+ <LintConfigFile />
+ </TargetOption>
+ </Target>
+</ProjectOpt>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvprojx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvprojx
new file mode 100644
index 000000000..989ce99a3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/Project.uvprojx
@@ -0,0 +1,891 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" noNamespaceSchemaLocation="project_proj.xsd">
+
+ <SchemaVersion>1.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>STM32WBxx_USBD_Thread_Coap_DataTransfer</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32WB55RGVx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <Cpu>IROM(0x08000000-0x807FFFF) IRAM(0x20000004-0x2002FC03) IRAM2aRet_SHARED(0x20030000-0x200327FF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4")</Cpu>
+ <FlashUtilSpec/>
+ <StartupFile/>
+ <FlashDriverDll/>
+ <DeviceId/>
+ <RegisterFile/>
+ <MemoryEnv/>
+ <Cmp/>
+ <Asm/>
+ <Linker/>
+ <OHString/>
+ <InfinionOptionDll/>
+ <SLE66CMisc/>
+ <SLE66AMisc/>
+ <SLE66LinkerMisc/>
+ <SFDFile/>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath/>
+ <IncludePath/>
+ <LibPath/>
+ <RegisterFilePath/>
+ <DBRegisterFilePath/>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>STM32WBxx_USBD\Exe\</OutputDirectory>
+ <OutputName>Project</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>0</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath>STM32WBxx_USBD\List</ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name/>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>1</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name>fromelf #L --bin --output=$L@L.bin</UserProg1Name>
+ <UserProg2Name/>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ </AfterMake>
+ <SelectedForBatchBuild>0</SelectedForBatchBuild>
+ <SVCSIdString/>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument/>
+ <IncludeLibraryModules/>
+ <ComprImg/>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ <Simulator>
+ <UseSimulator>0</UseSimulator>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>1</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+ <RestoreSysVw>1</RestoreSysVw>
+ </Simulator>
+ <Target>
+ <UseTarget>1</UseTarget>
+ <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+ <RunToMain>1</RunToMain>
+ <RestoreBreakpoints>1</RestoreBreakpoints>
+ <RestoreWatchpoints>1</RestoreWatchpoints>
+ <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+ <RestoreFunctions>0</RestoreFunctions>
+ <RestoreToolbox>1</RestoreToolbox>
+ <RestoreTracepoints>1</RestoreTracepoints>
+ <RestoreSysVw>1</RestoreSysVw>
+ </Target>
+ <RunDebugAfterBuild>0</RunDebugAfterBuild>
+ <TargetSelection>13</TargetSelection>
+ <SimDlls>
+ <CpuDll/>
+ <CpuDllArguments/>
+ <PeripheralDll/>
+ <PeripheralDllArguments/>
+ <InitializationFile/>
+ </SimDlls>
+ <TargetDlls>
+ <CpuDll/>
+ <CpuDllArguments/>
+ <PeripheralDll/>
+ <PeripheralDllArguments/>
+ <InitializationFile/>
+ <Driver>STLink\ST-LINKIII-KEIL_SWO.dll</Driver>
+ </TargetDlls>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4107</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>STLink\ST-LINKIII-KEIL_SWO.dll</Flash2>
+ <Flash3/>
+ <Flash4/>
+ <pFcarmOut/>
+ <pFcarmGrp/>
+ <pFcArmRoot/>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName/>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <hadIRAM2>0</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <RoSelD>3</RoSelD>
+ <RwSelD>3</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>0</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress/>
+ <Size/>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress/>
+ <Size/>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress/>
+ <Size/>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress/>
+ <Size/>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector/>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>2</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <useXO>0</useXO>
+ <VariousControls>
+ <MiscControls/>
+ <Define>CORE_CM4,USE_HAL_DRIVER,USE_STM32WBXX_USB_DONGLE,THREAD_WB,STM32WB55xx,ST_OT_DEBUG,FRAMEWORK_1,OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;</Define>
+ <Undefine/>
+ <IncludePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc;../../../../../../Drivers/CMSIS/Include;../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include;../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle/;../Core/Inc;../STM32_WPAN/App;../STM32_WPAN/Target;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api;../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread;../../../../../../Middlewares/ST/STM32_WPAN/utilities;../../../../../../Utilities/lpm/tiny_lpm;../../../../../../Utilities/sequencer;../../../../../../Middlewares/ST/STM32_WPAN;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread;../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc;../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <VariousControls>
+ <MiscControls/>
+ <Define/>
+ <Undefine/>
+ <IncludePath/>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>0</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange>0x08000000</TextAddressRange>
+ <DataAddressRange>0x20000000</DataAddressRange>
+ <pXoBase/>
+ <ScatterFile>.\stm32wb55xx_flash_cm4.sct</ScatterFile>
+ <IncludeLibs/>
+ <IncludeLibsPath/>
+ <Misc/>
+ <LinkerInputFile/>
+ <DisabledWarnings/>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32wb55xx_cm4.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32wb55xx_cm4.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/Core/src</GroupName>
+ <Files>
+ <File>
+ <FileName>app_entry.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/app_entry.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_lpm_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32_lpm_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_timerserver.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_timerserver.c</FilePath>
+ </File>
+ <File>
+ <FileName>hw_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/hw_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32wbxx_it.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_logging.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm_logging.c</FilePath>
+ </File>
+ <File>
+ <FileName>system_stm32wbxx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32wbxx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/app</GroupName>
+ <Files>
+ <File>
+ <FileName>app_thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/App/app_thread.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/STM32_WPAN/target</GroupName>
+ <Files>
+ <File>
+ <FileName>hw_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../STM32_WPAN/Target/hw_ipcc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Doc</GroupName>
+ <Files>
+ <File>
+ <FileName>readme.txt</FileName>
+ <FileType>5</FileType>
+ <FilePath>../readme.txt</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/BSP/P-NUCLEO-WB55.USBDongle</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_usb_dongle.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32WBxx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32wbxx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_ipcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_rtc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_ll_usb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32wbxx_hal_pcd_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_USB_Device_Library/Class/CDC</GroupName>
+ <Files>
+ <File>
+ <FileName>usbd_cdc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_USB_Device_Library/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>usbd_core.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_ctlreq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_ioreq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci</GroupName>
+ <Files>
+ <File>
+ <FileName>shci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl</GroupName>
+ <Files>
+ <File>
+ <FileName>shci_tl.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</FilePath>
+ </File>
+ <File>
+ <FileName>shci_tl_if.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_mbox.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</FilePath>
+ </File>
+ <File>
+ <FileName>tl_thread_hci.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp</GroupName>
+ <Files>
+ <File>
+ <FileName>usbd_conf.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</FilePath>
+ </File>
+ <File>
+ <FileName>usbd_desc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</FilePath>
+ </File>
+ <File>
+ <FileName>vcp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api</GroupName>
+ <Files>
+ <File>
+ <FileName>channel_manager.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</FilePath>
+ </File>
+ <File>
+ <FileName>channel_monitor.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</FilePath>
+ </File>
+ <File>
+ <FileName>child_supervision.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</FilePath>
+ </File>
+ <File>
+ <FileName>coap.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</FilePath>
+ </File>
+ <File>
+ <FileName>commissioner.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</FilePath>
+ </File>
+ <File>
+ <FileName>crypto.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</FilePath>
+ </File>
+ <File>
+ <FileName>dataset.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</FilePath>
+ </File>
+ <File>
+ <FileName>dataset_ftd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</FilePath>
+ </File>
+ <File>
+ <FileName>dhcp6_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>dhcp6_server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</FilePath>
+ </File>
+ <File>
+ <FileName>diag.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</FilePath>
+ </File>
+ <File>
+ <FileName>dns.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</FilePath>
+ </File>
+ <File>
+ <FileName>icmp6.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</FilePath>
+ </File>
+ <File>
+ <FileName>instance.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</FilePath>
+ </File>
+ <File>
+ <FileName>ip6.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</FilePath>
+ </File>
+ <File>
+ <FileName>jam_detection.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</FilePath>
+ </File>
+ <File>
+ <FileName>joiner.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</FilePath>
+ </File>
+ <File>
+ <FileName>link.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</FilePath>
+ </File>
+ <File>
+ <FileName>link_raw.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</FilePath>
+ </File>
+ <File>
+ <FileName>message.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</FilePath>
+ </File>
+ <File>
+ <FileName>netdata.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</FilePath>
+ </File>
+ <File>
+ <FileName>network_time.cpp</FileName>
+ <FileType>8</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</FilePath>
+ </File>
+ <File>
+ <FileName>openthread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</FilePath>
+ </File>
+ <File>
+ <FileName>openthread_api_wb.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</FilePath>
+ </File>
+ <File>
+ <FileName>server.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</FilePath>
+ </File>
+ <File>
+ <FileName>tasklet.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</FilePath>
+ </File>
+ <File>
+ <FileName>thread.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</FilePath>
+ </File>
+ <File>
+ <FileName>thread_ftd.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</FilePath>
+ </File>
+ <File>
+ <FileName>udp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</FilePath>
+ </File>
+ <File>
+ <FileName>radio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Middlewares/STM32_WPAN/utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>dbg_trace.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/dbg_trace.c</FilePath>
+ </File>
+ <File>
+ <FileName>otp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/otp.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_list.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_list.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm_queue.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Utilities</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32_lpm.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/lpm/tiny_lpm/stm32_lpm.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32_seq.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../../../../../../Utilities/sequencer/stm32_seq.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ </Groups>
+
+ </Target>
+ </Targets>
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="4.3.0" condition="CMSIS Core">
+ <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="4.5.0"/>
+ <targetInfos>
+ <targetInfo name="STM32WBxx_USBD_Thread_Coap_DataTransfer"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+</Project> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..e05e3c5ca
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,368 @@
+;******************************************************************************
+;* File Name : startup_stm32wb55xx_cm4.s
+;* Author : MCD Application Team
+;* Description : STM32WB55xx devices vector table for MDK-ARM toolchain.
+;* This module performs:
+;* - Set the initial SP
+;* - Set the initial PC == Reset_Handler
+;* - Set the vector table entries with the exceptions ISR address
+;* - Branches to __main in the C library (which eventually
+;* calls main()).
+;* After Reset the CortexM4 processor is in Thread mode,
+;* priority is Privileged, and the Stack is set to Main.
+;* <<< Use Configuration Wizard in Context Menu >>>
+;******************************************************************************
+;* @attention
+;*
+;* Copyright (c) 2019 STMicroelectronics. All rights reserved.
+;*
+;* This software component is licensed by ST under BSD 3-Clause license,
+;* the "License"; You may not use this file except in compliance with the
+;* License. You may obtain a copy of the License at:
+;* opensource.org/licenses/BSD-3-Clause
+;*
+;******************************************************************************
+
+; Amount of memory (in bytes) allocated for Stack
+; Tailor this value to your application needs
+; <h> Stack Configuration
+; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size EQU 0x1000
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size EQU 0x400
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem SPACE Heap_Size
+__heap_limit
+
+ PRESERVE8
+ THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+ AREA RESET, DATA, READONLY
+ EXPORT __Vectors
+ EXPORT __Vectors_End
+ EXPORT __Vectors_Size
+
+__Vectors DCD __initial_sp ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NMI_Handler ; NMI Handler
+ DCD HardFault_Handler ; Hard Fault Handler
+ DCD MemManage_Handler ; MPU Fault Handler
+ DCD BusFault_Handler ; Bus Fault Handler
+ DCD UsageFault_Handler ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD SVC_Handler ; SVCall Handler
+ DCD DebugMon_Handler ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD PendSV_Handler ; PendSV Handler
+ DCD SysTick_Handler ; SysTick Handler
+
+ ; External Interrupts
+ DCD WWDG_IRQHandler ; Window WatchDog
+ DCD PVD_PVM_IRQHandler ; PVD and PVM detector
+ DCD TAMP_STAMP_LSECSS_IRQHandler ; RTC Tamper and TimeStamp Interrupts and LSECSS Interrupts
+ DCD RTC_WKUP_IRQHandler ; RTC Wakeup Interrupt
+ DCD FLASH_IRQHandler ; FLASH global Interrupt
+ DCD RCC_IRQHandler ; RCC Interrupt
+ DCD EXTI0_IRQHandler ; EXTI Line 0 Interrupt
+ DCD EXTI1_IRQHandler ; EXTI Line 1 Interrupt
+ DCD EXTI2_IRQHandler ; EXTI Line 2 Interrupt
+ DCD EXTI3_IRQHandler ; EXTI Line 3 Interrup
+ DCD EXTI4_IRQHandler ; EXTI Line 4 Interrupt
+ DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 Interrupt
+ DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 Interrupt
+ DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 Interrupt
+ DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 Interrupt
+ DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 Interrupt
+ DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 Interrupt
+ DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 Interrupt
+ DCD ADC1_IRQHandler ; ADC1 Interrupt
+ DCD USB_HP_IRQHandler ; USB High Priority Interrupt
+ DCD USB_LP_IRQHandler ; USB Low Priority Interrupt
+ DCD C2SEV_PWR_C2H_IRQHandler ; CPU M0+ SEV Interrupt
+ DCD COMP_IRQHandler ; COMP1 and COMP2 Interrupts
+ DCD EXTI9_5_IRQHandler ; EXTI Lines [9:5] Interrupt
+ DCD TIM1_BRK_IRQHandler ; TIM1 Break Interrupt
+ DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 global Interrupts
+ DCD TIM1_TRG_COM_TIM17_IRQHandler ; TIM1 Trigger and Communication and TIM17 global Interrupts
+ DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare Interrupt
+ DCD TIM2_IRQHandler ; TIM2 Global Interrupt
+ DCD PKA_IRQHandler ; PKA Interrupt
+ DCD I2C1_EV_IRQHandler ; I2C1 Event Interrupt
+ DCD I2C1_ER_IRQHandler ; I2C1 Error Interrupt
+ DCD I2C3_EV_IRQHandler ; I2C3 Event Interrupt
+ DCD I2C3_ER_IRQHandler ; I2C3 Error Interrupt
+ DCD SPI1_IRQHandler ; SPI1 Interrupt
+ DCD SPI2_IRQHandler ; SPI2 Interrupt
+ DCD USART1_IRQHandler ; USART1 Interrupt
+ DCD LPUART1_IRQHandler ; LPUART1 Interrupt
+ DCD SAI1_IRQHandler ; SAI Interrupt
+ DCD TSC_IRQHandler ; TSC Interrupt
+ DCD EXTI15_10_IRQHandler ; EXTI Lines1[15:10 ]Interrupts
+ DCD RTC_Alarm_IRQHandler ; RTC Alarms (A and B) Interrupt
+ DCD CRS_IRQHandler ; CRS interrupt
+ DCD PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler ; WKUP Interrupt from PWR
+ DCD IPCC_C1_RX_IRQHandler ; IPCC CPU1 RX occupied interrupt
+ DCD IPCC_C1_TX_IRQHandler ; IPCC CPU1 RX free interrupt
+ DCD HSEM_IRQHandler ; HSEM0 Interrupt
+ DCD LPTIM1_IRQHandler ; LPTIM1 Interrupt
+ DCD LPTIM2_IRQHandler ; LPTIM2 Interrupt
+ DCD LCD_IRQHandler ; LCD Interrupt
+ DCD QUADSPI_IRQHandler ; QUADSPI Interrupt
+ DCD AES1_IRQHandler ; AES1 Interrupt
+ DCD AES2_IRQHandler ; AES2 Interrupt
+ DCD RNG_IRQHandler ; RNG1 Interrupt
+ DCD FPU_IRQHandler ; FPU Interrupt
+ DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 Interrupt
+ DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 Interrupt
+ DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 Interrupt
+ DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 Interrupt
+ DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 Interrupt
+ DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 Interrupt
+ DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 Interrupt
+ DCD DMAMUX1_OVR_IRQHandler ; DMAMUX overrun Interrupt
+
+__Vectors_End
+
+__Vectors_Size EQU __Vectors_End - __Vectors
+
+ AREA |.text|, CODE, READONLY
+
+; Reset handler
+Reset_Handler PROC
+ EXPORT Reset_Handler [WEAK]
+ IMPORT SystemInit
+ IMPORT __main
+
+ LDR R0, =SystemInit
+ BLX R0
+ LDR R0, =__main
+ BX R0
+ ENDP
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler PROC
+ EXPORT NMI_Handler [WEAK]
+ B .
+ ENDP
+HardFault_Handler\
+ PROC
+ EXPORT HardFault_Handler [WEAK]
+ B .
+ ENDP
+MemManage_Handler\
+ PROC
+ EXPORT MemManage_Handler [WEAK]
+ B .
+ ENDP
+BusFault_Handler\
+ PROC
+ EXPORT BusFault_Handler [WEAK]
+ B .
+ ENDP
+UsageFault_Handler\
+ PROC
+ EXPORT UsageFault_Handler [WEAK]
+ B .
+ ENDP
+SVC_Handler PROC
+ EXPORT SVC_Handler [WEAK]
+ B .
+ ENDP
+DebugMon_Handler\
+ PROC
+ EXPORT DebugMon_Handler [WEAK]
+ B .
+ ENDP
+PendSV_Handler PROC
+ EXPORT PendSV_Handler [WEAK]
+ B .
+ ENDP
+SysTick_Handler PROC
+ EXPORT SysTick_Handler [WEAK]
+ B .
+ ENDP
+
+Default_Handler PROC
+
+ EXPORT WWDG_IRQHandler [WEAK]
+ EXPORT PVD_PVM_IRQHandler [WEAK]
+ EXPORT TAMP_STAMP_LSECSS_IRQHandler [WEAK]
+ EXPORT RTC_WKUP_IRQHandler [WEAK]
+ EXPORT FLASH_IRQHandler [WEAK]
+ EXPORT RCC_IRQHandler [WEAK]
+ EXPORT EXTI0_IRQHandler [WEAK]
+ EXPORT EXTI1_IRQHandler [WEAK]
+ EXPORT EXTI2_IRQHandler [WEAK]
+ EXPORT EXTI3_IRQHandler [WEAK]
+ EXPORT EXTI4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel1_IRQHandler [WEAK]
+ EXPORT DMA1_Channel2_IRQHandler [WEAK]
+ EXPORT DMA1_Channel3_IRQHandler [WEAK]
+ EXPORT DMA1_Channel4_IRQHandler [WEAK]
+ EXPORT DMA1_Channel5_IRQHandler [WEAK]
+ EXPORT DMA1_Channel6_IRQHandler [WEAK]
+ EXPORT DMA1_Channel7_IRQHandler [WEAK]
+ EXPORT ADC1_IRQHandler [WEAK]
+ EXPORT USB_HP_IRQHandler [WEAK]
+ EXPORT USB_LP_IRQHandler [WEAK]
+ EXPORT C2SEV_PWR_C2H_IRQHandler [WEAK]
+ EXPORT COMP_IRQHandler [WEAK]
+ EXPORT EXTI9_5_IRQHandler [WEAK]
+ EXPORT TIM1_BRK_IRQHandler [WEAK]
+ EXPORT TIM1_UP_TIM16_IRQHandler [WEAK]
+ EXPORT TIM1_TRG_COM_TIM17_IRQHandler [WEAK]
+ EXPORT TIM1_CC_IRQHandler [WEAK]
+ EXPORT TIM2_IRQHandler [WEAK]
+ EXPORT PKA_IRQHandler [WEAK]
+ EXPORT I2C1_EV_IRQHandler [WEAK]
+ EXPORT I2C1_ER_IRQHandler [WEAK]
+ EXPORT I2C3_EV_IRQHandler [WEAK]
+ EXPORT I2C3_ER_IRQHandler [WEAK]
+ EXPORT SPI1_IRQHandler [WEAK]
+ EXPORT SPI2_IRQHandler [WEAK]
+ EXPORT USART1_IRQHandler [WEAK]
+ EXPORT LPUART1_IRQHandler [WEAK]
+ EXPORT SAI1_IRQHandler [WEAK]
+ EXPORT TSC_IRQHandler [WEAK]
+ EXPORT EXTI15_10_IRQHandler [WEAK]
+ EXPORT RTC_Alarm_IRQHandler [WEAK]
+ EXPORT CRS_IRQHandler [WEAK]
+ EXPORT PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler [WEAK]
+ EXPORT IPCC_C1_RX_IRQHandler [WEAK]
+ EXPORT IPCC_C1_TX_IRQHandler [WEAK]
+ EXPORT HSEM_IRQHandler [WEAK]
+ EXPORT LPTIM1_IRQHandler [WEAK]
+ EXPORT LPTIM2_IRQHandler [WEAK]
+ EXPORT LCD_IRQHandler [WEAK]
+ EXPORT QUADSPI_IRQHandler [WEAK]
+ EXPORT AES1_IRQHandler [WEAK]
+ EXPORT AES2_IRQHandler [WEAK]
+ EXPORT RNG_IRQHandler [WEAK]
+ EXPORT FPU_IRQHandler [WEAK]
+ EXPORT DMA2_Channel1_IRQHandler [WEAK]
+ EXPORT DMA2_Channel2_IRQHandler [WEAK]
+ EXPORT DMA2_Channel3_IRQHandler [WEAK]
+ EXPORT DMA2_Channel4_IRQHandler [WEAK]
+ EXPORT DMA2_Channel5_IRQHandler [WEAK]
+ EXPORT DMA2_Channel6_IRQHandler [WEAK]
+ EXPORT DMA2_Channel7_IRQHandler [WEAK]
+ EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
+
+WWDG_IRQHandler
+PVD_PVM_IRQHandler
+TAMP_STAMP_LSECSS_IRQHandler
+RTC_WKUP_IRQHandler
+FLASH_IRQHandler
+RCC_IRQHandler
+EXTI0_IRQHandler
+EXTI1_IRQHandler
+EXTI2_IRQHandler
+EXTI3_IRQHandler
+EXTI4_IRQHandler
+DMA1_Channel1_IRQHandler
+DMA1_Channel2_IRQHandler
+DMA1_Channel3_IRQHandler
+DMA1_Channel4_IRQHandler
+DMA1_Channel5_IRQHandler
+DMA1_Channel6_IRQHandler
+DMA1_Channel7_IRQHandler
+ADC1_IRQHandler
+USB_HP_IRQHandler
+USB_LP_IRQHandler
+C2SEV_PWR_C2H_IRQHandler
+COMP_IRQHandler
+EXTI9_5_IRQHandler
+TIM1_BRK_IRQHandler
+TIM1_UP_TIM16_IRQHandler
+TIM1_TRG_COM_TIM17_IRQHandler
+TIM1_CC_IRQHandler
+TIM2_IRQHandler
+PKA_IRQHandler
+I2C1_EV_IRQHandler
+I2C1_ER_IRQHandler
+I2C3_EV_IRQHandler
+I2C3_ER_IRQHandler
+SPI1_IRQHandler
+SPI2_IRQHandler
+USART1_IRQHandler
+LPUART1_IRQHandler
+SAI1_IRQHandler
+TSC_IRQHandler
+EXTI15_10_IRQHandler
+RTC_Alarm_IRQHandler
+CRS_IRQHandler
+PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+IPCC_C1_RX_IRQHandler
+IPCC_C1_TX_IRQHandler
+HSEM_IRQHandler
+LPTIM1_IRQHandler
+LPTIM2_IRQHandler
+LCD_IRQHandler
+QUADSPI_IRQHandler
+AES1_IRQHandler
+AES2_IRQHandler
+RNG_IRQHandler
+FPU_IRQHandler
+DMA2_Channel1_IRQHandler
+DMA2_Channel2_IRQHandler
+DMA2_Channel3_IRQHandler
+DMA2_Channel4_IRQHandler
+DMA2_Channel5_IRQHandler
+DMA2_Channel6_IRQHandler
+DMA2_Channel7_IRQHandler
+DMAMUX1_OVR_IRQHandler
+
+ B .
+
+ ENDP
+
+ ALIGN
+
+;*******************************************************************************
+; User Stack and Heap initialization
+;*******************************************************************************
+ IF :DEF:__MICROLIB
+
+ EXPORT __initial_sp
+ EXPORT __heap_base
+ EXPORT __heap_limit
+
+ ELSE
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+ ENDIF
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct
new file mode 100644
index 000000000..63845c07b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/MDK-ARM/stm32wb55xx_flash_cm4.sct
@@ -0,0 +1,21 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00080000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000004 0x2FFFC { ; RW data
+ .ANY (+RW +ZI)
+ }
+ RW_RAM_SHARED 0x20030000 0x2800 { ; RW data
+ *(MAPPING_TABLE)
+ *(MB_MEM1)
+ *(MB_MEM2)
+ }
+ }
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c
new file mode 100644
index 000000000..2c26d2689
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c
@@ -0,0 +1,1258 @@
+/**
+ ******************************************************************************
+ * @file app_thread.c
+ * @author MCD Application Team
+ * @brief Thread Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "app_thread.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "openthread_api_wb.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "app_conf.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#include "vcp.h"
+#include "vcp_conf.h"
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#include "data_transfer.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define C_SIZE_CMD_STRING 256U
+#define C_PANID 0x2226U
+#define C_CHANNEL_NB 19U
+
+#define C_RESSOURCE_DATA_TRANSFER "dataTransfer"
+#define C_RESSOURCE_Provisioning "provisioning"
+
+/* Private macros ------------------------------------------------------------*/
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_THREAD_CheckWirelessFirmwareInfo(void);
+static void APP_THREAD_DeviceConfig(void);
+static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext);
+static void APP_THREAD_TraceError(const char * pMess, uint32_t ErrCode);
+#if (CFG_FULL_LOW_POWER == 0)
+static void Send_CLI_To_M0(void);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+static void Send_CLI_Ack_For_OT(void);
+static void HostTxCb( void );
+static void Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+static uint32_t ProcessCmdString(uint8_t* buf , uint32_t len);
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static void RxCpltCallback(void);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+static void APP_THREAD_CheckMsgValidity(void);
+static void APP_THREAD_SendNextBuffer(void);
+static void APP_THREAD_DummyReqHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapDataReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_ProvisioningReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static otError APP_THREAD_ProvisioningRespSend(otCoapHeader* pRequestHeader,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_ProvisioningReqSend(void);
+static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
+static void APP_THREAD_SendCoapUnicastRequest(void);
+static void APP_THREAD_DataRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
+static void APP_THREAD_DummyRespHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
+static void APP_THREAD_AskProvisioning(void);
+
+/* Private variables -----------------------------------------------*/
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+static uint8_t TmpString[C_SIZE_CMD_STRING];
+static uint8_t VcpRxBuffer[sizeof(TL_CmdSerial_t)]; /* Received Data over USB are stored in this buffer */
+static uint8_t VcpTxBuffer[sizeof(TL_EvtPacket_t) + 254U]; /* Transmit buffer over USB */
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static uint8_t aRxBuffer[C_SIZE_CMD_STRING];
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_FULL_LOW_POWER == 0)
+static uint8_t CommandString[C_SIZE_CMD_STRING];
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+static __IO uint16_t indexReceiveChar = 0;
+static __IO uint16_t CptReceiveCmdFromUser = 0;
+
+static TL_CmdPacket_t *p_thread_otcmdbuffer;
+static TL_EvtPacket_t *p_thread_notif_M0_to_M4;
+static __IO uint32_t CptReceiveMsgFromM0 = 0; /* Debug counter */
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_TH_Config_t ThreadConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadOtCmdBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + 255U];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
+
+static otCoapResource OT_RessourceDataTransfer = {C_RESSOURCE_DATA_TRANSFER, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapDataReqHandler, NULL};
+static otCoapResource OT_RessourceProvisionning = {C_RESSOURCE_Provisioning, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_ProvisioningReqHandler, NULL};
+static otMessageInfo OT_MessageInfo = {0};
+static otCoapHeader OT_Header = {0};
+static uint8_t OT_Command = 0;
+static uint16_t OT_BufferIdRead = 1U;
+static uint16_t OT_BufferIdSend = 1U;
+static uint8_t OT_BufferSend[COAP_PAYLOAD_MAX_LENGTH] = {0};
+static uint8_t OT_BufferReceived[COAP_PAYLOAD_MAX_LENGTH] = {0};
+static otMessage * pOT_Message = NULL;
+static otIp6Address OT_PeerAddress = { .mFields.m8 = { 0 } };
+
+/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Main entry point for the Thread Application
+ * @param none
+ * @retval None
+ */
+void APP_THREAD_Init( void )
+{
+ SHCI_CmdStatus_t ThreadInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_THREAD_CheckWirelessFirmwareInfo();
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ VCP_Init(&VcpTxBuffer[0], &VcpRxBuffer[0]);
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+ /* Register cmdbuffer */
+ APP_THREAD_RegisterCmdBuffer(&ThreadOtCmdBuffer);
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_THREAD, UTIL_LPM_DISABLE);
+
+ /* Init config buffer and call TL_THREAD_Init */
+ APP_THREAD_TL_THREAD_INIT();
+
+ /* Configure UART for sending CLI command from M4 */
+ APP_THREAD_Init_UART_CLI();
+
+ /* Send Thread start system cmd to M0 */
+ ThreadInitStatus = SHCI_C2_THREAD_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ThreadInitStatus);
+ /* Register task */
+ /* Create the different tasks */
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_MSG_FROM_M0_TO_M4, UTIL_SEQ_RFU, APP_THREAD_ProcessMsgM0ToM4);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_SEND_BUFFER, UTIL_SEQ_RFU, APP_THREAD_SendNextBuffer);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_PROVISIONING, UTIL_SEQ_RFU, APP_THREAD_AskProvisioning);
+
+ /* Initialize and configure the Thread device*/
+ APP_THREAD_DeviceConfig();
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_THREAD_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch(ErrId)
+ {
+ case ERR_REC_MULTI_MSG_FROM_M0 :
+ APP_THREAD_TraceError("ERR:ERR_REC_MULTI_MSG_FROM_M0 ", ErrCode);
+ break;
+ case ERR_REC_MULTI_TRACE_FROM_M0 :
+ APP_THREAD_TraceError("ERR:ERR_REC_MULTI_TRACE_FROM_M0 ", ErrCode);
+ break;
+ case ERR_THREAD_SET_STATE_CB :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_SET_STATE_CB ", ErrCode);
+ break;
+ case ERR_THREAD_SET_CHANNEL :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_SET_CHANNEL ", ErrCode);
+ break;
+ case ERR_THREAD_SET_PANID :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_SET_PANID ", ErrCode);
+ break;
+ case ERR_THREAD_IPV6_ENABLE :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_IPV6_ENABLE ", ErrCode);
+ break;
+ case ERR_THREAD_START :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_START ", ErrCode);
+ break;
+ case ERR_THREAD_COAP_START :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_COAP_START ", ErrCode);
+ break;
+ case ERR_THREAD_COAP_ADD_RESSOURCE :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_COAP_ADD_RESSOURCE ", ErrCode);
+ break;
+ case ERR_THREAD_MESSAGE_READ :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_MESSAGE_READ ", ErrCode);
+ break;
+ case ERR_THREAD_COAP_SEND_RESPONSE :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_COAP_SEND_RESPONSE ", ErrCode);
+ break;
+ case ERR_THREAD_COAP_APPEND :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_COAP_APPEND ", ErrCode);
+ break;
+ case ERR_THREAD_COAP_SEND_REQUEST :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_COAP_SEND_REQUEST ", ErrCode);
+ break;
+ case ERR_THREAD_SETUP :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_SETUP ", ErrCode);
+ break;
+ case ERR_THREAD_LINK_MODE :
+ APP_THREAD_TraceError("ERR:ERR_THREAD_LINK_MODE ", ErrCode);
+ break;
+ case ERR_ALLOC_MSG :
+ APP_THREAD_TraceError("ERR:ERR_ALLOC_MSG ", ErrCode);
+ break;
+ case ERR_FILE_RESP_HANDLER :
+ APP_THREAD_TraceError("ERR:ERR_FILE_RESP_HANDLER ", ErrCode);
+ break;
+ case ERR_MSG_COMPARE_FAILED :
+ APP_THREAD_TraceError("ERR:ERR_MSG_COMPARE_FAILED ", ErrCode);
+ break;
+ case ERR_NEW_MSG_ALLOC:
+ APP_THREAD_TraceError("ERR:ERR_NEW_MSG_ALLOC ", ErrCode);
+ break;
+ case ERR_PROVISIONING_RESP:
+ APP_THREAD_TraceError("ERR:ERR_PROVISIONING_RESP ", ErrCode);
+ break;
+ case ERR_THREAD_DATA_RESPONSE:
+ APP_THREAD_TraceError("ERR:ERR_THREAD_DATA_RESPONSE ", ErrCode);
+ break;
+ case ERR_APPEND:
+ APP_THREAD_TraceError("ERR:ERR_APPEND ", ErrCode);
+ break;
+ case ERR_HEADER_INIT:
+ APP_THREAD_TraceError("ERR:ERR_HEADER_INIT ", ErrCode);
+ break;
+ case ERR_TOKEN:
+ APP_THREAD_TraceError("ERR:ERR_TOKEN ", ErrCode);
+ break;
+ case ERR_THREAD_ERASE_PERSISTENT_INFO:
+ APP_THREAD_TraceError("ERR:ERR_THREAD_ERASE_PERSISTENT_INFO ", ErrCode);
+ break;
+ case ERR_THREAD_CHECK_WIRELESS :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_CHECK_WIRELESS ",ErrCode);
+ break;
+ default :
+ APP_DBG("ERROR FATAL = %d\n", ErrId);
+ APP_THREAD_TraceError("ERROR Unknown\n",0);
+ break;
+ }
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Thread initialization.
+ * This function configure the Thread mesh network.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_DeviceConfig(void)
+{
+ otError error;
+
+ /* Configure the standard values */
+
+ error = otInstanceErasePersistentInfo(NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_ERASE_PERSISTENT_INFO,error);
+ }
+ otInstanceFinalize(NULL);
+ otInstanceInitSingle();
+ error = otSetStateChangedCallback(NULL, APP_THREAD_StateNotif, NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_STATE_CB,error);
+ }
+ error = otLinkSetChannel(NULL, C_CHANNEL_NB);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_CHANNEL,error);
+ }
+ error = otLinkSetPanId(NULL, C_PANID);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_PANID,error);
+ }
+ error = otIp6SetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_IPV6_ENABLE,error);
+ }
+ /* Start the COAP server */
+ error = otCoapStart(NULL, OT_DEFAULT_COAP_PORT);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_START,error);
+ }
+ /* Add COAP resources */
+ error = otCoapAddResource(NULL, &OT_RessourceDataTransfer);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE,error);
+ }
+ /* Add APP_THREAD_AskProvisioning resources */
+ error = otCoapAddResource(NULL, &OT_RessourceProvisionning);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE,error);
+ }
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_START,error);
+ }
+}
+
+
+/**
+ * @brief Thread notification when the state changes.
+ * When the Thread device change state, a specific LED
+ * color is being displayed.
+ * LED2 On (Green) means that the device is in "Leader" mode.
+ * LED3 On (Red) means that the device is in "Child: mode or
+ * in "Router" mode.
+ * LED2 and LED3 off means that the device is in "Disabled"
+ * or "Detached" mode.
+ * @param aFlags : Define the item that has been modified
+ * aContext: Context
+ *
+ * @retval None
+ */
+static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
+
+ static uint32_t provisioning = 0;
+
+ if ((NotifFlags & (uint32_t)OT_CHANGED_THREAD_ROLE) == (uint32_t)OT_CHANGED_THREAD_ROLE)
+ {
+ switch (otThreadGetDeviceRole(NULL))
+ {
+ case OT_DEVICE_ROLE_DISABLED:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ break;
+ case OT_DEVICE_ROLE_DETACHED:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ break;
+ case OT_DEVICE_ROLE_CHILD:
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ if (provisioning == 0)
+ {
+ HAL_Delay(3000U);
+ UTIL_SEQ_SetTask(TASK_PROVISIONING, CFG_SCH_PRIO_1);
+ }
+ provisioning = 1U;
+ break;
+ case OT_DEVICE_ROLE_ROUTER :
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ break;
+ case OT_DEVICE_ROLE_LEADER :
+ BSP_LED_On(LED2);
+ BSP_LED_Off(LED3);
+ break;
+ default:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Dummy request handler
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_DummyReqHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+}
+
+/**
+ * @brief Warn the user that an error has occurred.In this case,
+ * the LEDs on the Board will start blinking.
+ *
+ * @param Mess : Message associated to the error.
+ * @param ErrCode: Error code associated to the module (OpenThread or other module if any)
+ * @retval None
+ */
+static void APP_THREAD_TraceError(const char * pMess, uint32_t ErrCode)
+{
+ APP_DBG("**** Fatal error = %s (Err = %d)",pMess,ErrCode);
+ while(1U == 1U)
+ {
+ BSP_LED_Toggle(LED1);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED2);
+ HAL_Delay(500U);
+ BSP_LED_Toggle(LED3);
+ HAL_Delay(500U);
+ }
+}
+
+/**
+ * @brief This function is used to compare the message received versus
+ * the original message.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_CheckMsgValidity(void)
+{
+ uint16_t mMsgId=OT_BufferIdRead - 1U; /* Corrected MsgId (MsgId starts at 1, not at 0) */
+ uint32_t mOffset = COAP_PAYLOAD_MAX_LENGTH*mMsgId; /* the starting offset */
+ uint32_t i;
+ bool valid =true;
+
+ for(i = mOffset; i < mOffset+COAP_PAYLOAD_MAX_LENGTH; i++)
+ {
+ if(OT_BufferReceived[i-mOffset] != aDataBuffer[i])
+ {
+ valid =false;
+ }
+ }
+
+ if(valid == false)
+ APP_THREAD_Error(ERR_MSG_COMPARE_FAILED, 0);
+}
+
+/**
+ * @brief This function compute the next message to be send
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SendNextBuffer(void)
+{
+ uint16_t j;
+ uint16_t mOffset;
+
+ if (OT_BufferIdSend < 5U)
+ {
+ /* Prepare next buffers to be send */
+ OT_BufferIdSend++;
+ mOffset=(OT_BufferIdSend - 1U) * COAP_PAYLOAD_MAX_LENGTH;
+
+ memset(OT_BufferSend, 0, COAP_PAYLOAD_MAX_LENGTH);
+ for(j = mOffset; j < mOffset + COAP_PAYLOAD_MAX_LENGTH; j++)
+ {
+ OT_BufferSend[j - mOffset] = aDataBuffer[j];
+ }
+
+ /* Send the data in unicast mode */
+ APP_THREAD_SendCoapUnicastRequest();
+ }
+ else
+ {
+ /* Buffer transfer has been successfully transfered */
+ BSP_LED_On(LED1);
+ APP_DBG(" ********* BUFFER HAS BEEN TRANFERED \r\n");
+ }
+}
+
+/**
+ * @brief Data request handler triggered at the reception of the COAP message
+ * @param pHeader header pointer
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @retval None
+ */
+static void APP_THREAD_CoapDataReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+ do
+ {
+ APP_DBG(" ********* APP_THREAD_CoapDataReqHandler \r\n");
+ if (otCoapHeaderGetType(pHeader) != OT_COAP_TYPE_CONFIRMABLE &&
+ otCoapHeaderGetType(pHeader) != OT_COAP_TYPE_NON_CONFIRMABLE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE, 0);
+ break;
+ }
+
+ if (otCoapHeaderGetCode(pHeader) != OT_COAP_CODE_PUT)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE, 0);
+ break;
+ }
+
+ if (otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_BufferReceived, sizeof(OT_BufferReceived)) != sizeof(OT_BufferReceived))
+ {
+ APP_THREAD_Error(ERR_THREAD_MESSAGE_READ, 0);
+ }
+ OT_BufferIdRead=otCoapHeaderGetMessageId(pHeader);
+
+ APP_THREAD_CheckMsgValidity();
+
+ if (otCoapHeaderGetType(pHeader) == OT_COAP_TYPE_CONFIRMABLE)
+ {
+ APP_THREAD_SendDataResponse(pHeader, pMessageInfo);
+ }
+ } while (false);
+}
+
+/**
+ * @brief This function acknowledge the data reception by sending an ACK
+ * back to the sender.
+ * @param pRequestHeader coap header
+ * @param pMessageInfo message info pointer
+ * @retval None
+ */
+static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
+ const otMessageInfo * pMessageInfo)
+{
+ otError error = OT_ERROR_NONE;
+
+ APP_DBG(" ********* APP_THREAD_SendDataResponse \r\n");
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_ACKNOWLEDGMENT, OT_COAP_CODE_CHANGED);
+ otCoapHeaderSetMessageId(&OT_Header, otCoapHeaderGetMessageId(pRequestHeader));
+ otCoapHeaderSetToken(&OT_Header,
+ otCoapHeaderGetToken(pRequestHeader),
+ otCoapHeaderGetTokenLength(pRequestHeader));
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_NEW_MSG_ALLOC,error);
+ }
+ error = otCoapSendResponse(NULL, pOT_Message, pMessageInfo);
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ APP_THREAD_Error(ERR_THREAD_DATA_RESPONSE,error);
+ }
+}
+
+
+
+/**
+ * @brief This function is used to handle the APP_THREAD_AskProvisioning handler
+ *
+ * @param pHeader header pointer
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @retval None
+ */
+static void APP_THREAD_ProvisioningReqHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+ (void)pMessage;
+
+ APP_DBG("**** Leader receives APP_THREAD_AskProvisioning_request *****\n\r");
+ if (otCoapHeaderGetType(pHeader) == OT_COAP_TYPE_NON_CONFIRMABLE &&
+ otCoapHeaderGetCode(pHeader) == OT_COAP_CODE_GET)
+ {
+ OT_MessageInfo = *pMessageInfo;
+ memset(&OT_MessageInfo.mSockAddr, 0, sizeof(OT_MessageInfo.mSockAddr));
+ if (APP_THREAD_ProvisioningRespSend(pHeader, &OT_MessageInfo) != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_PROVISIONING_RESP, 0);
+ }
+ }
+}
+
+/**
+ * @brief This function is used to handle the APP_THREAD_AskProvisioning response
+ *
+ * @param pRequestHeader
+ * @param pMessageInfo message info pointer
+ * @retval error code
+ */
+static otError APP_THREAD_ProvisioningRespSend(otCoapHeader * pRequestHeader,
+ const otMessageInfo * pMessageInfo)
+{
+ otError error = OT_ERROR_NO_BUFS;
+
+ do
+ {
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_CONTENT);
+ otCoapHeaderSetToken(&OT_Header,
+ otCoapHeaderGetToken(pRequestHeader),
+ otCoapHeaderGetTokenLength(pRequestHeader));
+ otCoapHeaderSetPayloadMarker(&OT_Header);
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_ALLOC_MSG, error);
+ }
+
+ error = otMessageAppend(pOT_Message, &OT_Command, sizeof(OT_Command));
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_APPEND, error);
+ }
+
+ error = otMessageAppend(pOT_Message, otThreadGetMeshLocalEid(NULL), sizeof(otIp6Address));
+ if (error != OT_ERROR_NONE)
+ {
+ break;
+ }
+ APP_DBG("**** 2) APP_THREAD_ProvisioningRespSend *****\n\r");
+ error = otCoapSendResponse(NULL, pOT_Message, pMessageInfo);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ APP_THREAD_Error(ERR_THREAD_COAP_SEND_RESP, error);
+ }
+ } while (false);
+
+ return error;
+}
+
+/**
+ * @brief This function is used to manage the APP_THREAD_AskProvisioning request
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_ProvisioningReqSend()
+{
+ otError error = OT_ERROR_NONE;
+
+ do
+ {
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_GET);
+
+ otCoapHeaderGenerateToken(&OT_Header, 2U);
+
+ error = otCoapHeaderAppendUriPathOptions(&OT_Header, C_RESSOURCE_Provisioning);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_APEND_URI,error);
+ }
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_NEW_MSG_ALLOC,error);
+ }
+
+ memset(&OT_MessageInfo, 0, sizeof(OT_MessageInfo));
+ OT_MessageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;
+ OT_MessageInfo.mPeerPort = OT_DEFAULT_COAP_PORT;
+ otIp6AddressFromString("FF03::1", &OT_MessageInfo.mPeerAddr);
+
+ APP_DBG("**** 1) APP_THREAD_ProvisioningReqSend *****\n\r");
+ error = otCoapSendRequest(NULL,
+ pOT_Message,
+ &OT_MessageInfo,
+ &APP_THREAD_DummyRespHandler,
+ (void*)&APP_THREAD_ProvisioningRespHandler);
+ } while (false);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ }
+}
+
+/**
+ * @brief This function is used to manage the APP_THREAD_AskProvisioning response
+ * handler.
+ *
+ * @param pHeader header
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @param Result error code if any
+ * @retval None
+ */
+static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
+{
+ (void)pHeader;
+ if (Result == OT_ERROR_NONE)
+ {
+ if ((otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_Command, sizeof(OT_Command)) == sizeof(OT_Command)))
+ {
+ /* Retrieve the */
+ if (otMessageRead(pMessage,
+ otMessageGetOffset(pMessage) + sizeof(OT_Command),
+ &OT_PeerAddress,
+ sizeof(OT_PeerAddress)) != sizeof(OT_PeerAddress))
+ {
+ APP_THREAD_Error(ERR_READ, 0);
+ }
+ APP_DBG("**** 3) APP_THREAD_ProvisioningRespHandler *****");
+ /* Ask to start the first transfer */
+ UTIL_SEQ_SetTask(TASK_SEND_BUFFER, CFG_SCH_PRIO_1);
+ }
+ }
+ else
+ {
+ APP_DBG("**** 3)APP_THREAD_AskProvisioning failed ***** with ERROR code = %d\n\r",Result);
+ }
+}
+
+
+/**
+ * @brief This function initiates the APP_THREAD_AskProvisioning phase
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_AskProvisioning(void)
+{
+ HAL_Delay(1000U);
+ APP_THREAD_ProvisioningReqSend();
+}
+/**
+ * @brief This function is used to send the data via a Coap message in
+ * confirmable mode.
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SendCoapUnicastRequest()
+{
+ otError error = OT_ERROR_NONE;
+
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_CONFIRMABLE, OT_COAP_CODE_PUT);
+ otCoapHeaderSetMessageId(&OT_Header,OT_BufferIdSend);
+ otCoapHeaderGenerateToken(&OT_Header, 2U);
+
+ error = otCoapHeaderAppendUriPathOptions(&OT_Header,C_RESSOURCE_DATA_TRANSFER);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_APEND_URI,error);
+ }
+ otCoapHeaderSetPayloadMarker(&OT_Header);
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ APP_THREAD_Error(ERR_ALLOC_MSG,error);
+ }
+ error = otMessageAppend(pOT_Message, &OT_BufferSend, sizeof(OT_BufferSend));
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_APPEND,error);
+ }
+ memset(&OT_MessageInfo, 0, sizeof(OT_MessageInfo));
+ OT_MessageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;
+ OT_MessageInfo.mPeerPort = OT_DEFAULT_COAP_PORT;
+ memcpy(&OT_MessageInfo.mPeerAddr, &OT_PeerAddress, sizeof(OT_MessageInfo.mPeerAddr));
+ error = otCoapSendRequest(NULL,
+ pOT_Message,
+ &OT_MessageInfo,
+ &APP_THREAD_DummyRespHandler,
+ (void*)&APP_THREAD_DataRespHandler);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ }
+}
+
+/**
+ * @brief This function manages the data response handler
+ * and reschedules the sending of data.
+ *
+ * @param pHeader header
+ * @param pMessage message pointer
+ * @param pMessageInfo message info pointer
+ * @param Result error code
+ * @retval None
+ */
+static void APP_THREAD_DataRespHandler(otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(pHeader);
+ UNUSED(pMessage);
+ UNUSED(pMessageInfo);
+
+ if (Result == OT_ERROR_NONE)
+ {
+ /* Ask to perform a new transfer */
+ HAL_Delay(1000U);
+ UTIL_SEQ_SetTask(TASK_SEND_BUFFER, CFG_SCH_PRIO_1);
+ }
+ else
+ {
+ APP_THREAD_Error(ERR_FILE_RESP_HANDLER,Result);
+ }
+}
+
+/**
+ * @brief This function is used to handle a dummy response handler
+ *
+ * @param p_context context
+ * @param pHeader coap header
+ * @param pMessage message
+ * @paramp pMessageInfo otMessage information
+ * @param Result error status
+ * @retval None
+ */
+static void APP_THREAD_DummyRespHandler(void * p_context,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(p_context);
+ UNUSED(pHeader);
+ UNUSED(pMessage);
+ UNUSED(pMessageInfo);
+ UNUSED(Result);
+}
+
+/**
+ * @brief Check if the Coprocessor Wireless Firmware loaded supports Thread
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_THREAD_Error((uint32_t)ERR_THREAD_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("WIRELESS COPROCESSOR FW:");
+ /* Print version */
+ APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_THREAD_FTD :
+ APP_DBG("FW Type : Thread FTD");
+ break;
+ case INFO_STACK_TYPE_THREAD_MTD :
+ APP_DBG("FW Type : Thread MTD");
+ break;
+ case INFO_STACK_TYPE_BLE_THREAD_FTD_STATIC :
+ APP_DBG("FW Type : Static Concurrent Mode BLE/Thread");
+ break;
+ default :
+ /* No Thread device supported ! */
+ APP_THREAD_Error((uint32_t)ERR_THREAD_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
+ break;
+ }
+ APP_DBG("**********************************************************");
+ }
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void APP_THREAD_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer)
+{
+ p_thread_otcmdbuffer = p_buffer;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_OTCmdPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)p_thread_otcmdbuffer->cmdserial.cmd.payload;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_OTCmdRspPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)((TL_EvtPacket_t *)p_thread_otcmdbuffer)->evtserial.evt.payload;
+}
+
+Thread_OT_Cmd_Request_t* THREAD_Get_NotificationPayloadBuffer(void)
+{
+ return (Thread_OT_Cmd_Request_t*)(p_thread_notif_M0_to_M4)->evtserial.evt.payload;
+}
+
+/**
+ * @brief This function is used to transfer the Ot commands from the
+ * M4 to the M0.
+ *
+ * @param None
+ * @return None
+ */
+void Ot_Cmd_Transfer(void)
+{
+ /* OpenThread OT command cmdcode range 0x280 .. 0x3DF = 352 */
+ p_thread_otcmdbuffer->cmdserial.cmd.cmdcode = 0x280U;
+ /* Size = otCmdBuffer->Size (Number of OT cmd arguments : 1 arg = 32bits so multiply by 4 to get size in bytes)
+ * + ID (4 bytes) + Size (4 bytes) */
+ uint32_t l_size = ((Thread_OT_Cmd_Request_t*)(p_thread_otcmdbuffer->cmdserial.cmd.payload))->Size * 4U + 8U;
+ p_thread_otcmdbuffer->cmdserial.cmd.plen = l_size;
+
+ TL_OT_SendCmd();
+
+ /* Wait completion of cmd */
+ Wait_Getting_Ack_From_M0();
+}
+
+/**
+ * @brief This function is called when acknowledge from OT command is received from the M0+.
+ *
+ * @param Otbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_OT_CmdEvtReceived( TL_EvtPacket_t * Otbuffer )
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Otbuffer);
+
+ Receive_Ack_From_M0();
+}
+
+/**
+ * @brief This function is called when notification from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_THREAD_NotReceived( TL_EvtPacket_t * Notbuffer )
+{
+ p_thread_notif_M0_to_M4 = Notbuffer;
+
+ Receive_Notification_From_M0();
+}
+
+/**
+ * @brief This function is called before sending any ot command to the M0
+ * core. The purpose of this function is to be able to check if
+ * there are no notifications coming from the M0 core which are
+ * pending before sending a new ot command.
+ * @param None
+ * @retval None
+ */
+void Pre_OtCmdProcessing(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_SYNCHRO_BYPASS_IDLE);
+}
+
+/**
+ * @brief This function waits for getting an acknowledgment from the M0.
+ *
+ * @param None
+ * @retval None
+ */
+static void Wait_Getting_Ack_From_M0(void)
+{
+ UTIL_SEQ_WaitEvt(EVENT_ACK_FROM_M0_EVT);
+}
+
+/**
+ * @brief Receive an acknowledgment from the M0+ core.
+ * Each command send by the M4 to the M0 are acknowledged.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Ack_From_M0(void)
+{
+ UTIL_SEQ_SetEvt(EVENT_ACK_FROM_M0_EVT);
+}
+
+/**
+ * @brief Receive a notification from the M0+ through the IPCC.
+ * This function is called under interrupt.
+ * @param None
+ * @retval None
+ */
+static void Receive_Notification_From_M0(void)
+{
+ CptReceiveMsgFromM0++;
+ UTIL_SEQ_SetTask(TASK_MSG_FROM_M0_TO_M4,CFG_SCH_PRIO_0);
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#else
+#if (CFG_FULL_LOW_POWER == 0)
+static void RxCpltCallback(void)
+{
+ /* Filling buffer and wait for '\r' char */
+ if (indexReceiveChar < C_SIZE_CMD_STRING)
+ {
+ CommandString[indexReceiveChar++] = aRxBuffer[0];
+ if (aRxBuffer[0] == '\r')
+ {
+ CptReceiveCmdFromUser = 1U;
+
+ /* UART task scheduling*/
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+
+ /* Once a character has been sent, put back the device in reception mode */
+ HW_UART_Receive_IT(CFG_CLI_UART, aRxBuffer, 1U, RxCpltCallback);
+}
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief Process the command strings.
+ * As soon as a complete command string has been received, the task
+ * in charge of sending the command to the M0 is scheduled
+ * @param None
+ * @retval None
+ */
+static uint32_t ProcessCmdString( uint8_t* buf , uint32_t len )
+{
+ uint32_t i,j,tmp_start;
+ tmp_start = 0;
+ uint32_t res = 0;
+
+ i= 0;
+ while ((buf[i] != '\r') && (i < len))
+ {
+ i++;
+ }
+
+ if (i != len)
+ {
+ memcpy(CommandString, buf,(i+1));
+ indexReceiveChar = i + 1U; /* Length of the buffer containing the command string */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ tmp_start = i;
+ for (j = 0; j < (len - tmp_start - 1U) ; j++)
+ {
+ buf[j] = buf[tmp_start + j + 1U];
+ }
+ res = len - tmp_start - 1U;
+ }
+ else
+ {
+ res = len;
+ }
+ return res; /* Remaining characters in the temporary buffer */
+}
+#endif/* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+#if (CFG_FULL_LOW_POWER == 0)
+/**
+ * @brief Process sends receive CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void Send_CLI_To_M0(void)
+{
+ memset(ThreadCliCmdBuffer.cmdserial.cmd.payload, 0x0U, 255U);
+ memcpy(ThreadCliCmdBuffer.cmdserial.cmd.payload, CommandString, indexReceiveChar);
+ ThreadCliCmdBuffer.cmdserial.cmd.plen = indexReceiveChar;
+ ThreadCliCmdBuffer.cmdserial.cmd.cmdcode = 0x0;
+
+ /* Clear receive buffer, character counter and command complete */
+ CptReceiveCmdFromUser = 0;
+ indexReceiveChar = 0;
+ memset(CommandString, 0, C_SIZE_CMD_STRING);
+
+ TL_CLI_SendCmd();
+}
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+
+/**
+ * @brief Send notification for CLI TL Channel.
+ * @param None
+ * @retval None
+ */
+static void Send_CLI_Ack_For_OT(void)
+{
+
+ /* Notify M0 that characters have been sent to UART */
+ TL_THREAD_CliSendAck();
+}
+
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_Init_UART_CLI(void)
+{
+#if (CFG_FULL_LOW_POWER == 0)
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_CLI_TO_M0, UTIL_SEQ_RFU,Send_CLI_To_M0);
+#endif /* (CFG_FULL_LOW_POWER == 0) */
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+#else
+ HW_UART_Init(CFG_CLI_UART);
+ HW_UART_Receive_IT(CFG_CLI_UART, aRxBuffer, 1, RxCpltCallback);
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+}
+
+/**
+ * @brief Perform initialization of TL for THREAD.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_TL_THREAD_INIT(void)
+{
+ ThreadConfigBuffer.p_ThreadOtCmdRspBuffer = (uint8_t*)&ThreadOtCmdBuffer;
+ ThreadConfigBuffer.p_ThreadNotAckBuffer = (uint8_t*)ThreadNotifRspEvtBuffer;
+ ThreadConfigBuffer.p_ThreadCliRspBuffer = (uint8_t*)&ThreadCliCmdBuffer;
+
+ TL_THREAD_Init( &ThreadConfigBuffer );
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void TL_THREAD_CliNotReceived( TL_EvtPacket_t * Notbuffer )
+{
+ TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t l_size = l_CliBuffer->cmdserial.cmd.plen;
+
+ /* WORKAROUND: if string to output is "> " then respond directly to M0 and do not output it */
+ if (strcmp((const char *)l_CliBuffer->cmdserial.cmd.payload, "> ") != 0)
+ {
+ /* Write to CLI UART */
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+ VCP_SendData( l_CliBuffer->cmdserial.cmd.payload, l_size, HostTxCb);
+#else
+ HW_UART_Transmit_IT(CFG_CLI_UART, l_CliBuffer->cmdserial.cmd.payload, l_size, HostTxCb);
+#endif /*USAGE_OF_VCP */
+ }
+ else
+ {
+ Send_CLI_Ack_For_OT();
+ }
+}
+
+/**
+ * @brief End of transfer callback for CLI UART sending.
+ *
+ * @param Notbuffer : a pointer to TL_EvtPacket_t
+ * @return None
+ */
+void HostTxCb(void)
+{
+ Send_CLI_Ack_For_OT();
+}
+
+/**
+ * @brief Process the messages coming from the M0.
+ * @param None
+ * @retval None
+ */
+void APP_THREAD_ProcessMsgM0ToM4(void)
+{
+ if (CptReceiveMsgFromM0 != 0)
+ {
+ /* If CptReceiveMsgFromM0 is > 1. it means that we did not serve all the events from the radio */
+ if (CptReceiveMsgFromM0 > 1U)
+ {
+ APP_THREAD_Error(ERR_REC_MULTI_MSG_FROM_M0, 0);
+ }
+ else
+ {
+ OpenThread_CallBack_Processing();
+ }
+ /* Reset counter */
+ CptReceiveMsgFromM0 = 0;
+ }
+}
+
+#if (CFG_USB_INTERFACE_ENABLE != 0)
+/**
+ * @brief This function is called when thereare some data coming
+ * from the Hyperterminal via the USB port
+ * Data received over USB OUT endpoint are sent over CDC interface
+ * through this function.
+ * @param Buf: Buffer of data received
+ * @param Len: Number of data received (in bytes)
+ * @retval Number of characters remaining in the buffer and not yet processed
+ */
+void VCP_DataReceived(uint8_t* Buf , uint32_t *Len)
+{
+ uint32_t i,flag_continue_checking = TRUE;
+ uint32_t char_remaining = 0;
+ static uint32_t len_total = 0;
+
+ /* Copy the characteres in the temporary buffer */
+ for (i = 0; i < *Len; i++)
+ {
+ TmpString[len_total++] = Buf[i];
+ }
+
+ /* Process the buffer commands one by one */
+ /* A command is limited by a \r caracaters */
+ while (flag_continue_checking == TRUE)
+ {
+ char_remaining = ProcessCmdString(TmpString,len_total);
+ /* If char_remaining is equal to len_total, it means that the command string is not yet
+ * completed.
+ * If char_remaining is equal to 0, it means that the command string has
+ * been entirely processed.
+ */
+ if ((char_remaining == 0) || (char_remaining == len_total))
+ {
+ flag_continue_checking = FALSE;
+ }
+ len_total = char_remaining;
+ }
+}
+#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h
new file mode 100644
index 000000000..7dc322ae7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h
@@ -0,0 +1,110 @@
+/**
+ ******************************************************************************
+ * @file app_thread.h
+ * @author MCD Application Team
+ * @brief Header for Thread application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_THREAD_H
+#define APP_THREAD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ---------------------------------------------------------------------------*/
+/* Includes ------------------------------------------------------------------*/
+/* ---------------------------------------------------------------------------*/
+#include "tl.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "tl_thread_hci.h"
+
+/* OpenThread Library */
+#include OPENTHREAD_CONFIG_FILE
+
+/* ---------------------------------------------------------------------------*/
+/* Exported types and defines ------------------------------------------------*/
+/* ---------------------------------------------------------------------------*/
+
+/* Thread application generic defines */
+/*------------------------------------*/
+typedef enum
+{
+ APP_THREAD_LIMITED,
+ APP_THREAD_FULL,
+} APP_THREAD_InitMode_t;
+
+/* Application errors */
+/*------------------------------------*/
+
+ /*
+ * List of all errors tracked the Thread application
+ * running on M4. Some of these errors may be fatal
+ * or just warnings
+ */
+typedef enum
+{
+ ERR_REC_MULTI_MSG_FROM_M0 = 11U,
+ ERR_REC_MULTI_TRACE_FROM_M0 = 12U,
+ ERR_THREAD_SET_STATE_CB = 13U,
+ ERR_THREAD_SET_CHANNEL = 14U,
+ ERR_THREAD_SET_PANID = 15U,
+ ERR_THREAD_IPV6_ENABLE = 16U,
+ ERR_THREAD_START = 17U,
+ ERR_THREAD_COAP_START = 18U,
+ ERR_THREAD_COAP_ADD_RESSOURCE = 19U,
+ ERR_THREAD_MESSAGE_READ = 20U,
+ ERR_THREAD_COAP_SEND_RESPONSE = 21U,
+ ERR_THREAD_COAP_APPEND = 22U,
+ ERR_THREAD_COAP_SEND_REQUEST = 23U,
+ ERR_THREAD_COAP_SEND_RESP = 24U,
+ ERR_THREAD_SETUP = 25U,
+ ERR_THREAD_LINK_MODE = 26U,
+ ERR_ALLOC_MSG = 27U,
+ ERR_FILE_RESP_HANDLER = 28U,
+ ERR_MSG_COMPARE_FAILED = 29U,
+ ERR_NEW_MSG_ALLOC = 30U,
+ ERR_PROVISIONING_HANDLER = 31U,
+ ERR_THREAD_DATA_RESPONSE = 32U,
+ ERR_APPEND = 33U,
+ ERR_PROVISIONING_RESP = 34U,
+ ERR_HEADER_INIT = 36U,
+ ERR_TOKEN = 37U,
+ ERR_APEND_URI = 38U,
+ ERR_READ = 39U,
+ ERR_THREAD_ERASE_PERSISTENT_INFO = 40U,
+ ERR_THREAD_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+ /* ---------------------------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ /* ---------------------------------------------------------------------------*/
+void APP_THREAD_Init( void );
+void APP_THREAD_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_THREAD_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+void APP_THREAD_ProcessMsgM0ToM4(void);
+void APP_THREAD_Init_UART_CLI(void);
+void APP_THREAD_TL_THREAD_INIT(void);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_THREAD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h
new file mode 100644
index 000000000..ef2e4b2ae
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/data_transfer.h
@@ -0,0 +1,5033 @@
+/**
+ ******************************************************************************
+ * @file data_transfer.h
+ * @author MCD Application Team
+ * @brief data to be transfered
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+
+#ifndef DATA_TRANSFER_H_
+#define DATA_TRANSFER_H_
+#include <stdio.h>
+#include <string.h>
+#include <openthread/platform/logging.h>
+#include "thread.h"
+#include <openthread/coap.h>
+#include "app_conf.h"
+#include "dbg_trace.h"
+#include "app_common.h"
+#include "stm32wbxx_core_interface_def.h"
+#include "stm32_seq.h"
+#define COAP_PAYLOAD_MAX_LENGTH 64
+#define DATA_BUFFER_LENGTH 79872
+#define TOKEN_LENGTH 2
+
+static const uint8_t aDataBuffer[DATA_BUFFER_LENGTH]={0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
+0x00, 0x00, 0x02, 0x76, 0x00, 0x00, 0x01, 0x68, 0x08, 0x06, 0x00, 0x00, 0x00, 0xDA, 0x60, 0xB6,
+0x8F, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00,
+0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC, 0x61, 0x05, 0x00, 0x00,
+0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0E, 0xC4, 0x00, 0x00, 0x0E, 0xC4, 0x01, 0x95,
+0x2B, 0x0E, 0x1B, 0x00, 0x00, 0xFF, 0xA5, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5E, 0xEC, 0xFD, 0x07,
+0x90, 0x64, 0x49, 0x7A, 0x1E, 0x08, 0x7A, 0x6A, 0x5D, 0x5A, 0xCB, 0xAE, 0xAA, 0xD6, 0xBA, 0x7B,
+0xBA, 0x67, 0x7A, 0x44, 0x8F, 0x00, 0x06, 0xC0, 0x60, 0x20, 0x08, 0x10, 0x00, 0x79, 0x5C, 0xE2,
+0xC8, 0xE3, 0xED, 0xAE, 0x19, 0xF7, 0x78, 0x67, 0x7B, 0x76, 0x76, 0x66, 0xBB, 0xB6, 0x6B, 0x6B,
+0x46, 0xB3, 0xB3, 0xBB, 0x5B, 0xB3, 0x5B, 0xB3, 0x5B, 0xDB, 0x5B, 0x1E, 0xB9, 0x47, 0x72, 0x77,
+0x09, 0x70, 0x49, 0x88, 0x85, 0xC6, 0x00, 0xA3, 0x30, 0x18, 0xCC, 0xF4, 0x4C, 0x4F, 0x6B, 0x2D,
+0x4B, 0x76, 0x69, 0x5D, 0x95, 0x5A, 0x67, 0xDE, 0xF7, 0xFD, 0xC2, 0xDD, 0x5F, 0x64, 0x64, 0x66,
+0x64, 0x75, 0x65, 0x54, 0x75, 0x96, 0xBF, 0xEE, 0xA8, 0x8C, 0x78, 0xE1, 0xCF, 0x9F, 0xFB, 0xE7,
+0x1E, 0xE1, 0x5F, 0x7C, 0xBF, 0xF0, 0x96, 0x79, 0x1C, 0xA1, 0x1C, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x9F, 0x78, 0x04, 0x5A, 0x3F, 0xF1,
+0x3D, 0x28, 0x1D, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x10, 0x04, 0x0A, 0xB1, 0x2B, 0x13, 0xA1, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B,
+0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A,
+0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90,
+0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35,
+0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10,
+0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28,
+0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05,
+0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41,
+0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5,
+0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1,
+0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0,
+0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28,
+0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32,
+0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81,
+0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40,
+0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB,
+0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02,
+0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0,
+0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B,
+0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A,
+0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90,
+0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35,
+0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x10, 0xBB, 0x35, 0x32, 0x90, 0xA5, 0x1B, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0xB1, 0x2B, 0x73, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x41, 0xA0, 0x65,
+0x1E, 0xC7, 0x1A, 0xE9, 0xCB, 0x9A, 0xEF, 0x46, 0x19, 0xAA, 0x35, 0x3F, 0xC4, 0xA5, 0x83, 0x37,
+0x19, 0x81, 0x96, 0x96, 0x96, 0x9B, 0x5C, 0x63, 0xA9, 0xAE, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC,
+0xDE, 0x08, 0x14, 0xC5, 0xEE, 0xF6, 0x1E, 0x9F, 0xD2, 0xBA, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x0D, 0x23, 0x50, 0x14, 0xBB, 0x86, 0xA1, 0x6A, 0x7E,
+0x41, 0x57, 0xE8, 0x8A, 0xEA, 0xD0, 0x7C, 0xEC, 0xCB, 0x1D, 0xD7, 0x06, 0x02, 0xFC, 0x0C, 0x95,
+0xCF, 0xCF, 0xDA, 0x18, 0xCB, 0xD2, 0x8B, 0x82, 0x40, 0x41, 0xA0, 0x31, 0x04, 0x0A, 0xB1, 0x6B,
+0x0C, 0xA7, 0x5B, 0x52, 0x2A, 0x27, 0x76, 0xB4, 0x97, 0xCF, 0xCE, 0xCD, 0x87, 0xB9, 0xB9, 0xB9,
+0x30, 0x3D, 0x83, 0xC7, 0xEC, 0xAC, 0xBD, 0xC6, 0x3B, 0xB7, 0xC4, 0xDA, 0xC4, 0x9B, 0xB2, 0x55,
+0x7A, 0x73, 0x6F, 0x82, 0xDA, 0xF5, 0x57, 0x6A, 0xDD, 0xCF, 0x3A, 0x60, 0x4F, 0xAB, 0xB5, 0xDF,
+0x12, 0xF8, 0xB3, 0x5E, 0xAD, 0xF4, 0xFE, 0xDA, 0xFF, 0x16, 0x41, 0x65, 0x1E, 0xFF, 0x2D, 0xEC,
+0xDF, 0x4A, 0x6A, 0x5C, 0x6C, 0x78, 0x13, 0xFA, 0x2B, 0xA9, 0x2D, 0x2F, 0xBB, 0x82, 0x89, 0xE3,
+0x03, 0x12, 0x2F, 0xF7, 0xBB, 0x2F, 0xD2, 0x8A, 0x6C, 0x1C, 0x1B, 0x99, 0x11, 0xF9, 0x78, 0xE7,
+0xB3, 0x27, 0xBF, 0xED, 0x82, 0x26, 0x2C, 0xD1, 0xED, 0x36, 0x14, 0xEE, 0xEB, 0xEA, 0x08, 0xED,
+0xAD, 0x18, 0x85, 0x62, 0x8E, 0xBD, 0xD1, 0x09, 0x52, 0xAE, 0x2B, 0x08, 0x14, 0x04, 0x3E, 0x81,
+0x08, 0x14, 0x62, 0x77, 0x1B, 0x0D, 0x5A, 0xEE, 0x43, 0x57, 0xBB, 0x18, 0xCD, 0x81, 0xD4, 0x4D,
+0x4C, 0xCF, 0x84, 0xF1, 0xA9, 0x99, 0x30, 0x34, 0x3E, 0x19, 0x06, 0xC7, 0x26, 0xC3, 0xC4, 0xE4,
+0x74, 0x98, 0x04, 0xC9, 0x5B, 0xB8, 0x70, 0xAE, 0x8C, 0x58, 0x71, 0xC1, 0xD4, 0x45, 0xD3, 0x2D,
+0xF3, 0xF9, 0xA2, 0xBD, 0x18, 0xBF, 0x71, 0x52, 0xA0, 0x7F, 0xFD, 0xCA, 0xBC, 0x35, 0x8D, 0xAF,
+0xA7, 0x37, 0x42, 0xEC, 0x96, 0xA2, 0x3B, 0x3E, 0xA8, 0x35, 0x9E, 0x06, 0x15, 0x66, 0xE0, 0x18,
+0xE1, 0x64, 0xDD, 0xAA, 0x88, 0x46, 0xEB, 0xF2, 0x14, 0x75, 0x91, 0x6B, 0x15, 0x13, 0xBD, 0xE1,
+0x5C, 0x76, 0x83, 0xC6, 0x30, 0xA9, 0x56, 0x2A, 0xAF, 0xEA, 0xB0, 0x1A, 0x1D, 0xA5, 0x5A, 0x1A,
+0x54, 0xE7, 0x5A, 0x83, 0x63, 0x9E, 0x70, 0xC4, 0xE2, 0x7C, 0xB2, 0x02, 0x4F, 0x0C, 0xBB, 0xD6,
+0xAB, 0xD0, 0xFB, 0xF2, 0x5F, 0xD2, 0x56, 0xBD, 0x67, 0x65, 0xD6, 0x59, 0x33, 0xAA, 0xF3, 0x62,
+0xF1, 0x0F, 0x9B, 0xD7, 0x51, 0xED, 0xA6, 0x52, 0x62, 0xC5, 0x4F, 0xEF, 0x93, 0x8D, 0x5A, 0x9D,
+0xCA, 0x52, 0x0B, 0x3A, 0xDB, 0x5A, 0xC3, 0xA1, 0xAD, 0xEB, 0xC2, 0x40, 0x4F, 0x87, 0x5C, 0x5D,
+0xC8, 0xDD, 0x6D, 0xF4, 0x45, 0x57, 0x9A, 0x52, 0x10, 0x28, 0x08, 0xAC, 0x2A, 0x02, 0x85, 0xD8,
+0xAD, 0x2A, 0xBC, 0x2B, 0xAB, 0x3C, 0x27, 0x76, 0x0C, 0x69, 0x19, 0x9E, 0x98, 0x0A, 0xC3, 0x20,
+0x71, 0x63, 0x20, 0x70, 0x24, 0x75, 0xFC, 0x4B, 0x62, 0x37, 0x3C, 0x3E, 0x15, 0x06, 0x71, 0x7E,
+0x02, 0xCF, 0xA7, 0x66, 0x66, 0xEB, 0x2C, 0xEF, 0x69, 0x81, 0x8B, 0xCF, 0x6C, 0xC5, 0xD4, 0xF5,
+0xD6, 0xC9, 0x0C, 0xDE, 0x9D, 0xB7, 0x33, 0xF8, 0xE3, 0xCA, 0x92, 0x2F, 0xDA, 0x95, 0xD6, 0x2F,
+0x20, 0x30, 0xB9, 0xC6, 0x52, 0xAB, 0xD8, 0xE9, 0x95, 0x8D, 0x93, 0x98, 0x54, 0x39, 0xAF, 0xC9,
+0x35, 0xAE, 0xC5, 0x55, 0x1A, 0xA3, 0x4D, 0xDE, 0x2F, 0xB9, 0x2E, 0x3F, 0x12, 0x71, 0x81, 0x68,
+0xA3, 0xEF, 0x2D, 0x43, 0xEC, 0x6A, 0xBB, 0x28, 0x44, 0x62, 0x01, 0x93, 0x70, 0x04, 0xED, 0x8D,
+0xC5, 0xF8, 0xA5, 0xDC, 0xCE, 0x09, 0x8F, 0x17, 0x02, 0xC2, 0xB1, 0x31, 0x8B, 0xCD, 0x8D, 0x2A,
+0xE1, 0x12, 0x52, 0x42, 0x5A, 0x53, 0x21, 0x65, 0x8A, 0x2D, 0xB8, 0x7E, 0x1D, 0x4E, 0x6A, 0xF7,
+0xB2, 0xBE, 0xF2, 0x76, 0x7E, 0xC8, 0x50, 0x57, 0xF8, 0xEC, 0x42, 0x5A, 0x58, 0x9F, 0x38, 0xE1,
+0xC2, 0x1A, 0x62, 0x97, 0xD4, 0xDA, 0x45, 0x08, 0x62, 0x56, 0x9E, 0xF7, 0x57, 0xC2, 0xBF, 0xF8,
+0x51, 0x97, 0xD8, 0xB5, 0x54, 0x89, 0x1D, 0x47, 0x7C, 0xE9, 0x9F, 0x2C, 0x55, 0x62, 0xF7, 0xC0,
+0xCE, 0x8D, 0xE1, 0xFE, 0x1D, 0xEB, 0x43, 0x57, 0x3B, 0xAE, 0x6C, 0x6C, 0x32, 0xAE, 0xEC, 0x03,
+0x5B, 0x4A, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x10, 0x81, 0x42, 0xEC, 0x6E, 0xF1, 0xA0,
+0x2C, 0xA6, 0xD2, 0x4D, 0x82, 0xB4, 0x1D, 0x3E, 0x77, 0x35, 0xBC, 0x7F, 0xF6, 0x72, 0xF8, 0xE8,
+0xF2, 0x60, 0xB8, 0x3A, 0x32, 0x21, 0xE4, 0x4E, 0xCD, 0xB1, 0x21, 0xCC, 0xCC, 0xCD, 0x62, 0x61,
+0xC7, 0x73, 0x13, 0xD7, 0x72, 0x7E, 0xE1, 0x8B, 0x24, 0xBB, 0xB6, 0x14, 0xB1, 0x13, 0xBD, 0xC5,
+0x88, 0x5D, 0xD5, 0x5A, 0x58, 0x87, 0xAD, 0x64, 0xA7, 0xA2, 0x7E, 0x82, 0x85, 0xD7, 0x35, 0xA3,
+0x44, 0x5D, 0x92, 0x0E, 0xC4, 0xAA, 0xA5, 0x6C, 0xD6, 0xC6, 0xD4, 0x9E, 0x96, 0x4C, 0x1F, 0x74,
+0xA3, 0x65, 0xE2, 0x5E, 0x4A, 0xF0, 0xB2, 0xD7, 0xB5, 0xBC, 0xCC, 0x0D, 0x9D, 0x19, 0x81, 0xD1,
+0xBA, 0x73, 0xD5, 0x51, 0x01, 0x68, 0xC5, 0x29, 0x7D, 0xCF, 0x5B, 0x59, 0x43, 0x17, 0x33, 0x2E,
+0x94, 0xA6, 0x83, 0x9D, 0x5C, 0xC0, 0x74, 0xB4, 0xFE, 0x48, 0x31, 0xEA, 0x11, 0xBB, 0x48, 0x22,
+0xD8, 0x09, 0xB2, 0x2F, 0x2D, 0x24, 0xFA, 0x1F, 0x9E, 0xD7, 0x92, 0x13, 0x6F, 0x8D, 0xE3, 0xCA,
+0x66, 0xD6, 0x6A, 0x69, 0x8E, 0x45, 0xEC, 0x83, 0x11, 0xA7, 0x7C, 0xAC, 0x2B, 0x53, 0x39, 0xAF,
+0x54, 0xDA, 0x5B, 0xD3, 0x50, 0x1F, 0x9B, 0x0C, 0x97, 0x1A, 0xDE, 0xA7, 0xEF, 0xC8, 0x38, 0xD0,
+0x9C, 0xA9, 0x58, 0x7A, 0x19, 0x92, 0x6F, 0xAD, 0x15, 0xCF, 0x5A, 0x1C, 0x13, 0x6D, 0x81, 0xDC,
+0xC9, 0xFA, 0x9C, 0x94, 0xBD, 0x8C, 0x53, 0x6A, 0x01, 0xA9, 0x50, 0x5B, 0x55, 0x0F, 0xC4, 0xFC,
+0x74, 0x9C, 0x71, 0xD5, 0xE1, 0x59, 0x00, 0xA4, 0xB5, 0xCE, 0x20, 0xDF, 0xBB, 0xB1, 0x2F, 0xFC,
+0xC6, 0xA7, 0x0E, 0x84, 0xCD, 0x7D, 0x5D, 0x15, 0x68, 0xCA, 0x8B, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0xB0, 0x96, 0x11, 0x28, 0xC4, 0xEE, 0x16, 0x8F, 0x6E, 0x4E, 0xEC, 0x48, 0xD4, 0x06, 0x47, 0x27,
+0xC3, 0xD5, 0xD1, 0xF1, 0x70, 0x6D, 0x64, 0x3C, 0x1C, 0x3E, 0x7B, 0x25, 0x7C, 0x00, 0x72, 0x77,
+0xF2, 0xF2, 0x50, 0xB8, 0x0E, 0xD3, 0x2B, 0xFD, 0xEA, 0x84, 0x20, 0x80, 0xA9, 0x70, 0x09, 0xE3,
+0xDA, 0x59, 0x4F, 0x89, 0x90, 0x45, 0xBC, 0x86, 0x97, 0x78, 0x37, 0xF3, 0x85, 0xD4, 0x0D, 0x69,
+0xB5, 0x6B, 0xAB, 0x52, 0xAE, 0x9A, 0x55, 0x33, 0x5B, 0x7B, 0xDD, 0x24, 0xE6, 0x6A, 0x50, 0xCE,
+0x7D, 0x48, 0xE6, 0x5A, 0x8D, 0x2C, 0xD6, 0x27, 0x76, 0xD6, 0x82, 0xD4, 0xC4, 0x05, 0x04, 0x4E,
+0x96, 0xFB, 0xCA, 0x5A, 0xAF, 0xB4, 0xC4, 0xC9, 0x5E, 0xDE, 0x17, 0xA1, 0x17, 0x5C, 0xC8, 0x9D,
+0xBC, 0x89, 0xB4, 0xC5, 0x23, 0xB5, 0xBF, 0x35, 0x92, 0x29, 0x67, 0x27, 0x75, 0xA9, 0x6F, 0x05,
+0x4B, 0x6D, 0x03, 0xFE, 0x8D, 0x9D, 0x73, 0x4A, 0x53, 0x25, 0x31, 0xB1, 0x8F, 0xD9, 0x3C, 0xAA,
+0x25, 0x51, 0xDE, 0x15, 0x25, 0x39, 0xA0, 0x77, 0xD9, 0xD8, 0x48, 0xBF, 0xD8, 0x5A, 0xBD, 0x9D,
+0xBC, 0x12, 0x0C, 0x6B, 0xE6, 0xE5, 0x02, 0x62, 0x67, 0x75, 0xD4, 0x23, 0x6C, 0x71, 0x3C, 0xD3,
+0x45, 0x4A, 0xEC, 0xF2, 0x81, 0x32, 0x88, 0x73, 0xC2, 0xEB, 0x3D, 0xCC, 0xF1, 0x8D, 0xC4, 0xAE,
+0x4E, 0x7B, 0xB4, 0xB5, 0x6C, 0x7B, 0x95, 0x9E, 0x55, 0x5E, 0x19, 0xF9, 0x97, 0x11, 0x71, 0x82,
+0x9F, 0x75, 0x58, 0xCA, 0x3A, 0x20, 0xF9, 0x3D, 0x1C, 0x98, 0x6C, 0x72, 0xD6, 0x4C, 0x89, 0x85,
+0xAE, 0x9C, 0x42, 0x30, 0x4D, 0xE5, 0xC3, 0xBD, 0xB6, 0x80, 0xD0, 0xFD, 0x1F, 0xBF, 0xFC, 0x40,
+0xD8, 0x0D, 0x82, 0x57, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xA7, 0x20, 0x50, 0x88, 0xDD,
+0x2D, 0x1A, 0xE9, 0x7A, 0x11, 0xAF, 0x34, 0xAD, 0xBE, 0x79, 0xE2, 0x7C, 0x78, 0xE9, 0xE8, 0x99,
+0x70, 0xEC, 0xE2, 0x60, 0x18, 0x81, 0xB9, 0x75, 0x7C, 0x0A, 0x7E, 0x74, 0xD3, 0x73, 0x50, 0xE8,
+0xA8, 0x8C, 0xE8, 0xA2, 0xE5, 0x64, 0x2E, 0x89, 0x41, 0xB6, 0x62, 0x9B, 0xBD, 0xAE, 0x56, 0xC8,
+0xE0, 0x55, 0x39, 0x09, 0x8B, 0x64, 0x40, 0xD6, 0x7A, 0x57, 0x5E, 0x72, 0x6D, 0xC5, 0x14, 0x1A,
+0xC3, 0x46, 0xE8, 0x48, 0x66, 0xCA, 0x92, 0xFB, 0xD6, 0x2C, 0xB8, 0x91, 0xE0, 0x60, 0x6D, 0x8D,
+0x64, 0xA8, 0x2A, 0x03, 0xDA, 0x15, 0x55, 0x12, 0xE0, 0xD5, 0x54, 0xC8, 0xA1, 0xEB, 0x4B, 0xCA,
+0x83, 0x8C, 0x3E, 0xE8, 0x1F, 0x5F, 0xDC, 0x23, 0x67, 0x71, 0x15, 0x49, 0xCA, 0x91, 0x88, 0xD5,
+0xFA, 0xD5, 0x69, 0x25, 0x95, 0xEB, 0x2A, 0xBC, 0x31, 0xA1, 0xD5, 0x62, 0xCA, 0x93, 0xD6, 0xC4,
+0xFB, 0x39, 0xB1, 0xCB, 0x2F, 0x50, 0xFA, 0xE3, 0x7A, 0x63, 0x7D, 0x62, 0x57, 0x9D, 0x54, 0xD5,
+0x36, 0x27, 0xFA, 0xE4, 0xD7, 0x8A, 0xF2, 0xC5, 0xB1, 0x80, 0x12, 0x2B, 0xEF, 0x2E, 0x70, 0x7D,
+0xAB, 0x2A, 0x9A, 0x52, 0x3B, 0x1A, 0xA8, 0xD7, 0x67, 0x74, 0xC7, 0xC8, 0x90, 0xD4, 0xE1, 0x24,
+0x8A, 0x44, 0xD1, 0xC7, 0xAB, 0xC2, 0x8C, 0xF2, 0x36, 0x56, 0xE9, 0x61, 0x3E, 0x7F, 0x74, 0xD8,
+0xF3, 0x0B, 0xEB, 0xD0, 0x3F, 0x7B, 0xBB, 0x3A, 0x83, 0x4C, 0x71, 0xCD, 0xAF, 0x8F, 0x6D, 0x4A,
+0xEF, 0xC9, 0xBD, 0xC4, 0x4E, 0xBB, 0xB0, 0x91, 0xF9, 0x0F, 0x14, 0x6D, 0xAD, 0xCF, 0x73, 0x6B,
+0x52, 0xDE, 0x14, 0x62, 0x61, 0xF3, 0xBF, 0x15, 0xFE, 0x75, 0xEC, 0xF3, 0x40, 0x77, 0x47, 0xF8,
+0x27, 0x5F, 0x7C, 0x20, 0xEC, 0xDF, 0x32, 0x10, 0xDD, 0x02, 0x8A, 0x49, 0xB6, 0x3A, 0x37, 0xCB,
+0xAB, 0x82, 0x40, 0x41, 0x60, 0xED, 0x21, 0x50, 0x88, 0xDD, 0x2D, 0x1A, 0x53, 0x27, 0x76, 0x8C,
+0x70, 0xBD, 0x3E, 0x36, 0x11, 0x46, 0xE0, 0x4F, 0x77, 0x65, 0x68, 0x34, 0xBC, 0x7E, 0xEC, 0x7C,
+0x78, 0xE5, 0xF8, 0xD9, 0x70, 0xF2, 0xCA, 0x90, 0xB4, 0xAC, 0x1D, 0xEA, 0x5C, 0x2B, 0x08, 0x07,
+0x17, 0x24, 0x2E, 0xE4, 0xB2, 0xB4, 0x71, 0x51, 0x97, 0xC5, 0xDB, 0x4D, 0x64, 0xBA, 0x28, 0xCE,
+0x63, 0x61, 0xE3, 0x5A, 0x37, 0x57, 0xB3, 0xD6, 0xAB, 0x29, 0x2D, 0x23, 0x07, 0x26, 0x7D, 0x25,
+0xBF, 0x2D, 0x7D, 0x5F, 0xD7, 0x5D, 0xA5, 0x7A, 0xAA, 0x72, 0xC5, 0x15, 0x3B, 0x11, 0x08, 0xB9,
+0x8F, 0x6B, 0x7A, 0xA6, 0xA4, 0xD9, 0xDA, 0xEF, 0xA4, 0xA4, 0xAA, 0x72, 0xB9, 0x69, 0x4E, 0x81,
+0x76, 0x8A, 0xB5, 0x80, 0x2F, 0x64, 0xFC, 0x81, 0xB5, 0x3A, 0x39, 0x51, 0xAE, 0x95, 0xB7, 0xC3,
+0x06, 0xCC, 0xB9, 0x56, 0x46, 0xEC, 0x94, 0xD7, 0x18, 0x2B, 0x72, 0xE7, 0x38, 0x21, 0x9A, 0x2C,
+0x6C, 0x66, 0x43, 0x96, 0xA9, 0x10, 0x3B, 0xAD, 0xCF, 0x09, 0x8C, 0xB7, 0x4B, 0x89, 0x1D, 0xD5,
+0x47, 0x7D, 0x9F, 0xAA, 0x54, 0xF4, 0x3D, 0xCC, 0x08, 0x95, 0x13, 0x4C, 0x2D, 0xA6, 0xED, 0xCC,
+0x8D, 0xAD, 0x6C, 0x86, 0xEB, 0x9F, 0xA9, 0x8C, 0x3E, 0x93, 0x6B, 0xA5, 0xA3, 0xC4, 0x5F, 0x4D,
+0xEC, 0x91, 0xD8, 0xD9, 0x18, 0x6B, 0x7D, 0x5A, 0x2F, 0xF9, 0x0F, 0x3E, 0xB0, 0x7A, 0x91, 0x10,
+0x7D, 0xBF, 0xA7, 0x8E, 0x99, 0x37, 0x41, 0xE6, 0x40, 0x4E, 0xEC, 0xAC, 0x5E, 0x99, 0x23, 0x5E,
+0x8E, 0xB7, 0xF5, 0x17, 0x42, 0x8A, 0xAC, 0x3D, 0x72, 0x9F, 0x1A, 0xF2, 0x96, 0x5D, 0xE4, 0x4A,
+0x66, 0xE2, 0x58, 0x8E, 0x4B, 0xAA, 0xDB, 0xE7, 0xA8, 0xB4, 0x2E, 0x9B, 0x8B, 0x7E, 0x43, 0x99,
+0x7E, 0xD6, 0x0D, 0x69, 0x83, 0xFE, 0x93, 0x3A, 0xE0, 0xE8, 0xD8, 0xFC, 0x4E, 0xBD, 0xCB, 0x88,
+0x9D, 0x54, 0x5E, 0x01, 0x49, 0xC6, 0x99, 0xF3, 0xB8, 0xAF, 0xB7, 0x53, 0xFE, 0xAE, 0xEB, 0xEE,
+0x0C, 0xFF, 0x87, 0x2F, 0x3D, 0x58, 0x88, 0x5D, 0x36, 0xE6, 0xE5, 0x69, 0x41, 0xA0, 0x20, 0xB0,
+0xF6, 0x11, 0x28, 0xC4, 0xAE, 0xC9, 0x63, 0x5C, 0x49, 0x61, 0x82, 0x05, 0xED, 0xDA, 0xF0, 0x78,
+0x78, 0xFD, 0xF8, 0xB9, 0x70, 0xEC, 0xFC, 0xD5, 0x70, 0xF8, 0xFC, 0x95, 0x70, 0x71, 0x70, 0x34,
+0x8C, 0x4C, 0x4E, 0x69, 0x50, 0x04, 0xC9, 0x15, 0xD6, 0xAE, 0x59, 0x2C, 0xCC, 0xB4, 0xC2, 0xCE,
+0xE2, 0x39, 0x17, 0xF7, 0x59, 0x2C, 0x60, 0x24, 0x01, 0xA2, 0x1B, 0xC5, 0x30, 0x45, 0x12, 0x3F,
+0xA5, 0x44, 0xC9, 0xB2, 0xA5, 0x54, 0x47, 0xCF, 0x19, 0x19, 0xE3, 0x29, 0x71, 0xE0, 0xC7, 0x39,
+0xFC, 0x55, 0xE2, 0xE2, 0xD7, 0x66, 0x2A, 0x90, 0x10, 0x49, 0x23, 0x2A, 0x62, 0x1B, 0x74, 0x72,
+0xA5, 0x84, 0x8F, 0xB7, 0x75, 0xB2, 0xE8, 0x0B, 0xB8, 0x34, 0x85, 0x45, 0x23, 0xC9, 0xD0, 0x6B,
+0xFC, 0x3C, 0x5F, 0xB5, 0x59, 0x3D, 0x42, 0xFE, 0xAC, 0xA0, 0xB4, 0xD2, 0x5E, 0xB3, 0xAD, 0x5A,
+0xB7, 0x13, 0x9F, 0xC4, 0x0C, 0xA4, 0x9C, 0x70, 0x34, 0x65, 0x66, 0x26, 0xD2, 0x69, 0x40, 0x82,
+0xF4, 0x02, 0x0F, 0x01, 0x84, 0x0D, 0x51, 0x77, 0xFD, 0x56, 0xA6, 0xBB, 0xE0, 0xFA, 0x2F, 0xFD,
+0x57, 0x36, 0x91, 0x93, 0x0D, 0xED, 0x03, 0x73, 0x9D, 0x69, 0x0D, 0x91, 0x2B, 0x79, 0xFF, 0x9C,
+0xFD, 0x78, 0x39, 0xC3, 0xB7, 0x6A, 0x90, 0x95, 0x1B, 0xC6, 0x0E, 0x31, 0x0E, 0xD6, 0x0F, 0x0F,
+0x70, 0x10, 0xEA, 0x22, 0x64, 0xCC, 0x58, 0x8D, 0x5D, 0x21, 0x37, 0x04, 0x13, 0x17, 0xF2, 0x62,
+0x3C, 0xC5, 0x83, 0x1C, 0x22, 0xD5, 0x31, 0x5F, 0x4A, 0x25, 0x4C, 0xA9, 0x0E, 0x76, 0x91, 0xF5,
+0xCD, 0xE3, 0x89, 0x97, 0x15, 0x3E, 0x27, 0xF3, 0x24, 0x11, 0x25, 0x9D, 0x2B, 0x86, 0xA9, 0xF5,
+0x87, 0x7F, 0xE4, 0xC1, 0x2A, 0xF5, 0x82, 0x74, 0xFF, 0x48, 0xEC, 0x34, 0xA2, 0x37, 0x12, 0x40,
+0xB9, 0x8F, 0xD2, 0x56, 0xF6, 0x45, 0xFD, 0x05, 0xE9, 0xA7, 0x69, 0xD7, 0x1A, 0x1F, 0x4C, 0x7D,
+0x71, 0xE2, 0xE5, 0x05, 0xB4, 0x4D, 0xEA, 0xDB, 0x99, 0xFE, 0xEA, 0x8D, 0xED, 0x21, 0xEC, 0xD3,
+0xCA, 0x5B, 0x1F, 0xB4, 0x3E, 0xBB, 0x96, 0xFD, 0xE7, 0xC3, 0xB0, 0x88, 0x9C, 0xDF, 0xCE, 0xB7,
+0xB7, 0xB7, 0x85, 0xBD, 0xDB, 0x37, 0x84, 0x0E, 0x04, 0x4C, 0x6C, 0x5F, 0xD7, 0x17, 0xFE, 0x93,
+0x2F, 0x3F, 0x14, 0x76, 0x15, 0x53, 0x6C, 0x9C, 0x8F, 0xE5, 0x49, 0x41, 0xA0, 0x20, 0xB0, 0xF6,
+0x11, 0x28, 0xC4, 0xAE, 0xC9, 0x63, 0xEC, 0xC4, 0x6E, 0x06, 0x6C, 0xED, 0xDC, 0xD5, 0xE1, 0x70,
+0x14, 0x64, 0xEE, 0xD5, 0xA3, 0x67, 0xC3, 0x89, 0x8B, 0xD7, 0xF0, 0xB8, 0x1E, 0x26, 0xC1, 0xE0,
+0xB8, 0x38, 0xB5, 0x99, 0x62, 0x46, 0x13, 0x2C, 0x39, 0x1E, 0xB3, 0x9A, 0x70, 0x2D, 0xE5, 0x83,
+0xC4, 0x8E, 0x24, 0x8F, 0x4B, 0xA3, 0x04, 0x06, 0x50, 0xA9, 0xA3, 0x88, 0x23, 0x24, 0x06, 0x8F,
+0xC8, 0xA4, 0x8C, 0xB0, 0x19, 0x31, 0x53, 0xF2, 0x24, 0xCC, 0x48, 0xD5, 0x38, 0x92, 0x15, 0xB3,
+0x07, 0x0A, 0x29, 0xE4, 0xFA, 0xC9, 0x3A, 0xF8, 0x1F, 0x5E, 0xCF, 0x45, 0x9F, 0x25, 0x54, 0x18,
+0xC3, 0x2B, 0xF5, 0x3A, 0x2A, 0x6F, 0xC6, 0xAF, 0x84, 0x51, 0x09, 0x5F, 0xD4, 0x26, 0x25, 0xC3,
+0xA7, 0xF2, 0x4A, 0xE3, 0x6F, 0x5A, 0x9E, 0x44, 0x4B, 0x28, 0x29, 0xEE, 0xA5, 0xCF, 0xF5, 0x5A,
+0x7F, 0xC2, 0x7E, 0x3B, 0x81, 0x93, 0xF7, 0xA4, 0xAD, 0x46, 0xDA, 0xE4, 0xB5, 0x11, 0x4A, 0xBB,
+0x27, 0xCB, 0xB8, 0x99, 0x58, 0x89, 0x9D, 0xBE, 0x21, 0xCA, 0x16, 0xDF, 0x33, 0x62, 0xC7, 0xF6,
+0xB7, 0x8A, 0x7C, 0x96, 0x13, 0x3B, 0x57, 0x32, 0x9D, 0xD8, 0x59, 0x5B, 0xAC, 0x6E, 0x9A, 0x66,
+0xA3, 0xFA, 0x96, 0xF5, 0x51, 0x60, 0xD4, 0xC6, 0x65, 0xB3, 0x47, 0xC0, 0x93, 0xD7, 0x73, 0x46,
+0xEC, 0x84, 0xB3, 0x39, 0x79, 0x92, 0x37, 0x40, 0x94, 0x8C, 0xFC, 0x38, 0x89, 0x53, 0x62, 0x67,
+0x44, 0xCC, 0xF8, 0x15, 0x8B, 0x2A, 0xE9, 0xD2, 0x3E, 0xF0, 0xC5, 0x9C, 0xFB, 0x2D, 0x3A, 0xA9,
+0xE1, 0xBB, 0x46, 0xEE, 0xE7, 0xC1, 0xDC, 0xAA, 0x54, 0x88, 0x97, 0xE8, 0x8D, 0xE5, 0xBC, 0xD5,
+0x2B, 0xB7, 0xB6, 0xEB, 0xE5, 0x6D, 0x21, 0x86, 0x7A, 0x9F, 0xC8, 0xAB, 0x62, 0x59, 0x39, 0x2B,
+0xF7, 0xB5, 0x56, 0x28, 0x81, 0x94, 0x3A, 0x71, 0x8E, 0x24, 0x55, 0x48, 0xAE, 0x9D, 0xE3, 0x79,
+0xEB, 0x4B, 0x4E, 0xEC, 0xB4, 0x1D, 0x46, 0x07, 0x23, 0x43, 0xE4, 0x35, 0xA6, 0xF4, 0x89, 0xB4,
+0xA8, 0xCC, 0x93, 0xF5, 0xCB, 0x08, 0x64, 0xE5, 0xA4, 0xEF, 0x32, 0x5F, 0x6A, 0x89, 0x9D, 0x7D,
+0x18, 0x4C, 0x1E, 0x46, 0x33, 0xA4, 0x6F, 0x3D, 0x30, 0xBF, 0x1E, 0xD8, 0xB5, 0x31, 0x74, 0x75,
+0xB6, 0x23, 0x22, 0x76, 0x63, 0xF8, 0x07, 0x9F, 0xBF, 0x3F, 0x6C, 0x19, 0xE8, 0xC9, 0xC6, 0xA9,
+0x3C, 0x2D, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x6B, 0x1B, 0x81, 0x05, 0xDE, 0x3C, 0x6B, 0xBB, 0xBB,
+0xB7, 0xB6, 0x77, 0x9E, 0x05, 0x9F, 0x64, 0x65, 0x1C, 0xA9, 0x4B, 0x7E, 0xF2, 0xC1, 0xC9, 0xF0,
+0xC7, 0x3F, 0x79, 0x37, 0xBC, 0x02, 0x9F, 0xBA, 0x33, 0x57, 0x87, 0x84, 0x10, 0x74, 0x88, 0x9A,
+0xC6, 0x9C, 0x75, 0x73, 0x48, 0x77, 0x32, 0x8B, 0xC7, 0x5C, 0x18, 0x9D, 0x9A, 0x0B, 0x53, 0x60,
+0x72, 0x24, 0x79, 0x0C, 0xB0, 0x48, 0xF5, 0x28, 0x21, 0x21, 0xFF, 0x4A, 0x84, 0xC7, 0x08, 0x97,
+0x29, 0x53, 0xAC, 0xCE, 0xB8, 0x9C, 0x98, 0xFB, 0xA4, 0x1C, 0xD6, 0x44, 0x21, 0x59, 0xCA, 0xD1,
+0xB2, 0xE7, 0xC8, 0xDD, 0x16, 0x49, 0x0D, 0xCF, 0x33, 0x97, 0x1B, 0xAF, 0xD1, 0xF3, 0xF2, 0xB0,
+0xD7, 0x52, 0x17, 0x17, 0x6C, 0xA9, 0xD3, 0xEA, 0x95, 0xF7, 0x84, 0x89, 0xD8, 0x35, 0xE9, 0x3A,
+0x55, 0xC5, 0xEC, 0x1A, 0xE3, 0x44, 0x72, 0xBD, 0x2F, 0xFA, 0xF6, 0x9E, 0xD0, 0x0C, 0x23, 0x1F,
+0x4A, 0x1C, 0xA3, 0x46, 0x14, 0x55, 0x1D, 0x3F, 0x17, 0x29, 0x87, 0xD5, 0x21, 0xF5, 0x53, 0x63,
+0x02, 0x41, 0xE0, 0x73, 0x15, 0x9E, 0xF8, 0xD7, 0x7C, 0xE5, 0x04, 0x5A, 0x23, 0x1A, 0x72, 0x5A,
+0xEF, 0x15, 0x59, 0x8D, 0xD7, 0x23, 0x7F, 0x9D, 0x5D, 0x19, 0xA9, 0x90, 0xB6, 0x5A, 0x75, 0xD2,
+0xC3, 0x54, 0x57, 0x22, 0x51, 0x4A, 0x86, 0x84, 0x60, 0xFA, 0xAD, 0xAD, 0xFD, 0x6A, 0x42, 0xD5,
+0x93, 0x39, 0x16, 0x7C, 0x1D, 0x15, 0x28, 0xC7, 0x2E, 0x6F, 0x87, 0x93, 0x9C, 0x0C, 0x6F, 0xA9,
+0xC3, 0xDA, 0x18, 0xF1, 0xB1, 0x9B, 0xFA, 0x78, 0x46, 0x15, 0xD2, 0xC6, 0x5A, 0xC6, 0xC5, 0x79,
+0xA8, 0x8C, 0x9B, 0x8F, 0xBD, 0xF6, 0x2B, 0xBD, 0xAE, 0xCE, 0x09, 0x7E, 0x41, 0xF8, 0x3C, 0xD1,
+0xB9, 0xA1, 0xFE, 0x9A, 0x24, 0xD0, 0xAD, 0x32, 0xEE, 0x46, 0x8E, 0xF1, 0x97, 0xA4, 0x3C, 0x9E,
+0xC3, 0xFB, 0xFA, 0x5A, 0xFF, 0x7A, 0x39, 0x7F, 0xED, 0xEF, 0xB1, 0x1E, 0x3E, 0xA7, 0x92, 0x2B,
+0x65, 0xF8, 0x3A, 0x3B, 0x57, 0x79, 0xEE, 0xEF, 0x23, 0xFB, 0xB0, 0x9C, 0xE7, 0x5F, 0xAF, 0x9F,
+0xCF, 0xE1, 0x5B, 0xD7, 0xD3, 0xD5, 0x2E, 0x1F, 0x72, 0xB6, 0x7B, 0xD7, 0xFA, 0xDE, 0xD0, 0x89,
+0x1F, 0x49, 0x65, 0x8F, 0xE5, 0x5B, 0xFB, 0xBD, 0x57, 0xEE, 0x5E, 0x10, 0x28, 0x08, 0x34, 0x17,
+0x81, 0x42, 0xEC, 0x9A, 0x8B, 0x37, 0xD4, 0xB7, 0xB9, 0x70, 0xE1, 0xDA, 0x30, 0x82, 0x24, 0xCE,
+0xC1, 0x9F, 0xEE, 0x4C, 0x78, 0xFF, 0xF4, 0x85, 0x70, 0xE1, 0xFA, 0xB0, 0x04, 0x4A, 0x30, 0x09,
+0x31, 0x1F, 0xF4, 0xBB, 0x9B, 0x9C, 0x99, 0x87, 0x39, 0x96, 0x3B, 0x4C, 0xA8, 0x62, 0x47, 0x73,
+0x9A, 0x2B, 0x76, 0x6C, 0xB2, 0x92, 0x9E, 0x6C, 0x35, 0xCF, 0xFA, 0xE1, 0x6B, 0x78, 0xBE, 0x96,
+0xCB, 0x35, 0xFE, 0x70, 0xF2, 0x96, 0x9F, 0xB3, 0xEB, 0x7D, 0xED, 0xCF, 0xCB, 0x0B, 0x31, 0x8A,
+0x84, 0x25, 0x11, 0x97, 0x74, 0x1F, 0xD3, 0x74, 0xF2, 0x8B, 0xA5, 0x6E, 0x23, 0x48, 0x91, 0x53,
+0x18, 0x89, 0xA8, 0x69, 0xAB, 0xBF, 0x4C, 0xED, 0x4D, 0xD7, 0x2D, 0x68, 0x77, 0xE5, 0x1E, 0xD5,
+0x72, 0xB5, 0x43, 0x99, 0x8A, 0x1A, 0x23, 0xCB, 0xDA, 0x11, 0x65, 0xA8, 0x28, 0x9D, 0x91, 0x74,
+0x59, 0x0D, 0xFE, 0x57, 0x94, 0x22, 0x3D, 0x97, 0xFB, 0xCD, 0x2D, 0x3E, 0x65, 0x5C, 0x37, 0xAB,
+0xAD, 0x27, 0xD5, 0x5D, 0x69, 0xBE, 0xBD, 0xE0, 0x55, 0xD5, 0xB6, 0x66, 0x77, 0x70, 0x92, 0x5B,
+0xB9, 0x69, 0x0D, 0xD0, 0x69, 0x26, 0xC4, 0x31, 0xAE, 0x87, 0x85, 0xE0, 0xEB, 0x84, 0xAE, 0x66,
+0xEC, 0xE3, 0x7B, 0x56, 0xC6, 0x7B, 0xED, 0xAA, 0xEC, 0x82, 0xB9, 0x23, 0x73, 0xC8, 0x54, 0x34,
+0x14, 0x16, 0xF3, 0xB9, 0x3C, 0x4C, 0x99, 0x8D, 0xC4, 0xD1, 0xCE, 0xE3, 0x75, 0xFA, 0xD1, 0x90,
+0x54, 0xD9, 0x8A, 0x02, 0x9B, 0x5F, 0x23, 0xCF, 0x5D, 0x51, 0x75, 0x75, 0x38, 0x11, 0xC4, 0x9C,
+0x50, 0x7A, 0xDB, 0xA8, 0xCE, 0x76, 0x75, 0xB4, 0x43, 0x4D, 0x54, 0x62, 0xBF, 0x03, 0xC4, 0xAE,
+0x03, 0x64, 0xAF, 0x1C, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x4E, 0x42, 0xA0, 0x7C, 0xEB, 0x35,
+0x61, 0xB4, 0x45, 0x91, 0x11, 0x95, 0xA4, 0x05, 0x64, 0x0D, 0x91, 0xAF, 0xF0, 0xA9, 0xFB, 0xC3,
+0xE7, 0xDF, 0x02, 0xA9, 0xBB, 0x24, 0x0A, 0x4E, 0x87, 0x58, 0x3A, 0x41, 0xE0, 0x40, 0xE4, 0xC6,
+0xA6, 0xE6, 0x11, 0x09, 0x0B, 0x72, 0x07, 0x42, 0x27, 0x39, 0xE6, 0x32, 0xB5, 0xC3, 0x17, 0x41,
+0x59, 0x9D, 0x85, 0x0D, 0xF8, 0x92, 0xA6, 0x92, 0x8B, 0x2B, 0x2F, 0xFA, 0x5E, 0xEA, 0x58, 0xE4,
+0x29, 0xC6, 0x2F, 0xC4, 0xFC, 0x96, 0x71, 0x31, 0x16, 0xF5, 0x4B, 0x5C, 0x71, 0x52, 0x32, 0xB3,
+0xFC, 0x21, 0xD7, 0xB9, 0x53, 0x98, 0xCA, 0x75, 0x49, 0x18, 0xE2, 0x0B, 0x95, 0xB6, 0x8C, 0x88,
+0x3A, 0x5D, 0x48, 0x37, 0xD4, 0x4B, 0x49, 0xD0, 0xF4, 0xBF, 0xCA, 0xF5, 0xDE, 0x46, 0x13, 0xBB,
+0x54, 0x19, 0xCC, 0x7C, 0xBE, 0xE4, 0xDE, 0x0A, 0x83, 0x08, 0x6F, 0x15, 0xBD, 0xCC, 0x4C, 0xCB,
+0x06, 0x95, 0xBE, 0x6B, 0x65, 0xE5, 0x2E, 0x39, 0x09, 0xB3, 0xF7, 0xE4, 0xAC, 0x99, 0x18, 0x6B,
+0xFA, 0x6F, 0xCD, 0x8C, 0xF7, 0x72, 0x82, 0x64, 0x43, 0xE4, 0xC2, 0xA0, 0xB6, 0x27, 0xC3, 0x53,
+0xE9, 0x8F, 0x76, 0x44, 0xEF, 0xAF, 0x7D, 0x14, 0x15, 0x29, 0x02, 0x9C, 0x29, 0x84, 0x76, 0x32,
+0x1F, 0x33, 0xC5, 0xC7, 0x79, 0x27, 0xE7, 0x84, 0xBD, 0x2B, 0x7D, 0x4E, 0x88, 0xE5, 0x44, 0xDA,
+0x03, 0x6D, 0xF4, 0x3A, 0xAF, 0xDF, 0xF0, 0x17, 0x52, 0x96, 0x5F, 0x6B, 0xFD, 0xB7, 0x49, 0xA0,
+0xD5, 0xBB, 0xB9, 0xDE, 0xFD, 0xE1, 0x4C, 0xAD, 0xB4, 0x0B, 0xA5, 0xE9, 0xD2, 0x14, 0x23, 0xFA,
+0x11, 0x67, 0x35, 0xB1, 0x7A, 0x13, 0xF5, 0x8E, 0x76, 0x5F, 0xAB, 0x55, 0xEA, 0x46, 0x01, 0x85,
+0x40, 0x71, 0x88, 0x66, 0xE7, 0xBC, 0x70, 0x05, 0x84, 0x54, 0x87, 0x8B, 0xAC, 0xD5, 0x31, 0x24,
+0xB6, 0xF3, 0x50, 0xE8, 0xE8, 0x7F, 0x3A, 0x27, 0xBE, 0xA3, 0x3B, 0x36, 0xF4, 0xE1, 0x75, 0xF9,
+0x8A, 0xCB, 0xC7, 0xA0, 0x3C, 0x2F, 0x08, 0x14, 0x04, 0xD6, 0x3E, 0x02, 0xE5, 0x5B, 0xAF, 0x89,
+0x63, 0x3C, 0x81, 0xD4, 0x25, 0x87, 0x41, 0xE6, 0x5E, 0x3B, 0x76, 0x3A, 0xBC, 0x7B, 0xF2, 0x3C,
+0x92, 0x0E, 0x8F, 0xCA, 0x02, 0x2F, 0x01, 0x11, 0x54, 0xEA, 0x40, 0xE6, 0x68, 0x72, 0x9D, 0x16,
+0x85, 0x2E, 0x2D, 0xA8, 0x75, 0x09, 0x56, 0x9D, 0x45, 0x6F, 0xA9, 0xAE, 0x38, 0x65, 0xF2, 0xCB,
+0x16, 0x27, 0x6D, 0xBA, 0xEA, 0xA7, 0xEA, 0x9D, 0x3C, 0x2E, 0x7E, 0x85, 0x92, 0xC4, 0x9C, 0x62,
+0xE4, 0xAB, 0x73, 0x4D, 0xAB, 0x16, 0x21, 0x9C, 0xB5, 0x6D, 0x5F, 0x8A, 0x54, 0xD6, 0x7B, 0x4F,
+0x5B, 0xE9, 0xD4, 0xB0, 0x5A, 0x9B, 0x9E, 0x4D, 0xE4, 0x2A, 0xA7, 0xAC, 0x5E, 0x57, 0x5E, 0xA7,
+0xF7, 0x58, 0x6A, 0x89, 0x6F, 0x24, 0xDF, 0xBC, 0xDA, 0xB2, 0x52, 0xAC, 0x06, 0x26, 0x27, 0x3E,
+0xB1, 0x0A, 0x23, 0x53, 0xF5, 0xC6, 0xC8, 0xB8, 0x5E, 0xBA, 0x5D, 0xCD, 0x0D, 0x9C, 0x0C, 0xA6,
+0x72, 0xCE, 0xC0, 0x16, 0x27, 0xDF, 0x11, 0x89, 0xBC, 0x21, 0x71, 0x50, 0x6B, 0x10, 0xF4, 0x97,
+0xFE, 0xBE, 0x13, 0xEA, 0xAC, 0xB1, 0x8B, 0x4F, 0xB7, 0xFA, 0x23, 0x95, 0xFF, 0x70, 0x58, 0xD8,
+0x67, 0xA5, 0x71, 0x79, 0x9D, 0x4B, 0x4E, 0xE7, 0xDA, 0x41, 0xAA, 0xF4, 0xC3, 0xDE, 0xC4, 0x1F,
+0x9A, 0x67, 0xD5, 0x93, 0x61, 0x2E, 0xF4, 0xC3, 0x24, 0xBB, 0x1E, 0xD1, 0xB1, 0x6D, 0x1E, 0x4C,
+0xD3, 0xC4, 0xCF, 0x79, 0xB9, 0x55, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8, 0x95, 0x08, 0x14, 0x62,
+0xB7, 0x8A, 0xE8, 0xE7, 0x4A, 0x1D, 0x6F, 0x73, 0x6D, 0x78, 0x2C, 0x7C, 0xE7, 0xD5, 0x0F, 0xC2,
+0xCB, 0x1F, 0x9E, 0x0A, 0x33, 0x60, 0x6F, 0x6D, 0x50, 0x18, 0xE0, 0x4A, 0x17, 0xC6, 0xA7, 0x5B,
+0xC2, 0xD8, 0x4C, 0x0B, 0x02, 0x27, 0xA0, 0x36, 0x88, 0x53, 0x79, 0x0A, 0x4C, 0xA8, 0x90, 0x0C,
+0x6B, 0x6B, 0xCD, 0xFA, 0xAB, 0x74, 0xC6, 0x54, 0x31, 0x59, 0x50, 0x13, 0x8F, 0xA9, 0x21, 0x5C,
+0x49, 0x4D, 0x71, 0xD1, 0xAF, 0xBA, 0xC0, 0x1A, 0x05, 0x72, 0x9F, 0xB4, 0x48, 0x35, 0x16, 0x2E,
+0xDE, 0xBE, 0x70, 0xE7, 0x0B, 0xB2, 0xAB, 0x37, 0xAE, 0xBE, 0x48, 0x6D, 0x6C, 0x9A, 0xDF, 0xAC,
+0x42, 0x94, 0xAA, 0xF4, 0x2A, 0x37, 0x75, 0x6A, 0xD4, 0x6B, 0xAE, 0x68, 0x59, 0x37, 0x4C, 0x19,
+0xCC, 0x5B, 0x13, 0x95, 0x1F, 0x69, 0x73, 0x34, 0x4E, 0x4B, 0xCB, 0x25, 0xDA, 0x53, 0xAA, 0x51,
+0x14, 0x9D, 0xDA, 0xA5, 0x52, 0x55, 0x22, 0xE8, 0xD0, 0x39, 0xE6, 0xA2, 0x0C, 0x45, 0x09, 0x4E,
+0xC7, 0x24, 0x87, 0x57, 0xCA, 0xB9, 0xBF, 0x9B, 0x5D, 0x94, 0x14, 0x48, 0x1D, 0x07, 0xC7, 0x49,
+0xD5, 0xAD, 0x34, 0xD9, 0xBC, 0x8B, 0x4A, 0x0A, 0xB5, 0x62, 0x0D, 0x60, 0xD1, 0x7E, 0x4B, 0x59,
+0xC3, 0x4E, 0x15, 0x49, 0x3D, 0xAF, 0x1C, 0xDA, 0x71, 0xCD, 0xC9, 0xAA, 0xD6, 0x9D, 0x88, 0xBB,
+0xD7, 0xA5, 0x18, 0xE4, 0xEF, 0xB8, 0x8A, 0xA8, 0x38, 0xB2, 0xDE, 0xEA, 0xF8, 0xE6, 0xAA, 0xED,
+0x92, 0x84, 0xCB, 0xD2, 0x91, 0x48, 0x2D, 0xA6, 0xDC, 0x39, 0x42, 0xA9, 0x1D, 0xDA, 0x2E, 0x9F,
+0x92, 0xEE, 0x31, 0x69, 0x72, 0x9D, 0x8E, 0x4B, 0x1C, 0xA3, 0x84, 0x4F, 0x0E, 0x74, 0x6C, 0x5E,
+0xE2, 0x70, 0xEA, 0x43, 0x59, 0x73, 0xB4, 0xC3, 0xCF, 0x0E, 0x61, 0x45, 0x30, 0x0B, 0xCF, 0x85,
+0xAD, 0xFD, 0xDD, 0x50, 0xC2, 0x99, 0xCF, 0x4E, 0x55, 0xDE, 0x72, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x3B, 0x05, 0x81, 0x42, 0xEC, 0x9A, 0x30, 0xD2, 0x34, 0x0D, 0x5D, 0x19, 0x1E, 0x85, 0x09,
+0xF6, 0x2C, 0x1E, 0x67, 0x10, 0x0D, 0x3B, 0x08, 0x85, 0x4E, 0x23, 0x03, 0x99, 0xCA, 0x84, 0x11,
+0xAF, 0xEE, 0x47, 0x97, 0x96, 0x2B, 0x5D, 0xBC, 0xE3, 0xAA, 0x98, 0xB5, 0x53, 0x4E, 0x67, 0x6F,
+0xE7, 0x5D, 0xD0, 0x4B, 0xF2, 0x85, 0x2C, 0x7B, 0xEE, 0x4F, 0xEB, 0xAC, 0xD6, 0x8B, 0x5C, 0xB1,
+0x28, 0x3A, 0x51, 0xA1, 0xE2, 0xA2, 0x2E, 0x6D, 0x59, 0x66, 0xF1, 0xF4, 0x46, 0xDF, 0x08, 0xDE,
+0xCE, 0xB4, 0x16, 0x5C, 0x5B, 0x73, 0xCF, 0x3A, 0x4D, 0x68, 0xA8, 0x5F, 0x8E, 0x65, 0x1D, 0xBC,
+0xE3, 0xF5, 0x19, 0xA9, 0xA8, 0x60, 0x9F, 0x3B, 0xAD, 0x39, 0xF2, 0x39, 0xE4, 0x8B, 0x62, 0xE3,
+0x2C, 0x6D, 0x69, 0x40, 0x16, 0x8E, 0xE7, 0xC2, 0xD1, 0xCD, 0xFB, 0xD8, 0x90, 0xF2, 0xC5, 0x31,
+0x8B, 0xB7, 0x5D, 0xF2, 0x8A, 0x58, 0xAA, 0x61, 0x6A, 0x54, 0xAF, 0xE0, 0x82, 0x61, 0x52, 0xD3,
+0xBB, 0x1F, 0x37, 0x1E, 0xDC, 0x60, 0x13, 0x03, 0x63, 0xC0, 0xF8, 0xE5, 0x76, 0xC8, 0x75, 0xE2,
+0x5F, 0x87, 0x8A, 0x77, 0xC2, 0x0C, 0xDB, 0x81, 0xC0, 0x89, 0x72, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x3B, 0x0D, 0x81, 0x42, 0xEC, 0x56, 0x69, 0xC4, 0xF3, 0x08, 0xD8, 0x69, 0xB0, 0xB7, 0x23,
+0x67, 0x2E, 0x85, 0xBF, 0x78, 0xF1, 0xED, 0x70, 0xFE, 0xDA, 0x90, 0x44, 0x96, 0x52, 0xA5, 0x98,
+0x82, 0x42, 0x37, 0x8D, 0x87, 0xA6, 0x7E, 0x30, 0x35, 0x2D, 0x63, 0x12, 0xAE, 0x38, 0xC5, 0xBC,
+0x74, 0x26, 0xAF, 0xC9, 0x72, 0x46, 0xC2, 0x20, 0x62, 0x8C, 0xA9, 0x36, 0x3C, 0x19, 0xC5, 0x17,
+0x7B, 0x91, 0x2D, 0xDE, 0x52, 0xCA, 0x09, 0x8C, 0x2D, 0xEC, 0x8B, 0x94, 0x12, 0xE5, 0x2B, 0xE5,
+0xC2, 0xE3, 0x85, 0xB9, 0xD4, 0x64, 0x62, 0x9A, 0x93, 0x2D, 0x51, 0x96, 0x54, 0x2D, 0x63, 0xA3,
+0x54, 0x68, 0xD2, 0x4E, 0x44, 0xE5, 0x2E, 0x2F, 0x53, 0x17, 0xEF, 0x5C, 0x23, 0xF2, 0xEB, 0x0C,
+0x08, 0x97, 0xC8, 0xE4, 0x7E, 0xFA, 0x42, 0x61, 0xB0, 0x3B, 0x65, 0xAA, 0x91, 0x2A, 0x5A, 0xFA,
+0x5F, 0x8A, 0x3E, 0xF5, 0x96, 0x78, 0xD0, 0x47, 0xF2, 0x79, 0xF3, 0xA6, 0xB8, 0xDF, 0x9E, 0x90,
+0x55, 0xBF, 0x9F, 0x0A, 0x64, 0x72, 0xC8, 0x69, 0x27, 0x76, 0xAC, 0xDA, 0x70, 0xCC, 0xC7, 0x58,
+0x9E, 0xF3, 0x1A, 0x79, 0x5F, 0x49, 0x9B, 0x54, 0x25, 0xD7, 0xA9, 0x7A, 0x96, 0x54, 0x52, 0xF7,
+0x86, 0xCB, 0x83, 0x3F, 0xAA, 0x04, 0xCB, 0x71, 0x94, 0x59, 0xE1, 0xAA, 0x93, 0x15, 0xC9, 0xDB,
+0xE5, 0xED, 0xF3, 0x51, 0xF2, 0x2E, 0x54, 0x7E, 0x20, 0x78, 0x2F, 0xE4, 0x42, 0xC5, 0xA6, 0x4A,
+0x0F, 0x6B, 0x07, 0x25, 0xAF, 0x25, 0x19, 0xB2, 0x17, 0x72, 0xB6, 0xFC, 0x2E, 0xA6, 0x88, 0x1A,
+0x88, 0x5E, 0x56, 0x55, 0xCF, 0x84, 0x63, 0x84, 0xD8, 0x7C, 0x42, 0x0D, 0x9D, 0xEA, 0x1C, 0xAB,
+0x69, 0x8E, 0x8C, 0x77, 0xEE, 0x18, 0x6A, 0xEF, 0x7B, 0x37, 0x1C, 0x45, 0x46, 0x94, 0xAB, 0x7F,
+0xDD, 0x7C, 0xD8, 0xB7, 0x79, 0x00, 0x81, 0x14, 0x85, 0xD8, 0xD5, 0xFD, 0xB8, 0x95, 0x93, 0x05,
+0x81, 0x82, 0xC0, 0x9A, 0x46, 0xA0, 0x10, 0xBB, 0x55, 0x1E, 0xDE, 0xA9, 0xE9, 0x99, 0x70, 0xF6,
+0xF2, 0xF5, 0xF0, 0xDA, 0xE1, 0x53, 0xF0, 0xAB, 0x3B, 0x17, 0x46, 0x27, 0x26, 0xE4, 0x8E, 0x92,
+0x8B, 0x6E, 0x0E, 0x46, 0xA3, 0x2A, 0x83, 0x5A, 0xBA, 0x35, 0x75, 0xC4, 0x95, 0xCA, 0x62, 0x5B,
+0x79, 0xDF, 0x99, 0x97, 0x13, 0xA1, 0x46, 0x3B, 0xBA, 0xF0, 0x26, 0x4E, 0xD3, 0x16, 0xAB, 0x61,
+0xC1, 0x82, 0x1F, 0x39, 0x59, 0x9D, 0x06, 0x5B, 0x25, 0x0B, 0x49, 0xC2, 0xC2, 0xDA, 0x1B, 0x29,
+0x53, 0xBD, 0x2A, 0x0B, 0x53, 0xA8, 0x90, 0x97, 0xAA, 0x39, 0xCE, 0x1D, 0xF6, 0xF3, 0x6B, 0x17,
+0x10, 0xA1, 0x78, 0x73, 0x7D, 0x92, 0xB7, 0x25, 0x12, 0xAB, 0xCC, 0xC4, 0x67, 0xFC, 0x6D, 0x51,
+0x25, 0x35, 0xBF, 0x97, 0x8F, 0xCC, 0x42, 0x91, 0x73, 0x71, 0xBC, 0x84, 0x92, 0xF9, 0xDB, 0x8B,
+0x02, 0x53, 0xF3, 0x46, 0x6C, 0x5F, 0x4D, 0xBD, 0x46, 0x4C, 0x13, 0xDD, 0x5A, 0x6C, 0x50, 0x96,
+0x6E, 0xCF, 0x92, 0x33, 0x6A, 0x89, 0xC1, 0x8B, 0xB5, 0x56, 0xFA, 0xB3, 0xF2, 0xD1, 0x8E, 0xF7,
+0x67, 0x7F, 0xF0, 0x4D, 0x46, 0xD7, 0x06, 0x86, 0x8F, 0x77, 0x21, 0x60, 0x62, 0xCB, 0x40, 0x89,
+0x88, 0x6D, 0xF4, 0x13, 0x5F, 0xCA, 0x15, 0x04, 0x0A, 0x02, 0x6B, 0x0B, 0x81, 0x42, 0xEC, 0x56,
+0x61, 0x3C, 0x73, 0xBF, 0x9E, 0x61, 0x6C, 0x17, 0xF6, 0xDA, 0x91, 0x53, 0xE1, 0x87, 0x6F, 0x1D,
+0x41, 0xEE, 0xBA, 0x29, 0x51, 0x74, 0x48, 0xEA, 0x66, 0x90, 0xCC, 0x76, 0x4E, 0x14, 0xAE, 0x85,
+0x8E, 0xE4, 0xDE, 0xA4, 0xA8, 0x6E, 0x54, 0xD6, 0x57, 0xD1, 0x2F, 0x2A, 0xBE, 0x54, 0x4B, 0x12,
+0x94, 0x28, 0x41, 0x55, 0x4B, 0xC5, 0xBA, 0xB3, 0xD3, 0x7A, 0xCE, 0xD4, 0x3A, 0xBB, 0xE7, 0x02,
+0x6D, 0xC7, 0x14, 0x98, 0xDC, 0x39, 0x5E, 0xAE, 0x93, 0x7F, 0x2C, 0x7A, 0xD3, 0x98, 0x4B, 0x0C,
+0xDE, 0xF4, 0x02, 0x22, 0x67, 0x69, 0xC5, 0x7E, 0xFF, 0x7A, 0x6D, 0x8F, 0xC4, 0x49, 0xDA, 0x93,
+0x1D, 0x92, 0x2C, 0x77, 0x91, 0x14, 0x27, 0x1E, 0x06, 0x5A, 0xA1, 0x61, 0x91, 0x61, 0x6A, 0x34,
+0xAD, 0xB0, 0xA3, 0x4C, 0x81, 0xF3, 0xB7, 0xA3, 0xFF, 0x5A, 0xD6, 0x5B, 0xE9, 0x83, 0xBF, 0xAE,
+0x86, 0x5F, 0x68, 0x57, 0x2D, 0x87, 0x9B, 0x75, 0xC9, 0x4D, 0xD3, 0x1E, 0x25, 0x5B, 0x21, 0x6D,
+0x0B, 0x30, 0xA3, 0xBA, 0x87, 0x9E, 0x64, 0xBE, 0x87, 0x4B, 0x51, 0x28, 0xF5, 0x11, 0xCB, 0xFA,
+0x9D, 0xBA, 0x65, 0xEA, 0xA5, 0x22, 0xAA, 0x9A, 0xAF, 0x29, 0x93, 0xEC, 0xA7, 0xCD, 0xAF, 0x0A,
+0x2D, 0x95, 0x73, 0xE6, 0x7F, 0x97, 0x8F, 0x44, 0x65, 0xA0, 0x75, 0x8E, 0xF9, 0x21, 0x7D, 0x12,
+0x8C, 0xAA, 0xE4, 0xAB, 0xAA, 0x37, 0x66, 0xE5, 0xAD, 0xBF, 0x3E, 0xCE, 0x7E, 0x95, 0xD7, 0x5A,
+0x3B, 0xF7, 0x44, 0x99, 0xAE, 0x8C, 0x9B, 0xBE, 0xCA, 0x5B, 0xA1, 0x79, 0x09, 0xD3, 0xFD, 0xA5,
+0xB9, 0x78, 0x29, 0xD3, 0x09, 0xFF, 0xE8, 0x6E, 0x25, 0x54, 0xC2, 0x19, 0x38, 0xD1, 0x11, 0xFA,
+0xB0, 0x9D, 0x98, 0x6F, 0xC5, 0x97, 0x4F, 0xA1, 0xF2, 0xBC, 0x20, 0x50, 0x10, 0x28, 0x08, 0xAC,
+0x75, 0x04, 0x0A, 0xB1, 0x5B, 0xA5, 0x11, 0x9E, 0x86, 0xD3, 0xDC, 0xB9, 0x2B, 0xD7, 0xC3, 0x07,
+0xA7, 0xCE, 0x87, 0x37, 0x40, 0xEC, 0x8E, 0x9F, 0xBF, 0x0C, 0x3F, 0x3A, 0x84, 0xBB, 0xD2, 0xBD,
+0x7B, 0xBE, 0x0D, 0x4A, 0xDD, 0xC2, 0x4D, 0xA9, 0x62, 0x53, 0x6A, 0xE5, 0xA1, 0x05, 0xCA, 0xC6,
+0x22, 0xEA, 0x06, 0x17, 0xBA, 0x3A, 0xFD, 0x89, 0x0A, 0x91, 0x2F, 0x9E, 0x75, 0x9C, 0xC9, 0x13,
+0xDD, 0xAA, 0xB7, 0xC4, 0xFA, 0x12, 0x9D, 0x2A, 0x8F, 0xEA, 0x51, 0xA4, 0x00, 0x5C, 0xCD, 0x97,
+0x03, 0x73, 0xE9, 0x32, 0xE9, 0xF2, 0xE5, 0xD5, 0x9B, 0x65, 0x4B, 0x2C, 0x59, 0x60, 0xE1, 0x9B,
+0x55, 0x8C, 0x52, 0x3F, 0x16, 0x94, 0xB4, 0x13, 0x62, 0x0A, 0x37, 0x58, 0xF4, 0x79, 0x35, 0x70,
+0xA3, 0x82, 0x84, 0x95, 0x5D, 0x4A, 0x9C, 0xD5, 0x6A, 0xB3, 0xBB, 0xD5, 0x6B, 0xFF, 0xB2, 0x9D,
+0x5E, 0xDA, 0xC0, 0xBA, 0xDC, 0xE8, 0x54, 0xE7, 0xDF, 0x62, 0x88, 0xD4, 0xD6, 0x92, 0x00, 0x69,
+0xF4, 0x8A, 0x45, 0x6A, 0x68, 0xB8, 0x79, 0x09, 0x26, 0xA5, 0x7E, 0xA4, 0xAA, 0x88, 0x9B, 0x10,
+0xFF, 0x3A, 0x1E, 0x5B, 0xD7, 0xF5, 0x4A, 0xA2, 0xE2, 0x12, 0x33, 0xD1, 0x38, 0xA4, 0xA5, 0x64,
+0x41, 0xA0, 0x20, 0xB0, 0x76, 0x10, 0x28, 0xC4, 0xEE, 0x26, 0x8F, 0xA5, 0x2B, 0x39, 0xA3, 0x13,
+0x93, 0xE1, 0x95, 0x0F, 0x3E, 0x0A, 0xDF, 0x7B, 0xED, 0x03, 0x28, 0x76, 0xA7, 0x65, 0x0B, 0xA6,
+0x56, 0xAC, 0xEC, 0x73, 0x2D, 0x1D, 0x78, 0xC0, 0xF7, 0x47, 0x54, 0x10, 0x55, 0x55, 0x16, 0x2C,
+0x88, 0x99, 0xC4, 0x21, 0xEA, 0x86, 0xBF, 0xF6, 0x82, 0xA2, 0x3A, 0xA9, 0xF4, 0x94, 0xB6, 0x6C,
+0x72, 0xF6, 0xE0, 0x1D, 0x4A, 0x6C, 0x30, 0xCF, 0x6F, 0xA6, 0x0E, 0x62, 0xE6, 0xB7, 0x65, 0x54,
+0x22, 0xF1, 0x05, 0xB9, 0x5B, 0x6C, 0x8F, 0x8B, 0x38, 0xB5, 0x9E, 0x60, 0xB1, 0xBC, 0x29, 0x5D,
+0x39, 0x84, 0x75, 0x89, 0x65, 0x45, 0x0D, 0xAA, 0xCF, 0x4E, 0x12, 0x06, 0xA6, 0xCC, 0x18, 0x07,
+0xD4, 0x16, 0xD9, 0x21, 0x8A, 0x8C, 0x2A, 0x8A, 0x7E, 0x3E, 0x6A, 0x97, 0x59, 0x6E, 0xB7, 0x24,
+0xCB, 0xE9, 0x75, 0xF9, 0xFE, 0xAC, 0xE6, 0x04, 0xA7, 0xE7, 0xF9, 0xF0, 0x31, 0x10, 0x38, 0x33,
+0xFF, 0x3B, 0xBE, 0xAE, 0xED, 0x4C, 0x94, 0x89, 0xB4, 0x4E, 0x8F, 0x54, 0x55, 0x41, 0xCD, 0xA9,
+0xD9, 0xC2, 0x86, 0x5B, 0x30, 0x6F, 0xC6, 0xBA, 0xB4, 0xB7, 0x95, 0x71, 0x31, 0x62, 0xE8, 0xED,
+0xCA, 0x49, 0x89, 0x06, 0x17, 0x38, 0x93, 0xB4, 0x46, 0xC7, 0x1A, 0xD2, 0x78, 0xAB, 0x5A, 0xE7,
+0xBE, 0x6E, 0xA6, 0x2A, 0xE6, 0x64, 0xD1, 0x24, 0x30, 0x6F, 0xAE, 0x77, 0xAF, 0xD2, 0x4D, 0xC3,
+0x23, 0x7A, 0x24, 0x46, 0x15, 0x56, 0x26, 0x5B, 0x1C, 0xEA, 0xA4, 0x9C, 0xEA, 0x78, 0xF9, 0x9E,
+0xBB, 0x2C, 0xE0, 0xFE, 0x9F, 0x8A, 0xBD, 0x02, 0xED, 0x53, 0x20, 0x9F, 0xEB, 0xC9, 0x07, 0x33,
+0x79, 0x65, 0xE6, 0x73, 0x49, 0xCA, 0x56, 0x26, 0x80, 0xD5, 0x65, 0x9F, 0x1D, 0x05, 0x54, 0x29,
+0x35, 0xFD, 0x56, 0xE7, 0xF0, 0xC3, 0x89, 0x7F, 0xF7, 0x6F, 0x5D, 0x0F, 0x73, 0x2C, 0x12, 0x15,
+0xE7, 0xBF, 0x3E, 0xF2, 0x8A, 0xCB, 0xF3, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xB0, 0x86, 0x11, 0x28,
+0xC4, 0x6E, 0x15, 0x06, 0x97, 0x49, 0x88, 0x4F, 0x9C, 0xBB, 0x1C, 0x5E, 0x3D, 0x7C, 0x32, 0xBC,
+0x79, 0xF4, 0x54, 0x38, 0x7F, 0xF5, 0x3A, 0xE5, 0x04, 0xAC, 0x41, 0x6D, 0x48, 0xC6, 0x80, 0x2D,
+0x8E, 0x7C, 0xB1, 0x5D, 0x56, 0xE1, 0x5A, 0xBE, 0x71, 0x1E, 0x28, 0xB0, 0xB0, 0xA4, 0xAD, 0xE2,
+0xCB, 0xCB, 0x68, 0x35, 0x97, 0x2E, 0x24, 0x5E, 0x75, 0xC9, 0x5A, 0x56, 0xAC, 0x96, 0x9A, 0xD6,
+0xA7, 0x6E, 0xF5, 0xFB, 0xE2, 0xAD, 0x4C, 0xEF, 0xDA, 0xD5, 0x46, 0x06, 0x84, 0x28, 0x64, 0x97,
+0x26, 0x42, 0xA7, 0x27, 0x1B, 0xBD, 0x57, 0xDD, 0x3E, 0xD4, 0xBD, 0xDE, 0x4A, 0x7E, 0x9C, 0xB1,
+0xA9, 0x73, 0x6D, 0x4E, 0x68, 0x96, 0x1F, 0xD5, 0x54, 0x42, 0xAA, 0xAA, 0x25, 0x28, 0x4B, 0xB4,
+0xAD, 0xFA, 0x56, 0x63, 0x9D, 0x58, 0x12, 0xC3, 0x65, 0xAB, 0x58, 0xBA, 0x80, 0xB6, 0x7F, 0xF1,
+0xB1, 0xAF, 0xE9, 0x69, 0x63, 0xD0, 0xD4, 0xD4, 0xA7, 0x8A, 0xDD, 0x2C, 0xDC, 0xEB, 0xB0, 0xCF,
+0x32, 0x98, 0xE0, 0xEE, 0x4D, 0x25, 0x70, 0xA2, 0x31, 0x20, 0x4B, 0xA9, 0x82, 0x40, 0x41, 0x60,
+0x2D, 0x22, 0x50, 0x88, 0xDD, 0x4D, 0x1C, 0xD5, 0xA8, 0xD6, 0x8D, 0x4F, 0x85, 0x9F, 0xBC, 0x7B,
+0x34, 0xBC, 0x0E, 0x62, 0x77, 0xEA, 0xE2, 0x55, 0xF1, 0xFB, 0xA1, 0xF4, 0x30, 0x0B, 0xB5, 0x6E,
+0x9E, 0x5E, 0xDE, 0xF4, 0xAF, 0x8A, 0xF7, 0xAD, 0xF3, 0xCC, 0x49, 0x8D, 0x2B, 0x1D, 0x35, 0xAA,
+0x85, 0xAA, 0x20, 0xB6, 0x1C, 0xCB, 0x9F, 0x44, 0x86, 0x2A, 0x4C, 0x87, 0xD7, 0x8B, 0x54, 0x92,
+0x67, 0x89, 0x5B, 0xDC, 0xA7, 0x4F, 0x6B, 0xD2, 0x9B, 0xB9, 0xC2, 0x52, 0x0B, 0x8F, 0x93, 0x00,
+0xF5, 0x29, 0x73, 0x15, 0x27, 0x25, 0xAF, 0x70, 0x02, 0x53, 0x2B, 0xB4, 0x2C, 0x06, 0xB3, 0x97,
+0x4F, 0x04, 0xAF, 0x46, 0x19, 0xB2, 0x8A, 0x2C, 0x25, 0x5D, 0xA6, 0xE0, 0xF8, 0x1D, 0xBC, 0x6F,
+0xB5, 0xF4, 0x2F, 0xBB, 0xA3, 0xFB, 0x87, 0x2D, 0x42, 0xB8, 0x9C, 0x7B, 0x18, 0x54, 0x49, 0x5E,
+0xAA, 0xD7, 0x79, 0x03, 0x46, 0xA3, 0x5C, 0xAD, 0xAD, 0x72, 0xCE, 0x06, 0xCB, 0xE5, 0xC4, 0xEC,
+0x5A, 0xF7, 0xA7, 0xAB, 0x47, 0xEE, 0xF2, 0x26, 0xF9, 0x73, 0xE9, 0x59, 0x3D, 0x32, 0x84, 0x73,
+0xD5, 0x98, 0xDE, 0x5C, 0x4B, 0xCD, 0x91, 0xD4, 0x0A, 0xA2, 0x5F, 0xA1, 0xB7, 0xA5, 0x86, 0xC1,
+0xC5, 0x31, 0x62, 0xBD, 0x09, 0xCE, 0x94, 0x62, 0x2E, 0xE3, 0x64, 0x39, 0xA1, 0xD6, 0x3B, 0x25,
+0xFF, 0x50, 0xB9, 0x80, 0x73, 0x9A, 0x6A, 0xAA, 0xCF, 0xDD, 0x65, 0x18, 0xB7, 0xD7, 0x21, 0x4D,
+0x23, 0x8C, 0x75, 0x28, 0xBA, 0x93, 0xC2, 0x98, 0xB3, 0xCE, 0xB1, 0x97, 0x01, 0x4B, 0x48, 0xE8,
+0x1E, 0xC6, 0x48, 0x1F, 0x04, 0x53, 0x6C, 0x07, 0x6C, 0xB2, 0x5B, 0x37, 0xF4, 0xE3, 0x6F, 0x5B,
+0xC9, 0x5F, 0x77, 0x13, 0xBF, 0xDB, 0x4A, 0x55, 0x05, 0x81, 0x82, 0xC0, 0x27, 0x07, 0x81, 0x42,
+0xEC, 0x6E, 0xF2, 0x58, 0xD1, 0xB7, 0xEE, 0xE4, 0x85, 0xCB, 0x50, 0xEA, 0x4E, 0x87, 0xD3, 0x88,
+0x86, 0x1D, 0xC6, 0x1E, 0xB0, 0xB2, 0xD8, 0xB5, 0xC2, 0x34, 0xD4, 0xCA, 0xF4, 0x0B, 0x9A, 0xE8,
+0xB6, 0xDE, 0x91, 0xC8, 0x4D, 0x4E, 0x4A, 0x6A, 0x4B, 0x5A, 0x29, 0x5B, 0xF8, 0x85, 0x52, 0x79,
+0x7D, 0x39, 0x19, 0x88, 0x4E, 0x60, 0x7A, 0x7D, 0x2D, 0x81, 0x58, 0x66, 0xDD, 0xAD, 0x94, 0x5F,
+0xAE, 0x6C, 0xE3, 0x10, 0x2E, 0x56, 0x53, 0x4E, 0x3C, 0xAD, 0xB1, 0x79, 0xD1, 0x3A, 0x24, 0x67,
+0x11, 0x11, 0x28, 0xA7, 0x53, 0x4B, 0x36, 0xAB, 0x96, 0x64, 0xA5, 0xFA, 0x96, 0xE9, 0xAD, 0x15,
+0x54, 0x02, 0xE3, 0x64, 0x2E, 0x1B, 0xB9, 0xBA, 0x84, 0x6C, 0x69, 0x32, 0x5D, 0xE5, 0x5D, 0x76,
+0xFF, 0x45, 0x88, 0xDD, 0x72, 0xF3, 0xE6, 0x86, 0xC6, 0xCA, 0xEF, 0x55, 0xFB, 0xD7, 0x48, 0x97,
+0xDF, 0xB3, 0xB6, 0x49, 0x89, 0x9C, 0x19, 0xB1, 0xE3, 0xD0, 0x2D, 0x3F, 0x30, 0x8B, 0xCE, 0xFD,
+0xC5, 0x07, 0xAC, 0x06, 0x93, 0xEC, 0x1E, 0x32, 0x73, 0xF8, 0xC3, 0x69, 0x7E, 0x46, 0xFE, 0x6E,
+0xE8, 0xEB, 0x0E, 0xEB, 0x7A, 0xBA, 0x02, 0xF7, 0x8D, 0x2D, 0x47, 0x41, 0xA0, 0x20, 0x50, 0x10,
+0xB8, 0x13, 0x11, 0x28, 0xC4, 0xEE, 0x26, 0x8D, 0xBA, 0xAB, 0x75, 0x63, 0x13, 0x53, 0xE1, 0x35,
+0xF8, 0xD6, 0x1D, 0x3E, 0x7D, 0x21, 0x4C, 0xC3, 0x24, 0xCB, 0x4D, 0xC8, 0x45, 0xD9, 0x69, 0xED,
+0xC4, 0x5F, 0xAA, 0x08, 0xC2, 0xED, 0x32, 0x7D, 0x22, 0xA5, 0x23, 0x89, 0x4B, 0x91, 0xBC, 0x9F,
+0xCB, 0x13, 0xD5, 0x46, 0x56, 0xDC, 0xC9, 0x58, 0xD2, 0x4E, 0xD8, 0x15, 0x52, 0x38, 0xDF, 0x24,
+0x3D, 0xAE, 0xB6, 0x52, 0x60, 0x09, 0x27, 0x7F, 0x53, 0xEA, 0xF2, 0x4C, 0x21, 0x79, 0x9D, 0xF9,
+0x02, 0x9F, 0xA2, 0x62, 0x93, 0x72, 0xE2, 0xF4, 0xC6, 0xFF, 0xE6, 0xEA, 0x5F, 0xAD, 0x0C, 0xA6,
+0xF5, 0xFA, 0x0A, 0x9D, 0x33, 0x53, 0x8B, 0x16, 0x5D, 0x6C, 0x5D, 0x8E, 0x84, 0xD6, 0x93, 0xDC,
+0xBA, 0xD6, 0x53, 0x8F, 0x76, 0x38, 0xA1, 0x55, 0xBD, 0x49, 0xAB, 0xAC, 0x46, 0xD6, 0xE6, 0x2D,
+0x50, 0x92, 0x90, 0x06, 0xA7, 0x52, 0x63, 0xF6, 0x42, 0xDB, 0x6E, 0xE3, 0x66, 0x3B, 0x53, 0xE4,
+0x7D, 0x97, 0xDB, 0x38, 0x70, 0xF9, 0x30, 0x5A, 0x21, 0xF9, 0x23, 0x2A, 0x55, 0x22, 0xDC, 0x89,
+0x68, 0xA6, 0xB6, 0xD6, 0xE3, 0x59, 0xD5, 0xD4, 0xBE, 0xF5, 0x41, 0x92, 0xB3, 0xEE, 0x47, 0x99,
+0x0F, 0x60, 0x1D, 0xD2, 0x55, 0xEF, 0x37, 0x81, 0x8F, 0xB3, 0xB4, 0x89, 0xED, 0x24, 0x2C, 0x3A,
+0x6D, 0xA3, 0x9E, 0x1B, 0xA3, 0x6F, 0x0D, 0x0B, 0xBB, 0x65, 0x9A, 0xD7, 0x35, 0xF7, 0xD2, 0x5E,
+0xE5, 0x3F, 0x30, 0x92, 0x46, 0x57, 0xC7, 0x55, 0x33, 0x1B, 0xAF, 0x85, 0xEA, 0xB6, 0x8A, 0xD5,
+0x7A, 0x3D, 0x95, 0xBA, 0x56, 0x38, 0x38, 0x88, 0x7F, 0x1D, 0x4E, 0xEC, 0xD9, 0xB4, 0xAE, 0xF8,
+0xD7, 0x55, 0xBF, 0x2E, 0xCA, 0xAB, 0x82, 0x40, 0x41, 0xE0, 0x0E, 0x43, 0xA0, 0x10, 0xBB, 0x9B,
+0x38, 0xE0, 0x8C, 0x7A, 0x3D, 0x8F, 0x48, 0x58, 0xFA, 0xD5, 0x5D, 0xBE, 0x3E, 0x22, 0x8B, 0x4D,
+0x9B, 0x90, 0xBA, 0x76, 0x7D, 0xAC, 0xE8, 0x58, 0x4C, 0xFA, 0x20, 0xF1, 0xA8, 0x30, 0xC3, 0xC6,
+0x6B, 0x6D, 0x48, 0x4D, 0xB1, 0x55, 0x7C, 0x99, 0x5A, 0x17, 0x53, 0x66, 0xAA, 0x8B, 0x77, 0x9D,
+0x4A, 0x16, 0x11, 0xA4, 0x12, 0xB1, 0x59, 0xA6, 0x91, 0x78, 0xBB, 0x12, 0x58, 0x50, 0xB9, 0x45,
+0xE3, 0x2A, 0x4D, 0x3D, 0xD2, 0x54, 0xAF, 0xCB, 0xB1, 0x35, 0x35, 0xC4, 0x4E, 0xA9, 0x85, 0x9E,
+0xCC, 0x5B, 0x5C, 0xAF, 0xBC, 0xD7, 0xAB, 0xA9, 0x39, 0xF4, 0xD5, 0x02, 0x22, 0xD8, 0xE0, 0x28,
+0xD6, 0xEB, 0x61, 0xC2, 0xAE, 0x5A, 0x89, 0x26, 0xF5, 0x6D, 0xB0, 0xE2, 0x15, 0x17, 0x4B, 0x2A,
+0x64, 0xDD, 0x5B, 0xD4, 0x39, 0x99, 0x4E, 0x39, 0xCD, 0x33, 0x2C, 0x2A, 0x65, 0xEB, 0x21, 0x53,
+0xA7, 0x87, 0x36, 0x09, 0x48, 0xEA, 0x5A, 0xA0, 0xD6, 0xD1, 0xBF, 0x8E, 0xC4, 0x6E, 0xDF, 0xD6,
+0x0D, 0x25, 0x31, 0xF1, 0x8A, 0xC7, 0xB2, 0x5C, 0x50, 0x10, 0x28, 0x08, 0xAC, 0x25, 0x04, 0x0A,
+0xB1, 0xBB, 0x89, 0xA3, 0x39, 0x39, 0x35, 0x13, 0xDE, 0xFF, 0xE8, 0x5C, 0x78, 0xE7, 0xC4, 0xD9,
+0x30, 0x3B, 0x3B, 0xA3, 0x1B, 0x92, 0xC3, 0xA7, 0xAE, 0xA5, 0xAD, 0x0B, 0x77, 0x49, 0x8C, 0x26,
+0xFA, 0x21, 0xD9, 0x12, 0x9F, 0x94, 0x90, 0x85, 0x8D, 0xA9, 0x4B, 0x55, 0xA4, 0x5E, 0xDB, 0xE9,
+0xA0, 0x96, 0x59, 0x38, 0x69, 0x20, 0x3F, 0xCB, 0x16, 0xCC, 0xB4, 0x94, 0x56, 0x17, 0x64, 0x5F,
+0x46, 0x17, 0xA3, 0x44, 0xD5, 0x25, 0x38, 0xB5, 0x2F, 0xF9, 0x64, 0x25, 0x0D, 0xC9, 0xEB, 0x48,
+0x75, 0xA9, 0xCE, 0xA3, 0x75, 0xA8, 0xF4, 0x53, 0x4D, 0xF9, 0x91, 0xF4, 0x22, 0xC5, 0xC0, 0xFE,
+0x75, 0x7F, 0xB5, 0x84, 0x5A, 0x12, 0xC0, 0x8C, 0xD7, 0x5A, 0xC6, 0x3C, 0xBB, 0x46, 0x3B, 0x2D,
+0x77, 0x73, 0x49, 0xD4, 0x9A, 0xAA, 0x77, 0xD0, 0x76, 0x68, 0x5F, 0x8D, 0x19, 0x8A, 0x4F, 0x18,
+0xFD, 0xD0, 0xD8, 0x2C, 0x9E, 0xD3, 0x36, 0xE6, 0xFA, 0x50, 0x3E, 0x1A, 0x5A, 0x43, 0x26, 0xC4,
+0xB1, 0x1D, 0xE2, 0x53, 0x66, 0xF5, 0x7A, 0x54, 0x6C, 0x2D, 0x97, 0xB2, 0x8B, 0xB4, 0x6D, 0xDE,
+0x16, 0xBD, 0x53, 0x34, 0xA3, 0xB3, 0xED, 0xF1, 0x3A, 0xBB, 0x93, 0xD4, 0xAF, 0x83, 0xE8, 0x7B,
+0x9D, 0xA6, 0x36, 0x24, 0xDC, 0x6A, 0xF9, 0x53, 0x22, 0xAC, 0x7E, 0x5D, 0xCD, 0x24, 0x88, 0x28,
+0x38, 0x32, 0x69, 0x8C, 0xBC, 0xBF, 0xDA, 0x64, 0xCF, 0xB0, 0x98, 0xCD, 0x8C, 0x08, 0x00, 0xF3,
+0xE0, 0xB1, 0xCD, 0x49, 0x6D, 0xAE, 0xD5, 0x4D, 0x3D, 0x1A, 0x76, 0xE1, 0xBC, 0xF2, 0xF9, 0x57,
+0x63, 0x7E, 0xCF, 0xC6, 0x2B, 0xE3, 0xBF, 0x15, 0x3F, 0x4E, 0xFF, 0x0C, 0xE9, 0xBD, 0xD9, 0x48,
+0x44, 0x9A, 0xF3, 0x73, 0x86, 0xC7, 0x1C, 0x5C, 0x20, 0x98, 0xF2, 0xE4, 0xAE, 0xED, 0x9B, 0x42,
+0x57, 0x67, 0xC7, 0x4D, 0xFC, 0x54, 0x97, 0xAA, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x27, 0x0B,
+0x81, 0x42, 0xEC, 0x6E, 0xD2, 0x78, 0x91, 0x1C, 0x0C, 0x8E, 0x8C, 0x85, 0xB7, 0xA1, 0xD6, 0x5D,
+0xC0, 0x5E, 0xB0, 0x42, 0xAA, 0xA8, 0xD2, 0xB5, 0x61, 0x91, 0x69, 0xAB, 0x51, 0xEB, 0x1A, 0x52,
+0x51, 0x16, 0xA3, 0x5A, 0xF5, 0x1A, 0x6C, 0x65, 0xF3, 0x4B, 0x96, 0xBC, 0xC7, 0x62, 0xF4, 0x25,
+0xAD, 0xAE, 0x0D, 0x55, 0x55, 0x7B, 0x8F, 0x65, 0x9B, 0xBC, 0x58, 0xA3, 0xEA, 0xD0, 0x93, 0xEC,
+0xD4, 0xE2, 0xF9, 0xDF, 0x6A, 0xAE, 0x5B, 0xB4, 0xCF, 0xB5, 0x0D, 0x23, 0xA9, 0x73, 0x1C, 0xF3,
+0xE7, 0x4E, 0xBC, 0x16, 0x62, 0x9C, 0x08, 0x93, 0xBE, 0x27, 0xAF, 0x8D, 0x81, 0x68, 0xCA, 0x99,
+0x74, 0xCD, 0xC2, 0x66, 0xD4, 0x90, 0xA3, 0xCC, 0x28, 0xE9, 0x5C, 0xAF, 0x42, 0x66, 0xB2, 0xDB,
+0xD7, 0xA6, 0x5C, 0x69, 0x68, 0xEA, 0xC4, 0xEB, 0x17, 0xC7, 0x3B, 0xB5, 0x68, 0xF1, 0x1A, 0x97,
+0x99, 0x25, 0x15, 0x90, 0xBC, 0x96, 0xA5, 0x72, 0xC7, 0xA5, 0x7B, 0x56, 0xE7, 0xAB, 0x5F, 0xA3,
+0x67, 0x95, 0xDC, 0xE7, 0xCE, 0x0A, 0x71, 0xB0, 0x16, 0xCC, 0x2F, 0xFE, 0xB8, 0x99, 0xC6, 0x6E,
+0x13, 0x7C, 0xCC, 0x85, 0x3E, 0x24, 0x26, 0xDE, 0xBA, 0x0E, 0x7B, 0xC4, 0xC2, 0xFD, 0xA1, 0x1C,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x4E, 0x45, 0xA0, 0x7C, 0x03, 0xDE, 0x84, 0x91, 0xE7, 0xC2,
+0x3E, 0x8B, 0x3C, 0x75, 0x34, 0xC3, 0xBE, 0xF2, 0xC1, 0xF1, 0x30, 0x83, 0x6D, 0xC4, 0xC4, 0x02,
+0xDB, 0xD1, 0x2D, 0x8F, 0xCA, 0x22, 0x45, 0x25, 0xC6, 0xCE, 0xE8, 0x62, 0xE8, 0xD1, 0x85, 0xAE,
+0xC7, 0x78, 0x83, 0x5C, 0x1E, 0x31, 0xE5, 0xCD, 0x5F, 0x1A, 0x03, 0xC8, 0xF7, 0x63, 0xF5, 0xE8,
+0x4C, 0x51, 0x9F, 0x58, 0xA3, 0x28, 0x50, 0x4E, 0x15, 0xD4, 0x1B, 0x2A, 0xD5, 0x1E, 0x97, 0xE0,
+0xCA, 0x12, 0x9A, 0x2F, 0xE2, 0xE2, 0x9F, 0x97, 0x71, 0x95, 0x8A, 0xB6, 0x12, 0x9B, 0xA5, 0xF5,
+0x44, 0xC2, 0xE3, 0xF7, 0xAC, 0x10, 0x32, 0x36, 0x48, 0x55, 0x3A, 0xDF, 0xC4, 0x21, 0x11, 0x95,
+0x2A, 0xA1, 0xA8, 0xBC, 0x8A, 0x17, 0xE8, 0x0D, 0xA2, 0x08, 0x87, 0xF3, 0x82, 0x16, 0xCF, 0x65,
+0xE3, 0x96, 0x93, 0x8A, 0xBC, 0x1E, 0x51, 0xC1, 0x32, 0xC5, 0x4B, 0x25, 0x37, 0xC7, 0x62, 0x69,
+0x8A, 0xE4, 0x63, 0xE3, 0xDA, 0x95, 0x6B, 0x79, 0xAE, 0x54, 0xBA, 0x6A, 0xA4, 0x4A, 0x1B, 0xFD,
+0x1C, 0x93, 0x79, 0xD5, 0x6E, 0x93, 0x02, 0x65, 0xDD, 0x23, 0x4F, 0x06, 0xC1, 0x46, 0xDF, 0x6E,
+0xEF, 0x70, 0xA6, 0x39, 0xA1, 0x67, 0x74, 0xF4, 0x5C, 0xD7, 0x5B, 0x88, 0x55, 0x1A, 0x45, 0x1F,
+0x05, 0xBF, 0xC2, 0x90, 0x89, 0xCC, 0x35, 0xDF, 0x35, 0x23, 0x81, 0x96, 0xB7, 0x51, 0xD5, 0xCA,
+0x85, 0x87, 0x63, 0xAC, 0x7D, 0xB6, 0x36, 0x59, 0x83, 0x75, 0x88, 0x6A, 0x33, 0x1C, 0x26, 0x2F,
+0x01, 0x1F, 0xEF, 0x38, 0x3F, 0x6A, 0xE9, 0x1A, 0xC7, 0x52, 0xA7, 0x47, 0xF4, 0x2C, 0xC8, 0xB4,
+0xDD, 0xA4, 0xC4, 0xDA, 0x67, 0x44, 0x30, 0x89, 0x0D, 0xB2, 0x79, 0x31, 0x3F, 0x8B, 0x78, 0x09,
+0xA8, 0x75, 0xB3, 0x20, 0x76, 0x78, 0x7F, 0x73, 0x7F, 0x0F, 0xD4, 0x3A, 0xFD, 0x11, 0xE5, 0x2A,
+0xE7, 0x4D, 0xF8, 0x78, 0x97, 0x2A, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x27, 0x0A, 0x81, 0x42,
+0xEC, 0x6E, 0xD2, 0x70, 0x4D, 0x60, 0xBB, 0xB0, 0xB7, 0x8F, 0x9D, 0x96, 0x88, 0x58, 0xFA, 0xFB,
+0xB4, 0x40, 0xA9, 0x6B, 0x69, 0xEB, 0x24, 0xBB, 0xB3, 0x25, 0x6D, 0xE9, 0x1B, 0xD5, 0xD2, 0xBA,
+0x4A, 0xE9, 0x7C, 0x75, 0x34, 0xF3, 0xDC, 0xF2, 0xB5, 0x25, 0x62, 0x27, 0x0B, 0xDD, 0xB2, 0xFD,
+0xCC, 0x6F, 0xB2, 0x6C, 0x61, 0x5D, 0x59, 0x97, 0x20, 0x03, 0x0B, 0xEE, 0x29, 0xC5, 0x17, 0x61,
+0x10, 0xB5, 0xF5, 0x2C, 0xC9, 0xB9, 0x1A, 0xD7, 0x91, 0x1C, 0x81, 0xBC, 0x7A, 0x25, 0x96, 0xF9,
+0x0D, 0xEA, 0x23, 0x93, 0x4A, 0x24, 0x1C, 0xE3, 0x39, 0x3B, 0x95, 0xD7, 0x5F, 0x45, 0x3B, 0x27,
+0xBC, 0x8B, 0x21, 0xB5, 0x3C, 0xC6, 0xF5, 0xDA, 0x9F, 0xAE, 0x4A, 0xED, 0xD6, 0x72, 0xB5, 0xA5,
+0x8D, 0x81, 0xD5, 0xED, 0x5E, 0xF5, 0xE4, 0xD2, 0x14, 0x57, 0xEF, 0xA8, 0xF3, 0x33, 0xA7, 0xF8,
+0x4E, 0x45, 0x97, 0x9F, 0x59, 0xCB, 0xF7, 0xB4, 0x91, 0x12, 0xD5, 0x84, 0x28, 0x72, 0x77, 0x90,
+0x3A, 0xD8, 0x60, 0xE1, 0xF6, 0x80, 0xCF, 0x1B, 0x5E, 0xEF, 0xDA, 0xB4, 0x3E, 0x74, 0x17, 0x33,
+0x6C, 0x23, 0x60, 0x96, 0x32, 0x05, 0x81, 0x82, 0xC0, 0x1A, 0x46, 0xA0, 0x10, 0xBB, 0x8F, 0x39,
+0xB8, 0xAE, 0x08, 0x0D, 0x8E, 0x8E, 0x87, 0x1F, 0xBC, 0xF6, 0x5E, 0x18, 0xC7, 0x8E, 0x13, 0x5C,
+0x02, 0xDB, 0xA0, 0xD4, 0xB5, 0xC0, 0x14, 0x2B, 0x8B, 0xA1, 0xCB, 0x32, 0x76, 0x2F, 0x5F, 0x82,
+0x5D, 0x09, 0xD1, 0x25, 0x53, 0x0B, 0xC9, 0x32, 0x89, 0x02, 0x8B, 0x52, 0x0F, 0x09, 0x9C, 0x50,
+0x82, 0xA4, 0x65, 0x6C, 0xB1, 0x35, 0xF5, 0xC3, 0x4E, 0x99, 0xEF, 0x97, 0x2F, 0xBE, 0x4E, 0xEC,
+0xF2, 0x5A, 0xF5, 0x79, 0x6C, 0x8B, 0xB5, 0x4D, 0xDA, 0x5B, 0xC3, 0x32, 0x2B, 0x4B, 0x6A, 0xF6,
+0x9E, 0x5E, 0xCB, 0xF2, 0x9E, 0xD3, 0x2D, 0xA9, 0x30, 0x6E, 0xAB, 0xA4, 0x1F, 0x96, 0x2E, 0xFD,
+0x1E, 0x47, 0xE9, 0x6D, 0xC8, 0x09, 0x41, 0x0D, 0x40, 0x99, 0xBE, 0x68, 0xB0, 0xC4, 0x86, 0xCA,
+0xED, 0xEB, 0x39, 0x0F, 0x8A, 0xBF, 0xD7, 0xC2, 0x6C, 0x68, 0xBE, 0x5F, 0xAA, 0xB4, 0x31, 0x23,
+0x28, 0x3E, 0xEC, 0x4E, 0x58, 0x1C, 0x0C, 0x29, 0xEF, 0x4A, 0x94, 0xC0, 0x6C, 0x18, 0x66, 0x4D,
+0x14, 0x75, 0x4E, 0x14, 0x2B, 0x53, 0x5F, 0x59, 0x9E, 0xCF, 0xED, 0xA1, 0xE2, 0xA5, 0xFA, 0xA8,
+0x89, 0xE6, 0x96, 0xED, 0x98, 0xE1, 0x03, 0xAB, 0x6A, 0x62, 0xC2, 0x5F, 0x10, 0x32, 0x9F, 0x3F,
+0x51, 0x29, 0x6D, 0x64, 0xBD, 0x57, 0xAE, 0x6C, 0xB9, 0xC4, 0x15, 0xD1, 0x63, 0x59, 0xC1, 0x38,
+0x23, 0x7A, 0x52, 0x71, 0x1A, 0xC7, 0xAA, 0xC2, 0xA9, 0x2A, 0xA0, 0xB4, 0x4D, 0x8B, 0xC5, 0x7E,
+0xD4, 0x25, 0x78, 0xD6, 0x46, 0xBF, 0x87, 0xAA, 0xC1, 0x46, 0xF2, 0x5C, 0x72, 0x93, 0x69, 0x68,
+0x73, 0x72, 0xA9, 0xB9, 0x6B, 0x93, 0x53, 0x66, 0xAC, 0x49, 0xC2, 0x79, 0xD4, 0xAD, 0x23, 0xA6,
+0x63, 0x93, 0xB5, 0xC6, 0xB0, 0xF2, 0x1E, 0xC6, 0x99, 0x0B, 0x13, 0xEC, 0xDC, 0xEC, 0x5C, 0x98,
+0x85, 0x7F, 0x5D, 0x2B, 0xEA, 0x3B, 0xB8, 0x73, 0x33, 0x88, 0xDD, 0x4A, 0x83, 0x94, 0x3E, 0xE6,
+0x17, 0x40, 0xB9, 0xBC, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x66, 0x08, 0x14, 0x62, 0x77, 0x13,
+0x06, 0x64, 0x0A, 0xA6, 0xD7, 0xE3, 0x67, 0x2E, 0x86, 0x0F, 0x4E, 0x9E, 0x95, 0x14, 0x27, 0x2D,
+0x48, 0x8E, 0xDA, 0xDA, 0x8E, 0xF4, 0x26, 0xAD, 0x0D, 0xC2, 0x6B, 0x44, 0x65, 0x45, 0xDA, 0x47,
+0x0D, 0xF9, 0x8A, 0xC4, 0xC4, 0x99, 0x5D, 0xBD, 0x7E, 0xC9, 0x0D, 0x6C, 0xFB, 0x27, 0x27, 0x88,
+0xF1, 0x2F, 0xDA, 0xEA, 0xCF, 0x65, 0xE5, 0xD6, 0x72, 0xF1, 0x5C, 0xF6, 0x3C, 0x3F, 0x1F, 0x4D,
+0x5E, 0xB6, 0xD8, 0x6B, 0x3A, 0x95, 0x74, 0x8F, 0x4A, 0xDA, 0x15, 0xB1, 0x4F, 0x2F, 0xF6, 0x9E,
+0x92, 0x83, 0xBC, 0x7C, 0x7C, 0xEE, 0xC4, 0x57, 0xDA, 0xA0, 0xE9, 0x63, 0x16, 0xD4, 0x2B, 0xEF,
+0x19, 0xC9, 0x59, 0x50, 0x8F, 0x12, 0x11, 0xEF, 0x8B, 0x5E, 0x6B, 0x69, 0x68, 0xF2, 0xB2, 0xD6,
+0xEE, 0xFA, 0x18, 0xA1, 0x7C, 0x0D, 0x76, 0xD6, 0x53, 0x6B, 0x5D, 0x7A, 0x95, 0xB0, 0x33, 0xCA,
+0xEE, 0xC4, 0xCB, 0xCD, 0xB0, 0x19, 0xCE, 0x95, 0xBE, 0x48, 0xFD, 0xD5, 0x31, 0x6A, 0x61, 0x04,
+0x4E, 0xCD, 0x75, 0x8E, 0xBF, 0x5F, 0x9B, 0xF7, 0xCB, 0xCB, 0xC6, 0x7A, 0xBC, 0x4F, 0xF9, 0x78,
+0x66, 0xE7, 0x88, 0x67, 0xBD, 0x31, 0xAE, 0x9D, 0x0B, 0x8B, 0xBD, 0x16, 0x92, 0x95, 0xF5, 0x47,
+0x88, 0xF0, 0xB2, 0x75, 0xCA, 0x34, 0xD4, 0x7F, 0x84, 0x90, 0xDB, 0x5F, 0x1B, 0x43, 0xE7, 0xD2,
+0xC9, 0x06, 0x6F, 0xE4, 0xDA, 0xE6, 0xB4, 0x07, 0xE2, 0xC0, 0xE7, 0x01, 0xC4, 0x0E, 0xA6, 0x58,
+0x7C, 0x7E, 0xBA, 0xE0, 0xC7, 0xBA, 0x7B, 0xCB, 0x86, 0xD0, 0x89, 0xAD, 0xC4, 0xCA, 0x51, 0x10,
+0x28, 0x08, 0x14, 0x04, 0xEE, 0x64, 0x04, 0x1A, 0x64, 0x1E, 0x77, 0x32, 0x44, 0x4B, 0xF7, 0x9D,
+0x8B, 0xEB, 0xC8, 0xF8, 0x44, 0x78, 0xE9, 0xDD, 0x23, 0x61, 0x08, 0xAA, 0x1D, 0x17, 0x2B, 0x51,
+0xEB, 0x2C, 0x60, 0x22, 0x7A, 0xB8, 0x65, 0x8A, 0x4F, 0xAE, 0xB6, 0x24, 0x75, 0x26, 0x53, 0x6F,
+0x94, 0xA3, 0x38, 0x57, 0xAB, 0x6F, 0xF4, 0xCC, 0x0A, 0xE4, 0x84, 0x50, 0x9F, 0x93, 0x20, 0x24,
+0xF5, 0x8F, 0x95, 0xE9, 0x02, 0xAC, 0x8B, 0xB8, 0x92, 0x1A, 0xEC, 0xAA, 0x69, 0x7F, 0xF5, 0x35,
+0x72, 0xEC, 0x91, 0x88, 0x4A, 0x14, 0xAF, 0xFD, 0xE5, 0x73, 0x9C, 0x4B, 0x44, 0x88, 0x65, 0x98,
+0x8B, 0xCF, 0xCA, 0x4B, 0x8E, 0x3E, 0x96, 0xE1, 0xDE, 0xB7, 0x78, 0xD8, 0x5F, 0xAF, 0x47, 0xCE,
+0xC9, 0xFD, 0xF4, 0xBA, 0x56, 0x2E, 0xDC, 0x20, 0xBD, 0x3C, 0x2F, 0xF5, 0x56, 0x1E, 0x3C, 0x87,
+0xB2, 0xAC, 0xBF, 0xF6, 0xC1, 0x5D, 0x04, 0xE4, 0xD1, 0x8A, 0xCB, 0xED, 0x79, 0x56, 0x46, 0xCE,
+0xB1, 0xFE, 0xFC, 0x3A, 0xDC, 0x8B, 0xF7, 0x8B, 0x75, 0x91, 0x6C, 0xB3, 0x8C, 0x94, 0x65, 0x1F,
+0xB3, 0x6B, 0xEC, 0xB9, 0xDE, 0x43, 0xCB, 0xB4, 0x4A, 0xCE, 0x41, 0xDC, 0x2F, 0x5E, 0xD3, 0x86,
+0x7B, 0xA7, 0xFA, 0x2A, 0xED, 0x88, 0xED, 0xD3, 0xEB, 0x79, 0x4D, 0xFE, 0x37, 0xF6, 0x5F, 0xEA,
+0x42, 0xBB, 0x70, 0x7F, 0xB6, 0xA5, 0x8D, 0xF8, 0xF1, 0xB9, 0xFC, 0xE5, 0x7B, 0x86, 0x49, 0xDE,
+0x46, 0x69, 0xB7, 0x8E, 0x89, 0x96, 0xB5, 0xF6, 0x3B, 0xAE, 0x91, 0xE8, 0xDA, 0x98, 0xF8, 0x98,
+0x59, 0x3F, 0x1C, 0x63, 0x1D, 0xFB, 0x44, 0x8A, 0x75, 0xBC, 0x88, 0x91, 0xD7, 0xE7, 0x63, 0x6D,
+0x63, 0x5A, 0x3B, 0xC6, 0x46, 0xDE, 0xD8, 0x17, 0xD9, 0x3D, 0xC5, 0xE7, 0x91, 0xE5, 0x69, 0xD4,
+0x5C, 0x8D, 0x5E, 0xBF, 0x8E, 0xBB, 0x90, 0xB6, 0x78, 0x5D, 0xF6, 0x23, 0x01, 0x99, 0xE7, 0x7C,
+0x6E, 0x24, 0x12, 0x5C, 0xFF, 0x07, 0x47, 0xBC, 0x1E, 0x6D, 0x75, 0x02, 0xE8, 0xAA, 0xEA, 0xDC,
+0xF4, 0xA4, 0xA4, 0x14, 0xE2, 0xE4, 0xEE, 0xEB, 0xEE, 0x0C, 0x9B, 0xD7, 0xF5, 0x87, 0xF6, 0xB2,
+0xE3, 0x44, 0xF9, 0xB2, 0x2E, 0x08, 0x14, 0x04, 0xEE, 0x70, 0x04, 0x60, 0x59, 0xC9, 0xED, 0x5A,
+0x77, 0x38, 0x1A, 0x37, 0xD0, 0x7D, 0xAA, 0x05, 0x27, 0xA0, 0xD6, 0xFD, 0x3F, 0xFE, 0xA7, 0x3F,
+0x0A, 0xCF, 0xBD, 0xF5, 0x81, 0xEC, 0x30, 0xD1, 0xBB, 0x7E, 0x73, 0xE8, 0xE8, 0x19, 0x10, 0x82,
+0x25, 0xC2, 0x9A, 0x90, 0x2C, 0x72, 0x68, 0x55, 0xAC, 0xC4, 0x11, 0x9D, 0x8B, 0xB4, 0xD3, 0x37,
+0x5F, 0x04, 0xFD, 0xBC, 0x2B, 0x34, 0xB8, 0x62, 0x8E, 0xCF, 0x61, 0x2F, 0x6B, 0x93, 0x4C, 0xFA,
+0x26, 0xD3, 0xD9, 0xFB, 0xF3, 0x24, 0x42, 0xB4, 0xA5, 0xD9, 0x7B, 0xF3, 0xF3, 0x24, 0x0C, 0xAE,
+0x98, 0xB8, 0xA4, 0xA7, 0x8B, 0xAB, 0x10, 0x3E, 0x61, 0x77, 0xD8, 0x7A, 0x49, 0x98, 0x1E, 0x9D,
+0xD1, 0xF5, 0x7A, 0xBB, 0x85, 0x12, 0x49, 0x57, 0x76, 0x5C, 0xE1, 0xB2, 0x36, 0x92, 0xE4, 0xC4,
+0x83, 0xEB, 0xB2, 0x5D, 0xE7, 0xC2, 0x8B, 0x10, 0x5A, 0x21, 0x8F, 0x99, 0x51, 0xD0, 0x08, 0xAA,
+0x10, 0x3A, 0xDC, 0x55, 0xBA, 0xCE, 0x7E, 0x4B, 0x3B, 0x34, 0xD5, 0x88, 0x5C, 0xC2, 0xD7, 0x52,
+0x27, 0xB9, 0x01, 0x51, 0xA1, 0xA9, 0x8E, 0x24, 0xC1, 0xDE, 0x8F, 0x37, 0x46, 0x1D, 0xD2, 0x57,
+0xBD, 0x87, 0xE3, 0xAA, 0xE5, 0xCC, 0x68, 0x6A, 0x17, 0xB9, 0x37, 0x98, 0x10, 0x1B, 0xE9, 0x38,
+0xEE, 0xEB, 0x20, 0x48, 0xBB, 0xBC, 0x72, 0xAB, 0x4B, 0xEE, 0xE9, 0x8A, 0x19, 0xEE, 0x63, 0x89,
+0x8A, 0x45, 0x31, 0x33, 0xEC, 0xA4, 0x1E, 0xE9, 0x04, 0xFF, 0x98, 0xA9, 0x53, 0x3A, 0xE0, 0xD8,
+0xA6, 0xF6, 0x4A, 0xD2, 0x68, 0x04, 0xD4, 0xE8, 0xF8, 0xA9, 0xD9, 0x55, 0x61, 0x27, 0xFE, 0x76,
+0xB8, 0xD9, 0x92, 0x45, 0x6D, 0x4C, 0xF8, 0x07, 0x97, 0x69, 0x95, 0x56, 0x50, 0x4C, 0x94, 0x52,
+0x56, 0x53, 0xA4, 0x70, 0xCE, 0xC9, 0x7B, 0x56, 0x6F, 0xEE, 0x75, 0x28, 0xA7, 0xC5, 0x0C, 0x6C,
+0x63, 0x6C, 0xF5, 0xF8, 0x3D, 0xA3, 0x8B, 0x26, 0xDA, 0xC7, 0x7A, 0xB4, 0x3E, 0xEB, 0x62, 0xD6,
+0x1E, 0xAF, 0x53, 0xEB, 0xE3, 0xAD, 0xB8, 0xBB, 0x03, 0x9F, 0xA3, 0xBC, 0x01, 0x22, 0x79, 0xF2,
+0xC4, 0xCC, 0x9C, 0xB7, 0xD5, 0xA6, 0x99, 0x35, 0x70, 0x0E, 0xFD, 0x75, 0xBF, 0xC6, 0x68, 0x42,
+0x97, 0xFE, 0xF2, 0xD2, 0xAC, 0x13, 0xAC, 0x07, 0x0D, 0xD1, 0xA9, 0x62, 0x15, 0xF2, 0x05, 0xA2,
+0x5D, 0xD5, 0x44, 0x9D, 0x1A, 0x27, 0x6F, 0x83, 0xD4, 0x85, 0xE1, 0x0B, 0x30, 0xC3, 0x4E, 0x4B,
+0x7A, 0x93, 0xC7, 0x0F, 0xED, 0x0D, 0xFF, 0xC5, 0x6F, 0x7E, 0x3D, 0xEC, 0x82, 0x6A, 0x57, 0x8E,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0x27, 0x23, 0x50, 0x88, 0xDD, 0xC7, 0x18, 0x7D, 0x2E, 0x38,
+0x4C, 0x4A, 0xFC, 0xCA, 0x7B, 0xC7, 0xC2, 0x7F, 0xF1, 0x2F, 0x7E, 0x37, 0x9C, 0xBE, 0x70, 0x35,
+0xB4, 0x77, 0xF7, 0x84, 0x9E, 0x0D, 0x5B, 0xA1, 0xDA, 0x21, 0x77, 0x5D, 0xB6, 0x30, 0xB7, 0x66,
+0xE6, 0x29, 0x59, 0xA8, 0x4C, 0xDD, 0x30, 0xE6, 0xA7, 0x0A, 0x87, 0x11, 0x3B, 0x35, 0x1B, 0x72,
+0xE5, 0x63, 0x5E, 0x7D, 0x5D, 0xC0, 0xDB, 0x44, 0x4D, 0x73, 0x76, 0x00, 0x52, 0xE1, 0x04, 0xC7,
+0x98, 0x95, 0xE4, 0x14, 0xC3, 0x42, 0x4B, 0xE2, 0xA3, 0xAA, 0x1A, 0xAF, 0x57, 0x92, 0x27, 0x0B,
+0x21, 0x02, 0x3A, 0xC2, 0xEC, 0x14, 0x7C, 0xCD, 0x61, 0xBE, 0xE2, 0x62, 0x09, 0x13, 0x16, 0xF7,
+0xD6, 0x54, 0x03, 0xA2, 0xD3, 0x3D, 0x2C, 0xDA, 0xBC, 0x44, 0xAE, 0x73, 0xC6, 0xA2, 0xEF, 0x3B,
+0x39, 0x94, 0x57, 0xB2, 0xDD, 0xAD, 0x13, 0x22, 0xBC, 0x49, 0xCE, 0xA7, 0xBC, 0x48, 0x48, 0x9B,
+0x90, 0x58, 0xE5, 0x5F, 0x46, 0xDA, 0x14, 0x08, 0x29, 0x26, 0xC4, 0x4E, 0x89, 0x87, 0x53, 0x45,
+0xA9, 0x5F, 0xBA, 0x67, 0xB8, 0x68, 0x75, 0x5A, 0x5E, 0x6F, 0xE7, 0x54, 0x42, 0x55, 0xBF, 0x48,
+0x36, 0x9D, 0xE0, 0x29, 0x48, 0xDA, 0xFF, 0x6C, 0x40, 0x51, 0x1F, 0x89, 0xA2, 0xF2, 0x44, 0xA7,
+0x72, 0x8A, 0xA1, 0xE4, 0x01, 0xB4, 0xFF, 0xF4, 0x5E, 0xEE, 0x27, 0xC8, 0x17, 0x24, 0x76, 0x54,
+0x34, 0xED, 0x1C, 0x6B, 0x47, 0x21, 0x96, 0x11, 0x7F, 0x49, 0xE9, 0x27, 0xDF, 0xB7, 0x86, 0x7A,
+0x3F, 0xF3, 0xB9, 0x24, 0xC4, 0xC9, 0x9A, 0x1A, 0xE7, 0x81, 0xF6, 0x2B, 0x4F, 0x61, 0x22, 0x04,
+0x47, 0xF0, 0x4F, 0x75, 0x09, 0x81, 0x92, 0x72, 0x4A, 0x7C, 0x94, 0xF4, 0xD9, 0x85, 0x42, 0xAC,
+0x52, 0x85, 0x4E, 0x02, 0xFD, 0xD6, 0x46, 0x95, 0x12, 0x79, 0xB4, 0x7A, 0xFD, 0x7C, 0xBA, 0xD4,
+0x88, 0x9A, 0x5C, 0x28, 0x83, 0x1D, 0x7D, 0xFE, 0x0C, 0xCD, 0xD4, 0x9B, 0x7A, 0xC4, 0xCD, 0x9A,
+0xEB, 0x6D, 0xD5, 0xC2, 0x89, 0x0E, 0xCA, 0x0F, 0x0E, 0xB6, 0x5D, 0xC8, 0x63, 0x4E, 0xF6, 0x32,
+0x1E, 0x2C, 0xEF, 0x39, 0x89, 0xD3, 0xFB, 0x4B, 0x4B, 0x9C, 0xF0, 0xD9, 0x95, 0xD1, 0xE7, 0xD1,
+0xEF, 0xC1, 0xCE, 0xCC, 0x4C, 0x84, 0xB9, 0xB1, 0xC1, 0x30, 0x39, 0x35, 0x15, 0xB6, 0xAC, 0x1F,
+0x08, 0x3F, 0xFF, 0xE9, 0x47, 0xC2, 0x3F, 0xFA, 0xFA, 0xE7, 0xC3, 0x26, 0xA4, 0x3B, 0x29, 0x11,
+0xB1, 0xF9, 0x44, 0x2C, 0xCF, 0x0B, 0x02, 0x05, 0x81, 0x3B, 0x0D, 0x81, 0x42, 0xEC, 0x3E, 0xC6,
+0x88, 0x73, 0xC1, 0xA1, 0x19, 0xF6, 0x8F, 0xBF, 0xFF, 0x72, 0xF8, 0x6F, 0xFE, 0xDD, 0x37, 0xC2,
+0x38, 0x22, 0x63, 0xBB, 0xFB, 0xD6, 0x87, 0xAE, 0x75, 0x1B, 0xC5, 0x2C, 0x19, 0xA9, 0x84, 0x13,
+0x8C, 0x4C, 0x99, 0x5B, 0x92, 0xD8, 0x39, 0x9B, 0xA9, 0x10, 0xBB, 0x8C, 0x6C, 0x71, 0x71, 0xD7,
+0xEC, 0xC7, 0x20, 0x2E, 0x4E, 0x54, 0x7C, 0x1F, 0x5A, 0x9E, 0xE7, 0xA2, 0xCD, 0x07, 0x17, 0x56,
+0x92, 0x38, 0x3E, 0xE8, 0x8F, 0x84, 0x7D, 0x6B, 0xA7, 0xA7, 0x91, 0x9A, 0x05, 0xEF, 0x45, 0x62,
+0xE7, 0xC4, 0x42, 0xC9, 0x82, 0x0A, 0x55, 0x76, 0xAF, 0x98, 0x5F, 0x82, 0x6B, 0xBF, 0x2E, 0xFE,
+0xF2, 0xAF, 0x10, 0x3B, 0x65, 0x73, 0x4E, 0xBE, 0xFC, 0x3D, 0x0D, 0x28, 0xB0, 0xEB, 0x6D, 0x45,
+0x27, 0xA7, 0x55, 0x62, 0x44, 0x02, 0x47, 0x95, 0x50, 0xDB, 0xAC, 0x35, 0x2A, 0xD1, 0x11, 0x62,
+0xA7, 0x0C, 0x2C, 0x8E, 0x88, 0x94, 0x33, 0x8E, 0x28, 0x6D, 0xD3, 0x5B, 0xCB, 0xBF, 0xA4, 0x10,
+0x42, 0xF2, 0x22, 0xB9, 0xD2, 0x4A, 0xE2, 0x86, 0xF1, 0x42, 0x86, 0x94, 0xD8, 0x49, 0x35, 0xCA,
+0xEF, 0xE4, 0x1E, 0xA2, 0x34, 0x19, 0x6E, 0x6C, 0x85, 0xD4, 0x2B, 0xAA, 0x50, 0x46, 0xA0, 0xBC,
+0x0F, 0xA9, 0x35, 0x4E, 0x7F, 0x94, 0xB0, 0x7A, 0xEB, 0x23, 0x03, 0x8D, 0xE8, 0xC4, 0x4E, 0xC9,
+0x7D, 0xBC, 0x8F, 0x86, 0xAD, 0xBC, 0x74, 0x96, 0x65, 0xB7, 0xF3, 0x53, 0xD6, 0xC0, 0x98, 0x26,
+0xC5, 0x55, 0xC7, 0x4A, 0xF0, 0x0D, 0xBB, 0x29, 0xD5, 0x26, 0x32, 0x56, 0x73, 0x67, 0x21, 0x89,
+0x46, 0xFD, 0x22, 0xC6, 0x7E, 0x0F, 0x6F, 0x51, 0x54, 0xEB, 0x48, 0x5E, 0xB3, 0x76, 0xFA, 0x75,
+0xB5, 0xD7, 0xCB, 0x90, 0xD5, 0xD4, 0xEB, 0xA4, 0xD4, 0xCB, 0x3A, 0xC2, 0xF2, 0xD7, 0x48, 0x5A,
+0x7A, 0x8F, 0xC3, 0xA1, 0xAF, 0x5C, 0x89, 0x8D, 0x32, 0xA6, 0xEA, 0x77, 0x19, 0x56, 0xD9, 0x55,
+0xF1, 0xA9, 0x8E, 0x5E, 0xEC, 0x19, 0xE6, 0xF3, 0xEC, 0xE4, 0x78, 0x18, 0x43, 0xB0, 0xD2, 0x5D,
+0x3B, 0xB6, 0x86, 0xFF, 0xFD, 0xD7, 0xBF, 0x10, 0xBE, 0xF6, 0xCC, 0x23, 0x62, 0x92, 0x2D, 0xC4,
+0x2E, 0x42, 0x59, 0x9E, 0x14, 0x04, 0x0A, 0x02, 0x77, 0x20, 0x02, 0x85, 0xD8, 0x7D, 0xCC, 0x41,
+0x3F, 0x77, 0xF9, 0x7A, 0xF8, 0xAF, 0x7F, 0xEB, 0x4F, 0xC2, 0xB7, 0x5F, 0x7A, 0x5B, 0x08, 0x43,
+0x0F, 0xCD, 0xB0, 0xDD, 0xBD, 0x42, 0x79, 0xE2, 0x8E, 0x01, 0x4E, 0x30, 0x48, 0x07, 0x84, 0x8F,
+0x99, 0x3F, 0x91, 0x2B, 0x31, 0xA6, 0xBE, 0x89, 0x59, 0x8B, 0x26, 0x48, 0x27, 0x1E, 0x42, 0xEC,
+0x94, 0xA0, 0x88, 0x62, 0xE7, 0x8B, 0x1F, 0xAE, 0x77, 0x13, 0xAD, 0x10, 0x3B, 0x51, 0x03, 0xE9,
+0xD7, 0xA4, 0x64, 0x6B, 0x6E, 0x72, 0x14, 0x0F, 0x28, 0x1A, 0x33, 0x53, 0xF0, 0x2F, 0x87, 0x1F,
+0x12, 0x9E, 0xCF, 0x53, 0xA9, 0x93, 0x8D, 0xD2, 0x8D, 0xD8, 0xC8, 0x22, 0x2B, 0xB5, 0xCB, 0x43,
+0xCD, 0x6B, 0x89, 0x3C, 0x55, 0x16, 0x64, 0x29, 0x63, 0x0B, 0x6F, 0x85, 0xC8, 0x64, 0x4B, 0x3A,
+0xC9, 0x8E, 0xAE, 0xE7, 0xD1, 0xC4, 0x1C, 0xC9, 0x81, 0x76, 0xC1, 0xFA, 0x8E, 0x27, 0x90, 0x05,
+0xA3, 0xFA, 0xC5, 0xBA, 0x19, 0xC1, 0x99, 0x11, 0xB8, 0x8C, 0xAD, 0xE5, 0x4B, 0xF9, 0x02, 0x92,
+0x22, 0x24, 0xCF, 0xB9, 0x98, 0x9B, 0x3C, 0xAD, 0x3F, 0x55, 0x4A, 0xA5, 0xD0, 0x44, 0x72, 0x22,
+0xCA, 0x60, 0xA4, 0x95, 0xD6, 0x71, 0x25, 0x8A, 0xCA, 0x39, 0x9D, 0x44, 0x38, 0x22, 0xEC, 0x5C,
+0x55, 0xF1, 0x33, 0xEB, 0x72, 0x9C, 0x3D, 0x39, 0xD9, 0xB2, 0x66, 0x45, 0x22, 0x9A, 0xE3, 0xE0,
+0x35, 0x26, 0xE4, 0x80, 0x85, 0x37, 0x4C, 0x78, 0x4B, 0x22, 0xAB, 0xAA, 0xCA, 0x3A, 0x19, 0x65,
+0x13, 0x14, 0x48, 0x21, 0xA3, 0x19, 0xA7, 0xCD, 0x31, 0x97, 0xF1, 0x8F, 0xE3, 0x68, 0xD7, 0xE3,
+0x8F, 0x2A, 0x7B, 0x49, 0x27, 0x9D, 0x33, 0x42, 0xA7, 0x3B, 0x98, 0xB8, 0xCB, 0x40, 0xFA, 0x30,
+0xE4, 0xC4, 0x4E, 0xE6, 0x87, 0xDD, 0x2F, 0x43, 0xC4, 0x79, 0x68, 0xBA, 0xC8, 0xDA, 0x67, 0x14,
+0x3D, 0x11, 0xF7, 0x38, 0xB7, 0x72, 0x62, 0x97, 0xE3, 0x9F, 0xCF, 0xB6, 0x8C, 0xF8, 0xD9, 0xDC,
+0xAF, 0xCE, 0x87, 0x14, 0x5D, 0x3D, 0x83, 0x40, 0xA5, 0x91, 0xB1, 0x89, 0xF0, 0xC8, 0xC1, 0x3D,
+0xE1, 0xBF, 0xFC, 0x07, 0xBF, 0x14, 0x1E, 0xBF, 0x67, 0xAF, 0x7C, 0x4E, 0x0A, 0xB1, 0x4B, 0x43,
+0x52, 0x9E, 0x15, 0x04, 0x0A, 0x02, 0x77, 0x1E, 0x02, 0x85, 0xD8, 0x7D, 0x8C, 0x31, 0xA7, 0xF2,
+0xF5, 0xDE, 0xF1, 0x33, 0xE1, 0x3F, 0xFB, 0xE7, 0xBF, 0x13, 0x8E, 0x9C, 0xBE, 0x10, 0xDA, 0x11,
+0x09, 0xDB, 0xB3, 0x7E, 0x0B, 0x36, 0x9A, 0xE8, 0x34, 0x55, 0xC8, 0x54, 0x15, 0x51, 0x97, 0xC8,
+0x2C, 0xA8, 0x14, 0x65, 0xC4, 0xCE, 0x95, 0x12, 0x53, 0xF2, 0x16, 0x12, 0x3B, 0x2E, 0xB8, 0x2A,
+0x35, 0x89, 0x6F, 0x99, 0xAF, 0xE6, 0x24, 0x20, 0x66, 0x92, 0x54, 0x81, 0x0B, 0xAF, 0xD1, 0x16,
+0x3A, 0x92, 0x53, 0x99, 0x9B, 0x9D, 0x18, 0x81, 0x9A, 0x01, 0x62, 0x37, 0x3D, 0x15, 0x66, 0x41,
+0xEC, 0x66, 0xA7, 0x94, 0xD8, 0x89, 0x52, 0x27, 0x8B, 0xBE, 0x2F, 0xAA, 0xF9, 0xB3, 0x6C, 0x7D,
+0x36, 0x62, 0xE0, 0x67, 0x2A, 0x69, 0x44, 0x72, 0xCE, 0x93, 0x0A, 0x44, 0xB3, 0xA4, 0xA8, 0x63,
+0x56, 0xBD, 0x9B, 0x17, 0x23, 0x09, 0x12, 0x72, 0x45, 0xF6, 0x57, 0x25, 0x76, 0x75, 0x18, 0x82,
+0xB5, 0x80, 0xEA, 0xDE, 0x52, 0xEA, 0x13, 0x6F, 0x66, 0xA4, 0x45, 0x08, 0x71, 0x5E, 0xB6, 0xA6,
+0xA1, 0x4E, 0x2E, 0xA5, 0xE6, 0x64, 0x62, 0xCD, 0x87, 0xDF, 0x79, 0x89, 0xD1, 0x8F, 0xA4, 0xD0,
+0x09, 0xC4, 0x39, 0x55, 0xCC, 0x58, 0x6C, 0x65, 0xFE, 0xA4, 0x32, 0x2A, 0xEB, 0x99, 0xA2, 0x69,
+0xF4, 0xD4, 0x15, 0xC1, 0x5C, 0x08, 0x55, 0xCA, 0x9C, 0xC6, 0x21, 0x57, 0xAE, 0x68, 0xB6, 0x96,
+0x5B, 0x9B, 0x5F, 0x9E, 0x13, 0x16, 0x21, 0xFE, 0x1E, 0x1C, 0x13, 0x91, 0x72, 0xA5, 0x13, 0xF3,
+0xC0, 0x9A, 0x41, 0x2F, 0x4E, 0x6F, 0xBA, 0x9A, 0x39, 0x45, 0xE7, 0xD4, 0x16, 0xC7, 0x5C, 0x27,
+0xD9, 0xD3, 0xBC, 0xF9, 0x59, 0xBF, 0x12, 0xDF, 0xF4, 0xF9, 0x9C, 0x5A, 0x59, 0xB9, 0x24, 0x0E,
+0xB4, 0x11, 0x45, 0xAB, 0x23, 0xCD, 0x36, 0xBB, 0x35, 0x4F, 0x70, 0x0E, 0xCB, 0xCC, 0x5D, 0x78,
+0xD3, 0x04, 0xB5, 0x0F, 0x9A, 0xB4, 0x20, 0xD2, 0x52, 0x5E, 0x27, 0xF3, 0x1F, 0x4F, 0xBA, 0x3B,
+0xDA, 0xC3, 0xD3, 0x0F, 0x1C, 0x0C, 0xFF, 0xF9, 0x6F, 0xFE, 0x42, 0xD8, 0xBF, 0x63, 0x8B, 0xF9,
+0xE3, 0x2D, 0xD2, 0x91, 0xCA, 0x58, 0x95, 0x17, 0x05, 0x81, 0x82, 0x40, 0x41, 0x60, 0x6D, 0x22,
+0x50, 0x88, 0xDD, 0x0D, 0x8E, 0x2B, 0x09, 0x0A, 0xF7, 0x86, 0xFD, 0x1B, 0xE4, 0xAE, 0xFB, 0xA7,
+0x08, 0x9C, 0xB8, 0x72, 0x7D, 0x24, 0x74, 0xF7, 0xF6, 0x87, 0xAE, 0xFE, 0x0D, 0x12, 0xF1, 0x28,
+0x79, 0xC4, 0xDC, 0xFC, 0xE7, 0x24, 0x8C, 0x0B, 0x52, 0x16, 0x1C, 0x20, 0xCB, 0x1A, 0x15, 0x34,
+0x5F, 0xC0, 0x8D, 0xB0, 0xA9, 0x69, 0xD2, 0xBC, 0xDF, 0xCC, 0x77, 0x4E, 0x14, 0x26, 0x93, 0xBD,
+0x74, 0x81, 0xE7, 0xE2, 0xCE, 0x68, 0x49, 0x92, 0x3A, 0xF8, 0xFA, 0x81, 0xCC, 0x4D, 0x8F, 0x0C,
+0x09, 0xA9, 0xA3, 0x1F, 0xDD, 0x3C, 0xB3, 0xF2, 0xB3, 0x6E, 0x90, 0x39, 0xFA, 0x01, 0xCE, 0xE3,
+0xC1, 0xBF, 0x73, 0x28, 0x8B, 0x57, 0x22, 0xD1, 0xE5, 0x4E, 0xF7, 0x4B, 0xC3, 0x90, 0x29, 0x2A,
+0x8B, 0x10, 0xBB, 0x28, 0xAD, 0xD5, 0xBE, 0x9F, 0xBF, 0x66, 0x17, 0xCC, 0xF1, 0x4C, 0x49, 0xC6,
+0xF2, 0x87, 0x2E, 0xE9, 0x46, 0x08, 0xB2, 0xE2, 0x15, 0x4D, 0xCD, 0xA0, 0x71, 0x88, 0xD4, 0x12,
+0x98, 0x68, 0x83, 0x3C, 0xA7, 0xE2, 0x26, 0x9C, 0x92, 0x0A, 0x55, 0xC6, 0x91, 0x2B, 0x9A, 0xA0,
+0xDE, 0x40, 0xE9, 0xAF, 0xD3, 0x22, 0xBB, 0x7B, 0xEE, 0x18, 0x97, 0x51, 0xB1, 0xDC, 0xA5, 0x6F,
+0x41, 0x6F, 0x2A, 0xFC, 0x82, 0xF5, 0x18, 0xD1, 0xAA, 0x14, 0x34, 0x92, 0xB8, 0x40, 0x8F, 0xB4,
+0x31, 0x96, 0xB2, 0x46, 0x35, 0x5D, 0xC1, 0x33, 0x02, 0x9B, 0x13, 0xA6, 0x44, 0x90, 0x38, 0x9F,
+0x9C, 0x78, 0x69, 0x09, 0x27, 0xBC, 0x8A, 0x65, 0xF5, 0x2A, 0x99, 0x46, 0x52, 0xA8, 0xB6, 0xF5,
+0xA9, 0x9C, 0x9B, 0xAB, 0x63, 0x11, 0xBB, 0x46, 0x10, 0xCE, 0x2F, 0xCE, 0x06, 0x6A, 0xE1, 0xB8,
+0xA9, 0xF9, 0x3C, 0xDE, 0x4A, 0x88, 0x9D, 0xAA, 0x8F, 0xE9, 0xD0, 0x3B, 0xE9, 0x8F, 0x16, 0x6F,
+0x52, 0x1A, 0xE9, 0x9C, 0x70, 0xD3, 0xCF, 0xB0, 0x0B, 0xA4, 0xEE, 0xC9, 0xBB, 0xF7, 0x85, 0xCF,
+0x3D, 0x7C, 0x4F, 0xF8, 0x3B, 0x5F, 0xFD, 0x4C, 0xD8, 0xB6, 0x71, 0x5D, 0x51, 0xEB, 0x16, 0x4C,
+0xC2, 0x72, 0xA2, 0x20, 0x50, 0x10, 0xB8, 0xD3, 0x10, 0x28, 0xC4, 0xEE, 0x06, 0x47, 0x5C, 0xF7,
+0x86, 0x1D, 0x0F, 0xFF, 0xCB, 0xB7, 0x7F, 0x1C, 0xFE, 0x87, 0x3F, 0xFD, 0x6B, 0x21, 0x79, 0x3D,
+0x03, 0xC8, 0xA3, 0xD5, 0xDD, 0x6F, 0x26, 0x33, 0x12, 0x3B, 0x5B, 0xBA, 0x96, 0x22, 0x76, 0x5C,
+0x6C, 0x6D, 0x71, 0x94, 0x34, 0x0E, 0x66, 0xF2, 0xF3, 0x88, 0x55, 0xCA, 0x5F, 0x12, 0xA8, 0x90,
+0x45, 0xC5, 0x2A, 0xB1, 0xB3, 0x85, 0x92, 0x99, 0xF7, 0xA1, 0xCC, 0x4D, 0x8F, 0x0D, 0x87, 0x99,
+0xD1, 0xC1, 0x30, 0x3D, 0x0E, 0x62, 0x47, 0xF5, 0x2E, 0xFA, 0x33, 0xB5, 0x42, 0x49, 0x6C, 0x93,
+0xC8, 0x41, 0x2E, 0x84, 0x1D, 0x4C, 0xC7, 0x81, 0xD7, 0xED, 0x92, 0xEA, 0xC2, 0xBD, 0xB8, 0x72,
+0x63, 0x97, 0xD2, 0x88, 0xEA, 0xF2, 0x9F, 0x28, 0x58, 0x4E, 0xB2, 0xBC, 0x5C, 0x85, 0xCB, 0x2D,
+0x45, 0xEC, 0xD8, 0xD7, 0xBA, 0x6C, 0xAE, 0x11, 0x8A, 0xB7, 0xF4, 0x40, 0xB9, 0xA9, 0xD7, 0x59,
+0xE0, 0x02, 0x62, 0x27, 0x24, 0x9A, 0x84, 0xD9, 0x4D, 0x8F, 0x46, 0x13, 0xF2, 0x4E, 0xF0, 0x16,
+0x66, 0xB2, 0x95, 0x40, 0x8C, 0x8C, 0x73, 0x2C, 0x24, 0xA2, 0x39, 0xF9, 0xA8, 0xD7, 0x36, 0x25,
+0x93, 0x7A, 0x78, 0xFF, 0xAA, 0xC4, 0x2E, 0x42, 0x25, 0xE2, 0x53, 0x7D, 0x32, 0x53, 0xA9, 0x39,
+0x53, 0x0D, 0x97, 0x44, 0xC3, 0xC9, 0x9A, 0x17, 0xCA, 0xE0, 0xCD, 0x91, 0xD6, 0x69, 0x67, 0xD4,
+0x6A, 0x09, 0x62, 0x27, 0xB3, 0xC1, 0xF9, 0xAD, 0x61, 0x14, 0xEF, 0x9F, 0x13, 0x3B, 0xB7, 0xE7,
+0x57, 0xCC, 0xEA, 0x5E, 0x32, 0xA3, 0x7A, 0xD6, 0xF1, 0xEA, 0x54, 0x51, 0x22, 0x2B, 0xA5, 0xAC,
+0x2D, 0xB5, 0x4D, 0xD2, 0x31, 0xD5, 0x58, 0x72, 0x3E, 0xEF, 0xEF, 0xE9, 0x0A, 0x9F, 0x7B, 0xE8,
+0xEE, 0xF0, 0x28, 0xC8, 0xDD, 0xD3, 0x0F, 0x1E, 0x0C, 0x03, 0xBD, 0x48, 0x33, 0xD4, 0x28, 0x46,
+0x37, 0xF8, 0xB9, 0x2F, 0x97, 0x15, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x1D, 0x81, 0x42, 0xEC,
+0x6E, 0x70, 0x84, 0x48, 0xEC, 0x8E, 0x9F, 0xBD, 0x14, 0xFE, 0xAB, 0xFF, 0xDF, 0x1F, 0x86, 0x57,
+0x0F, 0x7F, 0x24, 0xF9, 0xC5, 0xBA, 0x07, 0x36, 0x81, 0x34, 0x61, 0x2B, 0x31, 0x33, 0x13, 0x51,
+0x75, 0x93, 0xF5, 0x50, 0x4C, 0xB0, 0x4A, 0xA4, 0x34, 0x3D, 0x04, 0x56, 0x3E, 0xBE, 0xB6, 0xF3,
+0xAE, 0xC4, 0x49, 0x64, 0x2B, 0x1E, 0xD1, 0x77, 0x8C, 0xC1, 0x00, 0x62, 0x6A, 0xE4, 0x5F, 0x33,
+0xE7, 0x4A, 0x7B, 0xE1, 0x63, 0x87, 0x28, 0xD7, 0xD9, 0xA9, 0x49, 0x21, 0x73, 0x53, 0x20, 0x75,
+0x4C, 0xFB, 0xC0, 0xC8, 0x57, 0x92, 0x11, 0x12, 0xB8, 0x76, 0xE4, 0x17, 0x63, 0x4E, 0xAF, 0x9E,
+0xAE, 0xCE, 0xB0, 0x71, 0xA0, 0x4F, 0xD2, 0x40, 0xEC, 0xDA, 0xBC, 0x41, 0x22, 0x08, 0xD7, 0x0F,
+0xF4, 0xCA, 0xA2, 0xD8, 0xC5, 0x64, 0xAE, 0x0B, 0x16, 0xF4, 0xC5, 0x00, 0x69, 0x90, 0x7C, 0x2D,
+0x43, 0xEC, 0x1A, 0x92, 0xE9, 0x6E, 0x70, 0x4C, 0x96, 0xBD, 0x6C, 0x31, 0x52, 0x69, 0xE3, 0x65,
+0xD0, 0x2A, 0x15, 0x5B, 0x94, 0x80, 0x2A, 0xAD, 0xA8, 0x67, 0x42, 0xCC, 0xEF, 0x9F, 0x13, 0xCB,
+0xC5, 0x0C, 0xC4, 0x55, 0x02, 0x9D, 0x11, 0x3B, 0x0B, 0xEC, 0xA8, 0x48, 0x95, 0x0D, 0xC2, 0xBF,
+0x2C, 0x06, 0xB5, 0x05, 0xBC, 0xEF, 0x35, 0x7E, 0x85, 0xB5, 0xFD, 0x8B, 0xC4, 0x39, 0xBB, 0x3E,
+0x29, 0x76, 0x7A, 0x52, 0xCD, 0xBD, 0x32, 0x3D, 0x97, 0x3E, 0x6A, 0xE7, 0x48, 0x0E, 0xBC, 0xD6,
+0x64, 0x67, 0x52, 0x45, 0x49, 0xED, 0x4B, 0xAC, 0x6F, 0x5D, 0x6F, 0x6F, 0xD8, 0x89, 0x79, 0xBD,
+0x0E, 0x7B, 0xC4, 0xF6, 0x75, 0x77, 0x69, 0x44, 0x78, 0x21, 0x76, 0x2B, 0x9E, 0x02, 0xE5, 0x82,
+0x82, 0x40, 0x41, 0x60, 0x6D, 0x21, 0x50, 0x88, 0xDD, 0x0A, 0xC7, 0xD3, 0x23, 0xFB, 0x66, 0xB0,
+0x8D, 0xD1, 0x8B, 0xEF, 0x1E, 0x0F, 0xFF, 0xF9, 0xBF, 0xF8, 0xBD, 0x70, 0x69, 0x70, 0x24, 0x74,
+0xF6, 0xF4, 0x86, 0xAE, 0xDE, 0x01, 0x2C, 0x2C, 0x4C, 0x35, 0xA2, 0x2A, 0x9B, 0xA8, 0x43, 0xA2,
+0x76, 0x90, 0xD8, 0x51, 0x1C, 0xB1, 0x14, 0x1A, 0xFA, 0xC2, 0x52, 0x81, 0x98, 0x44, 0x24, 0xA4,
+0x6F, 0xA1, 0x62, 0xA7, 0x51, 0xA4, 0x68, 0xA4, 0xA4, 0x31, 0x51, 0xB5, 0x82, 0x24, 0x6E, 0x6A,
+0xF8, 0x5A, 0x98, 0x19, 0x53, 0xB3, 0xEB, 0x0C, 0x82, 0x24, 0x26, 0xB1, 0xFB, 0xC5, 0x2C, 0xA2,
+0x5F, 0x77, 0x6C, 0x5C, 0x0F, 0x9F, 0xA3, 0x03, 0xE1, 0xBE, 0x7D, 0x3B, 0xC2, 0x76, 0x98, 0xA6,
+0xB8, 0xF0, 0xF5, 0x43, 0xC9, 0xE8, 0x45, 0xB4, 0x60, 0x6F, 0x17, 0xC8, 0x1C, 0xB6, 0x5C, 0xEA,
+0x14, 0xE2, 0x67, 0x09, 0x83, 0x57, 0xD8, 0xFF, 0x52, 0xFC, 0xCE, 0x40, 0xA0, 0xAA, 0xD8, 0x26,
+0x15, 0x77, 0xB5, 0xF8, 0x65, 0x3D, 0x54, 0x73, 0x7E, 0x98, 0x2B, 0xC5, 0xCE, 0x03, 0x39, 0x87,
+0x3B, 0x30, 0x97, 0x35, 0x05, 0x4E, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0x40, 0x7E,
+0x5B, 0x97, 0x04, 0xC5, 0x2B, 0x9B, 0x08, 0x4E, 0xEC, 0x46, 0xC7, 0x27, 0xC3, 0x37, 0x7E, 0xFC,
+0x46, 0xF8, 0x7F, 0xFD, 0xFB, 0x6F, 0x86, 0x11, 0xA4, 0x39, 0xE9, 0xE9, 0x1B, 0x08, 0xED, 0x9D,
+0x3D, 0x42, 0xDE, 0x6A, 0x89, 0x5D, 0x8C, 0xFA, 0x6C, 0x94, 0xD8, 0x99, 0xDF, 0x9D, 0x5E, 0xE7,
+0xA6, 0x32, 0x12, 0x44, 0xE8, 0x16, 0xF4, 0x95, 0x9B, 0x1A, 0x0F, 0x53, 0x43, 0x20, 0x76, 0x13,
+0xA3, 0x12, 0x10, 0xC1, 0x5D, 0x10, 0xD6, 0x43, 0xB5, 0xD8, 0x04, 0x65, 0xEE, 0x00, 0x1C, 0xC8,
+0x3F, 0xF3, 0xE0, 0xA1, 0xF0, 0xC0, 0xFE, 0x9D, 0x61, 0xFB, 0xA6, 0x75, 0x61, 0xFB, 0x66, 0xA4,
+0x5F, 0x29, 0x1B, 0xA3, 0xAF, 0x6C, 0x90, 0x4B, 0xE9, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10,
+0x28, 0x08, 0x7C, 0x42, 0x11, 0x58, 0xD2, 0xF7, 0xFB, 0x13, 0xDA, 0xA7, 0xA6, 0x34, 0x7B, 0x7C,
+0x6A, 0x3A, 0x7C, 0x70, 0xEA, 0x42, 0x98, 0x66, 0xB6, 0x7C, 0xD9, 0xCE, 0xAA, 0x5D, 0xD4, 0xB9,
+0x98, 0xAB, 0x8B, 0xAC, 0x19, 0x0F, 0x2A, 0x0D, 0x6A, 0x79, 0x32, 0x82, 0x66, 0xD2, 0x83, 0x9E,
+0x77, 0x6F, 0x21, 0x35, 0xD9, 0x4A, 0x39, 0x0F, 0x90, 0x10, 0xDA, 0xAD, 0xAF, 0x35, 0x02, 0x10,
+0x41, 0x0F, 0x93, 0x63, 0x30, 0xBB, 0xC2, 0xF4, 0x0A, 0xB5, 0x6E, 0x6E, 0x06, 0x69, 0x4C, 0x70,
+0x6E, 0x0A, 0xCA, 0x61, 0x27, 0x7C, 0xE6, 0x9E, 0xBE, 0xEF, 0x40, 0xF8, 0x8F, 0x7E, 0xE1, 0x8B,
+0xE1, 0x1F, 0xE1, 0xF1, 0xA5, 0x27, 0xEF, 0x0F, 0x77, 0xEF, 0xDD, 0x1E, 0xB6, 0x6C, 0x1C, 0x08,
+0x1D, 0x65, 0xEF, 0xCC, 0xA6, 0xCC, 0x87, 0x72, 0x93, 0x5B, 0x8B, 0x40, 0xD9, 0x40, 0xE7, 0xD6,
+0xE2, 0x5F, 0xEE, 0x5E, 0x10, 0x28, 0x08, 0xDC, 0x3E, 0x08, 0x14, 0x62, 0x77, 0x83, 0x63, 0x31,
+0x31, 0x39, 0x1D, 0x4E, 0x5C, 0xB8, 0xA2, 0x8A, 0x99, 0xED, 0x79, 0x9A, 0xA7, 0xC4, 0xC8, 0xAB,
+0xAD, 0x98, 0xAF, 0x2A, 0xC4, 0xAE, 0x7A, 0xF3, 0x5A, 0x33, 0x57, 0x7C, 0x2D, 0xFE, 0x74, 0xE3,
+0x50, 0xE8, 0xC6, 0xF4, 0x81, 0xC4, 0xAC, 0xCC, 0xE1, 0xD5, 0xD1, 0xD1, 0x81, 0x14, 0x0F, 0x5B,
+0xC3, 0xA7, 0x40, 0xEA, 0x9E, 0x79, 0xE8, 0x50, 0xF8, 0xEC, 0xC3, 0x77, 0x87, 0x27, 0xEF, 0xDB,
+0x87, 0x73, 0x9B, 0xC3, 0x46, 0x64, 0xE0, 0xEF, 0x35, 0xBF, 0xA3, 0x1B, 0xEC, 0x62, 0xB9, 0xAC,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x4F, 0x18, 0x02, 0x85, 0xD8,
+0xAD, 0x70, 0xC0, 0xDC, 0x39, 0x7B, 0x12, 0xC4, 0xEE, 0xDC, 0x55, 0xA4, 0x17, 0x01, 0xFB, 0x92,
+0x8D, 0xD9, 0xC5, 0xCF, 0x27, 0x39, 0xD5, 0xE7, 0xCE, 0xF3, 0x51, 0xB9, 0x63, 0x72, 0x59, 0x4F,
+0xE5, 0x40, 0x47, 0x73, 0x73, 0x58, 0xD7, 0x78, 0x40, 0x1E, 0xAA, 0xCE, 0xE5, 0xAA, 0x1F, 0xCF,
+0xD2, 0x8F, 0x6E, 0x92, 0x11, 0xAF, 0x30, 0xBD, 0x32, 0x37, 0x1D, 0x45, 0xBD, 0x29, 0xF8, 0xD3,
+0xF5, 0xF7, 0x74, 0x87, 0x9F, 0x79, 0xEA, 0x41, 0xA8, 0x74, 0x5F, 0x08, 0xCF, 0x3E, 0x76, 0x2F,
+0xC8, 0x5C, 0x6F, 0x71, 0x1E, 0x5F, 0xE1, 0x78, 0x96, 0xE2, 0x6B, 0x03, 0x81, 0x12, 0x34, 0xB1,
+0x36, 0xC6, 0xB1, 0xF4, 0xA2, 0x20, 0x50, 0x10, 0xF8, 0xF8, 0x08, 0x14, 0x62, 0x77, 0x03, 0x18,
+0x32, 0xB5, 0xC9, 0x85, 0xEB, 0xC3, 0x61, 0x70, 0x74, 0x42, 0x02, 0x1E, 0x5A, 0xDB, 0x18, 0x5D,
+0x9A, 0xA5, 0x73, 0x50, 0x8A, 0xB6, 0xB0, 0xE6, 0xFA, 0xA1, 0x96, 0x95, 0x72, 0x95, 0xEB, 0x68,
+0x81, 0x35, 0xB5, 0x8E, 0x09, 0x87, 0x99, 0xD6, 0x64, 0x16, 0x5B, 0x81, 0x31, 0xF5, 0xC9, 0xDE,
+0x6D, 0x9B, 0xA0, 0xD4, 0xED, 0x0F, 0x9F, 0x7D, 0xE8, 0x20, 0xFE, 0xDE, 0x15, 0xF6, 0x41, 0xA5,
+0xEB, 0x46, 0x04, 0x6C, 0x59, 0xE0, 0x6E, 0x60, 0x40, 0xCB, 0x25, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x58, 0x23, 0x08, 0x14, 0x62, 0xB7, 0x82, 0x81, 0x74, 0x25, 0x6D, 0x08,
+0xDB, 0x18, 0x1D, 0x3E, 0x73, 0x31, 0x4C, 0x23, 0x90, 0x81, 0x11, 0x79, 0x4C, 0x48, 0xEC, 0xC9,
+0x2A, 0xDC, 0x57, 0x2E, 0xAF, 0xD6, 0xB3, 0x3B, 0x54, 0xA8, 0x9F, 0x5C, 0xC0, 0xD4, 0x27, 0x94,
+0xEE, 0xFC, 0x2A, 0x4B, 0xF3, 0xE0, 0x29, 0x28, 0xF0, 0x92, 0x81, 0x12, 0x33, 0xC8, 0x4D, 0xC7,
+0xBD, 0x5F, 0xE7, 0x10, 0x4C, 0x01, 0x97, 0x3A, 0xE4, 0xA5, 0x6B, 0x0F, 0x5F, 0x84, 0x42, 0xF7,
+0xF7, 0x7E, 0xE6, 0x99, 0xF0, 0xF0, 0xDD, 0x7B, 0x25, 0xD2, 0xB5, 0x1C, 0x05, 0x81, 0x3B, 0x11,
+0x01, 0x49, 0xC2, 0xDD, 0xC0, 0x0F, 0xA6, 0x3B, 0x11, 0x9B, 0xD2, 0xE7, 0x82, 0x40, 0x41, 0xE0,
+0xCE, 0x44, 0xA0, 0x10, 0xBB, 0x1B, 0x18, 0xF7, 0xE1, 0xF1, 0x89, 0x70, 0xF4, 0xEC, 0x65, 0x90,
+0xAC, 0x39, 0xD9, 0x64, 0x5E, 0x76, 0x9A, 0xC8, 0x92, 0x77, 0x25, 0xD3, 0x6A, 0x4D, 0xE5, 0xF5,
+0xB2, 0x32, 0x08, 0x97, 0xCB, 0xF3, 0x76, 0x25, 0xA5, 0x8F, 0x7B, 0xBD, 0xCE, 0x4E, 0x22, 0x48,
+0x62, 0x1A, 0xFB, 0xBC, 0x22, 0xF9, 0x2B, 0xA3, 0x5B, 0xB7, 0x22, 0x20, 0xE2, 0x71, 0x24, 0x64,
+0xFD, 0x2C, 0x22, 0x5F, 0x9F, 0x00, 0xA9, 0x63, 0x4A, 0x13, 0xDD, 0x47, 0xB6, 0x1C, 0x05, 0x81,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0xE9, 0x08, 0x14, 0x46, 0xB0, 0x82,
+0x19, 0xE0, 0x66, 0xCE, 0xE1, 0xB1, 0xC9, 0x70, 0xEC, 0x3C, 0x89, 0x9D, 0x46, 0xC4, 0x56, 0xCC,
+0x9F, 0xB2, 0xBD, 0x41, 0xF2, 0xA5, 0xF3, 0x24, 0xAE, 0xA2, 0x2C, 0x78, 0xEE, 0x3A, 0xA1, 0x81,
+0xD9, 0x86, 0x4A, 0xC6, 0xE5, 0x4C, 0xC4, 0x33, 0x9A, 0x87, 0x6D, 0xC2, 0x10, 0x24, 0x31, 0x37,
+0x8D, 0x3D, 0x5F, 0x51, 0x7E, 0x06, 0xD7, 0x6F, 0x40, 0x62, 0xE1, 0xC7, 0x41, 0xE6, 0xFE, 0xFE,
+0xCF, 0x7C, 0x06, 0x41, 0x12, 0xFB, 0x4B, 0x1A, 0x93, 0x15, 0x8C, 0x5D, 0x29, 0xBA, 0x36, 0x11,
+0xE0, 0x67, 0xAF, 0xB8, 0x1F, 0xAC, 0xCD, 0xB1, 0x2D, 0xBD, 0x2A, 0x08, 0x14, 0x04, 0x6E, 0x0C,
+0x81, 0x42, 0xEC, 0x56, 0x80, 0x1B, 0x23, 0x60, 0x49, 0xEA, 0xAE, 0x0C, 0x8D, 0x84, 0x4B, 0xD8,
+0x1B, 0x96, 0x84, 0x8B, 0x8A, 0xDD, 0x82, 0x85, 0xA5, 0x8E, 0x69, 0x68, 0xA1, 0xC7, 0x5D, 0xCE,
+0xE6, 0x5C, 0xE3, 0xA3, 0x53, 0x9D, 0xFA, 0xE7, 0xCD, 0xCD, 0x42, 0xA5, 0x9B, 0x9E, 0x54, 0x9F,
+0x3A, 0x2C, 0x5E, 0x7B, 0xB7, 0x6D, 0x0C, 0x4F, 0xDC, 0xB3, 0x17, 0xD1, 0xAF, 0x07, 0xC2, 0x53,
+0x20, 0x75, 0x3B, 0x91, 0x9F, 0x8E, 0xBB, 0x4B, 0x94, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x80, 0x23, 0x50, 0x98, 0x41, 0x83, 0x73, 0x81, 0x8A, 0xDB,
+0x34, 0x1C, 0xDC, 0xCE, 0x5D, 0xBE, 0x1E, 0xCE, 0x5C, 0xBA, 0x1E, 0xC6, 0x11, 0x40, 0xC1, 0x64,
+0xC4, 0x34, 0xC3, 0x7A, 0x3E, 0x3A, 0xAD, 0xAA, 0x8E, 0xBD, 0x55, 0x22, 0x60, 0x35, 0x17, 0x9D,
+0x6C, 0x44, 0x91, 0x3B, 0xE2, 0x09, 0xA7, 0x8B, 0x31, 0xB1, 0xB1, 0x9C, 0xA8, 0x75, 0x24, 0x77,
+0x78, 0x9B, 0x09, 0x88, 0x9F, 0x45, 0x2A, 0x93, 0xBF, 0xFD, 0x85, 0x27, 0xC2, 0x97, 0x1F, 0xBB,
+0x4F, 0xF6, 0xC4, 0x2C, 0x47, 0x41, 0xE0, 0x4E, 0x47, 0xA0, 0xF8, 0xD6, 0xDD, 0xE9, 0x33, 0xA0,
+0xF4, 0xBF, 0x20, 0x50, 0x10, 0xA8, 0x87, 0x40, 0x21, 0x76, 0x2B, 0x98, 0x17, 0x8C, 0x86, 0x3D,
+0x76, 0xEE, 0x72, 0x38, 0x06, 0xFF, 0xBA, 0x49, 0x90, 0x3C, 0xD9, 0x65, 0x22, 0x06, 0x4E, 0x64,
+0x15, 0x2D, 0xB2, 0xC5, 0x91, 0xC4, 0x48, 0xF0, 0xA8, 0x17, 0x61, 0x91, 0x5D, 0x3E, 0x8F, 0x1C,
+0x75, 0x4C, 0x6B, 0x32, 0x07, 0x85, 0x90, 0xDB, 0x26, 0xDD, 0xBB, 0x67, 0x1B, 0x12, 0x10, 0xEF,
+0x0F, 0x8F, 0x1E, 0xDA, 0x23, 0x39, 0xEA, 0xB8, 0x17, 0x6C, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xD4, 0x22, 0x50, 0x88, 0xDD, 0x0A, 0xE6, 0x04,
+0x77, 0x9B, 0x78, 0xE7, 0xC4, 0xF9, 0xF0, 0xDE, 0xC9, 0x0B, 0x16, 0x38, 0x41, 0xFF, 0x1E, 0x15,
+0xE9, 0x44, 0xB5, 0xF3, 0x40, 0x08, 0xCB, 0x45, 0x97, 0x78, 0x1C, 0xDF, 0x55, 0x9F, 0x3A, 0x1E,
+0xF2, 0x9C, 0xBE, 0x41, 0x4E, 0xF2, 0xAC, 0x0D, 0xBA, 0xAF, 0x2C, 0x76, 0x98, 0x80, 0x5F, 0x9D,
+0xA4, 0x39, 0x41, 0x05, 0xDC, 0xDF, 0xF5, 0x6B, 0x4F, 0x3F, 0x24, 0xA4, 0xAE, 0xAF, 0xA7, 0x6B,
+0x05, 0xAD, 0x2D, 0x45, 0x0B, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8,
+0xD3, 0x10, 0x28, 0xC4, 0x6E, 0x05, 0x23, 0x3E, 0x36, 0x31, 0x85, 0xDD, 0x26, 0xAE, 0x86, 0x93,
+0x97, 0x06, 0xB1, 0xE3, 0x84, 0x07, 0x48, 0x54, 0xF3, 0xD7, 0x29, 0x57, 0xF3, 0xF4, 0xC4, 0xB9,
+0x61, 0x36, 0xCF, 0x50, 0x97, 0x79, 0xDC, 0xD5, 0x38, 0xDF, 0xCD, 0x81, 0xD0, 0xCD, 0xC3, 0xAF,
+0x8E, 0x6A, 0x5D, 0x27, 0xD2, 0x9A, 0x3C, 0xB4, 0x6F, 0x47, 0x78, 0xEA, 0xDE, 0x7D, 0xE2, 0x53,
+0xC7, 0xAD, 0xC3, 0xCA, 0x51, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40,
+0x41, 0x60, 0x31, 0x04, 0x0A, 0xB1, 0x6B, 0x60, 0x6E, 0xD0, 0x97, 0x87, 0xFB, 0xB2, 0x8E, 0x80,
+0xD8, 0x5D, 0x18, 0x1C, 0x0D, 0x97, 0x47, 0xE0, 0xFF, 0x46, 0xE5, 0x2D, 0x0B, 0x9C, 0xD0, 0x4D,
+0x24, 0x4C, 0x93, 0xB3, 0x50, 0x58, 0x9E, 0xD3, 0xF3, 0xDC, 0x4D, 0x42, 0x5D, 0xE9, 0xC4, 0xBF,
+0x8E, 0x7B, 0xC0, 0xDA, 0x7D, 0x95, 0xD7, 0xD9, 0xBF, 0x20, 0x8B, 0x0C, 0x98, 0x20, 0xA9, 0x63,
+0x4D, 0xF4, 0xA5, 0xFB, 0xFA, 0x67, 0x1E, 0x0A, 0xFB, 0xB6, 0x6F, 0x82, 0x9F, 0x5D, 0x19, 0xAA,
+0x06, 0x86, 0xAA, 0x14, 0xB9, 0x83, 0x10, 0x28, 0xD1, 0xB0, 0x77, 0xD0, 0x60, 0x97, 0xAE, 0x16,
+0x04, 0x0A, 0x02, 0x0D, 0x23, 0x50, 0xD8, 0x42, 0x83, 0x50, 0x31, 0x70, 0xE2, 0xFC, 0x95, 0xC1,
+0x70, 0x1D, 0xC9, 0x89, 0xA7, 0x90, 0x98, 0x58, 0x4C, 0xA9, 0x0B, 0x7C, 0xE9, 0x9C, 0xA6, 0xB9,
+0xD1, 0x55, 0x2B, 0x17, 0x4D, 0x2F, 0x0F, 0x82, 0xCD, 0xEE, 0x99, 0x04, 0x3B, 0x28, 0x7A, 0x20,
+0x74, 0x73, 0xB8, 0xCF, 0x3C, 0x92, 0x11, 0x77, 0x40, 0x9D, 0x7B, 0x68, 0xFF, 0x4E, 0x49, 0x6F,
+0xB2, 0xA1, 0xBF, 0x57, 0x12, 0x21, 0x97, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0x52, 0x08, 0x14, 0x62, 0xD7, 0xE0, 0xFC, 0x18, 0xC7, 0xDE, 0xB0,
+0x1F, 0x9C, 0xB9, 0x14, 0x18, 0x40, 0xD1, 0x89, 0xE0, 0x85, 0x56, 0x06, 0x4E, 0x38, 0xD9, 0xC2,
+0x8E, 0x10, 0x2E, 0xC1, 0xA9, 0x32, 0x07, 0xD2, 0xC7, 0xB4, 0x25, 0x54, 0xE8, 0x6A, 0xD5, 0x39,
+0x57, 0xED, 0x4C, 0xA7, 0x93, 0xFD, 0x62, 0x51, 0x08, 0x5C, 0x4E, 0x4C, 0xB0, 0xF3, 0xF3, 0xB3,
+0x50, 0x07, 0x03, 0xFC, 0xE9, 0xBA, 0xC3, 0xD7, 0x9E, 0x7A, 0x00, 0x09, 0x88, 0x07, 0x4A, 0x9E,
+0xAE, 0x06, 0xC7, 0xA8, 0x14, 0xBB, 0x73, 0x10, 0x28, 0x11, 0xB1, 0x77, 0xCE, 0x58, 0x97, 0x9E,
+0x16, 0x04, 0x0A, 0x02, 0x2B, 0x43, 0xA0, 0x10, 0xBB, 0x06, 0xF1, 0x9A, 0x98, 0x46, 0x44, 0xEC,
+0xF9, 0xAB, 0x61, 0x7C, 0x7A, 0x16, 0x6A, 0x5A, 0xBB, 0x46, 0xC4, 0xAA, 0x16, 0xE7, 0x96, 0xD4,
+0x65, 0x6B, 0x5A, 0x98, 0xCB, 0x8E, 0x97, 0x58, 0x88, 0x2C, 0xB7, 0x0C, 0x9B, 0x23, 0xB1, 0x9B,
+0x93, 0xF4, 0x26, 0xF7, 0xEE, 0xDE, 0x16, 0x1E, 0x3D, 0xB8, 0x5B, 0x02, 0x26, 0x8A, 0x58, 0xB7,
+0x2C, 0xB4, 0xA5, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x40,
+0xA0, 0x10, 0xBB, 0x65, 0xA6, 0x01, 0x95, 0x01, 0x2A, 0x70, 0x93, 0x20, 0x74, 0xA7, 0xAE, 0x0C,
+0x85, 0x49, 0x98, 0x61, 0xDB, 0x60, 0x26, 0x6D, 0x69, 0xA5, 0x2A, 0x67, 0xB2, 0x9C, 0xF9, 0xC8,
+0xF1, 0x8F, 0xFA, 0xD1, 0x31, 0xEA, 0x95, 0xFE, 0x75, 0xB8, 0x96, 0xCF, 0xC5, 0x63, 0xCE, 0x4C,
+0xA9, 0xD9, 0xAE, 0x14, 0x7A, 0x6B, 0xFA, 0xDF, 0xD1, 0x87, 0x8F, 0xC4, 0x8E, 0x91, 0xB0, 0x2D,
+0xB2, 0xA3, 0xC4, 0x57, 0x1E, 0xBB, 0x27, 0x6C, 0x59, 0xDF, 0x87, 0x3C, 0x79, 0xC5, 0x04, 0x5B,
+0x3E, 0xA9, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x34, 0x86, 0x40,
+0x21, 0x76, 0x0D, 0xE0, 0xC4, 0x3D, 0x61, 0xAF, 0x0E, 0x8F, 0x85, 0xAB, 0x23, 0x13, 0x61, 0x06,
+0x26, 0xD3, 0xB6, 0xB8, 0x8D, 0x98, 0xA5, 0x38, 0x89, 0x26, 0x59, 0xAB, 0x2C, 0xE6, 0x39, 0x51,
+0x35, 0x2E, 0x8F, 0x87, 0x8D, 0xCE, 0x76, 0xD9, 0x7D, 0xA9, 0xD2, 0x09, 0xA9, 0x43, 0xC9, 0x56,
+0x04, 0x49, 0xEC, 0xDF, 0xB6, 0x29, 0x3C, 0x72, 0x60, 0x47, 0x49, 0x6F, 0xD2, 0xC0, 0xD8, 0x94,
+0x22, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x24, 0x04, 0x0A, 0xB1,
+0x6B, 0x60, 0x36, 0x4C, 0xC2, 0x0C, 0xFB, 0xD1, 0xC5, 0x6B, 0x96, 0x94, 0x58, 0x73, 0xD7, 0xB5,
+0xFA, 0x2E, 0x12, 0x12, 0xFA, 0x5A, 0x55, 0xD5, 0xA8, 0xCE, 0x79, 0x12, 0x14, 0xD5, 0xEA, 0xF4,
+0x15, 0xF3, 0xD7, 0x69, 0x16, 0x3B, 0xD3, 0xEA, 0x28, 0xF8, 0xC1, 0xA1, 0x8E, 0xDB, 0x86, 0x49,
+0x9A, 0x13, 0xBC, 0x6E, 0x6F, 0x6B, 0x0F, 0x4F, 0x63, 0xEB, 0xB0, 0xED, 0x9B, 0xD6, 0x81, 0x40,
+0x16, 0xB5, 0xAE, 0x81, 0xE1, 0x29, 0x45, 0xEE, 0x30, 0x04, 0x5C, 0x45, 0xBF, 0xC3, 0xBA, 0x5D,
+0xBA, 0x5B, 0x10, 0x28, 0x08, 0x14, 0x04, 0x1A, 0x42, 0xA0, 0x10, 0xBB, 0x06, 0x60, 0x22, 0xB1,
+0x3B, 0x0E, 0xFF, 0xBA, 0x29, 0x28, 0x77, 0x4C, 0x71, 0x42, 0x0B, 0x76, 0x95, 0x72, 0x45, 0xAA,
+0xD6, 0x40, 0x6D, 0xB9, 0x54, 0x67, 0xFB, 0xC2, 0x8A, 0x29, 0x96, 0xE7, 0x5B, 0xC2, 0xA6, 0x81,
+0x5E, 0x44, 0xC3, 0xEE, 0x08, 0xEB, 0xFB, 0x7A, 0x4A, 0xD0, 0xC4, 0xCA, 0xD0, 0x2C, 0xA5, 0x0B,
+0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xC7, 0x23, 0x50, 0x88, 0xDD, 0x32, 0x53,
+0x80, 0xFE, 0x75, 0xDC, 0x17, 0xF6, 0xF0, 0xD9, 0xAB, 0x61, 0x1A, 0x5B, 0x41, 0x30, 0x68, 0xC2,
+0x0F, 0xDD, 0x74, 0x82, 0xB2, 0x9B, 0x3D, 0xC4, 0xC1, 0x4E, 0x4E, 0x8A, 0xDF, 0x9C, 0x44, 0xC7,
+0x8A, 0x56, 0xA7, 0x7A, 0x5D, 0x7A, 0xA5, 0x35, 0xCC, 0x43, 0xED, 0xA3, 0x6F, 0x1D, 0xDF, 0x67,
+0x5E, 0xBC, 0x56, 0x04, 0x4D, 0x1C, 0x40, 0xCE, 0xBA, 0x83, 0x3B, 0xB9, 0x6D, 0x58, 0x49, 0x46,
+0x7C, 0xC7, 0x7F, 0x3A, 0x0B, 0x00, 0x75, 0x11, 0x28, 0xF9, 0xEB, 0xCA, 0xC4, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x8B, 0x23, 0x50, 0x88, 0xDD, 0x32, 0xB3, 0x83, 0x89, 0x89, 0x87, 0xC7, 0x27,
+0xC3, 0xB9, 0x6B, 0x23, 0x30, 0x97, 0xC2, 0x07, 0x4E, 0xD2, 0x97, 0xB8, 0x59, 0x35, 0xBF, 0xD8,
+0x54, 0x3B, 0xFF, 0xE3, 0x89, 0xEB, 0x94, 0xE7, 0xC5, 0xC3, 0x78, 0x9F, 0xBD, 0x4E, 0xFE, 0x77,
+0x2C, 0xCE, 0x3D, 0x60, 0x1F, 0xDC, 0xBF, 0x1D, 0x29, 0x4E, 0xFA, 0x61, 0x86, 0x2D, 0x43, 0x53,
+0x3E, 0xB8, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xAC, 0x0C, 0x81,
+0xC2, 0x1E, 0x96, 0xC0, 0x8B, 0xAA, 0xDB, 0xAC, 0x04, 0x4E, 0x8C, 0x87, 0x21, 0xE4, 0xB1, 0xA3,
+0x2F, 0x1D, 0x01, 0x93, 0xDD, 0x24, 0xA8, 0xB8, 0xC9, 0x3F, 0xE6, 0x33, 0xA7, 0x2F, 0xAA, 0x81,
+0x12, 0x56, 0xB7, 0xEF, 0x4A, 0x91, 0xAB, 0x78, 0x49, 0xE8, 0xD3, 0x08, 0x5A, 0xD6, 0xDD, 0xDF,
+0xDD, 0x05, 0xFF, 0xBA, 0x3D, 0xA1, 0xBF, 0xEC, 0x09, 0xBB, 0xB2, 0x59, 0x5C, 0x4A, 0xDF, 0x31,
+0x08, 0x94, 0xFC, 0x75, 0x77, 0xCC, 0x50, 0x97, 0x8E, 0x16, 0x04, 0x0A, 0x02, 0x37, 0x88, 0x40,
+0x21, 0x76, 0xCB, 0x00, 0xC7, 0x34, 0x27, 0x67, 0x2E, 0x0F, 0x05, 0xE6, 0xB1, 0x53, 0xD3, 0x2A,
+0xD5, 0x3A, 0x66, 0x13, 0x4E, 0xE9, 0xEB, 0xCC, 0x3D, 0x2E, 0xAB, 0x69, 0x61, 0xC6, 0x3A, 0x5E,
+0x57, 0x59, 0x94, 0xA2, 0x05, 0xB7, 0x45, 0x22, 0x6D, 0x3B, 0xA0, 0xD6, 0xED, 0xDF, 0xB6, 0x31,
+0xEC, 0xDF, 0xBE, 0xB1, 0xEC, 0x09, 0x7B, 0x83, 0x93, 0xB9, 0x5C, 0x56, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x3B, 0x1D, 0x81, 0x42, 0xEC, 0x96, 0x99, 0x01, 0x13, 0x53, 0xD3,
+0xE1, 0xF0, 0xB9, 0x2B, 0x61, 0x1A, 0xE4, 0x4B, 0xFC, 0xEB, 0xE0, 0x13, 0xD7, 0xC2, 0x6D, 0x22,
+0xC4, 0xBE, 0x9A, 0x25, 0x32, 0xB1, 0xC8, 0xD8, 0x2C, 0xE6, 0x35, 0xD6, 0x9C, 0x76, 0x9F, 0xD0,
+0x77, 0x35, 0xCF, 0x9D, 0xAA, 0x7B, 0xA8, 0x0D, 0xD1, 0xB6, 0x73, 0xA2, 0xD2, 0x3D, 0x71, 0x70,
+0x07, 0x54, 0xBB, 0xCE, 0x3B, 0x7D, 0x4E, 0x96, 0xFE, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x70, 0x83, 0x08, 0x14, 0x62, 0xD7, 0x80, 0x62, 0x77, 0xE2, 0xD2, 0x20,
+0x4C, 0xB2, 0xBA, 0xFF, 0xAB, 0x26, 0x25, 0xB6, 0xE7, 0xA2, 0xDE, 0x29, 0xC1, 0xAB, 0x1E, 0xF5,
+0xF7, 0x98, 0x88, 0xBE, 0x76, 0xE6, 0x7F, 0xC7, 0xFD, 0x66, 0xC9, 0x10, 0x3B, 0x10, 0x34, 0xB1,
+0x19, 0xFB, 0xC1, 0xDE, 0xB7, 0x7B, 0x6B, 0xE8, 0xE9, 0x6C, 0xBF, 0xC1, 0xA1, 0x2C, 0x97, 0x15,
+0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xA7, 0x23, 0x50, 0x88, 0xDD,
+0x22, 0x33, 0x40, 0xFC, 0xE1, 0xA8, 0xA6, 0xC1, 0x14, 0x7B, 0xEE, 0xDA, 0x28, 0xA2, 0x57, 0x2D,
+0x60, 0xC2, 0x88, 0x9D, 0xBE, 0xAF, 0xC2, 0x9D, 0x44, 0xBB, 0x56, 0xB8, 0x5C, 0x4D, 0x32, 0x14,
+0x33, 0xDB, 0x56, 0x82, 0x28, 0x64, 0x47, 0x0A, 0x44, 0xC2, 0x22, 0x1A, 0x63, 0x3D, 0xD4, 0xBA,
+0x9D, 0x1B, 0xFA, 0xC3, 0x9E, 0xAD, 0xEB, 0xB1, 0x5D, 0x59, 0x89, 0x86, 0xBD, 0xD3, 0x3F, 0x94,
+0xA5, 0xFF, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8, 0x51, 0x04, 0x0A, 0xB1,
+0x5B, 0x02, 0xB9, 0x69, 0x6C, 0x1F, 0x76, 0x71, 0x70, 0x34, 0x0C, 0x8D, 0x4F, 0x69, 0x16, 0x13,
+0x9A, 0x61, 0x8D, 0xC1, 0x65, 0x41, 0xAF, 0x5A, 0x43, 0x7D, 0x91, 0x2E, 0xBE, 0xA7, 0x29, 0x4F,
+0xB2, 0xA2, 0x50, 0xEB, 0xE6, 0x61, 0xDA, 0xE5, 0xBE, 0xB0, 0x77, 0xC1, 0xB7, 0xEE, 0x9E, 0x5D,
+0x9B, 0xC3, 0x66, 0xE4, 0xB0, 0x2B, 0xD1, 0xB0, 0x37, 0x3A, 0x95, 0xCB, 0x75, 0x05, 0x81, 0x82,
+0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x62, 0xB7, 0xC4, 0x1C, 0x98, 0x40, 0xFE,
+0xBA, 0x23, 0xE7, 0xAE, 0x86, 0x19, 0x92, 0x3A, 0xEE, 0x0D, 0x8B, 0xDD, 0x21, 0x2C, 0x93, 0xB0,
+0xEE, 0x09, 0x6B, 0x34, 0xAF, 0x42, 0xD8, 0x2A, 0xF5, 0x39, 0x9D, 0x4B, 0x7B, 0xC5, 0x6A, 0xA0,
+0x85, 0x92, 0x3A, 0x3E, 0xEF, 0x6C, 0x6F, 0x87, 0x6F, 0xDD, 0xCE, 0xF0, 0xA9, 0x43, 0xBB, 0x43,
+0x5F, 0x77, 0x47, 0x99, 0x91, 0x05, 0x81, 0x82, 0xC0, 0x22, 0x08, 0x94, 0x1D, 0x27, 0xCA, 0xD4,
+0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xCB, 0x23, 0x50, 0x88, 0xDD, 0x52, 0xC4, 0x0E, 0x91, 0xB0,
+0x47, 0x2F, 0x5C, 0x47, 0xD4, 0x2A, 0xF3, 0xD7, 0x91, 0xC9, 0x31, 0x8D, 0x70, 0x22, 0x6B, 0xB5,
+0x42, 0xDD, 0xC2, 0x0D, 0xC0, 0xAC, 0xAC, 0xE5, 0x47, 0xC9, 0x45, 0x3D, 0xFA, 0xD7, 0x31, 0xCA,
+0xB6, 0x0F, 0xC1, 0x12, 0xF7, 0xEC, 0xDC, 0x14, 0x0E, 0xED, 0xD8, 0x28, 0x79, 0xEC, 0xCA, 0x51,
+0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x46, 0x11, 0x28,
+0xC4, 0x6E, 0x11, 0xE4, 0x48, 0xBA, 0x26, 0xE0, 0x5F, 0x77, 0xFC, 0x32, 0x02, 0x27, 0x40, 0xEC,
+0x64, 0x07, 0x09, 0x2A, 0x76, 0x62, 0x83, 0xD5, 0xA4, 0x27, 0xBE, 0xCB, 0x04, 0xCF, 0x49, 0x2E,
+0x3A, 0x96, 0xF1, 0xAD, 0x26, 0x48, 0xE6, 0x34, 0x41, 0x9D, 0x2A, 0x74, 0xFA, 0x4C, 0x89, 0x21,
+0x49, 0x22, 0x73, 0xE2, 0x41, 0xB5, 0xDB, 0xD0, 0xD7, 0x2D, 0x09, 0x89, 0x37, 0xAF, 0xEB, 0xC5,
+0x3E, 0xB1, 0x65, 0x38, 0x6E, 0x74, 0x22, 0x97, 0xEB, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0xE0, 0xA6, 0xA7, 0xE5, 0xA8, 0x8B, 0x00, 0x77, 0x99, 0x18, 0x1C, 0x9D,
+0x0C, 0x97, 0x91, 0x9C, 0x58, 0x02, 0x27, 0x24, 0xCD, 0x49, 0x8D, 0x23, 0x9D, 0xBD, 0x5C, 0xA8,
+0xD4, 0x59, 0x95, 0x99, 0x63, 0x5D, 0x25, 0x70, 0x42, 0x4C, 0xB1, 0x2D, 0xF0, 0xAF, 0x6B, 0x0D,
+0xBB, 0x36, 0xF5, 0x63, 0x7F, 0xD8, 0x9E, 0xD0, 0xD3, 0xD5, 0xAE, 0xAA, 0x60, 0x39, 0x0A, 0x02,
+0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x20, 0x02, 0x85, 0xD8,
+0xD5, 0x01, 0x8E, 0xBE, 0x3C, 0x53, 0x33, 0xB3, 0xE1, 0xFC, 0xF5, 0xD1, 0x30, 0xC6, 0x04, 0x76,
+0xD4, 0xDA, 0x66, 0x67, 0xEA, 0xC6, 0x47, 0x88, 0x16, 0x27, 0xEA, 0x9C, 0xA9, 0x71, 0x92, 0xB4,
+0x4E, 0x7D, 0xEA, 0xE2, 0x3E, 0x14, 0x46, 0xF0, 0x62, 0x3E, 0x3B, 0xF3, 0xCF, 0x63, 0x04, 0xEC,
+0x3D, 0x3B, 0x36, 0x85, 0x75, 0x65, 0xA7, 0x89, 0x1B, 0x9C, 0xBE, 0xE5, 0xB2, 0x3B, 0x09, 0x81,
+0xB2, 0x47, 0xEC, 0x9D, 0x34, 0xDA, 0xA5, 0xAF, 0x05, 0x81, 0x82, 0xC0, 0x8D, 0x22, 0x50, 0x88,
+0xDD, 0x22, 0xC8, 0x4D, 0x82, 0xD8, 0x9D, 0xC2, 0x8E, 0x13, 0xFC, 0x2B, 0xC7, 0x1C, 0x43, 0x28,
+0x92, 0x41, 0x35, 0x5D, 0x96, 0x87, 0x4E, 0x54, 0xBC, 0xE8, 0xA2, 0x37, 0x9E, 0x94, 0xCD, 0x8B,
+0xB5, 0x20, 0xA5, 0x09, 0xD4, 0x39, 0x12, 0xBB, 0x03, 0xDB, 0x37, 0x94, 0xA4, 0xC4, 0x37, 0x3A,
+0x7B, 0xCB, 0x75, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x54, 0x10,
+0x28, 0xC4, 0xAE, 0xCE, 0x84, 0x10, 0xFF, 0x3A, 0x44, 0xC4, 0x1E, 0xBE, 0x70, 0x4D, 0x02, 0x27,
+0x64, 0x2B, 0x31, 0xA4, 0x3E, 0xA9, 0x9F, 0x8C, 0x98, 0xA4, 0x8D, 0x2A, 0x9D, 0xFE, 0x15, 0x6B,
+0xAA, 0xE5, 0xA8, 0xA3, 0x6A, 0x57, 0x31, 0xAE, 0x9A, 0x29, 0x57, 0x76, 0xB0, 0x60, 0x62, 0xE2,
+0xD6, 0xB6, 0xB0, 0x7B, 0xF3, 0xBA, 0xD0, 0x5B, 0xA2, 0x61, 0xCB, 0xC7, 0xB2, 0x20, 0xB0, 0x24,
+0x02, 0x65, 0x8F, 0xD8, 0x32, 0x41, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x63, 0x08, 0x14, 0x62,
+0x57, 0x07, 0x27, 0xF2, 0xAF, 0x31, 0x10, 0xBB, 0xD3, 0xD7, 0xC6, 0x02, 0x36, 0x9C, 0x50, 0xDF,
+0xBA, 0x39, 0xDD, 0x1F, 0xD6, 0x0F, 0x4F, 0x4E, 0xCC, 0xD7, 0x1A, 0xF4, 0xEA, 0xE6, 0x58, 0x57,
+0xE7, 0x52, 0x61, 0x29, 0x2B, 0xFF, 0xB0, 0x32, 0x94, 0x6C, 0x6D, 0x45, 0x62, 0xE2, 0xD6, 0xB0,
+0xAE, 0xB7, 0x2B, 0x6C, 0x44, 0xF0, 0x44, 0x47, 0x09, 0x9A, 0x68, 0x6C, 0xB6, 0x96, 0x52, 0x05,
+0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x2C, 0x89, 0x40, 0x21, 0x76, 0x35,
+0xF0, 0x50, 0x19, 0x98, 0x43, 0xA0, 0xC4, 0x08, 0x92, 0x12, 0x5F, 0x45, 0xF0, 0x84, 0x88, 0x6C,
+0x88, 0x86, 0xA5, 0xBF, 0x9C, 0x64, 0x3C, 0xF1, 0x3D, 0x61, 0x2D, 0x12, 0x36, 0x06, 0xBF, 0xC6,
+0xD4, 0xC5, 0x22, 0xC6, 0x81, 0xC3, 0x99, 0x8A, 0xA7, 0x2F, 0x55, 0xD4, 0x13, 0x4B, 0x2E, 0x9F,
+0x68, 0x62, 0xE2, 0x1D, 0xD8, 0x6D, 0xA2, 0xEC, 0x34, 0x51, 0x3E, 0xA1, 0x05, 0x81, 0xE5, 0x11,
+0x28, 0xFE, 0x75, 0xCB, 0x63, 0x54, 0x4A, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x01, 0x22, 0x50, 0x88,
+0x5D, 0x9D, 0x79, 0x30, 0x3D, 0x33, 0x17, 0xCE, 0x21, 0x70, 0x62, 0x74, 0x52, 0x52, 0x13, 0x23,
+0x70, 0x62, 0x3A, 0x05, 0x47, 0x98, 0x20, 0xA7, 0x7A, 0x5C, 0x4D, 0x94, 0xEC, 0x72, 0x73, 0xCA,
+0x48, 0x9D, 0xEE, 0x38, 0x81, 0x88, 0x58, 0xA4, 0x39, 0xE9, 0x6C, 0x2F, 0x43, 0xB0, 0x1C, 0x6C,
+0xE5, 0xFD, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x1A, 0x43, 0xA0,
+0xB0, 0x8A, 0x3A, 0x38, 0x8D, 0x23, 0x31, 0xF1, 0x91, 0x0B, 0x83, 0x61, 0x06, 0xAA, 0x1C, 0x53,
+0x90, 0xB4, 0x80, 0xD8, 0x49, 0xF4, 0x6B, 0xCE, 0xE3, 0x20, 0xBF, 0x69, 0x4A, 0x3B, 0xF3, 0xA3,
+0x63, 0x4A, 0x14, 0x77, 0xA8, 0xB3, 0x18, 0x0B, 0xAA, 0x7F, 0x9E, 0xF1, 0x84, 0xE6, 0x5C, 0xB9,
+0x9C, 0x3B, 0x4E, 0xA0, 0x60, 0x3B, 0xFC, 0xEB, 0x76, 0x6D, 0x1C, 0x00, 0xB1, 0x2B, 0x7B, 0xC3,
+0x36, 0x36, 0x55, 0x4B, 0xA9, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x96, 0x43, 0xA0, 0x10, 0xBB, 0x3A, 0x08, 0x4D, 0x32, 0x31, 0xF1, 0xA5, 0xE1, 0x30, 0x43, 0x07,
+0x3B, 0xB2, 0x37, 0xA4, 0x3A, 0x91, 0xBF, 0x0B, 0x04, 0xBA, 0xEC, 0x44, 0x5D, 0xF1, 0x4E, 0x69,
+0x9D, 0xFC, 0xE7, 0x39, 0xF0, 0x2C, 0x70, 0xA2, 0x1D, 0x4A, 0xDD, 0x8E, 0x0D, 0x7D, 0x85, 0xD8,
+0x2D, 0x37, 0x43, 0xCB, 0xFB, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08,
+0x34, 0x8C, 0x40, 0x21, 0x76, 0x06, 0x95, 0xA8, 0x6B, 0xA2, 0xBA, 0xB5, 0x20, 0xC5, 0xC9, 0x5C,
+0x38, 0x79, 0x6D, 0x14, 0x8A, 0x1D, 0xFD, 0xE2, 0xB8, 0x3F, 0xAC, 0xA5, 0x3C, 0x51, 0x6F, 0x39,
+0x7D, 0x88, 0xD3, 0x9C, 0xC7, 0xC9, 0xDA, 0xCE, 0x14, 0xF6, 0x9E, 0xF8, 0xE1, 0x59, 0x5D, 0x52,
+0xC2, 0x7D, 0xEB, 0xF8, 0x14, 0xBE, 0x75, 0x9E, 0xEA, 0x64, 0xDB, 0xFA, 0x9E, 0x12, 0x38, 0xD1,
+0xF0, 0x54, 0x2D, 0x05, 0xEF, 0x54, 0x04, 0x4A, 0x44, 0xEC, 0x9D, 0x3A, 0xF2, 0xA5, 0xDF, 0x05,
+0x81, 0x82, 0xC0, 0x8D, 0x20, 0x50, 0x88, 0x5D, 0x0D, 0x6A, 0x33, 0xB3, 0x73, 0xE1, 0xEA, 0xC8,
+0x44, 0xB8, 0x36, 0x36, 0x85, 0x20, 0x0A, 0xBC, 0x09, 0x33, 0xEC, 0xBC, 0xEC, 0x11, 0xEB, 0x87,
+0x49, 0x73, 0x95, 0x3F, 0x66, 0x66, 0x35, 0x62, 0xA7, 0x64, 0x2E, 0x97, 0xF0, 0x94, 0xF8, 0x49,
+0xFA, 0x13, 0x2A, 0x76, 0x78, 0x74, 0xB6, 0xB7, 0x4B, 0x62, 0xE2, 0xB6, 0xD6, 0xB2, 0xDB, 0xC4,
+0x8D, 0x4C, 0xDC, 0x72, 0x4D, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02,
+0x0B, 0x11, 0x28, 0xC4, 0xAE, 0x06, 0x13, 0x26, 0x24, 0x3E, 0x79, 0x79, 0x44, 0xCC, 0xB0, 0x54,
+0xEF, 0xE6, 0x67, 0xA6, 0xE2, 0x56, 0x62, 0xE6, 0x3A, 0x57, 0x93, 0x9B, 0x2E, 0x6E, 0x1F, 0xAB,
+0xFB, 0xC7, 0x66, 0xB9, 0xEB, 0xA2, 0x7F, 0x9D, 0x47, 0xD2, 0xF2, 0x5D, 0x28, 0x76, 0xAD, 0x20,
+0x73, 0xDD, 0x20, 0x76, 0x8C, 0x88, 0x2D, 0xD1, 0x7E, 0xE5, 0x63, 0x59, 0x10, 0x58, 0x1C, 0x01,
+0x57, 0xD1, 0x0B, 0x46, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xD0, 0x18, 0x02, 0xF0, 0xE9,
+0xAF, 0xDD, 0x00, 0xB5, 0xB1, 0x0B, 0xD7, 0x5A, 0x29, 0x87, 0xE1, 0x1A, 0x52, 0x9C, 0xFC, 0xF6,
+0x73, 0x1F, 0x86, 0xFF, 0xF5, 0xD5, 0xE3, 0x61, 0x72, 0x12, 0xE9, 0x4E, 0xAE, 0x9D, 0x0F, 0x61,
+0x72, 0x4C, 0xF3, 0xCF, 0xCD, 0xB7, 0x42, 0x6C, 0xF3, 0xC8, 0x08, 0x90, 0x3E, 0x10, 0xB4, 0x56,
+0x98, 0x64, 0xE7, 0x19, 0x48, 0x21, 0x4A, 0x1C, 0x5E, 0x4B, 0x30, 0x05, 0xCE, 0xD1, 0xB4, 0x8B,
+0x5C, 0x75, 0x3C, 0x24, 0xC1, 0xB1, 0xE4, 0x40, 0xC1, 0xEB, 0x81, 0x8D, 0x61, 0xBE, 0xBD, 0x23,
+0x3C, 0xB8, 0x63, 0x43, 0xF8, 0xBF, 0xFD, 0xFA, 0x33, 0x61, 0xEF, 0xE6, 0xFE, 0xA6, 0x42, 0xC9,
+0x7D, 0x6F, 0xC7, 0xA7, 0x66, 0xC3, 0xE8, 0xC4, 0x14, 0x92, 0x2F, 0xE7, 0x4A, 0xA4, 0xA6, 0x65,
+0xF1, 0x43, 0xF5, 0x46, 0x0B, 0x0C, 0xF9, 0xD8, 0xA2, 0xA2, 0x56, 0x10, 0xAB, 0x59, 0x71, 0x7D,
+0x59, 0x54, 0x8A, 0x99, 0xB9, 0x35, 0xF7, 0x4C, 0x6A, 0xAF, 0xBF, 0x5C, 0x71, 0xD5, 0x4D, 0x45,
+0xBF, 0x7A, 0x33, 0x12, 0xFC, 0x75, 0x48, 0x4E, 0xCD, 0x00, 0x9A, 0x66, 0xB7, 0x9B, 0xF3, 0x73,
+0x7C, 0x72, 0x3A, 0x0C, 0x8D, 0x4F, 0x86, 0x69, 0xDF, 0x5D, 0xC5, 0x9B, 0xE7, 0x01, 0x41, 0x79,
+0x73, 0x6B, 0xCF, 0xC5, 0x48, 0xA1, 0x2C, 0x09, 0xB7, 0x75, 0x42, 0xFE, 0xA4, 0x7F, 0x6C, 0xEE,
+0xD7, 0x00, 0x5D, 0x53, 0x1F, 0x6B, 0xE9, 0xE9, 0x6C, 0x0B, 0x7D, 0x35, 0x7B, 0x26, 0x17, 0x62,
+0x77, 0x0B, 0x27, 0x68, 0xB9, 0x75, 0x41, 0xA0, 0x20, 0xF0, 0x89, 0x44, 0xA0, 0x10, 0xBB, 0x9A,
+0x61, 0x3B, 0x8B, 0x34, 0x27, 0xFF, 0xF5, 0x9F, 0xBF, 0x16, 0x5E, 0x3A, 0x71, 0x39, 0xCC, 0x4E,
+0x4D, 0x86, 0xB9, 0xCB, 0xA7, 0x11, 0x15, 0x3B, 0x85, 0x52, 0x4A, 0xDC, 0x48, 0xE2, 0x94, 0xE5,
+0x61, 0x29, 0xA2, 0x19, 0x95, 0x7E, 0x78, 0xF8, 0x3B, 0x47, 0x9F, 0x3B, 0x14, 0x41, 0xEA, 0x61,
+0xF5, 0xBD, 0x63, 0x31, 0xD3, 0x43, 0xA9, 0xE4, 0x91, 0xF0, 0xCD, 0x23, 0x12, 0xB6, 0x65, 0xDD,
+0xE6, 0xD0, 0xDA, 0xDE, 0x19, 0x3E, 0x73, 0x60, 0x6B, 0xF8, 0xCF, 0x7E, 0xF1, 0x89, 0xB0, 0x13,
+0x01, 0x14, 0xCD, 0x3C, 0xA6, 0x61, 0x6A, 0x3E, 0x7B, 0x75, 0x24, 0x1C, 0xBD, 0x70, 0x3D, 0x8C,
+0x4C, 0xB2, 0x5F, 0x71, 0x35, 0x4F, 0xB9, 0x6F, 0x22, 0x67, 0x5A, 0x8A, 0xD8, 0xA9, 0xBF, 0x61,
+0x5C, 0xD6, 0x6D, 0x51, 0x97, 0xBE, 0xA6, 0x2A, 0xED, 0xD9, 0x72, 0xC4, 0x8E, 0xA4, 0xD7, 0x83,
+0x53, 0x78, 0xB5, 0x6A, 0x9F, 0x72, 0xC8, 0x4B, 0xAF, 0x91, 0x60, 0xDB, 0x7D, 0x17, 0x10, 0x3B,
+0x89, 0x5B, 0x5E, 0x48, 0x90, 0x64, 0xBC, 0x70, 0xFD, 0x52, 0x81, 0x2F, 0xCD, 0x1C, 0x80, 0xEC,
+0x5E, 0x5D, 0x1D, 0x6D, 0xE1, 0x01, 0x10, 0xFC, 0x2D, 0xFD, 0x5D, 0xA2, 0xE2, 0x36, 0xF3, 0x98,
+0xC1, 0x4E, 0x2A, 0xA7, 0x2F, 0x0D, 0x86, 0xF7, 0xCE, 0x5C, 0x0C, 0xD7, 0x47, 0xC6, 0x2D, 0x77,
+0x36, 0xE7, 0xB7, 0xCE, 0xEB, 0x34, 0x86, 0x74, 0x1F, 0xB0, 0x07, 0x1B, 0x28, 0x29, 0x7B, 0xF2,
+0xD7, 0x54, 0x9D, 0xB5, 0xE5, 0xFA, 0x17, 0x9F, 0x00, 0x62, 0x2E, 0xFD, 0xD1, 0xCF, 0x42, 0x9B,
+0x5C, 0xA3, 0x3F, 0x70, 0x78, 0xC8, 0xAC, 0x89, 0xF7, 0xD0, 0x73, 0x2C, 0xB3, 0x77, 0x53, 0x5F,
+0xB8, 0x6B, 0x0B, 0x23, 0xC5, 0x93, 0x21, 0xA1, 0x10, 0xBB, 0x66, 0xCE, 0x8A, 0x72, 0xAF, 0x82,
+0x40, 0x41, 0x60, 0x2D, 0x20, 0x50, 0x88, 0x5D, 0x36, 0x8A, 0xB3, 0x70, 0xAA, 0x3B, 0x7A, 0x71,
+0x28, 0xFC, 0x57, 0x7F, 0xF0, 0x52, 0x38, 0x71, 0x65, 0x24, 0xCC, 0x43, 0xA9, 0x13, 0x62, 0xC7,
+0x00, 0x0A, 0x61, 0x6D, 0x89, 0xD8, 0xCD, 0x83, 0xC8, 0x71, 0x31, 0x96, 0x85, 0x07, 0xCA, 0x1C,
+0x5F, 0x8B, 0x68, 0x07, 0x12, 0x42, 0x25, 0xCF, 0xF9, 0x84, 0x2C, 0x64, 0x5C, 0xE7, 0x58, 0xA6,
+0xAD, 0x3D, 0x84, 0x75, 0x5B, 0x42, 0x47, 0x47, 0x67, 0xF8, 0xEA, 0x03, 0xBB, 0xC2, 0x3F, 0xF9,
+0xEA, 0xC3, 0x61, 0xDB, 0xBA, 0x9E, 0xA6, 0xCC, 0x23, 0xF2, 0x1A, 0x6E, 0x93, 0x76, 0xF2, 0xF2,
+0x60, 0x38, 0x7C, 0xFE, 0x7A, 0x38, 0x06, 0x62, 0x37, 0x3A, 0x85, 0xFC, 0x7C, 0xF1, 0xA8, 0x12,
+0x32, 0x57, 0xEC, 0x64, 0x89, 0x5D, 0xC0, 0x39, 0x74, 0x71, 0x77, 0x62, 0x57, 0xE5, 0x58, 0xB6,
+0xAD, 0x5A, 0xDE, 0x2B, 0x89, 0x04, 0x76, 0x43, 0xB5, 0xC5, 0x9D, 0x54, 0x2A, 0xB5, 0x85, 0x3F,
+0x0B, 0x32, 0xA9, 0x12, 0xBB, 0xAC, 0x01, 0x91, 0xD8, 0xE5, 0x64, 0xCD, 0xC7, 0xA0, 0xA6, 0xA9,
+0xBC, 0x0C, 0x03, 0x91, 0xF5, 0x4C, 0x09, 0xC8, 0x52, 0x88, 0xE7, 0x6F, 0x66, 0xED, 0xB9, 0xA9,
+0x83, 0x64, 0x24, 0xB3, 0x0B, 0x0A, 0xD5, 0x63, 0xBB, 0x37, 0x86, 0x47, 0xF7, 0x6C, 0x0A, 0xDD,
+0x20, 0x79, 0xCD, 0x3A, 0xA8, 0xD4, 0x9D, 0xBC, 0x74, 0x2D, 0xBC, 0xFB, 0xD1, 0xF9, 0xF0, 0xDE,
+0xE9, 0x4B, 0x61, 0x70, 0x8C, 0xC4, 0x4E, 0xC9, 0x1A, 0x27, 0x31, 0xE7, 0xB5, 0x93, 0x30, 0x27,
+0x75, 0xF1, 0x1C, 0xDE, 0x8F, 0x44, 0x8F, 0xE5, 0xF9, 0x63, 0xC5, 0xD4, 0x37, 0xE1, 0x72, 0xBC,
+0x5E, 0x38, 0x1D, 0xEB, 0xD0, 0x40, 0x21, 0xFA, 0x91, 0xB2, 0x0C, 0x3F, 0x03, 0xF2, 0x79, 0x88,
+0xC4, 0x8E, 0x9F, 0x19, 0x3D, 0xD7, 0x86, 0x6B, 0xF6, 0x43, 0xBD, 0xE6, 0x0F, 0x9E, 0x8D, 0x7D,
+0x20, 0xBA, 0x4E, 0x02, 0x2D, 0x08, 0xA9, 0x59, 0xD8, 0x94, 0xFB, 0x14, 0x04, 0x0A, 0x02, 0x05,
+0x81, 0x4F, 0x3A, 0x02, 0x85, 0xD8, 0x71, 0xA1, 0xB1, 0xC5, 0x63, 0x02, 0x69, 0x4E, 0xDE, 0xF8,
+0xE8, 0x4A, 0xF8, 0xA7, 0x7F, 0xFA, 0x6A, 0xB8, 0x82, 0x00, 0x8A, 0x30, 0x7A, 0x2D, 0xCC, 0x5D,
+0xBF, 0x68, 0x3E, 0x76, 0x5C, 0xC4, 0x94, 0xCC, 0x90, 0x1A, 0x88, 0xB2, 0x61, 0x24, 0x83, 0xA4,
+0x8F, 0xAF, 0x45, 0xC0, 0x13, 0x73, 0xAD, 0x97, 0x33, 0xE5, 0xC1, 0x59, 0x1E, 0x94, 0xBA, 0x96,
+0xF5, 0x5B, 0x43, 0x57, 0x67, 0x47, 0xF8, 0xD5, 0xC7, 0xF7, 0x85, 0x7F, 0xF8, 0xEC, 0x7D, 0x61,
+0x53, 0x7F, 0x77, 0x53, 0xE6, 0x10, 0x4D, 0xB0, 0xE7, 0x10, 0xE9, 0xFB, 0xA7, 0x2F, 0x7D, 0x10,
+0x3E, 0x38, 0x7F, 0x0D, 0xE6, 0xD8, 0x69, 0xD9, 0x25, 0x2D, 0x97, 0xD7, 0x84, 0xD3, 0xB8, 0xFA,
+0x22, 0xE6, 0x64, 0xB5, 0x1E, 0x8B, 0x49, 0xB6, 0xD6, 0xC1, 0x30, 0x9A, 0xA5, 0x55, 0x89, 0x91,
+0xB2, 0x5E, 0x41, 0x24, 0x47, 0xB9, 0xE2, 0xA7, 0xCA, 0x99, 0x50, 0x3C, 0xE1, 0x71, 0x35, 0x0C,
+0x8A, 0x84, 0x41, 0xEE, 0x61, 0x44, 0xCC, 0xDF, 0xCE, 0x1A, 0xA5, 0x4F, 0x95, 0x4C, 0xB7, 0x0A,
+0x8B, 0x76, 0x61, 0x34, 0x36, 0x34, 0xAA, 0x76, 0x7E, 0x99, 0xDE, 0xD5, 0x89, 0xA8, 0x95, 0x97,
+0xE1, 0xC9, 0xEE, 0xEF, 0x8D, 0xE2, 0xD5, 0x52, 0xAD, 0x4B, 0xAD, 0xA9, 0xDE, 0x0A, 0x19, 0x5C,
+0x8C, 0x19, 0x46, 0xF3, 0xA4, 0x0E, 0xA9, 0xCF, 0x82, 0x0C, 0x56, 0x39, 0x1F, 0x33, 0xDF, 0xA0,
+0xC0, 0xBE, 0x8D, 0x7D, 0xE1, 0xEF, 0x3E, 0x75, 0x20, 0x6C, 0x06, 0x99, 0x69, 0xD6, 0x71, 0xFA,
+0xD2, 0xF5, 0xF0, 0xE7, 0x2F, 0xBC, 0x13, 0x5E, 0x38, 0x7C, 0x32, 0x0C, 0xC3, 0x14, 0x3B, 0xC7,
+0xFD, 0x90, 0x49, 0xD0, 0xD8, 0x66, 0xFA, 0x80, 0x0A, 0x61, 0xD3, 0x11, 0x12, 0xEC, 0x40, 0xBE,
+0xDA, 0xF0, 0x90, 0xF9, 0xCE, 0xBF, 0x44, 0x08, 0x09, 0xB6, 0x85, 0xD0, 0xD9, 0x79, 0x39, 0x67,
+0xC4, 0x50, 0x76, 0xC8, 0x03, 0xA9, 0x6B, 0x01, 0x5B, 0x23, 0x96, 0x5E, 0x96, 0xC4, 0x4E, 0x05,
+0x3F, 0x57, 0x01, 0xE9, 0x6F, 0xAA, 0x58, 0x73, 0x2A, 0x6E, 0xEA, 0xED, 0x0C, 0xBF, 0xF2, 0xD8,
+0xBE, 0x70, 0x70, 0xEB, 0x40, 0xE8, 0x2A, 0xF9, 0x1D, 0x9B, 0x35, 0x1D, 0xCA, 0x7D, 0x0A, 0x02,
+0x05, 0x81, 0x35, 0x86, 0x40, 0x21, 0x76, 0xB2, 0xD0, 0x6A, 0xA0, 0x04, 0xFD, 0xEB, 0xFE, 0xFA,
+0xBD, 0x73, 0xE1, 0xBF, 0xFF, 0xDE, 0xBB, 0x61, 0x04, 0x3E, 0x68, 0xF3, 0x83, 0x17, 0xC2, 0xFC,
+0xC8, 0x35, 0xA3, 0x20, 0x46, 0x0E, 0x8C, 0xC1, 0xE4, 0xC4, 0x8E, 0x64, 0x4E, 0x15, 0x0A, 0x56,
+0x96, 0x11, 0x3B, 0x9E, 0x97, 0xD5, 0x52, 0x36, 0x24, 0x0B, 0x2D, 0x9D, 0xDD, 0x30, 0xC5, 0x6E,
+0x0D, 0xBD, 0x5D, 0x1D, 0xE1, 0xEF, 0x7F, 0xE6, 0x50, 0xF8, 0x8D, 0x4F, 0x1F, 0x0A, 0xEB, 0xB1,
+0x98, 0xAD, 0xF6, 0x41, 0x72, 0x43, 0x9F, 0xBA, 0x17, 0x0F, 0x9F, 0x09, 0x7F, 0xF8, 0xC2, 0x07,
+0xE1, 0xD4, 0xB5, 0x61, 0x31, 0x7D, 0xC9, 0xD2, 0x9D, 0xAC, 0x5E, 0xF2, 0xDA, 0x49, 0x97, 0x92,
+0x12, 0xF6, 0x49, 0x19, 0x5D, 0xC6, 0xD5, 0xAC, 0xB9, 0xDA, 0x5F, 0x21, 0x4E, 0x4C, 0xBA, 0x5C,
+0x97, 0xD8, 0xD9, 0x95, 0x72, 0x71, 0xA4, 0x58, 0x6A, 0x96, 0xD3, 0x7F, 0x94, 0xE8, 0xF0, 0x4E,
+0x24, 0x76, 0xF6, 0x4A, 0x22, 0x87, 0xFD, 0xC8, 0xC8, 0x52, 0x7E, 0x4D, 0xE5, 0xB9, 0xB3, 0xB8,
+0x5A, 0x12, 0xC8, 0x3A, 0xFC, 0x5E, 0x89, 0xB1, 0x2A, 0xB9, 0xC8, 0x89, 0xA5, 0x5C, 0x47, 0x62,
+0x59, 0x43, 0xEC, 0xD4, 0xCE, 0x2E, 0x2D, 0x49, 0x5C, 0x4E, 0xDB, 0x9D, 0xE3, 0x91, 0x4C, 0xC0,
+0x76, 0x36, 0xFB, 0xE3, 0x16, 0xE0, 0xFC, 0x7A, 0x7F, 0x4E, 0xB2, 0xBD, 0xB9, 0xAF, 0x33, 0xFC,
+0x93, 0x2F, 0x3D, 0x10, 0x76, 0x6D, 0xE8, 0x5D, 0xED, 0x69, 0x10, 0xA6, 0x90, 0x78, 0xFB, 0x02,
+0xC6, 0xFE, 0xBD, 0x93, 0xE7, 0xC3, 0x1F, 0xFD, 0xF8, 0xAD, 0xF0, 0xD6, 0xC9, 0x73, 0x82, 0x7B,
+0x3B, 0x02, 0x79, 0x5A, 0x41, 0xEC, 0x94, 0xC3, 0x51, 0x71, 0xB3, 0xF9, 0x6C, 0x23, 0x4F, 0xF2,
+0xA6, 0xA4, 0x0C, 0xA8, 0x81, 0xF8, 0x09, 0xE1, 0x73, 0xA5, 0xCE, 0xCF, 0x47, 0xB2, 0xA6, 0x4A,
+0x36, 0xD5, 0x3A, 0x0A, 0x76, 0xAD, 0xFC, 0x6B, 0x65, 0x84, 0x1C, 0x56, 0xD4, 0x40, 0x7D, 0x4F,
+0x94, 0x6F, 0xD4, 0xD9, 0xDB, 0xD1, 0x1E, 0xFE, 0xEE, 0xA7, 0x0E, 0x84, 0x47, 0xA0, 0x62, 0xD2,
+0xD7, 0xAE, 0x1C, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xB0, 0x72, 0x04, 0xB2, 0x15, 0x74,
+0xE5, 0x17, 0xAF, 0xB5, 0x2B, 0x86, 0x26, 0xA6, 0xC3, 0x61, 0x98, 0x62, 0x99, 0xBF, 0x4E, 0x44,
+0xB7, 0xE9, 0x89, 0x2C, 0xB1, 0x70, 0x64, 0x1A, 0xF6, 0x04, 0x85, 0x74, 0xEB, 0x89, 0x48, 0x48,
+0x54, 0x2E, 0xE2, 0x3F, 0xBE, 0xD4, 0xA7, 0xE7, 0x4A, 0x44, 0xDA, 0x24, 0xC8, 0x82, 0x8B, 0x59,
+0x1F, 0x9C, 0xE6, 0x9B, 0xE5, 0x57, 0x35, 0x0F, 0x45, 0xE6, 0xCA, 0xD0, 0x58, 0xF8, 0x9B, 0x77,
+0x4E, 0x84, 0xCB, 0x43, 0x23, 0xA1, 0xBD, 0x65, 0x0E, 0xAD, 0x99, 0x43, 0x7A, 0xBE, 0x19, 0x64,
+0x73, 0x99, 0xD5, 0xC7, 0x0C, 0x9E, 0xC3, 0x89, 0x3E, 0xFF, 0x3B, 0x07, 0x3F, 0xAC, 0x78, 0x8E,
+0xCF, 0xFD, 0x35, 0xFC, 0xF4, 0xD2, 0xF3, 0xD9, 0x30, 0xC3, 0xEB, 0xFC, 0xFD, 0x78, 0x4D, 0xCD,
+0x39, 0xBB, 0x86, 0xBE, 0x5D, 0x2C, 0xCB, 0xBF, 0xFE, 0x98, 0x45, 0x04, 0xB2, 0x9E, 0x43, 0xBD,
+0x00, 0x9F, 0x7F, 0xE5, 0x81, 0x7C, 0x82, 0x5A, 0x2F, 0xFF, 0xF2, 0xB5, 0x95, 0x41, 0xF9, 0xF8,
+0x5C, 0xCE, 0xE1, 0x7A, 0x29, 0xCB, 0x3E, 0xCD, 0xCA, 0x43, 0xEE, 0x23, 0xE7, 0xB4, 0x6E, 0xED,
+0x87, 0xD5, 0x35, 0xED, 0xF5, 0x66, 0x75, 0xC7, 0xF6, 0xE7, 0xEF, 0xD5, 0xF6, 0xA1, 0xFE, 0x6B,
+0xBF, 0x67, 0xED, 0x5F, 0xDE, 0x77, 0x5E, 0x1E, 0xD8, 0x7F, 0x98, 0x6D, 0x43, 0xDA, 0x1C, 0x8E,
+0x85, 0x52, 0x66, 0xA8, 0x8E, 0x78, 0xCC, 0x42, 0x36, 0x65, 0x5B, 0x9B, 0x11, 0xC3, 0x34, 0x02,
+0x75, 0xEE, 0x47, 0x6F, 0x1F, 0x0D, 0xDF, 0x7B, 0xFD, 0x83, 0x70, 0xFA, 0xF2, 0x35, 0x31, 0x7F,
+0x76, 0xE0, 0x1F, 0xEE, 0x5B, 0x1C, 0x1F, 0x46, 0xE2, 0x48, 0xFC, 0x85, 0xE4, 0xF1, 0xBD, 0x8C,
+0xBC, 0x49, 0x70, 0x50, 0x8D, 0x39, 0xD6, 0x03, 0x86, 0xF4, 0xA7, 0x82, 0xFD, 0x27, 0xBF, 0x0C,
+0x54, 0xE9, 0x25, 0x61, 0x16, 0xD2, 0xCC, 0x80, 0x22, 0xF4, 0x9F, 0x78, 0xC4, 0x71, 0x91, 0xBE,
+0xCF, 0xC9, 0x0F, 0x0D, 0x7E, 0x1E, 0xA8, 0x9A, 0xD3, 0x25, 0x82, 0x47, 0x33, 0x30, 0x59, 0x6B,
+0xDF, 0x61, 0xA5, 0x3F, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x10, 0x3B, 0x9B, 0x03, 0x54, 0x4F,
+0x46, 0x40, 0xEC, 0x4E, 0x5D, 0x1B, 0xC3, 0xC2, 0x82, 0x93, 0x4C, 0x4A, 0x0C, 0xB2, 0x53, 0xCD,
+0x47, 0x97, 0x4F, 0x18, 0x27, 0x76, 0x7A, 0x8E, 0x0B, 0xB5, 0x70, 0x3A, 0x5D, 0x92, 0x6A, 0xFE,
+0x5A, 0x19, 0x53, 0x9F, 0xB8, 0x30, 0xF6, 0xC0, 0x1C, 0xEB, 0x7E, 0x44, 0xAB, 0x3D, 0x0D, 0x27,
+0xD1, 0x8F, 0x23, 0x67, 0x2F, 0xCB, 0x63, 0x74, 0x62, 0x22, 0xCC, 0x60, 0xF1, 0x9C, 0xC4, 0x3E,
+0xB8, 0x13, 0x30, 0xC7, 0xFA, 0x23, 0xBE, 0x96, 0xF3, 0x33, 0x88, 0x98, 0xD4, 0xBF, 0x13, 0xD9,
+0x6B, 0x9E, 0x1B, 0xE7, 0x39, 0x44, 0xD5, 0xF2, 0xC1, 0xE8, 0xDA, 0x89, 0xA9, 0x39, 0xFB, 0xAB,
+0xAF, 0x17, 0x7F, 0xCC, 0x69, 0xD9, 0xE9, 0xF9, 0x30, 0x36, 0x85, 0x88, 0x4C, 0xFC, 0x1D, 0xE7,
+0x5F, 0x7B, 0xCE, 0x73, 0x63, 0x7C, 0x8F, 0xE7, 0xE5, 0x6F, 0xB0, 0x47, 0x3A, 0x3F, 0x06, 0xD2,
+0x97, 0xCE, 0xDB, 0xFB, 0x18, 0xA2, 0x71, 0x2B, 0xCB, 0xBF, 0x52, 0xAF, 0x3F, 0xF0, 0x1E, 0x86,
+0x54, 0xDE, 0xF7, 0xF7, 0xD2, 0xEB, 0x54, 0x6E, 0x02, 0xE5, 0xF9, 0x18, 0x47, 0xFD, 0xFA, 0x1C,
+0x6D, 0xC5, 0x63, 0x12, 0xAF, 0x27, 0xF9, 0xD7, 0x5F, 0xCB, 0x39, 0x7D, 0x9D, 0x1E, 0x2C, 0xE3,
+0x8F, 0xDA, 0xF7, 0x16, 0xBE, 0x9E, 0x32, 0xF2, 0x39, 0x8F, 0xF9, 0x45, 0x42, 0xD3, 0x1E, 0x4D,
+0xFA, 0xAB, 0x3B, 0x0B, 0x38, 0xBF, 0xAF, 0x8F, 0x8E, 0x87, 0xB7, 0x3F, 0x3A, 0x17, 0xDE, 0x81,
+0x6F, 0x1D, 0xFD, 0xEA, 0x5A, 0x11, 0x9D, 0xDD, 0xDA, 0xD5, 0x1F, 0x5A, 0xBA, 0x10, 0xC0, 0xD3,
+0xD9, 0x1B, 0x5A, 0x3A, 0xF0, 0xB7, 0xA3, 0x37, 0xCC, 0xF3, 0xD1, 0xDE, 0x03, 0x9F, 0xD0, 0x9E,
+0x30, 0xD7, 0xD6, 0x1D, 0x66, 0xF1, 0x98, 0x69, 0xEB, 0x0A, 0x33, 0xAD, 0x78, 0xB4, 0x74, 0x86,
+0xE9, 0xD6, 0xCE, 0x30, 0x15, 0xDA, 0xE5, 0x31, 0x39, 0xDF, 0x26, 0x8F, 0x29, 0xA8, 0xD3, 0x13,
+0x73, 0x78, 0xCC, 0xB6, 0x86, 0xF1, 0xD9, 0x16, 0x60, 0xC9, 0x07, 0x70, 0x97, 0x31, 0x9B, 0x87,
+0x3F, 0xE7, 0x1C, 0x82, 0x75, 0x66, 0xF1, 0x98, 0xC1, 0xE7, 0xCC, 0x1F, 0xD3, 0x61, 0x64, 0x7C,
+0x4A, 0x08, 0x39, 0x89, 0x1F, 0x3F, 0x0F, 0x5D, 0x1D, 0x54, 0xF0, 0x56, 0x17, 0x8B, 0x52, 0x7B,
+0x41, 0xA0, 0x20, 0x50, 0x10, 0x58, 0xCB, 0x08, 0xDC, 0xF1, 0xA6, 0x58, 0x55, 0x05, 0x5A, 0x44,
+0x25, 0x78, 0x15, 0xFE, 0x75, 0xFF, 0xCD, 0xB7, 0xDF, 0x09, 0x27, 0xAF, 0x8E, 0x62, 0x45, 0x1A,
+0x0C, 0xB3, 0x97, 0x4E, 0xC2, 0xFF, 0x68, 0x56, 0x35, 0x08, 0x75, 0x0E, 0x8A, 0x94, 0x4D, 0xCD,
+0x96, 0x7A, 0x5E, 0x83, 0x23, 0xF8, 0x97, 0x91, 0xAF, 0xEE, 0x49, 0xC6, 0x6A, 0xDD, 0xE8, 0xA6,
+0xD7, 0xB6, 0xF6, 0x0C, 0x84, 0xB9, 0xFE, 0xCD, 0x30, 0xBF, 0x76, 0x85, 0xFF, 0xEB, 0xCF, 0x3E,
+0x18, 0xBE, 0x74, 0xDF, 0xCE, 0xD0, 0x0D, 0x07, 0xFA, 0xD5, 0x3E, 0x2E, 0x0D, 0x8E, 0x86, 0x7F,
+0xF5, 0xED, 0x17, 0xC5, 0x14, 0x3B, 0x0D, 0x85, 0x88, 0x44, 0x84, 0x24, 0x8B, 0x8B, 0xBD, 0x4A,
+0x93, 0x54, 0x55, 0xD4, 0x2C, 0xAB, 0x7D, 0xD0, 0xC0, 0x04, 0x51, 0x14, 0xC5, 0x4C, 0x2D, 0x4E,
+0x53, 0x4A, 0x59, 0xA5, 0x2B, 0x42, 0x63, 0xE5, 0x8C, 0x63, 0xA0, 0x56, 0x50, 0x2F, 0x93, 0xFA,
+0xED, 0x8E, 0xF5, 0x52, 0xCE, 0x30, 0xD3, 0xA2, 0x1A, 0x50, 0xA1, 0x76, 0x4D, 0x96, 0xD7, 0xC0,
+0x14, 0xFA, 0x64, 0x79, 0xFD, 0xDA, 0x30, 0x43, 0xC7, 0x09, 0x90, 0xDA, 0x7E, 0xE5, 0x52, 0xA9,
+0x91, 0x78, 0x93, 0x63, 0xA7, 0xD3, 0x72, 0x89, 0x5A, 0x57, 0xA9, 0x18, 0xB1, 0x0C, 0x0B, 0xE8,
+0xD8, 0x89, 0x99, 0x50, 0xCA, 0xE7, 0x49, 0xA3, 0xF9, 0x4A, 0x53, 0xD9, 0x48, 0x79, 0xB9, 0x25,
+0xC8, 0x86, 0x56, 0x62, 0x0D, 0xB0, 0x48, 0x5D, 0x6B, 0x6B, 0x8C, 0xC1, 0xAD, 0x5A, 0x5F, 0xB5,
+0xAC, 0x9D, 0xF3, 0x1E, 0x5A, 0x05, 0xF2, 0x87, 0xAE, 0x63, 0x03, 0xED, 0xF3, 0xD8, 0x2B, 0x58,
+0x53, 0xE4, 0x30, 0x60, 0xE0, 0x3F, 0xFC, 0xC2, 0x03, 0x61, 0xFB, 0xFA, 0xD5, 0x35, 0xC5, 0x32,
+0xA5, 0xC9, 0xEB, 0x47, 0x4E, 0x87, 0x7F, 0xFE, 0xE7, 0x3F, 0x10, 0x53, 0x6C, 0x3B, 0xCC, 0x9E,
+0x1D, 0xBD, 0xEB, 0x43, 0xDB, 0xC0, 0x36, 0x44, 0x2E, 0x74, 0x08, 0x1E, 0x82, 0xA8, 0x42, 0x15,
+0x0F, 0x99, 0x23, 0x04, 0x19, 0x7F, 0xF9, 0x7B, 0xC7, 0xCD, 0xF5, 0x92, 0xBD, 0x5B, 0x26, 0x80,
+0x0E, 0x9F, 0xE8, 0x90, 0xF6, 0x4F, 0x9A, 0x1D, 0x8A, 0xA1, 0x88, 0x75, 0x3A, 0xC2, 0x5A, 0x2F,
+0x95, 0x3B, 0xF9, 0x8B, 0x5B, 0xA3, 0xEA, 0xBD, 0x5B, 0xFA, 0x42, 0x77, 0x57, 0x67, 0x58, 0xDF,
+0xD3, 0x19, 0xFE, 0xE3, 0x2F, 0xDC, 0x87, 0xC8, 0xD8, 0x7E, 0xE0, 0x43, 0xF3, 0xBE, 0xBA, 0x48,
+0x94, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x1A, 0x47, 0xA0, 0xFC, 0x36, 0x06, 0x56,
+0x34, 0xFB, 0x5D, 0x1E, 0x9E, 0x08, 0xE7, 0x87, 0x26, 0xC2, 0x10, 0x54, 0x05, 0x59, 0x9F, 0xA6,
+0x91, 0xC3, 0x8E, 0x8B, 0x97, 0x91, 0x80, 0x05, 0xCA, 0x5D, 0x54, 0xE7, 0x74, 0x85, 0x92, 0x6B,
+0x1C, 0x77, 0x33, 0x3B, 0xE5, 0xC3, 0x20, 0xB4, 0x20, 0x33, 0x61, 0x75, 0x4B, 0x72, 0xE2, 0xC6,
+0x07, 0xEA, 0x46, 0x4B, 0xD2, 0x31, 0xFE, 0xFA, 0xC8, 0x58, 0x38, 0x76, 0xEE, 0x4A, 0x98, 0x9C,
+0x82, 0x3A, 0x82, 0x05, 0x7E, 0x12, 0xAA, 0xDB, 0x24, 0xFC, 0xAD, 0xA6, 0xA0, 0x3E, 0xD5, 0x7F,
+0xCC, 0xC6, 0xF3, 0x54, 0xAD, 0xA8, 0x32, 0xB1, 0xDC, 0x24, 0xFE, 0xF2, 0x21, 0xD7, 0xC4, 0x73,
+0x50, 0xAB, 0xE4, 0x35, 0xCA, 0x51, 0xE1, 0xC2, 0xDF, 0xF8, 0xF0, 0xD7, 0x52, 0x07, 0xCB, 0xD5,
+0xBE, 0x8F, 0x14, 0x81, 0x10, 0x46, 0xE3, 0x03, 0x0A, 0x8F, 0x3C, 0xF7, 0xBF, 0x60, 0x12, 0x93,
+0x50, 0x7F, 0x52, 0x19, 0x3C, 0x9F, 0xE3, 0x6B, 0xFB, 0xBB, 0xD4, 0x73, 0x79, 0x0F, 0xD7, 0xA3,
+0x8E, 0x29, 0xAB, 0x63, 0x0A, 0xE7, 0x20, 0x2A, 0xEA, 0x39, 0xBE, 0x6F, 0x65, 0xC0, 0x71, 0xF1,
+0x3A, 0x95, 0xF3, 0xF7, 0xFD, 0x3A, 0xD6, 0xC3, 0xEB, 0xB4, 0x8C, 0xF6, 0x25, 0xD6, 0x83, 0xE7,
+0xD3, 0xD6, 0x67, 0x7F, 0x6F, 0x1A, 0xFD, 0xE4, 0x23, 0xBE, 0xB6, 0x6B, 0x20, 0x94, 0xAA, 0x79,
+0x18, 0x0A, 0xEA, 0x0C, 0xF0, 0x9F, 0x87, 0x29, 0x7C, 0x0B, 0x7C, 0x2C, 0xF3, 0xF4, 0x1E, 0x37,
+0x3A, 0xCE, 0xCB, 0x5D, 0x37, 0x85, 0x7B, 0x9E, 0x46, 0x24, 0xEC, 0xD5, 0xE1, 0x31, 0x8C, 0x3F,
+0x24, 0x4C, 0x12, 0xD8, 0x0E, 0x44, 0x64, 0x43, 0xA9, 0x0B, 0xF8, 0x3B, 0xDF, 0xDE, 0x1D, 0xE6,
+0xDA, 0xBB, 0xF4, 0x01, 0x65, 0x6E, 0xB6, 0xF2, 0xE8, 0x14, 0xA5, 0x4E, 0xD4, 0xBA, 0x96, 0x8E,
+0x30, 0x1D, 0x3A, 0x54, 0xAD, 0xA3, 0x6A, 0x47, 0xC5, 0x6E, 0xCE, 0x1F, 0x8A, 0xE9, 0x04, 0x1F,
+0x54, 0x4B, 0xD1, 0xDF, 0xA4, 0xA0, 0xCE, 0x41, 0xA9, 0xD5, 0xC7, 0xB8, 0xA9, 0xBC, 0x54, 0x7F,
+0xA7, 0x00, 0x8A, 0x98, 0x67, 0xF1, 0x99, 0xE9, 0x45, 0x64, 0x70, 0x7F, 0x77, 0xBB, 0x90, 0xBA,
+0x72, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x8D, 0x21, 0x50, 0xBE, 0x41, 0x81, 0xDB,
+0x04, 0xC8, 0xCE, 0xE1, 0x0B, 0x43, 0xE1, 0x08, 0xFC, 0xEB, 0xA6, 0x19, 0x21, 0x48, 0x12, 0x36,
+0x39, 0x01, 0xF5, 0x02, 0x2B, 0xB9, 0xCB, 0x3F, 0x26, 0x4B, 0xB8, 0x0F, 0x51, 0x46, 0xE3, 0x54,
+0x55, 0x10, 0x75, 0x41, 0xD9, 0x5D, 0xAE, 0x78, 0xC8, 0xB0, 0x98, 0xDF, 0x9D, 0x9C, 0xA7, 0xF2,
+0x04, 0xD5, 0xA8, 0x13, 0x52, 0x45, 0x33, 0x4C, 0xB1, 0xF4, 0xDF, 0xBA, 0x34, 0x38, 0x12, 0x06,
+0x47, 0xC7, 0x60, 0x59, 0x26, 0xA1, 0x53, 0x3F, 0x35, 0x57, 0x21, 0x53, 0x84, 0xA2, 0xAA, 0x23,
+0x6C, 0x1B, 0x7D, 0xAF, 0x28, 0x8A, 0x31, 0x70, 0x42, 0x82, 0x2C, 0x4C, 0x54, 0x63, 0x7B, 0xE5,
+0x81, 0xAB, 0xFD, 0x3C, 0xCB, 0xC6, 0xBA, 0xA8, 0x82, 0xE1, 0x7D, 0xBE, 0xA7, 0x0F, 0x55, 0x73,
+0x58, 0x97, 0x5E, 0xAB, 0x6A, 0x9F, 0x3E, 0x78, 0x8E, 0xE6, 0x37, 0x5E, 0xA3, 0x7F, 0x59, 0xAF,
+0xFE, 0x35, 0x1F, 0x34, 0x96, 0x01, 0x64, 0xF2, 0xA0, 0x32, 0x24, 0xE6, 0x3A, 0x3E, 0xD7, 0xBF,
+0xBC, 0x4E, 0x7C, 0xB8, 0xEC, 0x3E, 0x06, 0x6F, 0xAA, 0x5B, 0xC6, 0x44, 0xC9, 0x39, 0xDF, 0x93,
+0x7B, 0xD9, 0x38, 0x69, 0x9B, 0xFC, 0x5A, 0xB6, 0x27, 0xBD, 0xA7, 0x22, 0xA2, 0xB5, 0xD3, 0xDA,
+0x92, 0xAB, 0xB6, 0x69, 0x4A, 0xE8, 0xCD, 0xF3, 0x3C, 0x6F, 0xFA, 0x5E, 0xA6, 0x4E, 0xE6, 0xEF,
+0x4B, 0x7F, 0xE8, 0x43, 0x46, 0xE2, 0x0C, 0xE6, 0x03, 0xF5, 0x74, 0x17, 0xF2, 0x18, 0x32, 0x41,
+0xF1, 0x6A, 0x1F, 0x13, 0x48, 0x71, 0x72, 0x04, 0x39, 0xEB, 0x26, 0x10, 0x44, 0xD3, 0x4E, 0x99,
+0x8C, 0xCA, 0x65, 0x97, 0xA9, 0x84, 0x48, 0xE7, 0x53, 0xF1, 0x83, 0x63, 0x7A, 0x1F, 0x7F, 0xC8,
+0x84, 0x56, 0x1F, 0x40, 0x51, 0xDC, 0xCC, 0x5F, 0xCE, 0xCB, 0x73, 0x2C, 0xDC, 0x5F, 0xD0, 0xC7,
+0xC5, 0xC7, 0x26, 0xFA, 0xDE, 0xA1, 0xDF, 0xF0, 0x2E, 0x95, 0x39, 0x90, 0xCF, 0x0D, 0x96, 0xEB,
+0x42, 0xCE, 0xBA, 0x36, 0xFA, 0xF9, 0xE1, 0xFD, 0xCD, 0x20, 0xB9, 0x1D, 0xA6, 0xD4, 0x15, 0xB5,
+0x6E, 0xB5, 0x67, 0x44, 0xA9, 0xBF, 0x20, 0x50, 0x10, 0x58, 0xAB, 0x08, 0x14, 0x62, 0x47, 0x62,
+0x07, 0xB2, 0xF3, 0xE1, 0xC5, 0x61, 0x04, 0x4E, 0x8C, 0x80, 0xD8, 0x89, 0xB1, 0x49, 0x14, 0xBB,
+0xA5, 0x55, 0xBA, 0x9A, 0x29, 0x61, 0x72, 0x5D, 0xCC, 0xB3, 0x5B, 0x79, 0x5B, 0xF5, 0x3C, 0xDF,
+0x27, 0x96, 0x11, 0x83, 0x1D, 0x8C, 0x2E, 0x6C, 0x82, 0x62, 0x47, 0x12, 0x77, 0x05, 0xC4, 0x6E,
+0x1C, 0xBB, 0x68, 0xCC, 0x42, 0x21, 0x92, 0x80, 0x04, 0x21, 0xAF, 0x46, 0x6A, 0x84, 0x88, 0x54,
+0xF9, 0x6B, 0xDE, 0xAC, 0xCA, 0x7B, 0x56, 0x4E, 0xB8, 0xAA, 0xF5, 0xCF, 0xDF, 0xF7, 0x73, 0x4B,
+0x95, 0x17, 0x72, 0x65, 0x8F, 0x54, 0x3E, 0x11, 0x39, 0xAD, 0x53, 0xB1, 0x52, 0x72, 0x57, 0x6D,
+0x5B, 0x7E, 0x8D, 0x97, 0x5D, 0x1C, 0x42, 0xBF, 0xDA, 0x4C, 0xA8, 0x52, 0x97, 0x91, 0x93, 0xAC,
+0x5E, 0xBF, 0xA3, 0x8C, 0x8F, 0x69, 0xAE, 0x79, 0x9F, 0xF2, 0x7E, 0xF9, 0x90, 0x26, 0x83, 0x7C,
+0x45, 0xB6, 0x5D, 0xF2, 0x3B, 0x22, 0xB6, 0x17, 0xA4, 0x8E, 0x41, 0x2B, 0x24, 0xD9, 0xEC, 0xE3,
+0x76, 0xE4, 0x31, 0xEC, 0x90, 0xFC, 0x20, 0xAB, 0x7B, 0x4C, 0x4C, 0x23, 0x77, 0xDD, 0xC5, 0x2B,
+0x50, 0xCB, 0xA6, 0x34, 0xAF, 0x1C, 0xA3, 0x5A, 0xA1, 0xCE, 0x49, 0xFF, 0x65, 0x2F, 0x64, 0xD7,
+0x9C, 0xCD, 0x6E, 0x5A, 0x95, 0xA0, 0x13, 0x76, 0x4E, 0xF0, 0x2A, 0xE3, 0xA3, 0xD8, 0xE9, 0xC3,
+0xE7, 0x46, 0x36, 0x7E, 0x24, 0xCA, 0x1C, 0xF7, 0x9C, 0x80, 0xB3, 0x1C, 0x3E, 0x00, 0xF4, 0xA9,
+0x13, 0x62, 0x88, 0x0F, 0xCE, 0xF6, 0x81, 0xEE, 0xA6, 0x60, 0xB1, 0xBA, 0x48, 0x97, 0xDA, 0x0B,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0xAD, 0x45, 0x60, 0xF5, 0x57, 0x94, 0x5B, 0xDB, 0xBF, 0x65, 0xEF,
+0xCE, 0xC5, 0x85, 0xA6, 0xC4, 0xC3, 0x97, 0x46, 0xC2, 0x91, 0xCB, 0xA3, 0x12, 0xA5, 0xD8, 0x3A,
+0x07, 0x35, 0x65, 0xD6, 0x93, 0xF7, 0xBA, 0x4F, 0x96, 0x52, 0x80, 0x7C, 0xBD, 0x53, 0x97, 0x22,
+0x5D, 0xDC, 0xCD, 0xE3, 0xCC, 0x9E, 0x3B, 0x1D, 0xB0, 0xDB, 0x47, 0x55, 0x49, 0x57, 0x36, 0xAA,
+0x62, 0xED, 0x50, 0x2A, 0x9A, 0xE1, 0x3F, 0x44, 0xC5, 0xEE, 0xEA, 0xF0, 0xA8, 0x10, 0x89, 0x39,
+0xF4, 0x4D, 0x22, 0x0E, 0x4D, 0x5A, 0x94, 0x45, 0xD8, 0x14, 0x18, 0xFA, 0xC0, 0x89, 0xB2, 0xA5,
+0x9D, 0x52, 0x15, 0xCC, 0xB6, 0x4B, 0x93, 0x4E, 0x0B, 0x33, 0x51, 0x55, 0x4B, 0xB6, 0x50, 0x93,
+0xC2, 0xBC, 0x46, 0xCB, 0xEA, 0x19, 0xA3, 0x59, 0x6E, 0x8A, 0xD6, 0xB7, 0xC5, 0x0F, 0x4F, 0xF3,
+0xA1, 0xA4, 0xFB, 0x49, 0x94, 0xA4, 0xB4, 0x43, 0xFD, 0xE0, 0x54, 0x27, 0xD5, 0x3A, 0xD4, 0x6C,
+0xAD, 0xF9, 0xEA, 0xE2, 0x4E, 0x1F, 0x72, 0x4A, 0x4D, 0x76, 0xF1, 0xBE, 0x76, 0x85, 0xA3, 0x2D,
+0xFE, 0x7F, 0xE6, 0xD0, 0x25, 0xF5, 0x10, 0x6B, 0xE9, 0x83, 0x5F, 0xA2, 0xE7, 0xA4, 0x5E, 0x15,
+0x9F, 0xBC, 0x2A, 0x2D, 0x27, 0x51, 0x9C, 0xD6, 0x47, 0x85, 0x41, 0xC7, 0x88, 0xD7, 0x78, 0x17,
+0xAC, 0x3F, 0x7A, 0x2F, 0x3D, 0xA9, 0x73, 0x80, 0x6D, 0xB5, 0xFA, 0xD9, 0x4E, 0xEF, 0xBB, 0xDD,
+0x47, 0xEA, 0xE2, 0x3F, 0xD8, 0xC5, 0x64, 0x06, 0x24, 0x8B, 0x24, 0x9B, 0xEE, 0x95, 0xCC, 0x63,
+0x28, 0x0A, 0xDA, 0x2A, 0x1E, 0x6C, 0x1F, 0xCD, 0xAF, 0xE7, 0xAF, 0x0E, 0x85, 0x29, 0x10, 0x3B,
+0x49, 0x5D, 0x82, 0x9C, 0x8A, 0xF4, 0xF1, 0x13, 0x9C, 0xB2, 0x36, 0x46, 0xA5, 0xCC, 0xFA, 0xA2,
+0x78, 0x2A, 0x33, 0x53, 0x3C, 0x7C, 0xA4, 0x7D, 0xBC, 0xF4, 0xB5, 0xFB, 0xE8, 0x09, 0x0E, 0x32,
+0x5F, 0xD2, 0xF8, 0xE9, 0x38, 0x26, 0x6C, 0x63, 0xFA, 0x1F, 0x14, 0xA3, 0x62, 0x37, 0x8F, 0x79,
+0xC9, 0x99, 0xC0, 0x94, 0x2F, 0xCD, 0x30, 0x4B, 0xAF, 0x22, 0xD4, 0xA5, 0xEA, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x70, 0xCB, 0x11, 0x58, 0xDD, 0x15, 0xE5, 0x96, 0x77, 0x6F, 0xF9, 0x06, 0xD0, 0x07,
+0x6D, 0x10, 0x21, 0x93, 0x17, 0x86, 0x27, 0xC3, 0x35, 0x84, 0x5C, 0xCA, 0xA2, 0x24, 0xFE, 0x75,
+0x20, 0x77, 0x7E, 0x54, 0x84, 0x99, 0xF4, 0x82, 0x8B, 0x51, 0x35, 0x25, 0xC3, 0x22, 0x0A, 0x8E,
+0x9C, 0xD6, 0xC5, 0xD1, 0xCD, 0x76, 0x54, 0x4D, 0x9A, 0x71, 0x90, 0xC8, 0x8D, 0x49, 0xE4, 0x21,
+0xD3, 0x99, 0x80, 0xDC, 0x89, 0xE2, 0x92, 0x75, 0xCC, 0x88, 0xA9, 0x9C, 0xF1, 0xE6, 0x67, 0x7F,
+0x65, 0xC1, 0xCE, 0xBB, 0x65, 0x24, 0x46, 0x15, 0xAE, 0xFC, 0xC8, 0x5E, 0x67, 0x75, 0x0A, 0x31,
+0x90, 0xBA, 0xFD, 0xAF, 0xDD, 0xA8, 0xCE, 0x7D, 0xCD, 0xA5, 0x5E, 0x8A, 0x47, 0xD2, 0x59, 0x73,
+0x8F, 0x78, 0x59, 0x7A, 0x52, 0x1D, 0xA6, 0xAC, 0xAD, 0xC6, 0x51, 0x93, 0x16, 0x15, 0xFB, 0x65,
+0xC4, 0x2E, 0xEF, 0xB2, 0x77, 0x93, 0x24, 0xC4, 0x3A, 0x5C, 0x3B, 0x9A, 0xB1, 0xEB, 0x76, 0x9D,
+0xBC, 0xEF, 0xAC, 0x28, 0x5E, 0xB5, 0x70, 0x54, 0x63, 0x3B, 0x60, 0xD2, 0xA4, 0x5A, 0x37, 0x3D,
+0x33, 0x2D, 0x66, 0xFE, 0x0D, 0xDD, 0x9D, 0xA1, 0x1F, 0x39, 0x0D, 0x57, 0xDB, 0x24, 0x4F, 0xD5,
+0xF6, 0x22, 0xF2, 0xD7, 0x0D, 0x22, 0x2A, 0x96, 0x44, 0x5F, 0xD2, 0x95, 0xC0, 0xA7, 0xCE, 0x73,
+0xF4, 0x45, 0x62, 0xE7, 0x43, 0x93, 0xF5, 0x4F, 0xE6, 0x77, 0x65, 0x08, 0x13, 0x3E, 0xF9, 0xC4,
+0x48, 0x63, 0x67, 0xE6, 0xF1, 0x38, 0xE6, 0x66, 0xE2, 0xCE, 0xA7, 0x9C, 0x91, 0x3F, 0x7E, 0x16,
+0xB8, 0xE1, 0x06, 0xEF, 0xD1, 0x09, 0x73, 0xEC, 0x66, 0x90, 0xDC, 0x66, 0xA8, 0x97, 0xCD, 0xF8,
+0xDC, 0x95, 0x7B, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x5B, 0x85, 0xC0, 0x1D, 0x4D, 0xEC, 0xB8,
+0xA0, 0x70, 0xEF, 0xD4, 0x4B, 0x08, 0x9C, 0x98, 0x84, 0x9F, 0x1D, 0x7D, 0xB6, 0x99, 0xE3, 0x2D,
+0x60, 0x2B, 0xB1, 0x64, 0x86, 0x55, 0x15, 0x49, 0x49, 0x8C, 0x9B, 0x97, 0x44, 0x92, 0x30, 0x6D,
+0xA9, 0x42, 0x93, 0x4C, 0xD9, 0x50, 0xC5, 0x66, 0xC1, 0x41, 0x1F, 0x23, 0x10, 0x3A, 0xF1, 0x3D,
+0xB2, 0xCC, 0xFE, 0xCD, 0x18, 0x78, 0xFA, 0x74, 0x31, 0x57, 0x1D, 0xF3, 0xAC, 0xE9, 0x22, 0x4E,
+0xE9, 0xC5, 0xEE, 0xEC, 0xF6, 0x60, 0x95, 0x94, 0x74, 0x49, 0x37, 0x75, 0x45, 0x5F, 0x2B, 0x21,
+0xCD, 0x25, 0xAE, 0xA8, 0xAA, 0x99, 0x12, 0x23, 0xAA, 0x9D, 0x28, 0x64, 0x66, 0xCE, 0x8C, 0x75,
+0x1A, 0x91, 0x55, 0xA9, 0xC7, 0x6E, 0xA8, 0xEA, 0x4D, 0x54, 0x74, 0xA4, 0x0E, 0x5B, 0xFC, 0x5D,
+0xD5, 0x11, 0x7B, 0x36, 0x95, 0x40, 0x55, 0x79, 0x54, 0xE1, 0xE1, 0x39, 0x91, 0xC9, 0xA2, 0x6A,
+0x67, 0xC2, 0x50, 0x6A, 0x1A, 0x9B, 0x49, 0xA5, 0x48, 0x9A, 0x6B, 0x3A, 0x92, 0xA9, 0x78, 0x32,
+0x8A, 0xA6, 0x3A, 0x99, 0x1C, 0xA9, 0x7A, 0x9F, 0x13, 0x17, 0xBE, 0x27, 0x0F, 0x55, 0xEE, 0xD4,
+0xA7, 0x2C, 0x75, 0x5B, 0x95, 0x2C, 0x2B, 0x93, 0x41, 0xA5, 0x6A, 0x5E, 0x52, 0xFB, 0x54, 0xC1,
+0xD3, 0xFB, 0x8B, 0xBA, 0xE9, 0x0F, 0xDE, 0x4B, 0xC8, 0xF5, 0x34, 0x54, 0xB3, 0x69, 0x84, 0x1D,
+0xB4, 0x84, 0x1D, 0xEB, 0xFB, 0x42, 0x47, 0x33, 0xFC, 0xEB, 0x70, 0xBF, 0xA3, 0xA7, 0x2F, 0xCA,
+0x7D, 0x69, 0x76, 0x95, 0xD1, 0xEA, 0x20, 0xB1, 0xB3, 0x7E, 0x9A, 0x22, 0xA9, 0x6A, 0x6C, 0xC2,
+0x4F, 0xFA, 0xE2, 0x6A, 0xA5, 0xCC, 0x04, 0xFB, 0x2C, 0xD8, 0x38, 0xC8, 0x19, 0xF7, 0x61, 0x8C,
+0x63, 0x93, 0xFC, 0x15, 0x5D, 0x31, 0x8D, 0x91, 0xD1, 0x32, 0xBB, 0xB4, 0x0E, 0x3E, 0xA3, 0x50,
+0x29, 0xE9, 0x5E, 0x70, 0x9F, 0x5E, 0xE0, 0xD0, 0x07, 0x92, 0x5B, 0xD9, 0xAE, 0xAC, 0x19, 0x1F,
+0x8E, 0x72, 0x8F, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xB0, 0xC6, 0x10, 0xB8, 0xA3, 0x89, 0x1D, 0xC7,
+0x92, 0x66, 0xD8, 0x33, 0xC8, 0x5D, 0xC7, 0xBC, 0x64, 0x8C, 0xC6, 0xA3, 0x71, 0x6A, 0x6E, 0x7A,
+0xBC, 0x42, 0xEC, 0xAA, 0x63, 0x5E, 0x91, 0xAF, 0x2A, 0x6F, 0x45, 0xEA, 0x52, 0x23, 0x72, 0x79,
+0x21, 0xBE, 0x4F, 0xF2, 0x68, 0x59, 0x44, 0x2A, 0x42, 0xD8, 0x6A, 0xCD, 0x2B, 0x92, 0x11, 0x3A,
+0xA4, 0x7B, 0xB2, 0xE1, 0x79, 0x3A, 0xC2, 0xD7, 0xBD, 0x99, 0x91, 0xBA, 0x8A, 0x6C, 0x57, 0xBF,
+0xAF, 0xB5, 0x4A, 0x9D, 0x2B, 0x37, 0xAA, 0xDA, 0xD4, 0x48, 0x66, 0xBC, 0x57, 0xAE, 0xCE, 0x65,
+0xEF, 0xBB, 0x09, 0x53, 0xAE, 0xF1, 0x32, 0x26, 0x8B, 0x25, 0x41, 0x4E, 0xEB, 0x93, 0x7B, 0x0A,
+0x1F, 0x35, 0x53, 0x5F, 0xA4, 0x89, 0x7A, 0x3E, 0x5E, 0xEE, 0x7D, 0xF3, 0x7A, 0x72, 0x92, 0x67,
+0x75, 0x68, 0x11, 0x23, 0x7E, 0x99, 0x22, 0x55, 0xB9, 0xD4, 0x15, 0x38, 0xEB, 0x52, 0x5E, 0xCC,
+0xAA, 0xAE, 0x76, 0x35, 0xC9, 0x72, 0xD6, 0x1E, 0x27, 0x8D, 0x4E, 0xF4, 0x70, 0x7A, 0x06, 0x66,
+0x58, 0x10, 0xBB, 0xC9, 0xC9, 0x29, 0x8C, 0x49, 0x08, 0x7B, 0x36, 0xF5, 0x37, 0x65, 0xEB, 0x2C,
+0xE6, 0x2A, 0x3C, 0x7A, 0xEE, 0x12, 0x94, 0xC2, 0x19, 0xC5, 0x91, 0xBB, 0x4C, 0x50, 0xB1, 0x33,
+0x02, 0xEB, 0x23, 0x56, 0x0F, 0xC3, 0xF8, 0x5E, 0xC4, 0xCC, 0x87, 0x58, 0x81, 0x89, 0xA3, 0x2D,
+0x4F, 0xD2, 0xC4, 0x8F, 0x4A, 0x76, 0x65, 0xB2, 0x19, 0xE6, 0x1C, 0x4F, 0x10, 0xC2, 0x0E, 0x34,
+0x46, 0x8C, 0xC1, 0xB8, 0xF1, 0xE6, 0xBE, 0x6E, 0xE4, 0x76, 0x24, 0xDD, 0x2D, 0x47, 0x41, 0xA0,
+0x20, 0x50, 0x10, 0x28, 0x08, 0x7C, 0x1C, 0x04, 0xEE, 0x68, 0x62, 0x47, 0x75, 0x80, 0x09, 0x53,
+0xDF, 0x3E, 0x3B, 0x28, 0x01, 0x14, 0xDD, 0xF0, 0xF7, 0x69, 0x85, 0x6F, 0xDD, 0xEC, 0xC4, 0xA8,
+0xEC, 0x12, 0x80, 0x38, 0x0A, 0x59, 0xFC, 0x44, 0xA9, 0xE1, 0xC6, 0xAA, 0xA2, 0x3A, 0xD9, 0xD2,
+0x03, 0x65, 0x6F, 0x0E, 0x05, 0x5C, 0x99, 0x9B, 0xA3, 0xD2, 0x27, 0x81, 0x17, 0x5E, 0x02, 0x2B,
+0x1A, 0xAF, 0xC9, 0x08, 0x0B, 0xCD, 0x6F, 0x12, 0xF9, 0x89, 0x32, 0xD3, 0x4C, 0xF3, 0x50, 0x21,
+0x3C, 0x1F, 0x67, 0x18, 0x17, 0xBF, 0x96, 0x8A, 0xD0, 0xB6, 0x8D, 0x03, 0x92, 0x70, 0x99, 0xBE,
+0x5D, 0x0C, 0x0A, 0x69, 0x91, 0x4D, 0x62, 0x71, 0x30, 0xCD, 0x44, 0xB6, 0x38, 0xCF, 0x69, 0xD8,
+0x2E, 0x3B, 0x6B, 0xBD, 0x40, 0x7F, 0xAC, 0x68, 0xBC, 0x83, 0x90, 0x2B, 0x5E, 0xCB, 0x22, 0xEC,
+0xA3, 0xA9, 0x7A, 0x84, 0x07, 0xFD, 0xD7, 0x3A, 0x24, 0xC3, 0x73, 0xF6, 0x50, 0x15, 0x88, 0x3E,
+0x7E, 0xA2, 0x06, 0xDA, 0x7D, 0xB5, 0x4E, 0x47, 0x8C, 0x65, 0x98, 0xF7, 0x0C, 0xAF, 0x05, 0x57,
+0xEE, 0xD2, 0xC0, 0x31, 0xE0, 0x6B, 0xE2, 0x88, 0xD7, 0x86, 0x31, 0x1B, 0x25, 0xBA, 0x13, 0xCE,
+0xCF, 0xF3, 0x9E, 0x3C, 0x6F, 0xC5, 0x9C, 0x18, 0xF0, 0x3A, 0xBE, 0xA7, 0x43, 0xA8, 0xFD, 0x60,
+0xFD, 0x3A, 0x4E, 0x7C, 0x6E, 0x7E, 0x7D, 0x78, 0x8F, 0xE7, 0x64, 0x7C, 0xBD, 0x5B, 0x02, 0x81,
+0xEC, 0xCD, 0xA1, 0xED, 0x30, 0x10, 0x22, 0xF5, 0x8D, 0xEA, 0x9E, 0x36, 0x4D, 0x42, 0x0F, 0x5C,
+0xED, 0x33, 0x85, 0x8B, 0xFD, 0x94, 0x36, 0x44, 0x35, 0x0C, 0x8A, 0x29, 0x94, 0xE0, 0xE9, 0x29,
+0x98, 0xF9, 0xA1, 0xDC, 0xAD, 0x43, 0x5A, 0x8F, 0x7B, 0x77, 0x6D, 0x96, 0x44, 0xD5, 0xAB, 0x79,
+0x48, 0x62, 0x62, 0xF8, 0x58, 0xBE, 0x7B, 0xE2, 0xAC, 0x44, 0xE2, 0xB6, 0x42, 0xA9, 0x63, 0x9A,
+0x13, 0xF1, 0xB1, 0x33, 0x6C, 0x94, 0x7B, 0xA5, 0xB9, 0xC0, 0x79, 0x29, 0xA3, 0x47, 0xDC, 0xBC,
+0x71, 0x3A, 0xBD, 0x75, 0x3E, 0x38, 0x1E, 0x9C, 0x0B, 0x02, 0x9B, 0x3D, 0xB1, 0x02, 0x82, 0x73,
+0x9C, 0x59, 0x3A, 0x0F, 0xE8, 0xF2, 0x20, 0xA3, 0xED, 0xE3, 0x89, 0x9A, 0xB9, 0x6B, 0xD8, 0x1C,
+0x7E, 0x68, 0xB4, 0xE3, 0x97, 0xCE, 0xFD, 0x3B, 0x37, 0x0A, 0xB1, 0x2B, 0x47, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x28, 0x08, 0x7C, 0x3C, 0x04, 0xEE, 0x58, 0x62, 0xC7, 0xC5, 0x8B, 0xFE, 0x67, 0x83,
+0xF0, 0x3F, 0x3B, 0x7D, 0x1D, 0xBB, 0x4D, 0xE0, 0x75, 0x27, 0x93, 0xC6, 0x4E, 0x8D, 0x82, 0xFC,
+0x4C, 0x69, 0x1A, 0x0D, 0xFE, 0x27, 0xE6, 0xC8, 0x64, 0xB9, 0x74, 0x51, 0xAA, 0xA2, 0x65, 0x89,
+0xD9, 0x2E, 0xEA, 0x75, 0x95, 0x94, 0xB6, 0xE9, 0x6A, 0x2D, 0xD1, 0xC1, 0x74, 0x22, 0x78, 0xCC,
+0x90, 0x94, 0x54, 0xD4, 0x8C, 0x8F, 0x37, 0x90, 0x8B, 0x5D, 0xDD, 0x0D, 0xE2, 0x70, 0x70, 0xD7,
+0x56, 0x98, 0xFC, 0x5A, 0xA1, 0xD8, 0x20, 0x32, 0x76, 0x12, 0xFD, 0xC3, 0x5F, 0xBF, 0xB7, 0xF6,
+0xD3, 0xCC, 0x63, 0xC2, 0x82, 0x78, 0x22, 0xE9, 0x26, 0x99, 0xC6, 0xA2, 0xB7, 0x30, 0x33, 0xA9,
+0x04, 0x50, 0x08, 0xE9, 0xD5, 0xAB, 0xC5, 0x44, 0x6A, 0x66, 0x52, 0x35, 0x65, 0x92, 0x05, 0x18,
+0x03, 0xB2, 0xF3, 0x9E, 0x16, 0xC6, 0x2C, 0x71, 0xE9, 0x3E, 0x72, 0x4F, 0x44, 0x46, 0x4A, 0x10,
+0x85, 0xDF, 0x43, 0xAF, 0x97, 0x33, 0x46, 0xA8, 0x25, 0x58, 0x41, 0xCC, 0xB6, 0xAC, 0x57, 0xCF,
+0x6B, 0x9A, 0x12, 0x37, 0x29, 0x26, 0x75, 0x4C, 0x7A, 0x60, 0xC5, 0x84, 0xB4, 0x48, 0x5B, 0x74,
+0x1C, 0x85, 0x7B, 0x1A, 0x4B, 0x93, 0x6A, 0xC4, 0xA4, 0xA8, 0x75, 0x88, 0xF9, 0x31, 0x96, 0x51,
+0xF2, 0xA7, 0x81, 0x18, 0x8A, 0x8D, 0x9A, 0x78, 0xE3, 0xE5, 0x6E, 0xD5, 0x75, 0x58, 0xA2, 0x19,
+0x56, 0xCA, 0x68, 0xB7, 0xE4, 0x9E, 0x73, 0x0C, 0x9A, 0xC0, 0x0F, 0x86, 0x79, 0x90, 0xEB, 0xED,
+0xEB, 0x7A, 0xC3, 0xDE, 0xCD, 0xEB, 0xC2, 0x86, 0xBE, 0x9E, 0x55, 0xDF, 0x56, 0x8E, 0xFB, 0xC3,
+0x9E, 0x38, 0x7F, 0x19, 0x7B, 0xC4, 0x22, 0xE1, 0x36, 0xE6, 0x7B, 0x5B, 0xF7, 0x40, 0x68, 0xED,
+0x5E, 0x87, 0xFC, 0x23, 0xED, 0xD2, 0x2F, 0xC1, 0x49, 0xFA, 0x45, 0x6C, 0xF9, 0xD4, 0x4C, 0xE0,
+0x32, 0x0C, 0x46, 0xF9, 0xF8, 0xBE, 0xE3, 0x6E, 0xE6, 0xF9, 0x68, 0x6A, 0x8E, 0x53, 0xC5, 0x4D,
+0xF1, 0x69, 0xEC, 0x99, 0xFE, 0xC4, 0xE7, 0x80, 0x07, 0xBE, 0x78, 0xFD, 0x6D, 0xA8, 0xA7, 0xAB,
+0x0D, 0xF5, 0xE2, 0x73, 0xC0, 0x80, 0x89, 0x83, 0xDB, 0x37, 0x84, 0x1E, 0x24, 0x4D, 0x6E, 0x46,
+0x40, 0xD1, 0xEA, 0x7C, 0xD2, 0x4A, 0xAD, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0xF6, 0x40, 0xE0,
+0x8E, 0x25, 0x76, 0x84, 0x9F, 0x4E, 0xE5, 0x97, 0x86, 0x26, 0x45, 0xAD, 0xA3, 0xCF, 0x1B, 0x0C,
+0x96, 0x61, 0x6E, 0x82, 0xFE, 0x75, 0x96, 0xBF, 0x2E, 0x27, 0x74, 0x3E, 0x5E, 0x19, 0x19, 0x73,
+0xAD, 0xC9, 0x95, 0x37, 0x57, 0x3E, 0x16, 0x1B, 0x5A, 0xDF, 0x36, 0x89, 0x8B, 0x17, 0xF3, 0xE5,
+0x35, 0x81, 0xD7, 0xC9, 0x3E, 0x9F, 0x9B, 0xD7, 0xF5, 0x85, 0x3D, 0x5B, 0x36, 0xC8, 0xBE, 0xA5,
+0xB3, 0x20, 0xAD, 0xB3, 0xDC, 0x03, 0x17, 0xAA, 0x51, 0x24, 0x6A, 0xB2, 0xB8, 0x5B, 0xAB, 0x17,
+0xDA, 0xE3, 0x94, 0xB8, 0xC5, 0xC6, 0x2A, 0xF9, 0x11, 0xC2, 0x55, 0x73, 0x4D, 0x2C, 0x57, 0x61,
+0xBD, 0x56, 0x79, 0x4D, 0x59, 0x27, 0x3C, 0x72, 0x57, 0xB7, 0x6D, 0x1A, 0x09, 0xCA, 0x4D, 0x7A,
+0xD9, 0x8D, 0xED, 0xB4, 0xDD, 0x37, 0xB7, 0x87, 0x3A, 0x49, 0x63, 0x4B, 0x6B, 0x40, 0x4D, 0xDD,
+0x31, 0x92, 0xA9, 0x2D, 0x4F, 0x8F, 0xAC, 0xBC, 0x13, 0xBB, 0x38, 0x7E, 0x59, 0x41, 0xED, 0x9B,
+0x3D, 0x6A, 0xBA, 0xA4, 0x7D, 0xC8, 0x46, 0xDD, 0x8B, 0xC5, 0xEB, 0xA1, 0x61, 0x41, 0xA9, 0x9B,
+0xE1, 0x0F, 0x06, 0x14, 0xDC, 0xBB, 0x79, 0x20, 0xEC, 0xDF, 0xBA, 0x3E, 0x74, 0x32, 0x72, 0x60,
+0x95, 0x0F, 0x46, 0xC3, 0x7E, 0x74, 0xEE, 0xB2, 0x98, 0x7F, 0xC9, 0xDC, 0x5A, 0x91, 0xBB, 0xAE,
+0xB5, 0x1B, 0xF9, 0xEB, 0x8C, 0x90, 0x3B, 0x01, 0x8D, 0x73, 0xD8, 0xFB, 0x18, 0x49, 0x5D, 0x75,
+0x7C, 0x12, 0x72, 0xDA, 0x67, 0xA3, 0xE2, 0x3A, 0x95, 0x0C, 0x84, 0x38, 0x06, 0x95, 0xB9, 0xE4,
+0x83, 0xA4, 0x1E, 0x76, 0x24, 0x76, 0x4C, 0x71, 0xC2, 0x4A, 0xD6, 0xF5, 0x74, 0xE0, 0xD1, 0xB9,
+0xEA, 0x24, 0x77, 0x95, 0xA1, 0x2E, 0xD5, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x02, 0x81,
+0x3B, 0x9A, 0xD8, 0x4D, 0xC0, 0xBF, 0xEE, 0xC4, 0x15, 0xA8, 0x28, 0x58, 0x6A, 0xDA, 0xA1, 0x60,
+0xD0, 0x54, 0x3A, 0x03, 0x62, 0x27, 0xDB, 0x28, 0x71, 0xA1, 0x92, 0xBF, 0xAA, 0x48, 0x19, 0x95,
+0xB1, 0xE7, 0xAA, 0x75, 0x24, 0x3D, 0xC7, 0x64, 0x0B, 0x51, 0xB3, 0x92, 0xBA, 0x43, 0x91, 0x48,
+0xDF, 0xE1, 0x79, 0x35, 0x27, 0x3A, 0x19, 0xE4, 0x0E, 0x0E, 0x7E, 0x9F, 0xD5, 0x9E, 0x09, 0xFD,
+0x3D, 0x5D, 0xE1, 0xC9, 0xBB, 0xF7, 0x89, 0xCD, 0x70, 0x9A, 0xA9, 0x36, 0xD0, 0xC7, 0x59, 0xFA,
+0x11, 0x4A, 0xE3, 0x74, 0xFB, 0x30, 0x3E, 0x77, 0xE7, 0x79, 0x7D, 0x6D, 0x18, 0x44, 0xD5, 0x2D,
+0x6F, 0xA5, 0xF6, 0xDE, 0x65, 0xAA, 0xA8, 0xDA, 0x99, 0x14, 0xA7, 0x29, 0x4A, 0x8C, 0xDD, 0x18,
+0x26, 0x51, 0xB1, 0x31, 0x35, 0x30, 0x26, 0x04, 0x16, 0x35, 0x48, 0x55, 0x1E, 0x0F, 0xA2, 0xB0,
+0x50, 0x0C, 0xC5, 0x9A, 0xAA, 0xA0, 0xA1, 0xAF, 0xA3, 0x60, 0xE5, 0xA2, 0xC2, 0xA6, 0x6D, 0xD5,
+0x34, 0x1C, 0xFA, 0x9E, 0x53, 0x66, 0x21, 0x8F, 0x2E, 0xEE, 0xB1, 0x45, 0x76, 0x1F, 0x0F, 0x6A,
+0x10, 0x82, 0x6A, 0xEF, 0xAB, 0xB8, 0x94, 0x94, 0x3B, 0xE9, 0x81, 0x29, 0x58, 0x1A, 0x00, 0xE1,
+0x66, 0x55, 0x55, 0xF6, 0x52, 0x70, 0x84, 0xF1, 0xBD, 0xAC, 0x1E, 0xDD, 0x3E, 0x2D, 0x09, 0x96,
+0xA2, 0x0E, 0x4F, 0x21, 0x22, 0x95, 0xD1, 0xB0, 0x18, 0x84, 0x43, 0x3B, 0x37, 0x85, 0xBB, 0x77,
+0x6D, 0xC1, 0x76, 0x72, 0xAB, 0x6F, 0x7A, 0x1C, 0x47, 0x62, 0xE2, 0xF7, 0xB1, 0x3F, 0x2C, 0x95,
+0xBB, 0x16, 0xFA, 0x90, 0x82, 0xD4, 0xF1, 0x21, 0x48, 0xBA, 0x02, 0xE9, 0xE2, 0xAA, 0xF7, 0x51,
+0x54, 0xC9, 0x5A, 0xD4, 0x7D, 0xBC, 0xD9, 0x7F, 0x1B, 0x5E, 0x51, 0xF1, 0x32, 0xC2, 0x6B, 0xF5,
+0x45, 0xF9, 0x32, 0x82, 0x6F, 0xF8, 0xC9, 0xF8, 0x28, 0x50, 0x4C, 0x48, 0x4C, 0x53, 0x3A, 0xBF,
+0x80, 0xB6, 0x0F, 0xF4, 0x4A, 0x34, 0x6C, 0x33, 0x5C, 0x13, 0x56, 0xFB, 0xB3, 0x56, 0xEA, 0x2F,
+0x08, 0x14, 0x04, 0x0A, 0x02, 0xB7, 0x1A, 0x81, 0x3B, 0x9A, 0xD8, 0x4D, 0x21, 0x12, 0xF6, 0x0C,
+0xCC, 0xB0, 0x5C, 0x50, 0x5A, 0x19, 0x54, 0x40, 0x35, 0x0B, 0x89, 0x7C, 0xD5, 0x86, 0x66, 0x84,
+0x2C, 0x52, 0x3B, 0x13, 0x65, 0xA2, 0xE9, 0xC9, 0xDF, 0xAF, 0x4A, 0x35, 0xB2, 0xCE, 0x45, 0x5E,
+0x64, 0xEF, 0x45, 0xE5, 0x02, 0x0B, 0x19, 0x10, 0xE7, 0xDA, 0xC6, 0x1D, 0x20, 0x9A, 0x45, 0xEC,
+0xB8, 0x0F, 0xE7, 0x83, 0x77, 0xED, 0x0A, 0xBB, 0x37, 0xAF, 0x47, 0xDA, 0x13, 0xF8, 0xDA, 0x4D,
+0x4D, 0x08, 0xB9, 0x9B, 0x03, 0xD1, 0xD0, 0x55, 0x3A, 0x33, 0xC9, 0xA5, 0x6E, 0xA7, 0xB9, 0x99,
+0x77, 0xB1, 0x32, 0x63, 0x93, 0x82, 0x65, 0xC6, 0xDC, 0x44, 0x64, 0x9D, 0xD8, 0x45, 0x65, 0xCF,
+0x80, 0x89, 0xD7, 0x57, 0x5F, 0x2B, 0x6E, 0xB9, 0xE2, 0xA6, 0x37, 0x8D, 0xE7, 0xB3, 0xFB, 0x46,
+0x65, 0x28, 0xD6, 0x9D, 0x37, 0xDA, 0xAE, 0xB3, 0xF2, 0xAE, 0x48, 0xC5, 0x12, 0x91, 0x87, 0x64,
+0x26, 0xD5, 0xD4, 0x0D, 0xD5, 0x9C, 0x5C, 0xAD, 0xCA, 0xFB, 0x5A, 0xC1, 0x40, 0x99, 0x4D, 0x6C,
+0xAF, 0x11, 0x1D, 0x2F, 0x5E, 0x0B, 0x17, 0xCD, 0x8D, 0x8E, 0x37, 0x77, 0x1C, 0xD9, 0xB5, 0x69,
+0x7D, 0xD8, 0x85, 0xB1, 0x60, 0x92, 0xEA, 0xD5, 0x3C, 0x38, 0xAF, 0x47, 0xC7, 0x27, 0xC3, 0xA9,
+0x0B, 0x57, 0x45, 0x9D, 0x6E, 0xC5, 0x9E, 0xB0, 0xAD, 0x48, 0x4A, 0xDC, 0x82, 0xBF, 0x11, 0x5B,
+0x1B, 0x86, 0x8A, 0x2A, 0x9B, 0x75, 0xA0, 0xD2, 0x47, 0x1B, 0x53, 0xC5, 0xC8, 0xFE, 0xC9, 0x25,
+0x52, 0xE7, 0xF2, 0x24, 0x6D, 0x35, 0x6A, 0x5D, 0x45, 0x49, 0xC5, 0xFC, 0x97, 0xBD, 0x72, 0xCD,
+0xE7, 0x74, 0x17, 0x7C, 0x40, 0x9B, 0xB1, 0xFB, 0xC6, 0x6A, 0x62, 0x5D, 0xEA, 0x2E, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0xB7, 0x0B, 0x02, 0x77, 0x24, 0xB1, 0x73, 0x3F, 0x1F, 0xEE, 0xF1, 0x79, 0x61,
+0x64, 0x42, 0x02, 0x25, 0x02, 0xFD, 0xCF, 0xA0, 0xAA, 0xCC, 0x21, 0x72, 0x31, 0x2E, 0x66, 0xA2,
+0xF0, 0x18, 0xC7, 0x33, 0x1F, 0x2B, 0x4F, 0xC7, 0x20, 0x03, 0xE8, 0x0E, 0x5B, 0xFE, 0x9E, 0xD1,
+0x9A, 0xF8, 0x96, 0xAF, 0x7F, 0x4E, 0x32, 0xB0, 0xC0, 0xFB, 0x56, 0x5C, 0x34, 0xFF, 0x9A, 0x3F,
+0xF9, 0xAA, 0xCF, 0x05, 0x2E, 0x9A, 0x87, 0x76, 0x6F, 0x0F, 0x4F, 0xDF, 0x77, 0x40, 0xBC, 0xFD,
+0x99, 0xF6, 0x62, 0x66, 0x7C, 0x34, 0x4C, 0x8F, 0x0F, 0xCB, 0x6B, 0x9A, 0xA1, 0x95, 0x8D, 0x3A,
+0x6B, 0xCD, 0x09, 0xA9, 0x27, 0xA7, 0x70, 0x22, 0x93, 0x94, 0x3A, 0x21, 0x5D, 0xA6, 0xC0, 0xD0,
+0xCF, 0x4D, 0xD5, 0x48, 0xF7, 0x36, 0x34, 0x75, 0xC6, 0x55, 0x3C, 0x53, 0x38, 0x13, 0x71, 0xB2,
+0x7A, 0x8C, 0x04, 0xB8, 0xAF, 0x5C, 0xBD, 0x94, 0x2B, 0xEA, 0xB3, 0xC7, 0xE6, 0x99, 0x1A, 0xE7,
+0x3E, 0x75, 0xE2, 0x93, 0xE7, 0xEA, 0x19, 0x15, 0x28, 0x02, 0xAE, 0x65, 0x55, 0x55, 0x73, 0x32,
+0x9E, 0x54, 0x36, 0x0F, 0x72, 0xB0, 0xB0, 0x0A, 0xBD, 0xDE, 0x94, 0x55, 0xE7, 0x67, 0xEE, 0x6F,
+0x17, 0xD3, 0x7F, 0x88, 0x2F, 0x5F, 0xB2, 0xC4, 0x7A, 0x32, 0xE3, 0xA8, 0x10, 0x4A, 0xBB, 0x92,
+0x91, 0xD2, 0xDC, 0x10, 0xA3, 0xB2, 0xC7, 0x88, 0xE4, 0x19, 0x04, 0x4E, 0x90, 0x54, 0xF7, 0x76,
+0x74, 0x84, 0x4D, 0x03, 0x7D, 0xF0, 0xAF, 0xEB, 0xC5, 0x56, 0x5A, 0xAB, 0xFB, 0xF1, 0x63, 0xC0,
+0xC2, 0x30, 0x72, 0xD7, 0x5D, 0x1D, 0x1E, 0x11, 0xFF, 0xBA, 0x56, 0xEE, 0x0B, 0xDB, 0x0A, 0x95,
+0xD0, 0xC6, 0x4A, 0x94, 0x45, 0x3E, 0xA2, 0x22, 0xE9, 0x53, 0xDA, 0x55, 0x6A, 0xF3, 0xC2, 0xB3,
+0xF9, 0x2D, 0x54, 0xCE, 0x54, 0xBA, 0xE4, 0x73, 0xA7, 0xD7, 0x48, 0x11, 0x53, 0x71, 0x65, 0x2E,
+0x64, 0x6A, 0x9D, 0x02, 0x9C, 0xD3, 0xDD, 0x79, 0xA4, 0x39, 0x31, 0x62, 0x07, 0x82, 0xB7, 0x7F,
+0xEB, 0x00, 0x76, 0xA0, 0x58, 0x5D, 0x92, 0xBB, 0xEA, 0x1F, 0xB2, 0x72, 0x83, 0x82, 0x40, 0x41,
+0xA0, 0x20, 0x70, 0x9B, 0x20, 0xB0, 0xBA, 0x2B, 0xCB, 0x6D, 0xD2, 0xC9, 0x7A, 0xCD, 0xF0, 0xC0,
+0x89, 0xE1, 0x09, 0xEE, 0x30, 0x01, 0x53, 0xD9, 0xE4, 0x38, 0x88, 0x0E, 0xD4, 0x3B, 0x44, 0x8F,
+0x46, 0x33, 0xA2, 0x89, 0x12, 0x4E, 0xD4, 0xA4, 0x9E, 0x8A, 0xF4, 0x90, 0x31, 0xB7, 0x1A, 0x95,
+0x67, 0x81, 0x6A, 0x23, 0x8B, 0x27, 0x54, 0x13, 0x2E, 0x8C, 0xB8, 0x6C, 0x8C, 0xC4, 0xAE, 0x49,
+0xCC, 0x8E, 0x3B, 0x0D, 0x6C, 0x81, 0x2A, 0xF2, 0xF8, 0x7D, 0xFB, 0xC3, 0xFE, 0xED, 0x9B, 0xA5,
+0x1D, 0x33, 0xF4, 0xF9, 0x82, 0x6A, 0x37, 0x23, 0x64, 0x56, 0x31, 0x48, 0xFD, 0x74, 0x62, 0xE7,
+0xC8, 0x19, 0xA9, 0x8B, 0x78, 0x28, 0x63, 0xD2, 0xB5, 0x5A, 0x65, 0x9A, 0xCA, 0xBA, 0x6D, 0x97,
+0x25, 0x0C, 0xB4, 0xCF, 0x7A, 0x28, 0x11, 0xF3, 0xE7, 0x09, 0x6B, 0x67, 0x61, 0x6E, 0xF4, 0x4E,
+0x58, 0x27, 0xC8, 0xB5, 0x1E, 0xAD, 0x4B, 0xCB, 0xC7, 0x60, 0x86, 0xBC, 0x4A, 0xBD, 0x8B, 0x97,
+0x4A, 0xF7, 0x5A, 0xA0, 0xC4, 0x25, 0x7F, 0xBB, 0xD8, 0x3C, 0x2F, 0x6D, 0x26, 0xC6, 0x9C, 0xB0,
+0xC5, 0xE1, 0x8F, 0x2A, 0x97, 0xDF, 0xC7, 0xDA, 0x62, 0x28, 0x26, 0x45, 0x4B, 0x2B, 0x9B, 0x45,
+0x24, 0x32, 0xF1, 0x26, 0x89, 0xDE, 0xB6, 0xA1, 0x5F, 0x82, 0x26, 0xBA, 0x60, 0x86, 0x5D, 0xED,
+0xC4, 0xC4, 0x8C, 0x82, 0x3D, 0x7B, 0xF9, 0x5A, 0x18, 0x19, 0x1B, 0x17, 0x3C, 0x5A, 0xBB, 0x7A,
+0x24, 0xD5, 0x49, 0xCC, 0xDD, 0x97, 0x86, 0x24, 0x91, 0xE0, 0xAC, 0x0F, 0xD1, 0xA4, 0x9D, 0x21,
+0xE9, 0xCA, 0x5E, 0xC5, 0xC7, 0x32, 0xEF, 0x77, 0xAE, 0xA2, 0xC6, 0xF9, 0x51, 0xF5, 0xC5, 0x63,
+0x8A, 0x93, 0x36, 0x46, 0x1B, 0x03, 0xE3, 0x1E, 0x10, 0xBA, 0xCD, 0xFD, 0xBD, 0xAB, 0xBE, 0xFB,
+0x46, 0xED, 0xF8, 0x96, 0xD7, 0x05, 0x81, 0x82, 0x40, 0x41, 0x60, 0xAD, 0x22, 0x70, 0xC7, 0x12,
+0x3B, 0x9A, 0x61, 0xCF, 0x0D, 0xAA, 0x3F, 0x1D, 0xB5, 0x82, 0x99, 0x31, 0xEC, 0x13, 0x3B, 0x36,
+0x0C, 0x62, 0x27, 0xD2, 0x95, 0xFA, 0x5B, 0x91, 0xB0, 0xA8, 0x14, 0xA1, 0x84, 0x22, 0x9A, 0x97,
+0x9C, 0x9C, 0x38, 0x31, 0x70, 0x43, 0xA4, 0xAB, 0x17, 0x39, 0xA9, 0xD0, 0xFA, 0x78, 0xCC, 0x81,
+0x34, 0x4A, 0x94, 0x2D, 0x5E, 0x8E, 0x4D, 0x21, 0x90, 0xA1, 0x96, 0x24, 0xAE, 0xE2, 0x2C, 0xEB,
+0xEA, 0xEC, 0x0C, 0x8F, 0xDE, 0xBD, 0x3F, 0x7C, 0xF1, 0xF1, 0xFB, 0x61, 0x06, 0x6B, 0x93, 0xA8,
+0xDC, 0x99, 0xC9, 0x89, 0x30, 0x35, 0x3A, 0x08, 0x42, 0x3B, 0x12, 0xC9, 0x56, 0xD5, 0xCF, 0x4E,
+0x09, 0x94, 0x21, 0x62, 0x7E, 0x63, 0xE6, 0x2F, 0x25, 0x2A, 0x97, 0xB3, 0x29, 0x8D, 0x4E, 0x15,
+0xC2, 0x60, 0x3E, 0x75, 0x4A, 0xFC, 0x94, 0xF4, 0x69, 0xA2, 0x5A, 0x01, 0xD0, 0xD4, 0x34, 0x93,
+0xBF, 0x22, 0x4D, 0xAB, 0xFA, 0x73, 0x79, 0x7E, 0x35, 0x89, 0x7A, 0xB5, 0x3A, 0x93, 0x32, 0x67,
+0x54, 0xCB, 0x23, 0x64, 0x73, 0x65, 0x48, 0x34, 0x23, 0x7F, 0xB8, 0xCF, 0x9E, 0x29, 0x69, 0x1E,
+0xC1, 0xCB, 0x31, 0x65, 0xAF, 0x24, 0x78, 0x80, 0xF5, 0xAB, 0x0F, 0x5F, 0x0C, 0xB4, 0xD5, 0x26,
+0x47, 0x7F, 0xBB, 0xB8, 0xC5, 0x98, 0x10, 0x73, 0x2B, 0xC7, 0xE6, 0xFB, 0xBC, 0xB0, 0x08, 0x60,
+0x4D, 0xD4, 0x6B, 0xFD, 0x95, 0x72, 0xA6, 0xE2, 0x81, 0x44, 0x33, 0x7D, 0x0E, 0x53, 0xCD, 0x30,
+0x60, 0xE0, 0xE0, 0x8E, 0x2D, 0xA1, 0xBF, 0x57, 0xF7, 0x68, 0x5D, 0xED, 0x63, 0x02, 0xFE, 0x75,
+0x87, 0x4F, 0x9E, 0x83, 0x5F, 0x25, 0xF3, 0xD7, 0x21, 0x1A, 0xBB, 0xAB, 0x4F, 0x12, 0x29, 0x32,
+0x19, 0x89, 0xEE, 0x0E, 0xEB, 0x7D, 0x52, 0x45, 0xD2, 0x85, 0x39, 0xF5, 0x1F, 0xE4, 0x70, 0xE9,
+0x67, 0x40, 0x4A, 0xFA, 0xE7, 0x21, 0xFA, 0x42, 0xBA, 0x3F, 0xA3, 0x95, 0x89, 0x63, 0xAF, 0x73,
+0xC0, 0xE7, 0x82, 0xAB, 0x9A, 0x8E, 0xA3, 0xFC, 0x95, 0x69, 0xA5, 0xFE, 0xA6, 0x1B, 0x91, 0xBF,
+0xAE, 0x1B, 0x7B, 0xAB, 0xC9, 0xE7, 0x2B, 0x2A, 0xC6, 0xAB, 0x8D, 0x4C, 0xA9, 0xBF, 0x20, 0x50,
+0x10, 0x28, 0x08, 0xAC, 0x5D, 0x04, 0xEE, 0x5C, 0x62, 0x07, 0x9F, 0xA3, 0xD3, 0x48, 0x4C, 0x4C,
+0x72, 0xC5, 0xA0, 0x89, 0x69, 0x9A, 0x26, 0x99, 0x8E, 0x82, 0xB9, 0xD4, 0x8C, 0xAF, 0x28, 0xEF,
+0x72, 0x25, 0xA9, 0x3A, 0x09, 0x22, 0xC9, 0x13, 0xDA, 0xE6, 0xDA, 0x86, 0x97, 0xA9, 0x7D, 0x6D,
+0xE7, 0x49, 0x1A, 0x6D, 0x61, 0x1B, 0x85, 0x39, 0xB4, 0x59, 0x8A, 0x1D, 0xEF, 0xCE, 0xFD, 0x48,
+0x77, 0x6D, 0xDD, 0x18, 0x9E, 0xBA, 0xFF, 0x60, 0x38, 0xB4, 0x67, 0x3B, 0x1A, 0xDD, 0x2A, 0xBB,
+0x20, 0xD0, 0xFC, 0x3C, 0x0B, 0x33, 0x21, 0x53, 0xA0, 0x24, 0x63, 0xA2, 0x3D, 0xAD, 0x33, 0xEF,
+0x17, 0xF6, 0x2C, 0x93, 0xCA, 0x22, 0xF1, 0xF5, 0xAA, 0x8C, 0xEC, 0x18, 0x8C, 0xFC, 0x93, 0x94,
+0x3D, 0xBF, 0x4E, 0x6F, 0xA2, 0x3C, 0xC9, 0x81, 0x4F, 0x24, 0xDA, 0x89, 0x80, 0x92, 0x81, 0xAC,
+0xA2, 0xCA, 0xF3, 0xBC, 0xAE, 0xF4, 0xDC, 0xD5, 0xA5, 0x4A, 0xB3, 0x48, 0xBA, 0xF2, 0xEE, 0x65,
+0xC3, 0x1B, 0x87, 0x3B, 0x35, 0x43, 0xC9, 0x8F, 0xAB, 0x8C, 0x0B, 0x14, 0x3F, 0x03, 0x28, 0x56,
+0x98, 0x88, 0x9D, 0x4B, 0x60, 0xFC, 0xA1, 0xC0, 0x34, 0x27, 0x0C, 0x9C, 0xA0, 0x42, 0x77, 0xD7,
+0xF6, 0x4D, 0xA1, 0xBF, 0xBB, 0x49, 0xC4, 0x0E, 0xFB, 0xC2, 0x1E, 0x3D, 0x73, 0x01, 0x81, 0x13,
+0x08, 0xDA, 0x80, 0x3F, 0x5F, 0x0B, 0x15, 0x3B, 0xEE, 0x0F, 0x1B, 0xFB, 0x61, 0xED, 0xCD, 0xC7,
+0x39, 0x9F, 0xF3, 0xD2, 0x2F, 0x05, 0x23, 0x6A, 0xB6, 0xE4, 0x6D, 0xF1, 0x33, 0x91, 0xCD, 0x06,
+0x39, 0x9F, 0xC6, 0xD7, 0xD5, 0x5C, 0xA3, 0x85, 0x71, 0x6A, 0x71, 0x3C, 0xDB, 0x48, 0x2B, 0x2D,
+0x70, 0x82, 0xBB, 0x6F, 0x74, 0x21, 0xCD, 0x49, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41,
+0xE0, 0xE6, 0x20, 0x70, 0x47, 0x12, 0x3B, 0x2A, 0x03, 0xDC, 0x71, 0xE2, 0x94, 0x11, 0xBB, 0xF9,
+0xF9, 0x99, 0x30, 0xC5, 0xE4, 0xB1, 0x13, 0x13, 0x46, 0xBC, 0x2A, 0xEE, 0xF9, 0xD1, 0x8F, 0x4C,
+0x55, 0x0B, 0x63, 0x05, 0x99, 0x5B, 0x9A, 0x47, 0x5F, 0xAA, 0xB4, 0xC5, 0xC5, 0xD2, 0xE4, 0x8F,
+0xA8, 0x68, 0xD9, 0xD2, 0x48, 0x7F, 0x36, 0x49, 0x84, 0x3B, 0x1F, 0x46, 0xC6, 0xB1, 0xBD, 0x54,
+0x93, 0x4C, 0xB1, 0x3E, 0x55, 0x3A, 0x61, 0xFE, 0x7B, 0xE0, 0xE0, 0x9E, 0xF0, 0xD3, 0x4F, 0x3F,
+0x1C, 0x3A, 0xB0, 0x98, 0xD2, 0xE8, 0xCC, 0x3D, 0x64, 0x67, 0x60, 0x86, 0x9E, 0x82, 0x62, 0xE9,
+0xDB, 0x4D, 0xF9, 0x52, 0xAE, 0xA4, 0x36, 0xA9, 0x71, 0x1E, 0x1D, 0xAA, 0xEA, 0x8E, 0xAA, 0x94,
+0x1E, 0xA5, 0xEA, 0x39, 0xED, 0x54, 0xEE, 0x32, 0xD5, 0x86, 0x3D, 0x75, 0x1F, 0xAE, 0x2C, 0x3A,
+0x56, 0xD5, 0xBD, 0x8A, 0xD3, 0x9A, 0x28, 0x73, 0x1E, 0x29, 0x2B, 0xEA, 0x97, 0x47, 0xBD, 0xDA,
+0xF5, 0xAA, 0xDC, 0x11, 0x7F, 0xA7, 0xD1, 0x02, 0x76, 0x6C, 0x45, 0x24, 0x5F, 0xAE, 0xFA, 0x88,
+0x7A, 0xE6, 0xAA, 0x92, 0x29, 0x85, 0xC2, 0x20, 0x93, 0xC2, 0xE4, 0xD1, 0xAD, 0x71, 0x0B, 0xB1,
+0x5C, 0x91, 0xB3, 0x71, 0xF6, 0x9C, 0x7C, 0x1E, 0x31, 0x9B, 0xA2, 0x40, 0x5D, 0xA0, 0x73, 0x75,
+0x4E, 0xF1, 0xD0, 0x84, 0xC4, 0xA6, 0x1B, 0xCA, 0xBD, 0xE0, 0xD3, 0x08, 0x5F, 0x46, 0x92, 0x68,
+0xEE, 0x00, 0xB2, 0x17, 0xC4, 0xAE, 0x0F, 0x51, 0xCA, 0xCD, 0x38, 0xB8, 0xE3, 0xC4, 0x89, 0xF3,
+0xD8, 0x71, 0x02, 0xBE, 0x7D, 0xAD, 0x1D, 0x5D, 0x70, 0xAF, 0xB3, 0x2D, 0xBB, 0x4C, 0x7D, 0x4C,
+0xF9, 0xFB, 0x5C, 0xD5, 0x54, 0x45, 0x52, 0x94, 0x33, 0x75, 0x58, 0x4C, 0xBE, 0x72, 0xF2, 0x03,
+0xC8, 0x55, 0x50, 0xED, 0xB3, 0xF4, 0x52, 0x88, 0xB2, 0xBD, 0x96, 0x31, 0x74, 0xA5, 0x5B, 0xC7,
+0x47, 0x3F, 0x30, 0x8A, 0x87, 0xD6, 0x47, 0x62, 0x47, 0xFF, 0x52, 0xBA, 0x25, 0x84, 0xB0, 0x0F,
+0xF9, 0xFC, 0xBA, 0x9A, 0xB0, 0xAD, 0x5A, 0x33, 0xF0, 0x2E, 0xF7, 0x28, 0x08, 0x14, 0x04, 0x0A,
+0x02, 0xB7, 0x03, 0x02, 0x77, 0x24, 0xB1, 0xE3, 0x82, 0x3E, 0x86, 0x1D, 0x27, 0xAE, 0x8E, 0x22,
+0xB7, 0x17, 0xD6, 0x1D, 0xF1, 0x37, 0xC3, 0x83, 0x1B, 0xB4, 0x2F, 0xF0, 0xA1, 0x33, 0x72, 0x96,
+0xF2, 0x7C, 0x99, 0x70, 0x94, 0x8F, 0x9E, 0x8B, 0x44, 0x99, 0xDA, 0xE1, 0x7E, 0x60, 0x51, 0xE9,
+0xB0, 0xF2, 0xDC, 0xD2, 0x8B, 0xC7, 0xE8, 0x14, 0x88, 0x9D, 0x4B, 0x49, 0x4D, 0x9A, 0x09, 0xCC,
+0x69, 0xB7, 0x1D, 0x11, 0x99, 0x4F, 0x3D, 0x70, 0x30, 0xDC, 0xBF, 0x7F, 0x17, 0x54, 0xBC, 0x0E,
+0x51, 0x0D, 0x49, 0xEE, 0x24, 0x70, 0x04, 0x51, 0xC1, 0xC2, 0x7D, 0xE4, 0x5F, 0x67, 0x36, 0xF6,
+0x5C, 0xC8, 0x80, 0x9D, 0xB6, 0xF7, 0x73, 0xBF, 0xB9, 0xC8, 0x61, 0xB3, 0x3E, 0x25, 0x21, 0xCB,
+0x94, 0x1D, 0xC7, 0xC7, 0xB5, 0xB9, 0xBC, 0xFF, 0xAE, 0x92, 0x65, 0xE7, 0x72, 0xD3, 0x77, 0x84,
+0xC8, 0xEA, 0xF0, 0x7B, 0xE7, 0x14, 0xBC, 0x02, 0xA7, 0x10, 0xBB, 0xAC, 0x1F, 0x59, 0xD3, 0x63,
+0xBE, 0x3A, 0x23, 0x25, 0x4A, 0x60, 0xAD, 0x7F, 0x7E, 0xA3, 0x48, 0xEC, 0xD2, 0xE0, 0x68, 0x75,
+0x5A, 0xD6, 0x2E, 0xA9, 0xA8, 0x5F, 0x35, 0xF0, 0xC8, 0x1D, 0x99, 0x37, 0x50, 0x7C, 0x37, 0x41,
+0xAE, 0xE8, 0x5B, 0xB7, 0x11, 0x39, 0x05, 0x9B, 0xB1, 0x3F, 0x2C, 0xA3, 0x60, 0xAF, 0x5C, 0x1F,
+0x0E, 0x97, 0x07, 0x41, 0x2A, 0x99, 0x98, 0x98, 0x81, 0x13, 0x48, 0xE9, 0xA3, 0x87, 0xCE, 0x4A,
+0x47, 0x67, 0xC1, 0x70, 0x57, 0xC1, 0x4E, 0x38, 0x66, 0xF3, 0x3B, 0x5E, 0xEB, 0x73, 0xDF, 0xB1,
+0xE1, 0xFC, 0xC9, 0x27, 0x0A, 0xC9, 0x5E, 0x9C, 0x53, 0xFA, 0x5E, 0x1B, 0x23, 0xD0, 0xF1, 0x03,
+0x87, 0x29, 0x4E, 0x76, 0x94, 0x88, 0xD8, 0x26, 0x7D, 0xFA, 0xCB, 0x6D, 0x0A, 0x02, 0x05, 0x81,
+0x3B, 0x05, 0x81, 0x3B, 0x8E, 0xD8, 0x71, 0x51, 0x9F, 0xC1, 0x42, 0x37, 0x84, 0xA0, 0x09, 0xE6,
+0x92, 0x13, 0x33, 0xEC, 0x28, 0xD4, 0x2A, 0x3E, 0x87, 0x99, 0x4A, 0xD5, 0x0A, 0x5B, 0x9C, 0x44,
+0xFD, 0x71, 0x85, 0xC8, 0xA3, 0x3D, 0x7D, 0xF9, 0x4E, 0xAF, 0x93, 0xBB, 0xBF, 0xA9, 0x36, 0xAA,
+0xDD, 0xA8, 0xFF, 0x96, 0x0A, 0x47, 0x69, 0x39, 0xC5, 0x96, 0x65, 0x7C, 0xC9, 0x7B, 0xDF, 0x8A,
+0xBC, 0x5D, 0x24, 0x15, 0x77, 0xEF, 0xDD, 0x11, 0xBE, 0xFE, 0xD9, 0xC7, 0x42, 0x1F, 0x4C, 0x82,
+0xB3, 0xA2, 0x80, 0xC1, 0xEF, 0x0A, 0x8E, 0xF6, 0x33, 0x63, 0xA3, 0x1A, 0x25, 0x2B, 0xCA, 0x95,
+0x3A, 0x92, 0x69, 0x4E, 0x3A, 0x91, 0x71, 0x54, 0x80, 0xE1, 0x7F, 0x42, 0x82, 0x54, 0xC9, 0x13,
+0x42, 0xA4, 0xC6, 0x39, 0xA5, 0x4E, 0x31, 0x7C, 0x54, 0x95, 0x1F, 0xAF, 0x4B, 0x4A, 0x44, 0x30,
+0x4C, 0x05, 0x14, 0x65, 0xCB, 0xC8, 0x52, 0x7E, 0x1F, 0x23, 0x06, 0xAE, 0xFE, 0x78, 0xB4, 0xAE,
+0xC0, 0xE8, 0x6A, 0x9F, 0x29, 0x4A, 0xB1, 0x8D, 0x35, 0xCA, 0xA2, 0xF8, 0xE7, 0xB9, 0x4A, 0xE8,
+0x4A, 0x93, 0xDF, 0xCA, 0x55, 0x35, 0xFB, 0x1B, 0xDD, 0x02, 0x5D, 0x6D, 0x62, 0x39, 0xED, 0x7E,
+0x0C, 0x14, 0x76, 0x9E, 0x18, 0x15, 0x39, 0x2A, 0x56, 0x6C, 0x8B, 0x89, 0x52, 0x29, 0x2A, 0xD8,
+0xCC, 0xCA, 0x38, 0x4F, 0xFF, 0xCD, 0x69, 0x06, 0xA8, 0x40, 0x09, 0x26, 0x0E, 0x7B, 0xB7, 0x6E,
+0x80, 0x3A, 0xD5, 0x1C, 0xB3, 0x23, 0x13, 0x13, 0x1F, 0x3F, 0x73, 0x31, 0x4C, 0x4A, 0x70, 0x10,
+0xFC, 0xEB, 0x7A, 0xB1, 0xAD, 0x1C, 0xC7, 0x49, 0x86, 0xCC, 0x14, 0x45, 0x0E, 0x89, 0x42, 0x1A,
+0xA9, 0x9E, 0xCC, 0x76, 0x67, 0xC8, 0x86, 0x87, 0xFA, 0xDC, 0xB9, 0x8A, 0xA7, 0x9F, 0x09, 0xD1,
+0xDF, 0x32, 0x05, 0x2F, 0x2A, 0xAA, 0x32, 0x1B, 0xBC, 0x7E, 0x9D, 0x0F, 0x3A, 0x07, 0x5C, 0x0D,
+0x84, 0x52, 0x07, 0x85, 0x9C, 0x9F, 0xBB, 0x6E, 0x6C, 0x98, 0xBB, 0x09, 0xBB, 0x70, 0xB4, 0x63,
+0x4E, 0x16, 0xFF, 0xBA, 0x3B, 0x65, 0xC9, 0x29, 0xFD, 0x2C, 0x08, 0x14, 0x04, 0x56, 0x1B, 0x81,
+0x3B, 0x8E, 0xD8, 0x11, 0x50, 0xD9, 0x71, 0x62, 0x18, 0x09, 0x63, 0xCD, 0x2C, 0x3A, 0x05, 0x42,
+0xC3, 0x94, 0x14, 0x95, 0xC5, 0x25, 0x57, 0x8E, 0xA2, 0xBE, 0x61, 0xE4, 0xA5, 0x32, 0x2A, 0x99,
+0x9F, 0x91, 0x19, 0x9C, 0x9C, 0xE6, 0x44, 0x15, 0xCB, 0x2F, 0x43, 0x9D, 0x24, 0x50, 0xE4, 0x3E,
+0xD3, 0xB8, 0xF7, 0x04, 0x02, 0x38, 0x9A, 0x4D, 0xEE, 0x24, 0x42, 0x76, 0xFD, 0x40, 0x78, 0x1A,
+0xBE, 0x76, 0x0F, 0x1E, 0xD8, 0x0D, 0x72, 0xD7, 0x2D, 0x04, 0x84, 0xFB, 0xB8, 0x32, 0xBF, 0xDD,
+0x1C, 0x22, 0x38, 0x63, 0x9B, 0x64, 0xE1, 0x4F, 0x92, 0x4C, 0xAD, 0x92, 0x27, 0x3D, 0x37, 0x9C,
+0x6A, 0xF4, 0x9F, 0x0C, 0xA1, 0x5C, 0x1B, 0x72, 0x15, 0x4D, 0x01, 0x89, 0x35, 0x67, 0x0A, 0x8F,
+0xDC, 0x23, 0xAF, 0xB3, 0x22, 0xC3, 0x19, 0x90, 0x99, 0x72, 0x24, 0x56, 0x5B, 0x21, 0xD1, 0x56,
+0x67, 0xAE, 0x20, 0x49, 0xFB, 0x94, 0x6F, 0xD6, 0x2A, 0x54, 0x55, 0x75, 0xCD, 0x5B, 0x6F, 0x4A,
+0x9C, 0xB5, 0xBE, 0x8E, 0x18, 0x15, 0xFB, 0xE5, 0x4A, 0xAC, 0x37, 0x25, 0xBB, 0x55, 0x2A, 0x03,
+0x4C, 0x19, 0x98, 0xC2, 0xFD, 0x61, 0x19, 0x09, 0x7A, 0x00, 0x81, 0x13, 0xDC, 0xE2, 0xAD, 0x19,
+0xC7, 0x84, 0xF8, 0xD7, 0x5D, 0xD4, 0xFD, 0x61, 0xE1, 0x5F, 0xD7, 0xD6, 0xDD, 0x67, 0x66, 0x55,
+0xC5, 0xC3, 0x61, 0xF6, 0x3E, 0xC6, 0xD1, 0x10, 0x60, 0x52, 0xCF, 0x15, 0x27, 0x1F, 0xB7, 0xFC,
+0x7C, 0xAD, 0xC2, 0x99, 0x6A, 0xF2, 0xFE, 0x09, 0x21, 0xCC, 0x3E, 0x32, 0xDC, 0x62, 0xAC, 0x95,
+0x41, 0x13, 0x50, 0xEC, 0x88, 0xC7, 0xE6, 0xFE, 0x9E, 0x30, 0x00, 0xB3, 0xF4, 0x6A, 0x47, 0x07,
+0x37, 0x03, 0xEF, 0x72, 0x8F, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0xBB, 0x20, 0x70, 0xC7, 0x11,
+0x3B, 0xF7, 0xAF, 0x3B, 0x7D, 0x1D, 0xA6, 0x47, 0x8C, 0x02, 0xD5, 0x84, 0x49, 0x21, 0x76, 0x30,
+0xC3, 0x8A, 0x2A, 0x95, 0x0C, 0x8C, 0x4E, 0x32, 0xAA, 0xDA, 0x5C, 0xA2, 0x37, 0xEE, 0x3F, 0x14,
+0x17, 0x32, 0xF7, 0x07, 0x8B, 0xFE, 0x61, 0xFA, 0x8E, 0xAA, 0x19, 0xBA, 0x60, 0xCE, 0xD2, 0x91,
+0x1D, 0x2C, 0x84, 0x64, 0x6A, 0x04, 0x6A, 0x4A, 0xB3, 0xFD, 0xEC, 0xD8, 0x1E, 0xE6, 0x4F, 0xDB,
+0xBB, 0x63, 0x73, 0xF8, 0xF9, 0x67, 0x1E, 0x0D, 0xDB, 0x36, 0xAD, 0x13, 0x82, 0x2B, 0x5B, 0xB5,
+0xCF, 0xC1, 0xD7, 0x70, 0x82, 0xBE, 0x76, 0x30, 0x17, 0x4B, 0x9B, 0xCD, 0xAF, 0x4A, 0x9E, 0xAA,
+0x3F, 0x95, 0xFB, 0xB9, 0x45, 0x3F, 0x39, 0xC7, 0xCB, 0x95, 0x34, 0x57, 0xED, 0xAC, 0xBF, 0xA2,
+0xD8, 0x88, 0x0A, 0xE4, 0x06, 0x39, 0x67, 0x5A, 0x46, 0x0A, 0xAD, 0x4E, 0x51, 0x81, 0x54, 0x4E,
+0x52, 0x85, 0x47, 0x94, 0x40, 0x57, 0x7F, 0xCC, 0x74, 0x28, 0xEF, 0x27, 0x9F, 0x3F, 0x57, 0x82,
+0xDC, 0x3F, 0x2F, 0xAA, 0x88, 0xAE, 0x3A, 0x59, 0x1F, 0x48, 0x4D, 0xA4, 0x15, 0xDE, 0x07, 0x8E,
+0x49, 0xF6, 0x88, 0x11, 0xB2, 0x1C, 0x22, 0xE9, 0x07, 0x9B, 0xE1, 0x5E, 0x61, 0xC6, 0x0D, 0x4D,
+0xB0, 0xB2, 0x26, 0xAA, 0x9A, 0x29, 0xB5, 0x52, 0xD5, 0x34, 0x85, 0xCF, 0xDB, 0x2D, 0x6D, 0xD7,
+0x3A, 0x18, 0x75, 0x3C, 0x03, 0x95, 0x96, 0xFE, 0x64, 0xF7, 0xEE, 0xDB, 0x19, 0x7A, 0x90, 0x2C,
+0xBA, 0x19, 0x07, 0x77, 0x9C, 0x38, 0x8C, 0xC0, 0x09, 0xFE, 0x80, 0x68, 0xED, 0xC0, 0x76, 0x5D,
+0x1E, 0x38, 0x41, 0x6C, 0x64, 0x6C, 0x14, 0x00, 0x8D, 0xF4, 0x4D, 0x38, 0x0B, 0x8D, 0xB3, 0x68,
+0x58, 0xC7, 0x4B, 0x23, 0xB9, 0xD3, 0x78, 0xF9, 0x9E, 0xC0, 0x3A, 0x3F, 0x8C, 0xD0, 0xB9, 0xDA,
+0x69, 0xF5, 0x69, 0x54, 0x6C, 0x8A, 0x6A, 0xE6, 0x2D, 0xA9, 0xD4, 0xB5, 0x62, 0x8E, 0xF1, 0x47,
+0x04, 0xC9, 0xDC, 0xBE, 0x2D, 0xEB, 0xC5, 0xBF, 0xAE, 0xD9, 0x3F, 0x6E, 0x9A, 0x81, 0x7F, 0xB9,
+0x47, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xB8, 0x55, 0x08, 0xDC, 0x71, 0xC4, 0x8E, 0x40, 0x4F, 0x8B,
+0x62, 0x87, 0xFD, 0x52, 0xB1, 0xF8, 0x30, 0x21, 0xF1, 0x34, 0x76, 0x9B, 0x90, 0x34, 0x27, 0x19,
+0xA9, 0x8B, 0x03, 0x92, 0xA9, 0x17, 0xB9, 0x7A, 0x95, 0xAB, 0x39, 0x4E, 0x12, 0xE4, 0x1A, 0x2F,
+0x5F, 0x91, 0x7B, 0x7C, 0x5D, 0x84, 0x19, 0x98, 0xC4, 0x4E, 0xD6, 0xD5, 0xF9, 0x70, 0x6D, 0x0C,
+0x1B, 0xC3, 0x37, 0x39, 0x80, 0x82, 0x4D, 0xE4, 0xA2, 0xBA, 0x01, 0xDB, 0x38, 0x3D, 0x89, 0xBC,
+0x76, 0x4F, 0xDF, 0x7F, 0x20, 0xDC, 0xBB, 0x77, 0x67, 0xE8, 0x84, 0x92, 0xC4, 0x88, 0x60, 0xDD,
+0x4B, 0xD6, 0x77, 0xA4, 0x30, 0x02, 0x90, 0xF5, 0x2B, 0x29, 0x30, 0xA9, 0x83, 0xDA, 0xFF, 0x5C,
+0xC1, 0xA9, 0x55, 0x6F, 0xEA, 0xBD, 0x97, 0x61, 0xE5, 0x60, 0x0B, 0x6B, 0xD2, 0x17, 0x9E, 0x9F,
+0x8E, 0xCF, 0xCD, 0xB0, 0xA7, 0xD8, 0x66, 0x55, 0xC7, 0x32, 0x95, 0xDB, 0xE9, 0x0B, 0xF9, 0x37,
+0x36, 0xD1, 0xCE, 0xC9, 0xD8, 0xE4, 0x0A, 0x6B, 0xFA, 0xD8, 0x55, 0x87, 0x4B, 0xEF, 0x93, 0x9F,
+0xF3, 0xEA, 0xAC, 0x8A, 0xCA, 0xFB, 0x46, 0x3B, 0x95, 0xA0, 0x44, 0xE6, 0x87, 0xA7, 0x50, 0x81,
+0x19, 0x6D, 0xCD, 0xF3, 0x7D, 0x3D, 0xDD, 0x61, 0x27, 0x88, 0x4C, 0x47, 0x13, 0x12, 0xF1, 0xF2,
+0x47, 0xC3, 0xF0, 0xD8, 0x44, 0x38, 0x7B, 0x65, 0x88, 0x31, 0xDE, 0x48, 0x73, 0x82, 0x6D, 0xC4,
+0xDA, 0x3B, 0x5D, 0xBC, 0x4C, 0xD3, 0xD4, 0x08, 0x6C, 0x42, 0x24, 0x01, 0xA9, 0x48, 0xE5, 0x18,
+0xEA, 0xF3, 0xF8, 0xB3, 0xC6, 0x88, 0x6F, 0xAE, 0xEE, 0x29, 0x31, 0x4F, 0xE3, 0x97, 0xAB, 0x75,
+0x2C, 0x47, 0x52, 0xD7, 0x82, 0x07, 0x03, 0x4A, 0xDA, 0xC0, 0x74, 0xF7, 0x62, 0xFF, 0xE2, 0x12,
+0x11, 0x9B, 0xE6, 0x60, 0x79, 0x56, 0x10, 0x28, 0x08, 0x14, 0x04, 0x6E, 0x06, 0x02, 0x77, 0x14,
+0xB1, 0x53, 0xDF, 0xB0, 0x00, 0xF3, 0xD4, 0x6C, 0xB8, 0x3E, 0x81, 0x40, 0x01, 0xEE, 0xC2, 0x00,
+0xC7, 0x76, 0x46, 0x2C, 0x52, 0xB1, 0xCA, 0x97, 0x79, 0xF7, 0x1B, 0xF3, 0x05, 0xCE, 0xFD, 0xB5,
+0xD4, 0xCF, 0xCC, 0x0E, 0xF1, 0x27, 0x23, 0x1F, 0x4C, 0xCA, 0x85, 0xBF, 0x67, 0x5E, 0x48, 0x42,
+0x23, 0xA4, 0x0E, 0x53, 0xB0, 0xA6, 0x61, 0x22, 0x23, 0xB1, 0xE2, 0xB9, 0x2B, 0xA3, 0x93, 0x42,
+0x32, 0x6F, 0xC5, 0xC1, 0x36, 0x30, 0xFD, 0xC9, 0x6F, 0x7C, 0xE5, 0xA9, 0xF0, 0xAB, 0xCF, 0x3E,
+0x19, 0x36, 0x20, 0x49, 0x2C, 0x36, 0xE2, 0x10, 0xA7, 0xF6, 0xD9, 0x49, 0x92, 0x11, 0x9A, 0x89,
+0x55, 0xC1, 0x52, 0xFF, 0x38, 0x5D, 0xD2, 0xAB, 0xEA, 0x98, 0x29, 0x5B, 0xA2, 0x84, 0x69, 0x2E,
+0xB4, 0xC8, 0x78, 0x78, 0xCE, 0xFC, 0xED, 0x44, 0x0F, 0x8A, 0x0A, 0x5E, 0x2A, 0xE3, 0xA6, 0xEF,
+0x68, 0xD2, 0x15, 0xC5, 0x94, 0xC8, 0x98, 0x72, 0xEA, 0x6A, 0x92, 0xD4, 0xCF, 0xB6, 0x24, 0xD9,
+0xAC, 0x12, 0xA5, 0xEA, 0x7E, 0x7D, 0xA2, 0xB6, 0xE9, 0xC3, 0x7D, 0xFB, 0x5C, 0x39, 0x12, 0x25,
+0xD0, 0x7D, 0xEB, 0x6C, 0x1E, 0x38, 0x0F, 0xD1, 0xF2, 0x6C, 0xB9, 0xFA, 0xA0, 0xE9, 0xBD, 0x5C,
+0xB9, 0x33, 0xAE, 0x6E, 0x84, 0x2D, 0xAA, 0x73, 0x99, 0x82, 0x27, 0xEA, 0x9D, 0xB5, 0x2F, 0x45,
+0xC5, 0x22, 0xE2, 0x18, 0x3F, 0x1A, 0x66, 0x69, 0x86, 0xA5, 0xF9, 0x7B, 0xC3, 0xBA, 0xD0, 0xD7,
+0x0B, 0x82, 0x55, 0xEF, 0xC7, 0xC3, 0x4D, 0x9E, 0x00, 0xB3, 0x98, 0x53, 0x57, 0x87, 0x46, 0x41,
+0xEE, 0x90, 0xC2, 0xA6, 0xA5, 0x3D, 0x74, 0xF4, 0xC0, 0xBF, 0xAE, 0x85, 0xCA, 0x58, 0xE2, 0x9D,
+0xAE, 0xBA, 0xE9, 0x18, 0xA9, 0xB2, 0x26, 0x7E, 0x74, 0x56, 0x28, 0x29, 0xB4, 0x3A, 0x1E, 0xAA,
+0xEC, 0xB9, 0xAA, 0xAA, 0xE3, 0x13, 0x31, 0x36, 0xCA, 0x28, 0x73, 0xDE, 0xC6, 0xC2, 0xFD, 0x2B,
+0xCD, 0x46, 0xCE, 0x89, 0x05, 0xC5, 0x0E, 0xCA, 0xE5, 0xFC, 0x94, 0x28, 0x76, 0xED, 0x8C, 0x10,
+0xA6, 0xCF, 0x61, 0x13, 0x88, 0xEE, 0x4D, 0x86, 0xB7, 0x54, 0x57, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x6E, 0x6B, 0x04, 0xEE, 0x28, 0x62, 0xC7, 0x91, 0x98, 0xC5, 0xA2, 0x72, 0x7D, 0x7C, 0x2A, 0x70,
+0x4B, 0x2F, 0x2E, 0xE5, 0xE2, 0x5F, 0xE7, 0xBB, 0x4D, 0xC4, 0xA1, 0xAA, 0xAF, 0xEA, 0x2C, 0x90,
+0x70, 0xB2, 0xF2, 0xB9, 0x72, 0x91, 0x13, 0x44, 0x21, 0x43, 0x72, 0x27, 0x25, 0x1C, 0xCC, 0x67,
+0x46, 0x42, 0xC9, 0x5D, 0xCC, 0xAE, 0x8C, 0x20, 0x1A, 0x57, 0xFC, 0xFC, 0x9A, 0x7F, 0x70, 0xE1,
+0x5D, 0xD7, 0xDB, 0x1D, 0x1E, 0x46, 0xFA, 0x93, 0xCF, 0x3E, 0x74, 0x30, 0x3C, 0x76, 0x68, 0x6F,
+0xE8, 0xED, 0x52, 0x7F, 0x3B, 0xAA, 0x76, 0xF9, 0x6E, 0x14, 0x15, 0xED, 0x2A, 0x57, 0xBD, 0xA2,
+0xA4, 0x53, 0x23, 0x6F, 0x55, 0xE4, 0xAF, 0xEC, 0x45, 0x94, 0xBB, 0xAA, 0xFD, 0x75, 0x6C, 0xF4,
+0x6C, 0x2A, 0xEF, 0x66, 0x3E, 0xB9, 0xCC, 0x70, 0xD4, 0x22, 0xB5, 0x75, 0xA6, 0x73, 0x51, 0x3D,
+0xB5, 0x26, 0x25, 0x7F, 0x41, 0xBD, 0x46, 0x48, 0x76, 0xA6, 0x2C, 0xB9, 0x32, 0xE7, 0x35, 0x2A,
+0xAF, 0x49, 0x65, 0xD3, 0x10, 0x1B, 0x2B, 0xB2, 0x13, 0x5A, 0x8F, 0x57, 0x58, 0x6D, 0x92, 0xB7,
+0x71, 0x16, 0x09, 0xA0, 0x69, 0xE2, 0x6F, 0x47, 0x34, 0xEA, 0xFE, 0x1D, 0x5B, 0x25, 0x58, 0xA5,
+0x19, 0x41, 0x02, 0x93, 0x48, 0x48, 0x7C, 0xFA, 0xE2, 0xB5, 0x30, 0x8E, 0xC8, 0xEB, 0x56, 0xDC,
+0xBB, 0xAD, 0xA7, 0x3F, 0x12, 0xAE, 0x24, 0xDB, 0xF9, 0x4F, 0x0E, 0x87, 0xDC, 0xC7, 0xD0, 0x3A,
+0xE5, 0x7D, 0xB3, 0xF1, 0x48, 0x63, 0x91, 0xA9, 0xAF, 0x24, 0x83, 0x71, 0x5C, 0xEA, 0x8D, 0x49,
+0x1A, 0x4F, 0x25, 0x8A, 0xF8, 0xCC, 0xF1, 0xB3, 0x86, 0xE7, 0x03, 0x3D, 0x9D, 0x61, 0x13, 0x7E,
+0x4C, 0xB4, 0x21, 0x59, 0x76, 0x39, 0x0A, 0x02, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0xE6, 0x21,
+0x70, 0xC7, 0x11, 0xBB, 0x29, 0xE4, 0xAF, 0x3B, 0x4B, 0xFF, 0x3A, 0x2C, 0x2E, 0x74, 0xE0, 0x9E,
+0x18, 0xC1, 0x6E, 0x13, 0x92, 0x05, 0xDF, 0xA4, 0x38, 0x5B, 0xD0, 0xA2, 0xFA, 0x64, 0xC6, 0x27,
+0xA7, 0x67, 0x0B, 0x16, 0x7A, 0x59, 0xDD, 0xA3, 0x31, 0x52, 0x55, 0x1F, 0xAE, 0x95, 0x26, 0x7E,
+0x44, 0x01, 0xCA, 0x42, 0x63, 0xE7, 0xA0, 0xA6, 0x50, 0x21, 0xA4, 0xD9, 0x53, 0x15, 0xBB, 0x9C,
+0x05, 0xDD, 0xBC, 0x81, 0x6D, 0xA4, 0x26, 0x92, 0x0C, 0x46, 0x24, 0xEE, 0xDF, 0xB9, 0x25, 0xFC,
+0xF2, 0xE7, 0x1F, 0xC7, 0x76, 0x57, 0x03, 0x91, 0xF8, 0x30, 0xB7, 0x1D, 0x03, 0x4A, 0xD2, 0xD2,
+0xED, 0x2B, 0x7D, 0x8A, 0x78, 0x14, 0x1F, 0x38, 0x01, 0xCA, 0xA2, 0x67, 0x45, 0x09, 0x73, 0xD5,
+0xCD, 0x88, 0x90, 0x2B, 0x3B, 0xA6, 0xF8, 0x44, 0x62, 0x11, 0x1D, 0xBD, 0xCC, 0x8F, 0xCF, 0x55,
+0x37, 0x51, 0x7D, 0x92, 0x3F, 0x9F, 0x4A, 0x68, 0x8A, 0xA9, 0xE7, 0x4C, 0x73, 0x55, 0x48, 0xA8,
+0x49, 0xF4, 0x67, 0x4C, 0xAA, 0x93, 0x2B, 0x6E, 0xEE, 0x13, 0x68, 0x72, 0x9A, 0x10, 0x0A, 0x55,
+0x1C, 0xB5, 0xBD, 0x19, 0xB5, 0x31, 0xA1, 0x2A, 0x53, 0xF5, 0x5C, 0xA5, 0x92, 0x3E, 0xD9, 0x7D,
+0xBC, 0x8D, 0xF1, 0x9C, 0xFA, 0xAB, 0xC5, 0x08, 0xDA, 0xC8, 0x89, 0x50, 0x3F, 0xD5, 0x60, 0xE4,
+0x06, 0xA4, 0xA5, 0xBD, 0x13, 0xBB, 0x7E, 0xDC, 0x7F, 0xD7, 0xAE, 0xD0, 0xDB, 0xDD, 0x2C, 0xFF,
+0xBA, 0xA9, 0xF0, 0xFE, 0xC9, 0x0B, 0xF2, 0xA3, 0xA1, 0x15, 0x51, 0xB8, 0xED, 0x42, 0xEC, 0x38,
+0xDB, 0x4D, 0x89, 0x34, 0x9F, 0x3A, 0x57, 0x54, 0x75, 0x0F, 0xDE, 0x2C, 0x02, 0x5A, 0xC6, 0xC0,
+0x19, 0x9B, 0xF9, 0x26, 0x46, 0x85, 0x8E, 0x18, 0x25, 0x45, 0x54, 0x09, 0x1B, 0xC7, 0xC6, 0x30,
+0xCD, 0x95, 0x3D, 0x9F, 0xFC, 0x46, 0xEA, 0x5A, 0x38, 0x9F, 0x24, 0x48, 0x29, 0x84, 0xAD, 0x48,
+0xFB, 0xD2, 0x29, 0x6A, 0x9D, 0xCF, 0xA1, 0x46, 0x66, 0x6C, 0x29, 0x53, 0x10, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0xCB, 0x21, 0x70, 0xE7, 0x11, 0x3B, 0x10, 0xAB, 0x0B, 0x43, 0x1A, 0x38, 0x31,
+0x0F, 0x7F, 0x9F, 0xC9, 0x31, 0xEE, 0x0F, 0x1B, 0x65, 0x07, 0xC5, 0x2B, 0x2A, 0x44, 0x55, 0xD2,
+0xA5, 0xC6, 0x48, 0x3B, 0xA2, 0x6A, 0x94, 0x29, 0x4C, 0x66, 0x76, 0x8D, 0x55, 0xE4, 0x97, 0xDB,
+0x73, 0xEE, 0x45, 0x3B, 0xC3, 0x7C, 0x71, 0xB8, 0x7E, 0x18, 0x0E, 0xEE, 0xE3, 0xDC, 0x33, 0x36,
+0x57, 0xA0, 0x96, 0x1B, 0xB1, 0x9B, 0xFC, 0xBE, 0xF8, 0xDB, 0x41, 0x39, 0x79, 0xEC, 0xD0, 0x1E,
+0x51, 0xED, 0xFA, 0xE1, 0x0B, 0xC6, 0x65, 0x7E, 0x16, 0x0E, 0xFF, 0x73, 0xB3, 0x6C, 0xA7, 0x2B,
+0x8A, 0xB5, 0x04, 0xB4, 0xAA, 0x6A, 0xAA, 0x39, 0xD5, 0x95, 0x2B, 0xEF, 0x6C, 0x04, 0x2B, 0x09,
+0x71, 0x95, 0x6A, 0x6A, 0xCA, 0xE5, 0x98, 0x92, 0x2C, 0x08, 0x90, 0xB9, 0x12, 0xA4, 0xFE, 0x76,
+0x3A, 0x46, 0x29, 0xB8, 0x21, 0x96, 0xC9, 0x95, 0x38, 0x97, 0xE2, 0xE2, 0x80, 0xA6, 0xEB, 0x74,
+0x7C, 0xD2, 0x6B, 0x21, 0x3C, 0xF2, 0xD2, 0xCC, 0xE6, 0xD9, 0x18, 0x7B, 0x10, 0x47, 0x14, 0xB0,
+0x44, 0x79, 0xD5, 0x39, 0xB2, 0x40, 0xD7, 0xF5, 0x42, 0x7C, 0x8F, 0x51, 0xC6, 0xD8, 0x71, 0x82,
+0x47, 0x37, 0x02, 0x26, 0x0E, 0xEC, 0xDC, 0x86, 0xFD, 0x61, 0x9B, 0x15, 0x11, 0x3B, 0x1D, 0x3E,
+0xBA, 0x78, 0x25, 0xCC, 0xA0, 0xA1, 0x6D, 0x48, 0x4C, 0xDC, 0xD2, 0xD9, 0x5D, 0x41, 0xA1, 0xD2,
+0xEE, 0xCA, 0x3C, 0xCE, 0xA9, 0x6E, 0x9A, 0x68, 0x29, 0x9F, 0x60, 0x9D, 0xF9, 0x2F, 0x24, 0x37,
+0x0D, 0x53, 0x1E, 0x51, 0x1D, 0x07, 0x9D, 0x63, 0x25, 0xBE, 0x75, 0xDC, 0x1F, 0x79, 0x56, 0xB6,
+0x56, 0xDB, 0xB3, 0x79, 0x3D, 0xD2, 0x9D, 0x34, 0x27, 0xF5, 0xCB, 0x4D, 0xFE, 0xC8, 0x94, 0xEA,
+0x0A, 0x02, 0x05, 0x81, 0x82, 0xC0, 0x6D, 0x8D, 0xC0, 0x1D, 0x45, 0xEC, 0xA8, 0x50, 0x30, 0x4A,
+0xF0, 0x22, 0x02, 0x27, 0xE8, 0xE7, 0xC3, 0x34, 0x14, 0x53, 0x08, 0x9C, 0x90, 0x05, 0x48, 0xFC,
+0xB7, 0x9C, 0x92, 0x69, 0x24, 0xA7, 0x26, 0x32, 0xD3, 0x55, 0xCB, 0x34, 0x23, 0x2D, 0x2B, 0xFA,
+0x86, 0x51, 0x0C, 0xB5, 0xB3, 0xAA, 0x5B, 0x98, 0x55, 0xE3, 0x2B, 0xBF, 0x47, 0xD3, 0xE6, 0x94,
+0x41, 0x22, 0x25, 0x99, 0xD7, 0x0C, 0x27, 0x19, 0x38, 0x31, 0x8C, 0xC8, 0xD8, 0x5B, 0xA9, 0xDA,
+0xF9, 0xEC, 0x64, 0x30, 0xC5, 0xCF, 0x7F, 0xE6, 0xE1, 0xB0, 0x03, 0x09, 0x8C, 0x65, 0x17, 0x4F,
+0xB4, 0x73, 0x8E, 0x49, 0x8B, 0xA1, 0xB0, 0x28, 0x07, 0x32, 0x5A, 0x6B, 0x6A, 0x4D, 0xCC, 0x51,
+0x17, 0x57, 0x75, 0x25, 0x05, 0x1E, 0x2D, 0xAB, 0x42, 0xA6, 0xAA, 0x5D, 0xEA, 0xDF, 0x96, 0x94,
+0x2F, 0x77, 0x64, 0x4B, 0xEF, 0x99, 0x1A, 0xE7, 0x91, 0x97, 0xE2, 0x93, 0x67, 0xD7, 0xB9, 0x3A,
+0x26, 0x4A, 0x90, 0xA9, 0x7B, 0xA6, 0xE2, 0x79, 0x14, 0x6D, 0xC5, 0x5F, 0x4C, 0x54, 0x22, 0x63,
+0x1A, 0xAE, 0x2C, 0xD9, 0xB5, 0x15, 0x7F, 0x3B, 0x91, 0xD9, 0x4C, 0x6D, 0xE3, 0x15, 0xD2, 0x3E,
+0x53, 0x5B, 0xFD, 0x72, 0x51, 0x0A, 0xF5, 0x21, 0x63, 0x68, 0xE7, 0xDD, 0x8F, 0x4E, 0x9B, 0x68,
+0xCA, 0x9F, 0xDC, 0x23, 0xAB, 0x0F, 0x04, 0x86, 0xBE, 0x8A, 0xBC, 0xB2, 0x17, 0x26, 0xD8, 0xED,
+0x08, 0x14, 0x68, 0x46, 0x62, 0x62, 0xB6, 0x71, 0x12, 0x26, 0xD8, 0xF3, 0xD7, 0xA0, 0x44, 0x43,
+0x93, 0x6E, 0xEB, 0xEE, 0x85, 0x58, 0xD7, 0xAE, 0xB3, 0xD6, 0xC8, 0x70, 0x52, 0xA7, 0x6D, 0xC2,
+0x1A, 0xC6, 0x56, 0x28, 0xCE, 0x79, 0x76, 0x58, 0xAE, 0x89, 0x63, 0xA7, 0xF3, 0x5E, 0xCE, 0xDB,
+0xF8, 0xB8, 0xDF, 0x63, 0x8A, 0x94, 0x4D, 0x91, 0xB0, 0x32, 0x67, 0x38, 0x8F, 0x08, 0xDE, 0x1C,
+0x7D, 0xEB, 0xF0, 0xA3, 0x06, 0x9F, 0xBB, 0x36, 0xE0, 0x7A, 0x70, 0xE7, 0x66, 0x10, 0xDD, 0x42,
+0xEC, 0x6E, 0xEB, 0xD5, 0xA1, 0x34, 0xAE, 0x20, 0x50, 0x10, 0xF8, 0x44, 0x22, 0x70, 0x47, 0x11,
+0x3B, 0x4D, 0x31, 0x32, 0x13, 0x06, 0x11, 0x38, 0x41, 0x62, 0x47, 0xB5, 0x8E, 0x66, 0xD1, 0x8A,
+0x2A, 0x24, 0x24, 0xCF, 0x08, 0x9E, 0xA9, 0x38, 0xC9, 0x99, 0xCA, 0x89, 0x9F, 0x8E, 0xB5, 0x69,
+0x3E, 0x0B, 0xD5, 0xA8, 0x48, 0x04, 0xD3, 0x9C, 0x90, 0xA8, 0x51, 0xAE, 0x6F, 0x50, 0xC0, 0x26,
+0xC7, 0x95, 0xD8, 0x31, 0xD5, 0xC9, 0x95, 0xD1, 0x09, 0x6C, 0x6F, 0xA6, 0xBB, 0x51, 0xDC, 0xCA,
+0x83, 0xF9, 0xD5, 0x1E, 0x3A, 0xB0, 0x4B, 0x94, 0xBB, 0x75, 0xBD, 0x3D, 0xB2, 0xA0, 0x93, 0xD4,
+0xCD, 0x41, 0xB9, 0xA3, 0xA9, 0x3A, 0x1D, 0x22, 0x55, 0x19, 0x00, 0xA6, 0xF0, 0x18, 0x64, 0xAE,
+0xA6, 0xA9, 0x6A, 0x63, 0x04, 0xD8, 0x9F, 0x1A, 0xD9, 0x52, 0x48, 0xAD, 0x82, 0x1C, 0x40, 0x21,
+0x48, 0xD9, 0x7B, 0xB9, 0xE2, 0x16, 0x55, 0x25, 0xBB, 0x75, 0xBC, 0x5E, 0xCD, 0x80, 0x7E, 0x59,
+0xAE, 0x44, 0xF9, 0x79, 0xE7, 0x78, 0xD2, 0xD2, 0xCA, 0xFD, 0x6A, 0xD1, 0xD6, 0x7E, 0x65, 0xB7,
+0xB2, 0x1E, 0x78, 0x5F, 0x33, 0x62, 0x97, 0x5F, 0x1A, 0xFB, 0x57, 0x3D, 0xC9, 0xC0, 0x09, 0xFA,
+0x29, 0xCA, 0x6E, 0x1F, 0x1B, 0xD7, 0x87, 0x8D, 0x20, 0xCE, 0x7C, 0xBE, 0xDA, 0xC7, 0x0C, 0xC6,
+0xEC, 0xD2, 0xF5, 0x91, 0x30, 0x34, 0x8E, 0x1F, 0x2C, 0xB8, 0x5F, 0xBB, 0x10, 0x3B, 0x35, 0x79,
+0x56, 0x0E, 0x9F, 0xDB, 0x36, 0x91, 0x5D, 0x71, 0xD5, 0x1F, 0x2D, 0xA9, 0xCF, 0x69, 0xAC, 0xAD,
+0xA0, 0xFD, 0x89, 0xBF, 0x81, 0xF2, 0x9A, 0x8D, 0x38, 0xDA, 0x40, 0xC6, 0x71, 0x11, 0xD5, 0x97,
+0xF3, 0x08, 0xC4, 0x8E, 0xF8, 0x32, 0x49, 0xB3, 0xEE, 0x38, 0x51, 0x88, 0xDD, 0x6A, 0xCF, 0x87,
+0x52, 0x7F, 0x41, 0xA0, 0x20, 0x70, 0xE7, 0x21, 0xB0, 0xFA, 0x2B, 0xCD, 0x6D, 0x82, 0xA9, 0x04,
+0x2E, 0x30, 0x5A, 0x10, 0x44, 0x6A, 0x02, 0x7E, 0x76, 0xB3, 0xF0, 0x6D, 0x1B, 0x1D, 0x82, 0x0F,
+0x14, 0x77, 0x5A, 0x88, 0xD1, 0x7E, 0xAA, 0xDA, 0xA4, 0x95, 0xCD, 0x3D, 0xEB, 0xDC, 0x8F, 0xCC,
+0x16, 0x7E, 0x53, 0x7A, 0xD4, 0xE7, 0x2B, 0x19, 0x68, 0x5D, 0xC7, 0x8B, 0x7E, 0x69, 0x51, 0xE4,
+0x32, 0x3F, 0x22, 0x2A, 0x40, 0x20, 0x73, 0x13, 0xE3, 0xE3, 0x42, 0x9C, 0xB8, 0xA5, 0xD8, 0xD9,
+0xEB, 0x63, 0xE2, 0xE4, 0x7E, 0x3B, 0x1C, 0xDC, 0xF2, 0xEA, 0x67, 0x9F, 0x7A, 0x00, 0x69, 0x28,
+0x36, 0x8A, 0xDA, 0xC3, 0x45, 0x98, 0x09, 0x8B, 0x99, 0xDF, 0x4E, 0xE5, 0x2A, 0xB6, 0x32, 0xF9,
+0xC0, 0x49, 0x94, 0xA4, 0xF9, 0x63, 0xA9, 0x5A, 0xA9, 0xFE, 0x58, 0xAA, 0xF4, 0xF0, 0x8F, 0x96,
+0x75, 0x3C, 0xF2, 0x9D, 0x28, 0x84, 0x40, 0x58, 0x84, 0x68, 0xCA, 0x79, 0x46, 0x3F, 0x2D, 0x55,
+0x79, 0xFC, 0x3E, 0x72, 0x0F, 0xB9, 0x8F, 0xA9, 0x63, 0xA6, 0x20, 0xB9, 0xEA, 0x97, 0xEF, 0x2F,
+0x5B, 0x21, 0x94, 0xD1, 0xF7, 0x4E, 0xEF, 0xA3, 0x51, 0xBB, 0xA6, 0x1A, 0xB2, 0xFE, 0x4C, 0xD9,
+0x13, 0x3F, 0x31, 0xF3, 0x31, 0xD3, 0xD6, 0x7A, 0x39, 0x15, 0x72, 0x9D, 0xD2, 0xA8, 0x22, 0x67,
+0x8A, 0x95, 0xF7, 0x31, 0x53, 0xF5, 0x1C, 0x22, 0x12, 0xE1, 0x99, 0x09, 0xAA, 0x9D, 0x88, 0xFE,
+0xEC, 0xE8, 0x08, 0x77, 0xEF, 0xD9, 0xD6, 0xC4, 0xC4, 0xC4, 0xD3, 0xE1, 0xC8, 0xD9, 0x4B, 0x98,
+0xEB, 0x30, 0xC3, 0x32, 0x70, 0xA2, 0x9B, 0xFE, 0x75, 0x0A, 0xA9, 0xAA, 0xD0, 0xF6, 0xC8, 0xB0,
+0x48, 0x51, 0xC4, 0xAA, 0x88, 0xAA, 0xE9, 0xD5, 0x14, 0x52, 0x57, 0x32, 0x4D, 0x2D, 0x75, 0xB5,
+0x2E, 0xC7, 0xD3, 0x23, 0x68, 0xAB, 0x91, 0xB0, 0x49, 0xD9, 0x93, 0xA0, 0x09, 0x12, 0x3B, 0x04,
+0x92, 0xD0, 0xD3, 0xAF, 0x1F, 0x81, 0x13, 0x0C, 0xDC, 0xA1, 0x1B, 0x40, 0x33, 0x82, 0x49, 0x6E,
+0x87, 0xCF, 0x56, 0x69, 0x43, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x68, 0x16, 0x02, 0x77, 0x0C, 0xB1,
+0x23, 0xA0, 0x4C, 0x2D, 0x72, 0x61, 0x90, 0x0A, 0x19, 0x89, 0xDD, 0x6C, 0x18, 0x1B, 0x61, 0x32,
+0xDE, 0x8A, 0xE4, 0x53, 0x15, 0xEF, 0xB2, 0x51, 0x70, 0x61, 0x46, 0x08, 0x8C, 0xD2, 0x0E, 0x25,
+0x30, 0x0B, 0x46, 0x4A, 0xCF, 0x24, 0xBA, 0xA7, 0xE5, 0xFC, 0x1C, 0x9F, 0x4E, 0x21, 0xE5, 0xC9,
+0x0C, 0xB6, 0x7C, 0xA2, 0x62, 0x77, 0x71, 0x78, 0x32, 0x8C, 0xD8, 0xBE, 0xB1, 0x0B, 0xEB, 0x6A,
+0xD6, 0x34, 0xD0, 0xFB, 0xD0, 0x34, 0xF6, 0xE0, 0xFE, 0x9D, 0x50, 0xED, 0x76, 0x8B, 0xDF, 0x1D,
+0xDB, 0xC3, 0xA8, 0x4E, 0x2A, 0x4F, 0x24, 0xC0, 0xA9, 0xB7, 0x75, 0x64, 0x2A, 0x6B, 0xBC, 0x92,
+0x24, 0x75, 0xAE, 0xAF, 0x2A, 0x9D, 0xD6, 0x97, 0x88, 0x59, 0xEA, 0x6D, 0x54, 0xC9, 0x8C, 0x3B,
+0xC6, 0x31, 0x59, 0xA0, 0x32, 0x65, 0xAA, 0x5B, 0x0E, 0x56, 0x1C, 0xC2, 0xAA, 0x8F, 0x58, 0xF4,
+0x0D, 0x73, 0x66, 0x66, 0x3D, 0xD0, 0xFB, 0x59, 0x1F, 0x62, 0x3B, 0x85, 0xCA, 0xC4, 0xF3, 0x9E,
+0x1A, 0xC7, 0x47, 0x20, 0x4E, 0x13, 0x1B, 0xF7, 0x48, 0x5E, 0xF3, 0x21, 0x92, 0xCB, 0x95, 0xBC,
+0xCF, 0xC0, 0x8C, 0xCD, 0xFA, 0x3A, 0xE1, 0x47, 0x76, 0xF7, 0xEE, 0xED, 0x4D, 0x24, 0x76, 0x33,
+0xE1, 0xE8, 0xF9, 0x2B, 0x61, 0x1A, 0x0D, 0x6E, 0x05, 0xA9, 0x6C, 0x15, 0xFF, 0x3A, 0x35, 0x3B,
+0x47, 0x49, 0xD2, 0x3A, 0x13, 0x89, 0xA8, 0xBD, 0xA5, 0xC4, 0x2F, 0xCD, 0x57, 0xED, 0x9A, 0x9D,
+0xAB, 0xBC, 0x57, 0x7B, 0x2E, 0xBB, 0x26, 0x62, 0xAB, 0x44, 0x5C, 0xE6, 0x00, 0xE6, 0x10, 0x49,
+0x1D, 0xD5, 0xC4, 0x0E, 0xEC, 0x82, 0xB1, 0x9D, 0xA9, 0x5F, 0x24, 0x42, 0xB8, 0xB9, 0xF3, 0xBB,
+0xDC, 0xAD, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x09, 0x08, 0xDC, 0x31, 0xC4, 0xCE, 0x77, 0x9C,
+0x38, 0x79, 0x6D, 0x54, 0x08, 0x1E, 0x89, 0xDD, 0x04, 0x88, 0x1D, 0x55, 0x15, 0x59, 0x8B, 0xA2,
+0x8F, 0x9D, 0x2D, 0x52, 0xAE, 0xDC, 0x91, 0xC8, 0x89, 0x5C, 0xA4, 0x8B, 0x9C, 0x69, 0x54, 0xAA,
+0x20, 0xC5, 0x19, 0xA2, 0x84, 0xC0, 0xBC, 0xCC, 0xE2, 0x7B, 0xEE, 0xA1, 0xE5, 0xAA, 0x9E, 0x13,
+0x8D, 0x59, 0x6C, 0xF3, 0x34, 0x0E, 0xD5, 0x6E, 0x06, 0x04, 0xF3, 0x2A, 0x22, 0x63, 0x47, 0xE9,
+0x67, 0x77, 0x0B, 0xB6, 0x17, 0xAB, 0x37, 0xC1, 0xD7, 0xF5, 0x75, 0x87, 0x9F, 0x7A, 0xE2, 0xFE,
+0x70, 0x10, 0xDB, 0x5F, 0xCD, 0x33, 0x92, 0x12, 0x1D, 0x15, 0x62, 0xC7, 0xC5, 0x99, 0xA9, 0x59,
+0x14, 0x2C, 0x01, 0x45, 0x55, 0x34, 0x5B, 0xFC, 0xAD, 0xD7, 0xAE, 0xAE, 0x59, 0xB0, 0xAC, 0x94,
+0x4D, 0x0B, 0x38, 0x55, 0x20, 0xCB, 0x89, 0x66, 0x51, 0xC2, 0x56, 0x9B, 0xE2, 0x17, 0x7D, 0xE2,
+0x4C, 0xED, 0xE1, 0xB5, 0x4E, 0x0E, 0x44, 0xA9, 0x33, 0x05, 0x30, 0xFA, 0x3E, 0xDA, 0x28, 0xB8,
+0xCA, 0x27, 0x7F, 0x35, 0xA7, 0x9C, 0x2B, 0x82, 0x51, 0xC5, 0xCB, 0x7C, 0xF6, 0xB4, 0xB8, 0x91,
+0x44, 0xA9, 0x53, 0xEF, 0xA7, 0xFE, 0x63, 0x3A, 0x6A, 0xD9, 0x69, 0x55, 0xBB, 0x4C, 0xC8, 0x95,
+0x3B, 0x9A, 0xD2, 0x94, 0xFA, 0x62, 0x2A, 0x9F, 0x31, 0x7E, 0xCE, 0x03, 0xC9, 0x05, 0x48, 0x62,
+0x07, 0x13, 0x37, 0x15, 0xBB, 0xA6, 0xED, 0x38, 0x81, 0x54, 0x27, 0x47, 0xCE, 0x5F, 0x83, 0x2F,
+0x29, 0xDA, 0x84, 0x1D, 0x27, 0x5A, 0x90, 0x98, 0x58, 0xA7, 0x37, 0x41, 0xB1, 0xBE, 0xDA, 0x18,
+0x24, 0xA5, 0x4D, 0xC7, 0xC5, 0x23, 0x5B, 0x23, 0x1E, 0x82, 0x91, 0x8F, 0x8B, 0x45, 0xCD, 0x3A,
+0xC6, 0x99, 0x92, 0x57, 0x51, 0x32, 0xB3, 0x48, 0x58, 0x51, 0x37, 0x89, 0x26, 0x82, 0x70, 0xF8,
+0x79, 0x9B, 0x46, 0xDB, 0xBA, 0x11, 0x09, 0x7B, 0x08, 0xBB, 0x9E, 0x74, 0x17, 0xFF, 0xBA, 0x3B,
+0x61, 0x7D, 0x29, 0x7D, 0x2C, 0x08, 0x14, 0x04, 0x6E, 0x01, 0x02, 0x77, 0x0C, 0xB1, 0xE3, 0xB2,
+0xC6, 0xDC, 0x75, 0x97, 0x90, 0x3B, 0x8E, 0xC1, 0x0A, 0x93, 0x08, 0x60, 0x98, 0x42, 0x9E, 0x31,
+0x59, 0x78, 0xA2, 0x64, 0xE4, 0x23, 0x90, 0xC9, 0x41, 0xFE, 0x94, 0x8B, 0x7B, 0x1D, 0x7D, 0x4E,
+0xAF, 0xC8, 0x0A, 0x59, 0x15, 0x7A, 0x26, 0x97, 0x95, 0xD2, 0xE8, 0x32, 0x81, 0xEC, 0xD8, 0x28,
+0x36, 0x87, 0xC7, 0xDF, 0xE1, 0xC9, 0x19, 0x49, 0xBF, 0x72, 0x61, 0x68, 0x42, 0xCC, 0x67, 0xB7,
+0xFA, 0xE0, 0x4E, 0x00, 0xF7, 0xEF, 0xDB, 0x16, 0x1E, 0x87, 0xAF, 0xDD, 0x66, 0xA4, 0xA4, 0xA0,
+0x49, 0x96, 0xB9, 0xFF, 0x44, 0xB9, 0x63, 0xBA, 0x8A, 0x5A, 0xAC, 0x32, 0x85, 0x66, 0xB1, 0xFE,
+0x26, 0x8C, 0xA2, 0xB4, 0xB6, 0x88, 0x32, 0xEA, 0x4A, 0x10, 0xA1, 0xCB, 0x54, 0xA1, 0x0C, 0x14,
+0x35, 0x93, 0x1A, 0xB6, 0xD9, 0xBD, 0x53, 0xE4, 0x66, 0x4E, 0xB2, 0xAD, 0x9E, 0x1C, 0xD4, 0xD8,
+0x04, 0x53, 0x93, 0x6A, 0x14, 0xDB, 0x2A, 0x61, 0xB7, 0x66, 0x58, 0xD1, 0x7C, 0x76, 0xE8, 0x5D,
+0x5C, 0x95, 0x72, 0xB5, 0x4F, 0xCB, 0x73, 0x3F, 0xE0, 0x59, 0x98, 0xB0, 0x99, 0x98, 0x78, 0x43,
+0x7F, 0x5F, 0xD8, 0xB6, 0x71, 0x1D, 0x72, 0xD9, 0xAD, 0xFE, 0x47, 0x8D, 0xF3, 0x69, 0x70, 0x64,
+0x3C, 0x5C, 0x1C, 0x1C, 0x0B, 0x73, 0x20, 0xE5, 0xAD, 0x1D, 0x3D, 0xC8, 0x4B, 0xEC, 0x7E, 0x6C,
+0x09, 0xFB, 0x8A, 0xD2, 0x9C, 0x8F, 0x9F, 0x99, 0x60, 0xAD, 0x67, 0xD2, 0x99, 0x5C, 0x4D, 0xF5,
+0xF3, 0xEA, 0xBF, 0xA8, 0xE3, 0xE3, 0xBE, 0xA3, 0x69, 0xBA, 0xDB, 0xCC, 0xCF, 0x71, 0x9D, 0xA5,
+0x39, 0x1F, 0x81, 0x13, 0x68, 0x1F, 0x7D, 0x39, 0xF7, 0x6D, 0xDB, 0x58, 0x76, 0x9C, 0xB8, 0xD5,
+0x1F, 0xF4, 0x72, 0xFF, 0x82, 0x40, 0x41, 0x60, 0xCD, 0x22, 0xB0, 0xFA, 0xAB, 0xCD, 0x2D, 0x86,
+0x4E, 0x95, 0x19, 0x3C, 0xA0, 0x60, 0xD0, 0x97, 0x6D, 0x08, 0xEA, 0x18, 0x4D, 0x42, 0x63, 0xC3,
+0xC3, 0x62, 0x5E, 0xCC, 0xED, 0x41, 0xAA, 0x69, 0x98, 0x4F, 0x98, 0x58, 0xAF, 0x92, 0x0F, 0x9D,
+0x3E, 0xA3, 0x6A, 0x91, 0x16, 0x74, 0xCF, 0x03, 0xE6, 0x75, 0x98, 0xA0, 0x64, 0xC1, 0xB4, 0xAE,
+0xE0, 0xA5, 0xA8, 0x42, 0xB7, 0xE1, 0xB2, 0x3D, 0xA3, 0x50, 0x0B, 0x67, 0xE1, 0x8B, 0x35, 0x85,
+0xC5, 0xEE, 0xC3, 0x8B, 0x43, 0xE1, 0x83, 0xF3, 0x43, 0x92, 0xFA, 0xE4, 0x76, 0x38, 0xB8, 0x31,
+0xFB, 0x17, 0x1F, 0x3D, 0x18, 0xEE, 0x83, 0x09, 0x51, 0x7D, 0xED, 0x5A, 0x62, 0x20, 0x85, 0x26,
+0x73, 0x8E, 0xAC, 0xC6, 0x22, 0x5F, 0x55, 0x49, 0xF3, 0x4D, 0x48, 0x75, 0xEF, 0x55, 0x9E, 0x32,
+0x62, 0x10, 0xCD, 0x9D, 0x66, 0xA6, 0x15, 0xC5, 0xAB, 0xC6, 0xDF, 0x8D, 0x8A, 0x99, 0x48, 0x63,
+0xAE, 0x7E, 0x79, 0xDC, 0xB1, 0x39, 0x88, 0x59, 0x1D, 0x5E, 0x26, 0xE6, 0xCB, 0xF3, 0xF3, 0xB5,
+0xBE, 0x6F, 0xA2, 0xDC, 0x65, 0x26, 0x61, 0x29, 0xE7, 0xED, 0x54, 0x5F, 0x32, 0xE1, 0x26, 0x36,
+0x3F, 0xDC, 0xF7, 0x2C, 0x46, 0xDA, 0x8A, 0x72, 0xA7, 0x6A, 0x95, 0x47, 0x7C, 0xE6, 0xE6, 0x59,
+0xAD, 0xDB, 0xFC, 0x0A, 0x85, 0x6C, 0x6A, 0x9F, 0x19, 0x1C, 0xC3, 0x2D, 0xD9, 0xE6, 0xA1, 0xC0,
+0xB6, 0xC3, 0xEC, 0xB8, 0x93, 0x69, 0x3D, 0x90, 0xEE, 0xA4, 0x19, 0xBE, 0x64, 0x13, 0x30, 0xEF,
+0x9F, 0x47, 0xE0, 0x04, 0xE7, 0x51, 0x0B, 0x76, 0x9A, 0x68, 0x93, 0xFD, 0x61, 0x75, 0xB0, 0xE4,
+0x3F, 0xFF, 0x2C, 0xF8, 0x78, 0x64, 0x7D, 0x4B, 0xBE, 0x73, 0x86, 0x89, 0xCC, 0x75, 0x53, 0x66,
+0xA3, 0x6A, 0xA7, 0x63, 0xEA, 0x91, 0xCF, 0xEE, 0xDF, 0xA8, 0xE3, 0x9C, 0xE9, 0xD5, 0x52, 0xDE,
+0xF3, 0x0A, 0xE2, 0x39, 0xD2, 0xFB, 0x50, 0xED, 0x65, 0x99, 0x1E, 0x10, 0xBB, 0xDD, 0x88, 0x10,
+0xA6, 0x89, 0xBA, 0x19, 0x98, 0xDC, 0x0E, 0x9F, 0xA7, 0xD2, 0x86, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0xD0, 0x4C, 0x04, 0xD6, 0x3C, 0xB1, 0x73, 0x30, 0x99, 0xE6, 0xE4, 0x32, 0xD4, 0xBA, 0x31, 0x2C,
+0x7A, 0x54, 0x0E, 0xE8, 0x5F, 0x27, 0xC4, 0x6E, 0xC1, 0xC1, 0x05, 0xCA, 0x8F, 0x5C, 0x41, 0xAB,
+0x51, 0xD3, 0x72, 0x45, 0x22, 0xAF, 0xC3, 0x8B, 0xC9, 0x42, 0x17, 0x19, 0x90, 0x31, 0x21, 0xE7,
+0x44, 0x08, 0xA0, 0x80, 0x62, 0x38, 0x8D, 0x85, 0x98, 0x66, 0xE1, 0xD3, 0xD7, 0xC6, 0xC2, 0x47,
+0x57, 0x47, 0xC3, 0x28, 0xF2, 0xDA, 0xD5, 0x0A, 0x62, 0xCD, 0x9C, 0x0C, 0x7E, 0x2F, 0xF5, 0x0B,
+0xDB, 0x1A, 0x9E, 0x80, 0xAF, 0x1D, 0x93, 0x16, 0x33, 0xB9, 0x2D, 0x09, 0xCB, 0x1C, 0xB7, 0x19,
+0x93, 0xC8, 0x46, 0xC3, 0x2D, 0x62, 0x60, 0x8A, 0x55, 0x45, 0xBD, 0xF3, 0x2E, 0xD7, 0x28, 0x63,
+0x19, 0xB6, 0xA9, 0xAF, 0xA6, 0xCE, 0x65, 0xD7, 0x47, 0x35, 0x2C, 0x62, 0x68, 0x17, 0x66, 0xC2,
+0x53, 0x85, 0x60, 0x1A, 0x91, 0x8C, 0x6A, 0x13, 0x6F, 0x5F, 0x19, 0x3E, 0xBB, 0x47, 0x4D, 0x7D,
+0x4A, 0x48, 0xD2, 0xE1, 0x63, 0x26, 0xDC, 0x27, 0x1B, 0x3F, 0x2D, 0x95, 0xDA, 0x29, 0x75, 0xFB,
+0x23, 0x8E, 0x2E, 0xFD, 0xEB, 0x80, 0xD3, 0x34, 0xF6, 0x21, 0xE6, 0xB6, 0x59, 0x50, 0xCB, 0xEE,
+0xDA, 0xBE, 0x19, 0x66, 0xD8, 0xE6, 0xE4, 0xAF, 0xE3, 0xFC, 0x39, 0x75, 0x69, 0x10, 0x5B, 0xE6,
+0x21, 0x20, 0xA8, 0x0D, 0xFE, 0x75, 0x1D, 0xE6, 0x5F, 0x97, 0xF5, 0x44, 0xBB, 0x94, 0xB0, 0x10,
+0xEB, 0xB1, 0xF2, 0x69, 0x23, 0x7F, 0x0E, 0x9C, 0x76, 0xCE, 0x7D, 0x49, 0x79, 0x99, 0x97, 0x49,
+0x10, 0xE6, 0x98, 0xDA, 0x5C, 0x37, 0xB2, 0x1C, 0x3F, 0x41, 0x9C, 0x2F, 0x30, 0xE5, 0x93, 0xF6,
+0xAE, 0x47, 0xB4, 0xF5, 0xD6, 0xF5, 0xFD, 0xB2, 0x4F, 0x71, 0x33, 0x22, 0x84, 0x6F, 0xC5, 0x67,
+0xA7, 0xDC, 0xB3, 0x20, 0x50, 0x10, 0x28, 0x08, 0xDC, 0x6A, 0x04, 0xEE, 0x18, 0x62, 0x37, 0x39,
+0x3D, 0x27, 0xE4, 0x89, 0x04, 0x8F, 0x84, 0x6E, 0x5C, 0x76, 0x9C, 0xB0, 0x85, 0x4B, 0xD4, 0x1E,
+0x0B, 0x94, 0x74, 0x5B, 0x9C, 0x28, 0x32, 0xEE, 0x1F, 0xA6, 0xFE, 0x5D, 0x5A, 0xDE, 0x1F, 0xA6,
+0xED, 0xC9, 0x79, 0x5D, 0xD9, 0x3D, 0x6F, 0x5D, 0xF4, 0xC3, 0x92, 0xF3, 0xEE, 0xB3, 0xA5, 0xE5,
+0x5C, 0xDD, 0xA0, 0xBF, 0x11, 0xA3, 0x63, 0x49, 0x32, 0x2F, 0x8F, 0x4E, 0x85, 0xF3, 0x48, 0x9A,
+0x7C, 0x7D, 0x0C, 0xBE, 0x48, 0x95, 0xD4, 0x22, 0xB7, 0x6E, 0x7A, 0xF4, 0x61, 0x97, 0x84, 0xCF,
+0x3E, 0xB8, 0x3F, 0x3C, 0xB2, 0x7F, 0x87, 0xA4, 0xCD, 0x90, 0xDC, 0x76, 0x50, 0xEF, 0xA8, 0xD8,
+0xCD, 0x73, 0x7F, 0x5B, 0xE9, 0x8C, 0xF5, 0xC7, 0xD4, 0x37, 0x57, 0xED, 0xCC, 0xD5, 0x2C, 0xD1,
+0x22, 0x53, 0x7E, 0x44, 0x65, 0x23, 0x7E, 0x02, 0x98, 0xA9, 0x67, 0x42, 0x96, 0xFC, 0xB9, 0x5D,
+0xE9, 0xBE, 0x76, 0xEE, 0xDC, 0x98, 0xF9, 0x3F, 0x3A, 0xD9, 0x72, 0xC5, 0x2F, 0x3A, 0xC3, 0xB1,
+0x5E, 0xF3, 0x7D, 0x53, 0xB2, 0xA2, 0x03, 0x1A, 0xA3, 0x6C, 0x23, 0x7B, 0xC9, 0xEE, 0xC7, 0xFB,
+0x98, 0xB2, 0x14, 0xF3, 0xD1, 0x49, 0xFB, 0x54, 0x51, 0x54, 0x1F, 0x34, 0xF5, 0x3D, 0xE3, 0x7D,
+0x64, 0xE4, 0x25, 0xCA, 0xD7, 0x54, 0x2B, 0x57, 0x6F, 0x2D, 0x38, 0x41, 0xDA, 0x06, 0x7C, 0x84,
+0xD8, 0xE1, 0x69, 0x3B, 0x08, 0xF2, 0xBD, 0xFB, 0xB6, 0x8B, 0x4A, 0xD5, 0x8C, 0x63, 0x08, 0x7B,
+0xC3, 0x1E, 0x3E, 0x7F, 0x15, 0x89, 0x89, 0x31, 0x52, 0x20, 0x95, 0xAD, 0x4C, 0x4E, 0x2C, 0x3C,
+0xCD, 0x15, 0x4A, 0x9F, 0xA8, 0xDA, 0x7E, 0x8F, 0x80, 0x55, 0xDC, 0xF4, 0xB5, 0x2A, 0x94, 0x49,
+0x6D, 0xF3, 0xDD, 0x3B, 0x64, 0xDE, 0xBA, 0x5F, 0x9D, 0xAB, 0x76, 0x2E, 0x41, 0xFB, 0x67, 0xC2,
+0x3E, 0x08, 0x71, 0x4F, 0x59, 0x22, 0xC5, 0x44, 0xD7, 0x88, 0xAA, 0x66, 0xEE, 0xBA, 0xFD, 0xDB,
+0x36, 0x09, 0xD1, 0xA5, 0xB9, 0x7F, 0x81, 0x49, 0xBF, 0x19, 0x00, 0x95, 0x7B, 0x14, 0x04, 0x0A,
+0x02, 0x05, 0x81, 0x3B, 0x00, 0x81, 0x3B, 0x86, 0xD8, 0xD1, 0xE4, 0x79, 0x76, 0x70, 0x5C, 0xFC,
+0xEB, 0x66, 0x10, 0x95, 0x3A, 0x35, 0x8E, 0x1D, 0x27, 0x40, 0xA2, 0xA2, 0x62, 0xB3, 0x40, 0xB6,
+0xA9, 0xA3, 0xE3, 0xC8, 0xA9, 0x45, 0xCE, 0xE7, 0xA7, 0xA3, 0x5C, 0xA1, 0x4F, 0x2A, 0x6F, 0x99,
+0x8C, 0x44, 0x7F, 0xB5, 0x71, 0xF8, 0xD9, 0xD1, 0xDF, 0x6E, 0x02, 0x66, 0xBB, 0x2B, 0x20, 0x75,
+0xA7, 0xA0, 0xDC, 0x51, 0x6D, 0xB9, 0x1D, 0x8E, 0x4E, 0x6C, 0x35, 0x76, 0x60, 0xC7, 0x26, 0x51,
+0xED, 0x76, 0x6D, 0x5A, 0x07, 0xA2, 0xD0, 0x26, 0x09, 0x95, 0xE7, 0xF8, 0xA0, 0x72, 0x17, 0x15,
+0x2C, 0xEB, 0x9D, 0x63, 0x53, 0x83, 0x43, 0xE4, 0xC9, 0x42, 0xB6, 0x84, 0x65, 0x64, 0xDD, 0xAB,
+0xB9, 0x36, 0xBE, 0x93, 0x94, 0xA0, 0x85, 0x7A, 0x9A, 0x91, 0x71, 0x23, 0x2C, 0xA9, 0xB2, 0x9A,
+0x1B, 0x0B, 0xEF, 0xF4, 0xFA, 0xB3, 0xF7, 0xA2, 0x5A, 0x95, 0x9F, 0x4B, 0xE2, 0x9B, 0xDC, 0x2F,
+0x57, 0x63, 0x17, 0x56, 0x6B, 0x7D, 0xB7, 0x3B, 0xE7, 0x5D, 0x20, 0xAF, 0x63, 0x62, 0x62, 0x24,
+0xBE, 0x26, 0xB9, 0xE9, 0x41, 0xE4, 0xE7, 0x9E, 0xAD, 0x1B, 0xC5, 0xEC, 0xB8, 0x9A, 0x07, 0x9B,
+0xCB, 0x1F, 0x08, 0xCC, 0x5D, 0x77, 0xFA, 0x0A, 0x5C, 0x0C, 0x70, 0x33, 0x46, 0xC4, 0xE6, 0xFE,
+0x75, 0xDA, 0xAF, 0x9A, 0x56, 0x64, 0xE3, 0x91, 0xDE, 0xAF, 0xC1, 0xCA, 0x67, 0x70, 0x65, 0x7C,
+0xBD, 0x4C, 0xBD, 0x49, 0x9F, 0x0F, 0x2F, 0x6A, 0x9D, 0x81, 0x7F, 0x1D, 0xE6, 0x7A, 0x3B, 0x7E,
+0x1C, 0x1C, 0xC4, 0xD6, 0x75, 0x87, 0x76, 0x6D, 0x2D, 0xFE, 0x75, 0xAB, 0x39, 0x19, 0x4A, 0xDD,
+0x05, 0x81, 0x82, 0xC0, 0x1D, 0x8F, 0xC0, 0x9A, 0x26, 0x76, 0xA2, 0x54, 0x98, 0x8A, 0x23, 0xA9,
+0x4E, 0xB0, 0xE3, 0x04, 0xA3, 0x4F, 0xA7, 0x90, 0x63, 0x8C, 0x7E, 0x50, 0x3C, 0x54, 0xB1, 0xA1,
+0x68, 0xA4, 0x4A, 0x8C, 0xEA, 0x6E, 0xA2, 0xC9, 0x44, 0xFF, 0x24, 0x8D, 0xB4, 0xD4, 0xBA, 0xEC,
+0xA4, 0xFE, 0x89, 0xEB, 0x1A, 0x59, 0x84, 0x12, 0x82, 0xE8, 0x8F, 0x65, 0x6F, 0x6B, 0x8D, 0xFA,
+0x42, 0x55, 0x0F, 0xAD, 0x9F, 0xAA, 0xE1, 0x28, 0xFC, 0xFC, 0x18, 0x98, 0xC0, 0x45, 0x6F, 0x04,
+0x66, 0xB4, 0x77, 0xCE, 0x5D, 0x0F, 0x63, 0x53, 0xB7, 0x87, 0x9F, 0x1D, 0x9B, 0xDC, 0x0B, 0x13,
+0xE2, 0xD3, 0xF7, 0xEE, 0x0E, 0x4F, 0xDD, 0xBD, 0x4B, 0x16, 0x63, 0x06, 0x9F, 0x90, 0x34, 0x90,
+0xDC, 0x69, 0x84, 0x6C, 0xF2, 0xC1, 0x12, 0x45, 0xCB, 0x14, 0x1F, 0xF7, 0x57, 0x13, 0x7F, 0x39,
+0x51, 0x8B, 0x8C, 0x2C, 0x89, 0xD9, 0x53, 0x7D, 0xE6, 0x92, 0x8A, 0xE4, 0x7E, 0x6E, 0xC9, 0xFF,
+0xCD, 0xA4, 0x4D, 0x53, 0x37, 0x6B, 0x7C, 0xEC, 0x32, 0x85, 0x4D, 0xEF, 0xA9, 0x75, 0xF1, 0x1A,
+0xCF, 0xBF, 0x26, 0x46, 0xC5, 0xFC, 0xDE, 0xA6, 0xC8, 0x7A, 0xBD, 0xBE, 0x6B, 0x42, 0xA5, 0x9D,
+0x99, 0xEA, 0x14, 0xEB, 0x74, 0x95, 0xCF, 0xC9, 0x9E, 0xDD, 0x43, 0x94, 0x2D, 0x9B, 0x25, 0x69,
+0xDE, 0xE8, 0xFC, 0xA1, 0xA9, 0x7A, 0x0E, 0xC9, 0x89, 0x39, 0x57, 0x68, 0x7A, 0xDC, 0x34, 0xD0,
+0x87, 0x7C, 0x72, 0xAB, 0xFB, 0x31, 0x63, 0x7B, 0x27, 0x10, 0x84, 0x33, 0x04, 0xE5, 0x97, 0xFB,
+0x0F, 0x6B, 0xE0, 0x44, 0x97, 0x98, 0xD0, 0x55, 0x44, 0x33, 0x0C, 0x35, 0xEA, 0x41, 0x66, 0xA4,
+0x60, 0x66, 0xFD, 0x8B, 0xBE, 0x77, 0x39, 0x66, 0xFA, 0xE1, 0x30, 0xB3, 0xAD, 0x96, 0xCD, 0xC7,
+0x37, 0xFA, 0x2F, 0x66, 0xD7, 0x78, 0x94, 0xB0, 0xA6, 0xBC, 0xE1, 0x7D, 0x31, 0x47, 0xA6, 0x91,
+0xCF, 0x0F, 0x98, 0xB4, 0xB7, 0xB5, 0x84, 0x7B, 0x11, 0x1D, 0x7C, 0xFF, 0xDE, 0xE6, 0xA5, 0x7E,
+0xB9, 0xE3, 0xBF, 0xDD, 0x0B, 0x00, 0x05, 0x81, 0x82, 0xC0, 0x1D, 0x89, 0xC0, 0xEA, 0xAE, 0x38,
+0xB7, 0x09, 0xA4, 0x24, 0x75, 0x34, 0x73, 0x0E, 0x8E, 0x21, 0x70, 0x02, 0x8A, 0xD8, 0xE4, 0xE8,
+0x28, 0x52, 0x6B, 0x31, 0x29, 0x70, 0x92, 0x5B, 0x74, 0xA9, 0xF6, 0xA3, 0xC6, 0xCF, 0x4E, 0x16,
+0xC7, 0x85, 0x9D, 0xC9, 0xCB, 0xCB, 0xBB, 0x6E, 0x8A, 0xB2, 0x85, 0xAD, 0x72, 0x89, 0x2B, 0x1E,
+0x46, 0xF2, 0xB8, 0x30, 0x4E, 0xC2, 0x14, 0x3B, 0x35, 0xA1, 0x5B, 0x9A, 0x4D, 0xC1, 0x7E, 0x76,
+0x1A, 0xD1, 0xB1, 0x34, 0xC9, 0x72, 0xDB, 0xA5, 0xDB, 0xE1, 0xE0, 0x16, 0x58, 0xFB, 0x11, 0xC1,
+0xF8, 0xF8, 0xA1, 0x5D, 0xE1, 0x5E, 0xF8, 0xDC, 0x6D, 0xDD, 0xD0, 0x0F, 0xAE, 0x40, 0x7F, 0x3B,
+0xAA, 0x76, 0xAA, 0x76, 0xA6, 0x7E, 0x2B, 0x46, 0x55, 0x65, 0x28, 0x53, 0xBF, 0x5C, 0xE1, 0xD3,
+0x0B, 0xBC, 0xB0, 0xE1, 0x9A, 0xF9, 0x23, 0x46, 0xAC, 0x4D, 0x61, 0x4A, 0x7F, 0x2A, 0x4A, 0x9A,
+0x70, 0x12, 0x81, 0x9C, 0x84, 0xC3, 0xD0, 0xCA, 0x31, 0xCE, 0x6E, 0x93, 0xDF, 0x92, 0xCF, 0x9D,
+0x68, 0xA7, 0x26, 0xA5, 0x79, 0x10, 0xFB, 0x90, 0xCD, 0x85, 0xCA, 0xE0, 0x9B, 0xE2, 0xE7, 0xCD,
+0x34, 0x3A, 0x27, 0xA5, 0x35, 0x1A, 0x96, 0xA9, 0x61, 0xB0, 0x1F, 0x2A, 0x14, 0xCE, 0x5D, 0x9B,
+0x36, 0x84, 0x01, 0x4B, 0xC4, 0xBB, 0x9A, 0xE3, 0x39, 0x8D, 0xFB, 0x9D, 0x1F, 0x1C, 0x0D, 0x67,
+0xAE, 0x8D, 0x84, 0x51, 0xFE, 0x30, 0x00, 0xA1, 0x6B, 0x69, 0x27, 0xB1, 0x33, 0x02, 0x67, 0xE3,
+0x92, 0xE6, 0xAB, 0x99, 0xAA, 0x7D, 0x24, 0xF2, 0x89, 0x2A, 0x1D, 0xCB, 0x4E, 0xC4, 0xD7, 0x3A,
+0x10, 0xA2, 0x82, 0xC6, 0xCE, 0xE7, 0xE5, 0x4C, 0xC3, 0xCD, 0x06, 0x43, 0xFC, 0x0D, 0xA1, 0x5E,
+0x82, 0xD9, 0x85, 0x3E, 0x04, 0x90, 0xEC, 0xDA, 0xB2, 0x3E, 0x6C, 0xC7, 0x96, 0x75, 0xCD, 0xD8,
+0x5A, 0x6D, 0x35, 0xF1, 0x2E, 0x75, 0x17, 0x04, 0x0A, 0x02, 0x05, 0x81, 0xDB, 0x19, 0x81, 0x3B,
+0x82, 0xD8, 0x8D, 0x63, 0xB1, 0x3B, 0x87, 0x1D, 0x1E, 0x68, 0xE6, 0xE4, 0x62, 0xE3, 0xFE, 0x75,
+0xF4, 0x19, 0xF3, 0xF5, 0xDF, 0xB5, 0x38, 0x59, 0x97, 0x7C, 0x05, 0x4C, 0x02, 0x87, 0xEB, 0x33,
+0x15, 0x22, 0x21, 0x7E, 0x77, 0xA6, 0xF2, 0xF9, 0x20, 0x4B, 0x9E, 0x3B, 0x53, 0x3A, 0x52, 0xD4,
+0x9F, 0x2D, 0xFF, 0xA2, 0xF8, 0x71, 0x5D, 0xD4, 0xBF, 0x92, 0x24, 0x79, 0x78, 0x08, 0x7F, 0x91,
+0x23, 0x0E, 0xA7, 0xB8, 0x6F, 0xEC, 0x87, 0xE7, 0x07, 0xC3, 0xC4, 0x6D, 0xA4, 0xDA, 0x31, 0xDF,
+0xD8, 0xE3, 0x07, 0x76, 0x86, 0x9F, 0x79, 0xF4, 0x50, 0x78, 0x1A, 0x29, 0x50, 0xDA, 0xB1, 0x0D,
+0x94, 0xE4, 0xB7, 0x23, 0x91, 0x31, 0x22, 0x2B, 0x39, 0xED, 0x4C, 0xAD, 0x74, 0x3F, 0xC3, 0x34,
+0xE9, 0x35, 0x92, 0x98, 0x17, 0xCC, 0x99, 0x5A, 0xA9, 0x00, 0x9B, 0x42, 0x97, 0xF9, 0x74, 0xC5,
+0x9D, 0x2A, 0x04, 0x3F, 0x7D, 0xBF, 0x12, 0x91, 0xEA, 0x0A, 0x52, 0xF4, 0x09, 0x53, 0x25, 0x29,
+0xEE, 0x4F, 0xAB, 0xD2, 0x6B, 0x45, 0x1D, 0x4D, 0x4A, 0xAA, 0xAA, 0xB2, 0x7C, 0xDF, 0xFD, 0xC6,
+0xA4, 0x5D, 0xA6, 0x44, 0x69, 0x64, 0xB3, 0x2A, 0xAA, 0xB1, 0x3F, 0xC2, 0x4B, 0x5D, 0x5D, 0x34,
+0x92, 0x6A, 0xE5, 0x62, 0x0E, 0x38, 0xF3, 0xC1, 0x63, 0xB9, 0xD9, 0x29, 0xEC, 0x41, 0x4C, 0x33,
+0x2C, 0x6A, 0xEA, 0x80, 0x29, 0xF4, 0x9E, 0x3D, 0x5B, 0x9B, 0x12, 0x38, 0xC1, 0xF9, 0xFD, 0xFE,
+0x99, 0x2B, 0xE1, 0x83, 0x73, 0xD7, 0xC4, 0x5C, 0x4E, 0xFF, 0xBA, 0x36, 0xE4, 0xB0, 0x33, 0x20,
+0x62, 0xBF, 0xA3, 0x42, 0xE9, 0xEA, 0xB3, 0xF7, 0x2D, 0xF3, 0xB7, 0x13, 0x32, 0x58, 0xA3, 0xD4,
+0xB9, 0x1A, 0x2B, 0x7E, 0x78, 0x36, 0x76, 0x92, 0x17, 0xCF, 0xCA, 0x09, 0xCF, 0xCB, 0xE7, 0xBC,
+0xD5, 0x4B, 0xFF, 0x3A, 0xD9, 0xB2, 0x0F, 0xC7, 0x26, 0xA4, 0xCE, 0x59, 0x87, 0x9D, 0x4D, 0xBA,
+0xA1, 0x02, 0x97, 0x1D, 0x27, 0x6E, 0xE7, 0x25, 0xA1, 0xB4, 0xAD, 0x20, 0x50, 0x10, 0xF8, 0xA4,
+0x23, 0x70, 0x47, 0x10, 0xBB, 0x31, 0xA4, 0x39, 0x61, 0xE4, 0x29, 0xFD, 0xEC, 0x48, 0xA2, 0xA6,
+0xC6, 0xB8, 0xE3, 0x04, 0xC2, 0x01, 0x8C, 0xB8, 0xE5, 0x4A, 0x46, 0x45, 0x99, 0xCB, 0x95, 0x0C,
+0x1F, 0x69, 0x27, 0x33, 0xF6, 0x3A, 0xFA, 0x71, 0xD5, 0xCC, 0x84, 0x6A, 0x6E, 0xBC, 0xA4, 0xEB,
+0x28, 0xA5, 0x51, 0xC9, 0x43, 0xFD, 0xEC, 0x10, 0xD0, 0x81, 0xE8, 0x58, 0x9A, 0x66, 0x69, 0xEA,
+0x3C, 0x76, 0x79, 0x24, 0x5C, 0x85, 0xBA, 0xA8, 0xA4, 0xE9, 0xD6, 0x1F, 0xCC, 0xBF, 0xB6, 0x7B,
+0xF3, 0xBA, 0xF0, 0xE4, 0xC1, 0x5D, 0x30, 0xC9, 0xEE, 0x0E, 0x77, 0x41, 0xC1, 0xA3, 0xBF, 0x1D,
+0x83, 0x29, 0x5C, 0xB8, 0x51, 0xB6, 0xBA, 0x78, 0x7B, 0x2B, 0xF8, 0x2E, 0x06, 0x70, 0x54, 0xDE,
+0x32, 0xF5, 0xCC, 0x29, 0x70, 0x45, 0x41, 0xF2, 0xFB, 0xB8, 0x82, 0xA4, 0x18, 0x69, 0x91, 0xAA,
+0x82, 0xE4, 0x34, 0x3A, 0x9D, 0xD6, 0x6B, 0xAA, 0x91, 0xB0, 0x34, 0xE1, 0xC6, 0xC1, 0x4D, 0x9C,
+0x3E, 0x0A, 0x53, 0xD5, 0x3A, 0xAB, 0x6A, 0x96, 0x15, 0x92, 0x5B, 0x53, 0x9D, 0x02, 0xB1, 0x9B,
+0xD1, 0xC0, 0x89, 0xCE, 0xF6, 0x0E, 0xD9, 0xE8, 0xBE, 0x7B, 0x95, 0xFD, 0xEB, 0x78, 0xEB, 0x09,
+0x04, 0xE2, 0x1C, 0x3E, 0x7F, 0x3D, 0x1C, 0xBD, 0x70, 0x5D, 0x02, 0x27, 0xB8, 0x95, 0x18, 0xFD,
+0xEB, 0x34, 0x99, 0xB6, 0x9B, 0x45, 0x17, 0x8E, 0x51, 0x65, 0xC8, 0x64, 0x30, 0xB5, 0xAF, 0x71,
+0xBC, 0x72, 0x4C, 0xE3, 0xF3, 0x0C, 0xFF, 0x6C, 0xDC, 0xF5, 0xED, 0x2A, 0x56, 0x34, 0x49, 0xFB,
+0x7E, 0xB9, 0x7B, 0xB0, 0x4D, 0x1D, 0xF7, 0x20, 0x6E, 0x46, 0x3E, 0xBF, 0x5B, 0xFF, 0xA9, 0x29,
+0x2D, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xB7, 0x0E, 0x81, 0x35, 0x4D, 0xEC, 0x5C, 0x31, 0x1B,
+0x05, 0xB1, 0xFB, 0x08, 0x3B, 0x4E, 0x4C, 0x81, 0x48, 0xCD, 0xC0, 0x54, 0x36, 0x33, 0x8E, 0xC4,
+0xC4, 0x62, 0x2E, 0x75, 0xBD, 0x8D, 0x0B, 0x52, 0x95, 0x7E, 0xA8, 0x10, 0xC7, 0x85, 0xDB, 0xE4,
+0x26, 0xD3, 0x2A, 0xD2, 0xD2, 0x95, 0x11, 0x0B, 0x73, 0x45, 0x4A, 0x0A, 0x86, 0xFA, 0x92, 0xB9,
+0x0A, 0x28, 0x26, 0x2C, 0xF3, 0xF3, 0x92, 0x85, 0xD6, 0x94, 0x3B, 0x92, 0xB7, 0xF1, 0xB1, 0x71,
+0x44, 0xC7, 0x22, 0x39, 0x31, 0x54, 0x17, 0x26, 0x28, 0xFE, 0xE8, 0xEA, 0x18, 0x4C, 0x6A, 0x63,
+0x92, 0x06, 0xE5, 0x76, 0x39, 0xBA, 0xB0, 0x5B, 0xC0, 0xBE, 0xED, 0x1B, 0x40, 0xEC, 0x76, 0x86,
+0x67, 0x1F, 0xD8, 0x87, 0x6D, 0xA1, 0xDA, 0x41, 0x3C, 0x55, 0xD9, 0x11, 0x02, 0x2A, 0xFE, 0x5A,
+0xA6, 0xDA, 0x99, 0x72, 0xA7, 0x26, 0x59, 0x55, 0xDD, 0x34, 0xF7, 0x99, 0xF9, 0x2E, 0xFA, 0xB9,
+0x64, 0xCF, 0x8B, 0x6A, 0x68, 0xCC, 0x8F, 0x26, 0x80, 0xE9, 0xF5, 0x8E, 0x57, 0x34, 0xBB, 0xBA,
+0x9A, 0x64, 0x8A, 0x9F, 0xFA, 0xBB, 0x69, 0xF9, 0x4A, 0x9E, 0x36, 0xBB, 0xAF, 0x9C, 0x8B, 0x7E,
+0x60, 0x49, 0x05, 0xCC, 0x7D, 0xFF, 0x2A, 0x39, 0xF5, 0xA2, 0x0A, 0x99, 0xA2, 0x62, 0x23, 0x19,
+0x64, 0x5D, 0xF6, 0x9F, 0xF7, 0x59, 0x54, 0x40, 0x29, 0x00, 0x62, 0xC7, 0x40, 0x01, 0x90, 0x19,
+0xCE, 0xA5, 0x4E, 0x28, 0x53, 0x92, 0x88, 0xB7, 0x09, 0x3B, 0x2C, 0x4C, 0xC2, 0x6F, 0xF4, 0xD8,
+0xE5, 0xA1, 0x70, 0x1C, 0x81, 0x13, 0x24, 0x76, 0x42, 0xEA, 0x4C, 0x4D, 0x8E, 0xFD, 0xCC, 0x14,
+0x36, 0xF7, 0x71, 0x54, 0x5C, 0x16, 0xFA, 0xDB, 0x45, 0x5F, 0x45, 0x1B, 0x03, 0xC7, 0xD0, 0xFD,
+0x23, 0x5D, 0x05, 0x95, 0x7A, 0x5C, 0xA9, 0xCB, 0x54, 0x40, 0xA5, 0xD8, 0xF8, 0xE1, 0xC2, 0x6D,
+0xD5, 0xE8, 0x5F, 0xD7, 0xDA, 0x02, 0xF5, 0x72, 0x1B, 0x14, 0x3B, 0xA6, 0x5F, 0x29, 0x47, 0x41,
+0xA0, 0x20, 0x50, 0x10, 0x28, 0x08, 0xAC, 0x26, 0x02, 0x6B, 0x9A, 0xD8, 0x91, 0x74, 0x4C, 0x42,
+0x05, 0x1B, 0x84, 0x02, 0x76, 0x09, 0x7B, 0xB2, 0x92, 0x2C, 0x4D, 0x4F, 0x22, 0x70, 0x42, 0x16,
+0x5F, 0x2E, 0x4A, 0x0E, 0x6D, 0xA6, 0x34, 0x54, 0x4E, 0xB9, 0x22, 0x53, 0xE7, 0x7D, 0x5D, 0xBD,
+0xE2, 0x91, 0x44, 0x1F, 0x25, 0x8C, 0x95, 0xA3, 0x22, 0x72, 0xD8, 0x0B, 0xE3, 0x03, 0x33, 0x30,
+0xDD, 0x8D, 0x23, 0xA7, 0xDE, 0xC4, 0xD8, 0xA8, 0x44, 0x36, 0x52, 0xAD, 0x3B, 0x72, 0x69, 0x18,
+0x66, 0x59, 0x98, 0x67, 0x17, 0xB9, 0xED, 0x6A, 0x4E, 0x88, 0x7A, 0x75, 0x33, 0xE7, 0xD8, 0x86,
+0xBE, 0xAE, 0xB0, 0x6F, 0xEB, 0xFA, 0xF0, 0xE4, 0x81, 0x1D, 0xE1, 0xEE, 0x9D, 0x9B, 0xC4, 0x87,
+0x4C, 0x55, 0x3B, 0x33, 0xB5, 0x0A, 0x1E, 0x46, 0xF2, 0xEA, 0x62, 0x68, 0xCB, 0xBD, 0x40, 0xEA,
+0xB8, 0xD6, 0xDE, 0xCD, 0xFD, 0xE5, 0x32, 0x8C, 0x6A, 0x54, 0x38, 0x81, 0x2D, 0xF3, 0xE3, 0x12,
+0x4E, 0x67, 0xAA, 0x54, 0xBD, 0xDB, 0xBB, 0x2F, 0x9E, 0x92, 0xAF, 0xEC, 0x7E, 0x86, 0xBF, 0x9E,
+0xD3, 0x37, 0x34, 0x96, 0x40, 0x9F, 0xC7, 0x7F, 0x9D, 0xB7, 0xD9, 0xE5, 0x4A, 0xEC, 0xAC, 0xAF,
+0xCA, 0xF8, 0xB4, 0xBC, 0xA4, 0x81, 0x51, 0xFF, 0x3A, 0xEE, 0x38, 0xB1, 0x19, 0x41, 0x13, 0x34,
+0x3F, 0xAE, 0x76, 0xBE, 0x36, 0xEE, 0x37, 0x7C, 0x0D, 0xF9, 0x19, 0x39, 0xBF, 0x07, 0xC7, 0x31,
+0x67, 0xE0, 0x5E, 0xC0, 0x1C, 0x76, 0xF4, 0xB3, 0x8B, 0x1D, 0xA9, 0x99, 0xA7, 0xB5, 0xF8, 0xD5,
+0xFA, 0xD4, 0xA5, 0xE2, 0xDA, 0xE9, 0x98, 0x16, 0x28, 0xEB, 0xAF, 0x3F, 0xCD, 0xE7, 0x7D, 0x02,
+0x4E, 0x71, 0x99, 0xB7, 0x7C, 0x7E, 0xF4, 0xA9, 0xDB, 0x8B, 0x54, 0x27, 0x4C, 0xA1, 0x53, 0x8E,
+0x82, 0x40, 0x41, 0xA0, 0x20, 0x50, 0x10, 0x58, 0x5D, 0x04, 0xD6, 0x2C, 0xB1, 0x13, 0x9F, 0x27,
+0x2C, 0x7A, 0xD7, 0x11, 0x30, 0x71, 0x65, 0x64, 0x0A, 0x51, 0xA7, 0x70, 0x6C, 0x07, 0x71, 0x9A,
+0x02, 0x89, 0x92, 0x88, 0x4E, 0x51, 0x7C, 0x2C, 0xAA, 0xB2, 0x36, 0xFA, 0xCF, 0x4C, 0x58, 0x6A,
+0xC4, 0xE2, 0xD2, 0xC5, 0xB2, 0xB6, 0xC0, 0xB9, 0x9F, 0x9C, 0x2B, 0x53, 0x51, 0x55, 0x52, 0x52,
+0xA2, 0x82, 0x94, 0xE6, 0x05, 0x73, 0xA2, 0xA3, 0x7B, 0x66, 0xF2, 0x76, 0x1A, 0x59, 0x18, 0x19,
+0x06, 0x9E, 0xD2, 0x04, 0x3B, 0x72, 0xFD, 0x5A, 0x18, 0xC6, 0x83, 0xDB, 0x76, 0x91, 0x7C, 0xBE,
+0x79, 0xE6, 0x7A, 0xB8, 0x88, 0x20, 0x8A, 0xDB, 0x25, 0xA7, 0x9D, 0x4F, 0x41, 0xFA, 0xDB, 0xDD,
+0xBD, 0x6B, 0x53, 0xF8, 0xCA, 0x43, 0xFB, 0xA1, 0x44, 0x75, 0x28, 0x31, 0x86, 0x1A, 0x43, 0x9F,
+0xBB, 0x48, 0x70, 0xB2, 0x48, 0x55, 0x8D, 0x56, 0x35, 0x5F, 0x3A, 0x31, 0xB5, 0xA6, 0x1D, 0x27,
+0x54, 0x35, 0x4A, 0xFE, 0x70, 0x9A, 0x27, 0xD0, 0xA4, 0xCF, 0x3C, 0x8A, 0x33, 0x9E, 0x33, 0xD5,
+0xCF, 0x70, 0x4F, 0xD8, 0x66, 0x91, 0xB7, 0xE6, 0x7B, 0x27, 0xD4, 0x51, 0xEA, 0xF7, 0x7C, 0x6D,
+0xFA, 0xDC, 0x95, 0xA6, 0x98, 0x93, 0x4D, 0x7C, 0xF8, 0x8C, 0x28, 0x5A, 0xD9, 0x6A, 0xC4, 0xAC,
+0xB5, 0xDD, 0xFC, 0xF8, 0x54, 0x91, 0x55, 0xF2, 0x97, 0x47, 0xE3, 0x72, 0x57, 0x93, 0x39, 0xA8,
+0x66, 0x90, 0x2F, 0x05, 0x87, 0x76, 0x10, 0x99, 0x7D, 0x5B, 0x37, 0x20, 0x92, 0xB8, 0x6D, 0x75,
+0x3F, 0xBD, 0xA8, 0x9D, 0x3F, 0x5C, 0x4E, 0x5F, 0x19, 0x45, 0x34, 0x35, 0x68, 0x76, 0x6B, 0x9B,
+0xA8, 0x75, 0xAD, 0xF0, 0x83, 0x54, 0x92, 0xC5, 0xC6, 0x26, 0xD5, 0x34, 0xE6, 0xEA, 0xCB, 0xD4,
+0x4D, 0xF5, 0x51, 0xF4, 0x20, 0x0B, 0xF7, 0x57, 0xCC, 0xD4, 0x4F, 0x53, 0xFA, 0x5C, 0xF9, 0x53,
+0x85, 0x8E, 0xC3, 0xCA, 0x71, 0xCF, 0x22, 0x91, 0x7D, 0xBE, 0xBB, 0x5D, 0x9B, 0x81, 0x13, 0xD8,
+0xB2, 0x8F, 0x9F, 0x35, 0x46, 0x54, 0x6F, 0xC5, 0xB6, 0x6A, 0x5D, 0x9D, 0xBE, 0x6F, 0x6D, 0x8D,
+0x3A, 0xBE, 0xEA, 0x28, 0x95, 0x1B, 0x14, 0x04, 0x0A, 0x02, 0x05, 0x81, 0x3B, 0x07, 0x81, 0x35,
+0x4B, 0xEC, 0x38, 0x84, 0x0C, 0x96, 0x38, 0x8B, 0xA0, 0x09, 0xFA, 0xD7, 0x8D, 0x63, 0xE1, 0x13,
+0x62, 0x37, 0xAA, 0xFE, 0x75, 0x49, 0x7C, 0x70, 0x75, 0x48, 0xA5, 0x99, 0x14, 0x1D, 0x6B, 0xCA,
+0x4C, 0x8D, 0x62, 0xE4, 0x53, 0x43, 0x85, 0x9A, 0x5C, 0x61, 0xF2, 0xF2, 0xB1, 0x44, 0x24, 0x3B,
+0x69, 0x3A, 0x19, 0xF9, 0xF3, 0x3A, 0xD5, 0xBE, 0x08, 0x15, 0x71, 0x22, 0x4C, 0x42, 0xB1, 0x9B,
+0x44, 0x6E, 0x3D, 0xAA, 0x76, 0xDC, 0x3B, 0xF6, 0xC3, 0x0B, 0xB7, 0x97, 0x6A, 0xC7, 0x3E, 0xD0,
+0x3F, 0x6A, 0xCB, 0xBA, 0xDE, 0xF0, 0xC4, 0x81, 0xED, 0xE1, 0xFE, 0x5D, 0x9B, 0xC5, 0x24, 0x2B,
+0x81, 0x14, 0xEE, 0x70, 0xAF, 0x14, 0x38, 0x11, 0xDA, 0xA8, 0x92, 0xA9, 0xF2, 0x13, 0x7D, 0xD9,
+0x04, 0xEA, 0x5C, 0x46, 0xCA, 0x34, 0x22, 0x92, 0x0E, 0xAF, 0x43, 0x21, 0xAE, 0x29, 0x9B, 0x38,
+0x4B, 0x1C, 0x1A, 0x53, 0xD5, 0xA2, 0x4F, 0x9D, 0x8D, 0x8B, 0xF0, 0xCA, 0x58, 0x87, 0x8D, 0x82,
+0x95, 0xCD, 0x46, 0xC9, 0xDA, 0x6B, 0xB7, 0xE2, 0x1C, 0x30, 0xF2, 0x56, 0x51, 0xF8, 0xF2, 0xB9,
+0x61, 0xF5, 0xAA, 0xF2, 0x65, 0xC6, 0x59, 0xA8, 0x75, 0x42, 0x56, 0x69, 0x86, 0x05, 0xB1, 0x3A,
+0x84, 0x1C, 0x80, 0xCD, 0xF0, 0xAF, 0xA3, 0x19, 0xF6, 0x04, 0x4C, 0xB0, 0xE3, 0xF8, 0xDB, 0x0A,
+0x42, 0x49, 0xB5, 0xB0, 0xB5, 0x95, 0xFE, 0x75, 0xB9, 0xFA, 0xE8, 0x40, 0x64, 0x5F, 0x6C, 0xF9,
+0x78, 0x48, 0x59, 0xC3, 0xDA, 0xC6, 0xCC, 0xD5, 0x4F, 0xED, 0x51, 0xEC, 0xB0, 0x8D, 0x6F, 0x3E,
+0xC7, 0xAB, 0x75, 0xF2, 0x15, 0xEF, 0x4D, 0x93, 0xF4, 0x34, 0x7C, 0x0E, 0x19, 0x20, 0xC4, 0x94,
+0x2F, 0xEB, 0xFB, 0x7B, 0x8B, 0x7F, 0x5D, 0x06, 0x55, 0x79, 0x5A, 0x10, 0x28, 0x08, 0x14, 0x04,
+0x56, 0x0B, 0x81, 0x35, 0x4D, 0xEC, 0xB8, 0xE8, 0x1D, 0xBE, 0x38, 0x1C, 0x8E, 0xC2, 0xB4, 0x49,
+0x25, 0x8C, 0xF9, 0xB4, 0x26, 0xC7, 0xB0, 0xE3, 0x04, 0x54, 0x04, 0x11, 0x32, 0x64, 0x11, 0x4F,
+0x41, 0x00, 0xEA, 0x17, 0xE7, 0x79, 0xED, 0x6C, 0xA1, 0xAB, 0x98, 0x6B, 0x73, 0xA5, 0xC1, 0x3C,
+0xE8, 0x5C, 0x85, 0x33, 0x65, 0x49, 0x3C, 0xEB, 0x62, 0x31, 0x53, 0xEA, 0x22, 0x51, 0x71, 0x25,
+0x4F, 0xCB, 0xA8, 0x72, 0xA4, 0xC5, 0x99, 0xD4, 0x76, 0x6C, 0x70, 0x50, 0xF6, 0xB4, 0x9D, 0xC0,
+0x2E, 0x19, 0xCF, 0x1F, 0xBF, 0x14, 0x2E, 0x20, 0xA1, 0xF2, 0xEC, 0xED, 0x62, 0x8F, 0xB5, 0x19,
+0x48, 0x72, 0x77, 0x17, 0x4C, 0xB2, 0x3F, 0xFB, 0xC8, 0x01, 0xE4, 0xB9, 0xEB, 0x04, 0xA6, 0xAA,
+0xD8, 0xCD, 0x43, 0x2D, 0xF2, 0x3E, 0xA5, 0x1D, 0x20, 0x54, 0xD5, 0x89, 0xBE, 0x76, 0xA6, 0x14,
+0x89, 0x42, 0x64, 0x3E, 0x79, 0xB5, 0x7E, 0x5A, 0x0B, 0x54, 0xD4, 0xC8, 0x38, 0x4C, 0x01, 0xF5,
+0x31, 0xA3, 0x70, 0xE4, 0x4A, 0x53, 0xA6, 0x4A, 0x45, 0xC3, 0xAC, 0x9D, 0xF3, 0xDC, 0x6B, 0xAE,
+0xA0, 0xD6, 0xEE, 0xAC, 0xE0, 0xF7, 0xD7, 0xF7, 0xA5, 0x52, 0xDD, 0x85, 0xC1, 0x14, 0xA9, 0xDC,
+0x6F, 0x4F, 0x09, 0x1F, 0x8B, 0xB8, 0xCF, 0xA0, 0xCD, 0x01, 0xB4, 0x69, 0x8E, 0xC4, 0x4E, 0x14,
+0xCC, 0x56, 0x44, 0xC4, 0x62, 0xC7, 0x09, 0x04, 0x4E, 0x34, 0x63, 0xC7, 0x09, 0x0F, 0xB8, 0x99,
+0x80, 0x73, 0x1D, 0x09, 0x25, 0x23, 0x62, 0x99, 0x92, 0x46, 0xE7, 0x76, 0x55, 0x79, 0x4B, 0x91,
+0xBC, 0xA6, 0x64, 0x8A, 0x92, 0x9C, 0x94, 0xCD, 0x4A, 0xF4, 0xAB, 0x74, 0x4D, 0xFB, 0x57, 0xBB,
+0x8B, 0x87, 0x47, 0x2A, 0xEB, 0x8E, 0x1C, 0x4E, 0xCA, 0x4D, 0x19, 0x94, 0x79, 0x82, 0x24, 0xE0,
+0x70, 0x79, 0x18, 0x9F, 0x9C, 0x0C, 0xFC, 0x0C, 0xEE, 0x03, 0xC9, 0xF5, 0xDD, 0x26, 0x92, 0x19,
+0x78, 0xB5, 0xBE, 0xD2, 0x4A, 0xBD, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0xCE, 0x46, 0x60, 0x6D,
+0x13, 0x3B, 0x98, 0xA9, 0x4E, 0x5C, 0x19, 0xD1, 0xAD, 0xC4, 0x18, 0x11, 0x8B, 0xCD, 0xC8, 0x67,
+0xB0, 0xD8, 0xB8, 0xD2, 0xE2, 0x26, 0xD1, 0x1A, 0x11, 0xC7, 0x4F, 0xA7, 0xBF, 0xB6, 0x58, 0xD5,
+0x9F, 0x2A, 0xD5, 0xA8, 0xCA, 0x45, 0xA7, 0x53, 0xE6, 0x17, 0x26, 0x16, 0x32, 0x5D, 0xFF, 0xE2,
+0x3D, 0x68, 0xCA, 0x9B, 0x40, 0xB4, 0xEE, 0x34, 0xF7, 0x90, 0x05, 0xF1, 0x3C, 0x71, 0x79, 0x2C,
+0xBC, 0x7B, 0x76, 0x28, 0x5C, 0x47, 0xD2, 0xD9, 0xDB, 0x25, 0x42, 0x96, 0x4D, 0x66, 0xAA, 0x8A,
+0x8D, 0x03, 0xDD, 0x48, 0x81, 0xB2, 0x35, 0x3C, 0xB0, 0x7B, 0xB3, 0xEC, 0xAA, 0xA0, 0xC4, 0x0E,
+0x53, 0xC9, 0xFD, 0xBA, 0x32, 0x10, 0x92, 0x3F, 0x9D, 0x12, 0x80, 0x4A, 0xB4, 0x70, 0xEE, 0xCF,
+0x66, 0xF2, 0x9A, 0x3B, 0xEE, 0x57, 0x54, 0x3B, 0xAF, 0xCF, 0x41, 0xCB, 0xC4, 0xBE, 0xA4, 0xFC,
+0x25, 0x79, 0xCE, 0x55, 0x57, 0x09, 0xAB, 0xA8, 0x94, 0x8D, 0xB4, 0x2F, 0xAA, 0x8A, 0xA9, 0x3D,
+0xAE, 0x14, 0xFA, 0xC0, 0xE8, 0x4D, 0x9D, 0xBA, 0xE5, 0xFC, 0x32, 0xFA, 0x50, 0xFA, 0xF8, 0x51,
+0x01, 0xC6, 0xB6, 0x59, 0x7C, 0xD9, 0x02, 0xDF, 0xC3, 0xFE, 0x9E, 0xEE, 0xB0, 0x73, 0xD3, 0x00,
+0x88, 0xD6, 0xEA, 0x7E, 0xBC, 0x38, 0x8F, 0x99, 0xD8, 0xFA, 0x1C, 0xCC, 0xF6, 0xD3, 0xF8, 0x41,
+0xD0, 0x8E, 0x7B, 0x53, 0xB1, 0x13, 0x82, 0x26, 0xFF, 0x45, 0x31, 0x52, 0x3B, 0x63, 0xC4, 0x34,
+0x72, 0x31, 0x9F, 0x80, 0x02, 0x9D, 0x01, 0x15, 0x25, 0x4E, 0xEF, 0xBB, 0x13, 0x6A, 0x1B, 0x04,
+0x51, 0x25, 0xF3, 0x8A, 0xD5, 0x61, 0xC1, 0x7F, 0xCB, 0xF0, 0x87, 0xC8, 0x14, 0xF2, 0xF9, 0x8D,
+0xE3, 0x07, 0xD4, 0x24, 0x76, 0x78, 0x21, 0x09, 0x3C, 0xB4, 0x7B, 0x5B, 0xE8, 0x6E, 0xD2, 0xB6,
+0x6A, 0x77, 0xF6, 0xD7, 0x79, 0xE9, 0x7D, 0x41, 0xA0, 0x20, 0x50, 0x10, 0xF0, 0x44, 0x6E, 0x6B,
+0x0C, 0x09, 0x57, 0x05, 0xA8, 0x66, 0x9C, 0x81, 0xEA, 0x75, 0x6E, 0x68, 0x52, 0x4C, 0x9C, 0x33,
+0x30, 0x75, 0xC2, 0x36, 0x24, 0xAA, 0x9C, 0xAE, 0x4D, 0xA6, 0x38, 0x88, 0x7F, 0x95, 0x9F, 0xA3,
+0x8A, 0xE6, 0x31, 0xAD, 0xB2, 0x54, 0xA7, 0x45, 0x51, 0x04, 0x0E, 0x5D, 0xE8, 0x44, 0xE1, 0xC9,
+0x0E, 0x29, 0x99, 0xF9, 0x2A, 0x09, 0x85, 0xA0, 0x00, 0x64, 0x8B, 0x60, 0xCC, 0x0D, 0x16, 0xFD,
+0xF6, 0x74, 0x81, 0x34, 0x97, 0x25, 0x04, 0x22, 0xC0, 0x27, 0x10, 0xC4, 0x73, 0x6C, 0x04, 0xAA,
+0x1D, 0xEA, 0x1F, 0x87, 0x19, 0xF9, 0xB9, 0x63, 0x97, 0xC2, 0x49, 0x44, 0xF3, 0x32, 0x5A, 0xF6,
+0x76, 0x3A, 0x5A, 0x41, 0xE0, 0x76, 0x6E, 0xEC, 0x0F, 0x3F, 0xF7, 0xD8, 0x5D, 0xD8, 0x5D, 0xA1,
+0x1B, 0x6D, 0x27, 0x99, 0x68, 0x0B, 0xF3, 0x50, 0x8B, 0x0C, 0x58, 0x35, 0x4B, 0x8A, 0x0F, 0x96,
+0x62, 0xEC, 0xFE, 0x73, 0x31, 0xC7, 0x9F, 0xBD, 0x2F, 0xA6, 0x3E, 0xF7, 0x05, 0x8B, 0xE6, 0x4E,
+0xCF, 0x8B, 0x47, 0x00, 0xC9, 0x46, 0x7C, 0x0C, 0xEC, 0x79, 0xC5, 0xB7, 0xCB, 0xCA, 0x08, 0xDE,
+0xC9, 0xDF, 0xCE, 0xC2, 0x3A, 0xEC, 0xDE, 0x46, 0x4E, 0xAC, 0x3D, 0x29, 0x8F, 0x9D, 0xEE, 0x05,
+0xEC, 0x3B, 0x63, 0x68, 0xF4, 0xAE, 0xB6, 0xD5, 0x77, 0x56, 0x88, 0x2A, 0x97, 0x29, 0x80, 0x1E,
+0xE5, 0x2B, 0xA3, 0x67, 0x12, 0x1E, 0x15, 0x60, 0x96, 0x67, 0x30, 0x49, 0x07, 0x54, 0xB3, 0x2D,
+0xD8, 0xE4, 0xBE, 0xAF, 0x07, 0xFB, 0xB4, 0xD6, 0x21, 0xBA, 0x37, 0x73, 0x1C, 0xE9, 0x43, 0xCA,
+0xA4, 0xDB, 0x43, 0x13, 0x50, 0xA3, 0x31, 0x06, 0xAD, 0xF4, 0xB1, 0xC3, 0x38, 0x88, 0xE5, 0x54,
+0x94, 0xC5, 0xB4, 0x07, 0x6C, 0x52, 0xDD, 0x6C, 0xD2, 0x99, 0x52, 0xE7, 0x0A, 0x65, 0xF4, 0x19,
+0x14, 0x53, 0x78, 0x75, 0xAF, 0xD8, 0x3C, 0xF2, 0x95, 0xD1, 0xD0, 0x1E, 0xE5, 0xAC, 0x58, 0x24,
+0xF2, 0xCB, 0x3A, 0x98, 0x52, 0x68, 0x18, 0xE9, 0x7B, 0x86, 0x87, 0x07, 0xC3, 0x14, 0x88, 0x5D,
+0x17, 0x88, 0xE6, 0x03, 0xFB, 0x76, 0x89, 0xBA, 0x5B, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x50,
+0x10, 0x58, 0x7D, 0x04, 0x56, 0x57, 0x52, 0x58, 0xFD, 0xF6, 0x2F, 0x7A, 0x07, 0xEE, 0x09, 0x7B,
+0x0E, 0x5B, 0x88, 0x9D, 0x46, 0xB4, 0xE0, 0x05, 0x24, 0xFE, 0x1D, 0x46, 0xAE, 0x2F, 0x26, 0x26,
+0xA6, 0x39, 0xD6, 0x0F, 0xE5, 0x66, 0xF5, 0x14, 0x09, 0x27, 0x52, 0x75, 0x08, 0x55, 0x26, 0x01,
+0x39, 0xED, 0xCB, 0x15, 0x0B, 0x0D, 0x18, 0xA8, 0xB9, 0xCE, 0x5F, 0x67, 0xAA, 0x5D, 0x55, 0x0E,
+0xD4, 0x1A, 0x18, 0x51, 0x39, 0x09, 0x1F, 0x40, 0x9A, 0xB1, 0x66, 0xD0, 0xCE, 0x13, 0xC8, 0x69,
+0xF7, 0x2E, 0x02, 0x29, 0x64, 0x9B, 0x28, 0x3A, 0xE6, 0xDF, 0x26, 0x07, 0x39, 0xCE, 0xBA, 0x9E,
+0xCE, 0xF0, 0xD8, 0xBE, 0x2D, 0xE1, 0xA1, 0xBD, 0xB6, 0xA9, 0xBB, 0x10, 0x1F, 0x10, 0x3B, 0x9A,
+0x64, 0x6B, 0x0E, 0x57, 0x8F, 0x22, 0x2E, 0xD1, 0xF9, 0xCD, 0x44, 0xCB, 0xD8, 0xB5, 0x28, 0x81,
+0x99, 0xBF, 0x1A, 0x87, 0x27, 0xEB, 0x77, 0x8E, 0x5F, 0x54, 0x96, 0x2C, 0x30, 0xC2, 0xEF, 0x59,
+0x83, 0xBD, 0x72, 0x71, 0x91, 0xA4, 0xD2, 0x61, 0x65, 0x5C, 0x65, 0x52, 0x32, 0x6A, 0x0F, 0xD3,
+0xBA, 0x52, 0xF5, 0xFA, 0x46, 0xC5, 0x83, 0xD2, 0xC8, 0x8C, 0x5E, 0x87, 0x17, 0x8C, 0x88, 0xC5,
+0x1F, 0xF2, 0x6F, 0x06, 0x08, 0xEC, 0xC1, 0x0E, 0x0B, 0xDC, 0x8E, 0xCD, 0xF9, 0xE8, 0x6A, 0x0D,
+0x1B, 0x49, 0xD4, 0x39, 0xF8, 0x63, 0xF2, 0x47, 0x00, 0x55, 0x53, 0x06, 0x4F, 0xE8, 0x4D, 0x73,
+0xFF, 0x50, 0xEB, 0x7B, 0x4D, 0x9F, 0x55, 0xFC, 0x8C, 0x9D, 0xAE, 0x19, 0x08, 0x3B, 0x9F, 0xCF,
+0xE5, 0x9A, 0x71, 0xF0, 0x39, 0x4F, 0x85, 0x8E, 0x0A, 0xF3, 0x24, 0xE6, 0xEE, 0x04, 0xF3, 0x32,
+0x32, 0xE9, 0x36, 0x08, 0x1D, 0xFD, 0x45, 0xE7, 0xF1, 0x7C, 0x63, 0x7F, 0x0F, 0xD4, 0xCB, 0x0D,
+0x42, 0x78, 0xCB, 0x51, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xAB, 0x8F, 0xC0, 0x9A, 0x25,
+0x76, 0xE3, 0x50, 0xEB, 0xDE, 0x46, 0x00, 0xC2, 0xE9, 0xF1, 0xA9, 0x70, 0x19, 0x0B, 0xE0, 0xC5,
+0xC9, 0x29, 0x51, 0x11, 0x48, 0xEC, 0x74, 0x7F, 0x58, 0x55, 0x6B, 0x78, 0x68, 0xB6, 0xB4, 0xFC,
+0x50, 0x15, 0x48, 0x15, 0x38, 0x27, 0x06, 0xBA, 0x60, 0xBA, 0x82, 0xE7, 0x4A, 0x93, 0x5F, 0x6B,
+0xD9, 0xD4, 0xAC, 0x42, 0xBB, 0xDE, 0x14, 0x28, 0x35, 0x00, 0xAA, 0x12, 0x62, 0x37, 0xA4, 0x9C,
+0x22, 0x55, 0x79, 0xB4, 0xA6, 0x66, 0xF5, 0x87, 0x6A, 0x87, 0x7D, 0x6C, 0x27, 0x86, 0xAE, 0xAB,
+0xAF, 0x1D, 0x98, 0xC2, 0xF3, 0xC7, 0x2F, 0x87, 0x63, 0xF0, 0x13, 0xBC, 0x9D, 0xF2, 0xDA, 0x09,
+0x66, 0x88, 0x86, 0xDD, 0xB6, 0xBE, 0x2F, 0x7C, 0xED, 0xD1, 0xFD, 0x61, 0x13, 0xF2, 0x93, 0x51,
+0xC9, 0xA1, 0x7F, 0xD9, 0x3C, 0x12, 0xF3, 0x8A, 0x49, 0x96, 0xF8, 0x89, 0xDA, 0x66, 0x3E, 0x5C,
+0xAE, 0xBC, 0x19, 0xAE, 0xB5, 0x11, 0xAA, 0x51, 0x99, 0x8B, 0x11, 0xB1, 0x4A, 0x3C, 0xF2, 0x9D,
+0x27, 0x52, 0xFE, 0x34, 0x57, 0x5A, 0x55, 0x6D, 0xF3, 0x32, 0xAD, 0x2A, 0x53, 0x45, 0x92, 0x12,
+0x55, 0xB7, 0x5C, 0x8D, 0xB5, 0xF2, 0x31, 0xCA, 0xD3, 0xC7, 0xD7, 0x7C, 0xEA, 0x54, 0x88, 0x33,
+0xFF, 0x34, 0xB6, 0x5D, 0xCC, 0x9A, 0x16, 0x3D, 0xCD, 0x6B, 0xAD, 0x4F, 0xB9, 0xCA, 0xC7, 0x39,
+0xC5, 0x32, 0xE0, 0x57, 0xA2, 0x4C, 0xDD, 0x23, 0xFE, 0x75, 0xAB, 0x4F, 0x64, 0xE8, 0x8B, 0x79,
+0xF4, 0x32, 0xB6, 0xC7, 0xC3, 0xBD, 0xE9, 0x5B, 0x27, 0xF8, 0x4B, 0x7B, 0x75, 0xAA, 0xAA, 0xF9,
+0xD8, 0x54, 0xC8, 0x6C, 0x1C, 0xDC, 0xF7, 0xAE, 0x1A, 0x0D, 0x9B, 0xED, 0x98, 0x22, 0x24, 0x8E,
+0x18, 0xEB, 0x43, 0xCB, 0x2B, 0x06, 0xAD, 0xE2, 0x5F, 0x68, 0xB8, 0xA3, 0xD8, 0x14, 0xE6, 0xE9,
+0x08, 0x4C, 0xAF, 0x43, 0xC8, 0x0F, 0x79, 0x1D, 0x4A, 0xDD, 0x28, 0x7E, 0x40, 0x31, 0x68, 0x02,
+0x89, 0x19, 0x91, 0xEA, 0xA5, 0x05, 0xDB, 0x88, 0x6D, 0x0C, 0x9D, 0xC0, 0x42, 0x66, 0xBF, 0x28,
+0x88, 0x15, 0x3A, 0xBD, 0xFA, 0xDF, 0x70, 0xE5, 0x0E, 0x05, 0x81, 0x82, 0x40, 0x41, 0xE0, 0x0E,
+0x43, 0x60, 0x4D, 0x13, 0xBB, 0x77, 0x41, 0x88, 0x2E, 0x41, 0xAD, 0x1B, 0xC3, 0xE2, 0x33, 0x0C,
+0x15, 0x61, 0x0C, 0x8A, 0xDD, 0x24, 0x16, 0x1E, 0x49, 0x54, 0xCC, 0xBD, 0x4E, 0x8D, 0xA8, 0x45,
+0x4B, 0x5F, 0x3E, 0xF8, 0xA6, 0x50, 0xA8, 0xD8, 0xE3, 0xB4, 0xAF, 0x22, 0xFB, 0x54, 0x55, 0xA0,
+0x1A, 0x6A, 0xA8, 0x55, 0x55, 0xCB, 0xE7, 0xAF, 0x5C, 0xF1, 0xA8, 0xEE, 0x50, 0xA1, 0xFB, 0x8D,
+0x32, 0x72, 0x77, 0x06, 0x04, 0x8F, 0xE6, 0xE3, 0x8F, 0xAE, 0x8C, 0x85, 0xB7, 0xCF, 0x0E, 0x22,
+0xFD, 0x89, 0xE6, 0xE1, 0xBB, 0x5D, 0x0E, 0xB6, 0xBF, 0x1F, 0xAA, 0xD4, 0x23, 0x7B, 0xB6, 0x84,
+0x87, 0xA1, 0xDA, 0x51, 0xA1, 0xE2, 0xE6, 0xF3, 0xF3, 0x88, 0xC8, 0x0C, 0x24, 0x19, 0x15, 0xB3,
+0xAC, 0x12, 0x0C, 0x85, 0x24, 0xC3, 0x32, 0x53, 0xDD, 0xD2, 0xFB, 0x19, 0x6E, 0xB5, 0x97, 0x78,
+0xE7, 0x6B, 0x86, 0xC1, 0xAF, 0xA8, 0x3A, 0xE6, 0xBB, 0x52, 0x95, 0x5F, 0xA4, 0xE7, 0x5C, 0xA7,
+0x4A, 0x04, 0x48, 0x2B, 0x8C, 0x94, 0x23, 0x2A, 0x7C, 0x59, 0x49, 0x3B, 0xB7, 0x40, 0xFC, 0xE3,
+0x85, 0x59, 0xFA, 0x1C, 0xE6, 0x6A, 0xDB, 0xB7, 0x05, 0xA9, 0x3D, 0x9A, 0xB2, 0xE3, 0xC4, 0x6C,
+0x38, 0x85, 0x88, 0x6F, 0x92, 0xCA, 0x36, 0x04, 0xB5, 0xE4, 0xA6, 0xDF, 0xDC, 0x27, 0x30, 0xF6,
+0x2D, 0xEF, 0x8E, 0xCF, 0xCD, 0x5C, 0x95, 0x8B, 0xE0, 0x54, 0x10, 0xD2, 0x31, 0x53, 0x89, 0x4F,
+0x70, 0x12, 0x3F, 0x3A, 0xEE, 0x94, 0x62, 0x0A, 0x1D, 0x23, 0x72, 0xF9, 0x98, 0x60, 0xD4, 0x39,
+0x48, 0xAE, 0xA6, 0x39, 0x99, 0x45, 0xD4, 0x74, 0x1B, 0xFC, 0xEB, 0xB6, 0x63, 0x1B, 0xB1, 0x62,
+0x86, 0xBD, 0x5D, 0x3E, 0xB7, 0xA5, 0x1D, 0x05, 0x81, 0x82, 0xC0, 0xDA, 0x47, 0x60, 0x4D, 0x12,
+0x3B, 0xAA, 0x02, 0x5C, 0x68, 0xDE, 0x87, 0x9A, 0x31, 0xCC, 0xFC, 0x5E, 0x58, 0x94, 0x98, 0x08,
+0x78, 0x62, 0x7C, 0x14, 0x9B, 0xA4, 0x4F, 0x86, 0x11, 0x9A, 0x8A, 0x90, 0x33, 0x8E, 0x79, 0xE2,
+0x84, 0x60, 0x65, 0xBE, 0x59, 0xEE, 0xF4, 0xE6, 0xE9, 0xE6, 0xD4, 0x97, 0x4E, 0xD5, 0xB5, 0x4C,
+0xB0, 0x53, 0x05, 0x43, 0xED, 0x7C, 0xEA, 0x6F, 0x67, 0x17, 0x44, 0xF5, 0xCF, 0x22, 0x0A, 0x65,
+0x39, 0xCC, 0x7C, 0xCD, 0x94, 0xC0, 0x68, 0x7D, 0xAA, 0x05, 0xD9, 0x8E, 0x0C, 0x52, 0xBD, 0x9E,
+0x9F, 0x81, 0xE2, 0x31, 0x39, 0x7C, 0x4D, 0x4C, 0x7C, 0x54, 0x44, 0x5E, 0x38, 0x81, 0x7D, 0x40,
+0xB1, 0x87, 0xEC, 0xD8, 0x64, 0x32, 0x23, 0xDF, 0x16, 0x53, 0x13, 0x6D, 0xDD, 0xD8, 0xDF, 0x15,
+0xBE, 0xF6, 0xC8, 0xBE, 0xB0, 0x15, 0x69, 0x50, 0x04, 0x4D, 0xFA, 0x79, 0x75, 0x76, 0x87, 0x96,
+0x8E, 0x2E, 0x0D, 0xA8, 0x10, 0x85, 0xCC, 0x3D, 0xDE, 0x48, 0x10, 0x54, 0xCD, 0x74, 0x45, 0x48,
+0xFD, 0xB9, 0x34, 0x4A, 0x36, 0x12, 0x08, 0x7B, 0x9E, 0xEF, 0x01, 0x2B, 0x8A, 0x67, 0x25, 0xBF,
+0x1D, 0x31, 0xD7, 0xFA, 0x7C, 0xF7, 0x04, 0xEE, 0x45, 0xAB, 0xCA, 0xA8, 0xD6, 0x2F, 0xEA, 0x90,
+0x8D, 0xAD, 0xE6, 0x12, 0x4C, 0x7E, 0x78, 0x95, 0x3C, 0x77, 0xB1, 0x4D, 0xAE, 0xC8, 0x79, 0x39,
+0x1D, 0xDF, 0xD8, 0x07, 0x51, 0xF0, 0x92, 0x7A, 0x15, 0xDF, 0x23, 0xB1, 0x43, 0x1D, 0xDC, 0x47,
+0xB7, 0x1F, 0xBE, 0x75, 0xDB, 0x37, 0xF6, 0x81, 0xD4, 0xAC, 0xFE, 0x47, 0x8B, 0xE9, 0x7C, 0x2E,
+0x21, 0x39, 0x31, 0x9B, 0xA8, 0xFB, 0xAF, 0xDA, 0x9C, 0xCA, 0x55, 0xBA, 0xA8, 0xD4, 0x59, 0x0E,
+0xC1, 0xD8, 0x07, 0xED, 0xAB, 0xEF, 0x8D, 0xEB, 0x7D, 0xC9, 0xF7, 0x80, 0x95, 0x7E, 0x5B, 0x19,
+0x9E, 0x87, 0x00, 0x27, 0xD8, 0xD2, 0x04, 0x3C, 0x84, 0x1F, 0x48, 0xD7, 0xA0, 0x82, 0x8F, 0xC8,
+0x0F, 0x25, 0x04, 0x26, 0x61, 0x9E, 0x0A, 0xC2, 0xFC, 0xC1, 0x34, 0x35, 0x26, 0x29, 0xFD, 0xB8,
+0x5F, 0xEE, 0x43, 0x07, 0xF7, 0x86, 0xDE, 0xEE, 0xAE, 0xDB, 0x62, 0xBA, 0x96, 0x46, 0x14, 0x04,
+0x0A, 0x02, 0x05, 0x81, 0x3B, 0x01, 0x81, 0xD5, 0x5F, 0x7D, 0x6E, 0x01, 0x8A, 0x5C, 0x64, 0xAE,
+0x20, 0x9A, 0xF4, 0x2C, 0x7C, 0xEC, 0x26, 0xF0, 0x9C, 0xCE, 0xED, 0x73, 0x20, 0x75, 0xB3, 0xD3,
+0x54, 0xBD, 0xE0, 0xC7, 0x06, 0x52, 0xC7, 0x34, 0x0C, 0x93, 0x54, 0xC7, 0xA8, 0xDE, 0xF1, 0x7D,
+0x2E, 0x60, 0xD6, 0x56, 0x57, 0xD3, 0xA2, 0x4D, 0xCB, 0xFB, 0x90, 0x29, 0x45, 0x31, 0x76, 0x42,
+0x48, 0x8A, 0xC9, 0x40, 0x56, 0x43, 0x2E, 0x28, 0xC5, 0xEE, 0x8B, 0xE8, 0x61, 0x64, 0x24, 0x3F,
+0x29, 0xCF, 0xD5, 0x0C, 0xEB, 0x6A, 0x90, 0x24, 0x2A, 0x46, 0x7B, 0xD5, 0xD7, 0x6E, 0x2E, 0x9C,
+0x82, 0x1F, 0xD5, 0x5B, 0x67, 0x06, 0x25, 0xC2, 0xF7, 0x0A, 0x16, 0x72, 0x6E, 0xF4, 0x7E, 0xBB,
+0x1C, 0x34, 0x39, 0x3E, 0xBC, 0x67, 0x13, 0x94, 0xBB, 0xCD, 0xA1, 0x9F, 0x3B, 0x0B, 0x50, 0xB5,
+0xE3, 0xCE, 0x07, 0xED, 0x9D, 0x92, 0x2C, 0x37, 0x31, 0xE2, 0x4C, 0xF9, 0x8C, 0xAA, 0x9D, 0xBE,
+0xEB, 0x58, 0x46, 0xC5, 0x4D, 0x20, 0x5D, 0x88, 0xAB, 0x4A, 0x6D, 0xD6, 0xF7, 0x5C, 0x69, 0x22,
+0xB6, 0xB9, 0x12, 0x58, 0x01, 0xC7, 0xC7, 0x46, 0x71, 0xCE, 0xAB, 0xD6, 0x62, 0x5E, 0x9F, 0x99,
+0x60, 0xED, 0x75, 0x14, 0xA8, 0xAC, 0x5E, 0x57, 0xF3, 0x2A, 0x46, 0x7B, 0x19, 0x4E, 0x55, 0x51,
+0xA9, 0x98, 0x6D, 0xC5, 0x4E, 0x13, 0xBB, 0x10, 0x54, 0xB2, 0xBE, 0xB7, 0x0B, 0x56, 0xD1, 0xD5,
+0x35, 0x39, 0xCA, 0x2E, 0x25, 0xF0, 0xBD, 0x1C, 0xC6, 0x76, 0x79, 0x24, 0x74, 0xF2, 0x41, 0x26,
+0xA1, 0xCB, 0xE7, 0xA8, 0xA1, 0x9F, 0xA6, 0x5D, 0x7A, 0xD3, 0xCB, 0x69, 0x2B, 0x0D, 0xA3, 0x6C,
+0x5C, 0x1C, 0x1B, 0xFD, 0x3D, 0x83, 0xF4, 0x25, 0x78, 0x6F, 0x12, 0xF7, 0xA4, 0x0F, 0x5D, 0xFE,
+0xA0, 0x7F, 0x1D, 0x93, 0x6C, 0xFB, 0xEE, 0x14, 0x1C, 0x87, 0x39, 0x04, 0x01, 0x91, 0x30, 0xF6,
+0x61, 0x6F, 0xD8, 0xBB, 0x76, 0x6E, 0x6D, 0x8A, 0x7A, 0x79, 0xBB, 0x7C, 0x1E, 0x4A, 0x3B, 0x0A,
+0x02, 0x05, 0x81, 0x82, 0xC0, 0xAD, 0x46, 0x60, 0xCD, 0x11, 0x3B, 0x2E, 0x30, 0x93, 0x50, 0x32,
+0x4E, 0x21, 0x31, 0xB1, 0xA8, 0x09, 0x40, 0x78, 0x96, 0x39, 0xC6, 0xC6, 0x86, 0x52, 0x34, 0x1F,
+0x88, 0xD1, 0x14, 0x88, 0xDD, 0x28, 0x52, 0x45, 0x8C, 0x40, 0x75, 0x18, 0x07, 0xC1, 0x9B, 0x86,
+0x3A, 0x36, 0x2B, 0x26, 0x35, 0xF3, 0x23, 0xF2, 0x04, 0x73, 0x71, 0xED, 0x37, 0x95, 0xC9, 0x0C,
+0x79, 0x4E, 0xFE, 0x74, 0xA9, 0x74, 0x85, 0xC7, 0x95, 0x3D, 0x23, 0x70, 0xC6, 0xD4, 0x3C, 0xB7,
+0x9D, 0x0A, 0x7B, 0xEE, 0xB3, 0x24, 0x2F, 0x92, 0x9A, 0x27, 0xD5, 0x27, 0x6A, 0x39, 0x07, 0x55,
+0x71, 0x6A, 0xF8, 0xBA, 0x98, 0xF9, 0x68, 0xFA, 0x7A, 0xE5, 0xF4, 0xB5, 0xF0, 0xE2, 0xF1, 0x2B,
+0xE1, 0x30, 0xFC, 0x06, 0x19, 0xED, 0x7B, 0x3B, 0x1D, 0xEB, 0x11, 0x48, 0xF1, 0xD5, 0x87, 0xF6,
+0x84, 0xDD, 0x1B, 0xFA, 0x55, 0x01, 0x62, 0x57, 0xA8, 0xDC, 0x75, 0x40, 0xB9, 0xE3, 0x5F, 0x11,
+0xD6, 0x34, 0x42, 0x56, 0x15, 0x20, 0x25, 0x6D, 0x79, 0xE4, 0xAA, 0xFB, 0xE3, 0xE5, 0x0A, 0x99,
+0xAA, 0x6E, 0xE6, 0xEF, 0x66, 0xD7, 0xC5, 0x9D, 0x21, 0xCC, 0xFF, 0x4B, 0xD5, 0x34, 0x55, 0x4D,
+0xA3, 0xBF, 0x9D, 0x90, 0x64, 0x27, 0xD1, 0x99, 0x6A, 0xE7, 0x64, 0xD1, 0xFD, 0xE9, 0x8C, 0xF1,
+0x78, 0x9B, 0x5C, 0x3F, 0x75, 0x52, 0x29, 0xF7, 0xF2, 0xFE, 0x08, 0x69, 0x4A, 0x8F, 0x58, 0xC6,
+0x7E, 0x10, 0x30, 0x38, 0xE0, 0x9E, 0x1D, 0x1B, 0x91, 0xBF, 0xAE, 0x59, 0x89, 0x89, 0xE7, 0xC2,
+0x49, 0xA4, 0xF1, 0xE1, 0x9C, 0x6D, 0x13, 0xC5, 0x91, 0x49, 0xB7, 0xE9, 0x5E, 0xA0, 0x04, 0x2F,
+0x45, 0xF5, 0x66, 0x4A, 0x9D, 0x2B, 0x70, 0xA2, 0xE8, 0xA5, 0xC8, 0x57, 0x55, 0x3E, 0xAD, 0xAF,
+0xDE, 0x47, 0xC2, 0x66, 0x7D, 0x97, 0xAD, 0xF9, 0xA2, 0x4A, 0x37, 0x83, 0xCF, 0xD5, 0xAC, 0x04,
+0x4C, 0xF0, 0x7D, 0xF1, 0x6B, 0x34, 0xDF, 0x39, 0x19, 0x43, 0x10, 0x3F, 0x6E, 0xAD, 0x46, 0xB3,
+0xF0, 0xBA, 0x81, 0xFE, 0xB0, 0x69, 0xFD, 0x80, 0xEC, 0xC4, 0x51, 0x7C, 0xEB, 0x6E, 0xA7, 0x4F,
+0x6C, 0x69, 0x4B, 0x41, 0xA0, 0x20, 0xB0, 0x96, 0x11, 0x58, 0x73, 0xC4, 0x8E, 0x83, 0x35, 0xC1,
+0xC4, 0xC4, 0x88, 0x28, 0x1D, 0x9F, 0xD2, 0x68, 0xC5, 0x79, 0x10, 0xB7, 0x96, 0xF1, 0x11, 0x23,
+0x12, 0xCA, 0xD4, 0xA8, 0x32, 0x90, 0xCC, 0x4D, 0x45, 0xF5, 0x8E, 0x4A, 0x1E, 0x1F, 0x38, 0xCF,
+0x64, 0xC6, 0x51, 0xA9, 0x89, 0xC9, 0x51, 0x54, 0x5E, 0x8A, 0xBA, 0x9E, 0x4E, 0x8B, 0xA4, 0x81,
+0x64, 0xCA, 0x50, 0xAE, 0x2A, 0xE5, 0x25, 0xBC, 0xB0, 0x90, 0x01, 0x2F, 0xAF, 0x7F, 0x9D, 0x28,
+0xCA, 0xFA, 0x8A, 0xFF, 0xE8, 0x90, 0x3F, 0x43, 0x95, 0x71, 0x02, 0x66, 0x2D, 0xB4, 0xE7, 0x0C,
+0x54, 0xBB, 0x37, 0x4F, 0x5F, 0x0F, 0x6F, 0x9C, 0xBA, 0x16, 0x4E, 0x5D, 0x1D, 0xBB, 0xAD, 0xFC,
+0xED, 0xB8, 0x75, 0xD6, 0x83, 0xBB, 0x36, 0x84, 0x47, 0xF6, 0x6E, 0x42, 0xB4, 0x2C, 0xCC, 0x6E,
+0x58, 0xD4, 0xE9, 0x6F, 0x17, 0xDA, 0xA0, 0xE0, 0x75, 0xE0, 0x21, 0x36, 0x3C, 0x57, 0x85, 0x6A,
+0x30, 0x33, 0xA2, 0x1C, 0x3F, 0x64, 0x26, 0xA9, 0x25, 0xBD, 0x2B, 0xE1, 0xAA, 0x74, 0xB0, 0x66,
+0x08, 0x72, 0x45, 0x2D, 0x53, 0xAB, 0x22, 0xC1, 0xC9, 0x3E, 0xBD, 0x42, 0xCC, 0xEA, 0x7D, 0x9A,
+0x63, 0xA5, 0x99, 0xA2, 0x57, 0x33, 0xBA, 0xF1, 0xA5, 0x37, 0xC2, 0xEE, 0xE5, 0xA6, 0x4A, 0x12,
+0xBB, 0x7B, 0x77, 0x6C, 0x08, 0xF7, 0xED, 0xDC, 0x80, 0x9C, 0x6D, 0x4D, 0xD8, 0x4A, 0x0C, 0x3F,
+0x5E, 0x4E, 0x62, 0x1E, 0x70, 0x9E, 0x8A, 0xD5, 0x97, 0xA4, 0x4E, 0x7E, 0x98, 0x28, 0xB1, 0x8B,
+0x22, 0x9C, 0xE1, 0x6B, 0xB0, 0x46, 0xD3, 0x72, 0x2C, 0xE7, 0xE5, 0xF1, 0xD7, 0xB1, 0x61, 0x2D,
+0x54, 0x85, 0xE9, 0x47, 0xC7, 0xCF, 0x03, 0x3F, 0x4F, 0xD1, 0x8F, 0x0E, 0xCF, 0x45, 0xA5, 0xCB,
+0x71, 0xCF, 0x06, 0x6F, 0x7E, 0x66, 0x5A, 0xFC, 0xEB, 0xB8, 0x0B, 0xC6, 0x9E, 0x6D, 0x9B, 0xC3,
+0xBA, 0xBE, 0x1E, 0x31, 0x13, 0x97, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x9A, 0x83,
+0xC0, 0x9A, 0x23, 0x76, 0x54, 0x06, 0xC6, 0x18, 0x11, 0x7B, 0x7E, 0x48, 0xD2, 0x40, 0xB4, 0x61,
+0x81, 0x6A, 0x83, 0x69, 0xA8, 0x0D, 0x04, 0xA9, 0x85, 0x26, 0x23, 0x2E, 0x60, 0x54, 0x18, 0x44,
+0x0D, 0xE2, 0xF6, 0x9E, 0x48, 0xD7, 0x40, 0xF3, 0x12, 0xC8, 0xDF, 0x28, 0x22, 0xFB, 0x86, 0x91,
+0xC0, 0x78, 0x04, 0x7F, 0x49, 0xF2, 0xD4, 0xBC, 0x64, 0x8A, 0x87, 0x2B, 0x78, 0xBE, 0xB0, 0x8B,
+0x8D, 0xCA, 0x23, 0x67, 0xB5, 0x9C, 0xAE, 0xF5, 0xE9, 0x5C, 0x0C, 0xBB, 0x75, 0xA2, 0x67, 0x9C,
+0x44, 0xDA, 0x60, 0xCB, 0xA8, 0x54, 0x23, 0xBE, 0x4B, 0x5A, 0x5F, 0x52, 0xB3, 0x6C, 0x5B, 0xA6,
+0x91, 0xEB, 0x92, 0x06, 0x85, 0xAA, 0xDD, 0x7B, 0x17, 0x87, 0xC2, 0x8F, 0xE1, 0x6F, 0xF7, 0xEA,
+0xC9, 0x6B, 0x42, 0x5A, 0x6F, 0xA7, 0x63, 0xA0, 0xA7, 0x23, 0x7C, 0xE9, 0xFE, 0x1D, 0x61, 0x2F,
+0xFC, 0xCB, 0x48, 0xEC, 0xE0, 0xDA, 0xA8, 0xBB, 0x51, 0x74, 0xF4, 0x00, 0x06, 0x8D, 0x8A, 0x94,
+0x08, 0x59, 0x51, 0xEA, 0x34, 0xDA, 0x58, 0x39, 0x47, 0xF2, 0x7D, 0xF3, 0xFE, 0x2B, 0xFD, 0x32,
+0xD5, 0x4D, 0xFC, 0x0E, 0x8D, 0x18, 0xD8, 0x78, 0x78, 0x14, 0xAC, 0x2B, 0x4D, 0xA2, 0xD4, 0x49,
+0xB9, 0xAA, 0xAA, 0x96, 0xEF, 0x1A, 0xE1, 0x63, 0xB5, 0x40, 0x75, 0x73, 0xCC, 0x2B, 0x6A, 0x96,
+0xD6, 0xE3, 0xEA, 0xA1, 0x9A, 0x38, 0xCD, 0xBF, 0xCE, 0xD5, 0xBE, 0x18, 0x9D, 0xC0, 0xC1, 0x6C,
+0x95, 0x44, 0xCD, 0xF7, 0xEE, 0xDC, 0x18, 0xEE, 0x83, 0x6A, 0xD7, 0xAC, 0xAD, 0xC4, 0xA8, 0x4A,
+0x9B, 0x7B, 0x5F, 0x24, 0x76, 0xAE, 0x7C, 0xAA, 0x7F, 0x62, 0x7A, 0x28, 0x56, 0x36, 0xF7, 0xA3,
+0x3F, 0xA3, 0xF5, 0x31, 0x53, 0xEF, 0xA8, 0xB8, 0x4E, 0xA3, 0xEC, 0x18, 0x08, 0xDC, 0x08, 0xE6,
+0xD8, 0x75, 0xA8, 0xDA, 0x7C, 0x8C, 0xE2, 0x35, 0x5D, 0x1C, 0xF8, 0x85, 0xE1, 0xEA, 0x6B, 0x54,
+0xFA, 0xD2, 0x60, 0x22, 0xF8, 0x67, 0x12, 0x51, 0xBA, 0xF4, 0xAF, 0xEB, 0x0C, 0x0F, 0xEC, 0xDF,
+0x2D, 0x51, 0xC2, 0x65, 0xB7, 0x89, 0xDB, 0xE9, 0x93, 0x5A, 0xDA, 0x52, 0x10, 0x28, 0x08, 0xAC,
+0x75, 0x04, 0xD6, 0x1C, 0xB1, 0xE3, 0x1A, 0x33, 0x82, 0x48, 0xD8, 0x93, 0x57, 0x47, 0x24, 0xC2,
+0xB4, 0x7D, 0x7A, 0x22, 0xB4, 0x4F, 0x82, 0xD4, 0xC1, 0xBF, 0xCE, 0x17, 0x68, 0x0E, 0x6A, 0xF4,
+0xA3, 0xC3, 0x73, 0xE6, 0x88, 0xA3, 0x2F, 0x1B, 0x09, 0x1E, 0x4D, 0xB4, 0xF4, 0xBF, 0x63, 0xC4,
+0x1F, 0x1F, 0xB9, 0x0F, 0x9E, 0x2A, 0x6B, 0x4E, 0xC9, 0x94, 0x88, 0x29, 0x1F, 0x4B, 0xFE, 0x79,
+0xAE, 0x47, 0xE5, 0x8B, 0x59, 0xD5, 0x9F, 0xA9, 0x56, 0xF3, 0xCB, 0xA6, 0x98, 0xD7, 0xE3, 0xF5,
+0xD2, 0x0C, 0x4B, 0xC5, 0x0E, 0xED, 0xA7, 0x6A, 0x77, 0x75, 0x7C, 0x3A, 0x9C, 0x80, 0xF9, 0xED,
+0xCD, 0x33, 0xD7, 0x24, 0xC7, 0xDD, 0xED, 0x14, 0x25, 0xDB, 0x05, 0x85, 0xE6, 0xBE, 0xED, 0xEB,
+0xC3, 0xA3, 0xBB, 0x37, 0x86, 0xED, 0xEB, 0x7A, 0x42, 0x0F, 0x1C, 0xE7, 0x25, 0xED, 0x09, 0x16,
+0x78, 0x06, 0x52, 0x68, 0xE2, 0xDC, 0xA8, 0xB9, 0x2D, 0x54, 0xDE, 0x94, 0x9A, 0x19, 0x35, 0x56,
+0x82, 0x9C, 0x8B, 0xA3, 0xEA, 0x8B, 0xE7, 0x92, 0x9C, 0xFA, 0x23, 0xC6, 0xFA, 0xF2, 0xA2, 0x35,
+0x8A, 0x9A, 0x0D, 0x50, 0x22, 0x17, 0x99, 0x72, 0xE8, 0x62, 0xA1, 0x0B, 0x76, 0x4A, 0x84, 0xB2,
+0x36, 0xE4, 0x75, 0x59, 0xA1, 0x7C, 0xDE, 0x48, 0x49, 0xFA, 0xB7, 0x81, 0xC0, 0x6E, 0x40, 0xA2,
+0xE6, 0x9D, 0x48, 0xFF, 0xB2, 0x75, 0xA0, 0x27, 0x74, 0x30, 0x68, 0x64, 0x15, 0x0F, 0xFE, 0x18,
+0x19, 0xC6, 0x1C, 0xBF, 0x06, 0x3F, 0x52, 0xC5, 0x89, 0x7E, 0xA4, 0x06, 0x42, 0xFE, 0x23, 0x42,
+0xDE, 0xD2, 0xF3, 0xAA, 0x04, 0x67, 0x1D, 0x52, 0x9E, 0xE7, 0x14, 0x5A, 0x7D, 0xE8, 0x24, 0xC5,
+0x8E, 0xA9, 0x73, 0xE6, 0x4B, 0xC7, 0xD7, 0xA2, 0x62, 0x67, 0x2A, 0x5D, 0xED, 0xE7, 0x47, 0xC7,
+0x86, 0x1F, 0x24, 0x28, 0xE1, 0x48, 0x73, 0xC2, 0x91, 0xEC, 0x44, 0x3E, 0xBF, 0x7B, 0xF6, 0xEE,
+0x28, 0x11, 0xB1, 0xAB, 0x38, 0x0F, 0x4A, 0xD5, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x1E, 0x02,
+0xAB, 0xBB, 0x02, 0x35, 0x19, 0x73, 0x2E, 0x62, 0xF4, 0x39, 0x1A, 0x1C, 0x9B, 0x0A, 0xD7, 0x46,
+0xC6, 0x43, 0x1B, 0xCC, 0x42, 0x5D, 0x63, 0x83, 0xA1, 0x03, 0x8F, 0x16, 0x6E, 0xF9, 0x24, 0x4A,
+0x9D, 0xF1, 0x05, 0x15, 0x78, 0x2A, 0xFE, 0x41, 0xB2, 0xF0, 0xB5, 0x30, 0xC2, 0x0F, 0x4E, 0xE2,
+0xCC, 0xCD, 0x05, 0xF5, 0x8E, 0x0F, 0x3E, 0x77, 0xFF, 0xBB, 0x98, 0x8B, 0x4B, 0xFC, 0xBA, 0xDC,
+0x67, 0xCC, 0x28, 0x89, 0x47, 0x4C, 0xAA, 0x2E, 0x98, 0x2D, 0xA3, 0x16, 0x1C, 0x91, 0x93, 0x42,
+0x69, 0x87, 0x96, 0x73, 0x5F, 0x33, 0x6F, 0x9D, 0xAA, 0x4F, 0xFA, 0x8A, 0x7B, 0x90, 0x4E, 0x8B,
+0x6A, 0x37, 0x1D, 0x3A, 0xDB, 0xA0, 0xA6, 0x60, 0x91, 0x7D, 0x17, 0x6A, 0xE4, 0xF3, 0xF0, 0xB7,
+0x1B, 0x99, 0x9C, 0x69, 0x32, 0xC2, 0x4B, 0xDF, 0x6E, 0xA0, 0xBB, 0x23, 0x3C, 0x7B, 0xEF, 0x8E,
+0xF0, 0x88, 0x90, 0xBB, 0x6E, 0xED, 0x1B, 0x08, 0x5D, 0x6B, 0x57, 0x2F, 0x72, 0x17, 0x77, 0xA8,
+0x00, 0x66, 0x98, 0xA5, 0xDD, 0x26, 0x58, 0xA7, 0xBC, 0xA1, 0xE5, 0x45, 0x59, 0xD2, 0xC8, 0x53,
+0xDF, 0xDF, 0xB5, 0x56, 0x65, 0xF3, 0xF7, 0x3C, 0xD2, 0x35, 0x46, 0xBE, 0x52, 0x59, 0xB3, 0xE8,
+0x50, 0xF7, 0x8F, 0x73, 0x53, 0x69, 0x8A, 0xBA, 0x35, 0xBF, 0x46, 0xF3, 0xCB, 0x8B, 0xB9, 0xF1,
+0xDC, 0x67, 0x4F, 0x1C, 0x21, 0xCD, 0x47, 0xCD, 0xD4, 0x39, 0xDD, 0x5F, 0xB6, 0x8E, 0x1A, 0x28,
+0xF3, 0x05, 0xD1, 0xB0, 0xB0, 0x85, 0xEE, 0x44, 0x54, 0x70, 0x2F, 0xFA, 0xAF, 0x92, 0xD6, 0xEA,
+0x0E, 0x0B, 0x77, 0x22, 0x61, 0x10, 0x0D, 0x55, 0x65, 0x9A, 0x39, 0x69, 0xFA, 0x74, 0xF6, 0xA6,
+0x81, 0xC3, 0x3A, 0x2F, 0x3D, 0xC2, 0x55, 0x31, 0x51, 0x1F, 0x47, 0x57, 0x21, 0x7D, 0x3F, 0x5C,
+0x57, 0xAD, 0x99, 0xAA, 0x64, 0x10, 0x3E, 0xA9, 0x57, 0xE1, 0x73, 0x3A, 0x68, 0x7E, 0xA7, 0x4C,
+0x5D, 0xA2, 0x19, 0xFA, 0xA0, 0xD4, 0x49, 0x57, 0x8D, 0x21, 0x8A, 0x2A, 0xED, 0xBE, 0x8F, 0x3E,
+0x7F, 0xD9, 0x04, 0xEE, 0x99, 0xCB, 0xAD, 0xD5, 0x5A, 0x24, 0x51, 0xF3, 0xC1, 0xDD, 0x5B, 0x65,
+0x2B, 0xB1, 0xE2, 0x5F, 0xB7, 0xBA, 0xF3, 0xA1, 0xD4, 0x5E, 0x10, 0x28, 0x08, 0x14, 0x04, 0x72,
+0x04, 0xD6, 0x14, 0xB1, 0x63, 0xC7, 0x98, 0x02, 0xE2, 0xD4, 0xB5, 0x11, 0xA8, 0x76, 0x53, 0xA1,
+0x05, 0x64, 0xA8, 0x1D, 0x41, 0x13, 0x6D, 0xE3, 0x43, 0x62, 0xAA, 0xF2, 0xA3, 0xDE, 0xBA, 0xEB,
+0xEA, 0x85, 0x90, 0x29, 0x2C, 0x50, 0x54, 0xF0, 0xA8, 0xD6, 0x89, 0xDF, 0x1D, 0x15, 0x3C, 0x7B,
+0xF0, 0xB5, 0x2C, 0x78, 0x54, 0x27, 0x4C, 0x52, 0x4A, 0xD7, 0x72, 0xB1, 0x53, 0x4A, 0x17, 0x09,
+0xA4, 0xDC, 0x34, 0x29, 0x55, 0x7C, 0x95, 0x94, 0xA9, 0xA4, 0x40, 0xE5, 0x83, 0xE2, 0x67, 0xA5,
+0x24, 0x7D, 0xA7, 0xA0, 0xD8, 0xCD, 0x23, 0x42, 0xB6, 0x8D, 0xAA, 0x09, 0x16, 0xE0, 0x4B, 0x43,
+0x13, 0xE1, 0xAD, 0xD3, 0x57, 0xC3, 0x51, 0xE4, 0xE9, 0x63, 0x7F, 0x6F, 0x97, 0x83, 0x7B, 0xA3,
+0xDE, 0xBD, 0x7D, 0x20, 0x3C, 0xB9, 0x0F, 0x51, 0xB2, 0xF0, 0xB9, 0xDB, 0x86, 0x3D, 0x65, 0x49,
+0x3C, 0x5A, 0xA1, 0xDA, 0xB5, 0x75, 0x42, 0xB5, 0xA3, 0x33, 0x98, 0x91, 0xA6, 0x28, 0x8D, 0x45,
+0x7C, 0xAC, 0x17, 0x51, 0x05, 0x75, 0xE2, 0x5B, 0xA7, 0x77, 0xA6, 0x9E, 0x45, 0xD1, 0xCE, 0xA5,
+0xBD, 0x4C, 0xAD, 0x72, 0xC3, 0xB8, 0xAA, 0x7C, 0xEE, 0x3B, 0x67, 0xAA, 0x56, 0x4D, 0x95, 0xAA,
+0xA8, 0x2A, 0x81, 0x91, 0xB1, 0x49, 0x15, 0x2F, 0xB8, 0xB9, 0x15, 0x55, 0xF5, 0x57, 0x4A, 0xB7,
+0x4A, 0x70, 0xC0, 0xBE, 0x2D, 0x03, 0x92, 0xD7, 0xAF, 0x19, 0x24, 0x86, 0xE9, 0x45, 0x2E, 0x60,
+0x0E, 0xCC, 0x82, 0xE0, 0xD1, 0x7D, 0xD1, 0xA3, 0x52, 0x63, 0x63, 0x5D, 0xA9, 0x8B, 0x2A, 0xA8,
+0xF6, 0x2B, 0xCD, 0x7B, 0xFC, 0x00, 0x42, 0xFB, 0x99, 0x4A, 0x67, 0x9C, 0x91, 0xAE, 0x98, 0xDB,
+0x63, 0xDC, 0x31, 0xC2, 0xD4, 0xBA, 0x49, 0xCC, 0x33, 0xFA, 0xD8, 0x71, 0x8E, 0xFB, 0x7C, 0xCD,
+0xD5, 0xD4, 0x58, 0x8F, 0x60, 0xE0, 0xF5, 0x52, 0x35, 0xC4, 0xE7, 0x82, 0x5B, 0xF6, 0x41, 0xC1,
+0xDC, 0xBA, 0x71, 0x5D, 0xD8, 0xBA, 0x01, 0x81, 0x13, 0x4D, 0x48, 0xFB, 0x72, 0xBB, 0xCC, 0xFF,
+0xD2, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x70, 0x3B, 0x20, 0xB0, 0xE6, 0x88, 0xDD, 0x18, 0x54,
+0x87, 0x77, 0xCE, 0x5D, 0x03, 0x11, 0x83, 0x9A, 0x45, 0x25, 0x83, 0xD1, 0xB0, 0xD8, 0x90, 0x3C,
+0x12, 0x09, 0xF1, 0x27, 0xB2, 0xA5, 0x5E, 0x7C, 0x8D, 0x7C, 0x25, 0xD7, 0x25, 0xCA, 0x44, 0x3C,
+0x89, 0xF6, 0x13, 0x9F, 0x74, 0xFC, 0x47, 0x32, 0x47, 0xBF, 0xBB, 0x41, 0x51, 0xF0, 0xA6, 0x90,
+0x0B, 0x4F, 0xD3, 0xA5, 0x70, 0x71, 0x74, 0x05, 0x4F, 0x1D, 0xF3, 0x3D, 0x97, 0x98, 0x08, 0x39,
+0xC9, 0x4F, 0x4B, 0xEE, 0xA3, 0xEF, 0xB9, 0xAF, 0x97, 0x2A, 0x2A, 0xAA, 0xAC, 0xC4, 0x25, 0xD7,
+0xDE, 0x4F, 0x2A, 0x12, 0xEB, 0x40, 0x19, 0xE6, 0xDC, 0x1B, 0x83, 0x6A, 0x37, 0x35, 0x0E, 0x41,
+0x91, 0xBE, 0x7F, 0x73, 0xE1, 0xF0, 0xA5, 0xA1, 0xF0, 0xA3, 0xC3, 0x17, 0x65, 0x13, 0xF8, 0xDB,
+0xE9, 0xE8, 0xEB, 0x6A, 0x0F, 0x9F, 0x39, 0xB8, 0x39, 0xFC, 0xD4, 0x03, 0x3B, 0xC2, 0x83, 0x3B,
+0xD6, 0x05, 0x70, 0x3D, 0x49, 0xFD, 0xD1, 0x0E, 0xD5, 0xAE, 0xB5, 0x1D, 0xE4, 0xCE, 0xFA, 0xAB,
+0xB9, 0xED, 0x3C, 0x88, 0x24, 0xF3, 0x69, 0x33, 0xFF, 0x2F, 0xF7, 0x11, 0x73, 0xF3, 0xB9, 0xFA,
+0xB8, 0xA9, 0xE2, 0xA4, 0xFE, 0x6F, 0xA6, 0x96, 0x0A, 0x51, 0x4C, 0xE7, 0x63, 0x7E, 0x3A, 0x29,
+0x43, 0x8C, 0xD3, 0x38, 0x78, 0xA4, 0x6C, 0xC5, 0x7F, 0x4E, 0xC6, 0xCC, 0xCA, 0x7A, 0xDD, 0x54,
+0xA3, 0xD8, 0x36, 0x7B, 0xED, 0xE5, 0x5D, 0x09, 0xD3, 0xBD, 0x84, 0x13, 0x15, 0x6C, 0x47, 0x5A,
+0x97, 0xBB, 0x61, 0x86, 0xA6, 0x9F, 0x61, 0x33, 0x0E, 0xBA, 0x0B, 0x9C, 0x46, 0x62, 0x62, 0x52,
+0x7A, 0x5A, 0x7D, 0x49, 0xA6, 0xE6, 0x24, 0x2A, 0xD6, 0x54, 0x45, 0x8B, 0x70, 0x95, 0x19, 0xE9,
+0x38, 0xB8, 0xE2, 0x86, 0x6B, 0x98, 0xE7, 0x5A, 0xF6, 0x74, 0x85, 0x2F, 0xEA, 0x55, 0xCC, 0x9F,
+0xAB, 0x50, 0x7E, 0xE9, 0x43, 0xC7, 0x14, 0x2A, 0x54, 0xE6, 0x24, 0x27, 0x1E, 0x67, 0x65, 0x86,
+0x87, 0xA8, 0x96, 0xF2, 0x43, 0x23, 0x29, 0x97, 0xA2, 0x2A, 0xCB, 0x6B, 0x14, 0x26, 0x19, 0x94,
+0xDC, 0x90, 0xF3, 0x92, 0xCF, 0xEF, 0xD0, 0xAE, 0x6D, 0xA2, 0xD6, 0x15, 0xFF, 0xBA, 0x66, 0xCC,
+0x88, 0x72, 0x8F, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x90, 0x10, 0x58, 0x73, 0xC4, 0x6E, 0x1C, 0xC4,
+0xEE, 0xC3, 0x0B, 0xD7, 0xC3, 0x34, 0x88, 0x58, 0x0B, 0x1C, 0xB9, 0x5B, 0x91, 0x2C, 0xB5, 0x05,
+0x7E, 0x76, 0x71, 0x31, 0x77, 0x1E, 0x17, 0x55, 0x9E, 0x78, 0xA2, 0x32, 0x2F, 0x5C, 0x89, 0xD0,
+0x35, 0xCB, 0xF6, 0xC3, 0x14, 0xD5, 0x0E, 0x7B, 0xCE, 0xE2, 0xA1, 0x0A, 0x9E, 0x12, 0x3C, 0xFA,
+0xE6, 0xD1, 0xE1, 0x3C, 0xE6, 0xF2, 0x72, 0x6D, 0x24, 0x53, 0x90, 0xFC, 0x76, 0xC9, 0x89, 0x4B,
+0xD5, 0x90, 0x05, 0x0B, 0x9F, 0x28, 0x7E, 0xC2, 0x1A, 0xD2, 0xC1, 0x45, 0x1B, 0xA4, 0x6E, 0x7E,
+0x62, 0x04, 0x7F, 0xC7, 0xD0, 0x20, 0x2C, 0xC6, 0x23, 0x13, 0x88, 0x92, 0xBD, 0x12, 0x3E, 0x44,
+0xE2, 0x62, 0xB6, 0xE1, 0x76, 0x39, 0x3A, 0xA1, 0xD0, 0xEC, 0xDE, 0xD0, 0x1B, 0x1E, 0x00, 0xA9,
+0x7B, 0x74, 0xF7, 0x86, 0xB0, 0x03, 0xFE, 0x76, 0x4C, 0xC7, 0xD1, 0x06, 0xD5, 0xAE, 0xA3, 0x0B,
+0xF9, 0xDD, 0x40, 0x82, 0x92, 0x91, 0x3A, 0xEF, 0xA3, 0x92, 0x5E, 0x1E, 0x95, 0xDD, 0x38, 0x4C,
+0x7D, 0x8A, 0x70, 0xE4, 0xAA, 0x5C, 0x54, 0xA6, 0x12, 0x5C, 0x39, 0x6C, 0x09, 0x43, 0x23, 0x1F,
+0x39, 0xAE, 0xF9, 0xD8, 0xE8, 0x48, 0x98, 0x99, 0xB2, 0x16, 0x7B, 0x3F, 0x6F, 0x6A, 0x9F, 0xDF,
+0x40, 0x26, 0x88, 0xEE, 0xF6, 0xD0, 0x03, 0xA5, 0x6E, 0x17, 0x82, 0x46, 0x9A, 0xB1, 0x8D, 0x18,
+0x5B, 0xCA, 0x74, 0x3E, 0x17, 0x31, 0xFE, 0x6E, 0x56, 0x55, 0x52, 0x97, 0xB0, 0xF4, 0xB9, 0xAB,
+0xB9, 0xED, 0x7C, 0xA7, 0x08, 0xFA, 0xCF, 0xA5, 0x3C, 0x74, 0xA2, 0xD0, 0x99, 0x52, 0xC7, 0xF3,
+0xEA, 0x43, 0xA7, 0xF5, 0xA8, 0xEA, 0x5C, 0x9D, 0x87, 0x15, 0x35, 0x53, 0x27, 0xAE, 0x91, 0x3F,
+0xBD, 0xAF, 0xAA, 0xDC, 0x20, 0x76, 0x78, 0xDE, 0x09, 0xFF, 0xCA, 0xFB, 0xF7, 0x6E, 0x07, 0x1E,
+0xCD, 0x21, 0xBA, 0xB7, 0xCB, 0xDC, 0x2F, 0xED, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0xB7, 0x03,
+0x02, 0x6B, 0x86, 0xD8, 0xB9, 0x02, 0x36, 0x09, 0x15, 0xE2, 0xA3, 0x4B, 0xD7, 0x91, 0x8C, 0x18,
+0x91, 0xB0, 0x54, 0xB8, 0xE0, 0xCC, 0xAD, 0xD1, 0xB0, 0xA6, 0x38, 0x28, 0x73, 0x10, 0xC5, 0x47,
+0x89, 0x84, 0x3D, 0x37, 0x73, 0xA9, 0x7A, 0x0C, 0xA9, 0x8A, 0xA6, 0xFE, 0x60, 0x54, 0x25, 0x4C,
+0xD5, 0xC1, 0x79, 0xFA, 0x1C, 0x4D, 0xD3, 0x84, 0x85, 0x45, 0x71, 0x10, 0x6A, 0x07, 0xB3, 0xEF,
+0x0F, 0x63, 0x8F, 0x4C, 0x26, 0x6D, 0x8D, 0xA6, 0x2B, 0xF3, 0xD7, 0xD2, 0xE8, 0x5B, 0x5B, 0x73,
+0x5D, 0x15, 0xB2, 0xBF, 0x22, 0x25, 0x99, 0xA2, 0xE4, 0x4E, 0xFB, 0x1A, 0x39, 0xAA, 0x2A, 0x48,
+0xCA, 0xD7, 0xC6, 0x53, 0x28, 0xCB, 0x14, 0x2C, 0x50, 0x1E, 0xE7, 0x46, 0x61, 0x56, 0x96, 0x40,
+0x90, 0x39, 0x04, 0x50, 0x0C, 0x87, 0xEF, 0xBF, 0x77, 0x36, 0x0C, 0x23, 0xA8, 0xE2, 0x76, 0x3B,
+0xD6, 0x43, 0xBD, 0x7A, 0x72, 0xFF, 0x46, 0x98, 0x64, 0xD7, 0x43, 0xB5, 0x83, 0x39, 0x16, 0x7D,
+0xE8, 0xEA, 0xEE, 0x05, 0xB9, 0xA3, 0xEF, 0x9D, 0x12, 0x83, 0x4A, 0xD4, 0xA6, 0xF8, 0xB1, 0x39,
+0x26, 0xAE, 0x04, 0xA9, 0x3F, 0x9C, 0xEF, 0x7F, 0x1A, 0x73, 0xDD, 0xF9, 0x58, 0x99, 0xCF, 0x57,
+0xAC, 0x47, 0xF0, 0xD6, 0x31, 0x8D, 0xB9, 0xE9, 0x9C, 0x70, 0xBB, 0x4F, 0x64, 0x8C, 0x16, 0xF5,
+0xC8, 0x5C, 0x57, 0xEB, 0x28, 0xED, 0xF9, 0x68, 0xE9, 0xF8, 0x47, 0x3F, 0x40, 0xF1, 0xB5, 0x53,
+0x1F, 0xB3, 0x14, 0x6D, 0x8A, 0x22, 0x90, 0xCB, 0x68, 0x5E, 0x5E, 0x8F, 0xC4, 0xCC, 0x1B, 0xFB,
+0x3A, 0xE1, 0x03, 0xB9, 0xFA, 0x1F, 0x27, 0xF6, 0x6B, 0x02, 0xD1, 0xAA, 0x43, 0x08, 0x9E, 0x60,
+0x3F, 0x69, 0x9A, 0x17, 0x2F, 0x03, 0x27, 0x64, 0xA6, 0xA8, 0xB5, 0xE1, 0x04, 0x55, 0xE7, 0x39,
+0xB4, 0x59, 0xF7, 0x73, 0xC5, 0x5C, 0xC5, 0x3C, 0xA5, 0x42, 0xC7, 0xBF, 0x54, 0xEB, 0xA8, 0x44,
+0xF3, 0x42, 0x29, 0x2B, 0xCA, 0x65, 0xF2, 0xF7, 0x94, 0x31, 0x52, 0xB9, 0x53, 0x94, 0x3A, 0xF9,
+0x0C, 0x44, 0xB5, 0x4E, 0x3F, 0x1B, 0x71, 0x9E, 0x12, 0x75, 0x12, 0x3B, 0x28, 0x76, 0x4C, 0x73,
+0xD3, 0x0B, 0x42, 0xF7, 0xD0, 0xFE, 0x1D, 0x12, 0x11, 0x5B, 0x8E, 0x82, 0x40, 0x41, 0xA0, 0x20,
+0x50, 0x10, 0x68, 0x2E, 0x02, 0xAB, 0xBF, 0x12, 0x35, 0xB1, 0x3F, 0x0C, 0x2C, 0xB8, 0x38, 0x38,
+0x16, 0xAE, 0x0C, 0x43, 0xDD, 0x82, 0x9A, 0xD6, 0x3A, 0x31, 0x1A, 0x5A, 0x99, 0xC3, 0xCE, 0xD5,
+0x85, 0xD8, 0x16, 0x97, 0x37, 0x8C, 0xD8, 0x2D, 0x90, 0xC8, 0xB2, 0x46, 0x5B, 0x51, 0x55, 0x30,
+0x94, 0x0C, 0x70, 0x2B, 0x32, 0xF1, 0xC1, 0x63, 0x9E, 0x2F, 0xC9, 0xF1, 0x45, 0x15, 0x8F, 0x0A,
+0x88, 0xFE, 0xE5, 0x82, 0x49, 0x05, 0x84, 0x66, 0x29, 0xC9, 0xF7, 0x55, 0x7B, 0x7F, 0x57, 0x8B,
+0xEC, 0xAF, 0x98, 0xF8, 0x94, 0xED, 0x98, 0x5A, 0xE7, 0x84, 0x33, 0x93, 0x61, 0x48, 0x50, 0x18,
+0x71, 0x38, 0x3D, 0x0E, 0xC9, 0x06, 0x84, 0x15, 0xFE, 0x83, 0x83, 0x63, 0x50, 0xED, 0x4E, 0x5D,
+0x09, 0xEF, 0x9D, 0xBD, 0x86, 0x3D, 0x70, 0x6F, 0x1F, 0xD5, 0x8E, 0x3D, 0x61, 0x6E, 0xBB, 0x3D,
+0x9B, 0xFA, 0x10, 0x48, 0xB1, 0x3E, 0xEC, 0x5E, 0xDF, 0x23, 0xE4, 0xAE, 0x1D, 0x0B, 0x7E, 0x67,
+0x77, 0xB7, 0x98, 0xEA, 0x5C, 0x6D, 0x32, 0x8E, 0xE7, 0x46, 0xD9, 0xA8, 0xDA, 0xA9, 0xC9, 0x4F,
+0x31, 0xA9, 0xA7, 0xD6, 0xF9, 0x08, 0xB9, 0xF5, 0xBA, 0x1A, 0x99, 0x9C, 0x8F, 0x9F, 0x29, 0x6D,
+0x76, 0x4A, 0xAB, 0x34, 0x9F, 0x3B, 0xE5, 0x43, 0xAA, 0x9A, 0x1A, 0xE4, 0x5A, 0xCC, 0xEE, 0xE8,
+0xC4, 0xBF, 0xFA, 0xA6, 0x96, 0x97, 0x80, 0x84, 0x56, 0xD9, 0x0F, 0x75, 0x07, 0x14, 0xCA, 0x7E,
+0x04, 0x4E, 0xAC, 0xF6, 0x6E, 0x13, 0x6C, 0x19, 0x7D, 0xDF, 0xAE, 0x61, 0xC7, 0x09, 0xAA, 0xC5,
+0x2D, 0xC0, 0x94, 0x66, 0xD8, 0x7C, 0x7E, 0x89, 0x72, 0x86, 0x07, 0xFD, 0x40, 0xE3, 0x5E, 0xAE,
+0xE6, 0x3F, 0x37, 0x06, 0xA5, 0x6F, 0x4C, 0x54, 0x3B, 0x9D, 0xBB, 0xA2, 0xD0, 0xC9, 0xBC, 0xCE,
+0xFC, 0x0B, 0xE5, 0x87, 0x4E, 0xFE, 0xA1, 0xCD, 0xFC, 0x0E, 0xAD, 0xAC, 0x5E, 0x93, 0xC1, 0x64,
+0x44, 0x5A, 0xE6, 0x3A, 0x30, 0x19, 0xC0, 0x8E, 0x13, 0x7B, 0xB6, 0x6C, 0x84, 0x72, 0xB7, 0xFA,
+0xF9, 0xFC, 0xF2, 0x96, 0x96, 0xE7, 0x05, 0x81, 0x82, 0x40, 0x41, 0xA0, 0x20, 0x60, 0x3B, 0x11,
+0xAD, 0x15, 0x20, 0x26, 0xE0, 0xFB, 0x76, 0xF8, 0xFC, 0xB5, 0x30, 0x45, 0x33, 0x2C, 0xCC, 0x42,
+0x2D, 0x0C, 0x3A, 0xA0, 0x4F, 0x1A, 0x4D, 0x66, 0xF2, 0x5F, 0xB6, 0x66, 0xC9, 0xCA, 0xC4, 0x15,
+0xCA, 0xFC, 0xEC, 0xFC, 0xB5, 0x2C, 0x6A, 0x99, 0x07, 0x95, 0xF9, 0x53, 0xC9, 0xDB, 0xEE, 0x53,
+0xC4, 0x85, 0x10, 0xE7, 0x35, 0xF1, 0x2A, 0x4D, 0x50, 0x50, 0x51, 0xA8, 0xE0, 0x89, 0x22, 0x32,
+0x29, 0x79, 0xBF, 0xC6, 0xD1, 0x06, 0x2E, 0xAE, 0x5C, 0x64, 0x95, 0x08, 0xB8, 0xE2, 0xA3, 0xCA,
+0x48, 0xBC, 0x77, 0xC5, 0x5B, 0xCB, 0x14, 0x27, 0x53, 0x0A, 0x63, 0x24, 0xA7, 0x97, 0xE1, 0x75,
+0xEC, 0xCF, 0xE4, 0x28, 0xCC, 0xCB, 0x50, 0x22, 0xE7, 0x67, 0xC3, 0x99, 0x6B, 0xC3, 0xE1, 0xBB,
+0x6F, 0x9F, 0x0A, 0x83, 0xE3, 0x4C, 0x7D, 0x71, 0x7B, 0x1D, 0xDD, 0x58, 0xD8, 0x1F, 0xDE, 0xB5,
+0x31, 0x3C, 0xB9, 0x77, 0x43, 0xE8, 0x6C, 0x87, 0x39, 0x16, 0xE3, 0xD0, 0xDD, 0x0B, 0xD5, 0x0E,
+0xE4, 0xCE, 0x0F, 0x21, 0xCC, 0x22, 0xD4, 0xE5, 0x7D, 0x57, 0xE2, 0xA4, 0x44, 0xD7, 0x94, 0x21,
+0x51, 0x31, 0x59, 0x50, 0x55, 0x24, 0x57, 0xFC, 0x64, 0x54, 0xCD, 0xA7, 0xCC, 0xFD, 0xE2, 0x94,
+0xE4, 0x99, 0xFA, 0x24, 0x04, 0x2C, 0x53, 0x67, 0x65, 0xEC, 0x54, 0x81, 0x8D, 0x5E, 0x7E, 0xA2,
+0xC8, 0x99, 0xBF, 0x9F, 0x10, 0x1B, 0x53, 0xFD, 0xE4, 0x32, 0xF7, 0xB5, 0xB3, 0x3A, 0x44, 0x65,
+0x45, 0x5F, 0x10, 0x20, 0x40, 0xB2, 0xCA, 0x3E, 0xDE, 0xB3, 0x75, 0x40, 0xFE, 0x36, 0xE3, 0xF0,
+0x5D, 0x55, 0xD8, 0x44, 0xFA, 0xD7, 0xCD, 0x30, 0x58, 0x01, 0x37, 0x6E, 0x15, 0x65, 0x53, 0x49,
+0x1D, 0xD5, 0xE3, 0x41, 0x10, 0xFD, 0xCB, 0x98, 0x83, 0x57, 0x30, 0x17, 0x87, 0xE1, 0x9E, 0xC0,
+0x94, 0x25, 0xFC, 0xA1, 0xA1, 0xD3, 0x58, 0xFD, 0x3D, 0x65, 0xD7, 0x08, 0xC3, 0x35, 0xF9, 0xD3,
+0x99, 0x4A, 0x67, 0xFD, 0x76, 0x3F, 0x3D, 0xC7, 0x27, 0xDF, 0x57, 0x39, 0x11, 0x62, 0x2A, 0xE2,
+0xF4, 0xF3, 0x43, 0x69, 0x38, 0x55, 0x6E, 0xDC, 0x38, 0x80, 0xED, 0xC4, 0x98, 0xE2, 0x26, 0x9B,
+0xEB, 0xCD, 0x00, 0xA7, 0xDC, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x74, 0x8B, 0xC9,
+0xB5, 0x72, 0xD0, 0xBF, 0xEE, 0xFD, 0xB3, 0x57, 0xC3, 0x24, 0x08, 0x56, 0x0B, 0x15, 0x0D, 0x2A,
+0x5B, 0x54, 0x25, 0x18, 0x3A, 0xE8, 0x64, 0xCA, 0x3A, 0x1B, 0x79, 0x1D, 0x5F, 0xE7, 0x0A, 0x85,
+0x72, 0x30, 0x3B, 0x59, 0x91, 0x2E, 0x2A, 0x64, 0x44, 0x16, 0x48, 0x2B, 0xE7, 0x51, 0xB4, 0x8C,
+0x26, 0xD4, 0x0C, 0xFD, 0xAA, 0xDC, 0xA5, 0xE7, 0xEA, 0x93, 0x47, 0x87, 0x75, 0xD9, 0x97, 0xD6,
+0x94, 0xB9, 0xC4, 0x2D, 0x6B, 0x1A, 0xC0, 0xBA, 0x5D, 0x38, 0x71, 0x75, 0xCF, 0xEF, 0x2E, 0xCA,
+0x1D, 0xCC, 0x70, 0x30, 0xC7, 0x92, 0xBC, 0x0E, 0x8F, 0x4F, 0x86, 0xB7, 0x4E, 0x5D, 0x0E, 0xEF,
+0xC0, 0xDF, 0xEE, 0x76, 0xDB, 0x6A, 0x8C, 0xC4, 0x67, 0xE7, 0x86, 0x1E, 0x90, 0xBB, 0x0D, 0x92,
+0xB8, 0xB8, 0x1D, 0xE9, 0x5A, 0x3A, 0x90, 0xF6, 0xA4, 0xA7, 0x07, 0x0A, 0x1E, 0xFC, 0xB0, 0x54,
+0x6D, 0x73, 0x75, 0x2C, 0x1B, 0x88, 0xD8, 0xE7, 0x08, 0x82, 0x61, 0xED, 0x63, 0x65, 0x04, 0xC5,
+0x89, 0x8A, 0x2B, 0x9D, 0x99, 0xB2, 0xE6, 0x0A, 0x68, 0x1C, 0xB4, 0xBC, 0xCE, 0xDA, 0x01, 0xB7,
+0x42, 0x46, 0xE7, 0x6A, 0xE6, 0x43, 0x8D, 0x9A, 0x27, 0x4A, 0x22, 0xCC, 0x97, 0x30, 0xBB, 0x52,
+0xA1, 0xEB, 0x46, 0x44, 0xEC, 0x5D, 0x5B, 0xFA, 0x02, 0xF3, 0xF8, 0x35, 0xE3, 0x60, 0xE0, 0xC4,
+0xF9, 0xC1, 0x71, 0x21, 0x51, 0x7C, 0x70, 0xCE, 0xAB, 0x32, 0x07, 0x35, 0x4E, 0x54, 0x63, 0x46,
+0xB7, 0xDA, 0x73, 0xEE, 0x1A, 0x61, 0xEA, 0x1C, 0x7F, 0x7C, 0xA8, 0x0F, 0x68, 0x52, 0xE7, 0x54,
+0x85, 0x76, 0xF5, 0x2D, 0x57, 0xEA, 0xCC, 0x7F, 0x4E, 0x86, 0xC4, 0x89, 0xAE, 0xCF, 0xF7, 0xFC,
+0xF3, 0xA2, 0x88, 0x51, 0xF9, 0xA3, 0x1F, 0x2A, 0x8F, 0x4E, 0xA8, 0xB1, 0x07, 0xB6, 0x73, 0xDF,
+0x60, 0x10, 0xBB, 0x66, 0x00, 0x52, 0xEE, 0x51, 0x10, 0x28, 0x08, 0x14, 0x04, 0x0A, 0x02, 0x15,
+0x04, 0xD6, 0x0C, 0xB1, 0xA3, 0x3A, 0x30, 0x0E, 0xC5, 0xEE, 0xFD, 0x73, 0x57, 0x60, 0x1E, 0x45,
+0x44, 0x2C, 0xF7, 0xAB, 0x44, 0xF0, 0x04, 0x24, 0x2E, 0xED, 0xB0, 0x28, 0x13, 0xBA, 0x28, 0xAB,
+0xDF, 0x9C, 0xA9, 0x44, 0x76, 0x3E, 0x6E, 0xFF, 0xE0, 0x4A, 0x8E, 0xB0, 0x0E, 0xF7, 0xD9, 0x52,
+0xED, 0x48, 0x75, 0xA0, 0x14, 0x11, 0xA9, 0x3E, 0x72, 0xAA, 0x4A, 0xB4, 0xA2, 0x2C, 0x83, 0x04,
+0xF8, 0x1F, 0x7D, 0xED, 0xB8, 0xD8, 0x32, 0x7A, 0x76, 0x48, 0xFC, 0xF0, 0xCC, 0x17, 0x8F, 0x8B,
+0xB0, 0xED, 0xB3, 0x99, 0xCC, 0x67, 0x5E, 0x87, 0xB5, 0x51, 0xCC, 0xB2, 0x69, 0x01, 0x8E, 0xCB,
+0xA9, 0xF9, 0x3B, 0xB1, 0xE1, 0xD8, 0x70, 0x2C, 0xCC, 0xC3, 0x7F, 0x30, 0xC0, 0x34, 0x4B, 0xD5,
+0xE5, 0xE2, 0xE0, 0x68, 0xF8, 0xCE, 0x5B, 0x27, 0x60, 0x9A, 0x65, 0x7F, 0x6F, 0xAF, 0x83, 0x29,
+0x50, 0xEE, 0x41, 0x20, 0xC5, 0x53, 0xFB, 0x36, 0x82, 0xFC, 0xB4, 0xCA, 0xF6, 0x57, 0x24, 0x76,
+0xDD, 0xE6, 0x6B, 0x27, 0xDB, 0x60, 0x89, 0x40, 0x47, 0x62, 0x60, 0x91, 0xAE, 0xD1, 0x0F, 0x51,
+0x89, 0x83, 0x9A, 0xD2, 0x6D, 0x04, 0xC4, 0x47, 0x4E, 0xD5, 0x33, 0x8F, 0x2A, 0x96, 0xF7, 0x84,
+0x80, 0xA8, 0x4F, 0x24, 0x9F, 0xFA, 0x38, 0x7B, 0x24, 0x6C, 0xF4, 0x69, 0x94, 0x71, 0x37, 0xB2,
+0x62, 0x24, 0x2D, 0x45, 0xBD, 0x1A, 0xF2, 0xEE, 0xEB, 0x17, 0xC7, 0x97, 0x4D, 0x4B, 0x2A, 0x21,
+0x11, 0x66, 0x8A, 0x13, 0x8E, 0x77, 0x0F, 0x4D, 0xCE, 0x1B, 0x7B, 0xA5, 0x6F, 0xCD, 0x38, 0x48,
+0xD0, 0x2E, 0x8D, 0x4E, 0x08, 0x99, 0xE2, 0x3C, 0x17, 0x95, 0x18, 0xCA, 0xDC, 0x25, 0xFC, 0xBD,
+0x82, 0xC7, 0x75, 0xCC, 0x31, 0x46, 0xB8, 0xD2, 0x15, 0x80, 0x40, 0x48, 0xFE, 0x39, 0x51, 0x29,
+0xED, 0xF7, 0x4D, 0xD6, 0x67, 0xF7, 0x93, 0x4B, 0xBE, 0x84, 0xAA, 0x5A, 0x56, 0x09, 0xA0, 0x9A,
+0xC4, 0xAB, 0xFE, 0x75, 0x56, 0xC6, 0xFC, 0x15, 0x19, 0x4D, 0xAB, 0xFE, 0xA5, 0xAD, 0xA1, 0x0F,
+0x41, 0x32, 0x8F, 0x8B, 0x7F, 0x5D, 0x09, 0x9C, 0x68, 0xC6, 0x7C, 0x28, 0xF7, 0x28, 0x08, 0x14,
+0x04, 0x0A, 0x02, 0xB5, 0x08, 0x34, 0x67, 0x35, 0x6A, 0x02, 0xEE, 0x54, 0x0C, 0x06, 0xB1, 0xE0,
+0x9D, 0xB9, 0x36, 0x14, 0xA6, 0x49, 0xEC, 0x40, 0xEA, 0x5A, 0xE0, 0xCC, 0xAD, 0x66, 0x35, 0xE1,
+0x07, 0xB2, 0xC0, 0xA9, 0x02, 0xA1, 0xA7, 0x84, 0x4B, 0x18, 0x69, 0x48, 0x22, 0x8E, 0xA9, 0x41,
+0x76, 0x8D, 0x37, 0x5D, 0x95, 0x8D, 0xA4, 0xAC, 0xC5, 0xBA, 0xE4, 0xBC, 0xD5, 0x67, 0x7F, 0xB9,
+0x38, 0x72, 0xA1, 0x13, 0x1F, 0x3C, 0x3C, 0x24, 0x1A, 0xD1, 0xD4, 0x94, 0xA4, 0xE4, 0x51, 0x65,
+0x71, 0x15, 0x4F, 0xCB, 0xFB, 0xFE, 0x9B, 0xDA, 0xB8, 0x25, 0x40, 0x63, 0x17, 0x40, 0x5C, 0x03,
+0xCC, 0xB1, 0x34, 0xCD, 0x8E, 0x22, 0x67, 0xDF, 0x9B, 0x27, 0x2F, 0x85, 0xB7, 0xF1, 0x20, 0xB9,
+0xBD, 0x9D, 0x8E, 0x36, 0xA8, 0x5A, 0x5B, 0x07, 0xBA, 0xC2, 0x03, 0x3B, 0xD7, 0x43, 0xB5, 0x43,
+0x84, 0x2C, 0x54, 0x3B, 0x46, 0x4D, 0xF6, 0xC0, 0x0F, 0xAB, 0x83, 0xAA, 0x1D, 0xCD, 0xA0, 0x3E,
+0x40, 0x79, 0xC3, 0x13, 0xD4, 0x95, 0xEE, 0x28, 0xF1, 0xD0, 0x71, 0x13, 0x2A, 0xA8, 0xDC, 0x2F,
+0x22, 0x1F, 0x15, 0x26, 0x7B, 0x5F, 0x8B, 0xA6, 0x39, 0x20, 0xC3, 0x9A, 0xCD, 0x81, 0xFC, 0xD6,
+0x95, 0x9C, 0x77, 0xF9, 0x75, 0x79, 0xF5, 0x78, 0x2E, 0xE9, 0x5B, 0xC0, 0x50, 0x3B, 0x60, 0x5E,
+0xDE, 0x84, 0xA0, 0x89, 0x8D, 0xBD, 0xC8, 0xD3, 0x47, 0x55, 0x78, 0x95, 0x0F, 0x99, 0xE3, 0x30,
+0xB9, 0x5F, 0xC5, 0x63, 0x82, 0x01, 0x11, 0xF8, 0xC1, 0xC0, 0x34, 0x3C, 0x54, 0xE9, 0x38, 0x97,
+0xF8, 0xA0, 0xC9, 0x55, 0xFD, 0xE7, 0x94, 0xA4, 0xC5, 0x68, 0x56, 0x9B, 0x52, 0x32, 0x8F, 0xA3,
+0x7A, 0xA9, 0x38, 0xE6, 0xF8, 0x49, 0x2F, 0x2A, 0xD8, 0xA7, 0xCF, 0x83, 0xCE, 0x79, 0xFE, 0x6F,
+0x63, 0x60, 0xFD, 0xA5, 0x06, 0x2D, 0x2A, 0x34, 0xC6, 0xB2, 0x0F, 0x91, 0xCF, 0x77, 0xEF, 0xD8,
+0xAC, 0x3B, 0x8F, 0x94, 0xA3, 0x20, 0x50, 0x10, 0x28, 0x08, 0x14, 0x04, 0x9A, 0x8E, 0xC0, 0x9A,
+0x20, 0x76, 0x5C, 0xA8, 0xC7, 0xA1, 0x56, 0xBC, 0x77, 0xE6, 0x52, 0xB8, 0x3C, 0x34, 0x1C, 0x66,
+0x40, 0x78, 0x5A, 0x63, 0xEE, 0x3A, 0x5F, 0x70, 0x55, 0x11, 0x4A, 0x26, 0xD9, 0x39, 0x35, 0x05,
+0xF2, 0xD4, 0x9C, 0xFC, 0x23, 0x0B, 0x96, 0xD0, 0x37, 0x2C, 0x9A, 0xF2, 0x9E, 0xA9, 0x7D, 0x73,
+0x78, 0x8F, 0x4F, 0xD5, 0x9F, 0x4B, 0xD7, 0x3D, 0x9E, 0x12, 0x9F, 0x3B, 0x2C, 0xA2, 0x62, 0xEE,
+0xA5, 0x7A, 0x21, 0x1B, 0x77, 0xB2, 0x5E, 0xF3, 0xE1, 0xB2, 0xDB, 0xB9, 0xC9, 0x91, 0x09, 0x8F,
+0x47, 0x40, 0x3A, 0xA9, 0xE0, 0x5D, 0x1A, 0x9F, 0x90, 0x87, 0x67, 0xFA, 0x1F, 0x96, 0x05, 0x7A,
+0x46, 0x92, 0x22, 0x93, 0xE4, 0x49, 0xE0, 0x05, 0x03, 0x30, 0xB8, 0x64, 0x46, 0x85, 0x89, 0x37,
+0xB7, 0x07, 0x5B, 0x31, 0x35, 0x11, 0x5A, 0x11, 0x4C, 0xD1, 0x3A, 0x3F, 0x13, 0x2E, 0xC0, 0xD7,
+0xEE, 0xB7, 0x7F, 0xF0, 0x76, 0x78, 0xEB, 0xA3, 0x8B, 0x50, 0x05, 0x99, 0xFD, 0xFF, 0xF6, 0x39,
+0x18, 0x2D, 0x7A, 0x1F, 0x54, 0xBB, 0xAF, 0xDE, 0xBF, 0x33, 0x6C, 0xED, 0xEF, 0x82, 0xDA, 0x05,
+0x07, 0xFB, 0x75, 0xFD, 0x78, 0x0C, 0x84, 0x5E, 0x10, 0x3C, 0x99, 0x84, 0xB2, 0x25, 0x96, 0x91,
+0x11, 0x3E, 0x17, 0xCC, 0xD1, 0x57, 0xC1, 0xD4, 0xD8, 0x1B, 0xCF, 0x73, 0x6C, 0xCC, 0x9F, 0x4C,
+0xCC, 0x7F, 0x3A, 0x10, 0x3A, 0x76, 0xF6, 0x9E, 0xBF, 0xCF, 0xD7, 0x1C, 0x13, 0x46, 0x86, 0x4A,
+0xFD, 0x1C, 0x44, 0x8C, 0x95, 0x90, 0x49, 0x1F, 0x6F, 0xDE, 0x43, 0xD8, 0x8A, 0x9E, 0x6F, 0x61,
+0x1D, 0x76, 0x9D, 0xC2, 0xAE, 0xEA, 0x94, 0x10, 0x25, 0x5C, 0x43, 0xFE, 0xD6, 0x01, 0x73, 0x63,
+0x27, 0x14, 0xBB, 0xBE, 0xCE, 0x76, 0x98, 0x99, 0xD7, 0x23, 0x0A, 0x14, 0xC1, 0x20, 0x4D, 0x38,
+0xF8, 0xA3, 0xE0, 0x03, 0xEC, 0x17, 0xCC, 0xF9, 0x33, 0x02, 0xE5, 0xF7, 0x3C, 0x82, 0x84, 0xC6,
+0x10, 0x21, 0x4B, 0x1C, 0x08, 0x83, 0xA8, 0xC6, 0x68, 0x87, 0x6E, 0x7E, 0x91, 0x29, 0x6D, 0x7C,
+0xDF, 0x95, 0x3A, 0x21, 0x60, 0x2C, 0x8F, 0xFE, 0x0A, 0x7E, 0xD9, 0xDC, 0xF7, 0x72, 0xA6, 0x6C,
+0x0B, 0x16, 0xA2, 0x6E, 0xAB, 0xFA, 0xC7, 0x87, 0xFC, 0xF8, 0x30, 0x9C, 0xE7, 0x88, 0x9D, 0x2B,
+0xA5, 0xB8, 0x63, 0x5B, 0x5B, 0x47, 0xD8, 0xB1, 0x69, 0x7D, 0xB8, 0x6B, 0xBB, 0x06, 0x4E, 0x34,
+0x23, 0x59, 0xF3, 0x6A, 0xC1, 0x4E, 0x68, 0x46, 0xA6, 0xE7, 0xC2, 0xE5, 0x89, 0xD9, 0x70, 0x0D,
+0x0F, 0xE4, 0x82, 0xBE, 0xA1, 0x83, 0x3E, 0x8F, 0x13, 0xB8, 0x78, 0x12, 0x0F, 0xB3, 0x56, 0xDF,
+0x50, 0x3D, 0xE5, 0xA2, 0x82, 0x40, 0x41, 0xA0, 0x20, 0xD0, 0x28, 0x02, 0x6B, 0x82, 0xD8, 0x71,
+0x01, 0x19, 0x82, 0x8A, 0xF1, 0x37, 0xEF, 0x9D, 0x84, 0xA2, 0x81, 0xFC, 0x5E, 0x73, 0x53, 0xD8,
+0x1F, 0x76, 0x44, 0x17, 0xA4, 0xC8, 0xC4, 0x8C, 0xE0, 0x71, 0x81, 0xE3, 0x06, 0x08, 0x46, 0xD2,
+0x92, 0x33, 0xBE, 0xBE, 0x2F, 0xA4, 0x4D, 0x82, 0x17, 0x34, 0x51, 0xAB, 0x32, 0x24, 0x5B, 0xFC,
+0xA5, 0x44, 0x4E, 0x14, 0xF5, 0x6D, 0x4F, 0xB6, 0xAB, 0x86, 0xD8, 0x5A, 0xFD, 0xCE, 0xAE, 0x36,
+0xF3, 0x9E, 0x64, 0xA6, 0x40, 0xE5, 0xDC, 0xA2, 0x6C, 0x0A, 0x5F, 0xF6, 0x4C, 0xA8, 0x3C, 0x82,
+0x07, 0x53, 0xA6, 0x5C, 0xC7, 0xE3, 0xF2, 0x04, 0x09, 0xDF, 0xA4, 0x10, 0xBE, 0x11, 0xBC, 0x9E,
+0x84, 0xEA, 0xC8, 0x3C, 0x79, 0x9E, 0x23, 0x4F, 0x76, 0x72, 0x80, 0x7D, 0xAD, 0x55, 0x3A, 0x81,
+0xC5, 0x19, 0xBE, 0x76, 0xAD, 0x30, 0xC9, 0xCE, 0x80, 0x18, 0xBE, 0x73, 0xEA, 0x62, 0xF8, 0x37,
+0xDF, 0x7F, 0x2B, 0x9C, 0x46, 0x1A, 0x14, 0x92, 0xC2, 0xDB, 0xE5, 0x20, 0x9E, 0xEB, 0x90, 0xFE,
+0xE4, 0xF1, 0xBD, 0x1B, 0xC3, 0xA7, 0xF7, 0x6F, 0x86, 0x5F, 0x1A, 0xB7, 0x9C, 0xEA, 0x08, 0x5B,
+0x10, 0x39, 0xB9, 0x69, 0xF3, 0x46, 0xF8, 0xDB, 0xB5, 0x2B, 0xCC, 0xA6, 0x9E, 0x46, 0xC3, 0xAB,
+0x05, 0x45, 0x24, 0x33, 0xB9, 0x8F, 0x09, 0x49, 0x06, 0x09, 0x89, 0x92, 0x2E, 0x37, 0x1D, 0xC6,
+0x61, 0xF2, 0x31, 0xCB, 0xAE, 0x57, 0x05, 0x2B, 0x91, 0x62, 0x37, 0xED, 0x3A, 0x69, 0x54, 0x52,
+0x4F, 0xA2, 0xC3, 0x21, 0x76, 0xF3, 0xB8, 0x92, 0x19, 0x69, 0x97, 0x5D, 0xCF, 0xB1, 0xEE, 0x46,
+0x04, 0x2C, 0xD5, 0x3A, 0x12, 0x3B, 0xF6, 0x89, 0x49, 0x99, 0x9B, 0x71, 0xD0, 0xB4, 0xFF, 0xE6,
+0xB9, 0xEB, 0xE2, 0xAF, 0xC9, 0xC8, 0xEC, 0x21, 0xCC, 0x75, 0x4F, 0xB1, 0xA3, 0x6D, 0xB6, 0x07,
+0xE7, 0x85, 0xB5, 0x59, 0xA7, 0x2C, 0x5D, 0x05, 0xBC, 0x2F, 0x32, 0x61, 0x35, 0x10, 0xC5, 0x02,
+0x46, 0x88, 0x0B, 0xDF, 0xF7, 0x54, 0x2E, 0x9E, 0xDA, 0x44, 0x92, 0x74, 0xF3, 0xBA, 0x88, 0xB3,
+0x7E, 0x0E, 0xA2, 0x09, 0x5C, 0x08, 0x37, 0xDE, 0x06, 0xDB, 0xE5, 0xB9, 0x1E, 0x6C, 0x23, 0xF6,
+0xA9, 0x03, 0xBB, 0xC2, 0xE6, 0x7E, 0x6C, 0x21, 0xD7, 0x0C, 0x40, 0x56, 0xF1, 0x1E, 0x24, 0x62,
+0x6F, 0x5D, 0x99, 0x0A, 0x7F, 0x76, 0x62, 0x34, 0x7C, 0xEF, 0xF4, 0x38, 0x3E, 0x8B, 0x2B, 0xFF,
+0x3C, 0x91, 0xC8, 0x0D, 0x4F, 0xCE, 0x85, 0x93, 0xC3, 0xD3, 0xE1, 0xF4, 0x28, 0x03, 0x58, 0x6E,
+0x90, 0x1D, 0xAE, 0x62, 0x3F, 0x4B, 0xD5, 0x05, 0x81, 0x82, 0xC0, 0xDA, 0x43, 0x60, 0x4D, 0x10,
+0x3B, 0x7E, 0x5D, 0x8E, 0x82, 0x08, 0x1D, 0xBD, 0x00, 0xFF, 0x3A, 0x90, 0xA4, 0x16, 0x04, 0x17,
+0xB4, 0x32, 0xC0, 0xA0, 0xD6, 0xE4, 0x56, 0x67, 0xFC, 0x6C, 0x6D, 0xD2, 0x35, 0x3D, 0xFF, 0xDE,
+0x75, 0x73, 0x95, 0xAD, 0xF5, 0xBA, 0xF0, 0xDB, 0xBA, 0x1F, 0xEB, 0x51, 0x65, 0x2F, 0x51, 0x42,
+0x7B, 0x23, 0xD6, 0xA3, 0x14, 0xA5, 0xC6, 0xB6, 0x95, 0x5D, 0x93, 0x6F, 0x5F, 0x46, 0xA2, 0x07,
+0xB3, 0x2D, 0x52, 0x52, 0xC4, 0xA0, 0x0B, 0xDB, 0xE2, 0x49, 0x92, 0x21, 0xE3, 0xB9, 0x3C, 0x2C,
+0x08, 0x83, 0xA9, 0x5D, 0x18, 0x88, 0x31, 0x4B, 0x73, 0x33, 0x1E, 0xAD, 0x30, 0xC9, 0x32, 0x68,
+0xE4, 0x9D, 0x93, 0x17, 0xC2, 0x1B, 0xC7, 0xCF, 0x87, 0xCB, 0x48, 0xFB, 0x42, 0x47, 0xFB, 0xDB,
+0x25, 0xF3, 0x3F, 0x09, 0xE9, 0x7A, 0x98, 0x2C, 0xEF, 0x46, 0x04, 0xE9, 0x26, 0x44, 0x4C, 0x4A,
+0x44, 0x29, 0xF2, 0x9C, 0xF5, 0x41, 0xB1, 0xEB, 0xE9, 0xE9, 0xB6, 0xC8, 0x55, 0x61, 0x77, 0x19,
+0xBA, 0xAA, 0xE0, 0x2D, 0x90, 0x1F, 0x85, 0xB4, 0x18, 0x61, 0x36, 0xBE, 0x12, 0x0B, 0x65, 0x63,
+0x18, 0x03, 0x05, 0x94, 0x35, 0xD6, 0x19, 0x89, 0xC5, 0x3E, 0xD0, 0xD9, 0x98, 0xF9, 0x53, 0x23,
+0x90, 0x54, 0xEC, 0xBA, 0x40, 0x44, 0xDB, 0x11, 0x92, 0xDA, 0x0F, 0x42, 0xB7, 0x0D, 0x66, 0xE6,
+0x8E, 0x26, 0x98, 0x61, 0x39, 0x1D, 0xC7, 0xB0, 0x43, 0xC4, 0x85, 0xE1, 0x09, 0x89, 0xC2, 0x9E,
+0xE6, 0x4E, 0x11, 0xB2, 0x9D, 0x5C, 0xF2, 0x3F, 0x74, 0x0C, 0xDC, 0xD4, 0x1A, 0xE7, 0xA6, 0xF4,
+0xC1, 0x70, 0xCC, 0xF8, 0xAB, 0xFD, 0xBC, 0x31, 0xFF, 0x44, 0xE7, 0xB4, 0xCB, 0xCF, 0x69, 0x05,
+0x52, 0x2B, 0x12, 0x3F, 0x3D, 0xFE, 0xC8, 0x80, 0x56, 0x48, 0x5C, 0x1E, 0xDC, 0x05, 0x33, 0x6C,
+0x93, 0x14, 0xCC, 0xA5, 0xBE, 0x8E, 0x67, 0xD0, 0xBC, 0x73, 0x63, 0xB3, 0xE1, 0x95, 0x4B, 0x13,
+0xE1, 0xC5, 0x0B, 0xD5, 0xC7, 0xEB, 0x97, 0xB9, 0xFF, 0xF3, 0xD2, 0x24, 0x8B, 0xB9, 0x2A, 0x3F,
+0x02, 0x21, 0x7B, 0xF9, 0x22, 0x82, 0x93, 0xAE, 0x22, 0xBD, 0xCC, 0x0A, 0x48, 0x19, 0x8B, 0x5E,
+0x1C, 0x9F, 0x0D, 0x6F, 0x5C, 0x9E, 0x08, 0xCF, 0x5F, 0x18, 0x0F, 0xCF, 0x9D, 0x1B, 0xC7, 0xF3,
+0x49, 0xFC, 0x80, 0xF3, 0x6F, 0x91, 0xB5, 0xB7, 0x90, 0x94, 0x1E, 0x15, 0x04, 0x3E, 0x0E, 0x02,
+0xB3, 0xDC, 0x26, 0xF1, 0xE2, 0xB5, 0xF0, 0xFC, 0xF3, 0x6F, 0xC9, 0x83, 0xCF, 0x79, 0xEE, 0x93,
+0x7C, 0x8C, 0x21, 0x1D, 0xD9, 0x8B, 0x2F, 0xBE, 0x13, 0x7E, 0xF8, 0xDC, 0x1B, 0xE1, 0xBD, 0x0F,
+0x4E, 0x86, 0x51, 0xBC, 0x6E, 0xD6, 0xF1, 0x89, 0x27, 0x76, 0xA2, 0xD8, 0xE0, 0x4B, 0x78, 0x7C,
+0x62, 0x32, 0x5C, 0xBA, 0x36, 0x88, 0xC5, 0x0E, 0x66, 0x58, 0xFA, 0xD7, 0x89, 0xD2, 0xE0, 0x4A,
+0x9B, 0x2E, 0x42, 0xE2, 0xFF, 0x6E, 0x4E, 0xF0, 0xAA, 0xC0, 0xE8, 0xA2, 0xC8, 0x7F, 0xA3, 0x2F,
+0x92, 0x91, 0x00, 0x4F, 0x8E, 0xE2, 0x65, 0xD4, 0xF9, 0x5E, 0x79, 0x87, 0xD7, 0xA3, 0x7F, 0xF5,
+0xBC, 0x90, 0x3B, 0xB1, 0x4C, 0x69, 0x01, 0xF9, 0x23, 0xA7, 0x54, 0x1D, 0xF1, 0x2D, 0xB1, 0x94,
+0x3C, 0xDA, 0x3D, 0xA9, 0xB0, 0x88, 0xD9, 0xD6, 0x1E, 0x54, 0x48, 0xCC, 0x8C, 0x4B, 0x53, 0x2C,
+0xFD, 0xA5, 0xE8, 0x08, 0x4F, 0x33, 0xAD, 0x07, 0x60, 0x5C, 0x9B, 0xC2, 0x26, 0xED, 0x20, 0x70,
+0xF4, 0xAD, 0x22, 0xC9, 0xA3, 0x0F, 0x9F, 0x90, 0x3B, 0x10, 0x3B, 0x26, 0x9A, 0x1D, 0x85, 0xDA,
+0xF7, 0xAD, 0xD7, 0x8E, 0x84, 0xC3, 0x67, 0xAF, 0xC8, 0xF3, 0xA8, 0xE8, 0x34, 0x6B, 0x46, 0x2D,
+0x71, 0x9F, 0x0E, 0x98, 0x64, 0x99, 0xDB, 0x6E, 0x3F, 0x1E, 0x7C, 0xDE, 0x8A, 0xF6, 0x76, 0x77,
+0xB6, 0x85, 0x0D, 0x30, 0xCB, 0x92, 0x1B, 0x29, 0x89, 0x53, 0x33, 0xB6, 0xA8, 0x70, 0xBE, 0x6D,
+0x98, 0x29, 0x4B, 0x51, 0x3D, 0x53, 0x6F, 0xFE, 0x38, 0xC6, 0x5A, 0xDE, 0xCD, 0x82, 0xCA, 0xF4,
+0x5C, 0x61, 0x13, 0xE5, 0x2A, 0x2A, 0x59, 0x24, 0x22, 0xAE, 0xF2, 0xA9, 0x2A, 0xEB, 0x66, 0xEE,
+0xB8, 0x33, 0x89, 0x2B, 0x5B, 0xCE, 0x31, 0xED, 0x5E, 0x2A, 0xF0, 0x22, 0x1A, 0x16, 0x0D, 0x65,
+0x8E, 0x3E, 0xF1, 0xAF, 0xEB, 0xEF, 0x40, 0x90, 0x00, 0x76, 0xD2, 0x68, 0x02, 0xB1, 0xE3, 0x7C,
+0x18, 0x9A, 0x80, 0xB2, 0x8B, 0xC4, 0xC4, 0xD3, 0x60, 0x0E, 0xF4, 0xAB, 0xE4, 0xD6, 0x72, 0x29,
+0xA8, 0xC1, 0xE6, 0x25, 0xE7, 0xB5, 0xCC, 0x37, 0x9D, 0x73, 0x4E, 0xFC, 0x64, 0xDE, 0x9B, 0x09,
+0x5B, 0x27, 0xB0, 0x7F, 0x26, 0xCC, 0x4C, 0x4B, 0xF4, 0xE5, 0x23, 0x63, 0x73, 0x55, 0x48, 0x5B,
+0xC2, 0x2A, 0xF9, 0xA7, 0x26, 0xD5, 0x4E, 0x86, 0x1A, 0xA4, 0xAE, 0x15, 0xA9, 0x5F, 0xA8, 0x20,
+0xD3, 0xAF, 0xEE, 0xC1, 0xDD, 0x9B, 0x9B, 0x66, 0x9A, 0x5E, 0x6A, 0x4A, 0xF3, 0xB3, 0xF3, 0x1A,
+0x48, 0xDD, 0xFF, 0xF0, 0xF6, 0xF5, 0xF0, 0xFF, 0x79, 0xE3, 0x5A, 0xF8, 0x67, 0x6F, 0xEA, 0x83,
+0xCF, 0xFF, 0xCD, 0x7B, 0x83, 0x50, 0xC4, 0x97, 0xCE, 0xFB, 0x48, 0xF2, 0x7C, 0x1E, 0x2A, 0xDB,
+0xFB, 0xD7, 0x26, 0xC3, 0xD1, 0xA1, 0x29, 0xF9, 0x9C, 0x35, 0x7A, 0xF0, 0xDE, 0x6F, 0x5F, 0x9D,
+0x08, 0xFF, 0xF6, 0x83, 0xA1, 0xF0, 0x2F, 0xDF, 0x1D, 0x0C, 0xBF, 0xF5, 0xC1, 0x70, 0xF8, 0xCE,
+0xA9, 0x31, 0x7C, 0x86, 0xF9, 0x43, 0xAB, 0xD1, 0x5A, 0x4A, 0xB9, 0x82, 0xC0, 0x9D, 0x83, 0xC0,
+0x14, 0x04, 0x99, 0x37, 0xDF, 0x3E, 0x16, 0xFE, 0xDF, 0xFF, 0xED, 0xBF, 0x93, 0x07, 0x9F, 0xF3,
+0xDC, 0x27, 0xF9, 0xB8, 0x7C, 0xF9, 0x7A, 0xF8, 0x67, 0xFF, 0xEC, 0x77, 0xC3, 0xFF, 0xF3, 0xBF,
+0xFE, 0xAD, 0xF0, 0x47, 0x7F, 0xF6, 0x5C, 0xB8, 0x88, 0x8D, 0x13, 0x9A, 0x75, 0x7C, 0xE2, 0x89,
+0x1D, 0x81, 0x62, 0xB0, 0xC4, 0xD9, 0x2B, 0x83, 0x61, 0x70, 0x04, 0x91, 0xA2, 0x50, 0xB5, 0xDA,
+0x18, 0x54, 0xE0, 0xE9, 0xF8, 0xA3, 0x4E, 0xA3, 0x8A, 0x85, 0x10, 0xB0, 0xA8, 0x38, 0x38, 0xCC,
+0xE9, 0xDB, 0x56, 0x97, 0x2D, 0x7F, 0xED, 0x8A, 0x9B, 0x96, 0xB3, 0xB5, 0x30, 0x8D, 0x8D, 0x15,
+0xCB, 0x95, 0x3E, 0x5F, 0x4C, 0xFD, 0x5E, 0x49, 0x35, 0xB1, 0xC2, 0x46, 0xEC, 0xAC, 0xC6, 0x05,
+0xE3, 0xEC, 0xEA, 0x9F, 0x64, 0xF2, 0xC7, 0x83, 0xD1, 0x8D, 0x12, 0x84, 0x21, 0x6A, 0x1D, 0xD3,
+0xA6, 0x20, 0x95, 0x0A, 0x88, 0x9C, 0xFE, 0x75, 0x15, 0x0F, 0x66, 0x1E, 0xE6, 0xCD, 0x83, 0x4A,
+0x39, 0x34, 0x39, 0x11, 0x5E, 0xFB, 0xE8, 0x5C, 0xF8, 0xC1, 0xFB, 0x1F, 0x85, 0x57, 0x8E, 0x9D,
+0x43, 0xB2, 0x66, 0xEC, 0x29, 0x7A, 0x9B, 0x38, 0xF7, 0x90, 0x14, 0x6D, 0xEE, 0xEB, 0x0A, 0x07,
+0xB6, 0xF4, 0xC3, 0x8C, 0xA9, 0x51, 0xA5, 0x4C, 0xF0, 0xDB, 0xD7, 0xD7, 0x1D, 0xBA, 0x10, 0x45,
+0x99, 0x02, 0x52, 0x12, 0xFE, 0x09, 0x74, 0x63, 0xD5, 0xF9, 0xCA, 0x48, 0xD2, 0xA6, 0x23, 0x93,
+0x8D, 0x8D, 0x8E, 0xB3, 0x12, 0x70, 0x7B, 0x12, 0x87, 0x39, 0xAF, 0x57, 0xCB, 0xC4, 0xE1, 0xC8,
+0xDE, 0xCA, 0xA7, 0x4C, 0x3E, 0x40, 0xBC, 0x17, 0x7D, 0xEB, 0x3A, 0xE0, 0x23, 0xC8, 0x28, 0xD8,
+0x1D, 0xEB, 0xBA, 0x25, 0x2A, 0xB6, 0x19, 0x66, 0x47, 0x2A, 0xB4, 0x17, 0x86, 0xD4, 0xA7, 0x8E,
+0x51, 0xA8, 0x63, 0x20, 0x78, 0xFC, 0x41, 0x53, 0x3B, 0x8F, 0x16, 0xA8, 0x74, 0x56, 0xA2, 0xD6,
+0x41, 0x40, 0x89, 0xAC, 0xBE, 0x99, 0x14, 0x3E, 0x23, 0x7C, 0x39, 0xF9, 0x88, 0xCF, 0xF5, 0x89,
+0x7E, 0x7E, 0xF4, 0x39, 0xC9, 0xF4, 0x1C, 0x94, 0xCB, 0x59, 0x90, 0xBA, 0x36, 0xE0, 0xB2, 0xB9,
+0xBF, 0x07, 0xC9, 0x9A, 0x41, 0xDA, 0x9B, 0x94, 0xFA, 0x65, 0xC1, 0x87, 0x27, 0x3B, 0xC1, 0x1F,
+0xFB, 0xE7, 0xC7, 0x66, 0xC2, 0xCB, 0x50, 0xEB, 0x5E, 0x80, 0x6A, 0xF6, 0xD2, 0xC5, 0x09, 0x79,
+0xBC, 0x0C, 0xB2, 0xF7, 0xE6, 0x15, 0x26, 0x78, 0x5E, 0x9A, 0x61, 0x11, 0xDA, 0x51, 0x28, 0xA2,
+0xF4, 0xAF, 0x1B, 0x14, 0x3F, 0xC6, 0xA5, 0xEE, 0x96, 0xDE, 0xE3, 0x2E, 0x1F, 0xC7, 0x87, 0x66,
+0xC2, 0x4B, 0x17, 0x26, 0xA1, 0xF6, 0xE1, 0xB3, 0x88, 0xC7, 0x9B, 0x50, 0xEE, 0x8E, 0x0E, 0xD2,
+0x87, 0xB6, 0xC1, 0x4A, 0x1A, 0xBB, 0x55, 0x29, 0x55, 0x10, 0x58, 0x33, 0x08, 0x50, 0x9D, 0xBB,
+0x78, 0x09, 0x8A, 0xDD, 0x0B, 0xEF, 0xC8, 0x83, 0xCF, 0xD7, 0x84, 0x62, 0xF7, 0xD2, 0xBB, 0xE1,
+0x87, 0xCF, 0xBF, 0x1D, 0xDE, 0x3F, 0x72, 0xBA, 0x28, 0x76, 0x2B, 0x9D, 0xAD, 0x63, 0x34, 0x41,
+0x9E, 0xBE, 0x88, 0x45, 0x8F, 0x89, 0x89, 0xE7, 0x42, 0x07, 0x93, 0xF7, 0x8A, 0x0E, 0xA7, 0x4B,
+0x51, 0x34, 0x2E, 0x89, 0x5B, 0x11, 0x15, 0x34, 0x57, 0x35, 0x9C, 0xE9, 0xB1, 0x98, 0x95, 0x76,
+0xC5, 0x46, 0xE5, 0xB8, 0xE8, 0x4F, 0x24, 0x35, 0x55, 0x6C, 0xB5, 0xEA, 0xA3, 0xE4, 0xDB, 0x2A,
+0xA9, 0x77, 0x5D, 0xA6, 0xFD, 0x99, 0x8A, 0xA4, 0xCA, 0x1D, 0xFF, 0x31, 0x05, 0xC5, 0xCE, 0x6B,
+0xA2, 0x57, 0x91, 0x81, 0xA2, 0x9F, 0x98, 0xF8, 0xEA, 0xD9, 0x79, 0xDF, 0xC6, 0xCC, 0xFF, 0x4A,
+0x2A, 0x3E, 0x6B, 0x1B, 0x55, 0x38, 0x2E, 0xF4, 0x24, 0x76, 0xA3, 0xF4, 0xCF, 0x03, 0xA9, 0x1B,
+0x92, 0xC4, 0xC8, 0x78, 0x40, 0xD1, 0x3B, 0x3B, 0x3C, 0x1A, 0x7E, 0xEF, 0x85, 0x77, 0xC3, 0xFF,
+0xF2, 0xDC, 0x5B, 0xE1, 0x08, 0xD2, 0xBF, 0x90, 0x08, 0xDC, 0x2E, 0x07, 0xD5, 0xAE, 0x43, 0x5B,
+0xD7, 0x85, 0x0D, 0xF0, 0xB9, 0x63, 0x82, 0x5D, 0xAA, 0x5D, 0x34, 0xC9, 0xF6, 0xF7, 0xF5, 0xA4,
+0x08, 0x59, 0x57, 0x9B, 0x4C, 0x7D, 0xD2, 0x14, 0x26, 0x7C, 0x28, 0x8E, 0x06, 0x5A, 0xC4, 0x54,
+0xD4, 0x3D, 0x53, 0xA3, 0x84, 0x8A, 0x4B, 0x11, 0x57, 0x63, 0x55, 0x75, 0x8A, 0x6C, 0xCF, 0x30,
+0xD4, 0x39, 0x60, 0x8A, 0x94, 0xCD, 0x07, 0x57, 0x5B, 0x55, 0x9D, 0x75, 0x7F, 0x35, 0x53, 0xB4,
+0x44, 0x4D, 0x45, 0xAA, 0x16, 0x10, 0x50, 0x9A, 0x61, 0xBB, 0x40, 0x48, 0xEF, 0xDA, 0xD4, 0xDF,
+0xB4, 0xFC, 0x75, 0x4C, 0x93, 0x73, 0xFC, 0xEA, 0x88, 0xF8, 0x65, 0x72, 0xFC, 0x45, 0xB1, 0xB3,
+0x20, 0x9F, 0xEA, 0x76, 0x5F, 0xD6, 0xDE, 0x88, 0x47, 0x6A, 0xBF, 0xAA, 0xD6, 0x69, 0xCE, 0x3A,
+0xF9, 0x4D, 0x69, 0x4F, 0x14, 0xE3, 0x94, 0x78, 0xD8, 0x82, 0x80, 0x78, 0xCE, 0xFE, 0xAB, 0x6C,
+0xAB, 0x06, 0x9C, 0x66, 0xA0, 0xD6, 0xF1, 0xD3, 0xD6, 0x09, 0x9F, 0xC9, 0xBD, 0x5B, 0xD6, 0x21,
+0x68, 0x02, 0xFE, 0x92, 0x82, 0x5D, 0x33, 0xE8, 0xEE, 0xD2, 0xB3, 0x9A, 0x43, 0xCD, 0x50, 0x26,
+0xF9, 0xFC, 0x8B, 0x6F, 0x2A, 0xA2, 0x99, 0xF1, 0x68, 0x28, 0x82, 0x19, 0x97, 0xD0, 0x7D, 0x40,
+0x76, 0x4C, 0x11, 0x7F, 0xC4, 0xC6, 0x3E, 0x41, 0xA3, 0x30, 0xB7, 0xFE, 0xF0, 0xEC, 0x58, 0xF8,
+0xE1, 0x99, 0xF1, 0x30, 0x34, 0x45, 0x1C, 0x18, 0xD4, 0xA2, 0x8F, 0x06, 0xAB, 0x68, 0xEC, 0x46,
+0xA5, 0x54, 0x41, 0x60, 0x0D, 0x21, 0x20, 0x9F, 0x13, 0xD9, 0xA2, 0x11, 0xD1, 0xF4, 0x78, 0xB4,
+0xF0, 0xF9, 0x27, 0xFE, 0x03, 0xC3, 0xEF, 0x0D, 0x58, 0x74, 0xF0, 0xDD, 0xC8, 0x1F, 0xBE, 0xCD,
+0xFC, 0x4E, 0x5C, 0x13, 0x8A, 0xDD, 0x38, 0xA2, 0x04, 0xDF, 0x3B, 0x75, 0x41, 0x54, 0xAB, 0x76,
+0x9A, 0x24, 0x63, 0x9A, 0x93, 0x4C, 0x65, 0xF0, 0x0F, 0x81, 0x11, 0xAD, 0xEA, 0x9C, 0xC9, 0x7E,
+0xBD, 0x47, 0x45, 0x28, 0x57, 0x34, 0x8C, 0x9C, 0x45, 0x25, 0xCF, 0xBF, 0xA4, 0x55, 0xE1, 0xC8,
+0x15, 0x3E, 0xA5, 0x92, 0x56, 0xBE, 0x46, 0xED, 0x88, 0xB2, 0x92, 0xCB, 0x44, 0xF6, 0xBE, 0xEE,
+0x94, 0xE0, 0x02, 0x8A, 0xDE, 0x37, 0x2A, 0x2F, 0xE4, 0x18, 0xD6, 0x76, 0xAF, 0x97, 0xA5, 0x69,
+0x9A, 0xD3, 0xAD, 0xA3, 0x54, 0xCD, 0x63, 0x4E, 0x33, 0x3E, 0xA8, 0xE4, 0x0D, 0xC2, 0x2C, 0xFD,
+0xCE, 0xD9, 0xCB, 0xE1, 0xF9, 0xC3, 0xA7, 0xC2, 0x0B, 0x1F, 0x9E, 0x0A, 0x17, 0xAE, 0x0F, 0x4B,
+0xB0, 0xC6, 0xED, 0x70, 0x70, 0xA1, 0xDC, 0x0E, 0xA5, 0x6B, 0x1F, 0xCC, 0xB1, 0x8C, 0x96, 0x25,
+0x49, 0xE1, 0x07, 0x9A, 0xBE, 0x76, 0x6D, 0x64, 0x7A, 0x2E, 0xA3, 0x09, 0x20, 0xAE, 0x0C, 0xE9,
+0x53, 0x15, 0x99, 0x6C, 0x5C, 0x7C, 0x9C, 0x88, 0x55, 0x86, 0x73, 0x55, 0x87, 0x31, 0x4A, 0x1F,
+0xC1, 0x4D, 0xEF, 0xD6, 0x2A, 0x58, 0x82, 0x8D, 0x8D, 0x8B, 0x16, 0xD7, 0x08, 0x50, 0xE2, 0xCC,
+0x36, 0xD2, 0x34, 0x47, 0xE3, 0x5D, 0x07, 0x88, 0x0B, 0xBF, 0x71, 0x68, 0x8A, 0xDD, 0x81, 0xAD,
+0xD2, 0x68, 0x52, 0x6E, 0xC6, 0x41, 0xFF, 0xCB, 0x93, 0xD7, 0xE0, 0x37, 0xC9, 0x74, 0x26, 0x50,
+0x7E, 0xE8, 0x4B, 0x2A, 0xE4, 0xD3, 0xDB, 0xED, 0x78, 0xA5, 0x89, 0x94, 0x9A, 0x95, 0xF1, 0xDA,
+0xA8, 0x66, 0x46, 0xB9, 0xD2, 0xE7, 0x6A, 0x9C, 0x8C, 0x35, 0x2A, 0x66, 0xFA, 0x1C, 0x68, 0x85,
+0x69, 0xAE, 0xCE, 0x63, 0xBC, 0xB8, 0xAB, 0x0B, 0xC5, 0x2F, 0x92, 0xF3, 0x43, 0xDB, 0x36, 0x62,
+0x07, 0x8E, 0xE6, 0x04, 0x92, 0x2C, 0x87, 0x39, 0x7F, 0x08, 0xAD, 0xEB, 0x6C, 0x0D, 0xFB, 0xD7,
+0xB5, 0xE3, 0xD1, 0x11, 0xB6, 0xF5, 0xB4, 0x85, 0x75, 0xF8, 0x51, 0x41, 0x52, 0xDE, 0xD0, 0x88,
+0xA1, 0x4F, 0xF4, 0x95, 0xF3, 0x08, 0xF5, 0xE5, 0xEE, 0xC7, 0xF7, 0x59, 0xFE, 0x92, 0xF8, 0xD6,
+0x4D, 0x89, 0x7F, 0x1E, 0x15, 0xE9, 0x07, 0x36, 0x74, 0x85, 0xCF, 0xEE, 0xE8, 0x09, 0x8F, 0x6D,
+0xE9, 0x0A, 0xFD, 0x1D, 0x0D, 0xDD, 0xB9, 0x91, 0x5B, 0x95, 0x32, 0x05, 0x81, 0xB5, 0x87, 0x80,
+0xFC, 0x80, 0x22, 0xA1, 0x6B, 0x2E, 0x09, 0x5A, 0x55, 0x20, 0xD1, 0x17, 0xA4, 0x0B, 0x10, 0xA2,
+0xDA, 0xCC, 0xA3, 0xB9, 0x77, 0xBB, 0xC9, 0x3D, 0x73, 0x65, 0x80, 0xA9, 0x4E, 0x3E, 0x00, 0xB1,
+0x9B, 0x81, 0x5A, 0x45, 0x52, 0xC7, 0x40, 0x02, 0xF1, 0xB9, 0xC2, 0xE1, 0x3F, 0xB6, 0x95, 0x07,
+0xE8, 0x0A, 0x27, 0xEA, 0x1A, 0xD7, 0x2B, 0x2A, 0x64, 0x5A, 0x2A, 0x31, 0x87, 0xE8, 0x4B, 0xA7,
+0x8A, 0x9C, 0x94, 0xB7, 0xA7, 0x52, 0xD6, 0x58, 0x84, 0x5C, 0x6F, 0xB5, 0xE9, 0xF5, 0x6A, 0x9A,
+0x12, 0xC5, 0x4D, 0x94, 0x11, 0xBD, 0xC8, 0xFD, 0xC6, 0xB4, 0x74, 0x4E, 0xCD, 0x5C, 0x9D, 0x53,
+0x75, 0xC3, 0x44, 0x26, 0x55, 0x17, 0x54, 0x4A, 0x49, 0x8A, 0x9E, 0xD4, 0xC8, 0x73, 0x7A, 0x3D,
+0xEB, 0xE6, 0x16, 0x52, 0x92, 0xD6, 0xC2, 0x08, 0x0E, 0x6B, 0xA0, 0xCF, 0x1A, 0xA3, 0x18, 0x67,
+0xB1, 0xD5, 0x18, 0xAB, 0x39, 0x3F, 0x38, 0x1C, 0xBE, 0xF1, 0xD2, 0x7B, 0x12, 0x50, 0xC1, 0x40,
+0x8A, 0xDB, 0xE5, 0x60, 0x7A, 0x90, 0x87, 0x76, 0x6E, 0x08, 0xBD, 0x20, 0x01, 0x54, 0xA2, 0x68,
+0xF6, 0xEA, 0x45, 0xD2, 0x62, 0xFE, 0xAA, 0x51, 0x47, 0x2F, 0x7F, 0x98, 0x0A, 0xEA, 0x3E, 0x72,
+0x32, 0x4C, 0xA6, 0x28, 0x71, 0xEC, 0xAC, 0xAC, 0x6F, 0x19, 0x26, 0x97, 0xD9, 0x98, 0x69, 0xB9,
+0x84, 0x95, 0x47, 0x2C, 0x0B, 0x6E, 0x22, 0xC0, 0x10, 0x3F, 0x53, 0xE5, 0x0C, 0x3B, 0x75, 0xC9,
+0xD4, 0x7A, 0x85, 0xD0, 0x91, 0x3C, 0x9B, 0x29, 0x7C, 0x82, 0x7F, 0x61, 0xDE, 0x6F, 0x45, 0x1B,
+0xF9, 0xB7, 0x05, 0xF9, 0xF8, 0x36, 0x20, 0x18, 0x84, 0xBB, 0x69, 0x34, 0xE3, 0x20, 0x99, 0x3B,
+0x3B, 0x34, 0x21, 0xC4, 0x8E, 0x41, 0x32, 0xB2, 0x47, 0xAC, 0xF5, 0x23, 0xE1, 0xA5, 0xB8, 0xC5,
+0xED, 0xBF, 0xB2, 0xB9, 0x14, 0x7D, 0x4B, 0x65, 0x86, 0xE9, 0xDC, 0xAA, 0xDD, 0x1E, 0xCC, 0x95,
+0xCF, 0x58, 0x87, 0x29, 0x9A, 0xAA, 0x7E, 0x9A, 0xEF, 0x9D, 0xE0, 0x6A, 0x3D, 0xE6, 0x9E, 0xBF,
+0x46, 0xEC, 0xFA, 0xBB, 0x3B, 0x11, 0x38, 0xB1, 0xE9, 0xB6, 0xF0, 0xAF, 0x63, 0xEB, 0xF8, 0x03,
+0x62, 0xFF, 0x40, 0x47, 0xF8, 0xF2, 0xAE, 0xDE, 0xF0, 0xE5, 0xDD, 0xBD, 0xE1, 0xC1, 0x8D, 0x5D,
+0x61, 0x47, 0x2F, 0x88, 0x9D, 0x0D, 0xD7, 0x72, 0xA3, 0xC6, 0x2E, 0x4A, 0xD4, 0x3A, 0x58, 0x2B,
+0xCD, 0xB6, 0x8D, 0x78, 0x33, 0xB0, 0xFC, 0x09, 0x10, 0xBA, 0xE3, 0x78, 0x70, 0x4E, 0x6E, 0xEE,
+0x6E, 0x0B, 0xBF, 0x7C, 0xB0, 0x3F, 0xFC, 0xA7, 0x8F, 0x6F, 0x0C, 0x7F, 0xFF, 0xBE, 0x01, 0xDC,
+0xBF, 0x5D, 0xE6, 0x5E, 0x39, 0x0A, 0x02, 0x05, 0x81, 0xC5, 0x10, 0xB0, 0xF5, 0x6F, 0xAD, 0x00,
+0x94, 0x5B, 0x02, 0x9B, 0xD8, 0xA7, 0x4F, 0x34, 0xB1, 0x23, 0x4E, 0x34, 0x33, 0x5E, 0x1E, 0x1C,
+0x41, 0x1E, 0xB7, 0x41, 0x6C, 0xB5, 0x35, 0x13, 0xDA, 0x91, 0xB8, 0xB7, 0x95, 0x0B, 0x6F, 0xD4,
+0xB9, 0x0C, 0xCD, 0x8C, 0xD8, 0xE5, 0xF8, 0x3A, 0xDD, 0x4A, 0xBA, 0x58, 0xE4, 0x73, 0x4A, 0xB0,
+0xBC, 0x1E, 0x5F, 0xCC, 0xFC, 0x62, 0xAE, 0xA1, 0xF6, 0x5C, 0x49, 0x19, 0x17, 0xCB, 0xAA, 0xB2,
+0x17, 0x95, 0xBC, 0x78, 0xEF, 0xEC, 0x62, 0xA9, 0x59, 0xD9, 0x61, 0xFC, 0xAE, 0x8F, 0x64, 0xD1,
+0xEE, 0x5B, 0xF9, 0x93, 0x94, 0x12, 0x57, 0xA8, 0x6A, 0xD7, 0x08, 0x12, 0x15, 0x06, 0x50, 0x90,
+0xDC, 0xB5, 0xA1, 0xD0, 0x18, 0x4C, 0xB3, 0xEF, 0x9C, 0xBE, 0x10, 0x5E, 0xF8, 0xE0, 0xA3, 0x70,
+0xE6, 0x32, 0x02, 0x4B, 0x6E, 0x13, 0x93, 0x2C, 0x55, 0xAE, 0x5D, 0xF0, 0xC5, 0xDA, 0xBE, 0xAE,
+0x37, 0x0C, 0x40, 0xE9, 0x21, 0x51, 0xE0, 0x16, 0x63, 0x5D, 0xDC, 0x86, 0xCA, 0xCC, 0xA0, 0x8E,
+0x7B, 0x66, 0x48, 0x4F, 0x03, 0xE9, 0x63, 0xB1, 0x00, 0x57, 0x16, 0x51, 0x32, 0x1D, 0xD5, 0xB6,
+0x9C, 0xA4, 0x09, 0x51, 0x53, 0xBF, 0x45, 0x62, 0xC1, 0x07, 0x4D, 0xDA, 0x74, 0x76, 0xD7, 0x87,
+0xFA, 0x2C, 0x8A, 0xEF, 0x62, 0x96, 0xF4, 0xD7, 0x5F, 0xCB, 0xAE, 0xAC, 0x68, 0x3B, 0x7F, 0x10,
+0xAC, 0x03, 0x91, 0x61, 0x54, 0xAC, 0xEE, 0x17, 0xBC, 0xBA, 0x07, 0xDB, 0x7C, 0x79, 0x14, 0x66,
+0x76, 0xA4, 0xF4, 0x99, 0x01, 0x79, 0xE0, 0x0F, 0x19, 0xF1, 0x9B, 0xCC, 0xA6, 0x67, 0x6A, 0x81,
+0xBB, 0x20, 0x28, 0x16, 0xD9, 0x4F, 0x97, 0xA8, 0x80, 0x7A, 0x59, 0xF5, 0x69, 0x74, 0xCC, 0xD2,
+0xDB, 0xFE, 0xD5, 0x2A, 0xD5, 0xC7, 0x79, 0xAF, 0x65, 0x5D, 0x9F, 0xE6, 0xE9, 0xD9, 0x36, 0x10,
+0x3B, 0x98, 0x62, 0x3B, 0xF0, 0x77, 0x03, 0xFC, 0x24, 0xF7, 0x6D, 0x1E, 0x68, 0x9A, 0x69, 0x7A,
+0x39, 0xC4, 0x49, 0xE0, 0x76, 0xF6, 0xB5, 0x87, 0xA7, 0xB6, 0x75, 0x87, 0xA7, 0xB6, 0x22, 0x69,
+0xF2, 0x86, 0x8E, 0xB0, 0x15, 0xC4, 0xAE, 0xD1, 0x1F, 0xCE, 0x24, 0x86, 0x7B, 0xFB, 0xDB, 0xC3,
+0x13, 0x50, 0xDA, 0x1E, 0xDC, 0xD4, 0x19, 0xBA, 0x1B, 0x20, 0xF0, 0x4C, 0x67, 0x72, 0x0C, 0xBE,
+0x74, 0x57, 0xE1, 0x97, 0xC7, 0x94, 0x3E, 0x8F, 0x6E, 0xEE, 0x0C, 0xCF, 0x6C, 0xEF, 0x09, 0x9F,
+0xDF, 0xD9, 0x13, 0x1E, 0x45, 0x3D, 0x7D, 0x1D, 0xAB, 0x3F, 0x57, 0x96, 0xC3, 0xA5, 0xBC, 0x5F,
+0x10, 0xB8, 0xBD, 0x11, 0x50, 0xF1, 0x62, 0xED, 0x1D, 0xB5, 0x04, 0x62, 0x75, 0x7B, 0xF8, 0x89,
+0x27, 0x76, 0x34, 0xBF, 0x7E, 0x74, 0x41, 0xF7, 0x87, 0x65, 0xC0, 0x84, 0x98, 0x61, 0x6D, 0x6A,
+0xE4, 0x4B, 0x5C, 0x54, 0xCC, 0x6C, 0xD5, 0x52, 0x41, 0x4D, 0xFD, 0x8D, 0xD4, 0xC6, 0x97, 0xA8,
+0xA0, 0x46, 0xB2, 0x1A, 0xE5, 0xB3, 0x2D, 0xBE, 0x54, 0xE2, 0xAB, 0xB2, 0xBA, 0x5C, 0xF5, 0x50,
+0xA5, 0x4E, 0xA7, 0xA4, 0xA8, 0x85, 0xA6, 0x72, 0xA4, 0x45, 0x54, 0xDF, 0x74, 0x3F, 0x31, 0xCD,
+0xBD, 0x96, 0x96, 0x50, 0xF5, 0xC3, 0x73, 0xFF, 0x27, 0x16, 0xB4, 0x3A, 0x72, 0x73, 0x64, 0x9C,
+0x0B, 0x5C, 0x5E, 0xA5, 0x32, 0x51, 0xF1, 0xA2, 0x6F, 0x18, 0xCE, 0xD1, 0xFC, 0xD3, 0x49, 0xDF,
+0x20, 0x60, 0xC1, 0xEC, 0x70, 0xF4, 0x3B, 0xFC, 0xEE, 0x6B, 0x1F, 0x86, 0xD7, 0xE1, 0xBC, 0x39,
+0x41, 0x8C, 0x6E, 0x83, 0x83, 0x5C, 0xA8, 0x07, 0xC1, 0x13, 0xF7, 0x20, 0xF5, 0xC9, 0x81, 0xCD,
+0xFD, 0xD2, 0x22, 0x1A, 0x8A, 0xFB, 0x7A, 0x7B, 0x25, 0xBA, 0xD2, 0xC9, 0xB6, 0x12, 0x66, 0x55,
+0x8A, 0x9C, 0x38, 0x0B, 0x0D, 0x31, 0x1C, 0x45, 0x9D, 0x73, 0xDF, 0xBB, 0x8C, 0xC0, 0x09, 0xA9,
+0xA3, 0xE9, 0x34, 0x06, 0x9E, 0x98, 0xB9, 0x1A, 0x84, 0x6D, 0x0C, 0x0A, 0xE1, 0xA8, 0x3C, 0xB0,
+0xF5, 0x96, 0x3D, 0x98, 0x43, 0xF0, 0x9A, 0x3C, 0xA6, 0x24, 0xFA, 0xF8, 0x3A, 0x1E, 0x8C, 0x3C,
+0x1E, 0xC4, 0xFB, 0x43, 0x28, 0xCB, 0x64, 0xC0, 0x24, 0x77, 0x94, 0xD4, 0x99, 0x93, 0x97, 0xE4,
+0x60, 0xD7, 0x86, 0x5E, 0x09, 0xA4, 0x68, 0xC6, 0x31, 0x49, 0xFF, 0xBA, 0xCB, 0x23, 0x30, 0xB5,
+0x73, 0xEB, 0x2E, 0xA4, 0xC4, 0x41, 0x6A, 0x1F, 0x8F, 0xF6, 0x75, 0x75, 0x4E, 0x39, 0x9E, 0x79,
+0x79, 0x66, 0xF3, 0xBA, 0x12, 0x35, 0x6B, 0x7E, 0x9E, 0x95, 0xED, 0xC1, 0x4C, 0xD9, 0x14, 0x1F,
+0x50, 0x51, 0x98, 0x75, 0x5E, 0xC5, 0xCF, 0x85, 0xA8, 0xDA, 0x99, 0x2F, 0x62, 0xE6, 0xEB, 0x38,
+0xDB, 0x0A, 0x7F, 0x18, 0x10, 0xBB, 0x75, 0x3D, 0x5D, 0x61, 0x0B, 0x02, 0x27, 0x36, 0xF5, 0x77,
+0x8B, 0xFF, 0x5A, 0x33, 0x7D, 0x49, 0x16, 0xC3, 0x9F, 0x9F, 0x03, 0x2A, 0x66, 0x0F, 0x6C, 0xEC,
+0x0C, 0xF7, 0xE2, 0xB1, 0x07, 0x24, 0x6D, 0x53, 0x37, 0xCC, 0xB0, 0xA2, 0x72, 0x2E, 0x7F, 0x90,
+0x84, 0xFD, 0xD4, 0x9E, 0x9E, 0xF0, 0x4F, 0x1E, 0x59, 0x1F, 0x7E, 0xF3, 0xDE, 0xF5, 0x61, 0x63,
+0xD7, 0xF2, 0x5F, 0x95, 0x4C, 0x89, 0xC2, 0x20, 0x09, 0x72, 0xEE, 0x8D, 0xB8, 0xF7, 0xCF, 0xED,
+0xEF, 0x0B, 0x77, 0xC1, 0x0C, 0xDC, 0xD9, 0x00, 0x29, 0x5C, 0xBE, 0x45, 0xA5, 0x44, 0x41, 0xE0,
+0x4E, 0x40, 0xA0, 0xB9, 0x04, 0x68, 0xD5, 0x11, 0xB5, 0x35, 0x5A, 0xAD, 0x2B, 0xCD, 0x3B, 0x96,
+0xFF, 0xB6, 0x6A, 0x5E, 0x5B, 0x6E, 0xE8, 0x4E, 0x24, 0x2B, 0x47, 0xCE, 0xC0, 0xD4, 0x88, 0x45,
+0xB9, 0x15, 0x26, 0xC8, 0xD6, 0x39, 0xDF, 0x46, 0xAC, 0x76, 0x82, 0x64, 0xAF, 0xA3, 0xE2, 0xA3,
+0x4F, 0x2A, 0xAA, 0x46, 0x46, 0x9E, 0xE4, 0xA9, 0xA9, 0x14, 0xFE, 0xBC, 0xD2, 0x48, 0x57, 0x8C,
+0x72, 0xC2, 0x27, 0x64, 0xC4, 0x2E, 0x94, 0xBA, 0xAB, 0x87, 0xE7, 0x95, 0x8B, 0x7F, 0x6B, 0x65,
+0x17, 0x97, 0x48, 0xAC, 0x0E, 0x35, 0x9B, 0x69, 0x1D, 0x2E, 0xD0, 0x24, 0x25, 0xD0, 0x7D, 0xC8,
+0x92, 0x74, 0xC3, 0xFB, 0xB5, 0x83, 0x1C, 0xD1, 0xE1, 0x9B, 0x3E, 0x6B, 0x24, 0x02, 0x1F, 0x9E,
+0xB9, 0x18, 0x5E, 0x78, 0xFF, 0x44, 0x38, 0x89, 0x48, 0x23, 0x26, 0x3B, 0xBE, 0x1D, 0x8E, 0x6E,
+0xF8, 0x3B, 0xED, 0xDF, 0xDC, 0x07, 0x5F, 0xBB, 0x5E, 0x01, 0x89, 0x9B, 0xD8, 0x43, 0xB6, 0x0B,
+0xA4, 0x9E, 0xCC, 0xE5, 0xE7, 0xF9, 0xFC, 0x34, 0x7F, 0x9F, 0x6E, 0x74, 0x2F, 0xE9, 0x5D, 0x32,
+0x65, 0x4D, 0xA2, 0x84, 0x45, 0x61, 0xB3, 0xF7, 0x25, 0x5A, 0xD8, 0xCB, 0xA5, 0xBC, 0x7F, 0x7E,
+0x6E, 0xF1, 0xBF, 0xF4, 0x4F, 0x4C, 0xE5, 0xF9, 0x5C, 0x7D, 0x17, 0xA1, 0xE8, 0xE1, 0xEF, 0x34,
+0x4C, 0xFB, 0x34, 0xCB, 0xB6, 0xA3, 0xCD, 0xFC, 0x4B, 0x42, 0xBE, 0x67, 0x3D, 0x89, 0x5D, 0x73,
+0x3E, 0x3E, 0x6C, 0xF7, 0xB1, 0x2B, 0xA3, 0xB2, 0x35, 0x1D, 0xD5, 0xBB, 0x09, 0xFC, 0x98, 0x51,
+0x0A, 0xE6, 0xF3, 0xD7, 0x8D, 0xFC, 0x36, 0xDF, 0xA2, 0xCC, 0x96, 0x26, 0x8E, 0x52, 0x3E, 0x9B,
+0x27, 0x49, 0x86, 0x33, 0xD2, 0x96, 0x94, 0x66, 0x57, 0x9F, 0xD3, 0x1C, 0xD1, 0x3A, 0x62, 0x3E,
+0x44, 0xFD, 0xFD, 0x81, 0x68, 0x58, 0x98, 0xA4, 0xA1, 0xD4, 0xB5, 0xC2, 0x1C, 0xBB, 0x77, 0x63,
+0x3F, 0x08, 0xFA, 0x80, 0x24, 0xA1, 0x6E, 0x82, 0x80, 0xD9, 0xD0, 0xF4, 0x65, 0x3B, 0x7A, 0xA1,
+0x9A, 0x6D, 0x81, 0x6F, 0x1D, 0x09, 0xDE, 0x00, 0xFC, 0xED, 0xBA, 0xA1, 0xB6, 0xFA, 0x4F, 0xA9,
+0xE5, 0x2A, 0xE9, 0x04, 0x03, 0x3C, 0x00, 0x52, 0xF6, 0x19, 0xF3, 0x8F, 0xEB, 0x6E, 0x60, 0xAC,
+0x99, 0xFB, 0xEE, 0xE2, 0x38, 0x7F, 0x58, 0xCE, 0x8B, 0x4F, 0x1F, 0x09, 0xE5, 0x06, 0x10, 0xC2,
+0xC2, 0xEB, 0x96, 0x43, 0xBB, 0xBC, 0x5F, 0x10, 0xB8, 0x03, 0x10, 0x68, 0x22, 0xB3, 0x6B, 0xCE,
+0xCA, 0xB4, 0x4A, 0x63, 0x46, 0x65, 0x60, 0x0C, 0xEA, 0xCA, 0xBB, 0x27, 0xCE, 0x21, 0xE7, 0x0D,
+0x9C, 0x95, 0xA1, 0xFB, 0xD0, 0x0C, 0x2B, 0x06, 0x23, 0x15, 0xBC, 0x32, 0x3A, 0x54, 0x45, 0xD5,
+0xB4, 0x0D, 0x8B, 0xC4, 0x34, 0x7F, 0x23, 0x61, 0x71, 0xEA, 0xA3, 0xA4, 0x4A, 0x90, 0xB2, 0xB4,
+0xA4, 0xAC, 0xB9, 0x29, 0x2A, 0x11, 0x29, 0xF7, 0x89, 0x93, 0x33, 0x72, 0x4F, 0xF7, 0x5D, 0x4A,
+0x4A, 0x53, 0x52, 0xFF, 0x54, 0x61, 0x73, 0xA5, 0x4D, 0x44, 0x3A, 0x51, 0xDC, 0xEC, 0x5E, 0x6C,
+0xAE, 0x29, 0x70, 0x1A, 0xB1, 0x19, 0x35, 0x40, 0x69, 0x83, 0x47, 0x26, 0x7A, 0x84, 0x6D, 0x8C,
+0x66, 0x14, 0x55, 0xC5, 0xEA, 0x45, 0x9D, 0x12, 0xCD, 0x87, 0x45, 0xB7, 0x03, 0x8B, 0x2F, 0x4D,
+0xB3, 0x53, 0x20, 0x40, 0x3F, 0x7C, 0xFB, 0x48, 0x78, 0x19, 0x49, 0x12, 0x19, 0x68, 0x72, 0x3B,
+0x1C, 0x34, 0xC7, 0xEE, 0xDE, 0xD8, 0x2B, 0xCA, 0x17, 0xFD, 0xB4, 0x98, 0xE3, 0x6B, 0x14, 0xFD,
+0x1D, 0x45, 0xFB, 0x19, 0xD9, 0xAB, 0x79, 0xFB, 0x26, 0xED, 0xAF, 0xE6, 0xF1, 0xBB, 0x8E, 0x31,
+0x1E, 0xA4, 0x9A, 0x66, 0x0F, 0x57, 0xD7, 0xA8, 0xB0, 0xF1, 0x39, 0xCF, 0x53, 0x7D, 0x93, 0x87,
+0xEC, 0xE8, 0x31, 0x1D, 0xC6, 0xF1, 0xD7, 0xF7, 0xE9, 0x55, 0x62, 0xA8, 0xFB, 0xF3, 0xFA, 0x83,
+0x21, 0xF5, 0x9A, 0x33, 0x2F, 0xF9, 0x9D, 0x51, 0x87, 0xA3, 0x7A, 0xD5, 0x46, 0x2C, 0xF9, 0x1C,
+0x0F, 0x2A, 0x3D, 0x3D, 0x30, 0x1B, 0xCF, 0x42, 0xB2, 0xE3, 0xBC, 0xD8, 0x8B, 0xB6, 0x77, 0x35,
+0x49, 0xB1, 0x23, 0xC9, 0x3D, 0x76, 0x45, 0x15, 0x3B, 0x12, 0xF3, 0x19, 0x8C, 0xA7, 0xED, 0xCE,
+0x1A, 0xD5, 0xB5, 0xA4, 0xC2, 0x99, 0xBA, 0x66, 0xFD, 0xF1, 0xBC, 0x80, 0xF2, 0x97, 0x73, 0xDB,
+0xE6, 0xA9, 0xE7, 0xEF, 0x8B, 0xFE, 0x79, 0xA6, 0x5C, 0xC7, 0xFC, 0x8F, 0x11, 0x13, 0xAD, 0x2F,
+0xFA, 0x31, 0xAA, 0xBF, 0x41, 0x98, 0x25, 0x09, 0xE7, 0x0F, 0x08, 0xF8, 0x49, 0x3E, 0xB2, 0x67,
+0x53, 0x78, 0x0C, 0x8F, 0x9E, 0xDB, 0x24, 0x70, 0xA2, 0x76, 0x7E, 0xB3, 0xCF, 0x54, 0xD1, 0x56,
+0x1A, 0x3E, 0xC4, 0x3E, 0xF3, 0xB3, 0x44, 0xF5, 0xAF, 0x91, 0xEF, 0x64, 0x2A, 0xC5, 0x63, 0xD8,
+0x86, 0x8C, 0x09, 0x70, 0xF6, 0x20, 0xC7, 0x61, 0x57, 0x71, 0xA8, 0xBB, 0x1D, 0xBE, 0x6A, 0x4A,
+0x1B, 0x0A, 0x02, 0xB7, 0x10, 0x01, 0x5B, 0x97, 0x9B, 0xDC, 0x82, 0x4F, 0x34, 0xB1, 0xE3, 0x82,
+0x33, 0x32, 0x36, 0x1E, 0x4E, 0x5D, 0xB8, 0x1C, 0x66, 0x49, 0xEC, 0xB0, 0xE8, 0x29, 0xB1, 0x8B,
+0xAE, 0x43, 0xFE, 0xAC, 0xCE, 0x17, 0x73, 0x94, 0xD9, 0x0C, 0xF2, 0x4C, 0x16, 0x33, 0x95, 0xAC,
+0x56, 0x79, 0x73, 0xD5, 0x63, 0xE1, 0x97, 0x7C, 0x66, 0xF4, 0xCD, 0xD4, 0xBA, 0x18, 0x05, 0x1B,
+0x6D, 0xB8, 0x56, 0xAE, 0xA2, 0xCA, 0x29, 0x01, 0xAD, 0xD4, 0x99, 0x99, 0x5F, 0x85, 0xEB, 0x65,
+0xD7, 0x47, 0xD5, 0x2E, 0xD6, 0x61, 0x8A, 0x0A, 0x7B, 0x2A, 0x8B, 0xB3, 0x92, 0xC5, 0x36, 0xE6,
+0x16, 0x83, 0x62, 0xE7, 0xAA, 0xDD, 0xB1, 0xF3, 0x57, 0xC2, 0x8B, 0xEF, 0x1F, 0x0F, 0xC7, 0xCE,
+0x5D, 0x96, 0x5D, 0x0B, 0x6E, 0xF5, 0x41, 0x93, 0xDD, 0x00, 0xB6, 0xE6, 0xDA, 0x36, 0xD0, 0x13,
+0xB6, 0xE3, 0x41, 0x35, 0x6A, 0x82, 0x79, 0xD1, 0x40, 0x48, 0xA9, 0x94, 0x8D, 0x4B, 0x84, 0xAF,
+0xF9, 0xBA, 0x65, 0x3B, 0x6F, 0x90, 0xDC, 0x44, 0x55, 0xCE, 0xD5, 0x39, 0x12, 0x36, 0x46, 0x8A,
+0x66, 0xFE, 0x72, 0xF4, 0x9D, 0x23, 0x79, 0x53, 0xC5, 0x4D, 0x77, 0xE9, 0xE0, 0x43, 0xF6, 0xDF,
+0xA5, 0x99, 0x16, 0x58, 0x71, 0x21, 0x96, 0xAD, 0xC6, 0x9C, 0xD4, 0x00, 0x3C, 0x09, 0xA8, 0x50,
+0x3E, 0x9F, 0x1E, 0x78, 0x4D, 0x1C, 0xB9, 0x47, 0xAC, 0x04, 0x7A, 0x40, 0xB9, 0xDB, 0xD4, 0x83,
+0xC0, 0x89, 0x26, 0x2C, 0xDC, 0x6C, 0xEB, 0x20, 0x7C, 0xEB, 0xCE, 0x8D, 0x4C, 0x88, 0x3F, 0xE0,
+0x34, 0x88, 0xEA, 0x2C, 0x14, 0x44, 0x65, 0x68, 0x66, 0x32, 0xAD, 0x33, 0x98, 0x42, 0x46, 0xE3,
+0xDC, 0xD1, 0x79, 0xE1, 0xBE, 0x04, 0xF9, 0x14, 0x8D, 0x97, 0xDA, 0xDC, 0x49, 0xA5, 0xAC, 0xB8,
+0x91, 0x41, 0xFD, 0x50, 0xD9, 0xEC, 0xE3, 0x8F, 0x93, 0x8E, 0x4E, 0x00, 0xD4, 0x26, 0xE9, 0x4D,
+0xEE, 0xDF, 0xB1, 0x01, 0x8F, 0xF5, 0x62, 0x5E, 0xBF, 0x2D, 0x8F, 0xBC, 0xFB, 0xB5, 0x1F, 0xFB,
+0x25, 0x1A, 0xEC, 0x84, 0xBE, 0x51, 0x15, 0x92, 0x73, 0x83, 0xE6, 0x58, 0x4E, 0x8B, 0x2D, 0x50,
+0xEA, 0x1A, 0x10, 0xF9, 0x6E, 0x4B, 0xB8, 0x4A, 0xA3, 0x0A, 0x02, 0xB7, 0x02, 0x01, 0xA6, 0x23,
+0xD2, 0x5F, 0xD1, 0x74, 0x77, 0x69, 0xE4, 0xA7, 0xD4, 0xAD, 0x68, 0xE5, 0x27, 0xE3, 0x9E, 0x9F,
+0x48, 0x62, 0xE7, 0x91, 0x91, 0x54, 0x5B, 0xAE, 0x23, 0x01, 0xEF, 0x35, 0x44, 0x7F, 0xB6, 0x80,
+0x08, 0xB4, 0xB9, 0x19, 0x56, 0x7E, 0x61, 0x9B, 0x64, 0x27, 0x0E, 0x59, 0x2E, 0x94, 0xF1, 0x1B,
+0x3E, 0x3B, 0x2F, 0x76, 0x19, 0x0F, 0x4A, 0x30, 0xFA, 0x64, 0xD1, 0xA8, 0xFC, 0x32, 0xF7, 0x1D,
+0x0D, 0x5C, 0xE9, 0x90, 0x73, 0x71, 0x31, 0x55, 0x36, 0xA6, 0x91, 0x98, 0x49, 0x9D, 0x13, 0xE1,
+0x2C, 0xF7, 0x7F, 0x53, 0x9A, 0x10, 0x55, 0x3A, 0xD1, 0xDD, 0x44, 0xB5, 0x63, 0x53, 0xF8, 0x0F,
+0xD5, 0x10, 0x35, 0x93, 0xB9, 0xB9, 0xAB, 0xBA, 0x17, 0xA7, 0x2A, 0x49, 0x1E, 0xE5, 0xC9, 0xB5,
+0x15, 0x1A, 0x93, 0x74, 0xC8, 0xD5, 0x15, 0x5D, 0xE3, 0xAD, 0x5E, 0xAB, 0x53, 0xDA, 0x46, 0x62,
+0x07, 0x32, 0xC2, 0xCF, 0x08, 0x55, 0xBB, 0x1F, 0xBF, 0x7D, 0x34, 0xFC, 0xE8, 0xAD, 0xA3, 0x61,
+0x04, 0xE9, 0x50, 0x6E, 0x97, 0x63, 0x43, 0x6F, 0x47, 0x78, 0x78, 0xD7, 0x7A, 0xD9, 0x71, 0x83,
+0x66, 0xC6, 0x2E, 0x44, 0xC7, 0xE6, 0x0B, 0xA9, 0x05, 0x37, 0xAB, 0x1B, 0xA4, 0x61, 0xE6, 0xF9,
+0x04, 0x65, 0x94, 0x25, 0xCA, 0x55, 0xF5, 0x4C, 0xF9, 0x9B, 0x29, 0x4D, 0xAE, 0x9E, 0x0A, 0x5C,
+0x4E, 0x84, 0xC4, 0x97, 0x4C, 0xC7, 0x56, 0xEE, 0x23, 0x0A, 0xA9, 0x0D, 0x4F, 0x7E, 0xAD, 0x5D,
+0xE4, 0xBE, 0x90, 0x6D, 0x34, 0x3B, 0xCA, 0xD6, 0x59, 0x21, 0x6C, 0xC6, 0x96, 0x68, 0xCD, 0x4A,
+0x73, 0x42, 0xB3, 0xF0, 0x25, 0x90, 0xBA, 0x41, 0x6C, 0x27, 0x46, 0x53, 0x1F, 0x7D, 0x49, 0x53,
+0xFE, 0x3A, 0x57, 0x1A, 0x6B, 0xFE, 0x52, 0x69, 0xAA, 0x28, 0x6E, 0x36, 0x3F, 0x6C, 0x1E, 0x45,
+0xFF, 0x3C, 0x57, 0x29, 0x09, 0x80, 0x82, 0x62, 0xF3, 0xCC, 0xB4, 0x61, 0xAA, 0xC6, 0x3E, 0xCF,
+0xAC, 0x8C, 0xF3, 0xA2, 0x96, 0xF6, 0x4E, 0xF1, 0xA7, 0xEB, 0x46, 0x84, 0xF3, 0x41, 0xF8, 0x4A,
+0x1E, 0xDA, 0xA2, 0x81, 0x13, 0xB7, 0x83, 0x7F, 0x5D, 0xBD, 0xB9, 0xDD, 0x8C, 0x65, 0x82, 0xD8,
+0x30, 0x05, 0x11, 0x31, 0xE8, 0x43, 0x6A, 0x13, 0x2A, 0x7D, 0xE5, 0xB8, 0xBD, 0x11, 0x88, 0x51,
+0xF6, 0xB7, 0x77, 0x33, 0xD7, 0x7C, 0xEB, 0xF8, 0x99, 0x61, 0xB2, 0x7A, 0xDD, 0x85, 0x09, 0x3F,
+0x8A, 0x6E, 0xE3, 0xEF, 0x92, 0x95, 0x0D, 0x86, 0x4B, 0x31, 0xFE, 0xB3, 0x7A, 0x65, 0x57, 0xDF,
+0x68, 0xE9, 0xB6, 0x7F, 0x8A, 0xE3, 0x46, 0x2F, 0xBE, 0xD5, 0xD7, 0xD1, 0xBF, 0xEE, 0xA5, 0xF7,
+0x8E, 0x85, 0x6F, 0x3E, 0xFF, 0x3A, 0x16, 0xBC, 0xA9, 0xD0, 0xC1, 0xC5, 0x5D, 0xBE, 0x58, 0xBD,
+0x65, 0x4E, 0xE4, 0x74, 0x01, 0x37, 0xDB, 0xAA, 0xAE, 0xF2, 0x42, 0xF0, 0x12, 0xE1, 0x4A, 0x7D,
+0xE1, 0x40, 0xD8, 0x7B, 0x66, 0x0E, 0xD5, 0xC0, 0x06, 0x23, 0x8B, 0xF6, 0xB6, 0x14, 0xE1, 0x4F,
+0x0B, 0x7F, 0xED, 0x0A, 0x1A, 0x17, 0x7F, 0xB9, 0xBF, 0x5F, 0x93, 0xDD, 0x5B, 0x1A, 0xA6, 0xDE,
+0x51, 0x9E, 0x28, 0x59, 0x89, 0x21, 0xCB, 0xB3, 0x2D, 0x76, 0x5F, 0x23, 0x6A, 0xDE, 0x0C, 0xCD,
+0xB8, 0xEB, 0xED, 0x32, 0x52, 0x22, 0x75, 0xA4, 0x05, 0xD9, 0xCD, 0xBB, 0x12, 0x7A, 0x20, 0xE6,
+0x60, 0x25, 0x9C, 0xA2, 0xF7, 0x81, 0xF0, 0xCE, 0x61, 0x57, 0x8A, 0x91, 0xD1, 0x71, 0x6C, 0x81,
+0xD5, 0x11, 0x0E, 0xED, 0xDA, 0x1A, 0xB6, 0x6D, 0x18, 0x40, 0x2C, 0xC0, 0xAD, 0xE7, 0xF5, 0x24,
+0x63, 0x4C, 0xE5, 0xF1, 0xFC, 0x89, 0x2B, 0x30, 0x9F, 0x22, 0xF5, 0x09, 0xDA, 0x3F, 0x36, 0x32,
+0x22, 0xCA, 0x9A, 0xA0, 0x28, 0xB8, 0x2B, 0x3E, 0x4E, 0xD6, 0xFD, 0xB5, 0xB4, 0x3E, 0x33, 0x95,
+0xE7, 0xA4, 0x22, 0x5E, 0x63, 0xD8, 0xFA, 0x94, 0xF0, 0x32, 0x95, 0x3A, 0x6D, 0xF0, 0x53, 0x02,
+0x6A, 0xC5, 0x4F, 0x1B, 0x40, 0xC2, 0x88, 0xED, 0xB2, 0xB0, 0x9F, 0x6D, 0x7F, 0x5F, 0x2F, 0x4C,
+0xDC, 0xAD, 0xE1, 0x89, 0xDD, 0x1B, 0xC3, 0x13, 0x7B, 0x69, 0x7A, 0x5C, 0x7D, 0x85, 0xEA, 0xFA,
+0xD8, 0x54, 0x78, 0xF9, 0xD4, 0xB5, 0xF0, 0xA3, 0x8F, 0xAE, 0x0A, 0x4E, 0x13, 0xE3, 0x63, 0x61,
+0x86, 0x09, 0xB8, 0x85, 0xAC, 0x9A, 0x02, 0x5C, 0x21, 0x10, 0xEA, 0x3A, 0x10, 0xE7, 0x86, 0xFC,
+0x60, 0x48, 0xA6, 0x44, 0xED, 0x96, 0x92, 0x0F, 0x99, 0x3E, 0xF6, 0x5A, 0x71, 0x56, 0x86, 0x2B,
+0xB5, 0xFA, 0x1C, 0xF6, 0xBA, 0xFC, 0x1C, 0xEF, 0xC9, 0x68, 0xD8, 0xDE, 0x01, 0xC4, 0x4D, 0xB4,
+0x85, 0x83, 0x30, 0x49, 0xFF, 0xEA, 0x43, 0xBB, 0xC2, 0x3D, 0xD8, 0x4D, 0xA4, 0x19, 0x11, 0xC2,
+0x37, 0xF2, 0x9D, 0x43, 0x15, 0xED, 0xD4, 0xC8, 0x4C, 0x38, 0x83, 0x2D, 0xC2, 0x18, 0xDC, 0xC0,
+0x08, 0xD7, 0x5F, 0xB8, 0xAB, 0x5F, 0x02, 0x1C, 0xF2, 0x83, 0xC4, 0xF9, 0x32, 0xF2, 0xD0, 0x31,
+0xAA, 0x75, 0x08, 0x89, 0x86, 0x87, 0xA6, 0xE6, 0xE4, 0x31, 0x8C, 0x07, 0xD5, 0x38, 0x06, 0x41,
+0xD4, 0x72, 0x35, 0x46, 0xC2, 0x5E, 0x1A, 0xC7, 0x0F, 0x4C, 0x94, 0x39, 0x8B, 0xFA, 0xBF, 0x77,
+0x1A, 0xB9, 0x06, 0x81, 0xD1, 0xFD, 0xF0, 0xAF, 0xDB, 0x8E, 0xF4, 0x26, 0x7C, 0x9F, 0xAA, 0x2B,
+0x31, 0x15, 0x93, 0xEE, 0x32, 0x5C, 0x8F, 0x9F, 0x72, 0x6C, 0x74, 0x81, 0xFA, 0xD8, 0x8E, 0x39,
+0x04, 0xF1, 0x50, 0xBD, 0xA6, 0xBB, 0x00, 0x44, 0x52, 0x09, 0x4C, 0xB9, 0x11, 0x04, 0x3E, 0xFE,
+0x35, 0x24, 0x40, 0xA3, 0x63, 0x93, 0xE1, 0x23, 0x24, 0x82, 0x3F, 0x76, 0xE2, 0x6C, 0x38, 0xF1,
+0xD1, 0xF9, 0x70, 0xFC, 0xF8, 0x39, 0xFC, 0xE5, 0xE3, 0x42, 0x38, 0x8D, 0x2D, 0x0C, 0x87, 0xF1,
+0xFD, 0xD2, 0x8E, 0x39, 0xC1, 0x5D, 0x64, 0x78, 0xD0, 0x32, 0xC0, 0x73, 0x67, 0xCF, 0x5F, 0xC5,
+0x8F, 0xEF, 0x11, 0xF9, 0xBE, 0x61, 0x1E, 0x48, 0xFF, 0x0C, 0xF2, 0x87, 0xF9, 0xD5, 0x6B, 0xC3,
+0xE1, 0x02, 0xB6, 0x5A, 0xBA, 0x7C, 0x65, 0x28, 0x0C, 0x8F, 0x8C, 0xC9, 0xE7, 0x8C, 0x9F, 0xB1,
+0x46, 0x0E, 0x6E, 0x39, 0x75, 0x1A, 0xF9, 0x3A, 0xAF, 0x5C, 0x1D, 0x12, 0x57, 0x1C, 0xE6, 0x52,
+0x64, 0x4E, 0xCC, 0xC5, 0x0E, 0x7E, 0xA7, 0x0C, 0x0E, 0x8D, 0x86, 0x63, 0x68, 0xFB, 0x07, 0x47,
+0x4E, 0x85, 0x63, 0xC7, 0xB4, 0x1F, 0x7C, 0x9C, 0x44, 0xBF, 0x2E, 0xA3, 0x1E, 0x96, 0x61, 0x1B,
+0xA8, 0xD0, 0x53, 0x1D, 0x3F, 0x87, 0xC0, 0xBC, 0x4B, 0xC8, 0x28, 0xC0, 0x7D, 0x3E, 0xBB, 0x90,
+0x68, 0x96, 0x84, 0x43, 0xBF, 0x16, 0xF0, 0x3D, 0x05, 0x3C, 0xCE, 0xC0, 0x02, 0xC2, 0xBE, 0x09,
+0x11, 0xC1, 0x7F, 0x67, 0x60, 0x19, 0x39, 0x7A, 0xE2, 0x3C, 0x30, 0x22, 0x3E, 0x5A, 0xFF, 0x29,
+0xB4, 0x91, 0xDF, 0xBD, 0x1D, 0xF8, 0xBE, 0x60, 0x1D, 0xB5, 0x3F, 0x7E, 0x66, 0x80, 0xD3, 0xB9,
+0x0B, 0xD7, 0xC2, 0xE1, 0x63, 0x67, 0xC2, 0x91, 0x23, 0x67, 0xC2, 0x71, 0xB8, 0x16, 0x9D, 0x3C,
+0x75, 0x31, 0x5C, 0x41, 0xFE, 0x51, 0x1E, 0x3D, 0x88, 0xC0, 0x5F, 0xAA, 0x5F, 0x8B, 0xF5, 0x97,
+0x3F, 0x02, 0x89, 0xCF, 0x87, 0xAC, 0xF7, 0xE8, 0x99, 0x70, 0x02, 0x6D, 0xFA, 0x08, 0x63, 0x75,
+0x0E, 0xFB, 0xB0, 0x0E, 0x0E, 0x8D, 0x61, 0x1B, 0xCE, 0x29, 0x69, 0x37, 0xDB, 0xB5, 0xD8, 0x0F,
+0x32, 0xF6, 0x93, 0x38, 0x8F, 0x60, 0x57, 0xA7, 0xB3, 0xC0, 0xE2, 0xBA, 0xF4, 0x55, 0x2D, 0x41,
+0xAC, 0xE3, 0x28, 0xFA, 0xF8, 0x01, 0xF2, 0xA5, 0x1E, 0xC7, 0x2E, 0x47, 0x82, 0x25, 0x52, 0x6B,
+0x9D, 0x3A, 0x73, 0x59, 0x70, 0x6E, 0xB3, 0xB9, 0xB0, 0x98, 0xFA, 0x36, 0x09, 0xD7, 0x19, 0x62,
+0x73, 0xF5, 0xEA, 0x70, 0xB8, 0x82, 0xF1, 0x7F, 0x07, 0xD9, 0x1B, 0xBE, 0x8F, 0x7D, 0x55, 0xF9,
+0x59, 0x7B, 0xF2, 0xC9, 0x7B, 0xC3, 0xFA, 0x75, 0x7D, 0x61, 0x78, 0x78, 0x3C, 0x5C, 0xBB, 0x3E,
+0x22, 0x18, 0x4F, 0x4D, 0xCD, 0x2C, 0x39, 0xC6, 0xEC, 0xEF, 0x85, 0x8B, 0xD7, 0xA5, 0x4D, 0x87,
+0x11, 0x2C, 0x48, 0x1C, 0xD9, 0x26, 0x9F, 0x9B, 0x6C, 0x0F, 0x2D, 0x0C, 0x37, 0x82, 0x25, 0x31,
+0x26, 0x0E, 0x1C, 0xEF, 0xC3, 0x98, 0x37, 0xC4, 0xD3, 0xEB, 0x3F, 0x81, 0xB1, 0x3A, 0x83, 0x8D,
+0x00, 0x06, 0xB1, 0x31, 0x80, 0x6C, 0x39, 0x29, 0xF3, 0xB0, 0x25, 0x5C, 0xC6, 0xBC, 0xF9, 0xDD,
+0xDF, 0xFB, 0x2B, 0x6C, 0x03, 0x39, 0x15, 0x1E, 0x7A, 0xE0, 0xAE, 0xF0, 0xD9, 0x4F, 0x3F, 0x18,
+0xB6, 0x6D, 0xD9, 0xD0, 0xC8, 0xD4, 0xFE, 0xD8, 0x65, 0xF0, 0xFD, 0xEF, 0x8C, 0xE4, 0x63, 0xD7,
+0xD5, 0xB4, 0x0A, 0xBC, 0xC9, 0x97, 0x31, 0xF1, 0xFF, 0xBB, 0xDF, 0xFB, 0x56, 0xF8, 0x37, 0xDF,
+0xFC, 0xA1, 0x4C, 0xD2, 0x2E, 0xAA, 0x37, 0xE2, 0x49, 0x13, 0x57, 0x65, 0x7C, 0x00, 0x8D, 0x68,
+0xC9, 0x5A, 0x05, 0x53, 0x1F, 0x17, 0xB3, 0x28, 0xF3, 0xE2, 0x75, 0x24, 0x0E, 0xDA, 0x7C, 0xBE,
+0x56, 0x35, 0x4C, 0x49, 0x85, 0x32, 0x24, 0x7E, 0xDD, 0x32, 0xCD, 0x05, 0x3F, 0xD0, 0xBA, 0xE8,
+0xC9, 0xC2, 0x28, 0x8B, 0x1E, 0x1D, 0xC9, 0xD5, 0xFF, 0xAD, 0x05, 0xF7, 0x9A, 0xE7, 0x97, 0x2F,
+0xEF, 0x23, 0x84, 0x43, 0xBF, 0x64, 0x78, 0xB5, 0xD4, 0x2B, 0x2D, 0x63, 0xC4, 0x2D, 0x2B, 0xC2,
+0xFF, 0x2C, 0x4B, 0xE2, 0x90, 0x7D, 0x19, 0x31, 0x51, 0x8B, 0xFC, 0xCF, 0xFB, 0xE0, 0x7D, 0x71,
+0xF7, 0x16, 0x5E, 0x87, 0x3B, 0x30, 0x21, 0xAC, 0xD5, 0xE1, 0x65, 0x54, 0x44, 0xD2, 0xFB, 0xB1,
+0x8D, 0xCC, 0xD3, 0xC6, 0x76, 0xC4, 0x84, 0x59, 0xB8, 0x6E, 0x16, 0xA4, 0x6E, 0x66, 0x74, 0x48,
+0xD2, 0xC1, 0xEC, 0xDE, 0xB4, 0x3E, 0xFC, 0x6F, 0x7F, 0xE6, 0x99, 0xF0, 0x1F, 0xFF, 0xE2, 0xB3,
+0x61, 0x33, 0xF6, 0x68, 0xBD, 0xD5, 0x07, 0x4D, 0xA1, 0xC7, 0xE1, 0x3F, 0xF6, 0x7F, 0xFF, 0xD6,
+0xBB, 0xE1, 0xED, 0x8B, 0xC3, 0x58, 0x0C, 0xA6, 0xC2, 0xD5, 0x73, 0x67, 0xC2, 0xE4, 0x04, 0x37,
+0x4C, 0x46, 0xBF, 0xA4, 0x7B, 0x46, 0x56, 0x84, 0x7A, 0x70, 0x8C, 0x53, 0x56, 0x72, 0xA3, 0x23,
+0x36, 0x1E, 0x4E, 0x66, 0x15, 0x73, 0x1B, 0x35, 0xF9, 0x05, 0xA8, 0x87, 0x9F, 0x51, 0x3F, 0x44,
+0x3F, 0x93, 0x66, 0x8B, 0x3D, 0x93, 0x39, 0x62, 0x57, 0x60, 0xC2, 0x30, 0x15, 0xCB, 0xFA, 0x0D,
+0xEB, 0xF0, 0x45, 0x33, 0x20, 0xE6, 0xE3, 0x7F, 0xFC, 0xB9, 0x43, 0xE1, 0xA7, 0xEF, 0xDD, 0xD1,
+0x94, 0x9C, 0x6D, 0x87, 0x2F, 0x0D, 0x87, 0x7F, 0xFD, 0x93, 0xE3, 0xE1, 0x5B, 0x1F, 0x5E, 0xD0,
+0x85, 0xF2, 0x1A, 0x76, 0x12, 0xC1, 0x8F, 0x18, 0xA3, 0xEC, 0x36, 0x07, 0xD9, 0x2F, 0x3F, 0x74,
+0x86, 0xCC, 0x93, 0x18, 0x7B, 0x1F, 0x85, 0x9C, 0x56, 0x47, 0x7A, 0xE1, 0xC7, 0x3E, 0x29, 0xC6,
+0x11, 0x98, 0xEC, 0x89, 0xE8, 0xDA, 0x46, 0x04, 0x5B, 0xBB, 0xA1, 0xAA, 0x6E, 0xD8, 0x2A, 0x51,
+0xC2, 0x5F, 0xBB, 0x67, 0x5B, 0xF8, 0x3F, 0x3F, 0x7B, 0x77, 0x78, 0x70, 0xFB, 0xBA, 0xE4, 0x8B,
+0x77, 0xAB, 0x27, 0x55, 0xCD, 0xFD, 0xAF, 0x4F, 0xCE, 0x85, 0xE7, 0xCE, 0x8F, 0x87, 0x17, 0xB1,
+0xBD, 0xD8, 0x77, 0x4E, 0x8E, 0x86, 0xF5, 0x08, 0xA4, 0xF8, 0xFF, 0x7E, 0x69, 0x7B, 0x38, 0xB8,
+0x5E, 0x09, 0x88, 0x1F, 0x24, 0x71, 0x2F, 0xA0, 0x0C, 0x03, 0x20, 0x9C, 0x84, 0xF1, 0xDB, 0x91,
+0x26, 0xD5, 0xBB, 0xD7, 0x77, 0x0A, 0x59, 0xAB, 0xA6, 0x3D, 0x41, 0xB0, 0xC4, 0xD8, 0x2C, 0xB6,
+0x2A, 0x9B, 0x84, 0x3F, 0xE7, 0x5C, 0xB8, 0x82, 0xBD, 0x7C, 0x7F, 0xEF, 0xF0, 0x30, 0x82, 0x79,
+0x02, 0x52, 0x9C, 0x74, 0x87, 0x27, 0x90, 0x66, 0xA5, 0x17, 0x0B, 0xE7, 0x3E, 0xE4, 0xD3, 0xDB,
+0x8E, 0x60, 0x0A, 0xE6, 0xD1, 0x5B, 0x2E, 0x42, 0x96, 0xBB, 0x8E, 0x5D, 0x43, 0x7B, 0xB9, 0x47,
+0xED, 0x05, 0x6C, 0x89, 0xC6, 0xF9, 0x3F, 0x00, 0xF5, 0x8F, 0x81, 0x1C, 0x07, 0x6F, 0x61, 0x84,
+0x2D, 0xC9, 0xC7, 0x71, 0x2C, 0xDA, 0x7F, 0xF1, 0xDD, 0x97, 0xC2, 0x6B, 0x6F, 0x1C, 0x0E, 0x57,
+0xB0, 0x0F, 0xE6, 0xF8, 0xF5, 0x31, 0x90, 0x56, 0x04, 0x8B, 0xC0, 0x97, 0xB7, 0x77, 0x7D, 0x7F,
+0x78, 0xEA, 0xC9, 0xFB, 0xC2, 0x2F, 0xFC, 0xEC, 0xA7, 0xC3, 0x63, 0x0F, 0x1D, 0x80, 0xA5, 0xA0,
+0x15, 0x8B, 0xF2, 0x18, 0x16, 0xF9, 0x4B, 0xE1, 0x85, 0x57, 0x3E, 0x14, 0x97, 0x87, 0x2F, 0x7C,
+0xE6, 0xC1, 0x70, 0xCF, 0xA1, 0xDD, 0xB2, 0xB8, 0xF2, 0x18, 0xC3, 0x5E, 0xD6, 0xAF, 0xA0, 0xAE,
+0x0F, 0x40, 0x66, 0x48, 0x1C, 0x36, 0xAC, 0xEF, 0x0B, 0xBF, 0xF8, 0x73, 0xCF, 0x84, 0x2D, 0x9B,
+0x06, 0x1A, 0x9A, 0x41, 0x5C, 0xF0, 0xBF, 0xF1, 0xED, 0x17, 0xC2, 0x10, 0x16, 0xFF, 0xBB, 0xF6,
+0x6F, 0x0F, 0xCF, 0x3E, 0xF3, 0x70, 0x18, 0x40, 0x74, 0xF6, 0x62, 0x07, 0x17, 0xFE, 0x77, 0xDF,
+0x3F, 0x19, 0xFE, 0xEC, 0x5B, 0x2F, 0x84, 0x17, 0x5E, 0x7E, 0x2F, 0x8C, 0x5D, 0x1B, 0xC1, 0xE7,
+0x44, 0xDD, 0x52, 0x3A, 0xB0, 0x18, 0xEF, 0x3F, 0xB4, 0x2B, 0xFC, 0xEC, 0x4F, 0x3D, 0x15, 0xBE,
+0xF6, 0xD3, 0x4F, 0x85, 0x75, 0x03, 0xBD, 0x42, 0x4E, 0xBE, 0xFD, 0xFD, 0xD7, 0xC2, 0x25, 0x10,
+0xCF, 0x4D, 0xF8, 0x21, 0xFC, 0xC5, 0xCF, 0x3F, 0x12, 0x76, 0xED, 0xD8, 0x24, 0xE5, 0x89, 0xC7,
+0x47, 0xC0, 0xE3, 0x7B, 0x3F, 0x7A, 0x53, 0xE6, 0xFD, 0x97, 0x3E, 0xF7, 0x48, 0xD8, 0xB2, 0x79,
+0x7D, 0xF8, 0xCE, 0xF7, 0x5F, 0x0D, 0x3F, 0xF8, 0xF1, 0xDB, 0xE1, 0x1C, 0xC8, 0xCD, 0x30, 0xB6,
+0xB9, 0x9C, 0x85, 0x6B, 0x50, 0xCF, 0x86, 0xFE, 0xF0, 0xF4, 0x13, 0xF7, 0x85, 0x5F, 0xFE, 0xFA,
+0x33, 0xE1, 0x61, 0x2C, 0xF0, 0x24, 0x77, 0xF9, 0x31, 0x8C, 0xBE, 0x7F, 0xF7, 0x6F, 0x5E, 0x0B,
+0xDF, 0xFA, 0xAB, 0x97, 0xC2, 0xB1, 0x0F, 0x4E, 0x85, 0x69, 0xB4, 0xB3, 0x03, 0xDF, 0x33, 0xF7,
+0xDC, 0x77, 0x57, 0xF8, 0xDA, 0xCF, 0x3C, 0x1D, 0xBE, 0xF2, 0x85, 0x47, 0x65, 0x67, 0x9E, 0x95,
+0x1C, 0x6C, 0xD3, 0xD5, 0x6B, 0x43, 0xC0, 0xE7, 0xA5, 0xF0, 0xBD, 0x1F, 0xBE, 0x16, 0xCE, 0x1C,
+0x3F, 0x8F, 0x1F, 0x84, 0x70, 0x55, 0xC2, 0x1A, 0xB2, 0x79, 0xC7, 0xE6, 0x70, 0xEF, 0x3D, 0x7B,
+0xC2, 0xBD, 0x77, 0xEF, 0x0E, 0x9F, 0x7F, 0xE6, 0xC1, 0xB0, 0x7F, 0xEF, 0x76, 0x21, 0xE4, 0xF5,
+0x0E, 0xF6, 0x93, 0x16, 0x31, 0x12, 0xB0, 0x97, 0xB1, 0x07, 0x39, 0x57, 0xA0, 0x67, 0x3F, 0xF7,
+0x70, 0xD8, 0xBD, 0x73, 0x0B, 0x08, 0xDD, 0xE9, 0xF0, 0x47, 0x7F, 0xFE, 0xA3, 0xF0, 0xCA, 0xAB,
+0xEF, 0x87, 0x09, 0x8C, 0x81, 0x7E, 0xBD, 0x62, 0x57, 0x1E, 0xB8, 0xD6, 0x3C, 0xF6, 0xC8, 0xA1,
+0xF0, 0x4B, 0x5F, 0x7B, 0x26, 0x7C, 0xEA, 0xF1, 0x7B, 0x84, 0x98, 0xD6, 0x1E, 0x4C, 0xD7, 0x44,
+0xC2, 0xFC, 0xE7, 0xDF, 0x79, 0x11, 0x3F, 0x56, 0x75, 0x4F, 0xF3, 0xB7, 0xDF, 0x3B, 0x1E, 0xFE,
+0xE0, 0x8F, 0x7F, 0x20, 0xEB, 0xDD, 0xAF, 0xFD, 0xAD, 0x2F, 0x86, 0x47, 0x80, 0x95, 0xB8, 0xBF,
+0xE0, 0xBB, 0x8C, 0xD6, 0xA7, 0x83, 0x77, 0xED, 0x08, 0x9F, 0xC7, 0x1C, 0x5A, 0x0C, 0x0B, 0x12,
+0xF3, 0xE7, 0xB0, 0x1D, 0xD9, 0x77, 0xBF, 0xF7, 0x4A, 0x38, 0x0C, 0x7F, 0xF2, 0x29, 0xB1, 0x4C,
+0xB5, 0x84, 0x5E, 0x8C, 0xDD, 0x53, 0x20, 0x8A, 0x5F, 0x07, 0x96, 0x0F, 0xDD, 0xBF, 0x7F, 0xC5,
+0x58, 0xB2, 0xED, 0xFC, 0x1E, 0x20, 0x0E, 0x7F, 0xF9, 0x9D, 0x97, 0xC2, 0x5F, 0xFF, 0xF0, 0xCD,
+0x70, 0x12, 0xE4, 0x71, 0x9A, 0xF5, 0xF3, 0x3B, 0xB6, 0xB3, 0x33, 0x0C, 0x60, 0xFE, 0x3F, 0xFC,
+0xC0, 0xFE, 0xF0, 0xF3, 0x98, 0x3F, 0x4F, 0x3D, 0x81, 0x3E, 0xC3, 0x55, 0xE7, 0x7D, 0x6C, 0xEB,
+0xF9, 0xAB, 0xBF, 0xFE, 0x5F, 0x86, 0x33, 0xE0, 0x29, 0xBF, 0xF1, 0xB7, 0xBF, 0x18, 0xFE, 0x2F,
+0xFF, 0xE4, 0xD7, 0xC3, 0x43, 0xF7, 0xED, 0x5F, 0xC9, 0x30, 0xDE, 0x70, 0xD9, 0x4F, 0xB4, 0x62,
+0x77, 0x65, 0x68, 0x24, 0xFC, 0xDE, 0x77, 0x9F, 0x0F, 0xC7, 0x10, 0x15, 0x4B, 0xE4, 0x99, 0xDE,
+0x23, 0xAA, 0x5F, 0x06, 0x89, 0x9A, 0xEB, 0x54, 0xE5, 0x92, 0x05, 0xCF, 0xD4, 0x0A, 0x65, 0x56,
+0x4A, 0xB2, 0x3C, 0xC9, 0xAF, 0x9B, 0xA3, 0x52, 0x2E, 0x35, 0x27, 0x76, 0x1C, 0x59, 0x25, 0x78,
+0x5E, 0x9F, 0xDE, 0xC8, 0x68, 0x45, 0xFC, 0x19, 0xED, 0xA4, 0xD0, 0x15, 0x0F, 0x27, 0x0A, 0xA6,
+0xAC, 0x89, 0xC2, 0x62, 0x65, 0xD8, 0x12, 0x23, 0x95, 0xE9, 0xD7, 0x92, 0xAB, 0x6D, 0xD6, 0x56,
+0x69, 0x1B, 0xDB, 0x6F, 0x0B, 0xB7, 0x91, 0x53, 0x6D, 0xB7, 0x51, 0x3C, 0x53, 0x1F, 0x53, 0xE0,
+0x86, 0x76, 0x3C, 0xD6, 0x29, 0x2A, 0x01, 0xCA, 0x23, 0x62, 0x94, 0xC4, 0x6E, 0x14, 0x3E, 0x89,
+0x94, 0xBC, 0xEF, 0xDD, 0xB3, 0x3D, 0x6C, 0x07, 0xC9, 0x6B, 0xF4, 0xD7, 0xF1, 0x0D, 0xCF, 0xB0,
+0x65, 0x2E, 0x64, 0xDB, 0x18, 0x10, 0xFB, 0x21, 0x08, 0xCC, 0x61, 0xA4, 0xF4, 0xA0, 0x39, 0x76,
+0x0A, 0xFB, 0xDD, 0xCE, 0x4C, 0x99, 0xB9, 0xD8, 0x89, 0xB4, 0x22, 0xAF, 0x1C, 0xDB, 0xC6, 0x54,
+0xC9, 0xB4, 0xB0, 0x5E, 0xED, 0xAF, 0x99, 0xC1, 0xFC, 0x96, 0x32, 0x42, 0x02, 0x7D, 0x62, 0x35,
+0x4A, 0xC6, 0x73, 0x55, 0xD7, 0xD5, 0x2C, 0x0F, 0x56, 0x71, 0xFC, 0xE4, 0xE3, 0xAC, 0xF3, 0x0A,
+0x5F, 0x2E, 0x7D, 0xFD, 0xFD, 0x62, 0xD6, 0x66, 0xEE, 0xBA, 0xAF, 0x3F, 0xB8, 0x2B, 0xEC, 0x46,
+0x54, 0x6C, 0x43, 0x5B, 0x53, 0x7D, 0x0C, 0xE0, 0xF8, 0xE5, 0xF7, 0x11, 0x76, 0x9B, 0xF8, 0xC6,
+0x7B, 0xE7, 0xB0, 0x4D, 0xDC, 0x04, 0x92, 0x12, 0x23, 0x7A, 0x77, 0x74, 0x0C, 0xBF, 0x12, 0xF0,
+0x45, 0x27, 0x73, 0xC1, 0xC8, 0x96, 0x2B, 0xB7, 0x72, 0x2F, 0x9D, 0x2B, 0xAA, 0xC6, 0x71, 0x9E,
+0xE8, 0xB9, 0xDA, 0x5F, 0xE4, 0x31, 0x20, 0xA2, 0x72, 0x8D, 0xCE, 0xD3, 0x88, 0x96, 0x54, 0xA5,
+0xE7, 0x9C, 0xD8, 0xF1, 0x79, 0x47, 0x4F, 0x5F, 0x20, 0xB9, 0xE3, 0x2E, 0x13, 0x3F, 0x7F, 0xEF,
+0xF6, 0xF0, 0xA9, 0x3D, 0x1B, 0x91, 0xD7, 0x4F, 0x17, 0xAB, 0xDB, 0xD1, 0x14, 0x4B, 0xC5, 0xEE,
+0xA4, 0x29, 0x76, 0xCC, 0x33, 0xB7, 0x98, 0x62, 0x77, 0x1D, 0x01, 0x3C, 0xDF, 0x3B, 0x33, 0x16,
+0xDE, 0xC2, 0x5E, 0xB2, 0x54, 0xDF, 0xCE, 0x82, 0x58, 0x9D, 0x19, 0x9D, 0x95, 0x3D, 0x67, 0x49,
+0x06, 0x99, 0xF0, 0xB8, 0x96, 0x98, 0x9D, 0xC3, 0xFB, 0xDF, 0x3B, 0x35, 0x1E, 0x0E, 0x0F, 0x4E,
+0x89, 0x22, 0xC8, 0xD7, 0xA4, 0x0A, 0x14, 0x9D, 0x86, 0xA1, 0xFA, 0x5D, 0x62, 0x4E, 0x3B, 0xBC,
+0xE8, 0x45, 0xFA, 0x14, 0x2A, 0x84, 0x54, 0xDD, 0x6A, 0x0F, 0xFE, 0xD8, 0x1C, 0x02, 0x31, 0x3C,
+0x35, 0x32, 0x2D, 0x09, 0x8E, 0x3F, 0xB8, 0x3E, 0x85, 0xDD, 0x2B, 0x26, 0xF0, 0x17, 0x8A, 0xCB,
+0xE8, 0xB4, 0x28, 0x82, 0xA3, 0x48, 0x92, 0x0C, 0xDE, 0x29, 0x04, 0xA9, 0xD9, 0x66, 0x5E, 0x2A,
+0x2B, 0xEF, 0x7D, 0xF8, 0x51, 0xF8, 0xC9, 0x8B, 0xEF, 0x86, 0xEF, 0xFC, 0xF5, 0x2B, 0xE1, 0x79,
+0x24, 0x3D, 0x7F, 0xEF, 0xBD, 0x8F, 0xC2, 0x11, 0xEC, 0x6A, 0x73, 0x9C, 0xEA, 0xDD, 0x49, 0x28,
+0x16, 0x17, 0xA9, 0x28, 0xA3, 0xAF, 0x50, 0x7F, 0xBA, 0xB1, 0xA8, 0xAD, 0xC7, 0x8F, 0x46, 0xAA,
+0x5C, 0x47, 0xA1, 0x6E, 0x7C, 0x1B, 0x64, 0xF0, 0x24, 0x48, 0xD0, 0x81, 0xFD, 0x3B, 0xC3, 0xDE,
+0x5D, 0x5B, 0x74, 0xF7, 0x16, 0x1C, 0x7C, 0xFF, 0x47, 0x58, 0x88, 0x7F, 0xFC, 0xFC, 0x3B, 0xA8,
+0xEF, 0x44, 0x18, 0xC2, 0xF7, 0xF9, 0xA7, 0x9F, 0xBA, 0x4F, 0xAE, 0x6D, 0x44, 0x99, 0xBC, 0x8A,
+0x85, 0xFC, 0xF7, 0xFE, 0xE0, 0x6F, 0x84, 0xAC, 0x31, 0xB9, 0xF9, 0x23, 0x0F, 0xDE, 0x85, 0x94,
+0x49, 0xDD, 0x0B, 0xF0, 0xE5, 0x67, 0x81, 0xF7, 0x7A, 0xFB, 0xDD, 0xE3, 0xE1, 0x39, 0xEC, 0xDB,
+0xF9, 0x2D, 0xF4, 0xE1, 0xC7, 0xF8, 0x7B, 0x18, 0x24, 0xEA, 0x23, 0xA8, 0x3A, 0x54, 0xB1, 0x4E,
+0x82, 0xB8, 0x0C, 0x42, 0x31, 0xE4, 0xCE, 0x24, 0x7D, 0x70, 0xB5, 0x18, 0xE8, 0xEF, 0x15, 0xB1,
+0xE0, 0x4F, 0xFE, 0xE2, 0xC7, 0xE1, 0xF5, 0x37, 0x8E, 0x88, 0xF2, 0xF8, 0xE0, 0xFD, 0xFB, 0xC2,
+0xD6, 0x2D, 0xEB, 0xA5, 0x7E, 0xFE, 0xC8, 0x3A, 0x82, 0xBE, 0xFD, 0xE9, 0x37, 0x9E, 0x0B, 0xA7,
+0xA0, 0xD8, 0xEC, 0xD8, 0xBE, 0x09, 0xCA, 0xE4, 0x95, 0xF0, 0xED, 0xBF, 0x7A, 0x39, 0xFC, 0x0D,
+0xC8, 0xDE, 0xDB, 0xD8, 0xC4, 0xFE, 0x43, 0xB4, 0x8B, 0xAA, 0xCE, 0x19, 0x28, 0x64, 0x24, 0x6B,
+0xB4, 0x96, 0xF4, 0x20, 0x35, 0xD0, 0xA6, 0x8D, 0x54, 0xBB, 0x5B, 0x45, 0x81, 0xBA, 0x02, 0xF2,
+0xF5, 0xEA, 0x9B, 0x47, 0x70, 0xDD, 0x2B, 0xE1, 0xAF, 0xFE, 0xE6, 0xD5, 0xF0, 0xDA, 0xAB, 0x1F,
+0x86, 0x63, 0x20, 0x0D, 0xA7, 0xCE, 0x5E, 0xC2, 0x3D, 0x27, 0xC5, 0xE5, 0x83, 0x7D, 0x22, 0x99,
+0x51, 0xB5, 0x49, 0xBF, 0xCF, 0x97, 0x3A, 0xC6, 0x41, 0x38, 0x3E, 0x42, 0xC2, 0xFE, 0x57, 0x5E,
+0xFD, 0x00, 0x64, 0xF1, 0x65, 0x10, 0x91, 0x37, 0xC2, 0x5B, 0x6F, 0x1C, 0x15, 0x85, 0x92, 0xE7,
+0x2F, 0x42, 0x25, 0x25, 0x99, 0x1C, 0x86, 0xC2, 0xD4, 0xC2, 0x1F, 0xAE, 0x08, 0x84, 0xDA, 0x00,
+0x62, 0xE2, 0x6A, 0x64, 0x5E, 0x37, 0xFB, 0x49, 0xC2, 0x74, 0x18, 0x0A, 0xD5, 0x5F, 0xA1, 0x8D,
+0xA7, 0x41, 0xD4, 0xF7, 0xEF, 0xDB, 0x21, 0xA4, 0xFD, 0xB9, 0x1F, 0xBF, 0x15, 0xFE, 0x02, 0x44,
+0x87, 0x7B, 0xBB, 0x1E, 0xF9, 0xF0, 0xB4, 0xA8, 0x75, 0x27, 0xA0, 0x7C, 0x9E, 0x06, 0x0E, 0x13,
+0xD8, 0xCB, 0xBA, 0x07, 0xDF, 0x95, 0xBD, 0xC0, 0x72, 0x0B, 0xD7, 0x99, 0x9A, 0x40, 0x33, 0x7E,
+0xB7, 0x5D, 0xC0, 0x9C, 0xF9, 0xFD, 0x3F, 0xF8, 0x7E, 0x78, 0x0F, 0x24, 0x8C, 0x0A, 0xE5, 0x51,
+0x60, 0x45, 0x35, 0x51, 0x76, 0x23, 0x42, 0x1F, 0x39, 0xBE, 0x27, 0xD1, 0xDE, 0xE3, 0x50, 0x85,
+0x4F, 0xA3, 0x5E, 0x7E, 0x0F, 0x93, 0x18, 0xB3, 0x4E, 0x3F, 0x54, 0xED, 0xBC, 0x1A, 0xDE, 0xFF,
+0xF0, 0x64, 0x78, 0x03, 0x98, 0xFF, 0xE0, 0x47, 0x6F, 0x85, 0xEF, 0x81, 0x24, 0xBF, 0x0A, 0x1C,
+0x8F, 0x52, 0xA5, 0x84, 0x62, 0x77, 0x96, 0xF8, 0x43, 0x6D, 0x63, 0x7A, 0x2A, 0xAA, 0x6E, 0x4C,
+0x17, 0xC5, 0x71, 0x20, 0x9E, 0xCB, 0x61, 0x29, 0x63, 0x8D, 0x6B, 0x22, 0x9E, 0x20, 0x8D, 0xDF,
+0xFF, 0xE1, 0x5B, 0xE1, 0x8D, 0x37, 0x30, 0x4E, 0x47, 0x39, 0xF7, 0xD1, 0x67, 0x90, 0x78, 0xB6,
+0x7B, 0x0C, 0x73, 0x8C, 0xE3, 0xD5, 0x89, 0x71, 0xDE, 0x80, 0x3C, 0xAD, 0xC3, 0xF8, 0x61, 0xF0,
+0xBB, 0xBF, 0xFF, 0x3D, 0x53, 0xEC, 0xF6, 0x87, 0xCF, 0x3E, 0xDD, 0x3C, 0xC5, 0xEE, 0x13, 0x47,
+0xEC, 0x7C, 0x41, 0xE2, 0x80, 0x5C, 0x44, 0x52, 0xE2, 0xDF, 0xFE, 0xCB, 0x1F, 0x84, 0x4B, 0xF8,
+0x70, 0xF0, 0xFB, 0x92, 0x49, 0x79, 0xB3, 0x65, 0x49, 0x7F, 0x40, 0x38, 0x79, 0x32, 0xE5, 0x4B,
+0x4A, 0x18, 0x29, 0x93, 0x65, 0x4B, 0x78, 0x96, 0x7D, 0x50, 0x8C, 0x04, 0x19, 0x55, 0x10, 0xD5,
+0x46, 0xD4, 0x35, 0x5B, 0xB0, 0xD4, 0xFE, 0xEF, 0x74, 0xCE, 0x7D, 0xF2, 0x94, 0x70, 0xE8, 0xE2,
+0xA7, 0xF5, 0xE9, 0xAD, 0x94, 0xDC, 0xE9, 0x39, 0x6D, 0x95, 0xFE, 0xD5, 0x3A, 0xBC, 0xDE, 0xDC,
+0x7C, 0x25, 0xF5, 0x67, 0xEF, 0xCB, 0x9D, 0xFD, 0x1F, 0x7F, 0xCF, 0xEE, 0x21, 0x0B, 0x2D, 0xCE,
+0x51, 0xD1, 0x53, 0x8E, 0xA7, 0x7F, 0x5D, 0x65, 0x8C, 0x1F, 0x7D, 0xB9, 0x8E, 0x0A, 0x17, 0xCE,
+0x4C, 0x4F, 0x08, 0xC1, 0x1B, 0x1B, 0xA7, 0x49, 0xB6, 0x33, 0x3C, 0x76, 0xF7, 0xBE, 0xD0, 0x87,
+0xA4, 0xC0, 0xB7, 0xFA, 0x90, 0x5F, 0x43, 0x30, 0x39, 0x3E, 0x7F, 0xF2, 0xAA, 0xA4, 0x39, 0x99,
+0xC5, 0x07, 0x69, 0x7A, 0x82, 0xBF, 0x00, 0xAB, 0x44, 0x5D, 0xA0, 0x4D, 0xB6, 0x6B, 0x55, 0xAB,
+0xB2, 0xF1, 0x8B, 0x79, 0xD8, 0x0C, 0x36, 0xC1, 0xDC, 0x88, 0xA1, 0xF6, 0x31, 0x11, 0x73, 0xA3,
+0xCA, 0x3A, 0x2E, 0x52, 0xDE, 0x48, 0x50, 0x1C, 0x3F, 0x57, 0xFD, 0x10, 0x61, 0x0C, 0xC5, 0xAE,
+0xB7, 0x1F, 0x64, 0x06, 0x5F, 0xFA, 0x5B, 0xF1, 0x05, 0xFB, 0xF3, 0x0F, 0xEE, 0x0C, 0x9B, 0xFB,
+0x2C, 0x99, 0xF2, 0x2A, 0x81, 0xC7, 0x05, 0x7C, 0x1A, 0x58, 0x1C, 0x81, 0x9A, 0xF9, 0xA7, 0xEF,
+0x5D, 0x90, 0x00, 0x8A, 0x39, 0x98, 0x9B, 0x66, 0x1D, 0x17, 0xD3, 0x24, 0xDD, 0xA5, 0x32, 0x35,
+0xC3, 0x7F, 0x6C, 0xF8, 0xDC, 0x21, 0xB9, 0xF5, 0x5E, 0x66, 0xA5, 0x8C, 0x08, 0x3B, 0x2E, 0x3A,
+0x85, 0x94, 0xF4, 0xC6, 0x43, 0xE6, 0x29, 0xC9, 0xB3, 0x62, 0x27, 0x07, 0xCA, 0xF4, 0x0C, 0xAC,
+0x0B, 0x6D, 0x9D, 0x50, 0xA3, 0xE0, 0x5F, 0xF7, 0x1F, 0x3C, 0xB6, 0x47, 0xF2, 0x11, 0x7A, 0xEA,
+0x97, 0x46, 0xBE, 0x28, 0x57, 0x09, 0xB2, 0x45, 0xAB, 0x6D, 0x94, 0xD8, 0x5D, 0x06, 0x09, 0xFB,
+0x93, 0x63, 0xA3, 0xE1, 0x95, 0x4B, 0x93, 0xE1, 0x3C, 0x64, 0xB7, 0xF3, 0x50, 0xE3, 0xCE, 0x83,
+0xA8, 0x5D, 0xC1, 0xF9, 0x5D, 0x48, 0x76, 0xCC, 0x44, 0xC5, 0x3D, 0x95, 0x88, 0x88, 0x16, 0x6C,
+0x1D, 0x36, 0x13, 0xFE, 0xF8, 0xF8, 0x88, 0x90, 0x30, 0x12, 0xB0, 0x09, 0x9A, 0x5D, 0x81, 0x37,
+0x77, 0xAC, 0xB8, 0x88, 0x3A, 0x58, 0xE7, 0x66, 0xA8, 0x75, 0xCC, 0x83, 0xC7, 0x9D, 0x27, 0xBA,
+0xEA, 0xE4, 0x3E, 0x99, 0x06, 0xE6, 0x34, 0x11, 0x7F, 0xEB, 0xE4, 0x58, 0xF8, 0x6B, 0xEC, 0x31,
+0xFB, 0xDC, 0xB9, 0xF1, 0xF0, 0xEE, 0xB5, 0x29, 0x31, 0x1F, 0x9F, 0xC5, 0xFD, 0x4F, 0x83, 0xF0,
+0x1D, 0xC1, 0xFB, 0x87, 0xF1, 0xE0, 0x67, 0xE2, 0xE0, 0x3A, 0x28, 0x87, 0xBE, 0x85, 0x46, 0x13,
+0xC0, 0xA4, 0xB9, 0xF4, 0xB7, 0xFE, 0xDD, 0xB7, 0xC2, 0x1F, 0xFD, 0xC1, 0x5F, 0xC3, 0x5C, 0x76,
+0x0A, 0x64, 0x04, 0x11, 0xDA, 0x58, 0xB8, 0xE7, 0xF8, 0x8B, 0x4C, 0xBF, 0x64, 0x25, 0xBF, 0xE3,
+0x28, 0x15, 0x3A, 0x2C, 0xCE, 0xC3, 0x58, 0xE0, 0x1E, 0x7D, 0xF8, 0x10, 0x92, 0x69, 0xCF, 0x86,
+0x0F, 0x40, 0x08, 0xFF, 0xFC, 0x4F, 0xBE, 0x1F, 0xCE, 0x9D, 0xBE, 0x14, 0x1E, 0x7B, 0xF4, 0x9E,
+0x70, 0xCF, 0x3D, 0x7B, 0xA3, 0x62, 0x45, 0x72, 0xF1, 0xED, 0xEF, 0xBD, 0x1C, 0x7E, 0x00, 0x55,
+0xEC, 0x43, 0x10, 0xBB, 0x19, 0x2C, 0xB8, 0x3F, 0x4F, 0xC5, 0x6E, 0xF3, 0xBA, 0x86, 0x16, 0xDC,
+0x8B, 0x58, 0x4C, 0xFF, 0xE5, 0xBF, 0xFA, 0xD3, 0xF0, 0x3E, 0x48, 0x66, 0x2F, 0x14, 0xB6, 0x2F,
+0x42, 0x35, 0xA3, 0xD2, 0x56, 0x7B, 0xCC, 0x43, 0x35, 0xA3, 0x49, 0xF2, 0x5F, 0xFE, 0xCF, 0x7F,
+0x11, 0xFE, 0x02, 0x0A, 0xD3, 0x11, 0x98, 0x90, 0xA9, 0x10, 0xCE, 0x79, 0xEA, 0x27, 0x5A, 0x5C,
+0x30, 0xAF, 0xB9, 0xE8, 0x9F, 0x3F, 0x77, 0x55, 0x88, 0xDA, 0xDE, 0x3D, 0xDB, 0x90, 0x30, 0xBD,
+0x23, 0xFC, 0xF6, 0xEF, 0xFE, 0x55, 0x78, 0x1D, 0x24, 0x81, 0xDB, 0x35, 0x7E, 0xE1, 0xB3, 0x0F,
+0x87, 0x3D, 0x20, 0xA6, 0x3C, 0xB8, 0xD8, 0xBF, 0x8B, 0x36, 0xFF, 0xEE, 0xEF, 0x7C, 0x27, 0x9C,
+0x45, 0xDF, 0x36, 0x6F, 0xDB, 0x14, 0xBE, 0x09, 0x12, 0xF5, 0x3C, 0xC8, 0xCE, 0x39, 0x10, 0x1B,
+0x9A, 0x69, 0x65, 0x13, 0x7B, 0xAE, 0x0B, 0x24, 0x96, 0x20, 0x8D, 0xA7, 0x40, 0x32, 0xF8, 0xFD,
+0xF6, 0x04, 0xD4, 0xAC, 0x6E, 0xA8, 0x58, 0xD7, 0x07, 0x47, 0x85, 0x8C, 0xB0, 0x5D, 0xCF, 0x81,
+0x7C, 0x9D, 0x83, 0xC9, 0x7A, 0x92, 0x7B, 0x40, 0xEB, 0x17, 0x92, 0x10, 0x90, 0x73, 0x68, 0xF7,
+0xB9, 0x4B, 0x83, 0xA2, 0xAA, 0x51, 0x35, 0xE4, 0x9E, 0xCC, 0xCB, 0x05, 0x16, 0x5C, 0x84, 0xC2,
+0xF8, 0x17, 0x50, 0x32, 0xFF, 0xED, 0x6F, 0x7F, 0x27, 0xBC, 0xF2, 0xFA, 0x61, 0x51, 0xC6, 0x98,
+0x0E, 0x4C, 0x7F, 0xED, 0x61, 0x0B, 0x40, 0xFC, 0x30, 0xA4, 0xD9, 0xFB, 0x1C, 0xC8, 0x23, 0xC9,
+0x39, 0x83, 0xCC, 0x1E, 0x79, 0xF8, 0x40, 0x5D, 0x52, 0x4C, 0xF2, 0x79, 0x1E, 0x38, 0x13, 0xE3,
+0x6F, 0x82, 0xC4, 0x5E, 0x00, 0x3E, 0xF7, 0x81, 0x40, 0xBF, 0x04, 0x15, 0xF6, 0x4F, 0xA1, 0xAE,
+0x7D, 0x00, 0xB2, 0x38, 0x06, 0xD2, 0x2B, 0x16, 0x00, 0x2E, 0xC2, 0x12, 0x00, 0x81, 0xF9, 0x0F,
+0x15, 0xEE, 0xEC, 0xC9, 0xF3, 0x61, 0x08, 0x73, 0xE1, 0xA9, 0xC7, 0xEF, 0x5D, 0xA0, 0xA4, 0x52,
+0x85, 0x3B, 0x83, 0xFB, 0xFF, 0xCF, 0xFF, 0xD3, 0x9F, 0x84, 0x77, 0xDE, 0x3B, 0x09, 0xE2, 0x76,
+0x29, 0x5C, 0x84, 0x0A, 0x4C, 0x9F, 0x62, 0xB6, 0x73, 0x68, 0x70, 0x2C, 0x9C, 0x47, 0xDF, 0x4F,
+0x83, 0xD8, 0x9D, 0x06, 0x79, 0xBA, 0x00, 0x53, 0x27, 0x55, 0xB1, 0x2F, 0x40, 0x2D, 0xCC, 0xC7,
+0x78, 0x0C, 0xDF, 0x8B, 0x3F, 0x04, 0xE6, 0xBF, 0xF5, 0xEF, 0xBF, 0x13, 0xBE, 0xF1, 0xCD, 0x9F,
+0x84, 0x37, 0x40, 0x92, 0x49, 0xB0, 0x27, 0x6C, 0x2F, 0x6D, 0xB6, 0x87, 0x70, 0x8E, 0xC0, 0x4F,
+0xF9, 0x23, 0x10, 0xE6, 0x77, 0x8F, 0x9E, 0x0E, 0x97, 0x31, 0x9F, 0x0F, 0xEE, 0xDF, 0x11, 0x36,
+0x92, 0x60, 0x37, 0xF0, 0x0B, 0x82, 0x58, 0xFD, 0x39, 0xEA, 0xFE, 0x37, 0xBF, 0xF5, 0x4D, 0xA8,
+0x96, 0x1F, 0x86, 0x8B, 0x57, 0xAE, 0x41, 0x7C, 0xE0, 0x38, 0xA5, 0x3E, 0xD3, 0x42, 0x32, 0xC2,
+0x31, 0xC6, 0xFC, 0xBF, 0x00, 0xB3, 0x32, 0x95, 0x41, 0xFA, 0x42, 0xFF, 0xFE, 0xFF, 0xFA, 0xD7,
+0x4A, 0xEC, 0xF0, 0xBA, 0x99, 0xA6, 0xD8, 0xC6, 0x9C, 0x19, 0x9A, 0xF0, 0xE5, 0xB1, 0xD2, 0x5B,
+0x50, 0x56, 0xBF, 0x08, 0x46, 0x7F, 0x15, 0x13, 0x80, 0x00, 0x2F, 0x1B, 0x44, 0x63, 0x8B, 0x53,
+0xF5, 0xB7, 0x0E, 0x17, 0xFA, 0x6C, 0x21, 0xF3, 0x46, 0x88, 0xB2, 0x66, 0xEB, 0x98, 0xA8, 0x42,
+0x79, 0xEB, 0x84, 0xAA, 0x45, 0x27, 0xFD, 0xCA, 0x9A, 0x67, 0x8B, 0xAD, 0x2A, 0x3D, 0x69, 0x31,
+0x94, 0xBA, 0xAC, 0x4E, 0xAD, 0xCA, 0x2A, 0xB4, 0x45, 0x54, 0x1C, 0x78, 0xD3, 0xD9, 0x74, 0x33,
+0x3B, 0x9F, 0x57, 0x17, 0x09, 0x89, 0xD5, 0xAF, 0x55, 0x68, 0x7B, 0xF3, 0xBE, 0x54, 0x4C, 0x6D,
+0xFC, 0xAC, 0xE1, 0x57, 0x19, 0x1D, 0xDE, 0x59, 0xEE, 0x22, 0x88, 0xF0, 0x4B, 0xEF, 0x1E, 0x0D,
+0xEF, 0x1C, 0x3B, 0x15, 0x46, 0xC6, 0x69, 0xF2, 0xBC, 0xB5, 0x47, 0x17, 0x16, 0xCB, 0xBD, 0xF8,
+0x85, 0x43, 0xF5, 0x10, 0xFB, 0xA6, 0x87, 0x79, 0x89, 0xB8, 0xD4, 0x2F, 0xC4, 0x88, 0x55, 0xCD,
+0x53, 0x79, 0x53, 0xFE, 0xD7, 0xFF, 0xEA, 0x0D, 0xA3, 0x55, 0x10, 0x3B, 0xE7, 0xD5, 0x29, 0xD6,
+0xD9, 0x48, 0x58, 0x5D, 0xC6, 0xE9, 0x6C, 0xEC, 0xF5, 0x7D, 0xFE, 0xB2, 0xE6, 0x36, 0x62, 0x73,
+0xF8, 0x42, 0xA4, 0x99, 0x7C, 0x2B, 0x08, 0x5D, 0x1F, 0x08, 0x4D, 0x23, 0x5F, 0x08, 0x1F, 0x07,
+0xD5, 0x69, 0xA8, 0x4C, 0x67, 0x06, 0xC7, 0xC3, 0x09, 0x28, 0x76, 0x57, 0xB0, 0x88, 0x4E, 0x31,
+0x92, 0x17, 0x26, 0x75, 0x26, 0xE1, 0xB6, 0x9F, 0x10, 0x5A, 0x7D, 0x9C, 0x43, 0xFA, 0x54, 0xBB,
+0x92, 0x4F, 0x58, 0xEB, 0x67, 0x36, 0xC7, 0x62, 0xCF, 0xE3, 0xB9, 0xEC, 0x0A, 0xC3, 0xA2, 0xD2,
+0xF6, 0x6C, 0x72, 0xD2, 0x24, 0xD2, 0x81, 0xF1, 0xA1, 0xF2, 0xB4, 0xA9, 0xBB, 0x1D, 0xCA, 0x65,
+0x4F, 0x53, 0x7C, 0x0D, 0x3F, 0x0E, 0x96, 0x8D, 0x5E, 0x4B, 0xE5, 0x8C, 0xC9, 0xA8, 0x69, 0xBA,
+0xF5, 0x07, 0xCD, 0xB2, 0xDC, 0xFF, 0x75, 0x18, 0x8A, 0x1A, 0xDF, 0xAF, 0x3D, 0xE8, 0x97, 0xC7,
+0x54, 0x3D, 0x54, 0xE6, 0xF8, 0x77, 0xCE, 0x7E, 0x48, 0x8C, 0x62, 0x01, 0x27, 0xA9, 0x23, 0x29,
+0x64, 0x9D, 0xF4, 0xB5, 0xAB, 0x73, 0xB9, 0x04, 0xC4, 0x9C, 0x18, 0x82, 0xAF, 0x30, 0x4C, 0xC0,
+0x34, 0x15, 0xBF, 0x7C, 0x71, 0x22, 0xBC, 0x0E, 0xB5, 0xEE, 0x38, 0x48, 0x1C, 0xAF, 0x65, 0x9D,
+0x24, 0x77, 0xEF, 0x5E, 0x85, 0xAF, 0x25, 0x4C, 0xBE, 0x2F, 0xD8, 0xFB, 0x6C, 0x13, 0xEB, 0xAC,
+0xD7, 0xA6, 0x46, 0xFB, 0xBB, 0x5C, 0x39, 0x4E, 0x05, 0x92, 0xAF, 0x17, 0x5E, 0x7E, 0x1F, 0xE6,
+0xC5, 0xB7, 0xC2, 0xCB, 0x20, 0x38, 0x5C, 0x6C, 0x19, 0x0D, 0xBE, 0x19, 0xE4, 0xEB, 0x20, 0x4C,
+0x79, 0x0F, 0x3F, 0x7C, 0x30, 0xDC, 0x77, 0x9F, 0x2A, 0x59, 0x34, 0x8D, 0xBE, 0xF9, 0x16, 0x54,
+0x13, 0xA8, 0x61, 0x3F, 0x79, 0xE5, 0x7D, 0xF1, 0x77, 0xA2, 0xB2, 0x73, 0x01, 0xFE, 0x63, 0x17,
+0x40, 0x5A, 0xA8, 0x9A, 0xE5, 0xDF, 0x4B, 0xCC, 0xB1, 0x39, 0x08, 0x72, 0x73, 0x01, 0x0B, 0xF1,
+0x59, 0x2C, 0xF2, 0x17, 0xA1, 0xBC, 0x90, 0x30, 0x35, 0x7A, 0x50, 0xAD, 0xA1, 0xEA, 0xC3, 0x85,
+0x9C, 0xE4, 0x53, 0x88, 0x54, 0xCD, 0xC1, 0x7B, 0x5C, 0x04, 0xB1, 0x79, 0xFE, 0x27, 0xEF, 0x48,
+0x1F, 0x5E, 0x7F, 0xF3, 0xA8, 0x98, 0x28, 0x69, 0x36, 0xBD, 0x1F, 0x8B, 0xED, 0xC3, 0x20, 0x59,
+0x0F, 0x3D, 0x74, 0x30, 0x1C, 0xB8, 0x6B, 0xA7, 0xF8, 0x8D, 0xD1, 0x6F, 0xF0, 0x47, 0x3F, 0x79,
+0x1B, 0x2A, 0xD4, 0xDB, 0x50, 0xA7, 0x2E, 0x87, 0x4B, 0x30, 0xA7, 0xD2, 0x6F, 0x8E, 0x64, 0x49,
+0x92, 0xE0, 0xDB, 0x41, 0x6C, 0xC6, 0x41, 0x2A, 0xD8, 0x66, 0xAA, 0x58, 0x34, 0x29, 0x3F, 0x0F,
+0x45, 0x93, 0x7E, 0x6C, 0xFC, 0x1E, 0x61, 0xFD, 0x87, 0xEE, 0xDE, 0x23, 0xD8, 0xEC, 0x84, 0x9A,
+0x47, 0x7F, 0xB4, 0x37, 0x41, 0xE2, 0x7E, 0x08, 0x6C, 0x5E, 0x03, 0x46, 0x34, 0xEF, 0xBE, 0x06,
+0xD2, 0xF5, 0xFD, 0x1F, 0xBC, 0x2E, 0xAA, 0x25, 0xD5, 0x25, 0xFE, 0x28, 0xBA, 0x0B, 0xED, 0xB8,
+0x1F, 0xCA, 0xE0, 0x7E, 0x10, 0x0F, 0xAA, 0x5A, 0x87, 0x61, 0xEE, 0x7C, 0x0E, 0xED, 0xF9, 0xFE,
+0x0F, 0xA0, 0x42, 0xBD, 0xFE, 0xA1, 0x98, 0x87, 0x17, 0xF3, 0x9E, 0xA2, 0xC2, 0xF8, 0x2E, 0xCC,
+0x7F, 0x3F, 0x66, 0x5F, 0x9F, 0x7B, 0x13, 0xED, 0x79, 0x07, 0x64, 0xF2, 0x82, 0x10, 0xE9, 0x83,
+0x07, 0x76, 0xA3, 0x9F, 0x07, 0xC2, 0xDD, 0xF7, 0xEE, 0x0E, 0xEB, 0xD6, 0xF5, 0x40, 0x1D, 0x1D,
+0x16, 0x35, 0x91, 0x63, 0x4A, 0x85, 0xF1, 0x85, 0x57, 0x3E, 0x10, 0x7F, 0xB6, 0xFC, 0x77, 0x9D,
+0x7E, 0xBD, 0xF0, 0x07, 0x26, 0x7C, 0xEC, 0x40, 0xDE, 0xD8, 0x57, 0x92, 0xB1, 0x37, 0xDE, 0x39,
+0x86, 0x36, 0xBF, 0x8D, 0xB1, 0x3E, 0x2A, 0x04, 0x71, 0xFB, 0xF6, 0xCD, 0xD2, 0x4F, 0xB6, 0xFB,
+0xD0, 0xC1, 0xDD, 0x50, 0x24, 0xD7, 0x87, 0x41, 0xCC, 0x85, 0xB7, 0x40, 0x7C, 0xD9, 0xDF, 0x97,
+0x40, 0x86, 0x48, 0xF4, 0x16, 0x7C, 0x76, 0x30, 0x7E, 0x57, 0xAF, 0x0F, 0x41, 0x11, 0x1C, 0xC4,
+0x8F, 0x85, 0x41, 0x51, 0x45, 0x25, 0x53, 0x01, 0x86, 0x91, 0x24, 0x89, 0xBE, 0x93, 0x54, 0x0B,
+0xF9, 0xB8, 0x82, 0x32, 0xBC, 0x97, 0xFB, 0x5E, 0xB3, 0x2E, 0x8E, 0x07, 0x95, 0xBA, 0x1F, 0xA2,
+0xFD, 0xF4, 0xCD, 0x23, 0xFE, 0x47, 0xE1, 0x5B, 0xC7, 0x32, 0xFB, 0xF6, 0x6D, 0x97, 0xFE, 0x72,
+0x8C, 0xB7, 0x6E, 0xDD, 0x10, 0xAE, 0xC3, 0x1C, 0xFA, 0x16, 0xF0, 0xFF, 0x11, 0xB0, 0xF9, 0x3E,
+0x48, 0x34, 0xE7, 0x03, 0x7F, 0x18, 0xD4, 0x9B, 0x33, 0x79, 0x3B, 0x87, 0x30, 0x7F, 0x5F, 0x43,
+0x3F, 0x05, 0x4F, 0x8C, 0x13, 0x15, 0x5E, 0xF2, 0x81, 0xBD, 0xB0, 0x78, 0xDD, 0x0F, 0xD3, 0xEB,
+0x7D, 0xE8, 0xF3, 0x01, 0xDC, 0x6B, 0x33, 0x72, 0x79, 0x92, 0xBC, 0xBF, 0x0B, 0x73, 0x32, 0x89,
+0xE6, 0x4F, 0x5E, 0x78, 0x57, 0xDA, 0xCC, 0xFE, 0xE8, 0xF7, 0x74, 0xA3, 0xB3, 0xFA, 0xE6, 0x94,
+0xFB, 0xC4, 0x12, 0xBB, 0x21, 0x4C, 0x82, 0x0F, 0x21, 0xD1, 0x32, 0x49, 0x2D, 0x7D, 0x3C, 0x44,
+0xB9, 0xA9, 0x01, 0x4F, 0xB5, 0x0B, 0x5B, 0xF8, 0x3D, 0x10, 0x82, 0x2A, 0x84, 0xAF, 0x80, 0xA2,
+0x50, 0x98, 0x99, 0xC9, 0x99, 0xBB, 0xFC, 0xAA, 0xF1, 0x2B, 0x93, 0x29, 0x4F, 0xC9, 0x03, 0x1F,
+0x2A, 0xC3, 0x45, 0xA5, 0x88, 0x8B, 0x23, 0xEB, 0xC6, 0x78, 0x68, 0x1B, 0x54, 0x75, 0xF3, 0x5C,
+0x78, 0x22, 0x30, 0x71, 0x5C, 0x5D, 0x0D, 0x31, 0xD3, 0x69, 0x8C, 0x68, 0x25, 0xE1, 0x73, 0x45,
+0xCF, 0xEA, 0x92, 0xE0, 0x07, 0x7B, 0x9E, 0xFF, 0x55, 0x53, 0xB0, 0xB6, 0x43, 0xD5, 0x15, 0xBD,
+0x8F, 0xD7, 0x5D, 0x2F, 0x82, 0x51, 0xFB, 0x4A, 0xD3, 0x1D, 0x74, 0xBB, 0x6E, 0x98, 0x0F, 0x61,
+0x86, 0x6D, 0x65, 0xD2, 0xE2, 0x93, 0x67, 0xC3, 0x5F, 0x3E, 0xFF, 0x46, 0x38, 0x8F, 0x5F, 0x49,
+0xB7, 0xFA, 0xA0, 0x49, 0x93, 0xD1, 0xB1, 0xBD, 0x48, 0x97, 0x41, 0x53, 0x2C, 0x53, 0x9E, 0xF0,
+0x97, 0xA5, 0xF0, 0x89, 0xC8, 0x56, 0x08, 0xA4, 0xF9, 0x81, 0x09, 0x36, 0x54, 0xEB, 0xF8, 0x5A,
+0xCD, 0x53, 0x9A, 0xF7, 0xCF, 0xC7, 0xC8, 0xFE, 0x12, 0x2F, 0x93, 0xB4, 0x62, 0x54, 0xB1, 0x95,
+0x8B, 0xB9, 0x03, 0x65, 0xBC, 0xF5, 0xFA, 0x6A, 0x2E, 0x38, 0xA5, 0x79, 0x6D, 0x50, 0xEB, 0x5A,
+0x41, 0x8A, 0xE9, 0xFB, 0xC4, 0xD7, 0x07, 0x36, 0xF5, 0x41, 0x2D, 0x59, 0xFD, 0xA0, 0x89, 0x31,
+0xFC, 0x52, 0x7E, 0xED, 0x1C, 0xBE, 0xFC, 0xCF, 0xC3, 0x71, 0x9B, 0x69, 0x4E, 0xD0, 0xCE, 0x19,
+0x28, 0x76, 0x0C, 0x2E, 0x71, 0x5F, 0xCF, 0xB8, 0x37, 0xB1, 0xF7, 0x33, 0xF6, 0x57, 0x26, 0xB9,
+0xCE, 0x13, 0xEB, 0x5F, 0xBE, 0x2F, 0xAC, 0xCC, 0x29, 0xC1, 0x4C, 0xF1, 0x15, 0x15, 0x3C, 0x9E,
+0xB3, 0x0F, 0x52, 0x86, 0xA5, 0xCF, 0x31, 0x8E, 0x07, 0xE7, 0x4F, 0x07, 0x30, 0xE9, 0x04, 0xE1,
+0xDD, 0x89, 0x9D, 0x26, 0xFA, 0xBA, 0xF4, 0xB3, 0x57, 0x35, 0xED, 0xDE, 0xEA, 0x19, 0x75, 0x63,
+0xF7, 0xA7, 0x98, 0x46, 0x93, 0xEB, 0x16, 0xEC, 0x50, 0xB1, 0x05, 0xFD, 0xDA, 0x84, 0x07, 0x4D,
+0xAF, 0x24, 0x32, 0x8B, 0xE5, 0xB2, 0x93, 0xFC, 0x86, 0x50, 0xCF, 0xFA, 0xF0, 0xE3, 0x84, 0x26,
+0x5E, 0xDD, 0xB1, 0x83, 0x81, 0x16, 0x4C, 0x90, 0x4C, 0x13, 0x2C, 0x4C, 0x33, 0x28, 0x44, 0x81,
+0xAD, 0xFA, 0xA3, 0x52, 0xDB, 0x38, 0x0A, 0x73, 0xED, 0x73, 0x67, 0xC7, 0xC3, 0x37, 0x4E, 0x8C,
+0x84, 0xE3, 0x20, 0x78, 0x0C, 0x94, 0x10, 0x8D, 0x1D, 0x85, 0xD7, 0xA1, 0x2D, 0x1B, 0xD1, 0x06,
+0xAA, 0x7C, 0xC4, 0x9E, 0xE9, 0x7C, 0xDE, 0xBA, 0x3C, 0x15, 0x7E, 0xFF, 0xF0, 0x48, 0x78, 0xE7,
+0x2A, 0xB6, 0x98, 0x03, 0xE9, 0x63, 0xDA, 0x9E, 0xD5, 0x3A, 0xA8, 0x74, 0x9D, 0x85, 0xB3, 0xF8,
+0x6F, 0xFD, 0xFB, 0xEF, 0x86, 0x77, 0x60, 0x56, 0x9C, 0xC6, 0x84, 0xA1, 0x1B, 0xC7, 0xAE, 0x9D,
+0x9B, 0x85, 0xD0, 0xFD, 0xEC, 0x57, 0x9F, 0x0E, 0x7F, 0xE7, 0x37, 0x7E, 0x2A, 0xFC, 0xF2, 0x2F,
+0x7D, 0x21, 0x3C, 0x01, 0x55, 0xA6, 0x1B, 0x26, 0x43, 0x9A, 0xA1, 0x8F, 0xC1, 0x9F, 0xEB, 0xDF,
+0xFE, 0xEE, 0xF7, 0xE0, 0x3B, 0x77, 0x1A, 0x8B, 0x2F, 0x66, 0x6C, 0x1B, 0xCC, 0xF4, 0xFC, 0x1C,
+0xD5, 0xF8, 0x71, 0x11, 0x0F, 0x9A, 0x50, 0x5B, 0x60, 0xB2, 0x83, 0x5D, 0x4C, 0xCA, 0x24, 0xFF,
+0xE7, 0x06, 0x7A, 0xC5, 0x0A, 0x60, 0x9E, 0x6B, 0xC1, 0x0F, 0x2D, 0x26, 0x0F, 0xAF, 0x27, 0xBE,
+0x90, 0x28, 0xBE, 0x07, 0xB2, 0xF3, 0xEF, 0x7F, 0xE7, 0xDB, 0xE2, 0x13, 0x47, 0x74, 0xD9, 0xCE,
+0xC7, 0xE1, 0xFB, 0xF5, 0xB7, 0xD0, 0xEE, 0xBF, 0xF7, 0x77, 0x7F, 0x3A, 0xFC, 0xC6, 0x6F, 0x7C,
+0x25, 0x7C, 0x15, 0x7E, 0x75, 0xFB, 0xF6, 0x6E, 0x0B, 0xDC, 0xF5, 0x4D, 0x7C, 0xDE, 0xBE, 0xFB,
+0x22, 0x4C, 0x84, 0x1F, 0x89, 0xF9, 0xAF, 0x1D, 0xCA, 0x5D, 0x3B, 0x06, 0xB4, 0xF6, 0xC7, 0x9C,
+0x98, 0x45, 0xF1, 0x3E, 0x62, 0x5C, 0x84, 0xBC, 0xD0, 0x74, 0x48, 0x7C, 0xF6, 0xED, 0xDB, 0x19,
+0x9E, 0x80, 0xBF, 0xE1, 0xD7, 0xBE, 0xF6, 0x99, 0xF0, 0x4B, 0xBF, 0xF8, 0xF9, 0xF0, 0x19, 0xF8,
+0x85, 0x51, 0x51, 0x9C, 0x41, 0x03, 0x8F, 0x42, 0x31, 0xFA, 0xE3, 0x6F, 0xFC, 0x48, 0x02, 0x0E,
+0xFE, 0xF0, 0x0F, 0xFF, 0x3A, 0xFC, 0x31, 0x54, 0xAF, 0xEB, 0x50, 0x40, 0x69, 0xAA, 0xDC, 0xBD,
+0x67, 0x6B, 0xF8, 0xA9, 0x9F, 0x7A, 0x32, 0xFC, 0xF2, 0x2F, 0x3F, 0x1B, 0xBE, 0xFC, 0xA5, 0x27,
+0xC2, 0x76, 0xF8, 0xF3, 0x91, 0x6C, 0x5E, 0x05, 0x41, 0xF8, 0x7D, 0x98, 0xF4, 0x7E, 0xE7, 0x77,
+0xBE, 0x1B, 0xCE, 0x61, 0x3C, 0x64, 0x3B, 0xC1, 0x3A, 0xC7, 0x35, 0x90, 0xDB, 0xDF, 0xFF, 0xD3,
+0xE7, 0xC2, 0xBF, 0xFE, 0xB7, 0xDF, 0x0A, 0x2F, 0xBC, 0xF8, 0x9E, 0xA4, 0x8C, 0xA2, 0x69, 0xF0,
+0xD0, 0x81, 0x5D, 0xE1, 0x67, 0xBE, 0xFA, 0x54, 0xF8, 0xF5, 0x5F, 0xFB, 0x72, 0xF8, 0x3A, 0x14,
+0xD1, 0x07, 0x69, 0xCE, 0xA4, 0xDF, 0x1B, 0x49, 0x1B, 0x1E, 0xEF, 0x00, 0x9F, 0xDF, 0x42, 0xDD,
+0x24, 0xC8, 0x1C, 0xF3, 0xFC, 0x30, 0x7B, 0x8F, 0xAA, 0x84, 0x18, 0x9F, 0x11, 0xCC, 0xC1, 0xEF,
+0xC3, 0xDC, 0xF9, 0xCE, 0xBB, 0x1F, 0x49, 0x12, 0xF7, 0x01, 0xF8, 0x45, 0x3E, 0xFD, 0xF4, 0xFD,
+0xE8, 0xE7, 0xE7, 0x64, 0x1E, 0xFC, 0x0C, 0xE6, 0xC4, 0x43, 0x20, 0x3C, 0x5D, 0x98, 0xF7, 0xB3,
+0xB8, 0x84, 0xA6, 0xCA, 0xDF, 0x81, 0xB9, 0x9C, 0x24, 0xAD, 0xF6, 0xE0, 0x0F, 0xE6, 0xEE, 0x75,
+0xEB, 0xC3, 0x06, 0x10, 0xAF, 0x4D, 0x5B, 0x37, 0x86, 0x81, 0x01, 0x58, 0x45, 0x6C, 0x1D, 0xED,
+0x87, 0xAB, 0xCB, 0xA6, 0x6D, 0x38, 0xBF, 0x6D, 0x23, 0xDE, 0xDF, 0x18, 0xD6, 0xE3, 0xEF, 0x00,
+0x7E, 0xFC, 0xE7, 0xFE, 0xE8, 0x24, 0x5D, 0xDF, 0x84, 0x8F, 0xDE, 0x5F, 0x7D, 0xF7, 0x65, 0xD4,
+0x8F, 0x40, 0x13, 0x7E, 0x4E, 0x51, 0xC1, 0x0E, 0xCC, 0xCF, 0x2F, 0x7D, 0xE9, 0x71, 0xF4, 0xF7,
+0x2B, 0xE1, 0x57, 0x7E, 0xE9, 0xD9, 0xF0, 0x29, 0x8C, 0x45, 0x0F, 0xB6, 0x3C, 0xA4, 0xAA, 0x4C,
+0x82, 0xF9, 0x21, 0x4C, 0xBF, 0xBF, 0xFB, 0xBB, 0xDF, 0x85, 0x69, 0xFE, 0x84, 0xA8, 0xB4, 0x4B,
+0x1D, 0x54, 0x7A, 0x7F, 0xEF, 0x8F, 0x7E, 0x00, 0xB2, 0xFC, 0xB6, 0xE4, 0x43, 0xE5, 0x77, 0xC4,
+0x4E, 0xF8, 0x28, 0x3E, 0xFB, 0xEC, 0xA3, 0xE1, 0x57, 0xFF, 0xD6, 0xB3, 0xA8, 0xFF, 0x0B, 0xE1,
+0x2B, 0x18, 0xAB, 0x47, 0x1F, 0xB9, 0x1B, 0xE6, 0x57, 0xFA, 0x86, 0xB6, 0xE0, 0x87, 0xCC, 0x55,
+0x8C, 0xED, 0xF7, 0xC5, 0x0D, 0xA1, 0xF1, 0x9F, 0x29, 0x0D, 0xCC, 0xF7, 0x15, 0x14, 0xF9, 0xC4,
+0x99, 0x62, 0x65, 0x79, 0xC5, 0x07, 0xE4, 0xDC, 0x95, 0xEB, 0xE1, 0xDB, 0x2F, 0xE0, 0x17, 0xD8,
+0x91, 0x93, 0xBA, 0x2B, 0x00, 0xCF, 0x1B, 0x29, 0xCB, 0xFB, 0x2F, 0x7E, 0x58, 0xF1, 0x84, 0x99,
+0x61, 0xFD, 0xCB, 0x50, 0x6D, 0xA2, 0xC6, 0x08, 0xAD, 0x94, 0x33, 0x34, 0x59, 0x40, 0x93, 0x99,
+0x53, 0x8B, 0xC9, 0x9B, 0xFA, 0x0D, 0x2D, 0xC5, 0xA9, 0x2A, 0x19, 0x11, 0x8C, 0xC4, 0x90, 0xEF,
+0x7B, 0x30, 0x85, 0x97, 0xF5, 0xBA, 0x75, 0x31, 0x15, 0xD3, 0x98, 0x9B, 0x14, 0x8D, 0xA4, 0x49,
+0x13, 0xA5, 0x2E, 0x7B, 0xDF, 0xD8, 0xA3, 0x9B, 0x57, 0xD5, 0x2F, 0x2C, 0xD5, 0x63, 0xF6, 0x5C,
+0xA9, 0x47, 0xA8, 0xA4, 0x93, 0x1D, 0xEB, 0x9B, 0x97, 0xD5, 0x74, 0x1D, 0x38, 0x44, 0x22, 0xC7,
+0x6A, 0x03, 0xD5, 0xA7, 0x05, 0x01, 0x0A, 0xA3, 0x50, 0xEA, 0xE8, 0x38, 0xBC, 0x15, 0xBF, 0xAE,
+0xE8, 0x6B, 0xD0, 0xCF, 0x68, 0xB4, 0x26, 0x10, 0x96, 0x7A, 0x73, 0x93, 0x6D, 0xA5, 0x89, 0xE2,
+0x85, 0x93, 0xD7, 0xA0, 0x54, 0x8C, 0x8B, 0x8A, 0x31, 0x3F, 0x31, 0x82, 0x2C, 0xB8, 0x33, 0x4A,
+0x8A, 0xD9, 0x3F, 0x85, 0xD5, 0x21, 0x8A, 0xA6, 0x6C, 0xED, 0xAE, 0x13, 0x5D, 0x1D, 0x13, 0x1B,
+0x99, 0x38, 0x46, 0xAE, 0x9E, 0x46, 0x33, 0xB7, 0x90, 0x63, 0x35, 0x8F, 0xDB, 0x30, 0xEA, 0x3D,
+0xE2, 0xF7, 0xA5, 0x13, 0x75, 0x2C, 0xC8, 0xDD, 0xDD, 0xA1, 0x15, 0x66, 0xC7, 0x79, 0x7C, 0x61,
+0xD3, 0x7F, 0xE8, 0x17, 0x60, 0x86, 0xBD, 0x7F, 0xFB, 0xC0, 0xAA, 0xA7, 0x3B, 0xB9, 0x0A, 0x35,
+0xE0, 0x2F, 0x3F, 0xB8, 0x18, 0x5E, 0x3C, 0x73, 0x1D, 0xA6, 0x38, 0xFC, 0xDA, 0xC5, 0x58, 0xB5,
+0x22, 0x22, 0x96, 0x7F, 0xD9, 0x6A, 0x6F, 0xAB, 0x6F, 0x65, 0x27, 0xE7, 0x0C, 0x5C, 0x9D, 0x46,
+0x3A, 0xF3, 0xBD, 0x7F, 0x3A, 0xBF, 0xD2, 0x27, 0x41, 0xDE, 0x15, 0x40, 0x0D, 0x3F, 0xBF, 0x5A,
+0xA6, 0xAC, 0x7D, 0x6A, 0x64, 0xBA, 0xDB, 0x9C, 0xB7, 0xBA, 0xBB, 0x80, 0x47, 0xDF, 0xC0, 0x7A,
+0x38, 0x35, 0xB7, 0x85, 0x4F, 0xED, 0xDE, 0x10, 0xBE, 0x70, 0x68, 0x6B, 0xE8, 0xC7, 0xC2, 0xEA,
+0x9F, 0xCB, 0x7A, 0xE3, 0x7B, 0xAB, 0xCF, 0xD5, 0x9A, 0x62, 0x49, 0x94, 0x7E, 0xB1, 0x4E, 0x54,
+0x2C, 0x7D, 0xD8, 0xA8, 0x84, 0xD1, 0x87, 0x8D, 0x01, 0x0F, 0x9B, 0x7A, 0x5A, 0xC5, 0x1C, 0xCB,
+0x8F, 0xCE, 0xC3, 0x9B, 0xBA, 0xC2, 0xE3, 0xD8, 0xEF, 0xB5, 0x6A, 0x8A, 0xA5, 0xC2, 0x37, 0x27,
+0x26, 0x58, 0xFA, 0xCF, 0x91, 0x08, 0x5E, 0xC3, 0x2A, 0x4F, 0x98, 0xF7, 0x0D, 0xB4, 0x63, 0x7F,
+0xDA, 0xCE, 0x70, 0x17, 0xEA, 0x79, 0x08, 0x41, 0x17, 0x7B, 0x91, 0xB0, 0x98, 0xBB, 0x51, 0x74,
+0x64, 0xA6, 0xD8, 0x29, 0x28, 0x6E, 0xEF, 0xC3, 0xE4, 0xFA, 0x97, 0x27, 0xC6, 0xC4, 0xFC, 0xCB,
+0x76, 0xB2, 0xFE, 0x5D, 0x7D, 0x70, 0x9C, 0x47, 0xA0, 0xC4, 0x7D, 0xB8, 0x8E, 0xED, 0xD8, 0x0C,
+0x65, 0x94, 0x84, 0x93, 0x43, 0x44, 0x15, 0x90, 0x6A, 0xA2, 0xF8, 0xD9, 0xE1, 0xD4, 0x7A, 0x98,
+0x78, 0x79, 0x4D, 0x03, 0x16, 0xA5, 0x15, 0x0F, 0xC3, 0xE8, 0xE8, 0x44, 0xF8, 0x2B, 0x04, 0x03,
+0xD0, 0xCC, 0x45, 0x85, 0x69, 0xDB, 0xF6, 0x8D, 0xE1, 0x49, 0x10, 0xBA, 0x27, 0x3F, 0x75, 0x3F,
+0x4C, 0x77, 0x87, 0xC4, 0x31, 0xFE, 0x11, 0xA8, 0x22, 0xBB, 0x60, 0x9E, 0xEC, 0xC5, 0xF7, 0x07,
+0x4D, 0xB3, 0xB3, 0x30, 0x6F, 0x72, 0x11, 0x67, 0x14, 0xE3, 0x3A, 0x2C, 0xD4, 0x54, 0xD2, 0xDE,
+0x02, 0x71, 0x20, 0x41, 0xE1, 0x02, 0x48, 0x07, 0x73, 0x8F, 0x9A, 0xA5, 0x82, 0xF7, 0x63, 0xA8,
+0x2C, 0xEF, 0xC0, 0xCC, 0x47, 0x32, 0xB5, 0x65, 0xD3, 0xBA, 0xF0, 0x77, 0xB0, 0x18, 0x6F, 0xC3,
+0x42, 0xDF, 0x88, 0x49, 0x9F, 0x91, 0xB4, 0xBF, 0xFB, 0x47, 0x7F, 0x13, 0x06, 0xF1, 0x23, 0xFF,
+0x9E, 0x43, 0x7B, 0xC2, 0xCF, 0xFD, 0xD4, 0xA7, 0x24, 0x92, 0xD2, 0x0F, 0xAA, 0x31, 0x57, 0xA0,
+0xD6, 0x7D, 0xE3, 0x9B, 0xCF, 0x87, 0x3F, 0xFA, 0xD3, 0x1F, 0xCA, 0x3D, 0xF6, 0xC2, 0xA4, 0x49,
+0x12, 0xFA, 0x95, 0x2F, 0x3E, 0x1E, 0x3E, 0x03, 0x42, 0x72, 0xDF, 0xBD, 0x7B, 0x41, 0xE8, 0xA0,
+0xB8, 0xE0, 0xDE, 0x6C, 0x23, 0xBF, 0x47, 0xAF, 0x82, 0x30, 0x5C, 0x87, 0x52, 0xD7, 0x8F, 0xBA,
+0x24, 0x6A, 0x13, 0x7D, 0xD9, 0x8A, 0x68, 0xC6, 0xAF, 0x83, 0xB4, 0xEC, 0x83, 0x89, 0x96, 0x87,
+0xFB, 0xD8, 0xD1, 0x37, 0x6E, 0x10, 0x64, 0x61, 0x10, 0xD7, 0xD0, 0xD1, 0x9F, 0xF8, 0x3C, 0xF3,
+0xCC, 0x43, 0x30, 0x3B, 0xDF, 0x1D, 0x9E, 0x78, 0xEC, 0xEE, 0x70, 0x37, 0x02, 0x32, 0xE8, 0xBF,
+0xC6, 0x0C, 0x0E, 0x24, 0x22, 0x54, 0x35, 0xB9, 0x73, 0x4C, 0x2F, 0x5C, 0x60, 0xBE, 0x0B, 0xD3,
+0xAD, 0xF8, 0x07, 0xE2, 0x7B, 0xE5, 0x3E, 0xA8, 0x7B, 0x9F, 0x87, 0x29, 0xF9, 0x8B, 0x5F, 0x78,
+0x2C, 0x3C, 0x08, 0xF5, 0x6B, 0x1B, 0xC8, 0x8C, 0xEC, 0x0B, 0x0D, 0x8C, 0xAE, 0x42, 0x6D, 0x3A,
+0x0F, 0xD2, 0x45, 0x12, 0x72, 0x10, 0x8A, 0xD8, 0xDD, 0x0C, 0x40, 0xA9, 0x09, 0xC0, 0xA0, 0x5A,
+0xF7, 0xFC, 0x4B, 0xEF, 0x86, 0xDF, 0x85, 0xCF, 0xDA, 0xCB, 0xF0, 0xAD, 0xBB, 0x8A, 0x7E, 0xAF,
+0x87, 0xA9, 0xF1, 0x49, 0x28, 0x92, 0x9F, 0x45, 0xBD, 0x9F, 0x43, 0x60, 0xC9, 0xC3, 0x30, 0xA1,
+0xEE, 0x00, 0x59, 0xA4, 0x19, 0xB8, 0x07, 0xD7, 0xAF, 0x43, 0xFF, 0xB8, 0xC6, 0x31, 0x7A, 0x93,
+0x69, 0xC3, 0xEE, 0x47, 0x40, 0xC5, 0xDD, 0x20, 0x81, 0x79, 0xDD, 0xD3, 0x50, 0x9B, 0x49, 0x9A,
+0xE8, 0x87, 0xF8, 0x02, 0x7C, 0x2B, 0x07, 0x71, 0x9F, 0x21, 0xF8, 0xE6, 0xD1, 0xEC, 0xBE, 0x67,
+0xF7, 0xB6, 0xF0, 0x34, 0xE6, 0xC2, 0x97, 0x9F, 0x7D, 0x4C, 0xE6, 0x02, 0x55, 0x4F, 0x92, 0x9E,
+0x7E, 0xFC, 0xE0, 0x9B, 0xC3, 0x75, 0x34, 0xC3, 0x0E, 0xC2, 0xA2, 0x36, 0x0A, 0x7C, 0x9E, 0x7C,
+0xEC, 0x1E, 0x60, 0xB7, 0x35, 0x8B, 0x2A, 0x56, 0x92, 0x75, 0x12, 0x26, 0x56, 0x5E, 0x73, 0x17,
+0x54, 0x2F, 0xFA, 0x36, 0x5E, 0x84, 0xBA, 0xCB, 0x71, 0x78, 0xFC, 0x91, 0x83, 0x12, 0x49, 0xCA,
+0x3A, 0xA9, 0x5E, 0x1E, 0x38, 0xB0, 0x23, 0x3C, 0x8E, 0x39, 0xF7, 0xE4, 0x63, 0x87, 0x30, 0xD7,
+0xBA, 0x60, 0x5A, 0x9E, 0x0E, 0x6F, 0xBD, 0x73, 0x3C, 0xFC, 0x7B, 0x10, 0xDE, 0x57, 0x5F, 0x3B,
+0x2C, 0x16, 0x8D, 0x0D, 0x08, 0x52, 0x79, 0x08, 0xA6, 0xFE, 0x4F, 0x23, 0xFA, 0x94, 0x38, 0x3E,
+0x8E, 0x31, 0xD8, 0xB3, 0x1B, 0x73, 0x93, 0x3F, 0x38, 0x98, 0x88, 0x1E, 0x44, 0x94, 0x91, 0xDD,
+0xF4, 0xE5, 0x1C, 0xC2, 0x38, 0xEC, 0x41, 0x76, 0x88, 0xFB, 0xEE, 0xDD, 0x27, 0xFE, 0x8B, 0xB5,
+0xF3, 0x8D, 0x78, 0x32, 0xB2, 0xF6, 0xC7, 0x20, 0xC8, 0x7F, 0xF8, 0x67, 0xCF, 0x09, 0x21, 0xEF,
+0x03, 0x5E, 0x8F, 0xA1, 0x4D, 0xAC, 0xFF, 0x0B, 0xC0, 0xF4, 0x31, 0xB4, 0x91, 0x26, 0x72, 0x2A,
+0x82, 0x9C, 0x3F, 0xE2, 0x3B, 0x8A, 0xAF, 0x4B, 0x2A, 0x8C, 0xD7, 0x31, 0xEF, 0xD7, 0xA3, 0x3D,
+0x6F, 0x63, 0x7C, 0xA7, 0xF0, 0x99, 0x68, 0xB6, 0x29, 0xF6, 0x13, 0x47, 0xEC, 0x7C, 0x00, 0x8E,
+0x41, 0x12, 0xFE, 0xFD, 0xEF, 0xC3, 0x29, 0x17, 0xDB, 0x64, 0xF1, 0x4B, 0x8D, 0x7B, 0xA3, 0xA6,
+0xA5, 0x2D, 0x7D, 0x87, 0xC5, 0xE5, 0x9B, 0xEB, 0x93, 0x44, 0xAC, 0x2A, 0x31, 0x94, 0xF5, 0x4C,
+0x54, 0x1F, 0x5F, 0xFC, 0xF4, 0x9C, 0xFB, 0x5A, 0xE9, 0x9A, 0x67, 0x44, 0xD0, 0xD6, 0xBF, 0xE8,
+0x9B, 0xA7, 0x95, 0xC4, 0x3A, 0x94, 0x48, 0x58, 0x20, 0x86, 0xAF, 0x9D, 0x59, 0xDD, 0xCA, 0x15,
+0xF5, 0x8D, 0x79, 0x0B, 0xB7, 0xE4, 0x2F, 0x53, 0x25, 0x16, 0xEE, 0xE0, 0xAE, 0x65, 0x9C, 0x7C,
+0x54, 0xEB, 0xB3, 0x76, 0x38, 0x69, 0xB1, 0xB6, 0x59, 0x67, 0xB4, 0xDF, 0xFE, 0xCD, 0x6E, 0xF7,
+0x8D, 0x1C, 0xA5, 0xE6, 0x3C, 0x23, 0x19, 0xE1, 0xC9, 0x2B, 0x79, 0xFF, 0xC6, 0xE0, 0x64, 0x7B,
+0x71, 0x70, 0x48, 0x3E, 0x78, 0xF7, 0xC3, 0xB1, 0x79, 0xA0, 0x77, 0x65, 0x91, 0x57, 0x2B, 0x5E,
+0x29, 0x96, 0xB8, 0x80, 0xA6, 0xC7, 0xE3, 0x57, 0xC7, 0xC2, 0xCB, 0xE7, 0xA0, 0x50, 0x81, 0xE4,
+0xB5, 0x4E, 0x4F, 0x86, 0x56, 0x10, 0x50, 0x7E, 0xF1, 0x38, 0x1F, 0xF1, 0xB1, 0x53, 0x45, 0x55,
+0x0F, 0xE9, 0x5E, 0xD6, 0xC7, 0xC8, 0xD6, 0xF4, 0x8D, 0xC4, 0x7F, 0x05, 0x17, 0xBB, 0xC6, 0xCE,
+0x27, 0x66, 0x67, 0x14, 0xC8, 0x99, 0x9E, 0x95, 0x65, 0x34, 0x6D, 0x1B, 0xF6, 0xAF, 0x6D, 0xE9,
+0xE8, 0x82, 0x12, 0xD1, 0x22, 0x01, 0x02, 0xFF, 0x9B, 0x27, 0xF6, 0x86, 0x3D, 0xD8, 0x2D, 0x63,
+0xB5, 0x4D, 0xB1, 0x97, 0x46, 0xA6, 0xC2, 0xEF, 0xBC, 0x71, 0x3A, 0xBC, 0x0C, 0x62, 0x37, 0x06,
+0x3C, 0x98, 0xA3, 0xB1, 0x7D, 0x02, 0xCE, 0xCE, 0x42, 0x4A, 0xA3, 0x2B, 0x0B, 0x88, 0x6E, 0x9C,
+0x45, 0xD2, 0x9D, 0xF8, 0xBB, 0xC4, 0xFB, 0xEB, 0x27, 0x4D, 0xE9, 0xF3, 0x3E, 0xA7, 0x60, 0x13,
+0xFB, 0x3C, 0x88, 0xDA, 0xA7, 0x3C, 0xCE, 0x34, 0x6E, 0x65, 0xBD, 0xE6, 0x9F, 0xE7, 0x73, 0xB8,
+0xBF, 0x7F, 0x00, 0x8A, 0x47, 0x2F, 0xC8, 0x44, 0x5B, 0xF8, 0xD9, 0xFB, 0xB6, 0x4B, 0x0E, 0x42,
+0x9A, 0xD2, 0x75, 0x2C, 0x12, 0x71, 0xBC, 0x99, 0x73, 0xE3, 0xE3, 0xD6, 0x95, 0x13, 0x3B, 0x9A,
+0x38, 0x17, 0x0B, 0x9E, 0xA0, 0x32, 0xB7, 0xAD, 0x07, 0xBE, 0x74, 0x20, 0x54, 0x8F, 0x82, 0xC4,
+0xED, 0xC0, 0xF3, 0xE7, 0xCF, 0x23, 0x68, 0x05, 0x9D, 0x7F, 0x04, 0xC4, 0xEE, 0xB1, 0x3A, 0xC4,
+0x8E, 0x24, 0x91, 0xFB, 0xD0, 0x3E, 0xBA, 0xA5, 0x5B, 0xFE, 0xBE, 0x7C, 0x09, 0x3F, 0x98, 0x00,
+0xDC, 0x57, 0xF7, 0xF6, 0x86, 0x5F, 0xDC, 0x8F, 0x68, 0xC8, 0x6D, 0xDD, 0xE1, 0x3E, 0x10, 0xBC,
+0x1D, 0xF0, 0xD1, 0xA3, 0x82, 0x97, 0xCF, 0x1B, 0xA6, 0x32, 0xF9, 0xB3, 0x13, 0xA3, 0xE1, 0x47,
+0x88, 0xD8, 0x1D, 0x81, 0x72, 0xC7, 0xFB, 0xEF, 0x84, 0x72, 0xFD, 0x33, 0xB8, 0xF6, 0x97, 0x0F,
+0xF4, 0xC7, 0xED, 0xCC, 0x1E, 0x47, 0xDD, 0xF7, 0xA0, 0x0E, 0x92, 0x48, 0xFA, 0xDB, 0x91, 0x80,
+0x32, 0x48, 0xE3, 0xFA, 0xE4, 0xBC, 0x04, 0x74, 0x6C, 0x43, 0xB4, 0xED, 0x6A, 0xE4, 0xCC, 0xA3,
+0xAF, 0xD8, 0x7F, 0xFB, 0xCF, 0xFE, 0x00, 0x8B, 0x13, 0x94, 0x2B, 0x68, 0x5D, 0x9F, 0x05, 0x39,
+0xF8, 0xC7, 0xFF, 0xD1, 0x2F, 0x87, 0x9F, 0x06, 0x41, 0x7B, 0x0C, 0x04, 0xE6, 0xD0, 0x5D, 0xBB,
+0x60, 0x66, 0xDC, 0x28, 0x44, 0xEC, 0x2E, 0x38, 0xD4, 0x33, 0xD2, 0x92, 0x3E, 0x59, 0x47, 0xA0,
+0x74, 0x8D, 0x22, 0xE0, 0x82, 0x66, 0x4C, 0xA6, 0x16, 0xB9, 0x82, 0x45, 0x8E, 0xF9, 0x0E, 0xBF,
+0xF2, 0xC5, 0x27, 0x54, 0xCD, 0xB1, 0x74, 0x28, 0x1A, 0x3C, 0x01, 0x62, 0x07, 0xE5, 0x84, 0x26,
+0xDB, 0x2D, 0x1B, 0x6F, 0x80, 0xD8, 0x41, 0x19, 0x21, 0xA9, 0x62, 0xB4, 0x6D, 0x2D, 0xB1, 0xE3,
+0xE2, 0xFF, 0xC1, 0xE1, 0x93, 0xE1, 0x5F, 0xFD, 0xEB, 0x3F, 0x0D, 0x47, 0xE1, 0x37, 0x47, 0xA5,
+0xFD, 0xEB, 0x3F, 0xFF, 0xD9, 0xF0, 0x8F, 0x7E, 0xF3, 0xE7, 0xC4, 0x91, 0xFD, 0x00, 0x16, 0x65,
+0xB6, 0x7D, 0x2B, 0xCC, 0xA6, 0x24, 0x17, 0xF7, 0x82, 0x5C, 0xED, 0xDA, 0xBD, 0x35, 0xBC, 0x0D,
+0xBF, 0xC0, 0x4B, 0xF0, 0x6B, 0xBB, 0x72, 0x7D, 0x54, 0x48, 0xDD, 0x04, 0xFA, 0x44, 0x62, 0xF7,
+0xF3, 0x54, 0xF5, 0x2A, 0xC4, 0xEE, 0x4C, 0xF8, 0x36, 0x82, 0x07, 0x46, 0xD0, 0x57, 0x7E, 0xAF,
+0xEF, 0x00, 0x16, 0xFF, 0xE9, 0x3F, 0xFE, 0x95, 0xF0, 0x73, 0x20, 0x80, 0x8F, 0x82, 0xF0, 0x1E,
+0x00, 0x21, 0xD9, 0x8D, 0x7A, 0xF7, 0xE3, 0x1A, 0xFA, 0xEC, 0x31, 0xA5, 0x0A, 0x15, 0x20, 0xF6,
+0x9B, 0x7F, 0xCF, 0x32, 0xE0, 0x04, 0x24, 0x6F, 0x03, 0x02, 0x35, 0xFE, 0xDE, 0xDF, 0xF9, 0xE9,
+0xF0, 0xEB, 0xBF, 0xF2, 0xC5, 0xF0, 0xE8, 0x83, 0x07, 0x84, 0x70, 0xF0, 0x41, 0xB2, 0x23, 0x7D,
+0x00, 0xFE, 0x4C, 0xCA, 0x3E, 0x83, 0x8F, 0x17, 0x15, 0xFB, 0x67, 0x3F, 0xFB, 0x48, 0x85, 0xC0,
+0xF2, 0xF3, 0x41, 0x53, 0xF1, 0xBF, 0xF8, 0x1F, 0xFF, 0x2C, 0xFC, 0x04, 0xD1, 0xBE, 0xD7, 0x41,
+0x5A, 0x98, 0xA2, 0xE9, 0xD1, 0x47, 0x0F, 0x85, 0xFF, 0xD3, 0x3F, 0xFE, 0x55, 0x21, 0xD4, 0xF7,
+0x81, 0xF8, 0x32, 0xA2, 0x77, 0x07, 0xCC, 0xA6, 0x87, 0x0E, 0xEC, 0x0C, 0x9F, 0x7A, 0xE2, 0xDE,
+0x70, 0xCF, 0xDD, 0x7B, 0x85, 0xEC, 0x9E, 0x44, 0x00, 0xCC, 0x38, 0xEE, 0x43, 0x75, 0x93, 0x7E,
+0x8A, 0x24, 0xA2, 0x7E, 0x28, 0xB1, 0x1B, 0x02, 0xB1, 0x3B, 0x2F, 0xC1, 0x33, 0x23, 0x20, 0x3C,
+0x92, 0x12, 0x06, 0x73, 0xF9, 0xE7, 0xA1, 0x48, 0xFE, 0xC3, 0xBF, 0xFF, 0xB3, 0xE1, 0x33, 0x4F,
+0xDE, 0x8F, 0x80, 0x8A, 0xED, 0xC0, 0x70, 0x93, 0x44, 0xCB, 0x1E, 0x3A, 0xB8, 0x0B, 0x51, 0xCA,
+0x3B, 0xC2, 0x61, 0xF8, 0xB4, 0xD1, 0x04, 0x3F, 0x03, 0x52, 0xD5, 0x07, 0xC5, 0xEC, 0x69, 0x28,
+0x67, 0x1E, 0xD1, 0xCA, 0xAF, 0x0A, 0xCE, 0x83, 0xBB, 0x30, 0x06, 0x4F, 0xA3, 0x2D, 0x4F, 0x82,
+0x84, 0xF5, 0x81, 0xB0, 0xBD, 0x0C, 0xB3, 0x7F, 0x07, 0xEA, 0xFE, 0x87, 0xFF, 0xC1, 0xCF, 0x86,
+0x5F, 0xF9, 0xFA, 0xE7, 0xC2, 0xE7, 0x40, 0xA2, 0x9E, 0x01, 0x79, 0xFC, 0xCC, 0xA7, 0xEE, 0x43,
+0x70, 0xCC, 0x01, 0xA4, 0x0B, 0x59, 0x2F, 0x56, 0x03, 0xFA, 0x27, 0xFE, 0xC1, 0x9F, 0xFC, 0x30,
+0x7C, 0x07, 0xF8, 0x5F, 0x83, 0x09, 0xB4, 0x0B, 0xA4, 0x90, 0x24, 0xED, 0x1F, 0xFD, 0xFD, 0x9F,
+0x93, 0xC8, 0x6A, 0xFE, 0x80, 0x20, 0xF6, 0xDB, 0x41, 0x90, 0xF7, 0xEF, 0xDB, 0x26, 0xA4, 0x95,
+0xE4, 0x8E, 0x41, 0x3C, 0x9C, 0x6B, 0xFC, 0x3E, 0x9B, 0xC6, 0xBA, 0xF7, 0x04, 0xEE, 0xBD, 0x13,
+0x0A, 0x5F, 0x6D, 0xEA, 0x2F, 0xFE, 0x90, 0xF9, 0x6D, 0x90, 0xC6, 0xBF, 0xF8, 0xF6, 0x8B, 0xE1,
+0x43, 0x10, 0x3C, 0x8E, 0xC3, 0xDD, 0xC0, 0xEB, 0x3F, 0xF9, 0x0F, 0x7F, 0x39, 0x7C, 0x0D, 0x91,
+0xDF, 0xAC, 0x7F, 0x2F, 0xC6, 0x68, 0x07, 0x7C, 0x2B, 0x49, 0x1E, 0x49, 0x88, 0x1F, 0x00, 0x21,
+0xA7, 0x5F, 0x26, 0x95, 0x40, 0xFA, 0x99, 0x5E, 0xC2, 0xBC, 0xBF, 0x06, 0xD3, 0x39, 0xD7, 0x7A,
+0x92, 0xF5, 0xE2, 0x63, 0xB7, 0xC4, 0x37, 0x39, 0x27, 0x15, 0x59, 0x37, 0x53, 0x9D, 0x9C, 0xBD,
+0x7A, 0x5D, 0xCC, 0x70, 0xAA, 0x58, 0x2D, 0xFD, 0xF5, 0x9F, 0x74, 0x87, 0x54, 0x30, 0x2E, 0x43,
+0x76, 0x2A, 0x5F, 0x96, 0x4C, 0xC8, 0x48, 0x95, 0xD6, 0x31, 0x79, 0x70, 0x91, 0x8D, 0x5C, 0x40,
+0xC5, 0x36, 0x5D, 0x5A, 0x6B, 0xDA, 0x92, 0x3B, 0xA4, 0xC7, 0x32, 0x5E, 0xB6, 0xF2, 0xD7, 0x56,
+0x66, 0xAB, 0xA0, 0xB6, 0x7D, 0x79, 0x13, 0xD4, 0xC4, 0xAB, 0x37, 0xF2, 0xDB, 0xC5, 0xBC, 0x66,
+0x72, 0xB2, 0xE6, 0x3D, 0xEB, 0x89, 0xF8, 0xD9, 0x75, 0x76, 0x43, 0xBC, 0x6B, 0xC3, 0x2F, 0xDD,
+0xB1, 0xF0, 0xFA, 0xE1, 0x8F, 0xC2, 0x8F, 0xDE, 0xFC, 0x20, 0xBC, 0x01, 0xE5, 0x73, 0x1C, 0x0E,
+0xA1, 0xB7, 0xEA, 0xE0, 0x17, 0xC5, 0xA1, 0xCD, 0x30, 0x15, 0xA3, 0xD3, 0xD1, 0x1C, 0x6B, 0xBD,
+0x73, 0x1C, 0xDC, 0x17, 0xD1, 0xDB, 0xE8, 0x6A, 0x9D, 0x76, 0xD7, 0xFB, 0xAB, 0x6A, 0x9B, 0x3C,
+0x8C, 0xA4, 0x24, 0x84, 0x78, 0xA2, 0x3A, 0x3E, 0x5E, 0x2E, 0x0D, 0x5B, 0xBC, 0x5A, 0xD2, 0xD1,
+0xCC, 0xC2, 0x2C, 0x3C, 0x05, 0x53, 0x3F, 0xBD, 0x6B, 0xD6, 0x23, 0xDA, 0x6F, 0x13, 0x7C, 0xEC,
+0x56, 0x3B, 0x1A, 0x96, 0x51, 0x61, 0x97, 0x11, 0x11, 0x47, 0x1F, 0xBB, 0x4B, 0xF8, 0xCB, 0x9D,
+0x33, 0x90, 0x5F, 0x61, 0x41, 0xDB, 0xD9, 0x6F, 0x99, 0xF7, 0x79, 0x87, 0xE3, 0x00, 0xFA, 0xC9,
+0xF4, 0x7E, 0x5E, 0x54, 0xA1, 0xCD, 0x27, 0xAA, 0xE1, 0x67, 0xF0, 0xC4, 0xAB, 0x0D, 0x20, 0x57,
+0xA6, 0xF9, 0x6B, 0x9F, 0xFD, 0xA7, 0xD9, 0x7C, 0x9F, 0x6C, 0xAB, 0xF6, 0x89, 0xF5, 0xE6, 0x58,
+0x30, 0xD5, 0x49, 0xD2, 0x0E, 0x21, 0x05, 0x0A, 0x49, 0xDD, 0x23, 0x9B, 0xBB, 0x44, 0x71, 0x23,
+0xD9, 0x5A, 0xCA, 0xDA, 0xD9, 0x0F, 0xE5, 0xEC, 0x41, 0x90, 0xBE, 0x27, 0x70, 0xCD, 0x03, 0xF8,
+0x4B, 0x45, 0x8E, 0xF3, 0x75, 0x17, 0xC8, 0xD6, 0xA3, 0xA8, 0x83, 0x64, 0x70, 0x2F, 0xC8, 0xD7,
+0x06, 0xA8, 0x79, 0xF9, 0xBC, 0xA1, 0x69, 0xFF, 0x2C, 0xD4, 0x40, 0x9A, 0x56, 0x2F, 0x41, 0xE5,
+0xE3, 0xFB, 0x54, 0x05, 0x9F, 0xDE, 0xDE, 0x1D, 0x3E, 0x83, 0xC7, 0xA7, 0xF1, 0xE0, 0xB5, 0xAC,
+0xE3, 0x53, 0x48, 0x9B, 0xE2, 0xE7, 0x48, 0x3A, 0xA9, 0x20, 0x9E, 0x40, 0xD0, 0xC6, 0x9B, 0x97,
+0x27, 0x25, 0x82, 0x77, 0x1C, 0x81, 0x1A, 0x37, 0xFB, 0xA0, 0xF3, 0xF9, 0x9B, 0x58, 0xA0, 0x5E,
+0x83, 0x33, 0xFA, 0x2C, 0xE6, 0xDE, 0x41, 0x90, 0x38, 0xAA, 0x3E, 0xCF, 0x22, 0xF5, 0xC6, 0x93,
+0x50, 0x67, 0x1E, 0x80, 0xD2, 0xB5, 0x17, 0x0B, 0x1A, 0x7D, 0xC9, 0xE8, 0x43, 0xC6, 0x85, 0xF3,
+0x0B, 0x9F, 0x79, 0x08, 0x29, 0x41, 0x1E, 0x95, 0x34, 0x15, 0xFC, 0x2E, 0x3A, 0x6E, 0x79, 0xCD,
+0xE8, 0x0B, 0xD7, 0x18, 0xE5, 0x6F, 0xAC, 0x54, 0xA3, 0x7D, 0x65, 0xCE, 0x35, 0x06, 0x0F, 0x30,
+0xEA, 0x92, 0xDF, 0x96, 0x0F, 0x22, 0xD5, 0xC4, 0xB3, 0x20, 0x2E, 0x5F, 0x40, 0x3F, 0xD8, 0x5E,
+0x12, 0x31, 0xAA, 0x84, 0x24, 0x76, 0x54, 0x93, 0x9E, 0x00, 0x11, 0xFA, 0x22, 0x4C, 0x6C, 0xCF,
+0x3C, 0xFD, 0x00, 0xD4, 0xBA, 0xFE, 0x70, 0x12, 0xBE, 0x73, 0xF4, 0xEB, 0xE2, 0xE7, 0x6B, 0xA9,
+0x96, 0xF1, 0xB3, 0x41, 0xE2, 0xCA, 0x34, 0x2F, 0x9F, 0x07, 0xE9, 0x7A, 0x02, 0x24, 0x85, 0x0A,
+0xDC, 0x1E, 0x90, 0x1C, 0x62, 0x73, 0x37, 0x88, 0xCE, 0xE7, 0x41, 0x50, 0x3E, 0x0D, 0x82, 0x42,
+0x73, 0xE3, 0x10, 0xEA, 0x7C, 0x0F, 0x84, 0x93, 0xEE, 0x44, 0xDD, 0x20, 0x33, 0x54, 0x7D, 0x3E,
+0x0B, 0x73, 0x2D, 0xC9, 0x0D, 0x89, 0xE3, 0x0E, 0x98, 0x1D, 0xF7, 0xC3, 0x2C, 0xCC, 0xB4, 0x19,
+0xCF, 0xE0, 0xFC, 0x2E, 0x10, 0x88, 0x4E, 0x28, 0x7C, 0x83, 0x20, 0x61, 0x24, 0xC1, 0x24, 0x71,
+0xB9, 0x6F, 0x18, 0x95, 0xBC, 0x23, 0x20, 0x51, 0xE2, 0xD8, 0x0F, 0xBF, 0x31, 0x4E, 0x58, 0xAA,
+0xA8, 0x9F, 0xC3, 0x78, 0x7C, 0x01, 0xFD, 0x21, 0x09, 0xDF, 0x8B, 0xFE, 0x91, 0x9C, 0xEE, 0x06,
+0x89, 0x79, 0xE8, 0xFE, 0xBB, 0x64, 0x2C, 0xBF, 0x0C, 0xD5, 0xF2, 0x59, 0x04, 0x84, 0xDC, 0x0B,
+0x15, 0x70, 0x96, 0xAE, 0x1F, 0x18, 0x6B, 0x9A, 0x65, 0x19, 0xB4, 0xB1, 0xD8, 0xC1, 0x6F, 0x57,
+0x06, 0xEC, 0xB1, 0xCD, 0x9F, 0x47, 0x1D, 0x9F, 0x03, 0x41, 0x26, 0xA9, 0x66, 0x3F, 0x49, 0x72,
+0xF6, 0x82, 0x18, 0x33, 0xA5, 0x07, 0x15, 0xAD, 0xCF, 0x3C, 0x75, 0xBF, 0xA8, 0x68, 0x54, 0xE6,
+0xDE, 0x84, 0x6F, 0x23, 0x73, 0xD5, 0xB9, 0x19, 0x99, 0x3F, 0x02, 0x49, 0xF2, 0x9E, 0x84, 0xAA,
+0xF9, 0x0C, 0xCA, 0x3D, 0x85, 0x39, 0x75, 0x10, 0xEA, 0x5C, 0x07, 0x7D, 0x78, 0x25, 0xB5, 0xC9,
+0x4E, 0x39, 0x47, 0x42, 0xC7, 0xC7, 0xA7, 0x91, 0x2E, 0xE6, 0x1E, 0xE0, 0x48, 0x35, 0x91, 0x7D,
+0xBF, 0x80, 0x7E, 0xBE, 0xCA, 0xFE, 0xC2, 0x95, 0x88, 0xCA, 0x18, 0xE7, 0xE4, 0x97, 0x31, 0x37,
+0xA9, 0xD4, 0x3D, 0x05, 0xB2, 0x46, 0xC2, 0x48, 0xBF, 0x4F, 0x8E, 0xB1, 0xA8, 0xA1, 0x9C, 0x9B,
+0x78, 0x8F, 0xE4, 0xEA, 0x01, 0x10, 0x40, 0x9A, 0x96, 0x39, 0x06, 0xAF, 0xBC, 0x7E, 0x44, 0xA2,
+0x59, 0xF3, 0x83, 0x04, 0x97, 0x73, 0xF7, 0x05, 0xFC, 0xE8, 0xE0, 0x3D, 0x48, 0x04, 0xB7, 0x82,
+0x20, 0x72, 0x5E, 0x68, 0xFD, 0x50, 0x27, 0x41, 0x5C, 0xB7, 0x63, 0x9C, 0x58, 0x3F, 0xB1, 0xB8,
+0x1F, 0x9F, 0x07, 0xBE, 0xFF, 0x25, 0xA8, 0x97, 0x4F, 0xA3, 0xBD, 0xDC, 0x43, 0xFB, 0x18, 0x48,
+0xE4, 0x24, 0x88, 0x71, 0x3D, 0xC1, 0xA9, 0xD1, 0x39, 0x7C, 0xA3, 0xE5, 0x3E, 0x51, 0xDF, 0xCA,
+0xEA, 0xC8, 0x09, 0x87, 0x59, 0xF8, 0x1C, 0x9C, 0xC3, 0x80, 0x72, 0x9F, 0x58, 0x2A, 0x3A, 0xF4,
+0xC6, 0x5A, 0xF6, 0xAB, 0xCD, 0xEC, 0x78, 0xE2, 0x97, 0x24, 0x9F, 0x54, 0xCA, 0x5E, 0x7E, 0x5D,
+0x32, 0xCB, 0x45, 0xB5, 0x42, 0x54, 0x9D, 0xCC, 0x6F, 0xCB, 0xCD, 0x56, 0xD9, 0x4A, 0x2A, 0xA4,
+0xCE, 0xAB, 0x12, 0x1F, 0x2D, 0x59, 0x6A, 0xD5, 0x5F, 0xCB, 0x74, 0x8F, 0x64, 0x10, 0xF3, 0x67,
+0x6A, 0x02, 0x53, 0x7F, 0x30, 0xF3, 0x91, 0xCB, 0xBE, 0x36, 0xE2, 0x1E, 0xB1, 0xE6, 0xF3, 0xA5,
+0xAA, 0xA1, 0xF9, 0x41, 0xF9, 0xBD, 0x2D, 0x05, 0x8A, 0x98, 0x74, 0x85, 0xAB, 0xC0, 0x2F, 0x8D,
+0x24, 0x93, 0x2A, 0x0D, 0xFB, 0x44, 0xB2, 0x2B, 0x7E, 0x7A, 0xBA, 0x78, 0x6B, 0xDE, 0x3C, 0xEB,
+0x2B, 0xEF, 0xDD, 0x8D, 0x74, 0x02, 0x9D, 0x3D, 0xF2, 0xCB, 0x67, 0x02, 0x18, 0x7E, 0x88, 0xE8,
+0xA5, 0x3F, 0xF9, 0xC1, 0x2B, 0xE1, 0x1A, 0x24, 0xF6, 0x5B, 0x75, 0x90, 0x20, 0xDC, 0x45, 0xA2,
+0xC0, 0xA6, 0xD2, 0xCF, 0xAE, 0xC5, 0xCC, 0x7B, 0xD2, 0x17, 0xF3, 0x01, 0x33, 0xDC, 0xDC, 0x97,
+0x2E, 0xEE, 0x0C, 0x62, 0x7D, 0x77, 0x5F, 0x31, 0xC7, 0x40, 0xE5, 0x27, 0xC5, 0x48, 0x75, 0x28,
+0x55, 0x55, 0xDD, 0x57, 0x2F, 0x96, 0x17, 0x55, 0xD0, 0xFC, 0xCE, 0x38, 0x26, 0xB6, 0x92, 0xCF,
+0x01, 0x1F, 0xE8, 0x86, 0x61, 0x8C, 0xBC, 0x0A, 0xD7, 0xEE, 0x5A, 0xDF, 0x2D, 0xBE, 0x65, 0xAB,
+0x7D, 0x30, 0x32, 0xEC, 0x23, 0x44, 0xC3, 0x52, 0x49, 0xA5, 0x27, 0xB1, 0x24, 0xDD, 0x9E, 0x85,
+0x09, 0x3D, 0x6A, 0x69, 0xDE, 0x56, 0xF5, 0x21, 0x14, 0x1C, 0x32, 0x3F, 0x41, 0xF7, 0xAF, 0x73,
+0xFF, 0x39, 0xF7, 0x91, 0x73, 0x9F, 0x3B, 0xF5, 0x03, 0xD3, 0x89, 0x9B, 0xFB, 0x25, 0xAA, 0xDF,
+0x5D, 0xAA, 0x3B, 0xBE, 0x36, 0x75, 0x9A, 0x6A, 0x53, 0x37, 0x4C, 0xB1, 0x24, 0x2F, 0xFD, 0x20,
+0x76, 0xDB, 0x06, 0xF8, 0x5C, 0x23, 0xAE, 0x6F, 0x57, 0xB5, 0xAE, 0x76, 0xAC, 0x96, 0xFD, 0x9E,
+0xA8, 0x33, 0xB8, 0x19, 0x45, 0x5E, 0x72, 0xE8, 0x05, 0x52, 0x23, 0xC6, 0xE4, 0x5A, 0x4B, 0xDD,
+0x8B, 0x5B, 0xE8, 0x7D, 0xC0, 0xC8, 0x57, 0xA4, 0x37, 0xE1, 0xF7, 0xC8, 0x5D, 0xEB, 0xDA, 0xC3,
+0xAF, 0x1D, 0xEA, 0x0F, 0x7F, 0xE7, 0xEE, 0x7E, 0xC9, 0x97, 0x97, 0x9B, 0x6C, 0x39, 0x65, 0xE9,
+0x6F, 0xF7, 0x85, 0x9D, 0x3D, 0xE1, 0x97, 0x0F, 0x22, 0xB1, 0x32, 0xCC, 0xAF, 0xB0, 0xCE, 0x22,
+0x45, 0xCA, 0x6C, 0xF8, 0x31, 0xD4, 0xBE, 0x21, 0x66, 0x34, 0xBE, 0xC9, 0x07, 0x4D, 0xA9, 0xDF,
+0x82, 0x99, 0xF1, 0xDA, 0x10, 0x22, 0xE8, 0xB1, 0x98, 0x7E, 0x09, 0xAA, 0x0F, 0x73, 0xBC, 0x2D,
+0x95, 0x27, 0x8E, 0x29, 0x24, 0xB8, 0xB8, 0xD1, 0x47, 0x6C, 0x3D, 0xF2, 0xC9, 0x71, 0xBE, 0x30,
+0xF8, 0x48, 0xFC, 0xE6, 0x16, 0x53, 0x73, 0x09, 0x92, 0x7C, 0x26, 0xF9, 0xB8, 0xB9, 0x9D, 0x60,
+0xD2, 0xD8, 0x6F, 0x7E, 0xEF, 0xD5, 0x70, 0x1D, 0x6E, 0x0D, 0x03, 0x30, 0x15, 0x7F, 0x1D, 0x0A,
+0xD0, 0x67, 0xB1, 0xC0, 0xB3, 0x9D, 0xF5, 0x0E, 0x2A, 0xF4, 0x24, 0x27, 0xBF, 0x86, 0xF6, 0x1F,
+0x84, 0x09, 0x95, 0x7E, 0x7B, 0xD2, 0xBC, 0xA5, 0x9A, 0xC5, 0x37, 0xF1, 0x19, 0x5D, 0xDF, 0xD3,
+0x81, 0x1C, 0x66, 0x9F, 0xC2, 0x62, 0xBF, 0xA1, 0x6E, 0xD4, 0x2A, 0x23, 0x39, 0x49, 0x3C, 0xB6,
+0x83, 0x00, 0xD1, 0xAF, 0xB0, 0x0D, 0x3F, 0x16, 0xE7, 0x30, 0x49, 0x06, 0x10, 0x6D, 0xFF, 0x04,
+0x88, 0xC0, 0xDD, 0x20, 0x1F, 0xB5, 0xE6, 0x55, 0x26, 0x5C, 0xA6, 0xF9, 0xF4, 0x21, 0x10, 0xB3,
+0x7E, 0xE4, 0x86, 0xA3, 0x79, 0x73, 0x14, 0x6A, 0xDC, 0x19, 0xA8, 0x7D, 0xB9, 0x6F, 0x18, 0x23,
+0x7C, 0x19, 0xE0, 0x72, 0x09, 0xBE, 0x5D, 0xB3, 0xF8, 0x3E, 0x1F, 0x80, 0x3A, 0xF6, 0x24, 0xC8,
+0xCD, 0x2F, 0xFC, 0xDC, 0x67, 0xC2, 0x86, 0x25, 0x72, 0x95, 0xD2, 0x7C, 0x48, 0x35, 0xEF, 0xA7,
+0xD0, 0x6E, 0x06, 0x84, 0x91, 0x08, 0x7F, 0x1B, 0xA6, 0x77, 0xAA, 0x61, 0x8B, 0x1E, 0xF8, 0x6E,
+0x26, 0x89, 0x7D, 0xFA, 0xD3, 0x0F, 0x81, 0xE0, 0xC0, 0x77, 0x6D, 0x11, 0x2C, 0x99, 0x93, 0xF0,
+0x6B, 0x3F, 0xFD, 0x74, 0xD8, 0x0B, 0x25, 0x8F, 0xDF, 0x35, 0x97, 0xE0, 0x1B, 0x48, 0xD2, 0x49,
+0x92, 0x5F, 0xEF, 0xE0, 0x67, 0x87, 0x84, 0x8A, 0xDF, 0xFD, 0x7C, 0xC8, 0xF3, 0x45, 0x3E, 0x40,
+0xEC, 0xFB, 0x31, 0x04, 0x31, 0x1C, 0x46, 0xE0, 0x04, 0x77, 0x7A, 0xA1, 0xB9, 0xF6, 0x1F, 0xC0,
+0x57, 0xF2, 0x37, 0xE1, 0xEF, 0x49, 0x62, 0x59, 0x2F, 0x6A, 0x98, 0x3F, 0x48, 0x3F, 0x0D, 0x65,
+0xF1, 0x7F, 0xF7, 0x9B, 0x5F, 0x0B, 0x7F, 0x9B, 0xF3, 0x93, 0x79, 0x0A, 0xC7, 0xA7, 0xC3, 0xB7,
+0xFF, 0x7A, 0x61, 0x7F, 0x29, 0x1C, 0xBD, 0x8E, 0x80, 0x09, 0x46, 0xE4, 0x8E, 0x42, 0x71, 0xE3,
+0x8F, 0x3B, 0xAA, 0x71, 0xBF, 0x06, 0x7F, 0xBA, 0x1D, 0x3B, 0x36, 0x2E, 0xFA, 0x5D, 0x47, 0x97,
+0x26, 0xAA, 0x8A, 0xBF, 0xF9, 0x77, 0xBF, 0x2A, 0x91, 0xDD, 0xE2, 0x0F, 0x68, 0xDF, 0x9D, 0x37,
+0x77, 0x66, 0x2F, 0x5F, 0xDB, 0xEA, 0xAF, 0x52, 0xCB, 0xB7, 0x61, 0x45, 0x25, 0x28, 0x8B, 0x1F,
+0x39, 0x73, 0x31, 0x1C, 0x81, 0x29, 0x96, 0x1B, 0xBC, 0x33, 0x21, 0xA2, 0x2B, 0x67, 0xCB, 0x55,
+0xA4, 0x04, 0x41, 0x17, 0x79, 0x27, 0x65, 0xB5, 0xD7, 0x78, 0x5D, 0xA6, 0x5F, 0xE8, 0x87, 0xDA,
+0x67, 0x98, 0x5D, 0xBB, 0xE8, 0x7D, 0x6C, 0x22, 0xBA, 0x92, 0x56, 0x2D, 0xE7, 0xBE, 0x7E, 0xF6,
+0x37, 0x2A, 0x47, 0xB5, 0xB3, 0x97, 0x0B, 0xAB, 0xB6, 0x51, 0x16, 0x62, 0xAB, 0xA4, 0x12, 0x09,
+0x15, 0xDF, 0x37, 0x6B, 0x99, 0x2C, 0x22, 0x46, 0xDC, 0xB2, 0x6B, 0x84, 0xBF, 0xC6, 0xB6, 0xFB,
+0x7D, 0xB0, 0x08, 0x23, 0xA1, 0x22, 0x7E, 0x2A, 0x4A, 0xA4, 0x2C, 0xD5, 0xA1, 0xAB, 0xF0, 0x39,
+0x78, 0x05, 0xFB, 0xC8, 0xBE, 0x0A, 0x13, 0xCA, 0x18, 0x7E, 0xA9, 0xDF, 0x8A, 0x83, 0xF9, 0xA3,
+0x36, 0x33, 0xFF, 0x15, 0xBC, 0xCC, 0xDB, 0xE6, 0xF1, 0xE1, 0x37, 0x53, 0x6A, 0x94, 0xDE, 0x4C,
+0x96, 0x52, 0x22, 0xA2, 0xF0, 0x28, 0x46, 0xF6, 0xD7, 0x4F, 0x79, 0xE3, 0x23, 0x99, 0x33, 0xA2,
+0x22, 0xEF, 0x67, 0x58, 0x7B, 0x1D, 0x95, 0x6F, 0x0F, 0x3D, 0x29, 0xFF, 0xE1, 0xE9, 0xAC, 0x10,
+0x3B, 0xF8, 0xFF, 0x91, 0x5C, 0x61, 0xE2, 0x1C, 0x42, 0xE0, 0x44, 0x33, 0x76, 0x9B, 0x18, 0xC7,
+0x17, 0xF8, 0x91, 0x0B, 0x83, 0xF8, 0xA5, 0x8B, 0xDD, 0x54, 0x70, 0xEF, 0x76, 0xF8, 0xD5, 0xB5,
+0xD1, 0x37, 0xD2, 0xC6, 0xD3, 0xCD, 0xB1, 0x09, 0x0A, 0x6B, 0xB3, 0x43, 0xE1, 0x7D, 0x37, 0x32,
+0x1F, 0x7B, 0xED, 0x84, 0x2E, 0xEB, 0xB3, 0x92, 0x3F, 0x87, 0xD4, 0xD4, 0x4E, 0x81, 0x41, 0xE7,
+0x5F, 0x9A, 0x35, 0xF3, 0xE2, 0x8B, 0xC9, 0x07, 0xC9, 0xDC, 0x8E, 0xFE, 0xAE, 0xB0, 0x0E, 0x8B,
+0xD9, 0x6A, 0x9B, 0xA4, 0x6F, 0xC5, 0x5C, 0xFC, 0xB8, 0xF7, 0x24, 0x66, 0x0B, 0xE3, 0x33, 0xAB,
+0xB5, 0x4E, 0x60, 0x51, 0x7F, 0x0F, 0x91, 0xAE, 0x4C, 0x46, 0x4C, 0xD5, 0x8F, 0x2A, 0xE1, 0x53,
+0xDB, 0xBA, 0xC2, 0x43, 0x48, 0xA9, 0xB2, 0x05, 0xBE, 0x78, 0xB5, 0x59, 0x51, 0xA8, 0x26, 0xD2,
+0xDF, 0xEE, 0x53, 0x5B, 0xBB, 0x45, 0x21, 0x5C, 0x07, 0x62, 0x3D, 0x0E, 0x1B, 0xF1, 0x51, 0x04,
+0x5C, 0x1C, 0xC3, 0x83, 0xFE, 0x7A, 0x37, 0xEB, 0xA0, 0x55, 0x84, 0x7E, 0x57, 0x6F, 0xBE, 0x75,
+0x44, 0x4C, 0x85, 0x24, 0x23, 0x9F, 0x7E, 0xEA, 0x81, 0x70, 0x1F, 0x54, 0xAE, 0xDA, 0xE4, 0xBA,
+0xF9, 0x3D, 0xE9, 0x77, 0x49, 0xC5, 0xE9, 0xD3, 0x20, 0x77, 0x34, 0x4D, 0xD1, 0x8F, 0x4B, 0xC2,
+0x76, 0x6F, 0x5E, 0xD3, 0x1A, 0xEA, 0xA2, 0xEC, 0x18, 0x01, 0x13, 0xE0, 0x87, 0x48, 0x7C, 0x4C,
+0xB5, 0x8E, 0xC1, 0xB2, 0x34, 0x15, 0x7F, 0x1A, 0xEA, 0x12, 0xD5, 0x15, 0xB6, 0xB3, 0xDE, 0xC1,
+0xAF, 0x9C, 0x7E, 0x92, 0x22, 0x28, 0x67, 0x54, 0x5D, 0xE8, 0x9B, 0x15, 0xBF, 0xA6, 0x17, 0xB9,
+0xB3, 0xFC, 0x5C, 0xC4, 0x75, 0x1B, 0x41, 0x64, 0xB8, 0xA8, 0x73, 0x77, 0x9A, 0x7A, 0x3F, 0x72,
+0x68, 0x76, 0xBC, 0x17, 0xCA, 0x16, 0xCD, 0x94, 0x92, 0x3F, 0x8D, 0x1F, 0x31, 0xF8, 0x5E, 0x91,
+0x00, 0x3F, 0x06, 0xA5, 0x90, 0x2A, 0x5D, 0xAD, 0x39, 0x90, 0x3E, 0xCF, 0x34, 0xC9, 0x32, 0xD9,
+0xEF, 0x7A, 0xA8, 0x5B, 0x73, 0xE8, 0x97, 0xF8, 0xA5, 0xC1, 0xA4, 0x4B, 0xD3, 0xA0, 0x2F, 0x4D,
+0x54, 0x15, 0x39, 0x56, 0x34, 0xAB, 0x92, 0x1C, 0xD2, 0xDC, 0xFA, 0x34, 0x54, 0x30, 0xE6, 0x7C,
+0xEB, 0x36, 0xB3, 0x77, 0xBD, 0xE6, 0xD3, 0x57, 0x8D, 0x6A, 0x1B, 0xC7, 0x76, 0x17, 0xCC, 0x96,
+0x53, 0x20, 0x85, 0x54, 0xD6, 0x38, 0xF6, 0x79, 0xF4, 0x69, 0x7E, 0x2D, 0xF1, 0xE8, 0x81, 0xCB,
+0xCE, 0x13, 0x50, 0xC8, 0xA8, 0x2A, 0x2E, 0x86, 0x25, 0x49, 0x29, 0xFD, 0xCA, 0x98, 0x5B, 0x90,
+0x3F, 0xDA, 0xE9, 0xD7, 0x76, 0x12, 0xEB, 0xB6, 0xB7, 0xBB, 0xB6, 0x3D, 0xC4, 0x51, 0x54, 0x48,
+0x03, 0x5C, 0x7C, 0xE2, 0x16, 0x99, 0x38, 0xC4, 0x80, 0xFE, 0x75, 0xE7, 0x41, 0x64, 0xBB, 0x40,
+0xD8, 0x98, 0x7C, 0x98, 0x6A, 0x31, 0xCD, 0xD8, 0x24, 0xD0, 0xF5, 0xF0, 0x17, 0x2C, 0xA1, 0x30,
+0x7F, 0x06, 0x73, 0xF3, 0xF3, 0x9F, 0x7D, 0x48, 0xE6, 0x32, 0xA7, 0xE6, 0xFB, 0x48, 0xDF, 0xC3,
+0x1C, 0x7A, 0x79, 0x34, 0xF6, 0x38, 0xFC, 0xCF, 0xDF, 0xC2, 0xF6, 0x9B, 0x97, 0x20, 0x1E, 0xD1,
+0x8C, 0xDC, 0x8F, 0x3A, 0xE9, 0x4B, 0x48, 0x9F, 0xBA, 0x7A, 0xFE, 0x78, 0xDE, 0x17, 0x8E, 0x1F,
+0x55, 0x3C, 0xFA, 0x6E, 0xD2, 0x1F, 0x90, 0x04, 0x38, 0x4E, 0xFE, 0x26, 0xBB, 0xA9, 0x7C, 0xA2,
+0x88, 0x1D, 0x07, 0x6C, 0x0C, 0xF9, 0x78, 0x5E, 0x3F, 0x7E, 0x2A, 0xBC, 0x79, 0xE2, 0x8C, 0xF8,
+0x9A, 0xF0, 0x57, 0x56, 0x54, 0x20, 0x96, 0xF8, 0xD8, 0xCB, 0x07, 0xC9, 0x7E, 0x14, 0x0A, 0xA9,
+0x93, 0xD7, 0xAA, 0x04, 0xE9, 0xCF, 0x6C, 0x23, 0x52, 0xA6, 0x7A, 0xE9, 0x1A, 0x69, 0x7E, 0x59,
+0xA6, 0x78, 0x69, 0x19, 0x53, 0x80, 0x6C, 0x02, 0xC6, 0xFD, 0x5E, 0x39, 0x0D, 0xA9, 0x76, 0xB0,
+0x6E, 0x53, 0x7D, 0x92, 0xD2, 0xA4, 0xD7, 0xB9, 0xC2, 0x14, 0xD5, 0x12, 0xBD, 0x43, 0x66, 0x4E,
+0x33, 0xA5, 0x4D, 0x54, 0x13, 0xFD, 0x15, 0x2B, 0xEA, 0x93, 0x7C, 0x79, 0xA8, 0xBA, 0xE2, 0x2A,
+0x8A, 0x07, 0x7D, 0x68, 0x50, 0x85, 0xD6, 0x2F, 0x77, 0xF7, 0xF6, 0xBB, 0x82, 0x63, 0x0A, 0x8C,
+0xEC, 0xB0, 0x21, 0x0B, 0xBA, 0x91, 0xDA, 0xAE, 0xDE, 0x30, 0x47, 0xD5, 0x8E, 0x69, 0x50, 0x80,
+0xE1, 0x39, 0xA4, 0x00, 0xF8, 0x43, 0xF8, 0x2C, 0x5E, 0x46, 0xF8, 0x79, 0xB3, 0xBF, 0x88, 0x65,
+0xD8, 0xD0, 0xDD, 0x0E, 0x90, 0x3A, 0x46, 0x23, 0x76, 0xC2, 0x9F, 0xAC, 0x8D, 0xD1, 0x59, 0xA2,
+0x04, 0xF1, 0x3D, 0xA5, 0xDB, 0x31, 0x92, 0xD8, 0x15, 0xAA, 0xD8, 0x77, 0x57, 0x29, 0x93, 0xDA,
+0xA4, 0xAA, 0x1C, 0x87, 0x55, 0xB1, 0xAC, 0x55, 0xF3, 0x64, 0xDC, 0xEC, 0x11, 0x15, 0x40, 0xC7,
+0x17, 0xE5, 0xB9, 0x30, 0x4F, 0xB6, 0x74, 0x84, 0x49, 0x9C, 0x63, 0xE2, 0x55, 0x26, 0x8A, 0x79,
+0x78, 0xDB, 0x3A, 0x44, 0x39, 0xAE, 0x7E, 0x44, 0xEC, 0x38, 0x7E, 0xBC, 0xBC, 0x77, 0x0E, 0x09,
+0x2F, 0x27, 0x27, 0xA1, 0x60, 0xCE, 0x29, 0x1E, 0xCC, 0xF0, 0xEF, 0xE3, 0x6B, 0x2A, 0xAE, 0x2B,
+0xB9, 0x15, 0xD5, 0x2D, 0x62, 0xA3, 0x2A, 0x9A, 0xCF, 0xC1, 0xF8, 0xE3, 0xC4, 0xD5, 0x91, 0x38,
+0xDF, 0x5D, 0xA5, 0x23, 0x46, 0x09, 0x63, 0x57, 0xE1, 0xFC, 0xB3, 0xC5, 0xD7, 0xDD, 0x5D, 0x34,
+0x35, 0x22, 0x88, 0x04, 0x5F, 0xD4, 0x07, 0xB0, 0x85, 0x18, 0xFF, 0x56, 0x7E, 0x70, 0x34, 0xB4,
+0xEC, 0x7E, 0xF2, 0x0A, 0xAD, 0x44, 0x48, 0x4A, 0x24, 0x7A, 0xE9, 0x7E, 0xD2, 0x6F, 0xF2, 0x9D,
+0xAB, 0x48, 0xC4, 0x8D, 0x71, 0xD8, 0xD1, 0xAB, 0x6A, 0xDC, 0x56, 0xF8, 0xF4, 0x2D, 0x75, 0x50,
+0xF8, 0x62, 0x2E, 0xBC, 0xAF, 0xEE, 0xE9, 0x45, 0xE4, 0x6E, 0x9B, 0x10, 0x16, 0x46, 0xD5, 0xBE,
+0x82, 0x14, 0x28, 0xF4, 0xBF, 0xBB, 0x59, 0x07, 0xAD, 0x22, 0x5C, 0x34, 0x2F, 0x41, 0xF1, 0xA2,
+0xF9, 0xF8, 0x5E, 0xA6, 0x05, 0xC1, 0x02, 0x5D, 0x6F, 0x07, 0x81, 0xDA, 0x7B, 0x72, 0x01, 0x65,
+0x30, 0x02, 0x03, 0x08, 0x36, 0x40, 0x65, 0x9A, 0x95, 0x7C, 0x5F, 0x6C, 0x9B, 0xFF, 0x92, 0xAA,
+0x5E, 0x21, 0x9F, 0xEF, 0xF8, 0x83, 0xE3, 0xE6, 0xF4, 0x80, 0x8A, 0x0B, 0xD3, 0x8F, 0xBC, 0x82,
+0xF4, 0x20, 0xA3, 0xB0, 0x42, 0xF4, 0x60, 0x81, 0xA5, 0x2A, 0x76, 0x00, 0x3B, 0x17, 0x70, 0xFB,
+0xAC, 0xE5, 0x0E, 0xAA, 0x4D, 0x3F, 0xF7, 0x95, 0x4F, 0x89, 0x19, 0x71, 0x59, 0x4E, 0xCA, 0xAF,
+0x11, 0x7C, 0x26, 0x36, 0x41, 0xE9, 0xDB, 0xC4, 0x00, 0x8C, 0x25, 0x14, 0x7D, 0x26, 0x1A, 0x7E,
+0x02, 0xEA, 0x5B, 0x2F, 0x7E, 0x58, 0x0B, 0x26, 0xC0, 0x79, 0x03, 0x08, 0xDB, 0xC3, 0x30, 0x5D,
+0x92, 0x64, 0xD5, 0x3B, 0xE8, 0x9B, 0xC6, 0xC0, 0x84, 0x4D, 0xDC, 0x79, 0x02, 0xC4, 0x8E, 0x6A,
+0xFE, 0x31, 0x58, 0x58, 0xDC, 0x5C, 0xCA, 0xCF, 0xDF, 0x08, 0x54, 0xA5, 0x23, 0x8C, 0x5A, 0x66,
+0x00, 0x01, 0xCC, 0xAD, 0x87, 0x40, 0x5A, 0x68, 0xDE, 0x6C, 0x64, 0xB7, 0x0A, 0x12, 0xCE, 0xFB,
+0xA1, 0x46, 0xDD, 0xF7, 0xD0, 0x5D, 0x32, 0xD6, 0x17, 0x40, 0x1A, 0xCF, 0x5F, 0xB8, 0x22, 0x96,
+0xB1, 0xBA, 0x07, 0x06, 0xAC, 0x7F, 0x5D, 0xAF, 0xCC, 0x87, 0xC5, 0xDA, 0xEC, 0xD7, 0x91, 0x64,
+0x3D, 0x8B, 0x79, 0x30, 0x00, 0xFF, 0x37, 0x46, 0x94, 0xD2, 0x5C, 0xBC, 0xBC, 0xBB, 0x8F, 0x4C,
+0x88, 0x25, 0x87, 0x48, 0x92, 0x23, 0xC3, 0xDF, 0x6F, 0x18, 0xDF, 0x93, 0xCC, 0x45, 0xC7, 0xA0,
+0x16, 0x9A, 0x98, 0x97, 0x3B, 0x38, 0x36, 0xFD, 0x20, 0xD2, 0x07, 0xF1, 0xA3, 0xE3, 0xD9, 0xCF,
+0x3F, 0x1E, 0x06, 0xD0, 0xF7, 0xB1, 0xD1, 0xD1, 0xF0, 0x16, 0x12, 0x57, 0xE7, 0xE9, 0x58, 0x18,
+0x34, 0xF4, 0x2E, 0xCE, 0x31, 0x28, 0x87, 0x11, 0xD1, 0x4C, 0xE7, 0xF2, 0x95, 0x2F, 0x3E, 0x06,
+0x95, 0x2F, 0x05, 0xE6, 0x2C, 0x76, 0x2F, 0xB6, 0x7E, 0x33, 0x7C, 0x45, 0x7F, 0xE1, 0x67, 0x9F,
+0x0E, 0x1B, 0x38, 0xA6, 0x96, 0x4C, 0x5E, 0xD6, 0xB2, 0xE5, 0x1A, 0x78, 0x13, 0xDF, 0xFF, 0x44,
+0x11, 0x3B, 0x7E, 0xFE, 0x39, 0x00, 0x87, 0x91, 0xCC, 0xF0, 0x28, 0xA4, 0x5D, 0xFA, 0x62, 0x09,
+0x5C, 0x15, 0xD5, 0x65, 0x71, 0x74, 0xEA, 0x4E, 0x17, 0x53, 0x37, 0x2A, 0x73, 0x89, 0x84, 0xA1,
+0xA6, 0x1A, 0x57, 0xFA, 0xD2, 0x69, 0xFD, 0x25, 0x9A, 0x14, 0x3D, 0x23, 0x60, 0xB1, 0x40, 0xFA,
+0xA5, 0xEA, 0xB7, 0x10, 0x52, 0x65, 0x6A, 0x88, 0xD6, 0xAF, 0x2D, 0x72, 0x0B, 0x6B, 0xFA, 0x79,
+0xE8, 0xAA, 0x9D, 0x16, 0x89, 0xBE, 0x74, 0xB9, 0x02, 0x93, 0xB5, 0x3B, 0x2A, 0x38, 0xDE, 0x09,
+0xC3, 0xC3, 0xFB, 0x50, 0xAB, 0xDA, 0xC9, 0x79, 0x49, 0x13, 0x00, 0x73, 0x09, 0x16, 0x6B, 0x30,
+0x2A, 0x38, 0x00, 0x4F, 0x85, 0x97, 0x3E, 0x3C, 0x11, 0x5E, 0x86, 0x72, 0x37, 0x84, 0xDD, 0x29,
+0x1A, 0x84, 0xF4, 0x26, 0x4E, 0x45, 0x38, 0xD3, 0x52, 0x09, 0x42, 0x44, 0x60, 0x27, 0x14, 0x3B,
+0xA6, 0x64, 0xD1, 0x1F, 0x39, 0x86, 0x51, 0x7A, 0x6A, 0xF7, 0x4C, 0x4A, 0x53, 0x5C, 0x33, 0x6A,
+0xD6, 0x0E, 0x85, 0x5A, 0xAF, 0xD7, 0xB7, 0x32, 0x45, 0x2A, 0x5F, 0x68, 0xFC, 0x3A, 0x23, 0x82,
+0xDA, 0x79, 0x33, 0x0F, 0x61, 0xF5, 0x6C, 0xC3, 0x2F, 0xEB, 0x75, 0x20, 0x31, 0xBB, 0x91, 0xFF,
+0x69, 0xB5, 0x4D, 0xB1, 0xF4, 0x19, 0x1D, 0x82, 0x52, 0x77, 0x0A, 0x0E, 0xCB, 0x13, 0xF8, 0x11,
+0x43, 0xA7, 0xF5, 0x76, 0x44, 0x07, 0x13, 0x0F, 0x6B, 0x7D, 0xEC, 0x8B, 0xF4, 0xCB, 0xDB, 0x1C,
+0x51, 0xC9, 0x96, 0x50, 0x9B, 0x6B, 0x69, 0x30, 0x2B, 0x1D, 0xCD, 0x94, 0xBA, 0x6C, 0x6D, 0xAD,
+0x1D, 0x78, 0x23, 0xBB, 0xFC, 0xA2, 0xE0, 0x17, 0x39, 0x95, 0xD5, 0x2E, 0x2C, 0xDE, 0x07, 0x36,
+0xF7, 0xAD, 0x29, 0xFF, 0xBA, 0x7A, 0x13, 0x39, 0xFF, 0x0E, 0x68, 0xF4, 0x4B, 0x79, 0x59, 0x22,
+0x80, 0x1B, 0xF1, 0x7B, 0x8B, 0xD1, 0xB6, 0xE7, 0xB0, 0xA3, 0x05, 0xCD, 0x46, 0x0F, 0xC0, 0xF4,
+0xCA, 0x28, 0xD8, 0xDE, 0x65, 0x92, 0x0E, 0xB3, 0x0D, 0x54, 0xF7, 0x1E, 0xD8, 0xD8, 0x25, 0xDB,
+0xA1, 0x31, 0x68, 0x82, 0x19, 0x01, 0x3E, 0xC4, 0x4E, 0x15, 0x24, 0x8A, 0x37, 0xEB, 0xA0, 0x7B,
+0x06, 0x77, 0x01, 0x60, 0xCE, 0xB4, 0x6E, 0x28, 0x40, 0x8C, 0x2E, 0xDC, 0x8B, 0x08, 0xC8, 0x46,
+0xA2, 0xE6, 0xD9, 0x9F, 0xCD, 0xD8, 0x12, 0x8C, 0x2A, 0x93, 0x46, 0x9A, 0xBA, 0xB9, 0xBF, 0x91,
+0xD6, 0x35, 0x82, 0xDE, 0xF2, 0xF5, 0x8C, 0x41, 0x71, 0x79, 0x1D, 0x39, 0xCB, 0xF8, 0x60, 0x74,
+0x23, 0x09, 0x15, 0xA3, 0x54, 0xE9, 0x63, 0xC6, 0x88, 0xCB, 0xE5, 0x0E, 0xAA, 0x4D, 0x74, 0x76,
+0xA7, 0x9A, 0x45, 0x75, 0x7A, 0xB9, 0x2F, 0xC3, 0x76, 0x98, 0x55, 0x77, 0xEC, 0xD8, 0x82, 0xDD,
+0x69, 0xF0, 0x7D, 0x4A, 0xF6, 0xBD, 0xC8, 0x41, 0x73, 0x20, 0xFD, 0xD9, 0xBA, 0xF1, 0xDD, 0xCB,
+0xEF, 0x17, 0xEE, 0xD0, 0xB1, 0x01, 0xF9, 0xCF, 0xE8, 0xA7, 0xE5, 0xBB, 0x71, 0xD4, 0x5E, 0x4A,
+0x85, 0x74, 0x0F, 0x48, 0x0B, 0x49, 0x52, 0x3B, 0xBE, 0xA7, 0x49, 0xDE, 0xB8, 0xF7, 0x2E, 0x83,
+0x54, 0x78, 0x50, 0x69, 0xE2, 0xB6, 0x6D, 0xCC, 0x31, 0xC7, 0x1F, 0x5D, 0x0F, 0xC0, 0x7F, 0xEE,
+0x53, 0x30, 0x91, 0xD2, 0xAF, 0xAF, 0xD3, 0xA2, 0xD5, 0x97, 0xEA, 0x2F, 0xB7, 0x12, 0xDB, 0xB5,
+0x6B, 0x73, 0x78, 0x1C, 0xBE, 0x6E, 0xEC, 0x37, 0xA3, 0x76, 0x99, 0xC0, 0x99, 0x73, 0xA0, 0xF6,
+0xE0, 0xE8, 0xB4, 0x41, 0x39, 0xA6, 0x2A, 0x45, 0x85, 0x6F, 0xB1, 0x36, 0xFB, 0x75, 0xEC, 0x2F,
+0x31, 0xE4, 0xDE, 0xBB, 0x93, 0x98, 0x9F, 0xDC, 0x95, 0x82, 0xBB, 0x98, 0x7C, 0x9C, 0x83, 0x79,
+0x09, 0x99, 0x1F, 0x8E, 0xFB, 0xF0, 0xB2, 0x3D, 0xF4, 0xC5, 0xA3, 0xEF, 0x24, 0x77, 0x0A, 0x59,
+0xEE, 0xE0, 0x8F, 0xD3, 0x2E, 0x60, 0xC2, 0xF6, 0x53, 0x25, 0x5D, 0x0F, 0x02, 0xCF, 0xF9, 0xC1,
+0xE0, 0x20, 0x27, 0x76, 0x0C, 0x16, 0x21, 0xBE, 0x4C, 0xF3, 0xC3, 0x64, 0xD1, 0x24, 0xC7, 0x42,
+0x7C, 0x99, 0x58, 0x7B, 0x09, 0xF5, 0x33, 0xBF, 0xB7, 0xCC, 0x37, 0x10, 0x78, 0xAA, 0xB0, 0xB4,
+0x68, 0xDC, 0x8A, 0x1F, 0xBF, 0xCB, 0xCF, 0xF2, 0xE5, 0xD0, 0x6A, 0xD2, 0xFB, 0xAE, 0x56, 0xD1,
+0x54, 0x78, 0x16, 0x12, 0xE9, 0x79, 0x26, 0xA4, 0x34, 0xD2, 0x23, 0xC4, 0xA6, 0x9E, 0xD4, 0x99,
+0xAD, 0x63, 0x6C, 0xA6, 0x46, 0x9A, 0x9A, 0x1A, 0x66, 0x6A, 0x59, 0xA4, 0x0D, 0xC6, 0xAE, 0x44,
+0xD9, 0x11, 0xA5, 0x43, 0xCD, 0x98, 0x6E, 0xAA, 0x12, 0xC5, 0xCC, 0x55, 0x33, 0xD5, 0xE5, 0xA4,
+0xE7, 0x7E, 0x6F, 0x51, 0xD8, 0xA2, 0xCF, 0x9B, 0xBF, 0x13, 0xA9, 0x84, 0xA9, 0x79, 0x59, 0x94,
+0xA6, 0x37, 0x59, 0xAA, 0x72, 0x3F, 0x29, 0xFD, 0xB5, 0xA2, 0x74, 0xD5, 0x1A, 0x2F, 0xAA, 0xA2,
+0xAA, 0x71, 0x1E, 0xC1, 0x9B, 0x54, 0x3B, 0x69, 0xA4, 0xBC, 0xEF, 0xFC, 0x56, 0xFA, 0x13, 0xDB,
+0xAF, 0xDF, 0x49, 0xEA, 0x8B, 0xE7, 0xCA, 0x8C, 0x93, 0x46, 0xDC, 0xA3, 0xAB, 0x27, 0xCC, 0x43,
+0xB9, 0x6B, 0x41, 0x3A, 0x0F, 0x6E, 0x97, 0x75, 0x69, 0x18, 0x5B, 0xB4, 0x41, 0xB5, 0xA3, 0xFF,
+0x62, 0x6D, 0x3E, 0xA3, 0x66, 0x0C, 0x33, 0x77, 0x2F, 0xD8, 0x03, 0x3F, 0xB6, 0x0E, 0x9A, 0x62,
+0xA1, 0x50, 0xF9, 0x8F, 0x79, 0xD5, 0xEB, 0x92, 0x0F, 0xA1, 0xAA, 0x98, 0xD9, 0x78, 0x88, 0xB2,
+0xA7, 0xFD, 0xCB, 0x31, 0x72, 0x85, 0xCF, 0x73, 0xB8, 0xB9, 0x72, 0x17, 0x31, 0xB3, 0x31, 0x4B,
+0x3E, 0x6A, 0x99, 0xAF, 0x18, 0xEA, 0xE4, 0xD7, 0x6F, 0x07, 0x48, 0x55, 0x1F, 0x62, 0x62, 0xB7,
+0x63, 0x11, 0xED, 0x87, 0x63, 0xD3, 0x6A, 0xFB, 0x92, 0xD1, 0x34, 0x7E, 0x0D, 0x59, 0xD2, 0xAF,
+0x22, 0x59, 0x28, 0x9D, 0xD6, 0x5B, 0x60, 0x86, 0xA5, 0x7F, 0x9D, 0xF8, 0x9E, 0xC4, 0xF9, 0x98,
+0x9E, 0xAB, 0x8F, 0x9D, 0xAA, 0x6D, 0xAE, 0xB8, 0x69, 0x10, 0x8D, 0xCE, 0x3D, 0x0D, 0x9A, 0xD5,
+0xF1, 0x97, 0x59, 0xE5, 0x75, 0xC8, 0x7C, 0xCE, 0xD4, 0xCC, 0x4C, 0xC1, 0xD4, 0x1F, 0x0A, 0xF6,
+0xF0, 0x6B, 0xF1, 0x97, 0x5F, 0x58, 0xFC, 0xD5, 0xCB, 0x2D, 0xB2, 0x9A, 0x95, 0xCF, 0xAF, 0x19,
+0xF3, 0x6E, 0xA9, 0x7B, 0x34, 0x4A, 0xE8, 0x56, 0xD2, 0x4E, 0x9A, 0x50, 0x3F, 0xC0, 0x16, 0x64,
+0xB4, 0x38, 0xF4, 0x81, 0xCC, 0x7D, 0x6E, 0x47, 0x4F, 0x18, 0x60, 0x3A, 0x93, 0x06, 0x0E, 0x0E,
+0xC7, 0x06, 0xF8, 0xD8, 0x3D, 0x89, 0x80, 0x0A, 0x06, 0x57, 0xB4, 0xE3, 0x04, 0x23, 0x64, 0x19,
+0x40, 0x71, 0xB3, 0x7E, 0x8C, 0xD1, 0x99, 0xFC, 0x0D, 0xAA, 0x18, 0x20, 0x0D, 0x03, 0x48, 0x5D,
+0x41, 0xC7, 0xFF, 0x01, 0xA8, 0x6F, 0x8D, 0x1E, 0x24, 0x08, 0x5C, 0xD0, 0xB7, 0x22, 0x4A, 0xB2,
+0x8B, 0x7B, 0xB7, 0x8A, 0xE2, 0xAE, 0xDF, 0x89, 0xB5, 0xC7, 0xCD, 0xA1, 0x72, 0xD5, 0x5A, 0x99,
+0x38, 0xF8, 0x2D, 0x04, 0x19, 0x70, 0xC1, 0x66, 0x34, 0x29, 0xF3, 0x9F, 0x3D, 0xFC, 0xE0, 0xE2,
+0xAA, 0x58, 0xBD, 0x7E, 0x0D, 0x80, 0x48, 0x7D, 0xFE, 0x29, 0xEC, 0x4B, 0x0A, 0x62, 0x25, 0xFB,
+0x2E, 0x2F, 0xA2, 0x22, 0x11, 0x73, 0x7E, 0x6F, 0x31, 0x90, 0x64, 0x29, 0x33, 0x35, 0xEF, 0x41,
+0x33, 0xE9, 0xEE, 0x9D, 0x9B, 0xE4, 0xC7, 0x21, 0xFD, 0xAF, 0x36, 0x22, 0x22, 0x97, 0x0F, 0x7E,
+0xF7, 0x2E, 0x75, 0xF0, 0xFD, 0x6E, 0x90, 0x90, 0x2E, 0x3C, 0xA8, 0xA3, 0x5D, 0x46, 0xFA, 0x11,
+0x57, 0xD4, 0x48, 0x62, 0x99, 0x4E, 0x66, 0x14, 0x44, 0x6F, 0x1D, 0x88, 0xD4, 0xCF, 0x40, 0x59,
+0xFA, 0xEA, 0x97, 0x9F, 0xA8, 0xBB, 0x03, 0xC7, 0x62, 0xF7, 0x18, 0x00, 0x79, 0x79, 0xE6, 0x53,
+0x0F, 0x88, 0x6F, 0xDE, 0x18, 0xBE, 0x73, 0x64, 0xEC, 0x6B, 0x02, 0x0A, 0xE4, 0x5A, 0x74, 0xB6,
+0x03, 0xC1, 0x64, 0x07, 0x60, 0xD6, 0x5E, 0xCA, 0xC4, 0xEB, 0xF7, 0xE1, 0x77, 0x05, 0x09, 0x69,
+0x07, 0x14, 0xBB, 0x69, 0x7C, 0x8F, 0x9D, 0xC5, 0xAE, 0x15, 0x4E, 0x48, 0x1B, 0x9D, 0x4B, 0xB5,
+0xE5, 0xA6, 0xD1, 0x4F, 0x9A, 0xD9, 0xB9, 0x37, 0x6D, 0x1F, 0x88, 0x16, 0x77, 0xB5, 0x68, 0x44,
+0x99, 0xCC, 0xEB, 0xE1, 0x0F, 0x54, 0x26, 0x30, 0xDE, 0x08, 0x7F, 0x48, 0x26, 0xF9, 0x66, 0x8E,
+0x46, 0xEE, 0x14, 0xC2, 0x83, 0x99, 0x22, 0xDE, 0x45, 0x54, 0xF4, 0x18, 0x92, 0xC2, 0xCF, 0x83,
+0xE4, 0x6D, 0x45, 0x84, 0xF0, 0xE7, 0x3F, 0xFD, 0x40, 0x58, 0xB7, 0xC4, 0x1E, 0xC4, 0xB5, 0x6D,
+0x64, 0xBF, 0x37, 0x61, 0x1B, 0xB5, 0xFD, 0x07, 0xF7, 0xA4, 0x1F, 0x43, 0x37, 0xEB, 0xC3, 0xD9,
+0x20, 0x70, 0x8D, 0x7D, 0x9B, 0x34, 0x58, 0xD9, 0x6A, 0x17, 0x9B, 0xC2, 0xA4, 0x3B, 0x83, 0x10,
+0xFA, 0xCB, 0x18, 0xD4, 0x51, 0x38, 0x0C, 0xF3, 0x4B, 0xA1, 0x95, 0x92, 0xF6, 0x0A, 0xBE, 0x1D,
+0x84, 0x12, 0x48, 0xF9, 0xDA, 0x8B, 0x94, 0x48, 0x25, 0x75, 0x4B, 0x27, 0xB2, 0x10, 0x0A, 0x2B,
+0x2A, 0x6B, 0x24, 0xCF, 0x39, 0x61, 0xD4, 0xD9, 0xAE, 0xDD, 0x76, 0x1E, 0xC6, 0x32, 0xF6, 0x70,
+0x8D, 0xC8, 0xFD, 0xF6, 0x2A, 0x5F, 0x6B, 0x42, 0x4A, 0xFD, 0xC7, 0x60, 0xDE, 0x16, 0x7F, 0xAE,
+0xFA, 0x8C, 0x54, 0x5C, 0xDB, 0x5E, 0x9F, 0x24, 0x7E, 0xDE, 0xEA, 0x62, 0xE9, 0xF8, 0x15, 0x94,
+0xB5, 0x59, 0xAB, 0xB1, 0xDA, 0x64, 0xC1, 0xD6, 0x2A, 0x5B, 0xF0, 0x21, 0x25, 0xA9, 0x0B, 0x50,
+0xEE, 0x5A, 0x90, 0x7C, 0x92, 0xBE, 0x5D, 0xAF, 0x20, 0x52, 0xE8, 0xC5, 0x0F, 0x8E, 0x87, 0xEB,
+0xF0, 0xDB, 0x68, 0xF6, 0x2F, 0x0D, 0x7E, 0xE1, 0xED, 0x82, 0x43, 0x7E, 0x3B, 0x88, 0x1D, 0xF7,
+0xB5, 0x75, 0x24, 0x72, 0x3C, 0x5D, 0x21, 0x95, 0xF6, 0x5B, 0xBF, 0xD2, 0x70, 0x64, 0x38, 0xCA,
+0xC9, 0xFC, 0xB5, 0x75, 0x5A, 0xFE, 0xD8, 0x22, 0x68, 0x17, 0xEA, 0x9F, 0x44, 0xC2, 0x95, 0xAC,
+0xE3, 0x7F, 0xE6, 0x8C, 0x63, 0xCE, 0x29, 0x0C, 0xF8, 0x7E, 0x10, 0xCE, 0x3E, 0xF8, 0x35, 0xD5,
+0xFB, 0xFD, 0x70, 0x33, 0xE7, 0xFD, 0x14, 0xC6, 0xE0, 0xA3, 0xCB, 0x48, 0x41, 0x33, 0x81, 0x48,
+0x2D, 0x28, 0x85, 0xF4, 0x37, 0x6C, 0x95, 0xDC, 0x75, 0x19, 0xB1, 0x93, 0xB6, 0xD6, 0xCE, 0x60,
+0x76, 0xCC, 0x1F, 0xA9, 0x45, 0xB1, 0x64, 0xA6, 0xF6, 0x7A, 0x5F, 0x13, 0x0E, 0x8A, 0x93, 0xFE,
+0xAC, 0xC8, 0x8E, 0xEC, 0x45, 0x3B, 0x16, 0xAF, 0x1E, 0x44, 0xE6, 0xD1, 0x92, 0xB5, 0x1E, 0x26,
+0x43, 0x6E, 0xA9, 0x76, 0xAB, 0xF7, 0x19, 0xBE, 0x99, 0xB8, 0x2F, 0x57, 0x57, 0x05, 0x97, 0x25,
+0x0A, 0x37, 0x42, 0x04, 0xE9, 0x5F, 0x77, 0x02, 0x69, 0x57, 0x68, 0x4A, 0xDD, 0x04, 0x92, 0x76,
+0x70, 0x7D, 0xA7, 0xA8, 0xD5, 0x8D, 0x1C, 0xAA, 0xDA, 0x21, 0xC2, 0x13, 0xBE, 0x78, 0x0C, 0xB2,
+0x68, 0x87, 0x82, 0x32, 0x08, 0x3F, 0xBD, 0xAB, 0xC8, 0x6F, 0x47, 0xB3, 0xEE, 0xCD, 0x38, 0x18,
+0x11, 0x7B, 0x0C, 0x3B, 0x28, 0x30, 0x01, 0xED, 0xC6, 0x0D, 0xEB, 0x24, 0xED, 0xC6, 0x72, 0xA4,
+0x25, 0xBF, 0x2F, 0x95, 0x3D, 0xAA, 0x22, 0xCC, 0xB9, 0xB6, 0x1B, 0xCE, 0xEC, 0xB2, 0xC1, 0x7C,
+0x43, 0x6D, 0x6B, 0x04, 0xBD, 0xEC, 0x4E, 0xE9, 0x8B, 0x21, 0x9E, 0xE4, 0x77, 0xD6, 0x28, 0x4C,
+0x68, 0xE7, 0xCF, 0x51, 0xC5, 0xBA, 0x22, 0xE7, 0x77, 0x21, 0x3A, 0x55, 0x15, 0xA6, 0xE5, 0xCD,
+0xB0, 0x5E, 0x11, 0x17, 0x7F, 0xA6, 0xB4, 0xA0, 0xF9, 0x39, 0x7D, 0x3A, 0xEA, 0xA3, 0x4B, 0x55,
+0x92, 0xDB, 0x7D, 0x2D, 0xA7, 0x68, 0xF2, 0xF3, 0xB2, 0x1E, 0x66, 0x4C, 0xFA, 0x4F, 0x52, 0xD9,
+0x1B, 0x80, 0xA9, 0x97, 0xB9, 0xE6, 0xDA, 0x96, 0x89, 0x2C, 0x27, 0x51, 0x60, 0x82, 0xE3, 0x5E,
+0xA8, 0x52, 0xEC, 0x1F, 0x7D, 0xEA, 0x3C, 0x2A, 0x56, 0xF2, 0xAD, 0x1D, 0x3B, 0x27, 0x8A, 0x18,
+0x55, 0x2B, 0x46, 0x2B, 0x33, 0xE2, 0x97, 0x6A, 0x59, 0xA3, 0x07, 0x09, 0xA7, 0xE4, 0x63, 0xC3,
+0x98, 0xC1, 0xB2, 0x0F, 0x35, 0x0C, 0xA6, 0xDE, 0x7A, 0xBE, 0xD6, 0xF8, 0x95, 0xC8, 0xFD, 0x56,
+0x99, 0x46, 0xA4, 0x13, 0xEB, 0xC5, 0x72, 0x07, 0xD5, 0x2A, 0xAA, 0x75, 0xDC, 0x0A, 0x8C, 0x18,
+0x5E, 0x87, 0x15, 0x62, 0x86, 0xD1, 0xFD, 0x1F, 0xE3, 0x98, 0x04, 0xB1, 0xE3, 0x8E, 0x20, 0x6C,
+0x1F, 0x7D, 0x38, 0x6B, 0xF7, 0x8E, 0x6D, 0xA4, 0x6A, 0x2A, 0x8D, 0x54, 0x6F, 0xEF, 0x42, 0x8A,
+0x2F, 0xEE, 0xA4, 0xC3, 0x9D, 0x4F, 0x64, 0x8B, 0x39, 0xFC, 0x78, 0x66, 0xBD, 0xA2, 0x58, 0x52,
+0x11, 0x45, 0xFB, 0x49, 0x4C, 0x89, 0x27, 0xBF, 0xFB, 0x1A, 0x3D, 0xF8, 0x43, 0x9B, 0xF9, 0x14,
+0x99, 0xFE, 0xA7, 0x13, 0xA4, 0xBC, 0xA1, 0xA9, 0xDF, 0x68, 0xE5, 0x0D, 0x96, 0x6B, 0xEC, 0xDB,
+0xA4, 0xC1, 0xCA, 0x56, 0xBB, 0xD8, 0x38, 0x37, 0xA3, 0x46, 0xA4, 0xCA, 0x30, 0x16, 0xDB, 0x56,
+0x48, 0xAA, 0x2D, 0xFC, 0xE5, 0x43, 0x93, 0xDD, 0x62, 0x37, 0xF6, 0x0F, 0xBE, 0x17, 0xF0, 0xD5,
+0x50, 0x05, 0x0C, 0x3D, 0xC4, 0x3F, 0xCD, 0x17, 0x34, 0x53, 0x6C, 0x54, 0xE6, 0xF2, 0x02, 0xB6,
+0xE0, 0x99, 0x6F, 0x1A, 0x2F, 0xC1, 0x43, 0xDE, 0x75, 0xDF, 0x36, 0x51, 0xF9, 0x12, 0x3D, 0x50,
+0x85, 0x48, 0x85, 0x12, 0xF5, 0xA1, 0x4B, 0xBE, 0x4E, 0x4A, 0x96, 0x32, 0x65, 0xCE, 0xEA, 0x10,
+0x2E, 0x21, 0xAA, 0x9A, 0x49, 0xB7, 0x51, 0xC2, 0x55, 0x65, 0x45, 0x7D, 0xE8, 0x8C, 0x90, 0xB9,
+0x72, 0x28, 0x2C, 0x83, 0x37, 0x71, 0x5F, 0x41, 0xD5, 0x69, 0x74, 0x77, 0x02, 0x5D, 0xBE, 0x7D,
+0x77, 0x8A, 0xA8, 0xEA, 0x98, 0x52, 0xE3, 0xFE, 0x76, 0x48, 0xA9, 0x2E, 0x26, 0xD9, 0xD0, 0x01,
+0x42, 0x05, 0xA2, 0x37, 0x84, 0x5F, 0x2C, 0x7F, 0xF4, 0xDC, 0xEB, 0xE1, 0x14, 0x23, 0xAC, 0xE4,
+0x97, 0x6A, 0xF3, 0x0E, 0x71, 0xCA, 0x87, 0xB9, 0x93, 0x44, 0x66, 0x16, 0x2A, 0x15, 0xCD, 0x4C,
+0x49, 0x35, 0x55, 0x62, 0xA3, 0x18, 0x29, 0x81, 0x71, 0xFF, 0x31, 0xFE, 0x95, 0xAD, 0x5B, 0x4C,
+0xD9, 0x54, 0x75, 0xD3, 0x14, 0xBC, 0x5A, 0x85, 0x4A, 0x54, 0x2A, 0xC3, 0xC7, 0x30, 0xD2, 0x7A,
+0x15, 0x7F, 0x25, 0xF3, 0x32, 0xB8, 0x10, 0x0D, 0xE1, 0x94, 0x3E, 0x35, 0x19, 0x20, 0xD6, 0x85,
+0x07, 0x90, 0x94, 0xB8, 0x87, 0xDB, 0x09, 0xAC, 0xF2, 0x31, 0x06, 0xA7, 0xE8, 0x77, 0xF1, 0xC5,
+0x45, 0xA7, 0x75, 0x9A, 0x61, 0x69, 0x06, 0x6E, 0x81, 0x6A, 0x28, 0x3F, 0x3A, 0x44, 0x99, 0x34,
+0xF5, 0xCD, 0xE7, 0x4B, 0x24, 0x73, 0x36, 0x3B, 0x64, 0xD2, 0x25, 0xAC, 0x22, 0x7E, 0x72, 0x99,
+0x12, 0x5A, 0x2A, 0x7B, 0x8A, 0x97, 0xCE, 0xE1, 0x54, 0xA7, 0xCD, 0x97, 0xAC, 0x4E, 0xB9, 0x06,
+0xC5, 0x3A, 0xB1, 0x8D, 0x58, 0x37, 0x83, 0x27, 0xB0, 0x08, 0xED, 0x00, 0xF9, 0xE6, 0x17, 0xBC,
+0xAB, 0xDB, 0xAB, 0x0C, 0xC9, 0x2D, 0xAD, 0x7E, 0xA5, 0x54, 0xA9, 0x11, 0x6A, 0xC2, 0x64, 0xAA,
+0x67, 0xA0, 0xB2, 0xF1, 0xD8, 0x81, 0xC9, 0x45, 0xD5, 0x6E, 0x25, 0x3F, 0x18, 0x18, 0x48, 0x71,
+0x37, 0x4C, 0xB1, 0x7C, 0xF0, 0x39, 0x23, 0x70, 0xCF, 0xC1, 0xB4, 0xCB, 0x5C, 0x90, 0x37, 0xE3,
+0x60, 0xE4, 0xE2, 0x65, 0xA4, 0xD4, 0x60, 0x5F, 0xB8, 0xD8, 0xD3, 0x04, 0xB8, 0xD2, 0x83, 0xD1,
+0x92, 0x4C, 0xFF, 0x41, 0x87, 0x76, 0x09, 0xA2, 0x58, 0xE4, 0x5B, 0x5A, 0xBF, 0x66, 0xEB, 0x30,
+0xB4, 0x46, 0x6F, 0x58, 0x03, 0x38, 0x09, 0x0F, 0x7D, 0xB0, 0xA6, 0xA1, 0xC0, 0xCC, 0x4F, 0xCE,
+0xC8, 0x9C, 0xBD, 0x07, 0x11, 0xA7, 0x2B, 0x59, 0x98, 0x79, 0x6B, 0x31, 0x81, 0x42, 0x85, 0x63,
+0x9A, 0x11, 0x1E, 0x8B, 0x92, 0x3B, 0x7C, 0x3E, 0x84, 0xC0, 0x80, 0x48, 0x2D, 0xB7, 0x87, 0x2B,
+0x3F, 0x67, 0x24, 0xB9, 0x6E, 0x7D, 0x60, 0xA0, 0x05, 0xD5, 0xA6, 0xE5, 0xCC, 0xC3, 0xAD, 0x18,
+0x63, 0xAA, 0x6A, 0x7C, 0xF0, 0x18, 0xC7, 0x77, 0xB4, 0x07, 0x37, 0x70, 0x5B, 0xAD, 0x93, 0x67,
+0xE1, 0xFC, 0x0F, 0x81, 0xA3, 0x1F, 0x24, 0x91, 0xBB, 0x1F, 0x34, 0x52, 0x67, 0x2D, 0xBC, 0x9D,
+0x50, 0x59, 0xF7, 0xED, 0xDF, 0x25, 0xF9, 0x10, 0x2F, 0x21, 0x37, 0xEC, 0x0C, 0x7E, 0x60, 0x56,
+0x0E, 0x1B, 0x22, 0xD9, 0x4E, 0x0E, 0x26, 0xF6, 0xE5, 0x48, 0xAC, 0x5F, 0x4B, 0x32, 0xBD, 0x8D,
+0x26, 0x70, 0xF8, 0x71, 0x4F, 0x72, 0x4F, 0xD9, 0x86, 0xD6, 0x94, 0xC5, 0x3F, 0x45, 0x93, 0x70,
+0x4F, 0xF9, 0x08, 0x41, 0x18, 0x93, 0xF8, 0x5E, 0xE4, 0xD8, 0x1E, 0x82, 0x29, 0x96, 0x0A, 0xF1,
+0x4A, 0x0F, 0x26, 0x43, 0x66, 0xAE, 0x41, 0x46, 0x03, 0xCF, 0x42, 0xF5, 0x1C, 0x82, 0xDB, 0x01,
+0xE7, 0x8E, 0xE0, 0xC9, 0xE0, 0x14, 0x7E, 0xEF, 0xC2, 0xBF, 0xAE, 0x07, 0x04, 0x6D, 0xEB, 0x16,
+0x9A, 0xCA, 0x57, 0xF6, 0xDD, 0xCF, 0xF9, 0xFF, 0x10, 0xB6, 0x1B, 0x63, 0x5A, 0x28, 0x35, 0x9B,
+0xB9, 0x6A, 0xBD, 0xD2, 0x96, 0xDE, 0x58, 0xF9, 0x4F, 0x16, 0xB1, 0x63, 0xB2, 0x46, 0xF8, 0x13,
+0x50, 0x76, 0xE6, 0xB6, 0x46, 0xD8, 0xE4, 0x45, 0x88, 0xDD, 0x4A, 0x29, 0xB1, 0xCC, 0xD1, 0xF8,
+0x1D, 0x18, 0x59, 0x5D, 0x42, 0xB0, 0x0E, 0xC5, 0xAE, 0x1D, 0x16, 0x9D, 0x7A, 0x7A, 0x6D, 0x1E,
+0x94, 0xA0, 0xD5, 0xA6, 0x3A, 0x55, 0x55, 0xE2, 0x43, 0x17, 0xDE, 0xCA, 0x7D, 0xF3, 0xB2, 0xB1,
+0x8C, 0x97, 0xD5, 0xBF, 0x4E, 0x17, 0x85, 0x78, 0xB0, 0xDD, 0xD6, 0xCA, 0xAA, 0x9A, 0x66, 0xF7,
+0x93, 0x9B, 0x27, 0xED, 0xC9, 0xAB, 0x8F, 0x6D, 0xB7, 0x3E, 0x4B, 0xAD, 0x56, 0x56, 0x82, 0x4F,
+0x5A, 0x41, 0x92, 0x91, 0x84, 0xB7, 0x15, 0x24, 0x8F, 0x1B, 0x42, 0xBF, 0x7E, 0xEC, 0x74, 0x78,
+0xE1, 0xFD, 0x13, 0x88, 0x96, 0x1D, 0x4D, 0x7B, 0xDD, 0xDD, 0xD8, 0xFC, 0x5A, 0xD1, 0x55, 0xF4,
+0x11, 0xD9, 0x04, 0x73, 0x40, 0x2B, 0x54, 0xAA, 0x39, 0x2C, 0x2E, 0x79, 0x1F, 0xB5, 0xB9, 0x86,
+0xB7, 0xE3, 0x50, 0x59, 0xC7, 0x94, 0x94, 0x19, 0xBD, 0x91, 0xFB, 0xD6, 0x62, 0x1F, 0xDF, 0xCB,
+0xE0, 0xCA, 0xCB, 0x47, 0xC5, 0xCB, 0x81, 0xE3, 0xCE, 0x17, 0x20, 0x77, 0xEB, 0xA0, 0x90, 0x1C,
+0xDC, 0xCC, 0x60, 0x81, 0x95, 0x7D, 0xB8, 0x57, 0xD4, 0x79, 0x2B, 0xCC, 0x48, 0xEF, 0x23, 0x30,
+0x35, 0xD0, 0x77, 0x46, 0x14, 0x43, 0x06, 0x4D, 0x44, 0xE7, 0xF3, 0x38, 0xF8, 0xFA, 0xA4, 0xD2,
+0xF8, 0xFC, 0x84, 0x76, 0xD0, 0xB9, 0x5B, 0xD4, 0x7E, 0xFD, 0x5C, 0x3E, 0xD7, 0xBC, 0x91, 0xA9,
+0xB0, 0xCD, 0x21, 0x9F, 0xB6, 0x3A, 0xF1, 0xB8, 0x70, 0xF1, 0xCB, 0x9C, 0x39, 0xA6, 0x76, 0x23,
+0x2D, 0xCD, 0x6A, 0xFB, 0x1A, 0xDE, 0x08, 0x76, 0xAB, 0x75, 0xCD, 0x02, 0x98, 0x3F, 0xE6, 0x8D,
+0xE8, 0x63, 0x47, 0x85, 0x8D, 0x07, 0x4D, 0xB0, 0x63, 0x20, 0x64, 0xDC, 0x17, 0x96, 0xBB, 0x4A,
+0x34, 0xF2, 0x60, 0x62, 0x63, 0xFE, 0x60, 0xA4, 0x49, 0x9C, 0xC4, 0x8E, 0xB6, 0x8B, 0x8B, 0xD8,
+0x31, 0xE3, 0x66, 0xC4, 0x4F, 0xF0, 0x33, 0xC7, 0xE8, 0xC8, 0x51, 0xEC, 0x6D, 0xCA, 0x24, 0xB7,
+0xDC, 0x6D, 0x62, 0x39, 0x5F, 0xAA, 0x7A, 0x70, 0x70, 0xB1, 0xBD, 0x9B, 0xBB, 0x24, 0xC0, 0x51,
+0x9D, 0x3E, 0x99, 0xCD, 0x52, 0xFF, 0x67, 0xB0, 0x20, 0x5F, 0x47, 0x04, 0x26, 0x37, 0x69, 0xE7,
+0x2E, 0x2D, 0xBC, 0x37, 0x73, 0x9A, 0x35, 0xEA, 0x1F, 0xE5, 0x7D, 0xA1, 0x4A, 0x26, 0x24, 0x89,
+0x51, 0x96, 0xF4, 0x9B, 0xAB, 0x7C, 0xD7, 0x54, 0x7B, 0xCC, 0x45, 0x94, 0xA6, 0xC9, 0x46, 0x22,
+0xC4, 0xDD, 0x95, 0x83, 0xB9, 0x1C, 0xA8, 0xAA, 0xF1, 0xB1, 0x1C, 0x21, 0xE4, 0x38, 0x50, 0x55,
+0x23, 0xD9, 0xE4, 0x0F, 0x00, 0xEE, 0xEE, 0xE1, 0x07, 0x09, 0xD8, 0x55, 0xB8, 0xCE, 0xCC, 0xE1,
+0x3B, 0x62, 0x0E, 0xED, 0xE4, 0x4E, 0x19, 0xDC, 0x2F, 0xF6, 0x35, 0x44, 0xB7, 0xBE, 0xFA, 0xC6,
+0x91, 0x86, 0x1F, 0xEF, 0x63, 0x8B, 0x33, 0xF7, 0x26, 0xE2, 0xAE, 0x12, 0x24, 0x38, 0x0B, 0xC6,
+0x0C, 0x18, 0x50, 0x9D, 0xA4, 0x79, 0x7E, 0xA9, 0x20, 0x91, 0x1C, 0x1D, 0x12, 0x59, 0xAA, 0x57,
+0x24, 0x8C, 0xB3, 0xAC, 0xF3, 0x63, 0x6E, 0x6E, 0xCC, 0xEF, 0x45, 0x06, 0xF6, 0x30, 0xB7, 0x27,
+0x03, 0x02, 0x99, 0xC7, 0xEE, 0x4D, 0x44, 0xC8, 0xAE, 0xA4, 0xAF, 0x2C, 0xCB, 0x68, 0x69, 0xFA,
+0xD3, 0x11, 0x4F, 0xFE, 0x90, 0xB9, 0x86, 0xBC, 0xB8, 0x9C, 0x3B, 0xAC, 0xFF, 0x22, 0x88, 0x2D,
+0x45, 0x85, 0x3E, 0x28, 0xA0, 0xEB, 0xA1, 0x36, 0x32, 0xC5, 0x4F, 0xBE, 0x95, 0x59, 0x23, 0x1F,
+0x7F, 0xFA, 0xF2, 0x31, 0x81, 0x71, 0x57, 0x6E, 0x66, 0x6F, 0xE4, 0x57, 0x5F, 0x23, 0x95, 0x37,
+0x50, 0xE6, 0x13, 0x41, 0xEC, 0x5C, 0x19, 0x98, 0x60, 0xFE, 0x1A, 0xC8, 0xEB, 0x34, 0x57, 0x75,
+0x61, 0xC2, 0x30, 0xCB, 0x90, 0xC4, 0x2F, 0xD6, 0xFE, 0xDC, 0x5D, 0xEC, 0x43, 0x48, 0x31, 0x43,
+0x98, 0x73, 0x52, 0x29, 0x5C, 0x3D, 0xF3, 0x98, 0x15, 0x5D, 0x04, 0x53, 0x19, 0x99, 0xDC, 0xEE,
+0xE7, 0x66, 0xCC, 0x5B, 0x48, 0x83, 0xA8, 0x1F, 0xA6, 0x96, 0xA9, 0x2E, 0x27, 0x57, 0x29, 0xB1,
+0xD2, 0x5F, 0xE0, 0x9E, 0x4B, 0x4E, 0x14, 0x26, 0x79, 0x47, 0xCB, 0xE4, 0xFE, 0x62, 0x5E, 0x87,
+0x32, 0x3E, 0x7F, 0x5F, 0x15, 0xBD, 0x98, 0xEF, 0x4E, 0xEA, 0x4B, 0x0A, 0x95, 0xDD, 0xC1, 0xF8,
+0xA2, 0x11, 0x9A, 0xF8, 0xBE, 0xFA, 0x5A, 0x51, 0xB5, 0x73, 0xE5, 0x2E, 0xE6, 0xB6, 0xCB, 0xEB,
+0xF0, 0x85, 0xDC, 0xFC, 0x47, 0x5A, 0xB8, 0x9F, 0x23, 0x13, 0x17, 0x23, 0x4A, 0x76, 0x18, 0x5F,
+0x8A, 0x7F, 0x82, 0x7D, 0x64, 0x8F, 0xC3, 0x9C, 0x91, 0x7F, 0x89, 0x34, 0x30, 0x9F, 0x3E, 0x56,
+0x11, 0x3A, 0xE6, 0x6E, 0xE8, 0x43, 0x02, 0x5C, 0x2C, 0x55, 0x33, 0x50, 0xEC, 0xB8, 0x45, 0x91,
+0x02, 0xA7, 0x7D, 0x94, 0x2F, 0xC5, 0xBC, 0x0F, 0x2E, 0x8B, 0xDA, 0xFB, 0xB5, 0x3E, 0x68, 0xBE,
+0x75, 0x5B, 0x45, 0xE1, 0x13, 0x26, 0x6E, 0xD1, 0x9F, 0x42, 0x04, 0x33, 0x13, 0xA7, 0xA8, 0x99,
+0xE6, 0x9D, 0x06, 0x72, 0x49, 0xDF, 0xB6, 0x0E, 0x2C, 0x0E, 0xEB, 0xE0, 0xB0, 0xBE, 0x7B, 0x63,
+0x9F, 0xA8, 0x54, 0xAB, 0x7D, 0x4C, 0xC1, 0xC5, 0xE0, 0x24, 0xBE, 0xAC, 0xA6, 0x41, 0x28, 0xB9,
+0xE5, 0x9B, 0xFC, 0x32, 0xF7, 0x94, 0x11, 0x19, 0x0E, 0x3E, 0x2F, 0x55, 0x35, 0x76, 0x35, 0xD9,
+0x7D, 0xE8, 0x28, 0x5E, 0x9A, 0x2A, 0x69, 0x11, 0xC1, 0xB9, 0x4A, 0x59, 0xAB, 0xD2, 0x09, 0x21,
+0xB6, 0xF2, 0x51, 0xFD, 0x25, 0x2E, 0xA6, 0x68, 0x72, 0xC1, 0xEA, 0xEB, 0xA1, 0x5A, 0x80, 0x54,
+0x34, 0x18, 0xA3, 0x03, 0x9B, 0x40, 0x72, 0x57, 0xF8, 0x0B, 0x76, 0xB5, 0x71, 0x6B, 0xB4, 0xFE,
+0x95, 0x7E, 0xB7, 0xAE, 0x54, 0x4B, 0xD2, 0x4F, 0xF1, 0x62, 0xFA, 0x94, 0xB6, 0x92, 0x8B, 0x06,
+0xF7, 0x84, 0x95, 0xEF, 0x11, 0xFC, 0x77, 0x6A, 0x64, 0x46, 0x72, 0xDA, 0xF9, 0x83, 0xDB, 0x8C,
+0xF9, 0x23, 0x3F, 0xC7, 0xE7, 0x3C, 0xFF, 0x01, 0x82, 0x25, 0x98, 0xE6, 0xE4, 0x32, 0xC8, 0x5C,
+0xB7, 0xEC, 0x60, 0xD3, 0x82, 0xB4, 0x29, 0x37, 0xC7, 0x14, 0xCB, 0x79, 0xC2, 0x88, 0xCB, 0x39,
+0x28, 0xC6, 0x9D, 0xF8, 0x8E, 0xDD, 0x89, 0x68, 0x4F, 0xA6, 0xE7, 0x58, 0xE9, 0x41, 0x32, 0xB8,
+0x0B, 0xD1, 0x84, 0xBB, 0x70, 0x7D, 0x0A, 0x40, 0x58, 0xF8, 0xC5, 0x2C, 0x3E, 0xA0, 0x1F, 0xE7,
+0xA8, 0xA9, 0x52, 0x16, 0x69, 0xEC, 0xBD, 0xCA, 0x48, 0x76, 0x7E, 0xCE, 0xC5, 0x0A, 0x00, 0x5F,
+0xAA, 0x1B, 0x21, 0xA7, 0x24, 0x25, 0x1B, 0x68, 0x2A, 0x95, 0x80, 0x8B, 0xC5, 0xE9, 0x3D, 0x17,
+0x7D, 0x92, 0xAE, 0xE5, 0x08, 0x5A, 0xEC, 0xA6, 0x7D, 0x5E, 0xD9, 0x36, 0xA6, 0x0B, 0x69, 0xC4,
+0x6F, 0x97, 0xE4, 0xCE, 0xCB, 0xE5, 0xF1, 0x95, 0x73, 0x20, 0x23, 0x13, 0x20, 0xE1, 0xFC, 0x0C,
+0x5F, 0x83, 0x8F, 0xF4, 0x5F, 0x62, 0x8F, 0xDB, 0xFF, 0xF1, 0xDF, 0x7E, 0x13, 0xFB, 0xC5, 0xFE,
+0x65, 0xF8, 0x57, 0xBF, 0xDD, 0xF8, 0x83, 0x5B, 0xB3, 0x31, 0x29, 0x2F, 0xBF, 0x6F, 0xE8, 0x06,
+0x33, 0x41, 0x55, 0x30, 0x17, 0x38, 0xA2, 0x10, 0xA0, 0xBE, 0x82, 0x8D, 0xF6, 0x95, 0xE5, 0x1A,
+0x51, 0x33, 0xD3, 0x14, 0x58, 0xFA, 0x67, 0x14, 0xC7, 0xF7, 0x0A, 0x48, 0x18, 0xD3, 0xFE, 0x32,
+0x2A, 0xF6, 0x8F, 0xFF, 0xE2, 0x79, 0xF4, 0xF5, 0x9B, 0x2B, 0xEA, 0xEB, 0xBF, 0xFE, 0xED, 0x6F,
+0x86, 0xDF, 0xC6, 0x5E, 0xC6, 0x3F, 0x79, 0xE5, 0x7D, 0x89, 0xD6, 0xA5, 0xE2, 0xCD, 0xDD, 0x51,
+0x58, 0xF7, 0x2C, 0x3E, 0x97, 0xD7, 0xB1, 0x0D, 0x1A, 0x31, 0x66, 0xF2, 0x6A, 0x3E, 0x1A, 0x55,
+0x27, 0xF3, 0x69, 0xCC, 0x1C, 0xB1, 0x62, 0x76, 0x8F, 0xC1, 0x37, 0x4B, 0xFC, 0x32, 0xF8, 0x38,
+0xF3, 0x7F, 0x91, 0x6B, 0x3F, 0x11, 0xC4, 0x8E, 0x6D, 0x67, 0x3E, 0x19, 0x2A, 0x48, 0x97, 0x91,
+0x3C, 0x91, 0x16, 0x07, 0x7E, 0xE8, 0xD4, 0xBF, 0x6E, 0xE5, 0x80, 0xB9, 0x82, 0x91, 0xCC, 0x6E,
+0xA9, 0x8E, 0xF8, 0x9E, 0xFF, 0x44, 0x33, 0xA5, 0x2D, 0xA9, 0x6E, 0x86, 0xA4, 0x13, 0xA3, 0xCA,
+0x4F, 0x39, 0x25, 0x6D, 0xB5, 0x47, 0x32, 0xA2, 0xEA, 0xA4, 0x4D, 0x0A, 0x9A, 0x9B, 0xFD, 0xF2,
+0x6B, 0xFC, 0xB9, 0xFD, 0x8D, 0xFD, 0xE3, 0x02, 0xAE, 0x35, 0xFB, 0xF5, 0x4E, 0x17, 0xE3, 0x79,
+0x2F, 0x6B, 0x1F, 0xC2, 0xF4, 0x45, 0xE2, 0x0B, 0x4D, 0xAA, 0xC3, 0xC9, 0xA6, 0xE3, 0xD7, 0x82,
+0xC8, 0x2E, 0x92, 0x3A, 0x6E, 0x78, 0x4F, 0x53, 0xD1, 0x5B, 0x1F, 0x9D, 0x0B, 0x2F, 0xBE, 0x77,
+0x02, 0x09, 0x4A, 0xC7, 0x9A, 0xA6, 0xDA, 0x49, 0x02, 0x5C, 0xFC, 0xD2, 0x01, 0x8F, 0x12, 0x53,
+0xEC, 0x9C, 0xF8, 0x96, 0x11, 0xB2, 0x7C, 0x7C, 0xF4, 0x3B, 0x56, 0x15, 0x4C, 0xC7, 0x48, 0x5F,
+0xA7, 0xB1, 0xE3, 0x25, 0x66, 0x76, 0xF4, 0xAF, 0xE4, 0xBA, 0xE3, 0xE5, 0xC2, 0xA5, 0x92, 0x3B,
+0x3F, 0x48, 0x88, 0x49, 0x68, 0x5B, 0x40, 0xEE, 0xB6, 0x21, 0x4A, 0x77, 0xCF, 0xFA, 0x9E, 0xA6,
+0xEC, 0x38, 0x31, 0x8D, 0x39, 0x7E, 0x1E, 0x5F, 0x5A, 0x57, 0x90, 0xA2, 0x61, 0x86, 0xE6, 0x57,
+0x99, 0xDF, 0xE6, 0x35, 0xB9, 0xE0, 0xFB, 0x2E, 0xEB, 0xAD, 0x0D, 0xAB, 0x14, 0xA9, 0x51, 0x2D,
+0x7D, 0xFA, 0xC6, 0x71, 0xCE, 0x27, 0x67, 0xA6, 0xD2, 0x79, 0xF5, 0x5A, 0x47, 0x55, 0xA0, 0xA0,
+0x19, 0x85, 0x89, 0x89, 0x39, 0x5B, 0xA9, 0x5A, 0x6E, 0x97, 0xC4, 0xC4, 0x1F, 0x77, 0x45, 0x5E,
+0x85, 0x6F, 0xB3, 0x55, 0xAC, 0xB2, 0xD1, 0xDE, 0x2E, 0xBD, 0x2C, 0x69, 0x03, 0xF9, 0xFD, 0xC5,
+0xBC, 0x73, 0x1C, 0xD9, 0x2B, 0xF0, 0x8F, 0x7B, 0xED, 0xE2, 0x64, 0xF8, 0x09, 0xB6, 0x2E, 0x5B,
+0xE9, 0xE3, 0x5D, 0x90, 0x3C, 0x3A, 0x7F, 0x4B, 0x24, 0x35, 0x54, 0x3C, 0xFF, 0x1D, 0xF4, 0x71,
+0x60, 0xA0, 0x9F, 0x11, 0xA3, 0x01, 0xE7, 0xB9, 0xE1, 0x39, 0xC6, 0x98, 0xFB, 0x89, 0x2E, 0xE7,
+0x03, 0x56, 0xEF, 0x7E, 0xF4, 0x27, 0xDB, 0x88, 0x88, 0xCF, 0x4D, 0x78, 0xAC, 0x9A, 0x2F, 0x66,
+0x04, 0x3B, 0x8D, 0xCE, 0x1C, 0xF0, 0xE0, 0x96, 0x5D, 0x5C, 0x2F, 0xF8, 0x0D, 0xC1, 0x28, 0x6E,
+0x26, 0xE9, 0xA5, 0x8F, 0xE8, 0x4A, 0x0F, 0x2E, 0xCA, 0x54, 0xA7, 0x54, 0x89, 0x5B, 0x7A, 0x9D,
+0x61, 0xD9, 0x15, 0x25, 0xB4, 0x40, 0x95, 0xBC, 0xA6, 0x51, 0x25, 0x48, 0x7E, 0x2C, 0xF0, 0x77,
+0x6D, 0x4D, 0x27, 0xA8, 0x80, 0xCD, 0x50, 0x9D, 0x44, 0xF3, 0x68, 0x82, 0x7E, 0x15, 0x3B, 0x29,
+0x7C, 0xFF, 0x07, 0x6F, 0x2C, 0xF3, 0x78, 0xBD, 0xFA, 0xFE, 0x0F, 0xDF, 0x08, 0xCF, 0xBF, 0xF0,
+0x0E, 0x82, 0x1B, 0xAE, 0x80, 0xD8, 0x80, 0xDC, 0x40, 0x38, 0x61, 0xF0, 0x44, 0xFC, 0x61, 0xED,
+0xF7, 0x94, 0xEF, 0x5C, 0xC5, 0x74, 0xE9, 0x9F, 0x2E, 0xA9, 0x91, 0x24, 0xA3, 0x9D, 0xF8, 0x11,
+0xD8, 0xE8, 0xE7, 0x67, 0xB9, 0x31, 0xE2, 0xB8, 0x0E, 0xC3, 0xC7, 0x9E, 0xBF, 0x75, 0x99, 0x16,
+0xEA, 0x45, 0x24, 0x66, 0xD6, 0xFE, 0xB2, 0x4F, 0xDE, 0xAF, 0xBC, 0x7F, 0x0B, 0xFB, 0xFA, 0xFD,
+0x1F, 0xBE, 0x1E, 0x9E, 0xFB, 0xF1, 0x9B, 0xE1, 0x83, 0x0F, 0xB1, 0x55, 0x18, 0x7E, 0xC0, 0xF0,
+0xBB, 0x9E, 0x11, 0xE0, 0xFC, 0x4B, 0xE5, 0x93, 0x91, 0xBB, 0x6C, 0x37, 0xFD, 0xEB, 0x64, 0xFE,
+0x37, 0xE8, 0xFF, 0x9A, 0xB7, 0x9D, 0x84, 0xB6, 0x0B, 0xAA, 0x75, 0x2B, 0xDC, 0x9B, 0xE2, 0x1A,
+0xB6, 0x72, 0xAA, 0xB2, 0x1C, 0x1C, 0x8B, 0xBE, 0xBF, 0xF2, 0xD9, 0x7E, 0xC3, 0xB7, 0xFA, 0x78,
+0x17, 0x32, 0xDB, 0xF4, 0x49, 0x6C, 0x10, 0x3C, 0x21, 0xF2, 0x29, 0x3E, 0x10, 0x9C, 0x62, 0x5C,
+0x7C, 0xEB, 0x55, 0xDB, 0xC0, 0xB7, 0xAB, 0x14, 0x31, 0xE5, 0x46, 0x55, 0x1A, 0xFD, 0xE8, 0xCA,
+0x87, 0x33, 0xFA, 0xB4, 0x25, 0x8D, 0xCD, 0x15, 0xB5, 0xF4, 0xCB, 0xCD, 0x22, 0x31, 0xA5, 0xBC,
+0xE9, 0x74, 0x52, 0x9F, 0xAA, 0x41, 0xB2, 0xEC, 0xDA, 0x4F, 0x77, 0xD1, 0xE1, 0x62, 0xB5, 0x5A,
+0x46, 0x4B, 0x68, 0x1D, 0x91, 0xA2, 0xC8, 0xF7, 0x87, 0xD5, 0xEB, 0xB9, 0xD7, 0x5C, 0x5D, 0xB2,
+0xFB, 0xB0, 0xBB, 0xEA, 0x37, 0x97, 0x54, 0x43, 0xEF, 0x87, 0x2B, 0x51, 0xA2, 0xEE, 0x19, 0x32,
+0xAA, 0xDA, 0x59, 0x9B, 0xEC, 0x3A, 0xCF, 0x91, 0xE7, 0xEA, 0xA4, 0x43, 0x48, 0xD5, 0xAE, 0xB5,
+0x1D, 0x11, 0xB2, 0xF8, 0x3B, 0x86, 0x0F, 0xCD, 0x5F, 0xE2, 0xC3, 0x7E, 0x92, 0xBE, 0x76, 0x37,
+0x63, 0xC5, 0x68, 0x70, 0xF8, 0xF9, 0xE5, 0xC5, 0x7C, 0x76, 0xAA, 0x56, 0x19, 0xB9, 0x11, 0x8C,
+0xC8, 0x36, 0x32, 0x5F, 0x42, 0xF7, 0x2B, 0x14, 0x25, 0x2F, 0xF9, 0x9F, 0xA5, 0xDC, 0x81, 0x50,
+0x2D, 0xA3, 0xAF, 0x99, 0xFA, 0xA6, 0xF9, 0xAE, 0x0A, 0x31, 0xEF, 0xA1, 0xD5, 0x57, 0x89, 0x78,
+0xC6, 0x39, 0x2A, 0x2A, 0x53, 0x34, 0xC3, 0x62, 0xE9, 0xBD, 0x6F, 0xFB, 0xBA, 0xF0, 0xC0, 0xCE,
+0x0D, 0x4D, 0x51, 0xA8, 0xE8, 0x43, 0xFA, 0x2E, 0x5C, 0x0D, 0xC6, 0xB0, 0x97, 0x2F, 0x0C, 0x0D,
+0xD2, 0x67, 0x0F, 0xE4, 0x30, 0x27, 0xC0, 0xA8, 0x5E, 0xEA, 0xA4, 0x53, 0x4C, 0x5C, 0x59, 0xD3,
+0x39, 0xE7, 0xAA, 0x9D, 0x92, 0x55, 0xC7, 0x46, 0x56, 0x05, 0xEF, 0xAF, 0x90, 0x5E, 0xBD, 0xCE,
+0xEB, 0xF5, 0xDC, 0x8B, 0x24, 0x09, 0x3E, 0x5F, 0x34, 0xBA, 0x16, 0x0B, 0x10, 0x16, 0xC5, 0x4E,
+0x26, 0xB5, 0xC6, 0xAB, 0x3E, 0x28, 0x31, 0xFD, 0x5D, 0xED, 0xB2, 0xD8, 0x35, 0xA2, 0x34, 0x34,
+0x38, 0xEC, 0xB7, 0x6D, 0x31, 0x8D, 0x2A, 0x6E, 0x74, 0x19, 0x5B, 0xBE, 0x1B, 0x1C, 0xB2, 0x59,
+0x23, 0x75, 0x14, 0xED, 0x0E, 0x43, 0x7D, 0xFB, 0xF6, 0xA9, 0xB1, 0xF0, 0xCD, 0x93, 0xA3, 0xF1,
+0xF1, 0x97, 0x35, 0xCF, 0xFD, 0x75, 0xFC, 0xFB, 0xD1, 0x28, 0xF6, 0x98, 0x1D, 0x09, 0x3F, 0x38,
+0x3B, 0x16, 0x2E, 0x8D, 0xCF, 0x88, 0x6F, 0x1D, 0xA3, 0x62, 0x35, 0x9C, 0xEC, 0xE3, 0x1D, 0x24,
+0x76, 0x74, 0xC8, 0x97, 0x9D, 0x6C, 0x50, 0x15, 0x7D, 0x8B, 0x6E, 0x64, 0x9C, 0x55, 0xA9, 0xE9,
+0xC0, 0x0F, 0x02, 0x98, 0x0F, 0x63, 0x8A, 0x91, 0x45, 0xDA, 0xE7, 0x12, 0xE7, 0x4A, 0x57, 0x7F,
+0x67, 0x3B, 0xF2, 0x29, 0xD1, 0x8B, 0x39, 0xAF, 0x69, 0x62, 0x13, 0x8B, 0x1F, 0xC7, 0x0D, 0xF3,
+0x94, 0x66, 0x58, 0x2A, 0x5E, 0x2B, 0x3D, 0x68, 0x82, 0x15, 0xF3, 0xA7, 0x98, 0x62, 0x97, 0x6A,
+0x5C, 0xD5, 0x05, 0xA4, 0xB1, 0xFB, 0xF8, 0x8F, 0xC9, 0x46, 0xC7, 0x4C, 0x45, 0x8C, 0xFA, 0x4B,
+0x1B, 0x3F, 0xF3, 0x20, 0x76, 0x08, 0x00, 0x38, 0x8B, 0xC4, 0xFD, 0x27, 0xA1, 0xBC, 0x9D, 0xC6,
+0x76, 0x56, 0x67, 0xE0, 0x8F, 0xDE, 0xD0, 0x03, 0x79, 0xF1, 0xCE, 0x20, 0x49, 0xEF, 0x75, 0x04,
+0x26, 0x4E, 0xC3, 0x5C, 0x3A, 0x0B, 0x6B, 0xC1, 0x08, 0x03, 0x34, 0xEA, 0xF9, 0xC3, 0xC9, 0x8F,
+0xBE, 0x06, 0x16, 0x58, 0x03, 0x81, 0xA8, 0x35, 0xAA, 0xEE, 0xE9, 0x25, 0x3E, 0x19, 0xEA, 0xA3,
+0xE8, 0xF3, 0x93, 0x1D, 0x9E, 0x01, 0x27, 0x38, 0x03, 0x7F, 0xBB, 0xD3, 0xD2, 0xFE, 0x45, 0xFA,
+0x5A, 0x07, 0x07, 0xEE, 0x28, 0x71, 0xFA, 0xE4, 0xC5, 0x70, 0x19, 0x6B, 0xDB, 0x0C, 0xFC, 0x30,
+0xB9, 0x9D, 0x1A, 0x73, 0xD7, 0xC5, 0x75, 0x0E, 0x75, 0x8B, 0xDF, 0x24, 0xFC, 0xF0, 0xBA, 0x7B,
+0x69, 0x2A, 0x5F, 0xF9, 0xDC, 0xD1, 0xAE, 0x70, 0x31, 0xA3, 0x95, 0x67, 0xA5, 0x13, 0xBB, 0xB1,
+0x19, 0xB4, 0x54, 0xA9, 0x1B, 0x6C, 0xF1, 0xC7, 0xBF, 0xF1, 0x4A, 0x6B, 0x60, 0x94, 0xCA, 0xD1,
+0xB3, 0x48, 0x9C, 0xC8, 0xBC, 0x62, 0x00, 0x5A, 0x22, 0x8B, 0xA8, 0xE8, 0x64, 0x4A, 0x4B, 0xAC,
+0xB3, 0x01, 0x1C, 0xE3, 0xF4, 0xB1, 0xC5, 0xAB, 0x3A, 0x9D, 0xCC, 0x99, 0x7E, 0x81, 0x1A, 0x27,
+0x5F, 0x1D, 0x59, 0xD3, 0xEB, 0x3C, 0xB7, 0xC5, 0xB6, 0xB6, 0x7F, 0xD2, 0x24, 0x6F, 0xAB, 0x70,
+0xBE, 0xAA, 0x5A, 0x17, 0x9B, 0x2C, 0x55, 0xCA, 0xA7, 0x27, 0x2B, 0x5F, 0xF3, 0xE1, 0x37, 0xCE,
+0x28, 0x1F, 0xF4, 0x4A, 0x51, 0x23, 0x3F, 0x59, 0x1B, 0x8D, 0x62, 0xEA, 0x22, 0xBF, 0xE0, 0x63,
+0x93, 0x7D, 0x44, 0x9D, 0x1C, 0x99, 0x6A, 0x47, 0xAD, 0xEC, 0xBD, 0xD3, 0x17, 0xC2, 0xAB, 0x47,
+0x4E, 0x21, 0xA9, 0xE4, 0xC7, 0xCB, 0x3D, 0xB4, 0x92, 0xB1, 0x96, 0x0F, 0x14, 0x88, 0x44, 0x0B,
+0x48, 0x1D, 0xC9, 0x5D, 0xEA, 0xB9, 0xF6, 0xAD, 0x32, 0xDE, 0xF1, 0xFB, 0xC5, 0xCC, 0xDB, 0x19,
+0xC6, 0x09, 0x4F, 0x05, 0x48, 0xEB, 0x71, 0xB0, 0x6C, 0x18, 0x73, 0x8C, 0x63, 0x23, 0x55, 0xAD,
+0xA3, 0x29, 0xB8, 0x03, 0x98, 0x3C, 0xB0, 0x6B, 0x53, 0x78, 0x68, 0xCF, 0x66, 0x73, 0x00, 0x5F,
+0x49, 0x4F, 0x56, 0x5E, 0x56, 0x02, 0x27, 0x90, 0xA3, 0x71, 0x1C, 0xBF, 0x22, 0x55, 0x41, 0xF4,
+0x39, 0x92, 0x66, 0x9D, 0x9D, 0xB6, 0xAF, 0xD6, 0x34, 0x7E, 0xF9, 0x57, 0x6D, 0x0C, 0x32, 0xB1,
+0x26, 0x24, 0x98, 0x6A, 0xFA, 0x9F, 0xBD, 0x9F, 0x63, 0x1B, 0x31, 0x37, 0x22, 0xC8, 0x08, 0xB8,
+0x56, 0x28, 0xBA, 0x3C, 0xB6, 0xE0, 0xCB, 0xAE, 0xD7, 0x32, 0xE7, 0xAF, 0xBC, 0x87, 0x9F, 0xBC,
+0x2B, 0x96, 0x5E, 0x66, 0x56, 0xDE, 0x1F, 0x62, 0xCB, 0xCF, 0x96, 0xD2, 0x76, 0x24, 0x97, 0x85,
+0x63, 0xDC, 0x45, 0x90, 0x33, 0xFA, 0xC8, 0xD5, 0x7B, 0x5C, 0xC0, 0x79, 0x3E, 0xF8, 0x5E, 0xFE,
+0xF7, 0xDC, 0xE8, 0x8C, 0xF8, 0xE5, 0xF1, 0x43, 0xDD, 0x85, 0x1F, 0x42, 0x4B, 0xA4, 0x4F, 0x5B,
+0x61, 0x23, 0xED, 0x3B, 0xC5, 0xBE, 0x63, 0x54, 0x87, 0x6A, 0xE0, 0x0B, 0x75, 0xC1, 0x5D, 0xD0,
+0x26, 0xCC, 0x99, 0x56, 0x06, 0x0B, 0xC8, 0xE5, 0x37, 0x1B, 0x49, 0xBF, 0xE1, 0xC2, 0xCF, 0x89,
+0x7F, 0x76, 0xF4, 0xAE, 0x6C, 0x07, 0xB7, 0x76, 0x5A, 0x21, 0x0C, 0xD6, 0x62, 0xF9, 0x01, 0xD3,
+0xD0, 0xA5, 0x8D, 0x12, 0xB4, 0x86, 0x2A, 0xBB, 0x81, 0x42, 0x48, 0x45, 0x02, 0xBC, 0x19, 0x24,
+0xC2, 0xB4, 0x44, 0x8C, 0xEA, 0xAD, 0xFF, 0xE0, 0x7B, 0xF5, 0x1E, 0x5D, 0xE2, 0x0B, 0xC7, 0x68,
+0xD1, 0x8D, 0xBE, 0x1D, 0x56, 0xDD, 0x2E, 0xE9, 0xFC, 0x68, 0xF8, 0xB0, 0x1F, 0x80, 0x8D, 0xA2,
+0xB8, 0x7C, 0xBD, 0x54, 0xA8, 0x35, 0xA7, 0x27, 0xE7, 0x3C, 0xCD, 0xBC, 0xD5, 0xFE, 0xB0, 0xDF,
+0xF5, 0xFB, 0xA7, 0x78, 0xF8, 0x7B, 0x5D, 0xE2, 0x3B, 0xC7, 0x7D, 0x82, 0x37, 0xA3, 0xBF, 0x9D,
+0xF8, 0xB1, 0x5A, 0xF9, 0x01, 0x83, 0xBA, 0x85, 0x67, 0xDC, 0xE0, 0xDC, 0x91, 0x7E, 0xC8, 0x94,
+0xD7, 0x6D, 0xC5, 0x6E, 0x68, 0x02, 0x2E, 0x0F, 0xC6, 0xA2, 0x25, 0x3E, 0x11, 0xC4, 0x8E, 0x80,
+0x8F, 0x63, 0xD1, 0x7B, 0x1F, 0xEC, 0x9C, 0xAC, 0x9A, 0x0E, 0xDC, 0xBE, 0x7F, 0xE6, 0x82, 0x59,
+0xC6, 0x49, 0xB7, 0x0C, 0x8E, 0xEA, 0xC9, 0xA6, 0x64, 0x20, 0x6A, 0x72, 0xB6, 0x88, 0xF9, 0x9C,
+0xF5, 0x2A, 0xA2, 0x32, 0xE6, 0xEA, 0x9A, 0x28, 0x69, 0xBC, 0x07, 0x27, 0x78, 0xF2, 0xD5, 0x8A,
+0x2A, 0x9C, 0xF9, 0x7D, 0xB9, 0x2A, 0x24, 0x5F, 0x32, 0xF6, 0x25, 0x99, 0x14, 0x42, 0xF3, 0x97,
+0xCB, 0xEA, 0x70, 0x3F, 0x38, 0x57, 0x0B, 0x53, 0x7E, 0x32, 0x55, 0x50, 0xD2, 0x97, 0x15, 0x2B,
+0xD3, 0xEB, 0xD3, 0x9E, 0xB4, 0xF6, 0x83, 0x52, 0xDA, 0xC5, 0x36, 0x71, 0xD5, 0x30, 0xC5, 0xC6,
+0xD5, 0x41, 0x53, 0x6C, 0x7C, 0x01, 0x4F, 0xD1, 0x92, 0xB6, 0xEC, 0x7B, 0x3B, 0xF1, 0xE5, 0xD0,
+0x86, 0x20, 0x8A, 0x76, 0x38, 0x7D, 0x8E, 0xE3, 0x17, 0xDB, 0x77, 0xDF, 0x3C, 0x1C, 0xAE, 0x23,
+0x9A, 0xA9, 0x59, 0x07, 0x9D, 0x73, 0xFB, 0xF1, 0x2B, 0x87, 0xDB, 0x68, 0xE1, 0xA7, 0xA3, 0x91,
+0x39, 0xEB, 0x4F, 0xF4, 0x1B, 0x33, 0x82, 0x27, 0xB6, 0x09, 0x3E, 0x57, 0x7C, 0x54, 0xDD, 0x52,
+0xF5, 0x35, 0x46, 0xCC, 0x5A, 0x19, 0x2A, 0x51, 0xA2, 0xA6, 0xFA, 0x35, 0x99, 0x5A, 0x15, 0x95,
+0x40, 0x63, 0x4D, 0x33, 0x20, 0x95, 0xCC, 0x21, 0xD7, 0x83, 0x32, 0x8F, 0x22, 0x32, 0xEE, 0x51,
+0x6C, 0x9D, 0xD3, 0xDB, 0x40, 0xB2, 0xCF, 0x8F, 0x8B, 0x11, 0x89, 0xDD, 0x3B, 0x20, 0xD3, 0xFC,
+0x4B, 0x13, 0x2C, 0x3F, 0x9C, 0x62, 0x06, 0x72, 0x85, 0xCD, 0xC6, 0xBC, 0x76, 0x5F, 0xDB, 0x5A,
+0xDF, 0x42, 0xB5, 0xD9, 0xB8, 0x4A, 0x6B, 0xEA, 0x1C, 0xFB, 0x9F, 0x2B, 0x74, 0x32, 0x87, 0x32,
+0x75, 0x8F, 0x9F, 0x04, 0xBB, 0x46, 0x15, 0x67, 0x25, 0x93, 0x3C, 0xC7, 0xC5, 0x42, 0xE6, 0x2E,
+0xAA, 0xDD, 0xBB, 0x01, 0xFB, 0xF9, 0xDE, 0x80, 0x59, 0xEB, 0xE3, 0x62, 0x73, 0xB3, 0xAE, 0xCF,
+0x09, 0x70, 0x43, 0x75, 0xFA, 0xC7, 0xA3, 0xA1, 0xC2, 0xA9, 0xD0, 0x52, 0x6B, 0x1F, 0xBF, 0x5B,
+0xF4, 0x9B, 0x87, 0x7B, 0xC0, 0x22, 0x7D, 0x44, 0x5F, 0xF5, 0xB1, 0x17, 0xAF, 0xF7, 0xD8, 0x83,
+0xCF, 0xFD, 0x75, 0x7E, 0x9E, 0xEF, 0xF3, 0xBA, 0xED, 0xD8, 0x7E, 0x6C, 0x5B, 0x0F, 0x32, 0xEA,
+0x63, 0x4C, 0x6E, 0x86, 0xC1, 0x4B, 0x4C, 0x67, 0x68, 0x93, 0x24, 0x56, 0x45, 0xFB, 0x18, 0xE8,
+0x71, 0x23, 0x81, 0x0F, 0xEC, 0x1F, 0x9D, 0xD1, 0xE9, 0xB7, 0x94, 0xBE, 0xBB, 0x16, 0xA1, 0x48,
+0x3E, 0x28, 0xF6, 0x3D, 0xD9, 0x30, 0xD4, 0xF6, 0x3D, 0xC7, 0x86, 0x72, 0xBF, 0x70, 0x59, 0x4B,
+0xF9, 0x83, 0x3F, 0x53, 0x58, 0xD8, 0x0E, 0xFA, 0x4D, 0xAD, 0x88, 0x8C, 0x58, 0x03, 0x5C, 0xFD,
+0x13, 0x87, 0xFF, 0x48, 0x4E, 0x6B, 0x5A, 0x97, 0xFD, 0x58, 0x6F, 0xB8, 0xDD, 0xBE, 0x40, 0x35,
+0xC6, 0x18, 0xAD, 0x5A, 0x5D, 0x91, 0xEA, 0xD3, 0x6C, 0x55, 0x98, 0x36, 0x6F, 0x1E, 0x08, 0x0F,
+0x61, 0x47, 0x88, 0x27, 0xB1, 0xCB, 0xC6, 0xE3, 0xD8, 0x66, 0xEB, 0x31, 0x6C, 0x56, 0xDF, 0xF0,
+0xE3, 0x31, 0x94, 0x7D, 0xEC, 0x50, 0x78, 0x14, 0x89, 0x7B, 0xEF, 0x79, 0xE0, 0x80, 0x04, 0x0D,
+0xAC, 0x4C, 0x69, 0x5B, 0xBC, 0xF7, 0xBE, 0xD2, 0xEA, 0x00, 0x2D, 0x87, 0xD2, 0xD2, 0x9F, 0x50,
+0xCE, 0x4F, 0xE6, 0xD2, 0xE3, 0xD1, 0x8D, 0xEF, 0xA5, 0x87, 0xB1, 0x75, 0xD7, 0x13, 0xE8, 0xEB,
+0xE3, 0xE8, 0x2B, 0x1F, 0x8F, 0x61, 0x8F, 0xDC, 0x25, 0xFB, 0x2C, 0xFD, 0x34, 0x5C, 0x90, 0x94,
+0x99, 0xFD, 0xBD, 0x9F, 0xC9, 0x84, 0xB1, 0x6D, 0x9E, 0xF8, 0xD2, 0xC5, 0xB5, 0x73, 0x4E, 0x14,
+0xC1, 0x59, 0x6E, 0x5B, 0x7A, 0xA3, 0x01, 0x1F, 0xAC, 0x2B, 0xE6, 0x40, 0x5C, 0xB6, 0xE3, 0xCB,
+0x01, 0xB3, 0xA2, 0xF7, 0x3F, 0x11, 0xC4, 0x8E, 0x1F, 0xB0, 0x11, 0xEC, 0x38, 0x71, 0x0A, 0x52,
+0x31, 0x17, 0x68, 0x7E, 0x88, 0x25, 0x62, 0x90, 0x89, 0x6C, 0x6F, 0xF0, 0x50, 0x25, 0xCB, 0xBF,
+0x7E, 0x95, 0x7C, 0xD5, 0x3B, 0x2A, 0x4A, 0x5B, 0x92, 0x7E, 0xE4, 0xAB, 0x59, 0x08, 0x14, 0x6B,
+0x89, 0x73, 0xD1, 0xFD, 0xE7, 0x6A, 0x26, 0xA7, 0xD5, 0x5D, 0xAB, 0xDA, 0x55, 0x94, 0xB9, 0x78,
+0x7F, 0x6F, 0x8B, 0x9D, 0xB0, 0x45, 0xB6, 0x2A, 0xC3, 0x6B, 0x99, 0x7C, 0xAA, 0xF8, 0x77, 0x9C,
+0xF4, 0x21, 0x57, 0x7B, 0xA4, 0xA8, 0xF5, 0xD4, 0x54, 0xBB, 0xA8, 0x5F, 0xD9, 0xAD, 0xB4, 0xB5,
+0xAC, 0x90, 0x0F, 0x7C, 0x75, 0x30, 0x30, 0x05, 0xE6, 0x58, 0x1A, 0xBA, 0x3F, 0x40, 0xE8, 0xF7,
+0x29, 0x44, 0x09, 0x49, 0x5E, 0x9F, 0x26, 0x1C, 0xB2, 0xC3, 0x01, 0x7C, 0x1A, 0xDA, 0x98, 0xC6,
+0x46, 0xCC, 0xA1, 0x69, 0x60, 0x5C, 0xE5, 0x8C, 0xDB, 0x64, 0x69, 0x67, 0x33, 0x25, 0x4F, 0x7B,
+0x22, 0xD7, 0x18, 0x20, 0xE9, 0x7A, 0x2D, 0xB7, 0xE8, 0xD7, 0x86, 0x57, 0xC3, 0x85, 0x8C, 0x89,
+0x81, 0x71, 0xEF, 0x0D, 0xF8, 0x15, 0xB7, 0x07, 0x81, 0x02, 0x3B, 0x90, 0xE0, 0x54, 0x1C, 0xC0,
+0x57, 0xF1, 0xA0, 0xD3, 0x32, 0x73, 0x07, 0x9E, 0xC5, 0x1C, 0x67, 0xAE, 0xA7, 0x05, 0x63, 0xAB,
+0x3D, 0x4D, 0x0F, 0x7B, 0xE1, 0x3E, 0x75, 0x0B, 0x9B, 0xE6, 0x1D, 0xB2, 0x8B, 0xAC, 0x40, 0xA5,
+0xFF, 0x52, 0x24, 0x9B, 0xF8, 0xF6, 0xE3, 0x46, 0xFD, 0x17, 0xF5, 0xC1, 0x05, 0xA3, 0xB3, 0xAB,
+0x5B, 0x14, 0x26, 0x46, 0xB6, 0xED, 0x16, 0x62, 0xB7, 0xFA, 0x41, 0x24, 0xAB, 0x08, 0xF5, 0xF2,
+0x6B, 0x4B, 0x9D, 0x9B, 0x2F, 0xF2, 0xF5, 0xB0, 0xE2, 0x66, 0x0A, 0xF1, 0xE0, 0x03, 0xAD, 0x20,
+0x9E, 0x7B, 0xFA, 0xDB, 0xB1, 0x47, 0x6C, 0x77, 0x78, 0x66, 0xC7, 0xCA, 0x1F, 0x9F, 0xD9, 0xDE,
+0x1D, 0x3E, 0x8D, 0xC7, 0x53, 0xD8, 0x3F, 0xF6, 0x1E, 0xA4, 0x3E, 0xE9, 0xBC, 0x09, 0x7E, 0x8F,
+0x24, 0x45, 0x1A, 0xA9, 0xD9, 0x2A, 0xFB, 0x48, 0x33, 0x01, 0xEE, 0x62, 0xFB, 0x86, 0x2E, 0xD5,
+0x79, 0xF1, 0x75, 0x83, 0x79, 0x8B, 0x8F, 0x05, 0xBE, 0x5A, 0xD9, 0x85, 0x37, 0x42, 0xB8, 0xD2,
+0xE5, 0x36, 0xC7, 0xF5, 0x8B, 0x58, 0x0E, 0x31, 0xBD, 0xC2, 0xFC, 0xEB, 0x01, 0x0F, 0x74, 0xAB,
+0x18, 0xA9, 0xE7, 0x2F, 0xD6, 0xC0, 0xC8, 0x51, 0x44, 0xA0, 0xBF, 0x9E, 0xF2, 0xBA, 0x45, 0x16,
+0xE6, 0xA6, 0xAD, 0xD7, 0xFA, 0x63, 0x6D, 0xC1, 0xC1, 0x73, 0xA2, 0x8A, 0xB6, 0x20, 0xE7, 0xE0,
+0x40, 0x78, 0x12, 0xC4, 0xE6, 0x4B, 0x5F, 0x7C, 0x3C, 0x7C, 0xE9, 0xD9, 0xC5, 0x1E, 0x8F, 0xD9,
+0x7B, 0xFC, 0xEB, 0x0F, 0x94, 0x45, 0x62, 0xE3, 0x2F, 0x7D, 0x41, 0x1F, 0xCF, 0x3C, 0xF3, 0x70,
+0xD8, 0x0C, 0xE5, 0x6E, 0xA1, 0x09, 0xF2, 0x66, 0x7D, 0x0A, 0x1A, 0x00, 0x7F, 0x91, 0x22, 0x6C,
+0x13, 0x95, 0x37, 0x7E, 0x1B, 0x73, 0xAB, 0x38, 0xEE, 0x89, 0xCB, 0x7E, 0x7C, 0x19, 0xFD, 0xE5,
+0x43, 0xFB, 0xE4, 0x7F, 0xF1, 0x5C, 0xB0, 0xF0, 0x73, 0xD6, 0x4F, 0xF6, 0xD5, 0xFB, 0xFE, 0x85,
+0x47, 0xC3, 0xE7, 0x3F, 0xF7, 0x30, 0x72, 0xDA, 0x61, 0xBB, 0x39, 0x0B, 0x64, 0x61, 0xA0, 0x0D,
+0x45, 0x1B, 0x8E, 0xFD, 0xC8, 0xE8, 0xA4, 0x7C, 0x0E, 0x6E, 0xE4, 0x90, 0xD4, 0x2E, 0x8C, 0x60,
+0xBE, 0xB1, 0xCB, 0x6F, 0xE4, 0x96, 0xF1, 0x9A, 0xD5, 0x5D, 0xAD, 0x3E, 0x56, 0xD3, 0xF4, 0x62,
+0x2E, 0x3C, 0x04, 0x76, 0x10, 0xFE, 0x03, 0xD7, 0x01, 0xB4, 0x7C, 0x11, 0x60, 0xD1, 0x9D, 0x87,
+0xA9, 0xCC, 0x24, 0x85, 0xEA, 0x5D, 0x1A, 0xFC, 0xA0, 0xE9, 0x07, 0x35, 0x29, 0x3E, 0x26, 0x73,
+0x19, 0x49, 0x48, 0xE7, 0xA5, 0x94, 0xAB, 0x1F, 0xA4, 0x0C, 0xD1, 0xDF, 0x4B, 0x15, 0x8C, 0xE8,
+0x93, 0x27, 0x97, 0x68, 0xAD, 0x22, 0x7E, 0xB9, 0xCA, 0xC6, 0xF6, 0xDA, 0xAF, 0x3D, 0x55, 0x94,
+0x4C, 0x41, 0x11, 0x25, 0x26, 0xF9, 0xD8, 0x69, 0x73, 0xBC, 0xB0, 0xFE, 0x95, 0x5F, 0xF5, 0xAE,
+0xD8, 0xC4, 0xFA, 0xAC, 0x8C, 0x2B, 0x2E, 0xA6, 0xDE, 0xE5, 0xF9, 0xDD, 0xB4, 0x5B, 0xAA, 0xDC,
+0xA9, 0xFF, 0x95, 0xD6, 0x15, 0x55, 0x1C, 0x57, 0xEF, 0x6A, 0xD5, 0x20, 0x9B, 0x81, 0x6C, 0x3B,
+0x64, 0x3B, 0x7C, 0x39, 0xB6, 0x89, 0xAF, 0xDD, 0xDB, 0x27, 0xCE, 0x62, 0xDF, 0x3C, 0x44, 0x5E,
+0x35, 0xE1, 0x10, 0x53, 0x2C, 0x16, 0xA8, 0x56, 0xEE, 0x3C, 0xE1, 0x8A, 0x9D, 0xA0, 0xA1, 0xFD,
+0x51, 0xD5, 0x8D, 0xB8, 0xE8, 0xDC, 0xD0, 0xDD, 0x25, 0xEC, 0x4B, 0x5D, 0xCA, 0x64, 0x6A, 0xA8,
+0x61, 0x9D, 0x2B, 0x72, 0xB5, 0xEA, 0x96, 0xEE, 0x18, 0xA2, 0xE3, 0xC2, 0x07, 0x17, 0x31, 0xE6,
+0xAF, 0x23, 0xB1, 0xDC, 0x8E, 0xA8, 0xA6, 0x7E, 0xA6, 0xF9, 0xA0, 0x63, 0x74, 0xBD, 0x2F, 0xD5,
+0x9B, 0x88, 0x07, 0xA3, 0xF8, 0x2E, 0x80, 0xD4, 0x4D, 0x62, 0x3B, 0x37, 0xBA, 0x18, 0x70, 0xE1,
+0xE7, 0xB8, 0x49, 0x40, 0x6C, 0xA6, 0xD8, 0x55, 0x22, 0x9C, 0xCD, 0x7C, 0xEE, 0xFD, 0x8B, 0xEF,
+0x59, 0x79, 0x51, 0x76, 0xFD, 0x21, 0x93, 0xD2, 0xC8, 0x2D, 0xFE, 0xAA, 0x2F, 0x5D, 0xA6, 0xD2,
+0x71, 0xDE, 0xF2, 0x21, 0xCA, 0x9C, 0xE1, 0x4A, 0x2C, 0xC1, 0x42, 0x3A, 0xB0, 0xED, 0x1C, 0xDB,
+0x41, 0xA7, 0x69, 0xE6, 0x19, 0x24, 0xC9, 0x5D, 0x6D, 0x3C, 0x6E, 0x22, 0xB4, 0x95, 0xAA, 0x1A,
+0xFC, 0x7A, 0x48, 0xD7, 0xE8, 0xC7, 0xF4, 0x86, 0xC8, 0x60, 0xBD, 0x3E, 0xF0, 0xFE, 0xCC, 0x05,
+0xC6, 0x1D, 0x23, 0x28, 0x7C, 0x3E, 0xB8, 0xB1, 0x23, 0xFC, 0xD2, 0x81, 0xFE, 0xF0, 0xEB, 0x87,
+0x06, 0x6E, 0xF8, 0xF1, 0x6B, 0xB8, 0xF6, 0xD9, 0xDD, 0x3D, 0xF0, 0x7F, 0x5C, 0x71, 0xEF, 0x16,
+0x34, 0x51, 0x7C, 0xE3, 0xB8, 0x70, 0xA2, 0x71, 0x33, 0xF8, 0x0C, 0x5C, 0x45, 0xB4, 0xE0, 0xA2,
+0xFB, 0x86, 0x2E, 0x31, 0x48, 0x92, 0x0B, 0xEF, 0xCA, 0x10, 0xB6, 0x7F, 0x42, 0x52, 0x5A, 0xFA,
+0xE8, 0xD6, 0x6B, 0x9A, 0x4C, 0xB8, 0x7C, 0xD5, 0xBB, 0x31, 0x75, 0x50, 0xBE, 0x2B, 0xED, 0xF3,
+0x29, 0xFB, 0x81, 0x22, 0xDF, 0x9B, 0x38, 0xF8, 0xCB, 0x76, 0xAC, 0x73, 0xD8, 0xA9, 0x61, 0x08,
+0x7D, 0x58, 0xF9, 0x0F, 0x53, 0x89, 0xC0, 0xC4, 0x1E, 0xDA, 0xC4, 0x61, 0xD1, 0x9F, 0x84, 0x1F,
+0xE7, 0x7B, 0x61, 0x25, 0x0B, 0xBE, 0x2D, 0x57, 0x95, 0x1F, 0x66, 0xC4, 0x9F, 0x51, 0xD1, 0x70,
+0xD2, 0xE7, 0x1C, 0x5D, 0x8F, 0x20, 0x91, 0xCF, 0x7F, 0xE6, 0xA1, 0xF0, 0xCB, 0x5F, 0x7B, 0x26,
+0xFC, 0xCA, 0xD7, 0x3F, 0x1B, 0x7E, 0xF5, 0x17, 0x3E, 0xB7, 0xE2, 0xC7, 0xDF, 0xFE, 0xC5, 0xCF,
+0x87, 0x5F, 0xF8, 0x99, 0x4F, 0x23, 0xA2, 0x79, 0xD3, 0xE2, 0x41, 0x03, 0x2B, 0x9E, 0x66, 0x71,
+0x11, 0x6C, 0x90, 0xE4, 0x2C, 0x7E, 0x03, 0x7E, 0x17, 0xAF, 0xC3, 0xF7, 0xB2, 0x10, 0x3B, 0x3C,
+0xFF, 0xF2, 0x67, 0x1F, 0x0E, 0x7F, 0x0B, 0x7D, 0xFD, 0x5B, 0xE8, 0x2B, 0x1F, 0x2B, 0xED, 0x33,
+0xFB, 0xFB, 0x4B, 0xC0, 0xEB, 0x81, 0x7B, 0xF7, 0x69, 0xB4, 0x2F, 0xEA, 0xEC, 0x81, 0x29, 0x9B,
+0x23, 0x7E, 0x15, 0xD1, 0xD5, 0x9C, 0xFF, 0x54, 0x9E, 0x57, 0x7A, 0xF0, 0x3B, 0x9B, 0x73, 0x8F,
+0x22, 0x41, 0xFA, 0x39, 0xBE, 0xD2, 0x5A, 0x6E, 0xBC, 0xFC, 0x6D, 0x4F, 0xEC, 0xD8, 0x35, 0x06,
+0x4E, 0x9C, 0xBE, 0x3C, 0x18, 0x46, 0xB9, 0xA1, 0x34, 0x61, 0x9A, 0xC1, 0x5F, 0x38, 0x98, 0x7F,
+0xBC, 0x5F, 0x7B, 0xC6, 0x0B, 0xA3, 0x0A, 0x67, 0x1F, 0x99, 0x58, 0x29, 0x17, 0xC1, 0x0C, 0x58,
+0x53, 0x7B, 0xA2, 0x6F, 0x5C, 0xBD, 0x0F, 0xA5, 0x9D, 0x33, 0x1A, 0x65, 0x4B, 0x73, 0xF5, 0x8B,
+0x8B, 0x35, 0xBA, 0xA9, 0x4B, 0xEB, 0x4F, 0xEF, 0x57, 0xD4, 0x25, 0x21, 0x33, 0xF6, 0x5E, 0x94,
+0xFB, 0x6B, 0xEA, 0xF2, 0x97, 0xF6, 0x05, 0x29, 0xCA, 0x5C, 0x7E, 0x2E, 0xAF, 0x03, 0xEF, 0x89,
+0x5F, 0x4F, 0x56, 0x97, 0x72, 0x49, 0x33, 0xEB, 0xC6, 0xB6, 0xE8, 0x87, 0x90, 0x0E, 0xCF, 0x24,
+0x76, 0xFC, 0x52, 0xFF, 0x10, 0x7E, 0x5F, 0x43, 0xF8, 0xE5, 0xDD, 0x8C, 0x83, 0x6A, 0x06, 0x77,
+0x57, 0x22, 0xB1, 0x63, 0x0E, 0xB7, 0x9A, 0xEF, 0xFD, 0x05, 0x0B, 0x41, 0x1C, 0x3E, 0x81, 0xD2,
+0x48, 0x9D, 0x35, 0x54, 0xBF, 0x1E, 0x74, 0x1C, 0x5D, 0x5D, 0x8D, 0x7D, 0x10, 0x92, 0x13, 0xB9,
+0x4E, 0x1C, 0x8A, 0x39, 0x92, 0x49, 0x10, 0x3B, 0x50, 0x99, 0x70, 0x08, 0x69, 0x12, 0xD6, 0xC3,
+0xA7, 0xAC, 0x19, 0x24, 0x66, 0x12, 0x73, 0xFC, 0x28, 0xD2, 0xCB, 0x4C, 0x4C, 0x4E, 0x0A, 0xA9,
+0x54, 0x13, 0x6C, 0x22, 0x75, 0xB9, 0x69, 0x7F, 0xC1, 0xD4, 0xB3, 0xBE, 0x54, 0x24, 0xBD, 0x9A,
+0x9F, 0x89, 0x89, 0xD7, 0xD9, 0xE2, 0x59, 0x33, 0xB7, 0x75, 0x5E, 0xBA, 0x52, 0xA7, 0x9F, 0x05,
+0xE2, 0xC7, 0xB0, 0x7D, 0x46, 0x4A, 0xF3, 0xD5, 0x3A, 0x28, 0x21, 0xEB, 0x7B, 0xA8, 0x86, 0xAC,
+0xF8, 0x9B, 0xBD, 0x19, 0x53, 0xE7, 0x13, 0x73, 0x0F, 0x92, 0x3A, 0xE6, 0x9F, 0x23, 0x8A, 0x54,
+0xD9, 0x0E, 0x62, 0x9F, 0xD8, 0x07, 0x37, 0x75, 0xDD, 0xF0, 0xE3, 0x01, 0x5C, 0xBB, 0x6F, 0xA0,
+0x03, 0x2E, 0x2A, 0x1F, 0x7F, 0x5C, 0x44, 0xF1, 0xC2, 0x02, 0xD7, 0x8D, 0xC5, 0x4D, 0xF6, 0xB4,
+0xBD, 0x78, 0x4D, 0x72, 0x7B, 0xAD, 0xF4, 0x98, 0x84, 0x9F, 0xE8, 0x49, 0xB8, 0x15, 0x7C, 0xC4,
+0xFD, 0x41, 0x17, 0xD9, 0x50, 0x5E, 0x12, 0xF6, 0x7A, 0xBA, 0x0F, 0xCE, 0x75, 0xA8, 0x7C, 0xFC,
+0xBE, 0x69, 0xE4, 0x7B, 0x5D, 0x16, 0x4E, 0x9A, 0x58, 0x4D, 0x4D, 0xF1, 0xE9, 0xCC, 0xFA, 0x36,
+0x62, 0x47, 0x07, 0x4F, 0xD1, 0xC2, 0x1F, 0x4C, 0xA7, 0x11, 0x90, 0xB4, 0xD2, 0xAD, 0xAC, 0xF8,
+0x03, 0x8F, 0xC1, 0x08, 0x8C, 0x34, 0x95, 0xB4, 0x1F, 0x1F, 0x1F, 0xDA, 0x85, 0x10, 0x2E, 0x60,
+0x69, 0x2B, 0x45, 0x59, 0x3F, 0x9F, 0xFD, 0x30, 0x9B, 0x4A, 0x03, 0x41, 0x40, 0x76, 0x82, 0x90,
+0x71, 0x3B, 0xB7, 0xFB, 0xB1, 0xB7, 0xE9, 0x4A, 0x1E, 0xCC, 0x37, 0xB8, 0x09, 0xA9, 0x5D, 0x36,
+0xC2, 0xCF, 0x8E, 0x29, 0x3E, 0x48, 0xEE, 0x6F, 0xCA, 0xF7, 0xDE, 0x4A, 0xFB, 0x68, 0x04, 0x76,
+0x31, 0x24, 0x3A, 0xE0, 0x22, 0xB4, 0x75, 0xCB, 0x7A, 0xF9, 0x0E, 0xE2, 0xF7, 0xD5, 0xA6, 0x8D,
+0xEB, 0xC2, 0x3D, 0xC8, 0x97, 0xB8, 0x92, 0xBE, 0xB2, 0x2C, 0x73, 0x2C, 0x6E, 0x81, 0x7F, 0x1D,
+0x23, 0xA6, 0x37, 0xAD, 0x47, 0x62, 0x67, 0x8B, 0x7E, 0x95, 0xF9, 0x03, 0x1C, 0xF8, 0xC3, 0x7A,
+0x18, 0x19, 0x38, 0x86, 0x90, 0xA5, 0x40, 0xA2, 0xC4, 0x1B, 0x99, 0x94, 0x59, 0xA3, 0x39, 0x8F,
+0x2F, 0x33, 0x18, 0xC5, 0xF7, 0x70, 0x5E, 0xE1, 0xF5, 0x2B, 0x9F, 0x09, 0xD5, 0x2B, 0x3E, 0x11,
+0xC4, 0x6E, 0x8C, 0x3B, 0x4E, 0xE0, 0x4B, 0x62, 0x06, 0x1F, 0x7C, 0x51, 0xC4, 0xE8, 0x5C, 0x8E,
+0x47, 0x6E, 0xA6, 0x5B, 0x00, 0xC4, 0x0A, 0x26, 0x54, 0x4E, 0xAD, 0x54, 0xC5, 0xE3, 0x4D, 0x44,
+0xF6, 0x92, 0x95, 0x5F, 0xDE, 0x37, 0xD5, 0xCE, 0x7D, 0x1C, 0xF4, 0x1A, 0x25, 0x07, 0xAE, 0x84,
+0x24, 0xFF, 0x38, 0x53, 0x8E, 0x44, 0xFD, 0x60, 0x11, 0x2F, 0x67, 0xFE, 0x5F, 0xF1, 0x5B, 0x42,
+0x3D, 0xFC, 0x34, 0x8A, 0xD5, 0x7C, 0x9E, 0xEC, 0x5E, 0xEA, 0x33, 0x26, 0x0D, 0xD1, 0x32, 0xFC,
+0x6B, 0xBF, 0x0E, 0x75, 0x92, 0x59, 0xFB, 0xE4, 0xD7, 0xAA, 0x91, 0x31, 0x7F, 0xEE, 0x6D, 0x97,
+0x3A, 0xFD, 0xA1, 0x75, 0x79, 0x3F, 0x62, 0x7F, 0xA4, 0x8D, 0xAC, 0x4B, 0x29, 0xAB, 0x46, 0x52,
+0xB2, 0xFB, 0xF0, 0x63, 0xC4, 0xAF, 0x17, 0xDE, 0xEA, 0x04, 0xA2, 0x91, 0x87, 0xEB, 0x6D, 0x31,
+0xF3, 0x71, 0x67, 0x5F, 0x9D, 0xEB, 0xD9, 0x4A, 0x0A, 0x0F, 0x6D, 0x20, 0x75, 0xAD, 0x54, 0x66,
+0x49, 0x47, 0xBD, 0x0F, 0x2A, 0x91, 0x1A, 0x17, 0xB6, 0xB1, 0x91, 0xD7, 0xDA, 0x2F, 0x8D, 0xF4,
+0xB4, 0x59, 0x21, 0xD7, 0x70, 0x1C, 0x0C, 0x27, 0x9E, 0xF7, 0x31, 0xB4, 0xF2, 0xAC, 0x8B, 0xD8,
+0x79, 0xF4, 0xAC, 0x5C, 0x3F, 0x3D, 0x19, 0x5A, 0x67, 0xB0, 0xDB, 0x44, 0xCB, 0x5C, 0x78, 0x0C,
+0x89, 0x4D, 0x37, 0x5A, 0xB6, 0xF7, 0x55, 0xE8, 0x6A, 0xA5, 0xCA, 0x51, 0xE0, 0xFB, 0x16, 0x36,
+0x5E, 0x9F, 0xC0, 0x0F, 0x16, 0xE6, 0x67, 0x64, 0x8A, 0x91, 0x28, 0x06, 0xD8, 0x18, 0xD5, 0x46,
+0xEF, 0xAA, 0xFF, 0xA6, 0xCE, 0x8B, 0x98, 0xB7, 0xCE, 0x94, 0x47, 0xE9, 0xB7, 0x8D, 0xA7, 0x47,
+0xC0, 0x0A, 0x36, 0xB1, 0xAE, 0xE4, 0x7B, 0xE7, 0xBE, 0x9A, 0x3E, 0x0F, 0x7D, 0x3E, 0xCB, 0xC2,
+0xCB, 0xAD, 0x83, 0x5A, 0xD4, 0x01, 0x7E, 0x17, 0xD4, 0x3A, 0x26, 0x26, 0x5E, 0xE9, 0x97, 0xDC,
+0x6A, 0x63, 0xB7, 0x9A, 0xF5, 0xCB, 0x47, 0x6D, 0x01, 0x93, 0xFE, 0x78, 0x77, 0x24, 0x69, 0xEF,
+0x47, 0x4E, 0x1F, 0xA6, 0x3D, 0x61, 0x0E, 0x3B, 0xA6, 0x3E, 0x69, 0xDE, 0xB1, 0xFC, 0xBD, 0x48,
+0x16, 0xB8, 0x0D, 0x14, 0xA3, 0x22, 0x4F, 0xE1, 0x47, 0x1D, 0xB7, 0x71, 0x5A, 0xE9, 0x31, 0x81,
+0xFD, 0x5A, 0xDF, 0x45, 0x12, 0xD8, 0x77, 0x3F, 0x3C, 0x25, 0xFB, 0xB5, 0xD6, 0x33, 0x23, 0xAA,
+0x3A, 0xA8, 0xDB, 0xA2, 0x71, 0xCE, 0x31, 0xBD, 0xD1, 0x38, 0x5C, 0x6E, 0x1A, 0x31, 0xFD, 0x6A,
+0x74, 0x24, 0xCA, 0x0A, 0x69, 0x4C, 0x83, 0x44, 0x73, 0xDA, 0x56, 0xEC, 0xD3, 0xC9, 0x84, 0xC1,
+0x9C, 0xBF, 0xCC, 0x7D, 0x7A, 0xF8, 0xD8, 0x19, 0x29, 0xBB, 0x92, 0x83, 0x91, 0xB5, 0xDC, 0x81,
+0x81, 0x3B, 0x58, 0x68, 0x02, 0xFA, 0x45, 0x8E, 0xE5, 0xE1, 0xAC, 0x73, 0xA1, 0xB5, 0x77, 0x19,
+0x12, 0x53, 0xB9, 0xD0, 0xD6, 0x19, 0xFB, 0x96, 0x8E, 0x6F, 0x75, 0xC2, 0x1C, 0xB9, 0x6B, 0x07,
+0x37, 0x9B, 0x9F, 0x0F, 0xD7, 0x41, 0xC2, 0xA7, 0xD8, 0xCF, 0x1B, 0x68, 0x13, 0x73, 0x17, 0x32,
+0xB1, 0xF1, 0xEB, 0x6F, 0x1D, 0x0B, 0x47, 0x8F, 0x9D, 0x95, 0x04, 0xC5, 0x37, 0xE5, 0xA8, 0xED,
+0x63, 0x23, 0x04, 0x79, 0x89, 0x32, 0xEC, 0xEF, 0xEE, 0x9D, 0xD8, 0xD2, 0x0C, 0xE3, 0xCC, 0x2D,
+0x46, 0xCF, 0x22, 0xB2, 0x95, 0xC2, 0xCF, 0x4A, 0x8F, 0x49, 0xF4, 0xF7, 0xC3, 0xC3, 0xA7, 0xC3,
+0x6B, 0x6F, 0x1D, 0x0D, 0xEF, 0x7C, 0x80, 0x3D, 0x85, 0x99, 0x32, 0x06, 0x07, 0x7F, 0x10, 0xEC,
+0xC6, 0x1E, 0xC7, 0x88, 0x47, 0xC2, 0x7E, 0xB4, 0x23, 0x61, 0xE4, 0xFA, 0x90, 0x44, 0x08, 0x73,
+0xBE, 0xAD, 0xE4, 0xE0, 0xD6, 0x64, 0x9C, 0x77, 0xCC, 0xE2, 0xB1, 0x3A, 0xBF, 0x0A, 0x96, 0x6E,
+0xCD, 0x27, 0x82, 0xD8, 0x4D, 0x80, 0xC4, 0x1D, 0xC5, 0x7E, 0x6E, 0x94, 0x44, 0x99, 0x5B, 0x8C,
+0x66, 0xD8, 0xF9, 0xCC, 0x4C, 0xB7, 0x12, 0xC0, 0x6B, 0xCB, 0xD6, 0x9D, 0x77, 0x71, 0x0C, 0x75,
+0xE1, 0x8C, 0xC7, 0x82, 0x0F, 0xB8, 0x12, 0xB6, 0xE4, 0xE2, 0x61, 0x04, 0x8E, 0x43, 0x59, 0xEF,
+0xCB, 0x80, 0x65, 0xAD, 0x32, 0xE5, 0x27, 0x5E, 0xB7, 0xFE, 0x75, 0xC5, 0x44, 0x5E, 0xC4, 0xEB,
+0xAB, 0x65, 0xF4, 0xAD, 0x74, 0xAE, 0xF6, 0x83, 0x9E, 0x54, 0x3B, 0xFB, 0xF2, 0xF0, 0x7B, 0x4A,
+0xD3, 0x16, 0xAA, 0x76, 0xD9, 0x77, 0xA2, 0xDD, 0xD6, 0x5B, 0xA5, 0xAA, 0x1D, 0x5B, 0x7C, 0x15,
+0xBF, 0x5C, 0xA9, 0x28, 0x35, 0xEB, 0x68, 0x03, 0x99, 0x23, 0xA9, 0xA3, 0x49, 0xD2, 0x7D, 0xC8,
+0x2A, 0xEB, 0x6B, 0xE5, 0x4B, 0x2E, 0x53, 0x1D, 0x05, 0x53, 0xFF, 0x5E, 0x4B, 0xFD, 0x77, 0xF5,
+0x49, 0x3B, 0x58, 0x1D, 0x9B, 0xCA, 0x77, 0x08, 0x73, 0xC6, 0x81, 0xD4, 0xD1, 0x04, 0x4C, 0x67,
+0xF4, 0x03, 0xDB, 0x37, 0x84, 0xBE, 0x15, 0xEC, 0xB9, 0x78, 0xA3, 0xF8, 0xB0, 0x8F, 0xA3, 0xF8,
+0x42, 0x66, 0x42, 0x68, 0xFA, 0xD7, 0x71, 0xE1, 0x4F, 0xD1, 0x78, 0xB5, 0x5F, 0x28, 0x6E, 0x26,
+0xAD, 0x74, 0xD6, 0xBA, 0xA6, 0x65, 0x1D, 0x03, 0xE5, 0x7D, 0x69, 0x4E, 0xF2, 0x7C, 0xEA, 0xAF,
+0xFA, 0x88, 0xA6, 0xF9, 0xAF, 0x3F, 0x9A, 0x54, 0x19, 0xD4, 0xEB, 0xC4, 0x0C, 0x8B, 0xBD, 0x84,
+0x49, 0x06, 0xD9, 0x9E, 0x7D, 0x6B, 0xC0, 0xBF, 0xAE, 0x32, 0x8F, 0x96, 0x19, 0xB0, 0x85, 0x9F,
+0xBC, 0x1B, 0x1D, 0xE1, 0xEA, 0x75, 0xCC, 0x80, 0xB0, 0x15, 0x5B, 0x89, 0xB1, 0xFE, 0xF3, 0x63,
+0x33, 0x61, 0x08, 0x91, 0xB1, 0x2B, 0x59, 0x37, 0xA8, 0xA4, 0x31, 0x21, 0x31, 0xAF, 0x3D, 0x03,
+0x62, 0x78, 0x1E, 0x11, 0xB2, 0xD3, 0x4B, 0x54, 0x20, 0x7B, 0xD3, 0x22, 0xA1, 0xF1, 0xCB, 0x17,
+0x27, 0xC2, 0x4B, 0xC8, 0x99, 0xC7, 0x04, 0xC7, 0x13, 0x4B, 0x90, 0xC9, 0x4E, 0x90, 0xA2, 0xDD,
+0x08, 0x1A, 0xA2, 0x2A, 0x72, 0x05, 0xAA, 0x83, 0x64, 0xFA, 0xAF, 0xDD, 0x62, 0x6A, 0x09, 0x28,
+0x38, 0x77, 0x86, 0x11, 0x70, 0x75, 0xF4, 0xC8, 0x99, 0x70, 0x1C, 0x3F, 0x56, 0xA6, 0xA0, 0x5A,
+0xD4, 0x53, 0x7F, 0x48, 0x20, 0xD7, 0x21, 0xBB, 0xBF, 0xEF, 0x25, 0x4B, 0x05, 0xEE, 0xFA, 0xE0,
+0x48, 0x43, 0xA6, 0x2F, 0x9A, 0x49, 0xAF, 0xCA, 0xDE, 0xA3, 0x9E, 0xF2, 0x4A, 0x67, 0x36, 0x7D,
+0xB0, 0x06, 0x06, 0x7A, 0xC2, 0x46, 0xA8, 0x4E, 0xFD, 0xEB, 0xFB, 0xC4, 0x8D, 0xE7, 0x0C, 0x54,
+0xC3, 0x6B, 0xD7, 0x47, 0x56, 0xB4, 0x45, 0x22, 0x89, 0xE0, 0x07, 0x47, 0x4E, 0x4B, 0xEA, 0x97,
+0x25, 0xF9, 0xD7, 0x4A, 0x26, 0x54, 0x05, 0xB3, 0xDA, 0xCF, 0xF5, 0x72, 0x73, 0xCB, 0x3F, 0xC7,
+0x55, 0xD6, 0xD3, 0x0D, 0x75, 0xF5, 0x00, 0x7E, 0x80, 0x76, 0xA2, 0xDF, 0x83, 0xC0, 0xEE, 0x28,
+0xF6, 0x8D, 0x3D, 0x8E, 0x14, 0x1F, 0xCC, 0xC5, 0xD6, 0xE8, 0x41, 0x0C, 0x49, 0xE0, 0x7F, 0xF4,
+0xE3, 0xB7, 0xF0, 0x78, 0x23, 0x9C, 0x40, 0x3A, 0x10, 0x9E, 0x5B, 0x78, 0x34, 0xC2, 0xCA, 0x1A,
+0xBD, 0xEB, 0x8D, 0x95, 0x63, 0xEA, 0x9A, 0xBB, 0xF6, 0x6C, 0x97, 0x7C, 0xA7, 0x13, 0x0C, 0xA8,
+0xC4, 0x0F, 0x07, 0xFE, 0x18, 0x58, 0xC9, 0x21, 0xFE, 0xCC, 0x98, 0x0F, 0x3F, 0x79, 0xF1, 0xED,
+0xF0, 0x43, 0xE4, 0xB4, 0x7B, 0xFB, 0x9D, 0x13, 0x20, 0x76, 0x8A, 0x17, 0x7F, 0x10, 0x1C, 0xE0,
+0xDE, 0xC8, 0xF8, 0xFE, 0xA7, 0x52, 0x7D, 0x0D, 0xAA, 0xDD, 0x31, 0xA4, 0x8F, 0x71, 0xE2, 0xD7,
+0xE8, 0x7D, 0xC6, 0xD0, 0x26, 0xEE, 0x6E, 0xC1, 0x1F, 0x16, 0x4B, 0x4F, 0xA0, 0x46, 0x6B, 0x5C,
+0x59, 0xB9, 0xDB, 0x9A, 0xD8, 0xA9, 0x7A, 0xD4, 0x22, 0xA4, 0xE2, 0x14, 0x4C, 0xB1, 0x92, 0x67,
+0x86, 0xF6, 0x6E, 0x49, 0x5C, 0x6B, 0x3B, 0x4E, 0x2C, 0xF6, 0xF9, 0x58, 0xEC, 0xD3, 0x98, 0x95,
+0x8F, 0x7A, 0x98, 0x3A, 0xA3, 0xB9, 0xF0, 0x23, 0x04, 0x48, 0x09, 0x85, 0x47, 0x21, 0x29, 0xD9,
+0x11, 0x25, 0x4B, 0x16, 0x3D, 0x3E, 0xD7, 0x6B, 0xD4, 0x8F, 0x49, 0xD5, 0xA2, 0xA8, 0xF2, 0x89,
+0xBA, 0x66, 0x05, 0xED, 0x02, 0x57, 0xC2, 0xE2, 0xDE, 0xAD, 0x99, 0xCA, 0x24, 0xD7, 0xC9, 0xE5,
+0x6E, 0x16, 0xCD, 0xEA, 0x34, 0x45, 0x8F, 0xBE, 0x60, 0xEE, 0x6B, 0xA5, 0xF7, 0x63, 0x3B, 0xDC,
+0xA7, 0xCC, 0x54, 0x3B, 0x53, 0xB6, 0x7C, 0x6F, 0x59, 0x6D, 0x8F, 0x96, 0x89, 0x75, 0xB3, 0x6F,
+0xD6, 0x11, 0xCF, 0xB9, 0x17, 0x15, 0x31, 0x57, 0x7F, 0x58, 0xDE, 0xDB, 0x87, 0x2F, 0x77, 0x6E,
+0xDF, 0xB2, 0xD4, 0x8F, 0xD6, 0x95, 0x4D, 0xB9, 0xA5, 0x4B, 0x0B, 0x51, 0x65, 0xD0, 0x84, 0x3C,
+0x52, 0x3A, 0x1B, 0xE5, 0x72, 0xB9, 0x19, 0x51, 0xD5, 0x38, 0x55, 0x32, 0x55, 0xF1, 0x34, 0x46,
+0x62, 0x83, 0x24, 0x17, 0xE8, 0xF8, 0x18, 0x76, 0x8C, 0xA4, 0xE6, 0x6B, 0xEF, 0xBF, 0xFB, 0xE8,
+0xC5, 0x60, 0x0C, 0xCE, 0xAB, 0xA9, 0x09, 0x6C, 0x23, 0x06, 0x62, 0x87, 0xC0, 0x89, 0x2D, 0x50,
+0x2D, 0xB8, 0x35, 0xCC, 0x6A, 0x1F, 0x6C, 0xC7, 0x08, 0x7C, 0xEB, 0x2E, 0x5F, 0xB9, 0x0E, 0xC5,
+0x10, 0xFE, 0x75, 0xF8, 0x92, 0x56, 0xDF, 0x4A, 0x23, 0x58, 0x3E, 0x1F, 0x6D, 0x7C, 0x55, 0x60,
+0xD5, 0xBE, 0xB8, 0xAA, 0xAC, 0x84, 0xD5, 0xC6, 0x5A, 0xE6, 0xAE, 0xFD, 0x17, 0x15, 0xBC, 0x5C,
+0xBD, 0x55, 0x1C, 0xD3, 0x6E, 0x26, 0x49, 0xAD, 0x8D, 0xFE, 0x7C, 0xC0, 0x42, 0x14, 0x3B, 0x06,
+0x4E, 0xA0, 0x6E, 0x9A, 0x26, 0x0E, 0xC8, 0xB6, 0x6A, 0xB7, 0xF5, 0x57, 0xC6, 0x6A, 0x0F, 0xD5,
+0x4D, 0xA9, 0xBF, 0x0B, 0xAA, 0xE7, 0x7E, 0x98, 0x4E, 0x69, 0x39, 0xBD, 0x86, 0x94, 0x25, 0x57,
+0x91, 0xCA, 0x84, 0x4E, 0xFE, 0x8D, 0x1E, 0x4C, 0x4A, 0x7C, 0xF4, 0xFA, 0xB4, 0x24, 0x36, 0x7E,
+0xE1, 0xC2, 0x78, 0x78, 0xF5, 0xD2, 0x84, 0xE4, 0xB1, 0x5B, 0xEC, 0x20, 0x09, 0xFC, 0xFE, 0x99,
+0xD1, 0xF0, 0xCF, 0xDF, 0xBE, 0x1E, 0xFE, 0xFB, 0xB7, 0xAE, 0x85, 0x3F, 0x3D, 0x3E, 0x2A, 0xF7,
+0x5D, 0xEC, 0x0A, 0x46, 0x41, 0x3F, 0x70, 0xEF, 0x7E, 0xF8, 0x30, 0xB5, 0x87, 0x31, 0xFC, 0xA8,
+0x7B, 0xE7, 0xBD, 0x8F, 0x10, 0x44, 0xD1, 0xF8, 0xE2, 0x29, 0x3E, 0xD1, 0xF0, 0x4D, 0x3A, 0x75,
+0xFC, 0x6C, 0xB8, 0x00, 0x52, 0xC5, 0xDD, 0x11, 0xEA, 0xA9, 0x16, 0x4C, 0x1A, 0xBC, 0x01, 0x9F,
+0x31, 0xD9, 0x9E, 0x0E, 0xD7, 0x48, 0x82, 0x6E, 0x58, 0x07, 0xA6, 0x1B, 0x50, 0x08, 0x65, 0x4F,
+0x4F, 0x98, 0x58, 0xC5, 0xCC, 0x5B, 0x93, 0xA3, 0xAE, 0x03, 0x64, 0x67, 0xC7, 0x9E, 0x6D, 0x61,
+0x27, 0x1E, 0xFC, 0x41, 0x72, 0xE5, 0xE2, 0x75, 0x24, 0xDF, 0xBD, 0xBC, 0x22, 0x93, 0x32, 0xCD,
+0xB0, 0xCF, 0xBF, 0xFA, 0x01, 0xB6, 0xAF, 0xC4, 0x82, 0x6F, 0x9F, 0xC5, 0xBA, 0xF8, 0xAE, 0x44,
+0x75, 0x8B, 0x15, 0xDC, 0x08, 0x41, 0xAA, 0xCF, 0x20, 0x69, 0x32, 0xA5, 0x69, 0xB1, 0x07, 0xCA,
+0xFA, 0xF0, 0xC4, 0x74, 0xF8, 0xFE, 0xF3, 0x6F, 0x85, 0xBF, 0x79, 0xEE, 0x0D, 0x98, 0x91, 0x1B,
+0xF7, 0x89, 0x26, 0x89, 0x7D, 0xE5, 0xF5, 0x0F, 0xC3, 0x5F, 0x7E, 0xE3, 0xB9, 0xF0, 0x9D, 0x6F,
+0xFD, 0x18, 0xB9, 0xF0, 0x2E, 0x2F, 0x42, 0xAE, 0x6F, 0xA8, 0xB3, 0xD6, 0x6B, 0x9B, 0x6D, 0x8D,
+0x4C, 0xF3, 0x25, 0x3E, 0x0B, 0xDC, 0xAA, 0xEE, 0xD0, 0x01, 0xDD, 0x1F, 0x76, 0x04, 0x2A, 0xDB,
+0x8B, 0xAF, 0x7D, 0x88, 0x00, 0x87, 0x95, 0x65, 0x6D, 0xE0, 0xCE, 0x55, 0xA7, 0xB1, 0xBF, 0xEE,
+0x37, 0xD1, 0xDF, 0x6F, 0xFC, 0xD9, 0x73, 0xE1, 0xCD, 0xB7, 0x8F, 0x8A, 0xB9, 0x95, 0x07, 0xF1,
+0x7C, 0x80, 0x78, 0x32, 0x40, 0x0C, 0x8F, 0xCB, 0x48, 0x86, 0xFC, 0x93, 0x57, 0x3F, 0x14, 0xB3,
+0xFC, 0x4A, 0x0E, 0x26, 0x78, 0x7E, 0xE3, 0xDD, 0x13, 0x48, 0x5D, 0x85, 0x75, 0x8C, 0x1F, 0xF4,
+0x1B, 0x19, 0xF2, 0x95, 0xDC, 0xB0, 0xA6, 0xEC, 0x6D, 0xFF, 0x2D, 0x4D, 0x5B, 0xF5, 0x25, 0xB0,
+0x6B, 0xAA, 0x46, 0x92, 0xBF, 0x86, 0x41, 0x13, 0xB2, 0x3F, 0xAC, 0xAE, 0xE3, 0x1F, 0xF7, 0xD0,
+0x6A, 0xFC, 0xD7, 0x90, 0xD6, 0xA6, 0x89, 0x59, 0xF3, 0xCA, 0x55, 0xCD, 0x90, 0x23, 0x9E, 0xF6,
+0x6B, 0xF4, 0x84, 0x2B, 0x1D, 0x95, 0x46, 0x19, 0xA9, 0x4B, 0xEF, 0x59, 0xFD, 0x76, 0x3F, 0xA9,
+0x33, 0x53, 0x54, 0x44, 0x59, 0x92, 0x05, 0x5A, 0xEB, 0xCC, 0x95, 0x39, 0x5F, 0xE4, 0x63, 0x33,
+0x8C, 0x37, 0xEA, 0xEA, 0x6F, 0x0D, 0x73, 0x6E, 0xB3, 0xA0, 0x5A, 0x6B, 0x7F, 0xF6, 0xD9, 0x4A,
+0xBE, 0x76, 0x3E, 0xE7, 0xFC, 0xCD, 0xA4, 0x23, 0xBA, 0xF9, 0x44, 0xE1, 0xBE, 0x09, 0x60, 0x37,
+0x30, 0x58, 0x02, 0x07, 0xBE, 0xE4, 0x25, 0x9D, 0x8D, 0x8C, 0x83, 0x23, 0xEF, 0xEE, 0xCB, 0xB5,
+0x2D, 0x49, 0x13, 0x41, 0xCD, 0xD9, 0xB9, 0xA2, 0xE5, 0x6D, 0x36, 0x8C, 0x0C, 0x27, 0xC5, 0x3D,
+0x29, 0xAD, 0x8A, 0x37, 0x1E, 0x73, 0x98, 0x5B, 0x50, 0xEC, 0x3A, 0xF0, 0xA3, 0x61, 0x37, 0x72,
+0x1B, 0xAD, 0x6F, 0x60, 0x83, 0xEE, 0x06, 0xBA, 0xB4, 0x6C, 0x11, 0x7E, 0xD1, 0x9C, 0x85, 0x19,
+0x65, 0x78, 0x64, 0x14, 0xCD, 0x00, 0xA1, 0xE2, 0x2E, 0x20, 0xF9, 0x64, 0xF3, 0x71, 0xF5, 0x71,
+0xCE, 0xA6, 0xA2, 0xBC, 0xE5, 0x10, 0xF8, 0x8B, 0x6C, 0x9C, 0x63, 0x3D, 0xEC, 0x2F, 0xE7, 0x69,
+0xF6, 0xF0, 0x5B, 0x24, 0xFF, 0xBD, 0x34, 0xE7, 0x48, 0xEA, 0x98, 0x83, 0xAC, 0x15, 0x7B, 0x08,
+0x93, 0xD8, 0xF5, 0x70, 0x33, 0xEF, 0xFE, 0xAE, 0x55, 0x8F, 0x0E, 0x5E, 0x16, 0xAC, 0x9B, 0x50,
+0xA0, 0xC9, 0xDF, 0xB1, 0x0B, 0x5A, 0xDC, 0x85, 0x6F, 0xDD, 0xFD, 0x03, 0xED, 0xE2, 0x4B, 0xCA,
+0x3C, 0x76, 0x1F, 0x82, 0xA4, 0x2D, 0x45, 0xCC, 0xF2, 0x0A, 0x28, 0xB4, 0x5D, 0x02, 0x29, 0x7B,
+0xFD, 0xF2, 0x44, 0xF8, 0xF1, 0xF9, 0xF1, 0xF0, 0x22, 0x54, 0xB8, 0xE3, 0x43, 0xF5, 0x15, 0x3B,
+0xAA, 0x78, 0xE7, 0xA0, 0xEA, 0xBD, 0x0F, 0x85, 0xEE, 0x65, 0x90, 0x40, 0x2A, 0x76, 0xAF, 0x80,
+0x04, 0xBE, 0x7C, 0x61, 0x22, 0xBC, 0x7D, 0x15, 0xAA, 0xDD, 0x22, 0x64, 0x90, 0xB9, 0xC1, 0xE8,
+0xA7, 0xC5, 0x45, 0x6E, 0x1C, 0x51, 0xB1, 0x6F, 0x61, 0xE1, 0xBB, 0x0E, 0x5F, 0xA3, 0xCA, 0x16,
+0x53, 0x4B, 0x8C, 0x03, 0x15, 0x94, 0xB7, 0x41, 0x06, 0xCF, 0x62, 0xCF, 0x63, 0x46, 0x16, 0xCA,
+0x4F, 0xE4, 0x3A, 0xA0, 0x33, 0xA5, 0xD2, 0x56, 0x7C, 0xCE, 0x64, 0x7B, 0x3A, 0xCC, 0x7B, 0xB1,
+0xCC, 0xD0, 0x1D, 0xA1, 0x01, 0xB5, 0x89, 0x64, 0xE4, 0x7D, 0x98, 0xD2, 0x26, 0xB1, 0x05, 0x5F,
+0x6D, 0xD5, 0x34, 0xEF, 0x3E, 0xF8, 0xE0, 0x81, 0xF0, 0xE0, 0x03, 0x77, 0x49, 0x04, 0xF7, 0x20,
+0x54, 0x97, 0xB7, 0xDE, 0x3E, 0x11, 0xC6, 0x10, 0xE1, 0xD8, 0xC8, 0x41, 0xA5, 0x86, 0xAA, 0x15,
+0x4D, 0x75, 0xF4, 0xD1, 0x73, 0x57, 0x95, 0x46, 0xAE, 0x6D, 0x76, 0x19, 0xFA, 0x43, 0xDE, 0x05,
+0x85, 0x69, 0x00, 0xBB, 0x24, 0x90, 0x44, 0xBC, 0x81, 0xF4, 0x54, 0x2F, 0xBD, 0xFC, 0xAE, 0x60,
+0xAF, 0xBB, 0x6F, 0x2C, 0x7D, 0x70, 0x1D, 0x18, 0xE2, 0x8E, 0x15, 0x20, 0x2F, 0xEF, 0xC2, 0x24,
+0x49, 0xE5, 0x8E, 0x49, 0xA5, 0x45, 0x45, 0xBD, 0x15, 0x47, 0xFA, 0x3A, 0xAF, 0x7B, 0x77, 0xFA,
+0xC0, 0x6D, 0xDB, 0xBA, 0x21, 0x6C, 0x87, 0x2F, 0x21, 0x85, 0x9E, 0xC3, 0x50, 0x55, 0x8F, 0x1C,
+0x3F, 0xB7, 0xA2, 0x1F, 0x1E, 0xDC, 0x65, 0xE2, 0x0D, 0x98, 0x9C, 0xDF, 0xC1, 0x7E, 0xE8, 0x27,
+0xB1, 0xC3, 0x52, 0x37, 0x92, 0xAF, 0x53, 0x3D, 0xE6, 0x41, 0x53, 0xEC, 0x1E, 0xA8, 0xD5, 0x54,
+0x7C, 0xDB, 0x81, 0xED, 0x10, 0x08, 0xF2, 0x3B, 0xEF, 0x1E, 0x0F, 0x67, 0x48, 0x76, 0x17, 0xF1,
+0x15, 0xAD, 0x6D, 0x28, 0xD5, 0xD2, 0x0F, 0x8F, 0x9E, 0x09, 0x1F, 0x61, 0x0E, 0xCD, 0x52, 0x2C,
+0xB8, 0x05, 0x5F, 0x38, 0xB7, 0x3D, 0xB1, 0x63, 0x9A, 0x8D, 0x23, 0x67, 0x2E, 0x8B, 0x1D, 0x5D,
+0xF0, 0xC1, 0x87, 0x9F, 0xC4, 0x4E, 0xA3, 0x51, 0x6D, 0x95, 0xE2, 0xF9, 0x46, 0x79, 0x87, 0xCA,
+0x74, 0xF1, 0x50, 0xCC, 0x4D, 0x79, 0x53, 0xF6, 0x24, 0x1F, 0xE4, 0x14, 0x8D, 0x6A, 0xE7, 0xF4,
+0xEB, 0x29, 0xAA, 0x43, 0x71, 0x8F, 0x57, 0xF1, 0x65, 0x52, 0x02, 0x92, 0x94, 0x32, 0x9E, 0x52,
+0xB5, 0xCC, 0x7D, 0x9A, 0x94, 0x1A, 0x51, 0x2D, 0xE2, 0xDD, 0xB4, 0xAC, 0x46, 0x74, 0xAA, 0x9A,
+0x26, 0xB5, 0x57, 0x14, 0x40, 0x5E, 0x6E, 0x3E, 0x6F, 0x1E, 0x09, 0x9A, 0x91, 0x1C, 0xDD, 0xB1,
+0x82, 0x0F, 0x6D, 0xBB, 0x28, 0x8E, 0xC2, 0x0A, 0x93, 0x42, 0x17, 0x95, 0xC7, 0x78, 0x2E, 0x45,
+0x8D, 0xE6, 0x7B, 0x83, 0x2A, 0xA1, 0x74, 0xD5, 0x51, 0xFB, 0x9B, 0xEC, 0xCB, 0xCD, 0xFF, 0xB5,
+0xA1, 0xC3, 0xA3, 0x63, 0x20, 0xEA, 0x54, 0x46, 0xD8, 0x5C, 0x7D, 0x54, 0x45, 0xD1, 0x70, 0xB6,
+0xC8, 0x56, 0x21, 0x75, 0xA2, 0xA0, 0x1A, 0xA6, 0x99, 0xC4, 0x1A, 0x15, 0x2E, 0x2F, 0x6B, 0xE5,
+0xF4, 0x1A, 0x75, 0xC4, 0xC5, 0xCE, 0xE1, 0xF0, 0xAF, 0x43, 0xE0, 0x04, 0x5E, 0x3C, 0x08, 0xB9,
+0xBF, 0x07, 0xB2, 0x7C, 0x33, 0x8E, 0x31, 0xFA, 0xB7, 0x9C, 0xA0, 0x3F, 0xC6, 0x14, 0x94, 0x31,
+0x98, 0xA1, 0x7D, 0x1B, 0x1A, 0x99, 0x57, 0xD9, 0x23, 0x53, 0x81, 0x5D, 0x59, 0xF3, 0xE8, 0xD6,
+0xE4, 0x63, 0x67, 0x73, 0xD4, 0x89, 0xB1, 0x8C, 0x6B, 0x9A, 0x6F, 0x15, 0x9F, 0x4B, 0x9F, 0x7F,
+0xF6, 0x03, 0x44, 0x41, 0x50, 0x2A, 0x4D, 0xD5, 0x50, 0xDA, 0x81, 0x2F, 0x3C, 0xB6, 0x60, 0x23,
+0x16, 0xCB, 0x5E, 0x26, 0xF1, 0xA4, 0xD3, 0x72, 0xBD, 0x55, 0xBA, 0x19, 0x40, 0xDD, 0x8A, 0x7B,
+0xDC, 0xA0, 0x48, 0xB1, 0xD4, 0x77, 0x39, 0x15, 0xBB, 0x03, 0x50, 0xEC, 0x7A, 0xE1, 0x5B, 0xC6,
+0x1C, 0xC3, 0x2F, 0x5E, 0x1C, 0x17, 0x82, 0xD7, 0xC8, 0x41, 0xB2, 0x76, 0x1C, 0x66, 0xD5, 0xE7,
+0xCE, 0x8D, 0x87, 0xEF, 0x9D, 0x1E, 0x0D, 0x2F, 0x81, 0xA4, 0x5D, 0xC5, 0xB6, 0x64, 0xF5, 0x2C,
+0xB1, 0xA3, 0xD3, 0xF3, 0x42, 0xE6, 0x7E, 0x70, 0x76, 0x1C, 0xE6, 0x57, 0x6E, 0x93, 0x04, 0x11,
+0x02, 0xEA, 0xD6, 0x19, 0x90, 0xBD, 0xEF, 0x62, 0x77, 0x8B, 0x41, 0x90, 0xA2, 0x7A, 0x07, 0xCD,
+0x5D, 0x07, 0xEF, 0xDA, 0x19, 0x7A, 0xE0, 0x53, 0xC9, 0xFC, 0xA1, 0xAF, 0x63, 0xD1, 0x3F, 0x87,
+0x3D, 0xBA, 0x1B, 0xDD, 0x81, 0x86, 0x66, 0xCF, 0xBF, 0xFC, 0xDE, 0x2B, 0xE1, 0x1C, 0x54, 0xBB,
+0x56, 0xA8, 0x7F, 0x3A, 0x5F, 0x16, 0x7E, 0x41, 0x73, 0x11, 0x65, 0xF4, 0x25, 0xD3, 0x56, 0xB4,
+0xE0, 0x47, 0x3B, 0xEF, 0xF5, 0xE6, 0x7B, 0xC7, 0x85, 0x0C, 0x2E, 0x77, 0x30, 0x8D, 0x0A, 0xFD,
+0xA3, 0x98, 0xF3, 0xD1, 0x23, 0x62, 0xFD, 0x1A, 0x46, 0xC5, 0x7E, 0xE1, 0x99, 0x07, 0xC3, 0x17,
+0x9E, 0x7E, 0x20, 0x0C, 0x80, 0xA4, 0x0C, 0x83, 0x04, 0xFE, 0x35, 0x54, 0x2C, 0x6E, 0xF4, 0xDE,
+0x88, 0x7F, 0x28, 0xEF, 0xFF, 0xEA, 0xEB, 0x87, 0xB1, 0x33, 0xC1, 0xB5, 0xF8, 0x15, 0xAB, 0x75,
+0x2F, 0x36, 0xAA, 0xCD, 0x58, 0xB9, 0xF3, 0x89, 0x98, 0xEE, 0xC7, 0x9D, 0x41, 0x98, 0x83, 0x6D,
+0xE3, 0xB6, 0x8D, 0x92, 0x58, 0xFD, 0xA3, 0xA3, 0x67, 0xC3, 0x3B, 0x6F, 0x1E, 0x03, 0x29, 0x3D,
+0x05, 0x73, 0xAC, 0xAA, 0x50, 0x4B, 0x1D, 0xC4, 0xE3, 0x2A, 0xA2, 0x97, 0x5F, 0x85, 0x3A, 0x09,
+0xE1, 0x38, 0xF4, 0x6E, 0x58, 0x27, 0x84, 0x98, 0xA4, 0x7E, 0xE1, 0x61, 0xEB, 0xCD, 0x72, 0x95,
+0x2E, 0xF5, 0xFE, 0xB2, 0x50, 0x2D, 0xFF, 0x81, 0x63, 0xDB, 0xEE, 0xB9, 0x77, 0xAF, 0xEC, 0x65,
+0x7C, 0x09, 0x3F, 0x88, 0x7F, 0xFC, 0xC2, 0xBB, 0xE1, 0x12, 0x2C, 0x7A, 0x8D, 0x1E, 0xE7, 0x40,
+0x7A, 0xBF, 0xF3, 0xFD, 0xD7, 0xC3, 0x10, 0x3E, 0x7C, 0xEB, 0x60, 0xAE, 0xFF, 0xE2, 0xE7, 0x1F,
+0x96, 0x48, 0x5B, 0x1E, 0x8C, 0xAA, 0xDE, 0x88, 0x80, 0x8C, 0x9D, 0x7B, 0x77, 0x84, 0x6E, 0x24,
+0x33, 0x9E, 0xC0, 0x5C, 0x38, 0x09, 0x9F, 0x43, 0xFA, 0x1F, 0xD2, 0x2C, 0xDF, 0xC8, 0x41, 0xE2,
+0xF8, 0xD7, 0xD8, 0xDE, 0x8C, 0x3F, 0x28, 0xE2, 0xAC, 0x69, 0x94, 0x9F, 0x34, 0x72, 0x83, 0x06,
+0xCA, 0x7C, 0x02, 0x88, 0x1D, 0xD8, 0x2F, 0xB6, 0x49, 0xA1, 0xA3, 0x24, 0x93, 0xB6, 0x32, 0x22,
+0x36, 0x26, 0xFD, 0xF3, 0x05, 0xE9, 0x63, 0xFE, 0x55, 0x33, 0xAA, 0xED, 0xCB, 0xE9, 0xFB, 0xCF,
+0x5A, 0x9D, 0xEE, 0xA0, 0x1E, 0x6D, 0xB0, 0x8B, 0xDD, 0xEB, 0xFF, 0xDF, 0xDE, 0x97, 0x46, 0xC7,
+0x71, 0x9D, 0x57, 0x3E, 0x00, 0xC4, 0xBE, 0x13, 0x20, 0x08, 0x90, 0x58, 0x08, 0x11, 0xDC, 0x17,
+0x71, 0xD1, 0x42, 0x89, 0x34, 0x49, 0xED, 0xD1, 0x91, 0x14, 0x6F, 0x72, 0xE4, 0xC4, 0xB1, 0x1D,
+0x3B, 0x1E, 0x4F, 0xE2, 0xD8, 0x73, 0xCE, 0x8C, 0x73, 0x26, 0x3F, 0xE6, 0x47, 0xFC, 0x63, 0xC6,
+0xF6, 0x8F, 0x49, 0xE2, 0xCC, 0xC4, 0xF6, 0xB1, 0x33, 0xF1, 0xBE, 0xC8, 0xB2, 0x25, 0xD9, 0xB2,
+0x25, 0x4B, 0xB6, 0x65, 0x91, 0xA2, 0x48, 0x71, 0x97, 0x44, 0x91, 0x02, 0xF7, 0x05, 0xDC, 0xC1,
+0x15, 0x5C, 0x40, 0x02, 0x24, 0xC0, 0xB9, 0xF7, 0x7B, 0xEF, 0x55, 0x55, 0x37, 0x1A, 0x1B, 0x81,
+0x6E, 0x00, 0xCD, 0xAF, 0x78, 0x8A, 0xE8, 0xAE, 0xAE, 0x7A, 0x55, 0xEF, 0xD6, 0xAB, 0xAA, 0x5B,
+0xF7, 0xDB, 0xE4, 0xC6, 0xE5, 0x48, 0x51, 0xF4, 0xAF, 0x5F, 0xEE, 0x88, 0x5D, 0xF0, 0xD5, 0xAF,
+0x13, 0xA8, 0x30, 0x91, 0x6D, 0x83, 0xED, 0xD9, 0x24, 0x97, 0xBB, 0xBF, 0xC1, 0x36, 0xE1, 0xBA,
+0x3D, 0x8E, 0x8F, 0x27, 0x9D, 0xA6, 0x38, 0xB7, 0x4A, 0xE0, 0xA3, 0x16, 0xC8, 0xDB, 0xEE, 0x37,
+0x7B, 0xB4, 0xC1, 0xFF, 0xF6, 0x8B, 0x23, 0xB1, 0xC2, 0x99, 0x9C, 0x7A, 0x88, 0xEB, 0xAC, 0x00,
+0x37, 0x7A, 0x5B, 0x1F, 0x30, 0xF9, 0x13, 0xC9, 0x28, 0x1F, 0x5E, 0x0C, 0xDE, 0xA0, 0x89, 0xC5,
+0x07, 0x90, 0x44, 0x0F, 0xD5, 0x76, 0x31, 0x4E, 0xB9, 0x0B, 0x94, 0xCF, 0xF0, 0x0A, 0x12, 0xD5,
+0x35, 0xC0, 0xCE, 0xF7, 0xD5, 0xF5, 0x0B, 0x5F, 0xED, 0x3D, 0xC6, 0xAD, 0xCF, 0xF3, 0x8E, 0xC0,
+0x09, 0xBC, 0xE6, 0x9A, 0x3C, 0x5C, 0xDC, 0x33, 0xEB, 0xAB, 0xD1, 0x6F, 0x96, 0xD1, 0x4A, 0xFE,
+0x74, 0x85, 0x8E, 0xBC, 0x2D, 0xC7, 0xCC, 0x75, 0x3C, 0xA4, 0xE4, 0xB6, 0x06, 0xC5, 0x2E, 0x5A,
+0xE6, 0xCE, 0xF7, 0x28, 0x7A, 0x4E, 0xA3, 0x0F, 0xCA, 0x9E, 0xF7, 0x0C, 0xDB, 0xEF, 0xC0, 0x87,
+0xCE, 0x9D, 0xCF, 0x70, 0x2C, 0xF9, 0x6E, 0xFB, 0x11, 0xE0, 0x95, 0x4E, 0x7B, 0xDE, 0x39, 0x31,
+0x12, 0x36, 0x33, 0x3B, 0x07, 0x81, 0x25, 0x78, 0x93, 0xC5, 0x83, 0x79, 0x12, 0xEA, 0xE5, 0x52,
+0xB5, 0xEB, 0xF7, 0xBE, 0x9C, 0x7C, 0xB8, 0x06, 0xBD, 0x07, 0xF2, 0x0A, 0x9B, 0xEC, 0xD9, 0x5A,
+0xD5, 0x06, 0x3B, 0xC9, 0x39, 0xE9, 0xFF, 0x79, 0x13, 0x34, 0x1B, 0xAC, 0xDF, 0xCB, 0x8E, 0x68,
+0xCD, 0xAE, 0x42, 0x62, 0xE1, 0x46, 0x44, 0xC3, 0x12, 0xED, 0x3D, 0x20, 0x5D, 0xEF, 0x9D, 0xED,
+0x30, 0xE7, 0x61, 0x32, 0xA5, 0x49, 0xB6, 0xB7, 0x67, 0x00, 0xD5, 0xBA, 0x93, 0x20, 0x65, 0xDB,
+0xCE, 0x74, 0x98, 0xBD, 0x20, 0x77, 0x47, 0x2E, 0x77, 0x99, 0xF3, 0xA8, 0x11, 0x5B, 0x0E, 0x09,
+0x90, 0x29, 0x54, 0xE2, 0xA7, 0x2B, 0x50, 0x34, 0x9A, 0x51, 0x4F, 0x96, 0xEB, 0xB3, 0x4A, 0x85,
+0xCF, 0x9D, 0x77, 0x11, 0xDB, 0xEC, 0xC4, 0xF2, 0x73, 0x57, 0x13, 0x13, 0x42, 0xAA, 0x22, 0x35,
+0x70, 0x20, 0x9F, 0x35, 0xB3, 0x5E, 0xDA, 0x3D, 0x84, 0x92, 0x4D, 0x9B, 0x37, 0xEF, 0x92, 0x5A,
+0xA2, 0x7D, 0xA9, 0x40, 0x5E, 0xFD, 0xA1, 0x59, 0xEF, 0x6D, 0xA8, 0x7C, 0x17, 0x48, 0xD0, 0x78,
+0xDF, 0x70, 0xB7, 0xC6, 0xF8, 0xE3, 0xE3, 0x43, 0x94, 0x89, 0x70, 0x2B, 0x91, 0x33, 0xAD, 0x14,
+0x39, 0xD8, 0x68, 0xC2, 0x3D, 0x88, 0x7D, 0xB1, 0x18, 0x7D, 0x67, 0x1F, 0xCE, 0xFB, 0x54, 0x98,
+0xA8, 0x08, 0x72, 0xBD, 0x6B, 0x34, 0xF3, 0xC6, 0x75, 0x9D, 0x66, 0xBA, 0x26, 0x98, 0xEB, 0xE6,
+0xCC, 0xAA, 0x37, 0xF5, 0xB5, 0x13, 0x24, 0x18, 0xA3, 0x79, 0xF7, 0x21, 0xB3, 0x09, 0xE4, 0x85,
+0xA4, 0xB3, 0x2F, 0x47, 0x78, 0x0A, 0x08, 0x7B, 0xF1, 0x20, 0xDF, 0x82, 0x75, 0xF9, 0x60, 0x1E,
+0x08, 0x11, 0x1C, 0xEC, 0x78, 0xB2, 0xEB, 0xDF, 0xC4, 0x40, 0x4C, 0xB0, 0x23, 0xBE, 0x80, 0x31,
+0xBA, 0x73, 0xEE, 0x9C, 0x46, 0x51, 0x9B, 0x2E, 0x80, 0x54, 0xB4, 0x40, 0x29, 0xDA, 0x8C, 0x02,
+0xF7, 0x07, 0xE1, 0x6B, 0xD7, 0x57, 0x44, 0x33, 0x15, 0x28, 0x12, 0xA2, 0x2D, 0x30, 0x67, 0xD2,
+0x8F, 0x8C, 0xAA, 0xD5, 0xCC, 0x99, 0x8D, 0xA6, 0x6E, 0x72, 0x95, 0xE4, 0x74, 0x1B, 0xAD, 0x13,
+0xAB, 0x47, 0xCC, 0x9D, 0x73, 0x9B, 0x29, 0x04, 0x81, 0x67, 0xD4, 0xF2, 0xE6, 0xAD, 0x3B, 0xCD,
+0x66, 0x8C, 0x39, 0x2A, 0x77, 0xBD, 0xF9, 0x16, 0x8A, 0xDF, 0x27, 0xAC, 0x7E, 0xEF, 0x42, 0x7D,
+0x5B, 0xB7, 0xE9, 0x3D, 0x98, 0x49, 0x0F, 0x48, 0x6D, 0xE5, 0x06, 0xBC, 0xC0, 0xCC, 0x04, 0x49,
+0xA4, 0x6F, 0x9D, 0x9C, 0x15, 0x5C, 0xE8, 0x74, 0x0F, 0x98, 0x37, 0x6F, 0x2A, 0x22, 0x65, 0x0B,
+0x90, 0x20, 0xE1, 0x9A, 0x39, 0x7D, 0xFA, 0xBC, 0xE0, 0xB9, 0x1F, 0x6A, 0x72, 0x7F, 0x11, 0xE2,
+0xF4, 0xC5, 0x7B, 0x17, 0x26, 0xD8, 0xCD, 0xC0, 0x94, 0xE6, 0x58, 0x7B, 0xBF, 0xC1, 0x7F, 0x4A,
+0xEC, 0xC2, 0xE1, 0x44, 0x90, 0xF9, 0x16, 0xB7, 0x1B, 0xBE, 0x14, 0x72, 0x01, 0x73, 0x96, 0x34,
+0x27, 0xF4, 0xF9, 0xC2, 0x0D, 0x90, 0x79, 0x62, 0xE8, 0xFF, 0xC5, 0xBF, 0x62, 0xA6, 0x75, 0x7F,
+0xF9, 0x99, 0xCB, 0x13, 0xCD, 0xB2, 0x6D, 0xEC, 0x2C, 0x84, 0x51, 0xC8, 0x90, 0x9B, 0xC5, 0x69,
+0xDF, 0x46, 0x63, 0x06, 0xBF, 0xD9, 0x84, 0x62, 0x11, 0x3F, 0x2F, 0xE7, 0xD8, 0xCF, 0x60, 0x0E,
+0xC9, 0xCE, 0xEE, 0x6A, 0xF9, 0xC9, 0x3A, 0xB6, 0x7D, 0x6E, 0xCB, 0x37, 0x51, 0xF9, 0xCE, 0x7F,
+0x4E, 0x45, 0x09, 0xFF, 0xF2, 0xF7, 0xB0, 0x5D, 0x51, 0x5F, 0xDC, 0x1C, 0xDD, 0x57, 0x70, 0x5C,
+0x8E, 0x1C, 0x86, 0xDF, 0x1D, 0xC1, 0x09, 0x48, 0x59, 0x48, 0x78, 0xE2, 0xD7, 0x11, 0x54, 0x1D,
+0xF9, 0xB1, 0xC7, 0x42, 0xB7, 0x16, 0xE6, 0x33, 0xF3, 0xDB, 0x38, 0xD5, 0xCE, 0xDD, 0x72, 0xB2,
+0x9C, 0xFF, 0x9A, 0x64, 0x34, 0x87, 0x83, 0x73, 0x2E, 0x6E, 0x1A, 0xA9, 0x98, 0x78, 0x3C, 0x57,
+0x70, 0x9E, 0xBB, 0xF0, 0x40, 0xB9, 0x41, 0xDF, 0x9B, 0x28, 0xC1, 0x76, 0x4A, 0x9C, 0xF5, 0xAB,
+0x0B, 0x7D, 0x0E, 0xE5, 0xA2, 0xB1, 0x8E, 0x67, 0x56, 0x9D, 0x8A, 0x10, 0xE1, 0x40, 0xC9, 0x72,
+0x64, 0x37, 0xAA, 0xF8, 0x85, 0xE6, 0x68, 0x7B, 0x9E, 0x33, 0xE8, 0x5F, 0x87, 0x31, 0x93, 0x87,
+0xCC, 0xFB, 0x4D, 0x7C, 0x63, 0x4B, 0x91, 0x62, 0xC7, 0x9B, 0xC1, 0x3E, 0x12, 0x3B, 0x2A, 0x76,
+0x2C, 0xDD, 0x45, 0x62, 0x27, 0xE7, 0x26, 0x32, 0xFB, 0x73, 0xEF, 0x54, 0xE0, 0xD0, 0xBF, 0x32,
+0xD6, 0x77, 0xCE, 0xE6, 0xB2, 0x73, 0x0A, 0x9D, 0x53, 0x85, 0xAD, 0x2F, 0x9D, 0x53, 0x80, 0x1D,
+0x86, 0xDE, 0x37, 0xCF, 0xFB, 0x52, 0x06, 0x91, 0xD9, 0xC2, 0x08, 0x71, 0x08, 0xB9, 0xF9, 0x32,
+0x93, 0x4C, 0x90, 0x33, 0x4C, 0xAB, 0x84, 0x7F, 0x1D, 0x88, 0x5D, 0xF2, 0x1E, 0x74, 0xC9, 0x1D,
+0x5D, 0x12, 0x90, 0x22, 0xAF, 0x09, 0x83, 0x7C, 0xA0, 0x5A, 0x38, 0x2C, 0x29, 0xEC, 0xE7, 0x10,
+0xA3, 0xDC, 0xAF, 0xBF, 0x92, 0xF0, 0xC5, 0xB0, 0xC3, 0x32, 0xB9, 0x30, 0x82, 0x63, 0xCD, 0x59,
+0x10, 0xAD, 0x57, 0x5A, 0xDA, 0x11, 0xE0, 0x70, 0xDD, 0x80, 0xDB, 0xD9, 0xF1, 0x9B, 0x60, 0xA2,
+0x6F, 0x5D, 0xF3, 0x39, 0xA8, 0x75, 0xC7, 0x90, 0x38, 0x15, 0x6A, 0x5C, 0x01, 0x36, 0x9E, 0x90,
+0x97, 0x65, 0x16, 0x21, 0xC1, 0x71, 0xA2, 0x1C, 0x76, 0x8C, 0xB6, 0xA5, 0x99, 0xB6, 0xE5, 0xA2,
+0xF5, 0xA7, 0x63, 0x14, 0xAA, 0x25, 0xB7, 0x19, 0xE6, 0x12, 0x7E, 0xA3, 0x49, 0x97, 0x81, 0x18,
+0x89, 0xA6, 0x32, 0xA4, 0x0C, 0xF9, 0x93, 0xFB, 0x16, 0x9B, 0x32, 0xA4, 0xFB, 0x69, 0x83, 0x3A,
+0xF6, 0xFC, 0x0B, 0x6B, 0x60, 0xE6, 0xDB, 0xDB, 0xA7, 0x0A, 0x44, 0xC2, 0x74, 0x04, 0x65, 0x1F,
+0x9F, 0x7E, 0xFE, 0x75, 0x49, 0x93, 0xC2, 0xEA, 0x2D, 0xF4, 0xAF, 0x93, 0x3D, 0xF4, 0xA2, 0xDA,
+0x51, 0x1D, 0x6C, 0x80, 0xD9, 0xB7, 0x1E, 0x33, 0x73, 0x94, 0x9D, 0x39, 0xD5, 0x66, 0xDE, 0xC4,
+0x83, 0x97, 0xC1, 0x17, 0xBD, 0x4D, 0x47, 0x60, 0x16, 0x7B, 0xE1, 0xE5, 0xF5, 0x42, 0xD2, 0xAC,
+0xA2, 0x1F, 0x3B, 0xB1, 0x9F, 0x2C, 0xAB, 0x55, 0x0B, 0x82, 0x32, 0x7F, 0xC1, 0x74, 0xF1, 0x0B,
+0x65, 0x2E, 0xBB, 0x9F, 0x3C, 0xBB, 0x0A, 0x0F, 0xFF, 0x63, 0xA2, 0x6C, 0xF5, 0x36, 0x5D, 0xC6,
+0x7E, 0xDF, 0x40, 0x10, 0xC1, 0x16, 0x14, 0x97, 0xBF, 0xD2, 0x69, 0xD3, 0x6B, 0x79, 0x1F, 0xE8,
+0xC4, 0x4F, 0xE7, 0x5E, 0x58, 0x6B, 0x9F, 0x63, 0x45, 0x6E, 0x58, 0x83, 0x1C, 0xF0, 0x76, 0x3F,
+0xE1, 0xFF, 0xE1, 0xE6, 0x24, 0x22, 0x0F, 0xAF, 0x5C, 0x64, 0xCA, 0x50, 0x22, 0x2B, 0x13, 0xA4,
+0x96, 0x6E, 0x4B, 0xAF, 0xBD, 0xB6, 0xD5, 0xBC, 0xB9, 0x7E, 0x47, 0x9F, 0x26, 0x4A, 0x9A, 0xBC,
+0x9B, 0x11, 0x7C, 0xF0, 0xF3, 0x5F, 0xBE, 0x6E, 0xCE, 0x5D, 0xBC, 0x6C, 0x4A, 0x90, 0xCA, 0xE8,
+0xA1, 0xFB, 0xD0, 0x0E, 0x54, 0xAC, 0xC4, 0x13, 0x8F, 0x99, 0xF7, 0xCA, 0x41, 0x1E, 0xBA, 0xAC,
+0xEE, 0xFA, 0x3B, 0xA0, 0x6D, 0xFB, 0x5E, 0xA9, 0xB0, 0x30, 0xCF, 0x2C, 0x5E, 0x30, 0x4D, 0x4A,
+0x9F, 0x91, 0x17, 0x6C, 0xC3, 0xB8, 0x7C, 0xEE, 0x57, 0x6B, 0xCC, 0x2B, 0xAF, 0x6E, 0x36, 0x54,
+0xCB, 0x12, 0x4D, 0xBC, 0x6F, 0xD1, 0xCF, 0xF2, 0x47, 0xCF, 0xBC, 0x6A, 0x7E, 0xF2, 0x8B, 0x57,
+0xCD, 0xC9, 0xD6, 0xB3, 0x18, 0x17, 0x59, 0xA8, 0x52, 0x31, 0xC3, 0x94, 0x41, 0xA1, 0x63, 0xFD,
+0x79, 0x3F, 0xB1, 0xB4, 0xDA, 0x7D, 0x48, 0x5C, 0x5C, 0x5D, 0x89, 0xE5, 0xE8, 0x2C, 0x55, 0xE1,
+0x35, 0x50, 0xE0, 0xD6, 0xAE, 0xDF, 0xDE, 0xAF, 0x9A, 0x7C, 0x1E, 0x2F, 0x03, 0x2F, 0xFE, 0x6E,
+0xA3, 0xD9, 0x05, 0x5C, 0x49, 0x02, 0x23, 0x4E, 0x5C, 0x37, 0x03, 0xDA, 0x4D, 0x6F, 0x93, 0x1A,
+0x19, 0xE6, 0x26, 0x0F, 0x8F, 0x37, 0x0A, 0x96, 0xB3, 0x3A, 0x86, 0x24, 0x91, 0x7C, 0x9B, 0x13,
+0x27, 0x44, 0x94, 0xBB, 0xCA, 0x40, 0xA4, 0x5E, 0x06, 0x9C, 0xBA, 0x65, 0xCE, 0x49, 0xF0, 0x97,
+0xCB, 0xFA, 0x9A, 0xFD, 0x76, 0x09, 0xD7, 0x41, 0xDB, 0x6C, 0x5F, 0x66, 0xB4, 0x03, 0x1F, 0x23,
+0x3B, 0x23, 0x1B, 0x3B, 0x66, 0xFE, 0xB5, 0x9F, 0x91, 0xC4, 0xD3, 0x2D, 0x93, 0xE5, 0x38, 0xAE,
+0x4C, 0xCE, 0xAC, 0xAB, 0xE9, 0xEA, 0xAD, 0x46, 0xFF, 0x66, 0xC1, 0x9F, 0x84, 0xD5, 0x1C, 0x68,
+0xDE, 0xE2, 0x2C, 0x9F, 0xDD, 0xB2, 0x2C, 0x7C, 0x1F, 0xC7, 0x65, 0x18, 0x68, 0xF6, 0x33, 0x4A,
+0x6A, 0xF1, 0x33, 0x1E, 0xF0, 0xB2, 0x1C, 0x37, 0xBC, 0x71, 0x99, 0x6E, 0x39, 0xAB, 0x42, 0xB0,
+0xEC, 0x17, 0xDE, 0xD4, 0xB8, 0x9E, 0xAF, 0x67, 0x47, 0x45, 0x8D, 0x73, 0xF0, 0x1D, 0x77, 0x3C,
+0xBE, 0x6D, 0xCB, 0x7A, 0xF8, 0xCC, 0x08, 0x37, 0x86, 0x70, 0x33, 0xDB, 0x3D, 0xB3, 0x0B, 0x70,
+0x99, 0x64, 0xC0, 0x97, 0xBF, 0xEE, 0x33, 0xCE, 0x13, 0x7F, 0xB7, 0xEB, 0xD9, 0x07, 0x0C, 0xF7,
+0xD1, 0x84, 0xF0, 0xF2, 0xE2, 0x84, 0xD2, 0xFC, 0x4D, 0x9E, 0xD8, 0x3E, 0x36, 0x23, 0x99, 0x61,
+0x24, 0xD1, 0x0D, 0x12, 0x1C, 0xEF, 0xE7, 0x11, 0xBD, 0xCE, 0x83, 0xCF, 0xFE, 0x86, 0x6A, 0x49,
+0xAA, 0xDC, 0x7F, 0xFD, 0x7F, 0x7C, 0x18, 0x93, 0x44, 0xBB, 0xCB, 0xCA, 0x3F, 0x70, 0xAD, 0xF5,
+0xDA, 0xDF, 0x1C, 0xE3, 0x34, 0x2F, 0x92, 0x79, 0x06, 0x6C, 0x00, 0x94, 0xCA, 0xD2, 0x12, 0x53,
+0x85, 0x8B, 0x3D, 0x15, 0x7E, 0x26, 0x92, 0x40, 0xB5, 0xED, 0xA2, 0x69, 0x3D, 0xDF, 0x26, 0x2F,
+0x22, 0x19, 0x38, 0xCF, 0xA2, 0x72, 0x24, 0xB8, 0xF1, 0xFB, 0xAE, 0x87, 0xFD, 0xF4, 0x3E, 0x99,
+0xB1, 0x80, 0xDA, 0xFE, 0x86, 0x0F, 0x9C, 0xD0, 0x6F, 0xD3, 0x3F, 0x16, 0xDC, 0x6F, 0x82, 0x53,
+0x80, 0x9C, 0x6B, 0xC4, 0x3D, 0x74, 0x30, 0xF6, 0xBB, 0xB3, 0xF3, 0x40, 0xEC, 0x30, 0x1E, 0x30,
+0x18, 0xEA, 0xCA, 0xC7, 0x56, 0x29, 0x31, 0xF2, 0x95, 0x0B, 0x20, 0x4C, 0x27, 0x51, 0x87, 0xF5,
+0x14, 0x6C, 0x4C, 0x34, 0x3B, 0x52, 0xC1, 0xE2, 0xD9, 0x27, 0x59, 0x3D, 0x23, 0x51, 0xA5, 0xC8,
+0x35, 0x25, 0xE4, 0xC6, 0x76, 0x9D, 0x24, 0x87, 0xCA, 0x16, 0xEB, 0xB0, 0x9E, 0xC4, 0x6F, 0x67,
+0x19, 0x60, 0xE0, 0x40, 0x6F, 0xC7, 0x4A, 0xA7, 0xA5, 0x66, 0x2B, 0x0A, 0x86, 0x47, 0xA2, 0x58,
+0x3B, 0xB1, 0x0D, 0xDB, 0xF0, 0x6D, 0xF9, 0x60, 0xD3, 0x8B, 0x58, 0xBF, 0x15, 0xCB, 0x5B, 0x19,
+0xF5, 0x8A, 0xE3, 0x60, 0x14, 0x6A, 0x94, 0x43, 0xE5, 0xE1, 0x22, 0x63, 0xFE, 0xB9, 0xDA, 0xC2,
+0x71, 0x48, 0x77, 0xD2, 0x6D, 0xB6, 0x9D, 0x66, 0x20, 0x04, 0x4C, 0x80, 0x30, 0x9D, 0xEE, 0x6B,
+0xBB, 0x26, 0xDB, 0xF8, 0xF5, 0x69, 0xA5, 0xE5, 0x3E, 0xA8, 0xEA, 0x6D, 0x81, 0xD9, 0x96, 0x11,
+0xAE, 0xB4, 0xA2, 0x96, 0xE7, 0x66, 0x99, 0xB9, 0x68, 0xE3, 0xB6, 0x12, 0xFA, 0xEB, 0xF5, 0x24,
+0x0A, 0xEC, 0xD7, 0x79, 0x98, 0x69, 0xDB, 0xC8, 0x16, 0x23, 0x23, 0x8A, 0x24, 0x9E, 0xA4, 0x8F,
+0xE6, 0xDF, 0xDE, 0x82, 0x63, 0x99, 0xDD, 0x7F, 0xD1, 0xFC, 0x26, 0x38, 0xE6, 0xD7, 0xCB, 0xB8,
+0x7C, 0x77, 0xFB, 0x7E, 0xB3, 0x66, 0xDD, 0x36, 0xA8, 0x5E, 0x56, 0xDD, 0x39, 0x05, 0x15, 0x83,
+0x01, 0x15, 0x4C, 0x89, 0x42, 0x95, 0x8B, 0xC4, 0x69, 0x7B, 0xF3, 0x41, 0xF3, 0xC6, 0xDA, 0x77,
+0xCC, 0x26, 0xA8, 0x1B, 0x1D, 0xF0, 0xCD, 0x9B, 0x48, 0x5F, 0x28, 0x98, 0x08, 0xA9, 0x04, 0xF5,
+0xF6, 0xA8, 0x2E, 0x00, 0x01, 0x5B, 0xB0, 0x00, 0x25, 0xB0, 0x6E, 0x9F, 0x2E, 0x75, 0x3F, 0xA9,
+0xC6, 0x6D, 0xDA, 0xB2, 0x0B, 0xCE, 0xFC, 0x7B, 0xCD, 0x09, 0xA4, 0x1B, 0x61, 0xDB, 0x7C, 0x28,
+0x33, 0x58, 0xE2, 0x08, 0x1E, 0xCC, 0x9B, 0xA0, 0x84, 0xAC, 0x5E, 0xBB, 0xCD, 0x6C, 0xA4, 0xE9,
+0x10, 0x26, 0x56, 0x92, 0xB8, 0x78, 0xB2, 0x4E, 0xE2, 0x6A, 0xF3, 0x9D, 0x95, 0x99, 0x85, 0x20,
+0x00, 0x93, 0xAB, 0x2B, 0x10, 0x13, 0xD5, 0x29, 0xCA, 0xD4, 0x9A, 0xB5, 0xEF, 0x9A, 0x6D, 0x3B,
+0x0E, 0x88, 0x52, 0xC5, 0xDC, 0x76, 0x7C, 0xC6, 0xF0, 0x1A, 0xBC, 0x04, 0xF2, 0x4A, 0x9F, 0xA8,
+0x75, 0x9B, 0x9A, 0xCD, 0x5A, 0x98, 0xF6, 0x8E, 0x42, 0x4C, 0x28, 0x00, 0x81, 0xC8, 0x83, 0x0B,
+0x82, 0x28, 0xBE, 0x83, 0x91, 0x6C, 0x87, 0xFF, 0xB6, 0xD8, 0x67, 0x8B, 0x54, 0x28, 0xE7, 0xA3,
+0x94, 0xD8, 0xBC, 0x99, 0x53, 0x4C, 0x31, 0x54, 0xAC, 0x76, 0xA4, 0x68, 0xD9, 0xBD, 0xEF, 0x88,
+0x79, 0x03, 0x44, 0x64, 0x3D, 0x08, 0xEA, 0x61, 0xF4, 0x45, 0xCE, 0x15, 0xFA, 0xC9, 0x34, 0x1C,
+0x8C, 0x72, 0xE6, 0xB9, 0xDA, 0x80, 0xDF, 0xD6, 0x00, 0xCB, 0xAD, 0xEF, 0xEC, 0x01, 0x09, 0xEF,
+0x42, 0x3E, 0xB8, 0x49, 0x66, 0x11, 0xCA, 0x6C, 0xF1, 0x9C, 0x8C, 0xE6, 0x89, 0xCA, 0x24, 0xF3,
+0xEE, 0x2D, 0x04, 0x69, 0xCF, 0xC5, 0x98, 0xA1, 0x69, 0x75, 0x23, 0xC6, 0xE5, 0xAA, 0x37, 0xB6,
+0x99, 0x37, 0x36, 0xEC, 0x30, 0xFB, 0x40, 0xDE, 0x39, 0x8E, 0x48, 0xE0, 0x79, 0x8E, 0x99, 0x28,
+0x9B, 0x2A, 0xDA, 0x1B, 0x38, 0xF7, 0xAB, 0xB1, 0xCE, 0xDB, 0xDB, 0xF6, 0x99, 0xAB, 0x38, 0xDF,
+0xCC, 0xF9, 0xB7, 0x00, 0xE5, 0xC5, 0x4A, 0xE0, 0x9F, 0x18, 0x55, 0xF2, 0xF9, 0xB2, 0x31, 0x1B,
+0x09, 0x8B, 0x97, 0xA0, 0xAA, 0xC5, 0x5C, 0x94, 0x57, 0xE3, 0xB3, 0x9B, 0x6D, 0xBE, 0xF1, 0xE6,
+0x76, 0xBC, 0x74, 0x34, 0x8B, 0x12, 0xCA, 0xF1, 0xC2, 0xB1, 0xCF, 0x4C, 0x1D, 0xC4, 0xF6, 0x0C,
+0xDC, 0x0E, 0xF6, 0xC0, 0xAF, 0x8E, 0xEB, 0xAC, 0xC7, 0x8B, 0xC9, 0x79, 0x5C, 0x0F, 0xCC, 0x0B,
+0xC8, 0xE7, 0x6F, 0xE0, 0x36, 0x94, 0x42, 0x50, 0x47, 0x2D, 0xB1, 0x23, 0x18, 0x64, 0xE3, 0x27,
+0x91, 0xFD, 0x99, 0x39, 0xD4, 0xE4, 0xC6, 0x00, 0x92, 0x93, 0x51, 0x8C, 0x52, 0x27, 0x25, 0xE3,
+0x4D, 0x66, 0x71, 0x39, 0x3E, 0x63, 0x2E, 0x89, 0xFB, 0xEB, 0x97, 0x47, 0x7F, 0x8B, 0xFB, 0x1C,
+0x6C, 0x1B, 0x5D, 0xD7, 0x7D, 0xE6, 0x6F, 0x76, 0x2E, 0x33, 0x59, 0xC5, 0x48, 0x84, 0x88, 0xCF,
+0x9C, 0x33, 0xF9, 0xB9, 0x28, 0x6E, 0x2E, 0x2C, 0x31, 0x59, 0x85, 0x58, 0x56, 0x88, 0x13, 0xC8,
+0x39, 0x3F, 0xF2, 0xB7, 0x80, 0xDF, 0x8B, 0x64, 0x1E, 0x97, 0x8F, 0x92, 0x54, 0x6E, 0x1E, 0x97,
+0x8F, 0x5C, 0x60, 0x98, 0xB3, 0xF3, 0xF2, 0x31, 0x28, 0x0B, 0xEC, 0x5F, 0x28, 0x23, 0xE1, 0x9C,
+0x87, 0xCF, 0x9C, 0x73, 0xA1, 0x18, 0xE5, 0xCA, 0xDF, 0x5C, 0x5C, 0xB8, 0xF2, 0x17, 0x64, 0x92,
+0x73, 0x1E, 0xFF, 0xCA, 0xF7, 0x6C, 0x44, 0x6D, 0xE2, 0x37, 0x38, 0x79, 0xCA, 0x67, 0x28, 0x2A,
+0x74, 0x16, 0x96, 0xD9, 0x7F, 0xC6, 0x4D, 0x35, 0x37, 0x32, 0xB3, 0x6A, 0x00, 0x7D, 0x7C, 0x38,
+0xE7, 0x61, 0xD0, 0x31, 0x51, 0x2A, 0x93, 0xA4, 0xCA, 0xDF, 0xCC, 0x1B, 0xF2, 0x80, 0x90, 0x3C,
+0x72, 0x98, 0xBB, 0xA0, 0x62, 0x51, 0x92, 0x5F, 0x3C, 0xAD, 0xD6, 0x54, 0xE0, 0x2D, 0x26, 0x15,
+0x13, 0x6F, 0xB4, 0xED, 0xB8, 0x99, 0x77, 0x53, 0x99, 0x12, 0x93, 0xA4, 0x25, 0x1E, 0x9E, 0xA8,
+0x78, 0x85, 0x33, 0x46, 0xD1, 0xA4, 0x0A, 0xE5, 0x08, 0x9B, 0x13, 0xEE, 0x9C, 0xA2, 0xE7, 0x7C,
+0x0A, 0xB9, 0x3D, 0x89, 0x9E, 0x57, 0xFC, 0x9C, 0x0A, 0xE8, 0xD5, 0x40, 0x79, 0x13, 0x46, 0x50,
+0x0E, 0x1F, 0xFB, 0x59, 0xC0, 0xB3, 0x61, 0x32, 0xC3, 0xE9, 0x53, 0x63, 0x86, 0xE5, 0x03, 0xEB,
+0x10, 0xD2, 0x9C, 0x74, 0xB8, 0x94, 0x10, 0xF2, 0xE2, 0xC0, 0x7F, 0x4E, 0xDD, 0x0D, 0x83, 0x41,
+0xE2, 0x94, 0x39, 0x17, 0xDD, 0x6B, 0xAB, 0x47, 0xF0, 0x2D, 0xDA, 0xCE, 0xE1, 0x76, 0x84, 0x8D,
+0xA8, 0xB9, 0x7F, 0x1E, 0x23, 0xCF, 0xE9, 0x88, 0x97, 0x30, 0x40, 0xE7, 0xEB, 0xE9, 0x14, 0x65,
+0x39, 0xC7, 0x18, 0x17, 0x24, 0x75, 0xD7, 0x31, 0xCE, 0xE0, 0xC1, 0x24, 0x63, 0x65, 0x42, 0x11,
+0xD4, 0xA5, 0x31, 0x54, 0x71, 0x82, 0xE6, 0xFC, 0xC3, 0x97, 0xE0, 0xB3, 0x75, 0x1A, 0xFE, 0x8B,
+0x20, 0x44, 0x87, 0x2E, 0xC2, 0xA4, 0x02, 0x72, 0x44, 0xB2, 0x44, 0x9A, 0xC3, 0x80, 0x85, 0x77,
+0x40, 0xA6, 0x76, 0x41, 0x01, 0xEB, 0x70, 0x4E, 0xE6, 0x24, 0x5F, 0x34, 0x51, 0x32, 0xD0, 0xE0,
+0x6D, 0xFC, 0xB6, 0x17, 0x04, 0x8B, 0x9C, 0x8F, 0x73, 0x2B, 0x88, 0x5E, 0x33, 0x02, 0x0E, 0xB6,
+0x9D, 0xC1, 0x83, 0x31, 0x12, 0xC5, 0x7A, 0x09, 0x04, 0xAC, 0x19, 0xED, 0x4B, 0x5B, 0x08, 0x52,
+0xA0, 0x29, 0x95, 0x2F, 0x27, 0x4C, 0x43, 0xF2, 0x1E, 0x4C, 0xA0, 0xEF, 0x62, 0x1B, 0xE6, 0xAA,
+0xF3, 0x66, 0x56, 0x7F, 0x0D, 0xF1, 0xC5, 0xAA, 0xB6, 0x28, 0xDB, 0x2C, 0x42, 0x39, 0x30, 0xBE,
+0x48, 0xF1, 0xD8, 0x18, 0xAD, 0xFA, 0xFD, 0xE6, 0x0B, 0xE6, 0xD5, 0xC3, 0x97, 0xCD, 0x31, 0x6C,
+0x43, 0xA2, 0xC9, 0xE3, 0x25, 0xA9, 0xE4, 0x71, 0xFD, 0x6A, 0xFF, 0x45, 0xA8, 0x75, 0x48, 0x3D,
+0x84, 0xE3, 0xE5, 0x79, 0xAE, 0x86, 0x39, 0xF7, 0x81, 0xBA, 0x02, 0x53, 0x0A, 0x85, 0x39, 0xD1,
+0x64, 0x87, 0x44, 0xA8, 0xB0, 0x78, 0x72, 0xE5, 0xFD, 0x93, 0x21, 0xFA, 0xF5, 0x4A, 0xB8, 0xF8,
+0x32, 0x59, 0x87, 0xA8, 0xD2, 0xFB, 0x1F, 0xB8, 0xC3, 0x14, 0x41, 0xC9, 0xA1, 0x9F, 0xDA, 0x4B,
+0x2F, 0x6F, 0x30, 0xFF, 0xF1, 0xC3, 0x97, 0xCD, 0xAB, 0xAB, 0xDF, 0x32, 0xDB, 0x77, 0xB6, 0x80,
+0xCC, 0x59, 0x72, 0x74, 0x09, 0x55, 0x69, 0x76, 0xEE, 0x69, 0x31, 0xCF, 0x3C, 0xBF, 0xDA, 0xFC,
+0x00, 0xBF, 0xB7, 0x42, 0xAD, 0x2B, 0xC0, 0x7D, 0x63, 0xD1, 0xBC, 0x26, 0x21, 0x87, 0x4C, 0x4D,
+0x61, 0xDD, 0x67, 0x7A, 0x92, 0x4F, 0x3A, 0xFD, 0xDF, 0x87, 0xF2, 0x4E, 0x9C, 0xF9, 0x99, 0x19,
+0x10, 0xDE, 0x82, 0x7F, 0xDB, 0x4F, 0x7E, 0xF1, 0x1A, 0xA2, 0x15, 0xE1, 0x6F, 0xC7, 0x07, 0x28,
+0xFA, 0x7B, 0xE1, 0x42, 0xBB, 0x10, 0x91, 0x6F, 0x7C, 0xE7, 0xD7, 0xE6, 0xBB, 0x3F, 0xF9, 0x1D,
+0x9C, 0xFC, 0x5B, 0xE5, 0xD8, 0xA5, 0xBE, 0x67, 0x2F, 0xE2, 0x17, 0xCD, 0xBC, 0x8B, 0xF0, 0xF0,
+0x9F, 0x03, 0xB3, 0x5A, 0x1E, 0xEE, 0x6B, 0x6D, 0x50, 0xF8, 0x9E, 0x79, 0xE6, 0x0F, 0xE6, 0xA7,
+0xCF, 0xBE, 0x06, 0xC7, 0xF9, 0x43, 0x12, 0x4D, 0xC9, 0x8A, 0x14, 0x1D, 0x50, 0xE6, 0x5A, 0x4F,
+0x9F, 0x33, 0xAF, 0xAF, 0xDB, 0x6E, 0xBE, 0xFD, 0xBD, 0x97, 0xCC, 0x06, 0x3C, 0xBC, 0xE9, 0xC5,
+0x5D, 0x8F, 0xFE, 0x57, 0x30, 0x59, 0x2D, 0x4B, 0x1C, 0xE2, 0x7E, 0x9A, 0xB8, 0x76, 0x6A, 0x54,
+0xA7, 0x1D, 0xCC, 0x1D, 0xB2, 0x6F, 0x55, 0xAA, 0x67, 0x4B, 0x76, 0x3F, 0xD6, 0xBD, 0x22, 0xB6,
+0xC3, 0x3C, 0xAE, 0x09, 0x20, 0xD1, 0x8F, 0x3C, 0x7C, 0x97, 0x99, 0x38, 0xBE, 0x18, 0x31, 0x60,
+0x08, 0xC6, 0x41, 0x40, 0xD6, 0xEB, 0x20, 0x32, 0xFF, 0xFE, 0xFD, 0xDF, 0x9A, 0xB5, 0x1B, 0xDF,
+0x93, 0x0A, 0x20, 0x9D, 0x58, 0xCE, 0x74, 0x32, 0x5B, 0xE1, 0x9B, 0x48, 0xF5, 0xF2, 0xDB, 0xDF,
+0x7B, 0xD1, 0x3C, 0xFF, 0xCB, 0xD5, 0xA6, 0x0D, 0x91, 0x9F, 0x85, 0xF0, 0x9F, 0xBD, 0x77, 0xE9,
+0x02, 0xF4, 0x79, 0x62, 0x1F, 0x2F, 0xB4, 0xEE, 0xA5, 0x6F, 0x30, 0xDD, 0x0C, 0xD6, 0x75, 0xFD,
+0xED, 0x57, 0xA8, 0x1C, 0x18, 0x2E, 0x3C, 0x2F, 0x1F, 0x7E, 0x62, 0xA9, 0x98, 0xA1, 0x79, 0xAD,
+0x53, 0x21, 0x26, 0xA1, 0xFA, 0x16, 0xC6, 0xC7, 0x2B, 0xF0, 0xEF, 0x64, 0xB0, 0x03, 0xD3, 0xA1,
+0x5C, 0xC0, 0xD8, 0x6C, 0x96, 0xB1, 0xF9, 0xBA, 0xF9, 0x1E, 0xB0, 0xD8, 0x8B, 0xDC, 0x72, 0x1D,
+0x88, 0x1E, 0xCE, 0xC1, 0xF5, 0x37, 0x1B, 0x35, 0x62, 0x17, 0x81, 0xF8, 0x27, 0xF2, 0x27, 0xAC,
+0x40, 0xF0, 0xC4, 0x9F, 0x7F, 0xE4, 0x41, 0xF3, 0xD1, 0x27, 0xEF, 0x97, 0x52, 0x6D, 0x57, 0x40,
+0x7C, 0xD7, 0x41, 0x01, 0xFD, 0xD6, 0x77, 0x5F, 0x12, 0x7F, 0xCD, 0x13, 0x50, 0xFC, 0x38, 0xF6,
+0xA9, 0x7A, 0x32, 0x11, 0xF1, 0x1E, 0x10, 0xE9, 0x17, 0x7F, 0xB7, 0xC1, 0x7C, 0xFB, 0x3F, 0x5E,
+0x10, 0xFF, 0x46, 0x3E, 0x53, 0x67, 0xCF, 0x68, 0x10, 0x4B, 0x97, 0xF4, 0xA8, 0xDF, 0x7E, 0xDF,
+0x14, 0xA8, 0xBD, 0x6E, 0x34, 0x6A, 0x89, 0x1D, 0x8F, 0x98, 0x17, 0x34, 0x6B, 0xC4, 0x32, 0x80,
+0x42, 0xDE, 0x9C, 0xF9, 0xD4, 0xC6, 0xC3, 0x06, 0xCC, 0xC8, 0xCE, 0x20, 0x44, 0x19, 0xF8, 0x9B,
+0x11, 0xFF, 0x37, 0x7E, 0x59, 0xE4, 0xF7, 0x60, 0x5B, 0xAE, 0x13, 0x99, 0xC3, 0xE5, 0x78, 0x5B,
+0x01, 0xB1, 0x32, 0x50, 0x2C, 0x50, 0x24, 0xD3, 0xFD, 0xF5, 0x9F, 0xA3, 0x6A, 0x9E, 0x57, 0xF2,
+0xEC, 0xDF, 0x40, 0xC1, 0x0B, 0x94, 0x3B, 0xA7, 0xE0, 0xC9, 0xF7, 0xC4, 0x2A, 0x9E, 0x5D, 0x0E,
+0x05, 0x2F, 0x3A, 0x07, 0x8A, 0x1E, 0x95, 0x3A, 0x2A, 0x78, 0xB8, 0xA1, 0xB8, 0xBF, 0x56, 0xA9,
+0xB3, 0xCB, 0xA2, 0x33, 0x6F, 0x3C, 0x34, 0xE1, 0xD1, 0xDF, 0xC2, 0x2B, 0x76, 0xE1, 0x5F, 0xA8,
+0x71, 0x62, 0x82, 0xB1, 0xB3, 0x55, 0xEC, 0xC2, 0x39, 0x54, 0xEC, 0xBC, 0x6A, 0x67, 0x49, 0x14,
+0xB1, 0x67, 0x92, 0xDC, 0x69, 0x50, 0xEB, 0xA6, 0x4F, 0x9E, 0x90, 0x92, 0x7C, 0x6E, 0x72, 0xCE,
+0x71, 0xA2, 0x59, 0xC6, 0xAC, 0x9B, 0xD2, 0x38, 0x55, 0x3B, 0xA1, 0x75, 0x09, 0x1E, 0x40, 0x8E,
+0xC4, 0x58, 0xCB, 0x80, 0x25, 0x76, 0xA1, 0xA9, 0xC2, 0x6D, 0x23, 0x8B, 0xDC, 0xD3, 0x2B, 0xE6,
+0x7E, 0x11, 0x12, 0x20, 0xDB, 0x38, 0xB6, 0xC7, 0x0D, 0x9E, 0x3D, 0x1F, 0x07, 0x62, 0x35, 0xAD,
+0x8E, 0xE1, 0xF4, 0xA9, 0x09, 0x9C, 0xE0, 0xCD, 0x67, 0x0F, 0x92, 0x6F, 0x4B, 0xDA, 0x06, 0xF6,
+0x17, 0xE3, 0xC5, 0x76, 0x3A, 0xA2, 0xC6, 0xB9, 0x3E, 0x58, 0x75, 0xCD, 0xDF, 0x23, 0xA2, 0x81,
+0x15, 0x76, 0x99, 0x8F, 0xA7, 0x09, 0xD5, 0xBA, 0x80, 0xD6, 0x45, 0xDA, 0x74, 0x7D, 0x8F, 0x79,
+0xA4, 0x7B, 0x8C, 0xEC, 0xDF, 0x1B, 0x18, 0x83, 0x5D, 0x18, 0x9B, 0xD7, 0xE0, 0x5F, 0x47, 0x82,
+0x3D, 0x01, 0xCA, 0x05, 0x2B, 0x4E, 0x58, 0xD5, 0x62, 0x6C, 0x4C, 0x54, 0xD2, 0xA8, 0x7C, 0x31,
+0x30, 0x61, 0x33, 0x22, 0x41, 0xF7, 0xB4, 0xE1, 0xE1, 0x0D, 0xF5, 0x8C, 0x44, 0xE9, 0x1A, 0x08,
+0xDC, 0xBB, 0x67, 0xAE, 0x4A, 0xAA, 0x90, 0x77, 0x41, 0xBE, 0x7C, 0x4E, 0xB7, 0x76, 0x44, 0x89,
+0xD2, 0x1F, 0x6D, 0x2D, 0xA2, 0x4D, 0xD7, 0x63, 0xE6, 0x3A, 0x4C, 0xC1, 0x41, 0x57, 0x0B, 0xAA,
+0x78, 0x12, 0x51, 0x0A, 0x45, 0x8D, 0xA4, 0xCD, 0xAB, 0x7C, 0x54, 0xD6, 0x48, 0xEA, 0xD8, 0x16,
+0xB7, 0xA5, 0x92, 0x46, 0xEB, 0x42, 0xCB, 0xC5, 0xEB, 0x42, 0x10, 0x19, 0xDC, 0x70, 0xE0, 0x42,
+0xA7, 0x28, 0x81, 0x7E, 0x1B, 0x22, 0x48, 0x81, 0x6D, 0x3C, 0x7C, 0xE3, 0x16, 0x80, 0xD8, 0xDD,
+0x56, 0x92, 0x63, 0x48, 0xB2, 0x48, 0x0C, 0x79, 0xAC, 0x1B, 0xB1, 0xCD, 0x7A, 0xCC, 0x54, 0xF0,
+0xF8, 0x79, 0x03, 0x8E, 0x85, 0x9F, 0xB9, 0xFF, 0x16, 0x10, 0x54, 0x26, 0x37, 0x9E, 0x03, 0xA5,
+0x8E, 0x35, 0x66, 0xE7, 0x54, 0xE0, 0x45, 0x8F, 0xCC, 0x30, 0xC1, 0xC4, 0xD3, 0x65, 0x5F, 0xDC,
+0xA2, 0xE3, 0xC6, 0x5E, 0x25, 0xB6, 0x24, 0x93, 0x3D, 0x8E, 0x44, 0x13, 0xCF, 0x35, 0x1F, 0x68,
+0x77, 0x21, 0x00, 0x61, 0x3E, 0x0A, 0xAD, 0x67, 0xE1, 0xC5, 0x91, 0x51, 0xA2, 0x6B, 0x90, 0x4E,
+0x63, 0xD5, 0x9A, 0x77, 0xCC, 0x6A, 0x98, 0xA6, 0x56, 0xAF, 0x7E, 0xDB, 0xAC, 0x5A, 0xF5, 0x96,
+0x97, 0xF6, 0x2F, 0x6A, 0x00, 0x00, 0x35, 0x4E, 0x49, 0x44, 0x41, 0x54, 0x59, 0xC5, 0xBF, 0xAF,
+0x63, 0x19, 0xD5, 0x1F, 0x90, 0x32, 0x26, 0x0D, 0x9E, 0x83, 0x87, 0xDA, 0x9D, 0x28, 0x46, 0x4F,
+0xFF, 0x25, 0xBE, 0x68, 0xF6, 0x66, 0x5E, 0xF6, 0x51, 0x9D, 0x0B, 0x58, 0xCC, 0x1D, 0x6A, 0x11,
+0xEB, 0xD4, 0x1E, 0x85, 0x32, 0xB7, 0x0E, 0x64, 0x64, 0x15, 0x72, 0x8C, 0xAD, 0xC2, 0x7E, 0xB8,
+0xBF, 0x55, 0xAF, 0x63, 0x3F, 0xFC, 0x8B, 0x87, 0xEA, 0x56, 0xF8, 0x53, 0x75, 0xC0, 0x7F, 0x69,
+0x1A, 0xFC, 0xE8, 0x8A, 0x0A, 0xF0, 0x1C, 0xF0, 0x04, 0x36, 0xAE, 0x23, 0xBC, 0x86, 0x19, 0x31,
+0x7A, 0xF7, 0x5D, 0xB3, 0xA5, 0xD2, 0x00, 0x8F, 0x6B, 0x1B, 0xA2, 0x21, 0x49, 0x78, 0x6C, 0xDB,
+0x3C, 0x76, 0x3F, 0xDB, 0xFD, 0xAC, 0x83, 0xE2, 0x73, 0x0C, 0x0A, 0xD7, 0x78, 0x3C, 0xD8, 0x6F,
+0x9F, 0x77, 0x9B, 0xA8, 0x39, 0x7C, 0xEE, 0x90, 0xE8, 0x26, 0x0C, 0x1A, 0xF2, 0x2F, 0x89, 0x83,
+0xBA, 0x2C, 0xFC, 0x8B, 0x58, 0xA2, 0x1B, 0x5B, 0xE2, 0x86, 0xC2, 0x57, 0xDB, 0xD0, 0x42, 0x11,
+0x5D, 0xB3, 0x08, 0xEE, 0x32, 0xAC, 0x9B, 0x7A, 0x0F, 0x4A, 0x8A, 0xCD, 0x9E, 0xD9, 0x80, 0xC7,
+0x57, 0x0E, 0x22, 0x3E, 0x4F, 0x08, 0x19, 0x59, 0x2D, 0xF8, 0xF1, 0x7C, 0xBD, 0x65, 0xCF, 0x1B,
+0xFA, 0xCE, 0x94, 0x28, 0x6F, 0xE0, 0x5C, 0xEE, 0x80, 0x92, 0x45, 0x00, 0xE7, 0x20, 0x60, 0x82,
+0xE7, 0xBA, 0x02, 0xE6, 0xCD, 0xC4, 0x04, 0x56, 0x6E, 0x4A, 0xBD, 0xFB, 0x09, 0xF4, 0xD6, 0x7F,
+0x7F, 0xF3, 0x0E, 0x5E, 0xA6, 0xFB, 0x03, 0x2A, 0xE1, 0xDD, 0xBE, 0xC7, 0x46, 0x24, 0x63, 0x77,
+0x80, 0x94, 0xDD, 0x8D, 0x3E, 0x97, 0x81, 0xE4, 0x5D, 0x01, 0x49, 0x3F, 0x02, 0xC5, 0x75, 0xFD,
+0xC6, 0x66, 0x37, 0x5E, 0x5C, 0x7F, 0xFD, 0xD8, 0x44, 0x7F, 0xE9, 0xFB, 0x79, 0x16, 0xA6, 0x7E,
+0xE6, 0xFC, 0x9B, 0x0A, 0xDF, 0x3A, 0xF6, 0xB7, 0x1E, 0x39, 0x00, 0x13, 0xF9, 0x13, 0x16, 0xC0,
+0x05, 0x81, 0x6A, 0xDE, 0x8A, 0x65, 0x0B, 0xCC, 0x5D, 0x8B, 0x66, 0x98, 0xA2, 0xE2, 0x42, 0xB4,
+0xDF, 0x0A, 0x35, 0x77, 0x87, 0x6D, 0x9F, 0xE3, 0x06, 0x63, 0x9F, 0x98, 0xCA, 0x18, 0x75, 0xE3,
+0x94, 0xFB, 0xBF, 0x88, 0x17, 0x88, 0xC6, 0x86, 0x1A, 0xBC, 0xD4, 0x4C, 0x15, 0xBF, 0xE4, 0x40,
+0x7A, 0x4F, 0xE1, 0xED, 0x73, 0x54, 0x13, 0x3B, 0x9E, 0x4D, 0x2A, 0x38, 0x94, 0x3C, 0xF9, 0x57,
+0xC6, 0x06, 0x4D, 0x84, 0x49, 0xFD, 0x17, 0x88, 0x1F, 0x4E, 0x04, 0xF1, 0x7E, 0x6F, 0xF6, 0xED,
+0x37, 0x66, 0xEE, 0xEB, 0x38, 0x62, 0xD6, 0xF5, 0x6D, 0xDA, 0xED, 0xA3, 0xBE, 0x53, 0xD1, 0xEF,
+0x3D, 0xFC, 0xAA, 0x82, 0x36, 0xAC, 0x3F, 0x9C, 0xFF, 0x27, 0x06, 0xA5, 0xF8, 0x63, 0x91, 0xEF,
+0x09, 0x8E, 0xD1, 0xAD, 0xE7, 0xF7, 0xE9, 0xB7, 0x8B, 0xF1, 0xDF, 0x0A, 0x8E, 0xC9, 0x12, 0x2B,
+0x9A, 0x86, 0xE8, 0xDB, 0x98, 0x87, 0xB7, 0x8D, 0x87, 0x30, 0xB8, 0xAB, 0x19, 0xFA, 0x4D, 0x7F,
+0xB7, 0x14, 0x4C, 0x3C, 0xCF, 0x97, 0xF1, 0x74, 0x14, 0xA7, 0x7D, 0xE7, 0x6B, 0x66, 0x55, 0x07,
+0x3F, 0xF3, 0xEA, 0xB0, 0x6A, 0x53, 0xA0, 0xCE, 0x39, 0xE2, 0x13, 0x8F, 0x89, 0x75, 0xEB, 0xE1,
+0x80, 0xB1, 0x3E, 0x67, 0x01, 0xF9, 0x23, 0x69, 0x8A, 0x46, 0xCF, 0x72, 0x7B, 0x17, 0x96, 0xCE,
+0x07, 0xCD, 0xEC, 0x29, 0xB5, 0x08, 0x9C, 0x48, 0x14, 0x15, 0x36, 0xFC, 0x00, 0x30, 0x22, 0xB6,
+0xB9, 0x05, 0x4E, 0xB9, 0x54, 0x8D, 0x18, 0x85, 0x3A, 0x8E, 0xFB, 0x65, 0xFF, 0xEC, 0xEC, 0x9C,
+0xE3, 0xAC, 0xB2, 0xE6, 0x94, 0xB9, 0x58, 0x35, 0xCF, 0xDA, 0xCC, 0xAD, 0xDF, 0xA1, 0xDB, 0x2E,
+0x4A, 0x66, 0x1D, 0x71, 0xB5, 0x35, 0x76, 0x89, 0x99, 0xEB, 0x7B, 0x14, 0x53, 0x67, 0xB4, 0xF6,
+0x95, 0x2D, 0xBA, 0x40, 0x6E, 0x3B, 0xB1, 0xF2, 0x55, 0xA7, 0xB2, 0x4C, 0xAD, 0x28, 0x14, 0x3F,
+0xA5, 0xB1, 0xE4, 0x5F, 0x47, 0x7F, 0xB4, 0x5D, 0x50, 0xB9, 0xD6, 0xC0, 0x1F, 0xED, 0x8D, 0xE3,
+0x57, 0x45, 0x99, 0x6B, 0x75, 0x4A, 0xDB, 0x55, 0x30, 0xAC, 0x8D, 0x27, 0x3B, 0xCC, 0x6A, 0xA8,
+0x5F, 0x9B, 0x4E, 0x5D, 0x81, 0x22, 0x66, 0x19, 0x33, 0x4D, 0xAC, 0x24, 0x63, 0x7F, 0x38, 0xDC,
+0x6E, 0x56, 0xE1, 0xB7, 0x0D, 0x58, 0x87, 0x04, 0x91, 0xE6, 0xCA, 0x16, 0x90, 0xB9, 0x35, 0x88,
+0x44, 0x5D, 0x83, 0xE5, 0x54, 0xFF, 0x7C, 0x42, 0x60, 0x06, 0x2F, 0x90, 0x74, 0xAD, 0x3E, 0x0A,
+0x02, 0x89, 0x6D, 0xAF, 0xE2, 0x3C, 0x72, 0xFD, 0x83, 0x58, 0x87, 0x91, 0xAB, 0x6B, 0x31, 0x33,
+0x38, 0x82, 0xE6, 0xE0, 0x78, 0x7F, 0x36, 0x2A, 0xA1, 0xF3, 0x40, 0xCC, 0x1E, 0xA8, 0x45, 0x4D,
+0x62, 0x90, 0x35, 0x9E, 0x9B, 0x0E, 0xEC, 0x6F, 0x27, 0xD6, 0x7F, 0x76, 0xFF, 0x25, 0xF3, 0x8D,
+0xED, 0x6D, 0xE6, 0xFF, 0x6E, 0x3B, 0x67, 0xFE, 0x7D, 0x47, 0x9B, 0xF9, 0xFD, 0xA1, 0x76, 0x98,
+0x7B, 0xAD, 0x79, 0xB6, 0x0E, 0x4A, 0xDF, 0x47, 0x9A, 0x8A, 0xCC, 0x87, 0xA6, 0x22, 0xF0, 0x00,
+0x3E, 0x76, 0xBD, 0x3D, 0x2F, 0x18, 0xA4, 0x51, 0x06, 0xF2, 0x58, 0x8A, 0xD9, 0x5F, 0xBD, 0xFE,
+0x5D, 0x87, 0xDF, 0xE9, 0x9F, 0xD7, 0x57, 0x19, 0xB2, 0x6C, 0x28, 0x6D, 0xB3, 0x40, 0x12, 0x3E,
+0xF0, 0xC1, 0x95, 0x52, 0xBA, 0x89, 0x41, 0x08, 0x74, 0x24, 0x7F, 0x03, 0x04, 0xEE, 0x17, 0xBF,
+0x58, 0x65, 0xFE, 0xED, 0xEB, 0xCF, 0x99, 0xAF, 0x7C, 0xF5, 0x07, 0xE6, 0x7F, 0xFF, 0xD3, 0xD3,
+0xE6, 0x67, 0x3F, 0xFB, 0xA3, 0xD9, 0xB5, 0xEB, 0xB0, 0xDC, 0x3B, 0x4A, 0xE1, 0xEB, 0xF5, 0xF8,
+0xE3, 0xF7, 0x9A, 0x25, 0x77, 0xCF, 0x36, 0xF5, 0x78, 0x29, 0x14, 0x33, 0xB1, 0xE4, 0xC2, 0xB4,
+0x6E, 0x10, 0x89, 0xA6, 0xFA, 0xBA, 0x2A, 0xF3, 0x91, 0xF7, 0x2F, 0x97, 0x54, 0x16, 0x2C, 0x2D,
+0x76, 0x1C, 0xE4, 0xEE, 0xF9, 0x5F, 0xAE, 0x41, 0xDB, 0x3F, 0x35, 0xFF, 0xF3, 0xCB, 0x3F, 0x30,
+0xFF, 0xF2, 0xB5, 0x67, 0xCC, 0xCB, 0x50, 0x0C, 0x4F, 0x21, 0x52, 0xB5, 0x1B, 0xAA, 0x5E, 0x19,
+0x1E, 0xEC, 0x8F, 0xC2, 0x07, 0x90, 0xE5, 0xAF, 0xE8, 0xC7, 0xDC, 0x1B, 0x73, 0x64, 0x84, 0xEC,
+0xFD, 0x2B, 0x16, 0x8A, 0xF2, 0x58, 0x00, 0xB3, 0x2A, 0xCF, 0x1B, 0x2B, 0x2B, 0xFC, 0x1C, 0x8A,
+0xE0, 0x3F, 0xA1, 0xED, 0x2F, 0x7F, 0xF9, 0xFB, 0xE6, 0xAB, 0x5F, 0xFD, 0xA1, 0xF9, 0xE6, 0xB7,
+0x9E, 0x37, 0xAF, 0xAD, 0xDA, 0x2A, 0x65, 0xA4, 0x88, 0x49, 0x13, 0x08, 0xE9, 0x7D, 0x28, 0x26,
+0x2F, 0x6A, 0x0E, 0x8E, 0x9B, 0x2F, 0xCE, 0x3D, 0x88, 0x5D, 0x84, 0xB4, 0xF4, 0x46, 0x5C, 0x7B,
+0xBD, 0x63, 0x44, 0xEE, 0xD5, 0x03, 0xB9, 0xAB, 0xF4, 0xF4, 0xBD, 0x8E, 0xDD, 0x8A, 0x6E, 0x23,
+0x53, 0x61, 0x4A, 0xFD, 0xF8, 0x5F, 0x3E, 0x62, 0x3E, 0xFA, 0xD1, 0x07, 0x45, 0xC1, 0xE3, 0x36,
+0x54, 0xE8, 0x7E, 0xFF, 0x87, 0xCD, 0x38, 0x57, 0xCF, 0x9A, 0x2F, 0x7F, 0xE5, 0x47, 0xE6, 0x6B,
+0xFF, 0xE7, 0xE7, 0xE6, 0x85, 0x5F, 0xAF, 0x35, 0xBB, 0xE1, 0x03, 0x76, 0x0E, 0xD6, 0x30, 0x8E,
+0x49, 0xFA, 0x94, 0x3D, 0xFE, 0xC4, 0x32, 0xB3, 0x00, 0xEA, 0x2A, 0xCD, 0x90, 0x3D, 0x27, 0x77,
+0xEF, 0x94, 0x4E, 0xFA, 0x4A, 0x1F, 0x03, 0x39, 0xEA, 0xB8, 0x17, 0xEC, 0xFE, 0x36, 0x09, 0xEE,
+0x5B, 0x03, 0x23, 0x90, 0x54, 0xD5, 0xFE, 0xE2, 0x23, 0xF7, 0x9B, 0xE9, 0x53, 0x27, 0x21, 0x93,
+0x01, 0x1A, 0xC7, 0xB8, 0xB8, 0x82, 0x8A, 0x27, 0xEB, 0x61, 0x4A, 0xFF, 0x7F, 0xDF, 0xF9, 0x0D,
+0xCE, 0xEB, 0x8F, 0xCD, 0x3F, 0xFF, 0xF3, 0xD3, 0x50, 0x69, 0x31, 0x36, 0xA1, 0xDA, 0x75, 0xD2,
+0xDF, 0x13, 0xEB, 0x8C, 0x07, 0x59, 0x5F, 0x8E, 0x31, 0xF1, 0xC0, 0x8A, 0x05, 0x30, 0x5D, 0x27,
+0x36, 0x3B, 0xD3, 0xE7, 0x8E, 0xB5, 0x63, 0xA7, 0xC3, 0x5A, 0xF5, 0xE7, 0x7F, 0x76, 0xBF, 0x99,
+0xD2, 0x30, 0x11, 0xD7, 0x10, 0x02, 0x30, 0x2E, 0x5C, 0x12, 0x72, 0xFC, 0xAD, 0x6F, 0xFD, 0xCA,
+0x7C, 0xE5, 0x2B, 0x76, 0xEC, 0x7C, 0xFD, 0x1B, 0xCF, 0x99, 0x9F, 0x3C, 0xFD, 0x07, 0x09, 0xB0,
+0xB8, 0x02, 0x35, 0xB0, 0x10, 0x18, 0x2E, 0x83, 0x02, 0xBD, 0xE4, 0x8E, 0x59, 0xA2, 0x5C, 0x33,
+0x4A, 0x23, 0xAA, 0x9C, 0xF7, 0x07, 0xC3, 0x70, 0xFC, 0x9E, 0x9A, 0xA7, 0xF5, 0x4D, 0x1E, 0x29,
+0xDF, 0x1C, 0x4A, 0x01, 0x7C, 0x15, 0xEA, 0xB9, 0xF1, 0x62, 0xF3, 0x8A, 0x53, 0x54, 0x7D, 0x8A,
+0x55, 0x9C, 0x42, 0x65, 0xAA, 0xB7, 0xE5, 0x54, 0xAB, 0xE2, 0xDB, 0x89, 0x2A, 0x59, 0x3D, 0xB7,
+0xB3, 0x6F, 0xB5, 0x7E, 0xBB, 0x7E, 0xF7, 0x87, 0xDB, 0x6C, 0xEF, 0xEB, 0x44, 0x7D, 0xDA, 0xFA,
+0x3F, 0xD6, 0x1E, 0x6A, 0x9A, 0xF8, 0x7A, 0xB8, 0x19, 0x98, 0x4A, 0xA4, 0x9F, 0xCC, 0xF1, 0xFE,
+0x72, 0x03, 0x68, 0x9B, 0xDB, 0xB1, 0xAD, 0x48, 0x3B, 0x92, 0x90, 0x16, 0x0B, 0x8B, 0x60, 0xFA,
+0x6D, 0x98, 0x50, 0x6E, 0xEE, 0x44, 0xA2, 0xC6, 0x3B, 0x30, 0x97, 0xC0, 0xE7, 0x22, 0x15, 0x29,
+0x2E, 0xC4, 0xFC, 0x8E, 0xB7, 0xEA, 0x4E, 0x3C, 0x68, 0x79, 0x61, 0x79, 0x87, 0xD6, 0x58, 0x9E,
+0x12, 0x3E, 0x1A, 0x7C, 0x04, 0xA7, 0x25, 0x36, 0xD6, 0xAF, 0xCC, 0xFF, 0xF3, 0x44, 0xD0, 0x3F,
+0xC8, 0x64, 0x2B, 0xAE, 0x67, 0x3F, 0xB8, 0xD9, 0xA9, 0x5F, 0x12, 0xE0, 0x62, 0x15, 0xB3, 0xE2,
+0xA2, 0x42, 0x53, 0x37, 0x11, 0x25, 0x6B, 0x52, 0x10, 0x2C, 0xC2, 0xFE, 0x5E, 0x82, 0xF2, 0x70,
+0x18, 0xBE, 0x44, 0xE4, 0x16, 0x34, 0xC3, 0x7A, 0xBF, 0x42, 0xDF, 0x1F, 0x1E, 0x6B, 0x4F, 0x7F,
+0x39, 0xDB, 0x17, 0xFB, 0x30, 0xEB, 0xF9, 0x86, 0x1B, 0xDE, 0x44, 0xAC, 0xC9, 0x2E, 0xBA, 0xBD,
+0xBD, 0x14, 0xB9, 0xAD, 0xF5, 0x43, 0xF4, 0x0F, 0xC4, 0xB0, 0xA5, 0x0C, 0xA8, 0x75, 0x78, 0x00,
+0x62, 0xAB, 0x4E, 0x57, 0xB3, 0xB6, 0xC9, 0x05, 0x4E, 0xDC, 0xE4, 0x65, 0x3C, 0x22, 0x9B, 0x91,
+0x93, 0x9E, 0x83, 0x7F, 0xD9, 0x31, 0x28, 0x6D, 0x9C, 0xF9, 0x99, 0xB9, 0xE2, 0x88, 0x2B, 0xC9,
+0x11, 0xA3, 0x4B, 0xB9, 0xFC, 0x14, 0x4C, 0xAC, 0x9E, 0x70, 0x51, 0x51, 0x23, 0x01, 0x3B, 0x82,
+0xE5, 0x54, 0xE5, 0xE8, 0x9F, 0xC7, 0x75, 0x49, 0x88, 0x99, 0x3A, 0xE4, 0x38, 0xA2, 0x50, 0xA9,
+0xDC, 0x31, 0xAA, 0xD4, 0xFB, 0xBF, 0x91, 0x40, 0x92, 0x30, 0x1E, 0xC5, 0x72, 0xAF, 0x08, 0xB2,
+0xC3, 0x54, 0xF2, 0x64, 0xDF, 0xD8, 0x0F, 0xCD, 0xB0, 0xDC, 0x77, 0x7C, 0x42, 0x13, 0x12, 0xAF,
+0x6A, 0x54, 0xA0, 0x58, 0x0C, 0xE5, 0x6D, 0x51, 0x65, 0xAE, 0x99, 0x5A, 0x9A, 0x6D, 0xC6, 0x83,
+0x6C, 0xD1, 0xF7, 0x8D, 0xE6, 0xE3, 0x4D, 0x50, 0x07, 0xA9, 0x38, 0x52, 0xA9, 0xDB, 0x0F, 0xD5,
+0x8F, 0x7E, 0xB2, 0xD3, 0xCA, 0xB3, 0xB1, 0x7E, 0xAE, 0xB9, 0x13, 0x81, 0x17, 0x33, 0xCB, 0x91,
+0x82, 0xA6, 0x17, 0xB5, 0x8E, 0xC7, 0x90, 0x8F, 0x1D, 0xCC, 0x28, 0xCB, 0x91, 0x99, 0xA6, 0x21,
+0x92, 0x1A, 0xF6, 0x95, 0x18, 0xD4, 0x15, 0x8D, 0x13, 0x1F, 0xBD, 0xDE, 0x14, 0x3B, 0x6E, 0x4F,
+0xD5, 0xBF, 0x0A, 0xF7, 0x81, 0x25, 0x50, 0x81, 0x96, 0x2D, 0x99, 0x63, 0xA6, 0xE1, 0x21, 0xC7,
+0xFB, 0x00, 0x95, 0x8B, 0x1D, 0x3B, 0xF6, 0x9B, 0x8D, 0x50, 0x27, 0xD6, 0xC0, 0x67, 0xE9, 0x4D,
+0xF8, 0x15, 0x6D, 0x67, 0x14, 0x2C, 0x1C, 0xF0, 0x6B, 0x61, 0xBE, 0xBC, 0x17, 0xEB, 0x53, 0x39,
+0xAA, 0x03, 0xA9, 0x2B, 0x86, 0x09, 0x5F, 0x6A, 0x0B, 0x63, 0x3B, 0x79, 0xB1, 0xE8, 0x65, 0x34,
+0x30, 0x00, 0xE0, 0x2E, 0x28, 0x7C, 0x2C, 0x62, 0xDF, 0xD0, 0x50, 0x2D, 0x49, 0x8A, 0x77, 0xC2,
+0x0F, 0x6C, 0x1D, 0xCC, 0xA3, 0x54, 0x98, 0x18, 0x08, 0xB0, 0x7F, 0xFF, 0x11, 0x39, 0x79, 0xD5,
+0xF0, 0xDB, 0x5B, 0xBC, 0xA0, 0xC9, 0xDC, 0xB1, 0x70, 0xBA, 0x04, 0x49, 0xD8, 0x6B, 0x25, 0x71,
+0xCB, 0x2C, 0x41, 0xC5, 0x9C, 0x7C, 0xCB, 0x96, 0xCE, 0xC7, 0x71, 0xCD, 0x36, 0xB5, 0x20, 0x90,
+0x4C, 0x67, 0xF2, 0x1E, 0xA3, 0x23, 0x71, 0xDC, 0xAF, 0x43, 0x7D, 0x21, 0x51, 0xDD, 0xBC, 0x69,
+0xA7, 0x39, 0x04, 0x85, 0x8B, 0x11, 0x97, 0xF3, 0x11, 0x61, 0xBA, 0x14, 0xFD, 0x9D, 0x81, 0x7B,
+0x9F, 0x4F, 0x14, 0xCE, 0xFB, 0x41, 0x0F, 0x25, 0xCB, 0xEE, 0x38, 0x7C, 0xC3, 0x1C, 0xE8, 0x48,
+0xA7, 0x5F, 0xA0, 0xE0, 0x31, 0xF0, 0xD4, 0x41, 0x72, 0xAF, 0x96, 0x44, 0x01, 0xD6, 0x02, 0x13,
+0x2F, 0x9E, 0x73, 0x19, 0xC9, 0xF7, 0x62, 0xA8, 0x4B, 0x2B, 0x97, 0x2F, 0xC0, 0xF9, 0x9A, 0x0B,
+0x52, 0x52, 0x87, 0xDB, 0x49, 0x86, 0xD9, 0x0F, 0x33, 0xE1, 0x46, 0x90, 0x1D, 0x9E, 0xAB, 0xF5,
+0x50, 0x9C, 0x76, 0x21, 0x5F, 0x1D, 0xAB, 0x54, 0x8C, 0x83, 0x9A, 0xD4, 0x08, 0xE5, 0x8A, 0x7D,
+0xBD, 0x17, 0xEB, 0xB3, 0x54, 0x57, 0x6F, 0x7E, 0xC5, 0xD6, 0xC5, 0x90, 0x27, 0x70, 0x70, 0x94,
+0x21, 0x84, 0xC7, 0x9D, 0xFC, 0xBE, 0x54, 0xAB, 0xD0, 0x8F, 0xC6, 0xEE, 0xAB, 0x9F, 0x89, 0x7E,
+0xA0, 0x77, 0x62, 0x0C, 0xBC, 0xEF, 0x9E, 0x79, 0x56, 0x1D, 0x9E, 0x51, 0x67, 0x8A, 0xF0, 0x52,
+0x71, 0x14, 0xB9, 0xF8, 0xB6, 0xC2, 0x4F, 0x93, 0xFD, 0xE5, 0x39, 0xE6, 0xD8, 0x64, 0x50, 0x43,
+0xCD, 0xA4, 0x4A, 0x19, 0x63, 0x2B, 0x30, 0x16, 0x96, 0x2D, 0x9D, 0x87, 0x71, 0x51, 0x2B, 0xE4,
+0x2D, 0xD1, 0xC4, 0xDD, 0x33, 0x81, 0x76, 0x25, 0x14, 0x4C, 0xAA, 0x82, 0xEF, 0xBB, 0x67, 0xAE,
+0xA8, 0x9A, 0x4C, 0xDE, 0x7D, 0x18, 0x3E, 0x76, 0x24, 0x71, 0xF4, 0x4F, 0xE4, 0xD8, 0xD9, 0x08,
+0x75, 0xF9, 0x5D, 0xF8, 0xED, 0x9D, 0xC4, 0x4B, 0x07, 0x09, 0xF5, 0x12, 0x28, 0x81, 0xF7, 0xE2,
+0x98, 0x48, 0x06, 0xA9, 0x06, 0xDA, 0x6E, 0x45, 0x4A, 0x44, 0xF6, 0xD7, 0xB1, 0x61, 0xF8, 0x7D,
+0x70, 0x67, 0x69, 0x18, 0x76, 0x38, 0x90, 0x26, 0xF8, 0x60, 0xE2, 0xA0, 0xCF, 0x81, 0x89, 0xB2,
+0x61, 0x62, 0xB9, 0x99, 0x8F, 0x0B, 0x9D, 0x64, 0x23, 0x1B, 0xCB, 0x74, 0x4E, 0x1E, 0x06, 0xF4,
+0x3B, 0x28, 0x84, 0xC9, 0xA5, 0x16, 0xB5, 0x16, 0x1F, 0x9C, 0x3F, 0xCD, 0x7C, 0x1A, 0x3E, 0x1B,
+0xD3, 0x91, 0x2E, 0x20, 0x15, 0x41, 0x04, 0x1C, 0x17, 0x12, 0x38, 0x01, 0x05, 0x8B, 0x0F, 0x65,
+0x9A, 0x9C, 0xA5, 0x02, 0x83, 0xBB, 0x9F, 0x58, 0x3E, 0x12, 0x2A, 0x52, 0x12, 0xFD, 0xC9, 0x5F,
+0x23, 0xEA, 0x9B, 0x0F, 0x12, 0xB0, 0x8A, 0x96, 0x6C, 0x10, 0x28, 0x5F, 0x41, 0xBE, 0x3A, 0x4F,
+0x01, 0x7D, 0xA5, 0x11, 0x21, 0x39, 0xEE, 0x41, 0x8D, 0x80, 0x96, 0x8A, 0xD2, 0x52, 0x51, 0x1C,
+0x52, 0x51, 0xE8, 0x9E, 0xE6, 0x6E, 0x46, 0xA3, 0x9D, 0x63, 0x2D, 0x42, 0xDE, 0xE4, 0xC5, 0xBF,
+0xCE, 0x89, 0x74, 0xAE, 0x0F, 0x3E, 0xE0, 0xC3, 0x8A, 0x75, 0xA1, 0x2A, 0x17, 0xC8, 0x95, 0xC4,
+0x21, 0xF2, 0xF6, 0x6F, 0x73, 0x23, 0xF2, 0x4E, 0x62, 0xDF, 0xB2, 0x6D, 0x44, 0x6C, 0x5C, 0x04,
+0xB1, 0xAF, 0x48, 0xE2, 0x1F, 0x2C, 0xD2, 0x06, 0x67, 0x56, 0x73, 0xC1, 0x0B, 0x26, 0x54, 0xC3,
+0x6B, 0xA0, 0xFC, 0x34, 0x59, 0x52, 0x6D, 0x99, 0x59, 0x55, 0x6C, 0x4D, 0x0A, 0x63, 0x68, 0x22,
+0x04, 0x34, 0x51, 0x92, 0xF8, 0xE4, 0xD3, 0x87, 0x54, 0x7C, 0x47, 0x9D, 0x0B, 0x02, 0x3E, 0xE7,
+0x61, 0x19, 0x97, 0xE7, 0xE3, 0x77, 0x4F, 0x6E, 0xF8, 0x97, 0xCB, 0x8A, 0x30, 0x17, 0x72, 0x3B,
+0x06, 0x1C, 0x61, 0xE6, 0x4B, 0x1D, 0x5F, 0x2C, 0x99, 0x77, 0x8E, 0xEB, 0xF3, 0xB3, 0x7F, 0xEE,
+0xD0, 0x17, 0x95, 0x26, 0x4D, 0x2E, 0x67, 0x9B, 0xD1, 0xF5, 0xFD, 0x3E, 0x88, 0x21, 0xF9, 0x57,
+0xA2, 0x47, 0x95, 0xA8, 0x43, 0x20, 0x74, 0x1F, 0x9D, 0x56, 0x6C, 0x1E, 0xAE, 0x2B, 0x34, 0xF3,
+0x60, 0x62, 0xA5, 0xC2, 0x46, 0x12, 0x48, 0xF5, 0x9C, 0xC1, 0x2B, 0x1C, 0xCA, 0x7C, 0xA8, 0x93,
+0x8C, 0x3D, 0xD6, 0x50, 0x64, 0x1E, 0x6D, 0x28, 0x44, 0x49, 0xB2, 0xFE, 0xA3, 0xD4, 0x8B, 0xA1,
+0x02, 0xAE, 0x84, 0x1A, 0xB8, 0x62, 0x72, 0x01, 0x70, 0xC8, 0x84, 0xDF, 0x15, 0xDC, 0x1C, 0x40,
+0x30, 0x29, 0xBE, 0xDF, 0x3D, 0x31, 0x5F, 0x7C, 0xF3, 0xFA, 0x7B, 0x7C, 0xD2, 0x04, 0xD9, 0x88,
+0x07, 0xD4, 0x67, 0x3E, 0xF9, 0xA8, 0x79, 0xEC, 0xD1, 0x7B, 0xC4, 0xE1, 0x5C, 0x92, 0xB4, 0xB0,
+0xA4, 0x23, 0xFF, 0xB2, 0x31, 0x19, 0x6E, 0xDD, 0xA6, 0x10, 0x4A, 0xC8, 0xFB, 0xDE, 0x37, 0xDF,
+0xFC, 0xA7, 0x4F, 0x3F, 0x6E, 0x9A, 0x40, 0xA6, 0x38, 0x30, 0x59, 0x67, 0x96, 0xD1, 0xED, 0x19,
+0xD8, 0xBF, 0x4D, 0xF4, 0x9B, 0x78, 0x10, 0xF1, 0x37, 0x92, 0xC8, 0x4F, 0xFE, 0xC5, 0xC3, 0xE6,
+0xFE, 0xFB, 0x16, 0x8A, 0xBF, 0x5D, 0x86, 0xA8, 0xE8, 0xE1, 0x0B, 0x0C, 0x7B, 0x4C, 0x9F, 0xAA,
+0x05, 0x88, 0x64, 0xFC, 0xB3, 0xA7, 0x1E, 0x34, 0x53, 0x40, 0x4A, 0xB2, 0xD0, 0x6E, 0x26, 0x03,
+0xCD, 0x7C, 0xFB, 0x09, 0x9A, 0xA7, 0x0A, 0x45, 0x73, 0xDA, 0xDF, 0x7C, 0xF6, 0x03, 0x66, 0x39,
+0x48, 0x0F, 0xCD, 0xAB, 0x99, 0x9E, 0xB1, 0xF3, 0xF8, 0x5D, 0x4A, 0x16, 0x3E, 0xE2, 0x9B, 0xA0,
+0xFE, 0x3C, 0x85, 0xB6, 0x3F, 0xF0, 0xD8, 0x52, 0x09, 0x44, 0x60, 0xB0, 0x01, 0xFB, 0x41, 0xB3,
+0x2E, 0xB1, 0xF0, 0x93, 0xBD, 0x2F, 0xE1, 0x7F, 0x2E, 0xE3, 0xC3, 0xBB, 0x2F, 0x86, 0x1C, 0x3D,
+0x26, 0x6E, 0x43, 0xF5, 0x0F, 0x63, 0x85, 0xA4, 0xCB, 0x06, 0x7F, 0xF4, 0x3D, 0xC9, 0x6E, 0x30,
+0x80, 0x24, 0xA0, 0x0E, 0xFD, 0x24, 0xE1, 0x48, 0xC4, 0x7B, 0xD8, 0x16, 0x55, 0x49, 0x56, 0xA2,
+0xF8, 0xF4, 0xC7, 0x1E, 0x31, 0x8F, 0x3F, 0x76, 0x8F, 0xA9, 0xAA, 0x82, 0xAF, 0xB8, 0xBB, 0xAE,
+0xC5, 0x71, 0x9A, 0xBB, 0x67, 0xE4, 0x3F, 0xF2, 0xFB, 0x4D, 0x9A, 0x54, 0x61, 0x1E, 0x7A, 0xE8,
+0x0E, 0xF3, 0x59, 0x9C, 0xAF, 0xE9, 0x4D, 0x75, 0xD6, 0x5F, 0x31, 0xC1, 0x24, 0x47, 0x48, 0x8C,
+0x78, 0x0F, 0x10, 0xA2, 0x32, 0x08, 0xDA, 0x20, 0xDD, 0xC5, 0xF1, 0xCA, 0xB6, 0x3C, 0x83, 0xBD,
+0xF7, 0x56, 0xF0, 0x64, 0x98, 0x38, 0x48, 0xF4, 0x40, 0x85, 0x04, 0x46, 0xF0, 0x7E, 0xE4, 0x03,
+0xCB, 0xCD, 0x5F, 0x7F, 0xEA, 0x71, 0xF3, 0xA1, 0x0F, 0xAE, 0x90, 0xAA, 0x14, 0x42, 0xD5, 0x78,
+0x1F, 0x74, 0xFD, 0xE5, 0xCB, 0x00, 0x95, 0xD7, 0x7B, 0x40, 0x5E, 0x3F, 0xFF, 0x77, 0x1F, 0xC6,
+0xFC, 0x21, 0x73, 0x0F, 0xCC, 0xF3, 0x0C, 0xD6, 0xE9, 0x6F, 0xE2, 0x71, 0x58, 0x7F, 0xBB, 0xFB,
+0xCD, 0x93, 0x4F, 0xDE, 0x87, 0x6B, 0xA1, 0xDA, 0xC8, 0x95, 0xC7, 0xF6, 0x89, 0x09, 0x67, 0x8E,
+0x25, 0x60, 0xCA, 0x71, 0xB6, 0x18, 0x44, 0xF3, 0x33, 0x7F, 0xFD, 0x04, 0xDA, 0x9F, 0x25, 0x24,
+0x90, 0xE3, 0x23, 0x13, 0xE7, 0xCB, 0x8E, 0x9D, 0xFE, 0xCE, 0x74, 0x7F, 0x47, 0x33, 0xF0, 0xDF,
+0xB3, 0xBE, 0x84, 0x69, 0xE0, 0xAB, 0xA7, 0x6E, 0x4D, 0xFF, 0x36, 0xC3, 0xB7, 0xC6, 0x8B, 0xF0,
+0xB3, 0xE3, 0xCD, 0xAD, 0x06, 0xB6, 0xF4, 0x5A, 0x44, 0x3A, 0xE9, 0x9C, 0x24, 0x0C, 0xF0, 0xB6,
+0x31, 0x05, 0x37, 0xEE, 0x59, 0xF0, 0x3B, 0xB8, 0x17, 0x26, 0x98, 0xA5, 0x78, 0x73, 0x25, 0xC9,
+0x19, 0xE8, 0x45, 0x36, 0xD4, 0xD1, 0xC1, 0xBC, 0x4A, 0x7B, 0xF0, 0xB6, 0xF5, 0xD2, 0xE6, 0x66,
+0x38, 0x51, 0x23, 0xEF, 0x16, 0x7D, 0x73, 0x24, 0x9F, 0x9D, 0xBD, 0x20, 0xE4, 0x1E, 0x2F, 0x4C,
+0xC7, 0x06, 0x17, 0xD8, 0x0B, 0x85, 0x44, 0xC6, 0xBD, 0xB1, 0x07, 0x6A, 0x9C, 0x8B, 0x94, 0x23,
+0xB9, 0x71, 0xEF, 0xF2, 0x9E, 0xF0, 0xB8, 0x2D, 0x7C, 0x2E, 0x5E, 0x7B, 0xA9, 0xE1, 0x01, 0xD2,
+0x8D, 0x54, 0x23, 0x34, 0x37, 0xDF, 0x35, 0x7D, 0x8A, 0x79, 0xE4, 0x8E, 0xD9, 0xA6, 0x04, 0x37,
+0xF5, 0x64, 0x4F, 0x57, 0xE0, 0x78, 0xBB, 0x69, 0xE7, 0x01, 0xF3, 0xDB, 0x8D, 0x3B, 0xC4, 0x21,
+0x3E, 0x13, 0x81, 0x36, 0x19, 0x08, 0x5A, 0x70, 0x4F, 0xCA, 0xF0, 0x46, 0xE0, 0xC9, 0x9A, 0xFB,
+0xEB, 0x7B, 0x2E, 0xC7, 0xE7, 0x08, 0x6E, 0x70, 0xCB, 0x20, 0x91, 0x73, 0x37, 0x10, 0x79, 0xF8,
+0x38, 0x75, 0xCE, 0xD1, 0xE0, 0x50, 0xD9, 0x70, 0x1B, 0x78, 0x25, 0xD3, 0x49, 0x0F, 0xA2, 0x18,
+0x5E, 0x47, 0x40, 0xD0, 0x35, 0xFA, 0x7A, 0x62, 0xFB, 0x29, 0x48, 0x52, 0xFB, 0x89, 0x45, 0x75,
+0x66, 0x42, 0xB1, 0x35, 0x59, 0xA4, 0x6A, 0x2C, 0x0C, 0x15, 0x7B, 0x2A, 0xA0, 0xA7, 0x90, 0xA7,
+0x8D, 0x90, 0xD5, 0x14, 0xA2, 0xF6, 0x29, 0xA2, 0x4F, 0xFD, 0x5C, 0xC3, 0xCF, 0x30, 0x67, 0xD6,
+0x82, 0x28, 0x35, 0x41, 0xCD, 0x22, 0xC9, 0xA1, 0x29, 0x94, 0xBE, 0x76, 0x54, 0xD8, 0x0A, 0xF1,
+0xB9, 0xB1, 0x38, 0x47, 0xD6, 0x99, 0x84, 0x75, 0xFD, 0xCC, 0x60, 0x87, 0x7A, 0x54, 0x8C, 0x58,
+0x28, 0x7E, 0x71, 0xD9, 0xA2, 0x82, 0x51, 0x5D, 0xA3, 0xCA, 0x57, 0x06, 0xF5, 0x8B, 0xBF, 0xFB,
+0x75, 0x65, 0x5F, 0x6E, 0xFD, 0xB9, 0x30, 0xB7, 0xD6, 0xE3, 0x33, 0x73, 0xD7, 0x65, 0xF3, 0x61,
+0x13, 0x99, 0x38, 0xB4, 0xA9, 0xAC, 0x51, 0xA9, 0x23, 0x29, 0xE4, 0x67, 0xAE, 0xC3, 0xE3, 0xA9,
+0x44, 0x9B, 0xDC, 0x66, 0x12, 0x8E, 0xBF, 0xB1, 0x34, 0x07, 0x81, 0x16, 0xB9, 0x66, 0xF9, 0xA4,
+0x7C, 0x28, 0x75, 0xB9, 0x42, 0x24, 0xFB, 0x9B, 0x48, 0x48, 0x4B, 0x91, 0x56, 0x85, 0xD1, 0xF2,
+0x3C, 0x46, 0x8E, 0x81, 0xF2, 0xBC, 0x4C, 0x33, 0xBD, 0x2C, 0xD7, 0x3C, 0x5C, 0x5F, 0x68, 0x1A,
+0xD0, 0x87, 0x44, 0xF9, 0xEF, 0x62, 0x8F, 0x0F, 0xC7, 0x84, 0x07, 0xE0, 0x84, 0xCA, 0x52, 0xB9,
+0x96, 0xE8, 0x80, 0x5F, 0x0E, 0x62, 0x34, 0x09, 0x91, 0xA6, 0xD5, 0xC8, 0x75, 0x37, 0x01, 0xF7,
+0x0B, 0xD6, 0x95, 0x9D, 0x8A, 0x28, 0x45, 0x3A, 0xA3, 0x3F, 0x74, 0xFF, 0x62, 0xF3, 0x30, 0x66,
+0x9A, 0xF7, 0x98, 0x53, 0x8C, 0xD1, 0x83, 0x34, 0x07, 0x4E, 0x86, 0x7A, 0xB7, 0xFC, 0xDE, 0x79,
+0xA2, 0x10, 0x65, 0x27, 0x50, 0xC3, 0x89, 0x03, 0xD5, 0x35, 0x9A, 0x56, 0xC5, 0x29, 0x1D, 0x26,
+0xB5, 0x72, 0xB4, 0x31, 0x01, 0x64, 0xAF, 0x0A, 0xFB, 0xA8, 0x9D, 0x34, 0x01, 0x84, 0xA5, 0xD6,
+0xCC, 0x83, 0xB9, 0xF0, 0x2E, 0x98, 0xB8, 0x1E, 0x84, 0x19, 0xB6, 0x1C, 0x29, 0x59, 0x0E, 0x1C,
+0x3A, 0x29, 0xB9, 0xF0, 0x16, 0xC2, 0x47, 0x8F, 0xCA, 0x0A, 0x15, 0x3C, 0xEE, 0xB7, 0xE5, 0x68,
+0xAB, 0xE4, 0xB9, 0xDB, 0x0B, 0xBF, 0xC0, 0x93, 0xA8, 0x33, 0x3E, 0x11, 0x2A, 0x3C, 0xD5, 0x44,
+0xFA, 0xB4, 0x5E, 0xC7, 0xBD, 0xA5, 0x02, 0x84, 0xA0, 0xD2, 0x55, 0x30, 0xA8, 0xA9, 0xAE, 0x14,
+0x5F, 0xAB, 0x19, 0x68, 0x7F, 0x09, 0x94, 0x99, 0x47, 0x1F, 0xBE, 0x1B, 0xEA, 0x4C, 0x83, 0x24,
+0x34, 0x7E, 0x1A, 0x26, 0x5B, 0xE6, 0x86, 0x63, 0xDE, 0xB4, 0x95, 0x50, 0x7A, 0x18, 0xE5, 0x2B,
+0xB7, 0x0C, 0x3C, 0xCC, 0x99, 0x6E, 0x85, 0x11, 0x99, 0x93, 0xD1, 0x2E, 0x55, 0x20, 0xD6, 0x18,
+0x4D, 0xD4, 0xB7, 0x28, 0x9E, 0xED, 0x88, 0x16, 0xA6, 0xAF, 0x22, 0x71, 0x63, 0xEE, 0x39, 0xAA,
+0x82, 0x9C, 0xA9, 0x3E, 0xF5, 0x36, 0xB1, 0x3F, 0x4C, 0xCF, 0x41, 0x42, 0x47, 0x55, 0x6E, 0x06,
+0x48, 0xD8, 0x83, 0x2B, 0x17, 0x9A, 0x52, 0xF8, 0x7D, 0xC5, 0x9F, 0x2B, 0xBE, 0x0C, 0xB3, 0x2D,
+0x9E, 0xAF, 0x6E, 0x60, 0x4A, 0x1C, 0x4B, 0x81, 0x09, 0xFB, 0x4A, 0x1C, 0x27, 0x43, 0xB5, 0x6A,
+0x82, 0xC9, 0x76, 0x3A, 0x7C, 0x20, 0xE7, 0x01, 0xB3, 0x95, 0xCB, 0x18, 0xB8, 0xB2, 0x40, 0xB0,
+0x4C, 0x74, 0x6D, 0xB3, 0x9F, 0x7C, 0xD9, 0x66, 0xA4, 0x2D, 0x23, 0x4D, 0x6B, 0xF1, 0xA2, 0xBF,
+0x1C, 0x7D, 0x9D, 0x82, 0x3C, 0x9F, 0x03, 0xC9, 0x75, 0xC7, 0xA8, 0x66, 0x62, 0xC4, 0x20, 0x95,
+0xA6, 0x29, 0x93, 0xCD, 0x23, 0x0F, 0xDE, 0x89, 0xF3, 0xD5, 0x33, 0x10, 0xAF, 0x1B, 0xF7, 0xBF,
+0xB3, 0xC0, 0xFB, 0x24, 0xAC, 0x17, 0x0C, 0xDA, 0x59, 0x81, 0xE3, 0x6A, 0xC0, 0xDF, 0xDE, 0xC8,
+0xA6, 0xEF, 0x37, 0x7F, 0xA7, 0x5F, 0x20, 0x71, 0x29, 0xC1, 0x78, 0xA1, 0xDB, 0x56, 0x9E, 0x44,
+0x44, 0x97, 0x82, 0xD4, 0x96, 0x83, 0xBC, 0x56, 0xCA, 0x98, 0x9B, 0x05, 0xAC, 0x1F, 0x44, 0x2A,
+0x17, 0xEE, 0x9F, 0x3E, 0x88, 0x1C, 0x9F, 0xC4, 0x6A, 0x20, 0x13, 0xCF, 0x69, 0x05, 0xC4, 0x0E,
+0x96, 0xAA, 0x23, 0x9E, 0x05, 0x10, 0x3F, 0x2A, 0x27, 0x94, 0x9A, 0x09, 0x55, 0xE3, 0x4D, 0x0D,
+0x54, 0xCE, 0x06, 0xA8, 0xC0, 0x53, 0x40, 0xF8, 0x66, 0xA0, 0xDD, 0xFB, 0x70, 0x5E, 0x1E, 0x7B,
+0x64, 0x89, 0x99, 0x84, 0xE5, 0x52, 0x81, 0x02, 0x95, 0x31, 0xAA, 0x20, 0x4E, 0x2D, 0xC6, 0xCB,
+0x08, 0xFD, 0x48, 0x7B, 0x4F, 0x25, 0x33, 0x90, 0x23, 0x19, 0xF8, 0x3A, 0x78, 0xDE, 0xC9, 0x13,
+0x72, 0x54, 0x4D, 0x5E, 0xB1, 0xE3, 0x41, 0xD1, 0x34, 0x77, 0x14, 0x51, 0x27, 0xA7, 0x71, 0x71,
+0xF5, 0x95, 0x58, 0x72, 0x54, 0x75, 0x60, 0x0C, 0x1F, 0x0C, 0x95, 0xAA, 0x3C, 0x0C, 0x5C, 0xDE,
+0xBC, 0xAB, 0x70, 0xB1, 0xA7, 0xCA, 0xB7, 0x8E, 0x90, 0x5D, 0xC6, 0xDB, 0xF1, 0x8B, 0x30, 0x15,
+0x7C, 0xE9, 0xA7, 0xAF, 0x20, 0x9A, 0xA9, 0xC3, 0x74, 0x83, 0x68, 0x31, 0xAD, 0xAA, 0x9F, 0xAC,
+0x7F, 0x25, 0xF3, 0x91, 0x61, 0x0A, 0xC8, 0x9E, 0x7B, 0x73, 0xC2, 0x22, 0x47, 0xF9, 0x64, 0x75,
+0xFF, 0x39, 0x20, 0x41, 0x58, 0x3F, 0xA0, 0x82, 0xF8, 0x1C, 0xB4, 0xCA, 0x85, 0x28, 0x23, 0xD6,
+0xD5, 0xD1, 0x6E, 0x0A, 0x70, 0xE1, 0x7E, 0xE1, 0x4F, 0x97, 0x43, 0xA9, 0x5C, 0x22, 0xFD, 0x4F,
+0xF6, 0x74, 0x0A, 0x37, 0xB2, 0x7F, 0x7D, 0xF6, 0x55, 0xF3, 0xDD, 0xDF, 0xAF, 0x93, 0x72, 0x40,
+0xD9, 0x25, 0x95, 0x78, 0x5B, 0x25, 0x91, 0x66, 0x07, 0x22, 0x51, 0x84, 0x01, 0x1B, 0x25, 0x00,
+0xCE, 0xBF, 0xD0, 0x75, 0xD2, 0x1A, 0xF8, 0xC2, 0xFE, 0xD8, 0xD0, 0x7A, 0xBB, 0x9E, 0x25, 0x78,
+0xF6, 0xF7, 0x18, 0x32, 0xE8, 0xF0, 0xB1, 0xA4, 0xD0, 0x4E, 0x01, 0x01, 0x44, 0xD0, 0xD0, 0xB5,
+0xF2, 0x1A, 0xD3, 0x9E, 0x89, 0xCA, 0x08, 0xB8, 0xA1, 0xAD, 0x98, 0x52, 0x69, 0xBE, 0xF6, 0xC4,
+0x7C, 0x53, 0x5F, 0x9E, 0x3A, 0x82, 0x3F, 0x1C, 0xB8, 0xD3, 0xEC, 0x48, 0x92, 0x76, 0xD6, 0x91,
+0x3B, 0xDF, 0xA6, 0x87, 0xD2, 0x7E, 0xC7, 0x9B, 0x3C, 0x1E, 0x96, 0x24, 0x69, 0x0C, 0x32, 0xA0,
+0xB9, 0x94, 0xBE, 0x71, 0x24, 0x6B, 0x24, 0x45, 0x89, 0x26, 0x0A, 0x33, 0x13, 0x61, 0x3E, 0xA5,
+0x7F, 0x1A, 0x49, 0xD1, 0x45, 0xAC, 0xCB, 0x80, 0x06, 0x92, 0xC2, 0x44, 0xDA, 0x0B, 0xD7, 0x67,
+0x90, 0x44, 0x09, 0x08, 0x16, 0x15, 0xB4, 0xDE, 0x94, 0x60, 0x9A, 0x48, 0xDB, 0x60, 0xBE, 0x65,
+0x7B, 0x6D, 0x4C, 0x51, 0x82, 0xCF, 0xA7, 0x61, 0x0A, 0x66, 0xBB, 0xC5, 0x50, 0x3B, 0x2A, 0x41,
+0xF0, 0x48, 0xCA, 0xAA, 0xF3, 0xC7, 0x49, 0x5B, 0x03, 0x15, 0x88, 0x28, 0x26, 0xB0, 0xCD, 0xDD,
+0xF0, 0x37, 0x7C, 0xEF, 0x5C, 0x87, 0x98, 0x63, 0x67, 0x81, 0x18, 0xD2, 0x3C, 0x4B, 0x32, 0x39,
+0xD0, 0x76, 0xF8, 0xD2, 0xD5, 0x8A, 0x14, 0x21, 0xC7, 0x91, 0xA4, 0xB8, 0x1D, 0x0A, 0x33, 0xCD,
+0x99, 0xAD, 0xF0, 0xB7, 0x63, 0x91, 0x74, 0x12, 0x3F, 0x56, 0x90, 0x28, 0x87, 0x9A, 0xC6, 0x07,
+0x5A, 0x2D, 0x1E, 0xA6, 0x54, 0x28, 0xAE, 0xC2, 0xDF, 0x88, 0xA4, 0xAE, 0x85, 0x11, 0xAC, 0x18,
+0x6B, 0x54, 0x3B, 0x98, 0x82, 0x24, 0xAA, 0x7C, 0xC5, 0x63, 0xCC, 0xFB, 0xFD, 0x71, 0x10, 0x31,
+0xA6, 0xE8, 0xA0, 0x3F, 0xDD, 0x31, 0x54, 0xBC, 0xE8, 0xE8, 0x00, 0xD9, 0x06, 0x59, 0xE1, 0xF6,
+0x74, 0x94, 0xE7, 0x03, 0x9C, 0x6A, 0x13, 0x5F, 0xFA, 0x77, 0xE1, 0xC1, 0x49, 0xD2, 0x31, 0x1E,
+0xF7, 0x2A, 0x56, 0xCB, 0xA0, 0x6A, 0xC2, 0x54, 0x26, 0xBF, 0x7C, 0x71, 0x9D, 0x79, 0x1B, 0xCE,
+0xF2, 0x07, 0x90, 0x98, 0xB8, 0x14, 0xC9, 0xB5, 0xFF, 0xEB, 0x7F, 0xFB, 0x4B, 0x33, 0x07, 0x65,
+0xC6, 0xD8, 0x87, 0x13, 0x68, 0xFF, 0x1C, 0xA2, 0x44, 0x8F, 0x30, 0x0D, 0x08, 0xEE, 0x39, 0xB4,
+0x48, 0x90, 0xD8, 0x30, 0x29, 0x73, 0x65, 0x65, 0xB9, 0x98, 0x90, 0x8B, 0x60, 0x42, 0x7E, 0xEB,
+0x9D, 0xBD, 0xE6, 0xE3, 0x9F, 0xFE, 0x5F, 0x92, 0x99, 0xE1, 0x63, 0xF0, 0x5B, 0xFB, 0xC2, 0x67,
+0xDF, 0x2F, 0xE4, 0x92, 0x13, 0xFD, 0x0D, 0xCF, 0x22, 0xC5, 0x05, 0x93, 0x19, 0x4B, 0xDF, 0xB0,
+0xEF, 0x09, 0xE8, 0x7F, 0x5F, 0x7D, 0xE3, 0x76, 0x3C, 0xD6, 0xED, 0x30, 0x03, 0x33, 0xE1, 0x3E,
+0xFB, 0x51, 0x86, 0x99, 0xA6, 0xE5, 0xDE, 0x4C, 0x82, 0xDC, 0x86, 0x04, 0xE1, 0x30, 0x92, 0xF4,
+0x9F, 0xC7, 0x33, 0x90, 0x0A, 0x22, 0xD3, 0x9B, 0xCC, 0x9E, 0x51, 0xDF, 0x27, 0x19, 0x64, 0x1A,
+0x0E, 0xE2, 0x70, 0x94, 0xDB, 0x9D, 0x45, 0xDD, 0x5E, 0xF4, 0x95, 0xC4, 0x8C, 0x41, 0x01, 0x75,
+0x38, 0x3F, 0x45, 0xD8, 0x6F, 0x3E, 0x08, 0x5F, 0x15, 0xCE, 0x07, 0x2B, 0x57, 0xF4, 0x46, 0xD2,
+0xD8, 0x4F, 0xA6, 0xF3, 0xE0, 0x79, 0x24, 0x5E, 0xBC, 0x5F, 0xDC, 0x86, 0xC0, 0x00, 0x2A, 0xA7,
+0xFD, 0xF5, 0x95, 0xC7, 0x4E, 0x62, 0xC7, 0xF3, 0x7F, 0x12, 0x51, 0xAB, 0x4C, 0x41, 0x33, 0x17,
+0xE6, 0x4C, 0x1E, 0x43, 0xFC, 0x44, 0x42, 0xC6, 0xC8, 0x5D, 0xA6, 0x15, 0xE1, 0xC4, 0x17, 0x05,
+0x2A, 0x65, 0x3C, 0xC7, 0xFD, 0x4D, 0x3C, 0x46, 0xE2, 0xC2, 0x04, 0xC4, 0x8C, 0x8E, 0x3D, 0x83,
+0x71, 0x49, 0x32, 0x79, 0x06, 0x69, 0xD2, 0x68, 0x42, 0x27, 0xBE, 0x15, 0xE8, 0x27, 0xC7, 0x66,
+0x0D, 0x5E, 0x48, 0x58, 0x72, 0xAE, 0x7F, 0x9D, 0x34, 0x76, 0xAF, 0x62, 0x5D, 0xC1, 0xFD, 0xFA,
+0x28, 0xF2, 0x34, 0xB2, 0xFD, 0xA3, 0x18, 0x43, 0x3C, 0xFF, 0x3C, 0xBE, 0xF2, 0xB2, 0x42, 0x31,
+0x01, 0x33, 0xC9, 0x36, 0x5F, 0x78, 0xE8, 0x2F, 0xCA, 0x73, 0x14, 0x9C, 0x6B, 0xA8, 0xDB, 0xC4,
+0x99, 0x2F, 0x27, 0x7D, 0x11, 0xF8, 0xFE, 0xFA, 0x39, 0x98, 0xDF, 0x47, 0x3D, 0xB1, 0x1B, 0x4C,
+0x67, 0x74, 0xDD, 0xB1, 0x8D, 0xC0, 0x79, 0x5C, 0x98, 0x3F, 0xFA, 0xE3, 0x66, 0xF3, 0xF5, 0x97,
+0xDE, 0x44, 0x34, 0x34, 0x52, 0x47, 0xE0, 0xA1, 0x28, 0x95, 0x20, 0x85, 0xAC, 0xE0, 0x66, 0x2A,
+0xCA, 0x1C, 0x64, 0x7D, 0x21, 0x37, 0x54, 0xF2, 0x5C, 0xE4, 0x28, 0x73, 0x05, 0xB9, 0x07, 0xB5,
+0x77, 0x13, 0x67, 0x80, 0x49, 0xC6, 0x0D, 0xBB, 0x5C, 0x48, 0x0B, 0x9E, 0x60, 0xF2, 0xE8, 0xE5,
+0xB6, 0x2C, 0x97, 0xE5, 0xA1, 0xC2, 0xF7, 0x4C, 0x54, 0x9C, 0xE8, 0xC6, 0x5C, 0x8E, 0x8B, 0xF3,
+0xAB, 0x9F, 0x7A, 0xC2, 0x3C, 0xB4, 0x68, 0x66, 0x4A, 0xCA, 0x89, 0xB5, 0xE0, 0x2D, 0xFC, 0xBF,
+0x7F, 0xFB, 0x39, 0xF3, 0xEA, 0xB6, 0xDD, 0x92, 0x5E, 0x61, 0x5C, 0x71, 0x05, 0xCC, 0x15, 0xD9,
+0x4E, 0x45, 0x74, 0xC4, 0x2E, 0xE0, 0x17, 0x51, 0x85, 0xD2, 0x61, 0x22, 0x8B, 0xAC, 0x16, 0x17,
+0x38, 0xC7, 0x0B, 0xA1, 0x73, 0x90, 0x45, 0x3E, 0xC4, 0x27, 0x9B, 0x90, 0x4D, 0xE9, 0xD0, 0x6E,
+0x59, 0xA4, 0x23, 0x76, 0xF8, 0x9C, 0x57, 0x68, 0xAE, 0x81, 0x60, 0x5E, 0xBE, 0xC1, 0xDA, 0xB0,
+0x79, 0xE6, 0xA9, 0xDB, 0xEB, 0xCD, 0xDF, 0xAF, 0x9C, 0x2E, 0x75, 0x62, 0xC7, 0x8A, 0x5A, 0x37,
+0xB6, 0xAF, 0x02, 0x7B, 0xF4, 0xCC, 0x33, 0xC7, 0xBC, 0x79, 0xCC, 0xBD, 0x57, 0x02, 0x93, 0xE9,
+0x78, 0xA8, 0x77, 0x43, 0x89, 0x5F, 0xA2, 0x2F, 0xE0, 0x01, 0x10, 0x50, 0x12, 0xC8, 0x26, 0xA8,
+0x7F, 0x34, 0x13, 0x0F, 0x65, 0xA2, 0x8A, 0xD3, 0x7A, 0x0A, 0xC4, 0x0E, 0xAA, 0x15, 0x4D, 0x4E,
+0x24, 0x45, 0x4C, 0x1C, 0x3B, 0x5C, 0x91, 0xD3, 0x7C, 0x58, 0xB7, 0x21, 0xC5, 0x09, 0x4B, 0x99,
+0x09, 0xB1, 0x03, 0x19, 0x68, 0x80, 0xAA, 0x96, 0xD8, 0xB9, 0x3F, 0xB6, 0x27, 0x24, 0x11, 0x3F,
+0x43, 0xEA, 0x95, 0x55, 0x08, 0x86, 0x58, 0xF5, 0xFB, 0x0D, 0x26, 0xBF, 0x30, 0xC7, 0xFC, 0xE3,
+0x97, 0xFE, 0xB3, 0xA4, 0xAE, 0xA0, 0x19, 0x96, 0x44, 0xEC, 0x32, 0xC8, 0x0A, 0x8B, 0xDD, 0x93,
+0xB4, 0x08, 0xB1, 0x03, 0x61, 0x64, 0xDE, 0x3D, 0xAF, 0x10, 0x71, 0xF9, 0x4B, 0x48, 0x5F, 0xF1,
+0xC5, 0xBF, 0xFF, 0xBA, 0xBC, 0x74, 0xFD, 0x97, 0xCF, 0x3F, 0x69, 0x3E, 0xF1, 0xD1, 0x07, 0x24,
+0x05, 0xCA, 0x58, 0x9B, 0x48, 0xAE, 0x98, 0xD4, 0x99, 0xCA, 0x23, 0x71, 0x24, 0xF1, 0xCE, 0x0B,
+0x4A, 0xBD, 0x8D, 0xB5, 0xDE, 0xF4, 0x7F, 0xBC, 0x7C, 0x09, 0x39, 0x89, 0xB1, 0xC9, 0xDC, 0x8A,
+0x24, 0x76, 0x35, 0x50, 0xCC, 0xC4, 0xFC, 0x3E, 0x00, 0x92, 0xD8, 0x7F, 0xEB, 0x56, 0x6C, 0x62,
+0xBA, 0x93, 0xB3, 0x20, 0xCC, 0x52, 0x82, 0x0C, 0x2F, 0x05, 0x0C, 0xD2, 0xE1, 0x3C, 0x10, 0xB2,
+0x3B, 0x90, 0x7D, 0x0C, 0x75, 0x9D, 0xFE, 0xE9, 0xF0, 0x50, 0xF7, 0x30, 0x88, 0xED, 0x7D, 0xE4,
+0x8F, 0x3E, 0x40, 0x06, 0x01, 0x5A, 0x1A, 0xAD, 0xCA, 0xBC, 0x85, 0xAD, 0x2C, 0xF9, 0x43, 0xB2,
+0x25, 0x44, 0xCC, 0x32, 0x14, 0x89, 0xE8, 0x0C, 0x66, 0xEB, 0x37, 0x17, 0x56, 0x58, 0xB0, 0xFE,
+0x63, 0xD6, 0xAF, 0xCE, 0xEB, 0x31, 0xDC, 0x92, 0x64, 0xD0, 0xFA, 0x98, 0x59, 0xA6, 0x64, 0xD7,
+0x09, 0x82, 0x0E, 0x22, 0x9F, 0xAD, 0x63, 0x72, 0x16, 0x52, 0xBA, 0x20, 0x5B, 0x3D, 0x6E, 0xEE,
+0x39, 0x29, 0xF2, 0x27, 0xE3, 0x0D, 0xF7, 0x30, 0xD4, 0x68, 0x09, 0x9C, 0x00, 0xA1, 0x23, 0xF9,
+0xB4, 0xFD, 0xB2, 0xC7, 0x1E, 0xE4, 0x2F, 0x09, 0x68, 0x2B, 0xE9, 0x1F, 0x17, 0x87, 0x51, 0xD1,
+0x41, 0x90, 0x88, 0x5B, 0xE6, 0x1F, 0xD7, 0x81, 0xE0, 0x44, 0xA5, 0x32, 0xB2, 0x7E, 0x70, 0x8D,
+0x09, 0x39, 0xF6, 0xB8, 0x11, 0x17, 0x8B, 0x11, 0x53, 0x9D, 0x48, 0xC5, 0x16, 0x98, 0xA6, 0xCB,
+0x70, 0x48, 0xF3, 0x27, 0x16, 0x9B, 0xC2, 0x5E, 0xF2, 0xA4, 0xA5, 0xD1, 0xD0, 0x1B, 0x75, 0x5D,
+0xA1, 0x1A, 0x48, 0x45, 0xAD, 0x1A, 0xBE, 0x74, 0xA2, 0xD0, 0x0D, 0xF1, 0x4E, 0x4D, 0x5F, 0x3E,
+0x9A, 0x87, 0x19, 0x51, 0xDB, 0x57, 0x24, 0xEC, 0x40, 0x81, 0xA0, 0x79, 0x8A, 0xAA, 0x0D, 0xC9,
+0x16, 0x49, 0x1D, 0x55, 0xBB, 0xE1, 0x22, 0x75, 0x3C, 0x06, 0xFA, 0x71, 0x91, 0x28, 0x52, 0xE5,
+0xA0, 0x8F, 0x1F, 0x95, 0x16, 0xD6, 0x45, 0x1D, 0xC8, 0x44, 0x73, 0xEC, 0x22, 0x44, 0xF3, 0x73,
+0x2E, 0x2C, 0x2C, 0x40, 0xB0, 0xCB, 0x0D, 0xB3, 0x06, 0x96, 0x00, 0x2A, 0x56, 0xB6, 0x6D, 0x58,
+0x25, 0xA0, 0xA8, 0xB0, 0x4D, 0x9A, 0x14, 0xEB, 0x60, 0x5E, 0xA4, 0xE2, 0x17, 0x7D, 0x28, 0xFB,
+0x5A, 0xB4, 0x97, 0x61, 0xBA, 0x65, 0x1E, 0xD0, 0x46, 0xA8, 0x30, 0x2C, 0x61, 0x35, 0x16, 0x27,
+0x12, 0x57, 0x92, 0x56, 0xA6, 0x7E, 0xA9, 0x61, 0x60, 0x18, 0x72, 0x74, 0xA6, 0xF3, 0x33, 0x96,
+0xE7, 0x91, 0xC9, 0x81, 0xA7, 0xE0, 0x9C, 0x31, 0x20, 0x84, 0x09, 0x97, 0x07, 0xE5, 0x17, 0xD8,
+0xCF, 0x49, 0x66, 0xFB, 0x15, 0x30, 0xFD, 0x72, 0xEC, 0x53, 0xDD, 0xE5, 0xBE, 0xA8, 0x42, 0xF6,
+0x9E, 0x26, 0x26, 0xF5, 0xA3, 0x66, 0x88, 0xB7, 0x8B, 0xD4, 0x1F, 0xB0, 0xEE, 0x31, 0x7D, 0x11,
+0xE8, 0xE4, 0x9B, 0x16, 0x89, 0x1D, 0x53, 0x7F, 0x88, 0x28, 0xE5, 0x08, 0x8C, 0xA5, 0x69, 0x9E,
+0x9F, 0x85, 0xF9, 0xDA, 0x3C, 0x39, 0xB3, 0x94, 0x24, 0x86, 0xB3, 0x59, 0x94, 0xA2, 0x5E, 0x06,
+0x9E, 0xBC, 0x38, 0x02, 0x63, 0xB7, 0x90, 0x46, 0x49, 0xEC, 0x68, 0x8A, 0xA8, 0xC1, 0xC5, 0x3A,
+0x1E, 0x7E, 0x2B, 0x03, 0x91, 0xFF, 0x87, 0x7A, 0x16, 0x98, 0x88, 0xF5, 0x24, 0xA4, 0xFD, 0xB3,
+0xF0, 0x41, 0x62, 0x56, 0xB1, 0x0C, 0x26, 0xDF, 0xB6, 0x5A, 0x9B, 0xF3, 0x1F, 0xEC, 0x7B, 0x0F,
+0x41, 0x65, 0x0D, 0xE9, 0x42, 0x84, 0xB0, 0xC6, 0x6D, 0x26, 0x14, 0xD7, 0xA9, 0x78, 0x21, 0x26,
+0x8E, 0xF8, 0x7A, 0x88, 0x22, 0x38, 0x4A, 0xD4, 0x1B, 0xF0, 0xCF, 0x86, 0x29, 0x78, 0x3C, 0x08,
+0x5D, 0x23, 0x2B, 0x4E, 0xF8, 0x0A, 0x20, 0x43, 0xED, 0xB4, 0x6E, 0x3F, 0x60, 0x04, 0x38, 0x26,
+0x19, 0xFC, 0x41, 0x7F, 0x3F, 0x9A, 0x89, 0x87, 0xA6, 0xAF, 0xD9, 0x31, 0x4E, 0x53, 0x30, 0x7D,
+0xEE, 0x86, 0x28, 0xD6, 0x49, 0x1F, 0x78, 0x8D, 0xD0, 0xAC, 0x44, 0x9F, 0xA1, 0x62, 0x28, 0xDD,
+0xFD, 0xF9, 0x42, 0x0D, 0xB8, 0xE3, 0x6E, 0x45, 0xF1, 0xB9, 0x03, 0x79, 0xA4, 0xD2, 0xC2, 0x88,
+0x59, 0xEE, 0x63, 0xA0, 0x8A, 0x0B, 0x55, 0xBD, 0xDB, 0xA6, 0x54, 0x4B, 0x14, 0x6F, 0x19, 0x7C,
+0xAD, 0x98, 0xB2, 0xE6, 0xBD, 0xE6, 0x16, 0x31, 0x9B, 0xFA, 0x1A, 0xB4, 0x74, 0x31, 0x61, 0x9B,
+0x3C, 0x7E, 0xFA, 0x5B, 0xD1, 0xB9, 0xDE, 0x93, 0x1D, 0x9A, 0xDD, 0x58, 0x59, 0xA3, 0x19, 0xF5,
+0x68, 0x59, 0x05, 0x27, 0xBF, 0xD0, 0x2A, 0x92, 0x03, 0x71, 0xB6, 0x1F, 0x6C, 0x3F, 0x53, 0xB1,
+0xBE, 0x2F, 0xB1, 0x46, 0x1C, 0x69, 0x32, 0x1C, 0x2D, 0xAA, 0x52, 0xB2, 0xFA, 0xCE, 0xF3, 0xC8,
+0x73, 0xC5, 0xF3, 0xCA, 0xF1, 0xC3, 0x71, 0xD4, 0x8B, 0x67, 0xC5, 0x4D, 0x1D, 0x02, 0x5F, 0x60,
+0xFC, 0xD8, 0x97, 0xB1, 0x03, 0xF5, 0x93, 0x66, 0xE6, 0xD1, 0x44, 0x96, 0x95, 0xD8, 0xDD, 0xD4,
+0xA9, 0xD5, 0x8D, 0x92, 0x81, 0x00, 0x25, 0x6E, 0x92, 0x9D, 0xEB, 0xAE, 0xB6, 0xAE, 0xE4, 0xEE,
+0xF3, 0xF9, 0xDC, 0x1C, 0xE1, 0xB1, 0x84, 0x26, 0xB6, 0x16, 0x6A, 0x40, 0x00, 0x5D, 0x24, 0xA8,
+0x55, 0xF0, 0x84, 0xD1, 0x58, 0x72, 0x27, 0x04, 0x91, 0x76, 0x5C, 0xE7, 0x9F, 0x16, 0x51, 0xB0,
+0x32, 0x59, 0x23, 0x16, 0xFF, 0x78, 0xF1, 0x33, 0x02, 0x38, 0xAF, 0x97, 0xF0, 0xF7, 0xE1, 0xEE,
+0x2F, 0x0B, 0xA4, 0xEF, 0x61, 0x0D, 0x64, 0xF4, 0x99, 0x0F, 0xC9, 0x4C, 0x44, 0xE4, 0x5A, 0x2E,
+0x6A, 0x95, 0xBA, 0x44, 0x2A, 0x9B, 0xED, 0x8A, 0x8F, 0x76, 0x75, 0xA9, 0x12, 0x18, 0xD9, 0x2A,
+0x39, 0xEA, 0x7C, 0xEA, 0x84, 0x9E, 0xDB, 0xCA, 0x6F, 0x81, 0xAA, 0x19, 0x2A, 0x97, 0x41, 0x30,
+0x8A, 0x0D, 0x21, 0xB6, 0xBE, 0x79, 0x24, 0xBA, 0x30, 0x80, 0x93, 0x04, 0x8C, 0x47, 0x52, 0xE2,
+0x72, 0x98, 0xB1, 0x18, 0xBD, 0x37, 0x9A, 0x6E, 0x5A, 0xC3, 0x7D, 0x2E, 0xB4, 0xBD, 0xF4, 0x42,
+0x80, 0xC9, 0xDB, 0x99, 0x5C, 0xB9, 0x1A, 0x8A, 0xDC, 0x84, 0x9A, 0x09, 0x72, 0x7D, 0xD3, 0xAF,
+0xEE, 0x0D, 0xA4, 0x4C, 0xA1, 0x1F, 0x56, 0x7F, 0x13, 0x95, 0xF4, 0x83, 0x07, 0x4F, 0x98, 0x7D,
+0xBB, 0x5B, 0xA4, 0xDC, 0x58, 0x11, 0x5E, 0xF8, 0x2A, 0xE1, 0x23, 0xC5, 0x1C, 0x97, 0x3A, 0x29,
+0x02, 0x63, 0x01, 0x01, 0x25, 0x76, 0x63, 0xE1, 0x2C, 0xDD, 0x02, 0xC7, 0x48, 0xC2, 0xD2, 0x0E,
+0x27, 0xE1, 0x73, 0xC8, 0x20, 0x1E, 0x24, 0xA3, 0xB6, 0xB4, 0x2C, 0x9C, 0x45, 0x74, 0xB3, 0x24,
+0xC4, 0x5A, 0x57, 0x9D, 0x52, 0x25, 0x9F, 0x1D, 0x87, 0x8B, 0x60, 0x15, 0xE6, 0x73, 0x8B, 0x2A,
+0x77, 0x21, 0x39, 0xE2, 0xF6, 0x99, 0x24, 0x4A, 0xD8, 0x86, 0x6F, 0x5C, 0xD3, 0x51, 0x34, 0x3C,
+0x3F, 0x45, 0x37, 0x6F, 0x12, 0xBB, 0xDD, 0x24, 0x76, 0x30, 0x7B, 0xF2, 0x41, 0x94, 0xC1, 0xD9,
+0x32, 0x3B, 0x47, 0xC2, 0xAC, 0xC9, 0x35, 0x76, 0xB6, 0xC7, 0x6E, 0x09, 0x6B, 0x38, 0xC5, 0x60,
+0x24, 0xCA, 0x65, 0x18, 0x14, 0x11, 0xA8, 0x96, 0x01, 0xD9, 0x75, 0xB8, 0x09, 0x4B, 0x74, 0x38,
+0xBA, 0xFD, 0xD2, 0x6F, 0x91, 0xCE, 0xF6, 0xAC, 0xEC, 0x59, 0x5F, 0x96, 0x6F, 0x6E, 0xAB, 0x28,
+0x32, 0x25, 0x48, 0x8B, 0x30, 0x9C, 0x26, 0xB6, 0x5B, 0x60, 0x28, 0x6B, 0x17, 0x47, 0x18, 0x01,
+0x2A, 0x54, 0x54, 0x6C, 0x68, 0x6A, 0x9D, 0x8F, 0xEC, 0xFF, 0x4C, 0xED, 0xD1, 0x86, 0xC4, 0xB2,
+0x9B, 0x51, 0x5F, 0x96, 0x35, 0x43, 0xE9, 0x3F, 0xD7, 0xDB, 0x74, 0x0D, 0x11, 0xB3, 0x2D, 0xC8,
+0x53, 0xB6, 0x65, 0xEB, 0x4E, 0xC9, 0x4B, 0x96, 0x83, 0xE0, 0x9A, 0x99, 0x08, 0x54, 0xA0, 0x0F,
+0x5E, 0xBA, 0x2B, 0x5D, 0x23, 0x7C, 0xDA, 0x74, 0xF7, 0xC3, 0x88, 0xC0, 0xA8, 0x22, 0x76, 0x83,
+0x49, 0xD8, 0x38, 0x8C, 0x18, 0x68, 0x53, 0xA3, 0x00, 0x01, 0x96, 0x61, 0xBA, 0x08, 0x52, 0x47,
+0x72, 0xE7, 0xCD, 0x87, 0x96, 0xBB, 0x59, 0xF3, 0x24, 0xFF, 0x75, 0x8B, 0xE2, 0x66, 0x03, 0x07,
+0xBC, 0x4F, 0x1D, 0xBF, 0x87, 0x39, 0xEA, 0x2C, 0xC5, 0xB1, 0x66, 0x59, 0xE7, 0xAB, 0xE6, 0x3E,
+0xDB, 0xD0, 0x09, 0xB7, 0x9D, 0xF8, 0xDE, 0xF9, 0xA4, 0xCE, 0x76, 0x3D, 0x9A, 0x62, 0x67, 0x20,
+0x6D, 0x43, 0x3E, 0xEB, 0x5A, 0xA6, 0x60, 0x6A, 0x83, 0x09, 0x76, 0x17, 0x88, 0x5D, 0x37, 0x9C,
+0xDA, 0x99, 0xB3, 0x8F, 0x74, 0xCA, 0x4E, 0xE2, 0x45, 0x17, 0x28, 0x70, 0xD1, 0x44, 0xA6, 0x22,
+0xA8, 0x39, 0x65, 0xCE, 0xF2, 0x3B, 0x4F, 0xE2, 0xC2, 0xFE, 0x76, 0x4B, 0x95, 0x0D, 0x97, 0x0E,
+0xC6, 0x93, 0x40, 0xAF, 0x02, 0x7A, 0xBF, 0x3D, 0x91, 0xEA, 0xB8, 0x1B, 0xAF, 0xDE, 0xB9, 0x14,
+0xC6, 0xAC, 0x11, 0x0B, 0x3F, 0xC7, 0x5C, 0x84, 0x72, 0x2C, 0x98, 0x84, 0x02, 0xEA, 0xB5, 0xE3,
+0x11, 0x29, 0x0C, 0x9F, 0xBB, 0x38, 0x22, 0x99, 0x02, 0x78, 0x74, 0x17, 0x8A, 0xC0, 0x90, 0x11,
+0x60, 0xCE, 0xBD, 0x87, 0x56, 0x2C, 0x92, 0x08, 0x77, 0x12, 0xB6, 0x6D, 0xDB, 0xF6, 0x9A, 0x17,
+0x5E, 0x7E, 0x53, 0x6A, 0x7B, 0xD2, 0x1A, 0x90, 0x68, 0xBA, 0x82, 0x9A, 0xB8, 0x2C, 0x0B, 0xF5,
+0xF2, 0x2B, 0x1B, 0xCC, 0x25, 0x7C, 0x2E, 0x05, 0x29, 0x7C, 0x08, 0x55, 0x04, 0x18, 0xBD, 0xAA,
+0x93, 0x22, 0x30, 0x56, 0x10, 0x18, 0x55, 0xC4, 0x6E, 0xAC, 0x80, 0xA6, 0xC7, 0x39, 0xFC, 0x08,
+0x48, 0xA4, 0x11, 0xD2, 0x0A, 0xD0, 0xF7, 0x8C, 0xF7, 0x5C, 0xB9, 0xF1, 0x7A, 0x95, 0xC9, 0xED,
+0xCE, 0x79, 0xC5, 0x39, 0x0B, 0xAB, 0x23, 0x27, 0x96, 0xFD, 0xC5, 0xBA, 0xD3, 0xF9, 0x65, 0x42,
+0xF3, 0xC2, 0x39, 0xF6, 0xA8, 0x1D, 0xD1, 0x23, 0xD9, 0x03, 0x61, 0x2A, 0x83, 0xF3, 0xEB, 0x44,
+0x98, 0x5C, 0x06, 0x92, 0x9B, 0x69, 0x28, 0xBD, 0x97, 0x92, 0x69, 0x78, 0x60, 0x9C, 0x41, 0x84,
+0x1A, 0xFB, 0x2B, 0x11, 0xAD, 0x54, 0xEB, 0x22, 0x57, 0x62, 0xFC, 0x23, 0xC7, 0x7F, 0xEF, 0xA1,
+0x5E, 0x06, 0x0F, 0xA7, 0x58, 0xCD, 0x2E, 0xF4, 0xB9, 0xF3, 0xD8, 0xD8, 0x16, 0x7A, 0x3C, 0xCA,
+0xBC, 0xF8, 0xE7, 0x7E, 0x60, 0x7D, 0x5E, 0x46, 0x23, 0xD2, 0xA7, 0x6B, 0x56, 0x75, 0x99, 0x99,
+0x55, 0x53, 0x86, 0xD4, 0x37, 0x03, 0x73, 0x58, 0x1F, 0x0A, 0x26, 0xBA, 0xAD, 0x22, 0x90, 0x0C,
+0x04, 0xE8, 0x43, 0x37, 0x17, 0xF9, 0xE8, 0x6E, 0x9F, 0x37, 0x55, 0x72, 0xE4, 0x1D, 0x83, 0x39,
+0xF6, 0x4D, 0x54, 0x09, 0x78, 0x1D, 0x15, 0x09, 0x98, 0xCA, 0x84, 0x79, 0xEE, 0x98, 0x16, 0xE3,
+0xC4, 0xC9, 0xB3, 0x92, 0x0E, 0xE4, 0xBD, 0x9D, 0x87, 0xC4, 0x5C, 0xBB, 0x06, 0xD5, 0x0A, 0x9A,
+0x51, 0x1E, 0x8D, 0x97, 0xC5, 0x8C, 0xA6, 0x5A, 0x73, 0xFB, 0xDC, 0xC6, 0x31, 0xEB, 0x5F, 0x97,
+0x0C, 0x5C, 0xB5, 0xCD, 0xD1, 0x8F, 0xC0, 0xA8, 0x49, 0x50, 0x1C, 0xCD, 0x5D, 0x37, 0xFA, 0x61,
+0xD3, 0x23, 0x1C, 0x6E, 0x04, 0xCE, 0x43, 0xAD, 0xFB, 0xD5, 0xFA, 0xED, 0xE6, 0x9D, 0x83, 0xC7,
+0x91, 0x92, 0xA1, 0x5B, 0xD2, 0x32, 0x50, 0xAD, 0x23, 0xE1, 0x09, 0xCD, 0xAF, 0x8C, 0xF0, 0xC4,
+0x9E, 0x33, 0x69, 0x43, 0xB4, 0x19, 0xEF, 0xAD, 0x39, 0x51, 0xE4, 0x27, 0x7B, 0x48, 0xA2, 0x62,
+0xF1, 0xAB, 0x55, 0xBD, 0x84, 0xF3, 0x71, 0xFD, 0xC0, 0xD0, 0xC9, 0x0D, 0x40, 0xA6, 0xF0, 0x03,
+0x29, 0x0B, 0x13, 0xA2, 0x64, 0xC3, 0x91, 0x7A, 0x09, 0x12, 0x76, 0x3E, 0x84, 0xEC, 0xF4, 0x2C,
+0x9F, 0x96, 0xCC, 0x89, 0x8A, 0x64, 0x33, 0x4C, 0x3D, 0x5B, 0x91, 0x7F, 0x6B, 0x3D, 0x7C, 0x78,
+0x58, 0xB7, 0x94, 0x91, 0xA8, 0xAC, 0x3C, 0x21, 0xC2, 0x9A, 0x28, 0x8C, 0xB1, 0x2C, 0x2C, 0x9E,
+0xD8, 0xF1, 0xF8, 0xAC, 0x7A, 0x67, 0x09, 0xAD, 0x55, 0x23, 0x7D, 0x20, 0xAD, 0x25, 0xAC, 0x42,
+0x18, 0x65, 0x21, 0x57, 0x64, 0x2D, 0xCD, 0x88, 0x03, 0xBE, 0xF8, 0x1B, 0x32, 0x21, 0x8C, 0x23,
+0x7B, 0xF8, 0x4A, 0x4F, 0xC3, 0x4E, 0xA9, 0x87, 0x89, 0x1C, 0x52, 0x70, 0x38, 0x7F, 0x6A, 0xC9,
+0x0C, 0xB3, 0xB0, 0x9E, 0xA6, 0x69, 0x24, 0x2A, 0x1E, 0x4E, 0xCF, 0xE3, 0x64, 0x82, 0xAB, 0x6D,
+0x2B, 0x02, 0x71, 0x08, 0xE4, 0x22, 0xFA, 0x95, 0xC9, 0x6A, 0xF7, 0xEC, 0x3B, 0x6A, 0xCE, 0xC0,
+0x7F, 0xB7, 0xF5, 0xE4, 0x79, 0xF3, 0xF6, 0x5B, 0xBB, 0xCD, 0x0E, 0x5C, 0x7B, 0x47, 0x50, 0x8F,
+0xF6, 0x50, 0x4B, 0xAB, 0xD9, 0xB9, 0xE7, 0xB0, 0xD9, 0x84, 0x65, 0xBF, 0x79, 0x65, 0xA3, 0xF9,
+0xD1, 0x33, 0xAF, 0x9A, 0x2D, 0x28, 0x47, 0xD5, 0x01, 0xE5, 0x7A, 0x3A, 0xAA, 0x18, 0x7C, 0xEA,
+0xAF, 0x1E, 0x97, 0xF2, 0x68, 0x36, 0xB2, 0x72, 0xA8, 0x21, 0x2C, 0x7A, 0x7A, 0x14, 0x81, 0xD4,
+0x20, 0x30, 0x6A, 0xF2, 0xD8, 0x29, 0xB1, 0x4B, 0xCD, 0x09, 0x1F, 0xAD, 0x7B, 0x39, 0x80, 0x37,
+0xE7, 0x2F, 0x7C, 0xF3, 0x39, 0xB3, 0xE3, 0xF0, 0x49, 0x51, 0xEB, 0xAE, 0x40, 0xC1, 0x93, 0x4A,
+0x38, 0x01, 0xB1, 0x73, 0xF4, 0x45, 0xFC, 0xFB, 0x49, 0x5C, 0x2C, 0xB1, 0x73, 0x86, 0x4B, 0xF7,
+0xD7, 0xF9, 0xA0, 0xC9, 0x0F, 0x34, 0x49, 0x5A, 0xB2, 0x73, 0xC3, 0x95, 0xED, 0xF1, 0x44, 0x86,
+0xDB, 0x64, 0x83, 0xEC, 0x89, 0x16, 0x05, 0x02, 0xC9, 0x72, 0x75, 0xFF, 0xF0, 0xE1, 0x95, 0xE6,
+0x43, 0x4B, 0x6F, 0x37, 0xC5, 0x09, 0x92, 0x67, 0x0E, 0x27, 0x66, 0x27, 0x91, 0xD4, 0xF2, 0xE9,
+0xD7, 0xB6, 0x9A, 0x75, 0xA8, 0x83, 0xF9, 0xD6, 0xA1, 0xE3, 0xA6, 0x83, 0xB5, 0x71, 0x33, 0x40,
+0xEC, 0x68, 0x7E, 0x15, 0xD2, 0xEA, 0xD8, 0xAA, 0xE5, 0xA8, 0x32, 0xD9, 0x3E, 0xC6, 0x2A, 0x6E,
+0x96, 0xBA, 0x25, 0x9A, 0x2C, 0x89, 0x0B, 0x7E, 0x14, 0xEE, 0x17, 0x9F, 0xC5, 0x8E, 0x6D, 0x47,
+0x97, 0xA1, 0x46, 0x2F, 0x36, 0xB8, 0x8A, 0xA4, 0xC4, 0x45, 0x48, 0x85, 0xF0, 0xC9, 0x65, 0x73,
+0xCD, 0xDF, 0x3C, 0xB0, 0xC8, 0x34, 0x55, 0x97, 0xDB, 0x88, 0x5A, 0x7D, 0xA0, 0x0D, 0xE7, 0x10,
+0xD0, 0xB6, 0x52, 0x88, 0x00, 0xC7, 0xEF, 0x25, 0x04, 0x4C, 0xAC, 0x46, 0x4D, 0xCF, 0x7F, 0x41,
+0xB1, 0xF6, 0x75, 0xAF, 0x6F, 0x95, 0x1C, 0x81, 0xC5, 0xA5, 0xC5, 0xA6, 0x0C, 0x26, 0xDA, 0x3C,
+0xBC, 0xB8, 0x70, 0x7C, 0x33, 0xD5, 0xD2, 0x05, 0xBC, 0x5C, 0x9E, 0x83, 0x8A, 0xDE, 0x8D, 0xCA,
+0x17, 0x8D, 0xD3, 0xEB, 0xCC, 0x17, 0xFF, 0xEE, 0x83, 0xE6, 0x89, 0x47, 0xEF, 0x15, 0x5F, 0x3D,
+0xF5, 0xAF, 0x4B, 0xE1, 0x49, 0xD3, 0x5D, 0x0D, 0x19, 0x01, 0x35, 0xC5, 0x0E, 0x19, 0x42, 0x6D,
+0x60, 0xA8, 0x08, 0x30, 0xEB, 0x38, 0xEB, 0xA5, 0x9E, 0x82, 0x79, 0x92, 0x9F, 0x25, 0x1A, 0x36,
+0x08, 0x00, 0x70, 0x6A, 0x14, 0xC9, 0x8D, 0xA8, 0x53, 0x76, 0xF2, 0xA4, 0x27, 0x30, 0xCF, 0xBA,
+0x85, 0x9E, 0x04, 0x85, 0x81, 0x01, 0xA1, 0x19, 0xD2, 0x2A, 0x62, 0x96, 0x18, 0x52, 0xC4, 0xF3,
+0xD5, 0xFB, 0x0A, 0x90, 0x1E, 0xA1, 0x7E, 0xC2, 0x78, 0x93, 0x9B, 0x02, 0xB3, 0x23, 0x15, 0xBB,
+0xBD, 0xC8, 0xDE, 0xBF, 0x1F, 0x44, 0x96, 0x11, 0x77, 0x5E, 0x6F, 0x74, 0xBD, 0x72, 0xEA, 0x64,
+0x68, 0x34, 0xED, 0x91, 0xCE, 0x4E, 0xD8, 0xA9, 0xB7, 0xA1, 0x7A, 0x30, 0xFA, 0x38, 0x03, 0x56,
+0xD4, 0x0B, 0xA7, 0xC0, 0xEF, 0x4E, 0x00, 0x0B, 0x1A, 0x60, 0x5D, 0xD2, 0xEE, 0xEE, 0xEB, 0x92,
+0xB8, 0x76, 0x36, 0xB2, 0xFA, 0x97, 0x26, 0x99, 0xE0, 0x0E, 0x75, 0xCC, 0xE8, 0xF6, 0x8A, 0xC0,
+0x40, 0x10, 0x20, 0x69, 0x63, 0xDD, 0x59, 0x96, 0x21, 0x5B, 0xB9, 0x6C, 0xBE, 0x14, 0x68, 0x6F,
+0x40, 0xEE, 0x3A, 0xDE, 0x37, 0x58, 0x3D, 0x60, 0x0F, 0x2A, 0x1D, 0xEC, 0xDA, 0x77, 0xC4, 0x1C,
+0x80, 0x8A, 0x4E, 0x02, 0xC8, 0xEA, 0x11, 0x0B, 0x60, 0xBA, 0x65, 0xD1, 0xF7, 0x25, 0x77, 0xCF,
+0x45, 0x29, 0xB2, 0xF1, 0x4A, 0xEA, 0x06, 0x02, 0xB4, 0xAE, 0x33, 0xAA, 0x10, 0x18, 0x15, 0xC4,
+0x4E, 0x55, 0x81, 0x51, 0x35, 0x26, 0x52, 0x7E, 0x30, 0x9D, 0x70, 0x6C, 0x3E, 0x8A, 0xBC, 0x51,
+0xCC, 0x19, 0x45, 0xA2, 0xE3, 0x4B, 0xC7, 0x59, 0x53, 0x23, 0x83, 0x25, 0x38, 0x5B, 0xD3, 0xA3,
+0x0F, 0x9A, 0x88, 0x7E, 0xB6, 0x24, 0xD0, 0x06, 0x56, 0xD8, 0xD9, 0xB2, 0x40, 0x1F, 0x51, 0x1A,
+0x04, 0x5B, 0x44, 0xB6, 0x47, 0xE6, 0x38, 0xFB, 0x0F, 0xEB, 0x97, 0x22, 0xF1, 0x68, 0x55, 0x79,
+0xA1, 0x64, 0xA0, 0x4F, 0xE6, 0x44, 0xC2, 0xDA, 0xDE, 0xD1, 0x81, 0xA4, 0xC4, 0x28, 0x49, 0x73,
+0xFE, 0x82, 0x61, 0xBE, 0x2C, 0x1B, 0x0C, 0xE2, 0xCC, 0xAA, 0xA2, 0x30, 0x3A, 0x26, 0x46, 0xA5,
+0x4C, 0x7E, 0x60, 0xBF, 0xC2, 0xD9, 0x7F, 0x17, 0x11, 0xCD, 0x93, 0x34, 0x9B, 0xDB, 0xC5, 0xCE,
+0x3E, 0x49, 0xB3, 0x27, 0xC7, 0x71, 0xA9, 0x53, 0xFC, 0x36, 0x16, 0x3F, 0x4B, 0x93, 0xD9, 0x4C,
+0x17, 0x14, 0xBC, 0x6E, 0xD4, 0xCC, 0xCD, 0x47, 0x85, 0x83, 0x19, 0x20, 0x76, 0x25, 0x7D, 0xD4,
+0xAE, 0x4C, 0x26, 0x46, 0xDA, 0xB6, 0x22, 0x90, 0x0C, 0x04, 0x4A, 0x41, 0xEE, 0x3E, 0xF4, 0xC4,
+0x32, 0xF3, 0xB9, 0xCF, 0x3D, 0x69, 0x56, 0xAE, 0x5C, 0x64, 0x26, 0x21, 0xB1, 0x6C, 0x1E, 0xCC,
+0xAB, 0x59, 0x08, 0x8E, 0xE0, 0x3C, 0x0E, 0x51, 0xB4, 0xE5, 0x15, 0x65, 0x66, 0xD1, 0xE2, 0x19,
+0xE6, 0x13, 0x1F, 0x7F, 0xC4, 0x7C, 0xE6, 0x93, 0x8F, 0x4A, 0xED, 0x57, 0x55, 0xEA, 0x92, 0x71,
+0x36, 0xB4, 0xCD, 0x64, 0x23, 0x30, 0x2A, 0x88, 0x5D, 0xB2, 0x3B, 0xA9, 0xED, 0x8F, 0x6E, 0x04,
+0x58, 0x98, 0x7B, 0x2F, 0x4A, 0xDE, 0x30, 0x7F, 0x14, 0xA9, 0x86, 0x57, 0xEC, 0xC4, 0xBB, 0xCE,
+0x89, 0x53, 0xA1, 0xEA, 0xE4, 0xFD, 0xCA, 0x84, 0x92, 0xD8, 0x8E, 0xC9, 0x22, 0x6B, 0x70, 0x8C,
+0x50, 0x9C, 0x20, 0x9A, 0x53, 0xE8, 0x4B, 0x0C, 0x61, 0x72, 0xCA, 0x1F, 0xFD, 0xEC, 0xC0, 0x90,
+0x26, 0xB3, 0x80, 0x74, 0x01, 0x13, 0xA0, 0x26, 0xD7, 0x87, 0x46, 0xEA, 0x60, 0xA2, 0x0C, 0xCD,
+0x19, 0x28, 0x03, 0x54, 0xEE, 0xE8, 0xE5, 0x16, 0xA3, 0xA6, 0xF9, 0xE3, 0x8C, 0x3B, 0x5D, 0x3D,
+0xD6, 0x89, 0xF4, 0xDB, 0x7E, 0x0C, 0xA3, 0x62, 0x3D, 0xC9, 0x15, 0x5F, 0x43, 0xD7, 0x8E, 0x4F,
+0x53, 0x17, 0x36, 0xEB, 0x65, 0x3C, 0x0B, 0x2E, 0x03, 0x26, 0xC0, 0x32, 0x4D, 0x0E, 0x3E, 0xD3,
+0xBF, 0x6E, 0x12, 0x52, 0x3B, 0xA4, 0x42, 0xBD, 0x1C, 0xDD, 0xA3, 0x52, 0x8F, 0x2E, 0x9D, 0x10,
+0x60, 0xD2, 0xE2, 0x59, 0xF0, 0xA3, 0x7D, 0x1F, 0x8A, 0xCB, 0xAF, 0x5C, 0xBE, 0xC0, 0xAC, 0x44,
+0xA4, 0xAB, 0x9D, 0xF1, 0x99, 0xDF, 0x23, 0xCB, 0x56, 0x60, 0xF9, 0x1D, 0x0B, 0xA7, 0x4B, 0x62,
+0x64, 0xF5, 0x2F, 0x4D, 0xA7, 0x51, 0x70, 0xEB, 0xF4, 0x65, 0x54, 0xF8, 0xD8, 0xA9, 0x62, 0x77,
+0xEB, 0x0C, 0xB8, 0x44, 0x3D, 0x3D, 0x8A, 0x62, 0xD5, 0xFF, 0xF8, 0xA3, 0x97, 0xCD, 0x6B, 0xDB,
+0xF7, 0xC1, 0x3C, 0xD9, 0x05, 0xE5, 0xAE, 0x0B, 0x49, 0x8A, 0xBD, 0x62, 0x15, 0xBE, 0x7B, 0x78,
+0x7F, 0xBA, 0xD0, 0xB9, 0x8C, 0xD4, 0x05, 0xE1, 0x0F, 0xC2, 0xC7, 0xE2, 0x0A, 0xDD, 0x8B, 0x9B,
+0x99, 0x0D, 0x18, 0xB0, 0xC4, 0xCE, 0x26, 0x35, 0xA6, 0xEF, 0x1D, 0x13, 0x9A, 0xB0, 0xAC, 0x12,
+0xFD, 0xCC, 0x98, 0xB7, 0xEE, 0x63, 0xCB, 0x17, 0x9A, 0xBF, 0x7D, 0x7C, 0xA9, 0xA9, 0x44, 0x16,
+0xFA, 0x64, 0x4E, 0xAC, 0x85, 0xFB, 0xE3, 0x3F, 0x6E, 0x31, 0xDF, 0x79, 0x75, 0x93, 0x39, 0x8C,
+0x5A, 0x86, 0xF9, 0x78, 0xD8, 0x74, 0x65, 0x64, 0x99, 0xEB, 0xDE, 0x87, 0x8D, 0xDD, 0x89, 0x3A,
+0xD3, 0x45, 0x78, 0xA6, 0x17, 0xE8, 0xEC, 0xEF, 0x52, 0x09, 0x37, 0xB2, 0xAA, 0x0B, 0xB8, 0x08,
+0x0E, 0x9E, 0x7E, 0x71, 0xC0, 0x45, 0x30, 0x74, 0x93, 0xD8, 0xA1, 0xA9, 0x0E, 0x5A, 0xBA, 0x27,
+0xC8, 0x39, 0xF2, 0x77, 0xAD, 0xEB, 0x1A, 0x8A, 0x92, 0x77, 0xC1, 0xD7, 0x30, 0xD7, 0x7C, 0xFE,
+0xB1, 0xA5, 0xE6, 0x6F, 0x1F, 0x5D, 0x62, 0xC6, 0x23, 0xA2, 0x50, 0x50, 0x55, 0xFF, 0xBA, 0x64,
+0x0E, 0x09, 0x6D, 0x3B, 0x85, 0x08, 0x70, 0xCC, 0x77, 0xE0, 0x85, 0x8A, 0xB5, 0x64, 0x59, 0x70,
+0x9E, 0xF9, 0xEC, 0xE4, 0xA5, 0xC6, 0x0E, 0x74, 0x24, 0x20, 0x1E, 0x27, 0x64, 0x8E, 0xE5, 0xB7,
+0x86, 0xB3, 0xB6, 0x68, 0x0A, 0xBB, 0xA8, 0xBB, 0x52, 0x04, 0x04, 0x01, 0x55, 0xEC, 0x74, 0x20,
+0x8C, 0x28, 0x02, 0xF4, 0x33, 0x3B, 0x0B, 0xFF, 0xBA, 0x96, 0x53, 0xE7, 0x6C, 0x29, 0x31, 0xDC,
+0x7D, 0x45, 0xB1, 0x73, 0xEC, 0xC3, 0x2B, 0x70, 0xF6, 0x20, 0xE3, 0x09, 0x8C, 0x63, 0x28, 0x4E,
+0x9B, 0x92, 0x75, 0xBD, 0x25, 0x33, 0xE2, 0xAD, 0x66, 0xF3, 0xB0, 0x39, 0xE9, 0x8F, 0x83, 0xDE,
+0xC6, 0x56, 0xC8, 0xBA, 0x2C, 0x2D, 0x34, 0x95, 0x45, 0xB1, 0x53, 0x90, 0xBF, 0xEE, 0x0A, 0x94,
+0xC9, 0x3D, 0x50, 0x26, 0xA9, 0x50, 0x66, 0x23, 0xF1, 0x29, 0x49, 0x93, 0x57, 0x19, 0x83, 0x93,
+0x10, 0x95, 0x1C, 0x23, 0x67, 0xC6, 0x27, 0x5B, 0x0E, 0xBA, 0xE2, 0xBA, 0x1E, 0xD2, 0x34, 0xDF,
+0x3F, 0x0F, 0x40, 0xD8, 0x5F, 0x0B, 0x5D, 0xDC, 0x77, 0xD7, 0x36, 0xC9, 0xED, 0x8D, 0xEB, 0xD7,
+0x41, 0xF2, 0xBA, 0x4D, 0x45, 0x41, 0x8E, 0x99, 0x27, 0x91, 0xB0, 0x9A, 0x61, 0x7F, 0x44, 0x2F,
+0x0A, 0xDD, 0x79, 0x52, 0x10, 0xE0, 0x4B, 0x4E, 0x1E, 0x5E, 0xA6, 0x1A, 0x50, 0x43, 0x74, 0xD1,
+0xED, 0x4D, 0x66, 0xD9, 0x92, 0x39, 0x66, 0xF9, 0xBD, 0xF3, 0xEC, 0x0C, 0x9F, 0xBA, 0xBB, 0x17,
+0xCF, 0x94, 0xF4, 0x26, 0xA2, 0xD4, 0x0D, 0xB5, 0x38, 0x6F, 0x52, 0x7A, 0xA0, 0x8D, 0x2A, 0x02,
+0x03, 0x43, 0x60, 0x54, 0x10, 0x3B, 0x55, 0x05, 0x06, 0x76, 0xB2, 0xD2, 0x71, 0x2D, 0x92, 0x9C,
+0x13, 0x67, 0x2E, 0x80, 0xDC, 0xA1, 0xE2, 0x04, 0xB8, 0x07, 0x9D, 0xF8, 0xBD, 0x4F, 0x5C, 0x34,
+0xD1, 0x6E, 0x7C, 0x89, 0x2D, 0x4B, 0x54, 0xC4, 0x29, 0x2D, 0x20, 0x2D, 0x36, 0x51, 0xB1, 0x53,
+0xFA, 0x5C, 0x3B, 0xD4, 0xB6, 0xBA, 0xB0, 0xCC, 0x26, 0x37, 0xB6, 0x7E, 0x77, 0x62, 0x5E, 0x71,
+0x26, 0xC8, 0x1C, 0xF8, 0xD5, 0x4D, 0x45, 0xA1, 0xE8, 0x54, 0x94, 0x12, 0x63, 0x8E, 0xBE, 0xFD,
+0x70, 0xD8, 0xBE, 0xD2, 0x71, 0xDD, 0x25, 0x25, 0xB6, 0x87, 0xCE, 0x63, 0x0A, 0xFC, 0x04, 0xBD,
+0x5F, 0x5D, 0xBC, 0x79, 0x95, 0xEB, 0xB0, 0x0F, 0xDE, 0x97, 0xD0, 0x6F, 0x23, 0x7F, 0x43, 0x7F,
+0x41, 0x5B, 0x5E, 0xCC, 0xB6, 0x67, 0x55, 0x3E, 0x8B, 0x8F, 0xAC, 0x13, 0xD8, 0xB5, 0x2D, 0x0E,
+0x24, 0x85, 0x4C, 0x48, 0xDC, 0xDD, 0x05, 0xDF, 0x46, 0x10, 0xBB, 0x6A, 0x14, 0x42, 0x9F, 0x52,
+0x55, 0x2E, 0x66, 0x58, 0x4D, 0x16, 0x9E, 0x8E, 0x57, 0x9B, 0xF6, 0x49, 0x11, 0x50, 0x04, 0x6E,
+0x05, 0x04, 0x46, 0x05, 0xB1, 0xBB, 0x15, 0x80, 0xD6, 0x3E, 0x26, 0x46, 0xE0, 0x22, 0xCC, 0x21,
+0xBB, 0x8F, 0x9D, 0x42, 0x96, 0xF7, 0x4E, 0x21, 0x1A, 0xAC, 0x40, 0xC1, 0xC9, 0xD6, 0x84, 0x0D,
+0x64, 0xA5, 0x40, 0x8A, 0xB3, 0xBF, 0x7A, 0xC2, 0x12, 0xB6, 0x69, 0xA3, 0x47, 0xE3, 0xE4, 0x2E,
+0xBF, 0x32, 0xD7, 0x0F, 0xFC, 0xD9, 0x5C, 0x9E, 0x37, 0x51, 0xEB, 0xB2, 0x4C, 0x65, 0x71, 0xA1,
+0x99, 0x80, 0x37, 0x74, 0x2A, 0x77, 0xC9, 0x9C, 0x18, 0xED, 0x7B, 0xF6, 0xA2, 0x8D, 0xFC, 0x65,
+0x9E, 0x3E, 0xFA, 0xF3, 0x75, 0xDB, 0xB8, 0x89, 0x20, 0x02, 0x58, 0x8E, 0xD1, 0x11, 0xAE, 0xC8,
+0xA1, 0xDB, 0xFE, 0xC6, 0x1C, 0x9C, 0xAB, 0x18, 0xD1, 0xD3, 0x43, 0xCF, 0x81, 0xE3, 0xB1, 0x88,
+0xE0, 0xE3, 0xF7, 0x13, 0x10, 0x42, 0xEE, 0x97, 0x6A, 0x1D, 0x2A, 0x7D, 0x40, 0xB1, 0xCB, 0x03,
+0xD9, 0x9D, 0x3F, 0xA5, 0x46, 0x92, 0x34, 0xB3, 0x76, 0xAD, 0x4E, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x28, 0x02, 0x63, 0x13, 0x81, 0x11, 0xBF, 0x83, 0x6B, 0xB9, 0xA2, 0xB1, 0x39, 0x70, 0x86, 0xEB,
+0xA8, 0x59, 0x81, 0x61, 0x0B, 0x92, 0xF5, 0x76, 0x42, 0x39, 0xA2, 0x90, 0x66, 0x7D, 0x5E, 0x90,
+0xD5, 0xCD, 0xA9, 0x6B, 0xDE, 0xFF, 0x52, 0x54, 0x5D, 0x99, 0x1D, 0xF9, 0x91, 0xE8, 0x57, 0xFB,
+0xD9, 0xFB, 0xCF, 0xD9, 0x62, 0xF7, 0xE1, 0x2C, 0xDB, 0xCA, 0xEC, 0x0A, 0x8A, 0xB9, 0x28, 0x50,
+0xF2, 0xA1, 0xEB, 0x8C, 0x00, 0x85, 0xF9, 0xB5, 0x11, 0xE9, 0x0C, 0xE8, 0x5B, 0x93, 0xEC, 0x89,
+0x6A, 0xDD, 0x61, 0xF8, 0xF6, 0xB4, 0x43, 0xA1, 0x94, 0x09, 0xC7, 0x8A, 0x74, 0x5A, 0x2E, 0xE8,
+0x97, 0xFE, 0x7E, 0xD6, 0x6B, 0xCE, 0x26, 0x55, 0xF6, 0xE4, 0x33, 0xAA, 0xE4, 0x39, 0x02, 0x18,
+0x51, 0x34, 0x6D, 0x5F, 0xD9, 0xBF, 0xC8, 0x6F, 0x42, 0x60, 0x3D, 0x06, 0x61, 0x64, 0xB0, 0xA8,
+0x78, 0x41, 0xD4, 0xB0, 0xC3, 0x0E, 0x18, 0x64, 0x5C, 0xBB, 0x6A, 0x32, 0x40, 0xEE, 0x4A, 0x72,
+0xB2, 0xCC, 0x83, 0x0B, 0xE0, 0x30, 0x5E, 0x98, 0x17, 0x04, 0x9D, 0x24, 0x1B, 0x13, 0x6D, 0x5F,
+0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x60, 0xF8, 0x11, 0x18, 0x71, 0x62, 0x37, 0xFC, 0x5D, 0xD2,
+0x16, 0xC7, 0x02, 0x02, 0xF4, 0xAD, 0x23, 0xA9, 0x3B, 0x04, 0xB2, 0x73, 0x00, 0x25, 0x7D, 0x7A,
+0xF8, 0xD7, 0x39, 0x99, 0xCA, 0xAA, 0x70, 0x71, 0x93, 0x53, 0xB5, 0xEC, 0x52, 0xEB, 0x53, 0x16,
+0xC6, 0x80, 0x5A, 0xD5, 0x2E, 0xCC, 0x79, 0xE7, 0x4D, 0xB5, 0x36, 0x2E, 0x81, 0x66, 0x58, 0xAE,
+0xCB, 0xFD, 0xD3, 0x97, 0x6C, 0x2A, 0x52, 0x7B, 0xA4, 0xC2, 0xA7, 0xAC, 0x03, 0x49, 0x4F, 0xF7,
+0x21, 0x7F, 0x1D, 0x09, 0x9E, 0x57, 0x22, 0x29, 0x4E, 0x5A, 0x91, 0xD1, 0x2B, 0x70, 0xF6, 0xB3,
+0x0F, 0x70, 0xF0, 0x9F, 0xC5, 0x5C, 0xEB, 0x20, 0x70, 0x09, 0x4A, 0xDC, 0xB7, 0xA8, 0x42, 0xE9,
+0x3F, 0x07, 0xA8, 0x58, 0x82, 0x18, 0x76, 0xDF, 0xAA, 0x83, 0x7E, 0x66, 0xA3, 0xD7, 0x3A, 0x65,
+0xCE, 0xC6, 0xD2, 0xE9, 0x35, 0x95, 0x66, 0x76, 0xDD, 0xC4, 0x94, 0x98, 0xA4, 0xC7, 0xC2, 0xF8,
+0xD4, 0x63, 0x54, 0x04, 0x14, 0x01, 0x45, 0x60, 0xAC, 0x22, 0xA0, 0xC4, 0x6E, 0xAC, 0x9E, 0xB9,
+0x31, 0x7E, 0xDC, 0xF4, 0xAD, 0xDB, 0x85, 0x2A, 0x13, 0xEF, 0xA1, 0x5E, 0xE3, 0x39, 0xF8, 0xD7,
+0x91, 0x67, 0xD0, 0x5C, 0x19, 0xFA, 0xD2, 0x59, 0x75, 0x2E, 0xCC, 0x57, 0xE7, 0xFD, 0xC6, 0x42,
+0x5F, 0xB9, 0x60, 0xDD, 0xB8, 0x5C, 0x6D, 0xA2, 0xE2, 0x45, 0xB6, 0xF5, 0xCA, 0x1D, 0x69, 0x8D,
+0x10, 0x3B, 0x72, 0x1A, 0x44, 0x81, 0x16, 0x20, 0x7F, 0xD5, 0x0C, 0xE4, 0xB3, 0x4A, 0x05, 0xB1,
+0x93, 0x52, 0x62, 0x47, 0x4E, 0x4A, 0x86, 0xFB, 0x0C, 0x89, 0xC8, 0x25, 0x7F, 0xF3, 0x8A, 0x9B,
+0xED, 0xA7, 0xEF, 0x8F, 0xF7, 0x8D, 0x73, 0x9E, 0x73, 0x41, 0x3E, 0x3E, 0x9F, 0x97, 0x8F, 0xDB,
+0xF9, 0xE8, 0x0F, 0x6F, 0x82, 0x0E, 0x13, 0x19, 0x3B, 0xFF, 0xB9, 0x40, 0xA1, 0xB3, 0xFE, 0x85,
+0x36, 0x20, 0xC5, 0x29, 0x78, 0xC2, 0x84, 0xA1, 0x8A, 0x76, 0x00, 0x77, 0x98, 0x61, 0xF3, 0x91,
+0x94, 0x78, 0xF9, 0xBC, 0x69, 0x92, 0xCF, 0x4F, 0x23, 0xD4, 0xC7, 0xF8, 0x85, 0xA5, 0x87, 0xAF,
+0x08, 0x28, 0x02, 0xB7, 0x3C, 0x02, 0x4A, 0xEC, 0x6E, 0xF9, 0x21, 0x30, 0x32, 0x00, 0xB4, 0xC3,
+0xA7, 0x6E, 0xDB, 0xFE, 0xE3, 0x66, 0x1B, 0x32, 0xBF, 0xB7, 0x77, 0x40, 0x39, 0xC2, 0xD4, 0x05,
+0xD3, 0xA0, 0xF5, 0x33, 0x73, 0xB2, 0x92, 0x3F, 0xB4, 0x38, 0xD7, 0xB9, 0xD0, 0xF7, 0x2E, 0x70,
+0xBD, 0x73, 0xDA, 0x9D, 0x33, 0xCD, 0xC6, 0x75, 0x49, 0x12, 0xA1, 0x38, 0xD5, 0x8B, 0xB5, 0x61,
+0xB9, 0x3D, 0x03, 0x04, 0x68, 0x76, 0x9C, 0x8C, 0xBC, 0x6D, 0xD9, 0xE3, 0x92, 0x9B, 0x98, 0x58,
+0xCA, 0x1A, 0xC1, 0x97, 0xF0, 0x30, 0xD2, 0xBA, 0x74, 0xD1, 0xFE, 0xEA, 0x52, 0xB3, 0x88, 0x16,
+0xE9, 0x14, 0x3B, 0x39, 0x3E, 0x6F, 0x66, 0x8D, 0x59, 0xC3, 0x93, 0xB1, 0xB0, 0x53, 0xB1, 0xBE,
+0x87, 0x6C, 0xC3, 0xF6, 0x4F, 0xBA, 0x19, 0x7E, 0x74, 0x8B, 0xAC, 0x96, 0x29, 0xFB, 0x72, 0x28,
+0xC1, 0xDE, 0x2D, 0xE6, 0x57, 0x73, 0xBD, 0x03, 0xD1, 0xB0, 0x5D, 0xA6, 0x06, 0x79, 0xEB, 0x16,
+0x4C, 0xAD, 0xD5, 0x42, 0xE7, 0x23, 0x73, 0x29, 0xE8, 0x5E, 0x15, 0x01, 0x45, 0x40, 0x11, 0x18,
+0x56, 0x04, 0x46, 0x94, 0xD8, 0xA9, 0x3A, 0x30, 0xAC, 0xE7, 0x72, 0xEC, 0x34, 0x06, 0x96, 0xC1,
+0xA0, 0x89, 0x8D, 0x28, 0xBE, 0xBD, 0x65, 0xDF, 0x31, 0xE4, 0x50, 0xB3, 0x49, 0x3F, 0x48, 0xEC,
+0x6C, 0x81, 0xD8, 0xD0, 0x7F, 0x8E, 0xEA, 0x94, 0xAF, 0xBC, 0xE0, 0x55, 0x2D, 0xF1, 0xA9, 0xA3,
+0x02, 0x25, 0xAA, 0x5C, 0xA8, 0x7A, 0xD9, 0x65, 0x36, 0x9F, 0x9D, 0x57, 0xBF, 0xB8, 0xAE, 0x8D,
+0xF0, 0xB4, 0x84, 0x8E, 0x9F, 0x19, 0xB8, 0x50, 0x06, 0x75, 0x6A, 0x42, 0x49, 0x11, 0x12, 0x13,
+0x23, 0xFB, 0x7C, 0x92, 0x13, 0x13, 0x33, 0x20, 0xA4, 0x0D, 0xAA, 0xA4, 0x55, 0x26, 0x2D, 0xF9,
+0xA4, 0x82, 0x26, 0x2C, 0x4C, 0x6C, 0xA5, 0xEC, 0x8F, 0x8D, 0xD4, 0xB5, 0xD5, 0x36, 0x22, 0xBE,
+0x71, 0xDE, 0x4C, 0xEB, 0xD7, 0x8F, 0x7E, 0xF7, 0x38, 0xB9, 0x88, 0x5F, 0x1F, 0xF9, 0x1B, 0x93,
+0xA4, 0xD8, 0xB7, 0xEB, 0xD4, 0x3A, 0x5B, 0xE9, 0x02, 0xC4, 0xAE, 0xB3, 0x83, 0x0E, 0x8D, 0xA2,
+0x60, 0xCE, 0x6E, 0x9C, 0x6C, 0x1A, 0x27, 0x57, 0x99, 0x9C, 0xEC, 0xE4, 0xFB, 0x1A, 0x8E, 0x9D,
+0x41, 0xAA, 0x47, 0xAA, 0x08, 0x28, 0x02, 0x8A, 0xC0, 0xD8, 0x44, 0x60, 0x44, 0x89, 0xDD, 0xD8,
+0x84, 0x4C, 0x8F, 0x7A, 0xA8, 0x08, 0x5C, 0xBD, 0x76, 0xCD, 0xEC, 0x3E, 0xD2, 0x2A, 0x35, 0x53,
+0x5B, 0xDB, 0x2E, 0x05, 0x44, 0x47, 0x4A, 0x89, 0x85, 0xD2, 0x92, 0x10, 0x9C, 0x58, 0x17, 0x3B,
+0x4F, 0x7A, 0xA2, 0x11, 0xB0, 0xA1, 0x10, 0x15, 0xB7, 0x72, 0xA8, 0xFE, 0x39, 0xA5, 0x4A, 0xF2,
+0xD7, 0xA1, 0x41, 0x96, 0x09, 0xAA, 0x9F, 0x50, 0x8E, 0xC0, 0x89, 0x0A, 0x53, 0x84, 0xD2, 0x59,
+0xC9, 0x4E, 0xB7, 0xC3, 0x8A, 0x1A, 0x47, 0x50, 0x46, 0xEC, 0x32, 0xCC, 0xB1, 0x51, 0x1F, 0xB7,
+0x48, 0xFE, 0xE1, 0x18, 0xE5, 0xCE, 0xCB, 0x6E, 0x01, 0x39, 0x75, 0x44, 0x35, 0x46, 0x95, 0x0B,
+0x94, 0x39, 0x5B, 0x71, 0xC3, 0x56, 0xB1, 0xF0, 0xEA, 0x5C, 0x44, 0xB6, 0xF3, 0x2A, 0x9D, 0xDF,
+0x98, 0xE4, 0x19, 0xE6, 0x57, 0xC3, 0x68, 0x58, 0x60, 0x31, 0x1E, 0xE4, 0x76, 0xE1, 0xF4, 0x29,
+0xA6, 0x6A, 0xBC, 0x46, 0xC3, 0x0E, 0x75, 0x5C, 0xEB, 0xF6, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x8C,
+0x06, 0x04, 0x94, 0xD8, 0x8D, 0x86, 0xB3, 0x70, 0x8B, 0x1D, 0x43, 0xDB, 0xE5, 0xAB, 0xE6, 0xB5,
+0x6D, 0x7B, 0x25, 0x31, 0x71, 0x36, 0x55, 0x22, 0x46, 0x88, 0xC2, 0xF7, 0x4C, 0x26, 0x97, 0x63,
+0x4E, 0xF2, 0xAC, 0x39, 0xA5, 0x2D, 0x5E, 0x7D, 0xA3, 0xF4, 0xE6, 0x23, 0x60, 0x2D, 0xF9, 0xF3,
+0xEB, 0x86, 0xB9, 0xDA, 0xEC, 0x36, 0xB1, 0x91, 0xB3, 0x1C, 0xEC, 0x24, 0x41, 0xD9, 0x20, 0x76,
+0xF3, 0x1A, 0xAA, 0xCD, 0xED, 0x8D, 0xD5, 0x52, 0xFD, 0x21, 0xD9, 0x13, 0x23, 0x61, 0x9B, 0x0F,
+0xB7, 0x22, 0x60, 0x03, 0x81, 0x13, 0x8C, 0xFC, 0x8D, 0x2A, 0x76, 0x11, 0x7F, 0x40, 0xF9, 0x91,
+0x66, 0xDA, 0x98, 0xE8, 0x55, 0xFB, 0xBD, 0x3B, 0xA2, 0xCE, 0x89, 0xCF, 0x1C, 0x67, 0x31, 0x5B,
+0x5B, 0xB5, 0xCF, 0x2A, 0x7E, 0xAE, 0xFF, 0x12, 0x5F, 0x1B, 0xF1, 0xD9, 0x13, 0x61, 0x50, 0x76,
+0x6C, 0x0C, 0x95, 0xBA, 0x6B, 0x1D, 0x10, 0xED, 0x60, 0xF6, 0x46, 0x5A, 0x93, 0xA6, 0xBA, 0x6A,
+0x73, 0xF7, 0xDC, 0x69, 0xA6, 0x30, 0x2F, 0x57, 0xFD, 0xEB, 0x92, 0x3D, 0x10, 0xB4, 0x7D, 0x45,
+0x40, 0x11, 0x50, 0x04, 0x52, 0x80, 0x80, 0x12, 0xBB, 0x14, 0x80, 0xAC, 0xBB, 0x08, 0x11, 0x60,
+0xD0, 0x02, 0x23, 0x61, 0xDF, 0x3D, 0x78, 0xC2, 0x5C, 0xEE, 0x44, 0x44, 0x26, 0x2A, 0x30, 0x78,
+0x33, 0xAC, 0x4F, 0x7D, 0x23, 0x4A, 0x56, 0x8C, 0x54, 0xE7, 0x64, 0xBC, 0x40, 0xD0, 0x0B, 0xBF,
+0x7B, 0xDF, 0xB4, 0xA8, 0xDF, 0x9D, 0xF7, 0x5B, 0xF3, 0xFE, 0x66, 0x5E, 0x06, 0xF4, 0x75, 0x1F,
+0x73, 0xB3, 0xB3, 0xCD, 0xB4, 0x49, 0x13, 0x64, 0xCE, 0xC3, 0xE7, 0x64, 0x4F, 0x0C, 0x14, 0xD9,
+0x77, 0xE2, 0xB4, 0x44, 0xE2, 0x92, 0xBC, 0x59, 0x85, 0xCD, 0x1D, 0x55, 0xBC, 0x4F, 0x9C, 0x7C,
+0x0F, 0xFD, 0xE2, 0x7A, 0xF8, 0xC7, 0x05, 0xBF, 0xBA, 0xA3, 0x76, 0xDB, 0x87, 0xEA, 0x9F, 0x4B,
+0xD0, 0xEC, 0x7C, 0x09, 0x83, 0xA0, 0x0A, 0x82, 0xC2, 0xF4, 0x26, 0x4C, 0x46, 0xDC, 0x7D, 0x5D,
+0x48, 0x61, 0x69, 0x71, 0x91, 0x59, 0x34, 0xE3, 0x36, 0x33, 0x75, 0xF2, 0x44, 0x35, 0xC3, 0x26,
+0x7B, 0x10, 0x68, 0xFB, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xA4, 0x08, 0x81, 0x11, 0x25, 0x76, 0xC9,
+0x36, 0x81, 0xA5, 0x08, 0x43, 0xDD, 0xCD, 0x20, 0x10, 0x60, 0x74, 0xE8, 0x36, 0xF8, 0xD5, 0x9D,
+0x38, 0x7F, 0x49, 0x04, 0x24, 0x92, 0x2D, 0xE6, 0xAE, 0x63, 0x44, 0x6C, 0x18, 0xE1, 0xE9, 0x7D,
+0xE5, 0xBC, 0xE9, 0x95, 0x4A, 0x14, 0xC5, 0x2C, 0x17, 0xF1, 0xE9, 0x54, 0x3A, 0xC9, 0x69, 0x17,
+0xE7, 0x67, 0xE7, 0x97, 0xC5, 0xE4, 0xBC, 0x73, 0x11, 0xA1, 0xDC, 0x17, 0x09, 0x50, 0x01, 0x54,
+0xBA, 0x7A, 0x54, 0x58, 0xA8, 0xC5, 0x9C, 0x83, 0x20, 0x8A, 0x64, 0x4F, 0x1D, 0xA8, 0x7D, 0x7B,
+0xF8, 0x54, 0x9B, 0x10, 0x3B, 0xAA, 0x75, 0xAC, 0xAE, 0x21, 0x73, 0x44, 0x79, 0x23, 0xD1, 0x12,
+0x05, 0xCE, 0x45, 0xC7, 0x5A, 0x35, 0xCE, 0xF9, 0xE3, 0xF1, 0x37, 0xAF, 0x40, 0x06, 0x79, 0xFA,
+0x9C, 0x1F, 0x9E, 0xC3, 0xC4, 0x47, 0xCC, 0x86, 0xB9, 0xED, 0x9C, 0x5F, 0xA1, 0xCF, 0xFB, 0x42,
+0x96, 0xDB, 0x7D, 0x4D, 0x94, 0x3C, 0x21, 0x95, 0xA8, 0x25, 0xDB, 0x50, 0x53, 0x65, 0xEE, 0xBB,
+0x63, 0xAE, 0x29, 0xD1, 0x68, 0xD8, 0x64, 0x0F, 0x01, 0x6D, 0x5F, 0x11, 0x50, 0x04, 0x14, 0x81,
+0x94, 0x21, 0x30, 0xA2, 0xC4, 0x2E, 0x65, 0xBD, 0xD4, 0x1D, 0x8D, 0x0A, 0x04, 0x48, 0xDE, 0x4E,
+0x81, 0xD0, 0x6D, 0x3B, 0x78, 0xDC, 0xB4, 0x5D, 0xB9, 0x1A, 0x04, 0x09, 0x88, 0x19, 0xD6, 0x55,
+0x9C, 0xF0, 0x6A, 0x1B, 0x0F, 0x58, 0xC8, 0x5C, 0x28, 0xBB, 0x05, 0x7D, 0xB0, 0x84, 0xC7, 0x7E,
+0xB5, 0xA1, 0x12, 0x5C, 0xCF, 0xCD, 0x4E, 0xA9, 0xF2, 0x2B, 0xDB, 0xD4, 0x21, 0xB6, 0x3E, 0x2C,
+0x27, 0x92, 0xBB, 0x2A, 0x54, 0x9A, 0x98, 0x80, 0xF2, 0x59, 0x36, 0x70, 0x22, 0xB9, 0x97, 0x00,
+0xC9, 0xDC, 0x29, 0xF8, 0x11, 0xD2, 0xEC, 0xEC, 0x6B, 0xE0, 0x06, 0x7E, 0x76, 0xD1, 0xB3, 0xD2,
+0xB3, 0x1B, 0xE1, 0xAF, 0x62, 0x4A, 0x8D, 0x6E, 0x15, 0xDB, 0x82, 0xE7, 0x6E, 0x51, 0xD5, 0x2E,
+0x02, 0x88, 0xFD, 0x08, 0xEC, 0xE9, 0xC3, 0xC8, 0xAA, 0x17, 0xD4, 0xF4, 0x4A, 0x51, 0x71, 0xE3,
+0x8E, 0x19, 0x8D, 0x66, 0xD6, 0x94, 0x49, 0x48, 0xD0, 0x9C, 0x7C, 0xD5, 0x72, 0x54, 0x0C, 0x40,
+0x3D, 0x08, 0x45, 0x40, 0x11, 0x50, 0x04, 0x6E, 0x01, 0x04, 0x92, 0xFB, 0x54, 0xEB, 0x03, 0x40,
+0xAD, 0x38, 0x71, 0x0B, 0x8C, 0xAE, 0xB8, 0x2E, 0xD2, 0x0C, 0x7B, 0x00, 0xB5, 0x52, 0xDF, 0x39,
+0x74, 0x5C, 0x14, 0xBA, 0x40, 0xAD, 0x83, 0x33, 0xBF, 0x98, 0x1F, 0xBD, 0xDD, 0x30, 0x12, 0xE9,
+0xEA, 0x15, 0x38, 0x9B, 0x06, 0x25, 0xEA, 0x4F, 0x67, 0xD5, 0xBC, 0x68, 0x2E, 0xBB, 0x68, 0xCE,
+0xBB, 0x50, 0xC1, 0xB2, 0xD1, 0xB0, 0x99, 0xE2, 0x77, 0x06, 0xFF, 0x3A, 0xA4, 0x36, 0x69, 0xAA,
+0xAE, 0x30, 0xC5, 0x08, 0x9A, 0x48, 0xC5, 0x44, 0x33, 0xEC, 0x5E, 0x94, 0x4C, 0xEB, 0x44, 0xDF,
+0xA9, 0x50, 0xDB, 0x00, 0x91, 0xD0, 0x5C, 0x1A, 0x1F, 0x01, 0x6B, 0x7F, 0xB3, 0x84, 0x35, 0x66,
+0xF6, 0x2A, 0x65, 0x24, 0x3A, 0xD6, 0xFB, 0xD4, 0xF9, 0x48, 0x5A, 0x8F, 0x87, 0x2D, 0x67, 0x61,
+0xC9, 0xAF, 0xC5, 0x87, 0xF9, 0x01, 0x51, 0x13, 0x16, 0x9F, 0xAF, 0x20, 0x02, 0x99, 0x6A, 0xDD,
+0x6D, 0xD5, 0x55, 0xE6, 0x4F, 0xEE, 0x9A, 0xA7, 0xB9, 0xEB, 0x52, 0x31, 0x08, 0x74, 0x1F, 0x8A,
+0x80, 0x22, 0xA0, 0x08, 0xA4, 0x10, 0x81, 0x11, 0x23, 0x76, 0x29, 0xEC, 0xA3, 0xEE, 0x6A, 0x14,
+0x20, 0x40, 0x82, 0x71, 0xFE, 0xD2, 0x55, 0xF3, 0xF6, 0xFE, 0xA3, 0xE6, 0xD8, 0xD9, 0x0B, 0x42,
+0x3A, 0x58, 0x80, 0xFE, 0x3A, 0x8B, 0xD0, 0xB3, 0x8C, 0x98, 0x23, 0x34, 0x41, 0x58, 0xAC, 0x57,
+0xEB, 0x62, 0x54, 0xAD, 0xB8, 0x3C, 0x75, 0x5E, 0xCD, 0x8B, 0x44, 0x88, 0x86, 0x61, 0xA7, 0x11,
+0xC5, 0xCF, 0x29, 0x75, 0x6C, 0x92, 0x35, 0x61, 0xA7, 0x4D, 0xAA, 0x34, 0x25, 0xF9, 0x79, 0x29,
+0x41, 0xE5, 0x0A, 0x88, 0xDD, 0x9E, 0xA3, 0xA7, 0x5D, 0x4A, 0x17, 0x17, 0xBD, 0xEA, 0x8E, 0x3B,
+0x50, 0x24, 0x23, 0x07, 0x1D, 0xAB, 0xBA, 0x85, 0x87, 0x28, 0x24, 0x8F, 0x18, 0x39, 0x62, 0x17,
+0x56, 0xA0, 0x70, 0x52, 0x1F, 0x57, 0xB5, 0x9C, 0x31, 0x42, 0xE8, 0xEC, 0x6F, 0x3E, 0x90, 0x82,
+0x66, 0xDA, 0x92, 0xFC, 0x7C, 0x98, 0xA1, 0x2B, 0xCC, 0x9D, 0x33, 0x1B, 0xCD, 0x9C, 0xC6, 0x49,
+0x5A, 0x69, 0x22, 0x25, 0xA3, 0x40, 0x77, 0xA2, 0x08, 0x28, 0x02, 0x8A, 0x40, 0xEA, 0x10, 0x18,
+0x31, 0x62, 0xA7, 0xFE, 0x75, 0xA9, 0x3B, 0xC9, 0xA3, 0x61, 0x4F, 0xCC, 0xE5, 0x76, 0xEC, 0xF4,
+0x79, 0xB3, 0x7A, 0xFB, 0x7E, 0xA7, 0x5E, 0x21, 0xE3, 0x06, 0x1C, 0xF9, 0xBB, 0x98, 0x28, 0x97,
+0xA4, 0xC5, 0xF9, 0xBF, 0x59, 0x13, 0xAB, 0x57, 0xEF, 0xAC, 0x76, 0x15, 0xA8, 0x6F, 0xBE, 0x5E,
+0xAC, 0x53, 0xEF, 0xE8, 0x47, 0x27, 0xB5, 0x55, 0x03, 0xDF, 0x3B, 0x1F, 0x51, 0x2A, 0x9B, 0xD9,
+0xDC, 0x75, 0xAE, 0x5D, 0x5B, 0x71, 0xE2, 0x86, 0x44, 0xC4, 0xCE, 0xAC, 0xAB, 0x82, 0x52, 0x95,
+0x22, 0x62, 0x07, 0x9F, 0xC2, 0x3D, 0x47, 0x4F, 0x49, 0xA5, 0x0B, 0xE9, 0x99, 0x90, 0xD0, 0x48,
+0xBF, 0x7C, 0x5D, 0xD7, 0x48, 0x7D, 0x57, 0x1B, 0x10, 0x12, 0xF6, 0x5B, 0x36, 0x72, 0x7D, 0x0D,
+0xFE, 0xCA, 0xEF, 0x6C, 0xCF, 0xE5, 0xF4, 0xF3, 0xFE, 0x79, 0xCE, 0xEF, 0x50, 0xF2, 0xD5, 0x91,
+0xD0, 0x92, 0xCC, 0x3A, 0xB6, 0x48, 0x2C, 0xA6, 0xA2, 0x74, 0xD8, 0xFB, 0xE6, 0x4E, 0x35, 0x8F,
+0x2D, 0x51, 0xB5, 0x6E, 0x34, 0x5C, 0x17, 0x7A, 0x0C, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x0C, 0x37,
+0x02, 0x23, 0x46, 0xEC, 0x86, 0xBB, 0x23, 0xDA, 0xDE, 0xE8, 0x45, 0x80, 0x84, 0x8A, 0x09, 0x7A,
+0xB7, 0xEE, 0x3B, 0x2A, 0xF5, 0x52, 0xC5, 0x0C, 0x0F, 0xF3, 0x60, 0x37, 0x88, 0x5D, 0x37, 0x23,
+0x35, 0x03, 0xB5, 0x2E, 0xDA, 0x87, 0x88, 0x12, 0xE5, 0xFD, 0xE8, 0x2C, 0x5F, 0x0B, 0x7D, 0xEF,
+0x62, 0x56, 0x77, 0xA6, 0xC7, 0x60, 0x59, 0xE0, 0x74, 0x27, 0x71, 0x14, 0x4C, 0x4A, 0x4C, 0x62,
+0x53, 0x0A, 0xBF, 0xBA, 0x6A, 0x54, 0x5A, 0xC8, 0xCB, 0x49, 0x7E, 0x32, 0x5E, 0x9A, 0x5D, 0x99,
+0xDA, 0xE5, 0xF8, 0xD9, 0x8B, 0x12, 0x2C, 0xE1, 0x6B, 0xC3, 0x5A, 0x5A, 0xD7, 0x97, 0xDF, 0x5C,
+0x22, 0x7F, 0x3A, 0xDB, 0xB1, 0xE0, 0x17, 0x9A, 0x58, 0xE5, 0x9F, 0x5F, 0xEA, 0x3B, 0x1E, 0x46,
+0xD4, 0x92, 0xCC, 0x32, 0xF9, 0x32, 0xFF, 0xD1, 0x97, 0xB0, 0x71, 0xE2, 0x78, 0xB3, 0x64, 0xE6,
+0x14, 0xB3, 0x0C, 0xC4, 0x6E, 0xCE, 0x94, 0x1A, 0x55, 0xEB, 0x46, 0xEF, 0x25, 0xA3, 0x47, 0xA6,
+0x08, 0x28, 0x02, 0x8A, 0xC0, 0x4D, 0x23, 0x30, 0x22, 0xC4, 0x4E, 0xFD, 0xEB, 0x6E, 0xFA, 0x7C,
+0x8D, 0xC9, 0x0D, 0xA9, 0xD6, 0x1D, 0x39, 0x75, 0xCE, 0xBC, 0xBC, 0x65, 0x97, 0xB9, 0x8A, 0x64,
+0xBD, 0x24, 0x59, 0xD7, 0xE1, 0x57, 0x47, 0x52, 0xE7, 0x03, 0x21, 0x02, 0x55, 0xCE, 0x13, 0x37,
+0x1A, 0x10, 0xBD, 0x5F, 0x99, 0xA7, 0x33, 0xCE, 0x14, 0x29, 0xEB, 0xBA, 0x7C, 0x77, 0x52, 0xBD,
+0x44, 0x24, 0x2E, 0xC9, 0x3E, 0x1C, 0x98, 0x2A, 0x83, 0x3C, 0x76, 0xF8, 0x9D, 0xFE, 0x75, 0x9C,
+0x48, 0x6E, 0x6A, 0xC6, 0x97, 0x82, 0xD0, 0xE4, 0x24, 0x3D, 0x29, 0x31, 0xF7, 0xC7, 0xBA, 0xB0,
+0xAD, 0x6D, 0x17, 0xCD, 0x85, 0xAB, 0x57, 0x83, 0x7E, 0x46, 0x7D, 0xEA, 0x2C, 0xC1, 0x0D, 0x67,
+0xFB, 0xDD, 0xFB, 0xC7, 0xC5, 0xE6, 0xA8, 0x0B, 0x7C, 0x09, 0x1D, 0x26, 0xBD, 0x7D, 0xF7, 0x55,
+0x39, 0x58, 0x3A, 0x8D, 0xEA, 0x64, 0x36, 0xFA, 0x4C, 0xF2, 0x97, 0x33, 0x6E, 0x9C, 0xB9, 0x6F,
+0x7E, 0x93, 0x79, 0xFF, 0x3D, 0xF3, 0xCC, 0xD2, 0xD9, 0x53, 0x4D, 0x91, 0xE6, 0xAD, 0x1B, 0x93,
+0xD7, 0x92, 0x1E, 0xB4, 0x22, 0xA0, 0x08, 0x28, 0x02, 0xFD, 0x21, 0x30, 0x22, 0xC4, 0xAE, 0xBF,
+0x83, 0xD2, 0xDF, 0xD3, 0x07, 0x01, 0xEB, 0x5B, 0xD7, 0x6E, 0xB6, 0xEC, 0x3D, 0x6A, 0x9A, 0x51,
+0x6D, 0x82, 0xCA, 0xD5, 0x0D, 0x46, 0x68, 0x42, 0xAD, 0xBB, 0x11, 0xAD, 0x34, 0x61, 0x6D, 0xB0,
+0x96, 0x82, 0x09, 0x81, 0x73, 0xAA, 0x56, 0x3C, 0x14, 0xF1, 0xBE, 0x77, 0xCE, 0x74, 0xDB, 0x73,
+0xB5, 0x30, 0x72, 0x96, 0x44, 0x92, 0xAD, 0xD1, 0xBF, 0xAE, 0x11, 0x29, 0x4E, 0xF2, 0x73, 0x93,
+0xAF, 0xD6, 0xF1, 0x78, 0x3A, 0x40, 0x62, 0x5B, 0x4E, 0x9E, 0x33, 0x57, 0x3A, 0x91, 0x3B, 0x0E,
+0x53, 0x97, 0x04, 0x31, 0xF8, 0xA0, 0x06, 0xA7, 0xBE, 0x45, 0x89, 0x9A, 0x0F, 0x10, 0x89, 0x3A,
+0x0A, 0x3A, 0x55, 0x2E, 0xAA, 0xCD, 0x59, 0xD5, 0xCE, 0xF9, 0x1B, 0x06, 0xED, 0x85, 0xDF, 0xAD,
+0xF9, 0x35, 0xD3, 0x8C, 0x63, 0xC4, 0x2F, 0x56, 0x26, 0x91, 0x9D, 0xD7, 0x50, 0x63, 0xEE, 0x9D,
+0x75, 0x9B, 0x99, 0x87, 0xF2, 0x61, 0x75, 0x92, 0xE6, 0x25, 0x35, 0x18, 0xA4, 0xCF, 0x48, 0xD6,
+0x9E, 0x28, 0x02, 0x8A, 0x80, 0x22, 0x30, 0x36, 0x10, 0x50, 0x62, 0x37, 0x36, 0xCE, 0xD3, 0x98,
+0x3D, 0x4A, 0x46, 0xBF, 0x1E, 0x86, 0x5A, 0xF7, 0xDB, 0xAD, 0x3B, 0x41, 0x70, 0xAE, 0x89, 0x5A,
+0xD7, 0xD5, 0x75, 0x4D, 0x02, 0x27, 0x84, 0x93, 0x39, 0x5F, 0x38, 0x4B, 0xE3, 0xAC, 0xFA, 0x26,
+0x3E, 0x73, 0x3E, 0x2A, 0x54, 0x08, 0x9F, 0x4B, 0x6A, 0x22, 0xBE, 0x66, 0xFE, 0xBB, 0x55, 0xBA,
+0x6C, 0x44, 0x68, 0xA8, 0xEE, 0x79, 0x25, 0xCB, 0xAA, 0x7A, 0x96, 0x02, 0x89, 0x1F, 0x9E, 0xF3,
+0xAF, 0x9B, 0x05, 0xFF, 0xBA, 0x7C, 0x10, 0x9D, 0x54, 0x4C, 0x57, 0xE0, 0x5F, 0x67, 0x2B, 0x4E,
+0x20, 0x47, 0x1F, 0x23, 0x62, 0x49, 0xC2, 0xA4, 0x40, 0x84, 0xCB, 0x57, 0x17, 0x5F, 0x61, 0x42,
+0xBA, 0x12, 0x89, 0xF4, 0x75, 0xA4, 0x4F, 0xAA, 0x70, 0x78, 0xF5, 0xD2, 0xAB, 0x96, 0xCE, 0xDF,
+0xD0, 0xBA, 0xD2, 0xB9, 0xFA, 0xB8, 0x8E, 0x18, 0x8F, 0xCB, 0xCA, 0x12, 0x85, 0x8E, 0xCB, 0xAF,
+0x01, 0xFF, 0x8A, 0xE2, 0x02, 0xF3, 0xE4, 0xD2, 0xDB, 0xCD, 0xE2, 0xE9, 0xF5, 0x52, 0x42, 0xCD,
+0x72, 0x67, 0xA7, 0x7A, 0xA6, 0x02, 0x08, 0xDD, 0x87, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x40,
+0xCA, 0x10, 0x50, 0x62, 0x97, 0x32, 0xA8, 0x6F, 0xBD, 0x1D, 0x91, 0xD4, 0xB5, 0x22, 0x6F, 0xDD,
+0xA6, 0xDD, 0x87, 0xCD, 0x7B, 0x20, 0x38, 0x24, 0x19, 0xA2, 0xD6, 0x31, 0xBD, 0x09, 0x23, 0x61,
+0x83, 0x29, 0xEA, 0x4F, 0xE7, 0x68, 0x8A, 0x5F, 0x14, 0x55, 0xF2, 0x2C, 0x25, 0x91, 0xFF, 0x1D,
+0x67, 0x0B, 0xBE, 0xDB, 0x80, 0x03, 0x6B, 0xD9, 0x0C, 0x04, 0x2F, 0xD7, 0xBE, 0xAF, 0x38, 0x91,
+0x8F, 0x2A, 0x13, 0xAC, 0x11, 0x9B, 0x9B, 0x82, 0xA4, 0xC4, 0xDC, 0x35, 0x89, 0xEC, 0x81, 0xD6,
+0xB3, 0x92, 0x3B, 0x8E, 0x07, 0x15, 0x9F, 0xC7, 0xCE, 0xF7, 0x26, 0xF4, 0x06, 0x8C, 0x3D, 0xFE,
+0x28, 0x99, 0xF3, 0x5D, 0x97, 0x7E, 0x47, 0x27, 0xF7, 0x3D, 0x0B, 0x0C, 0x6F, 0x9C, 0xF3, 0xA9,
+0x13, 0xA5, 0x4E, 0x1A, 0xBF, 0x61, 0x26, 0x96, 0x15, 0x9B, 0x3B, 0xA7, 0xD5, 0x9B, 0x25, 0xB3,
+0x1A, 0xCC, 0xA4, 0xCA, 0x32, 0x55, 0xEA, 0x6E, 0xBD, 0xCB, 0x50, 0x7B, 0xAC, 0x08, 0x28, 0x02,
+0xB7, 0x18, 0x02, 0x29, 0x27, 0x76, 0xAA, 0x14, 0xDC, 0x3A, 0x23, 0x8C, 0x91, 0xA0, 0xCD, 0x2D,
+0x27, 0xCD, 0xAF, 0x37, 0x36, 0x9B, 0xF6, 0x8E, 0x4E, 0x71, 0xE4, 0xEF, 0x86, 0x5A, 0x27, 0x91,
+0xB0, 0x30, 0x4B, 0x86, 0x7E, 0x75, 0x61, 0xC5, 0x05, 0x1B, 0x48, 0x61, 0xAB, 0x26, 0xD8, 0xDC,
+0x76, 0x61, 0x74, 0xA8, 0xA8, 0x59, 0x3E, 0x62, 0x56, 0xD4, 0x2F, 0xCB, 0xE4, 0xEC, 0x98, 0x0A,
+0x67, 0xAB, 0x88, 0x59, 0x95, 0x4E, 0x72, 0xD8, 0x81, 0xE8, 0x50, 0x31, 0x63, 0xEE, 0x3A, 0x26,
+0x26, 0xA6, 0xA2, 0x95, 0xEC, 0x89, 0xFB, 0xBE, 0x82, 0x3E, 0x9F, 0x38, 0x87, 0xC0, 0x09, 0x92,
+0xD9, 0x88, 0xFA, 0x16, 0x93, 0x63, 0xCF, 0x29, 0x70, 0x61, 0xFE, 0x3A, 0xBA, 0x0B, 0xDA, 0xE8,
+0x5E, 0x89, 0xE8, 0x8D, 0x46, 0xFD, 0xBA, 0x3C, 0x7F, 0x51, 0x55, 0x92, 0x9F, 0x69, 0x69, 0x26,
+0x99, 0xCB, 0xCE, 0x1A, 0x07, 0xD2, 0x9A, 0x6D, 0x48, 0xF2, 0x88, 0x3D, 0xF7, 0x79, 0x67, 0x53,
+0x9D, 0x79, 0x6A, 0xC5, 0x02, 0x53, 0x0B, 0x42, 0xCB, 0xF5, 0x82, 0x6D, 0x5D, 0xD4, 0x6C, 0xB2,
+0x71, 0xD0, 0xF6, 0x15, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x52, 0x8B, 0x40, 0xCA, 0x89, 0x5D,
+0x6A, 0xBB, 0xA7, 0x7B, 0x1B, 0x29, 0x04, 0xAE, 0xC2, 0xAF, 0xEC, 0xE0, 0x89, 0xB3, 0x66, 0xE3,
+0xAE, 0x16, 0xF1, 0xAD, 0x13, 0xD5, 0x8A, 0xA5, 0xC3, 0x48, 0xEA, 0xE0, 0x5B, 0xE7, 0xA3, 0x5B,
+0x7D, 0xDE, 0x36, 0x6B, 0x7A, 0xB5, 0x2A, 0x93, 0x9F, 0xC2, 0x65, 0x76, 0x89, 0xAF, 0x32, 0xE1,
+0x13, 0xF8, 0x8A, 0x34, 0xE7, 0xE4, 0xAE, 0x68, 0x5E, 0xB7, 0x20, 0x17, 0x9C, 0x90, 0x1E, 0xFB,
+0x6D, 0x1C, 0x58, 0xCD, 0xE4, 0xF1, 0x25, 0x92, 0x90, 0xD7, 0xFA, 0xDC, 0x25, 0x77, 0x22, 0xB1,
+0x3A, 0x8E, 0x7C, 0x7D, 0x17, 0x50, 0x61, 0x83, 0x04, 0x8B, 0x73, 0x30, 0x25, 0x50, 0x15, 0xE3,
+0x8F, 0x28, 0xF6, 0x7B, 0x1C, 0x26, 0xDE, 0x1C, 0x8B, 0x06, 0x49, 0xE2, 0x48, 0x98, 0x19, 0x18,
+0xC2, 0xD9, 0x1A, 0xB4, 0x6F, 0x98, 0x32, 0xA4, 0x73, 0xB9, 0xBD, 0x11, 0x7E, 0x75, 0xB3, 0x1B,
+0xCC, 0x82, 0xDB, 0x26, 0x49, 0x95, 0x0D, 0x4D, 0x31, 0x94, 0xDC, 0x73, 0xAE, 0xAD, 0x2B, 0x02,
+0x8A, 0x80, 0x22, 0x30, 0x1A, 0x10, 0x48, 0x39, 0xB1, 0xD3, 0x87, 0xCB, 0x68, 0x38, 0xED, 0xC9,
+0x3F, 0x06, 0x06, 0x4C, 0xAC, 0xDD, 0x71, 0xD0, 0xFC, 0xEE, 0xAD, 0xDD, 0x88, 0x0E, 0xED, 0x16,
+0xD2, 0x41, 0x52, 0x77, 0x03, 0x01, 0x05, 0x36, 0x88, 0xD5, 0x46, 0xB1, 0xFA, 0x20, 0x00, 0xAF,
+0x62, 0x79, 0xA5, 0xCD, 0xAA, 0x6D, 0xFC, 0x67, 0x6D, 0xAC, 0xFC, 0x67, 0x73, 0xBB, 0x59, 0x05,
+0xCF, 0xE6, 0x69, 0xF3, 0xCA, 0x96, 0x0F, 0x1C, 0xF0, 0xBF, 0xDB, 0x54, 0x22, 0x3E, 0xCD, 0x09,
+0x9B, 0xA0, 0x4A, 0x37, 0xA3, 0x96, 0xFE, 0x75, 0xA9, 0x29, 0x9F, 0xC5, 0x9A, 0xB8, 0x3B, 0x69,
+0x7E, 0x76, 0xFE, 0x75, 0x0C, 0x1A, 0xB1, 0x44, 0xD4, 0xFB, 0xD7, 0x85, 0x2A, 0xA5, 0x8F, 0x8E,
+0x8D, 0x46, 0xBA, 0xC6, 0xAA, 0x7A, 0xE2, 0x98, 0xE7, 0xD4, 0x49, 0x4B, 0x70, 0xA9, 0x50, 0x92,
+0xD4, 0xD1, 0xAC, 0x4C, 0x95, 0x8E, 0x81, 0x21, 0xEC, 0x2F, 0x09, 0x25, 0xE7, 0x69, 0x35, 0x15,
+0xE6, 0xAF, 0x1E, 0xB8, 0xD3, 0xAC, 0x98, 0x37, 0x15, 0xB5, 0x71, 0x73, 0x02, 0x9F, 0x3A, 0xAF,
+0x02, 0x26, 0x7F, 0x04, 0xE8, 0x1E, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x46, 0x02, 0x81,
+0x94, 0x13, 0xBB, 0x91, 0xE8, 0xA4, 0xEE, 0x33, 0x75, 0x08, 0xB4, 0x5F, 0xED, 0x34, 0xBB, 0x8E,
+0x9C, 0x12, 0xBF, 0xBA, 0x0D, 0xBB, 0x0E, 0x99, 0x7D, 0x27, 0xCF, 0x4A, 0x49, 0x2B, 0x44, 0x4C,
+0xA0, 0x06, 0x3D, 0x88, 0x1D, 0xF3, 0xD6, 0x05, 0x4A, 0x9B, 0x73, 0x8A, 0x13, 0xCE, 0x13, 0x9A,
+0x55, 0xA3, 0x29, 0x40, 0xFC, 0xE7, 0x68, 0xD5, 0x85, 0x44, 0xBF, 0xC7, 0xA7, 0x0E, 0xF1, 0xA6,
+0xCD, 0xCC, 0xCC, 0x2C, 0x11, 0xF5, 0x72, 0x50, 0x4A, 0x6C, 0xDA, 0xE4, 0xCA, 0x94, 0xE4, 0xAF,
+0x23, 0xDA, 0x2C, 0x25, 0xB6, 0xE7, 0xD8, 0x69, 0xA4, 0x75, 0xB1, 0xBE, 0x84, 0xAC, 0xAE, 0xE1,
+0x33, 0xCC, 0xF9, 0xC0, 0x10, 0x4F, 0xF4, 0xE2, 0xFB, 0x13, 0xD6, 0xC8, 0x75, 0x01, 0x22, 0x42,
+0x84, 0x6D, 0xB2, 0x61, 0x9F, 0x9B, 0x8E, 0x44, 0x95, 0x64, 0x8E, 0x66, 0x66, 0x76, 0x90, 0x29,
+0x65, 0x38, 0x51, 0xA9, 0x9B, 0x5B, 0x3F, 0xD1, 0xDC, 0x83, 0x7C, 0x75, 0xF7, 0xCC, 0x6C, 0x30,
+0x0D, 0xC8, 0x5D, 0xC7, 0x32, 0x6A, 0x3A, 0x29, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xDC, 0x1A,
+0x08, 0x28, 0xB1, 0xBB, 0x35, 0xCE, 0x73, 0x4A, 0x7A, 0x49, 0x73, 0x23, 0x0B, 0xDE, 0xBF, 0xF0,
+0xE6, 0x76, 0xF3, 0xE3, 0x55, 0x5B, 0xCD, 0x16, 0x94, 0x0F, 0x13, 0x42, 0x82, 0xFF, 0xAE, 0x5F,
+0xEB, 0x30, 0x5D, 0xD7, 0x3A, 0x25, 0x68, 0x22, 0x4A, 0xC2, 0x02, 0xA5, 0x2E, 0xF0, 0x41, 0x73,
+0x09, 0x8B, 0x23, 0x91, 0xA0, 0x89, 0x48, 0x5D, 0x50, 0x5A, 0xCB, 0xAF, 0xE7, 0xD2, 0x7F, 0xC4,
+0xA8, 0x5E, 0x62, 0xA6, 0xE4, 0x10, 0xBF, 0x01, 0x55, 0x6B, 0x9C, 0x69, 0x44, 0xD5, 0x85, 0xBC,
+0x14, 0x29, 0x76, 0xCC, 0xD7, 0xB7, 0x1F, 0x75, 0x71, 0x99, 0xCB, 0x4E, 0x54, 0x3A, 0xF4, 0xDB,
+0x47, 0xB7, 0xFA, 0x92, 0xB8, 0x3E, 0xD2, 0xC3, 0x9B, 0x4F, 0xED, 0x49, 0x72, 0x91, 0xC1, 0x01,
+0x0D, 0xB4, 0xA6, 0x55, 0xE2, 0x48, 0x85, 0x2E, 0x5B, 0x22, 0x5E, 0xB3, 0x4D, 0x2E, 0x66, 0x92,
+0x3B, 0x62, 0x7E, 0x15, 0x84, 0xB9, 0xFD, 0x6A, 0x87, 0xB4, 0x3F, 0x03, 0xE5, 0xD2, 0x3E, 0xBE,
+0x72, 0xB1, 0x79, 0xE2, 0xEE, 0x39, 0x66, 0x7C, 0x49, 0xA1, 0x35, 0xCD, 0x6A, 0x04, 0x6C, 0x4A,
+0xC6, 0xBF, 0xEE, 0x44, 0x11, 0x50, 0x04, 0x14, 0x81, 0xD1, 0x80, 0x80, 0x12, 0xBB, 0xD1, 0x70,
+0x16, 0xD2, 0xE0, 0x18, 0x68, 0xFE, 0x6B, 0x81, 0x3A, 0xB7, 0xA1, 0xF9, 0x90, 0x59, 0xD7, 0x7C,
+0xD0, 0xBC, 0xBD, 0xEF, 0x98, 0x39, 0x71, 0xFE, 0x22, 0x7A, 0xE6, 0xCC, 0xA9, 0x24, 0x17, 0x20,
+0x59, 0x99, 0x48, 0xC3, 0x21, 0x33, 0x48, 0x49, 0x26, 0x9C, 0xFD, 0x65, 0xF6, 0xCB, 0xA0, 0x2C,
+0x65, 0xC9, 0x32, 0xFE, 0xD6, 0x73, 0xCE, 0x82, 0x42, 0x95, 0x85, 0xE5, 0x32, 0x43, 0x89, 0x8B,
+0xCE, 0x24, 0x39, 0xF6, 0x77, 0x3F, 0x53, 0xD1, 0xCA, 0x72, 0x26, 0xDF, 0x0C, 0xA9, 0x36, 0x51,
+0x25, 0x81, 0x13, 0xC9, 0x1F, 0xF2, 0x0C, 0x96, 0x38, 0x7F, 0xF9, 0x0A, 0x92, 0x13, 0x5F, 0x82,
+0x52, 0x67, 0x95, 0x34, 0x51, 0xDA, 0x90, 0x5B, 0x4E, 0xFC, 0xE1, 0xF8, 0x57, 0x66, 0xEF, 0x1F,
+0x67, 0x09, 0x28, 0xFD, 0x00, 0x39, 0x7B, 0x9F, 0x39, 0x06, 0x44, 0x44, 0x67, 0xDB, 0x6F, 0x1B,
+0x08, 0x42, 0x81, 0x93, 0x2A, 0x1D, 0xD3, 0x9A, 0xD4, 0x22, 0xE9, 0xF2, 0xED, 0xA8, 0xFB, 0x7A,
+0xF7, 0x8C, 0x3A, 0xE4, 0xAA, 0x6B, 0x80, 0x5F, 0xDD, 0x14, 0x33, 0x83, 0x69, 0x5D, 0x72, 0x53,
+0x63, 0x76, 0x4E, 0x83, 0xE1, 0xAB, 0x5D, 0x50, 0x04, 0x14, 0x01, 0x45, 0x20, 0x6D, 0x10, 0xC0,
+0x4B, 0x7E, 0xD4, 0xAB, 0x3B, 0xB9, 0xFD, 0x52, 0xE5, 0x20, 0xB9, 0xF8, 0x8E, 0x64, 0xEB, 0x6D,
+0x20, 0x32, 0xBF, 0x5A, 0xF7, 0xAE, 0xF9, 0xF9, 0xDA, 0x6D, 0x66, 0x1F, 0x82, 0x26, 0xDA, 0x61,
+0x8A, 0xB4, 0x11, 0x9B, 0xF4, 0x0D, 0x73, 0x29, 0x4E, 0x82, 0xA1, 0x16, 0x17, 0x2A, 0xC0, 0x55,
+0xDC, 0xC1, 0x5B, 0xF5, 0xCA, 0x4E, 0xDC, 0x94, 0x86, 0xCC, 0x30, 0xC0, 0x82, 0x3F, 0x86, 0x21,
+0x14, 0xD1, 0x6D, 0x6C, 0xAE, 0x13, 0x8F, 0x00, 0xFD, 0xF7, 0x40, 0x90, 0x40, 0xE2, 0xA8, 0x68,
+0x65, 0x80, 0x44, 0x3D, 0xB5, 0x6C, 0xBE, 0xF9, 0xE2, 0x87, 0x57, 0x4A, 0xFA, 0x8F, 0x64, 0x4F,
+0x34, 0xC3, 0xAE, 0xDA, 0xB6, 0xD7, 0xFC, 0xC3, 0xF7, 0x5E, 0x04, 0xC1, 0xBB, 0x2A, 0x44, 0xAC,
+0xCB, 0xE5, 0xED, 0x8B, 0xF6, 0x3C, 0x9A, 0xB9, 0xC4, 0x7A, 0x0C, 0x46, 0x27, 0x46, 0xC4, 0x86,
+0x40, 0xF8, 0x8F, 0xDC, 0x86, 0x79, 0xF1, 0x3A, 0x61, 0xE2, 0xA5, 0x79, 0xB7, 0xBE, 0xB2, 0xD4,
+0xDC, 0x0F, 0x3F, 0xBA, 0x7B, 0x66, 0x4D, 0x31, 0x35, 0x15, 0x25, 0xA6, 0x02, 0x2A, 0x5D, 0x2D,
+0xD2, 0x9A, 0x14, 0xE6, 0xA5, 0xA6, 0xBA, 0x46, 0xB2, 0xB1, 0xD4, 0xF6, 0x15, 0x01, 0x45, 0x40,
+0x11, 0x50, 0x04, 0x06, 0x87, 0x40, 0xF2, 0xE5, 0x8B, 0xC1, 0x1D, 0x8F, 0xAE, 0x3D, 0xC6, 0x10,
+0xA0, 0xA9, 0xB1, 0xA5, 0xF5, 0x9C, 0x79, 0x73, 0xE7, 0x21, 0xB3, 0x66, 0xC7, 0x7E, 0xF3, 0xD6,
+0xFE, 0x63, 0xE6, 0xCC, 0xC5, 0x76, 0x38, 0xF0, 0xD3, 0xE4, 0xCA, 0xA4, 0xBC, 0x56, 0x59, 0xBA,
+0x01, 0x72, 0x65, 0xA0, 0xC6, 0xD9, 0x19, 0x3E, 0x5F, 0x9C, 0xA1, 0xBA, 0xF9, 0xCF, 0x19, 0x54,
+0xD7, 0xFC, 0xF2, 0xC8, 0xEF, 0x19, 0x5C, 0x27, 0xE1, 0x0C, 0xE5, 0x8A, 0xEA, 0x95, 0x9F, 0xD1,
+0x7E, 0xF4, 0x3B, 0x9C, 0xCF, 0x82, 0xDA, 0xAC, 0x93, 0xA0, 0xD6, 0xCD, 0x47, 0x6D, 0xD4, 0x82,
+0x14, 0x99, 0x61, 0x85, 0x7C, 0xA1, 0xFF, 0xC4, 0x80, 0x24, 0x4C, 0x54, 0xBB, 0x48, 0xFA, 0x12,
+0x5B, 0xFE, 0x2C, 0x4C, 0x67, 0x12, 0x04, 0x34, 0xB8, 0xE5, 0x96, 0xD1, 0x85, 0x49, 0x87, 0xD9,
+0x1E, 0x31, 0x64, 0x3B, 0x54, 0xF9, 0x4A, 0x0B, 0x72, 0xCD, 0x94, 0xAA, 0x32, 0xB3, 0x70, 0xEA,
+0x64, 0xD4, 0x7E, 0x6D, 0x40, 0x89, 0xB0, 0x46, 0xD4, 0x7F, 0x6D, 0x94, 0xCF, 0x0C, 0x10, 0x61,
+0x12, 0x62, 0x0D, 0x52, 0x1A, 0x63, 0x17, 0x92, 0x1E, 0xAE, 0x22, 0xA0, 0x08, 0x28, 0x02, 0xC3,
+0x84, 0x80, 0x2A, 0x76, 0xC3, 0x04, 0xE4, 0xAD, 0xDA, 0xCC, 0x85, 0xF6, 0xAB, 0xF0, 0xA9, 0xDB,
+0x01, 0xA5, 0xEE, 0x1D, 0x09, 0x9A, 0x38, 0x7B, 0xB9, 0x5D, 0x48, 0x09, 0x95, 0xBA, 0x80, 0x5C,
+0xF8, 0x88, 0xD0, 0x38, 0x4D, 0x2A, 0xC0, 0x2C, 0x4E, 0xC0, 0x4B, 0xA4, 0xDE, 0x71, 0x5D, 0x59,
+0x2D, 0x2A, 0xCC, 0x79, 0x41, 0x2B, 0x01, 0xF8, 0x0C, 0x22, 0xED, 0x02, 0xA9, 0xCA, 0x83, 0xA9,
+0xF2, 0x4F, 0xEF, 0x9C, 0x6D, 0x3E, 0xF7, 0xC4, 0xBD, 0x30, 0x4F, 0x4E, 0x4C, 0x89, 0x29, 0x96,
+0x66, 0xE9, 0x0D, 0x3B, 0x0F, 0x9A, 0xCF, 0xFE, 0xDB, 0xB3, 0xE6, 0xD4, 0x85, 0xCB, 0xB2, 0xCF,
+0xDE, 0xFA, 0xE4, 0x0F, 0x3D, 0x3E, 0xDD, 0x89, 0x58, 0x70, 0x9D, 0xC2, 0x49, 0xD5, 0x91, 0xE6,
+0x5D, 0x92, 0xBA, 0xF1, 0xC5, 0xF9, 0xA6, 0xA9, 0xBA, 0xC2, 0x2C, 0x9A, 0x5A, 0x6B, 0x16, 0x4F,
+0xAB, 0x43, 0x7E, 0xBA, 0x32, 0x31, 0x33, 0x57, 0x42, 0xA9, 0xA3, 0x1F, 0x61, 0xD0, 0x9E, 0xE6,
+0xA9, 0xBB, 0x55, 0x2F, 0x49, 0xED, 0xB7, 0x22, 0xA0, 0x08, 0xDC, 0xE2, 0x08, 0x28, 0xB1, 0xBB,
+0xC5, 0x07, 0xC0, 0x50, 0xBB, 0x7F, 0xBA, 0xED, 0xB2, 0xF9, 0xE6, 0x6F, 0xD6, 0x99, 0xE7, 0xD6,
+0x6D, 0x33, 0x97, 0x3A, 0x3B, 0x4D, 0x1E, 0xC8, 0x45, 0x26, 0xD5, 0x39, 0xCB, 0xC1, 0x7A, 0xA3,
+0x72, 0x43, 0xDD, 0xED, 0x80, 0xB6, 0x67, 0x34, 0x28, 0xD5, 0xBA, 0x27, 0xEF, 0x9D, 0x6F, 0xDE,
+0xBF, 0x74, 0x1E, 0x72, 0xD8, 0xE5, 0x0D, 0x68, 0xBB, 0xA1, 0xAE, 0x44, 0x65, 0x6D, 0xF7, 0xE1,
+0x93, 0xE6, 0x7F, 0xFC, 0xF0, 0x65, 0xB3, 0xF7, 0xF8, 0x99, 0xC1, 0x37, 0xC7, 0x40, 0x09, 0xF8,
+0xDA, 0xF9, 0xC4, 0xCA, 0xF4, 0xBB, 0x63, 0x54, 0x6F, 0x21, 0xD2, 0x96, 0x54, 0x95, 0x16, 0x9A,
+0x69, 0x08, 0x90, 0x20, 0xA9, 0xBB, 0x13, 0x73, 0x79, 0x71, 0x61, 0x4C, 0x5E, 0x3E, 0xEF, 0x59,
+0xA1, 0x8A, 0xDD, 0xE0, 0x61, 0xD7, 0x2D, 0x14, 0x01, 0x45, 0x40, 0x11, 0x48, 0x07, 0x04, 0x52,
+0x4A, 0xEC, 0xE4, 0x61, 0xAF, 0x11, 0x7A, 0xE9, 0x30, 0x6E, 0x82, 0x3E, 0x9C, 0x44, 0x65, 0x85,
+0x6F, 0xFE, 0x7A, 0x2D, 0xFC, 0xEA, 0x4E, 0x0B, 0x93, 0xCB, 0xCA, 0x0A, 0xBD, 0xC5, 0x46, 0x8A,
+0xD8, 0x71, 0xBF, 0x54, 0x0C, 0x27, 0x21, 0x21, 0xF1, 0x5D, 0xA8, 0x8F, 0x3A, 0x1F, 0x09, 0x7A,
+0xA9, 0x6C, 0xA5, 0x2A, 0xED, 0x07, 0x85, 0xB6, 0x73, 0x30, 0x47, 0xBF, 0xB4, 0xE9, 0x3D, 0xB3,
+0x76, 0xFB, 0x01, 0x73, 0x05, 0x51, 0xAB, 0x83, 0x99, 0x18, 0x30, 0x51, 0x80, 0xC0, 0x87, 0x5C,
+0x98, 0x8E, 0x73, 0x73, 0xC6, 0x49, 0x52, 0xE5, 0x1A, 0x10, 0xD4, 0x1A, 0xF4, 0xA7, 0x18, 0x89,
+0x86, 0x59, 0x41, 0xA3, 0xBC, 0x28, 0x1F, 0xA4, 0xAE, 0x40, 0x08, 0x5F, 0x74, 0x52, 0x42, 0x37,
+0x18, 0xA4, 0x75, 0x5D, 0x45, 0x40, 0x11, 0x50, 0x04, 0xD2, 0x0F, 0x01, 0x25, 0x76, 0xE9, 0x77,
+0x4E, 0x53, 0xDA, 0xA3, 0xB3, 0x17, 0xDA, 0x25, 0x68, 0x82, 0x01, 0x03, 0xF1, 0x11, 0xA7, 0x23,
+0x4A, 0xEC, 0x58, 0x69, 0xA2, 0xA2, 0xD4, 0x2C, 0x6E, 0xAA, 0x35, 0x95, 0x88, 0x86, 0x95, 0x7C,
+0x6F, 0x29, 0x9C, 0x68, 0x8E, 0x3D, 0x00, 0xB5, 0x6E, 0xE3, 0xCE, 0x16, 0x04, 0x92, 0x74, 0x0E,
+0x58, 0xB9, 0x24, 0x66, 0xC4, 0x91, 0xC4, 0x2E, 0x0F, 0x89, 0x87, 0x49, 0xEC, 0xCA, 0x8A, 0x0A,
+0x84, 0xA4, 0x4E, 0x2C, 0x2F, 0x91, 0xEF, 0x51, 0x2B, 0x6B, 0x7C, 0xEC, 0x93, 0x12, 0xBB, 0x14,
+0x9E, 0x64, 0xDD, 0x95, 0x22, 0xA0, 0x08, 0x28, 0x02, 0xA3, 0x10, 0x81, 0x94, 0x13, 0x3B, 0x55,
+0xED, 0x46, 0xE1, 0x28, 0x18, 0xC2, 0x21, 0x75, 0x5E, 0xEB, 0x32, 0xC7, 0xCE, 0xB4, 0x89, 0x0F,
+0xD8, 0x68, 0x22, 0x15, 0x24, 0x3F, 0xAC, 0x32, 0x51, 0x0E, 0x52, 0x94, 0x03, 0xF3, 0x70, 0xAA,
+0x5D, 0xCE, 0xE8, 0x17, 0x77, 0xF9, 0x4A, 0xA7, 0x28, 0x77, 0x52, 0x4E, 0x6D, 0x10, 0x13, 0x8F,
+0x95, 0xAA, 0x1D, 0xC9, 0x28, 0x4D, 0xB2, 0x54, 0x1A, 0xD9, 0x97, 0x3C, 0x90, 0x3A, 0x2E, 0x8B,
+0x92, 0xB9, 0xD1, 0x84, 0xF9, 0x20, 0xBA, 0xA8, 0xAB, 0x2A, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x24, 0x09, 0x01, 0x25, 0x76, 0x49, 0x02, 0x56, 0x9B, 0x55, 0x04, 0x92, 0x85, 0x80, 0x12, 0xBB,
+0x64, 0x21, 0xAB, 0xED, 0x2A, 0x02, 0x8A, 0x80, 0x22, 0x30, 0xF6, 0x11, 0x18, 0x11, 0x62, 0xE7,
+0x55, 0xBB, 0xB1, 0x0F, 0x9F, 0xF6, 0x40, 0x11, 0x48, 0x1D, 0x02, 0xAA, 0xCE, 0xA5, 0x0E, 0x6B,
+0xDD, 0x93, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x63, 0x15, 0x81, 0xD4, 0x3A, 0x1E, 0x8D, 0x55, 0x94,
+0xF4, 0xB8, 0x15, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x18, 0x03,
+0x08, 0x8C, 0x98, 0x62, 0x37, 0x06, 0xB0, 0xD1, 0x43, 0x54, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11,
+0x50, 0x04, 0x14, 0x01, 0x45, 0x60, 0x4C, 0x21, 0xA0, 0x8A, 0xDD, 0x98, 0x3A, 0x5D, 0x7A, 0xB0,
+0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xF4, 0x8E, 0x80, 0x12,
+0x3B, 0x1D, 0x1D, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xA4,
+0x09, 0x02, 0x4A, 0xEC, 0xD2, 0xE4, 0x44, 0x6A, 0x37, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04,
+0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x62, 0xA7, 0x63, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45,
+0x40, 0x11, 0x50, 0x04, 0x14, 0x81, 0x34, 0x41, 0x40, 0x89, 0x5D, 0x9A, 0x9C, 0x48, 0xED, 0x86,
+0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x4A, 0xEC, 0x74, 0x0C,
+0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0x90, 0x26, 0x08, 0x28,
+0xB1, 0x4B, 0x93, 0x13, 0xA9, 0xDD, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14,
+0x01, 0x45, 0x40, 0x89, 0x9D, 0x8E, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40,
+0x11, 0x50, 0x04, 0xD2, 0x04, 0x01, 0x25, 0x76, 0x69, 0x72, 0x22, 0xB5, 0x1B, 0x8A, 0x80, 0x22,
+0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0xB1, 0xD3, 0x31, 0xA0, 0x08, 0x28,
+0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x40, 0x9A, 0x20, 0xA0, 0xC4, 0x2E, 0x4D,
+0x4E, 0xA4, 0x76, 0x43, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01,
+0x25, 0x76, 0x3A, 0x06, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11,
+0x48, 0x13, 0x04, 0x94, 0xD8, 0xA5, 0xC9, 0x89, 0xD4, 0x6E, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0,
+0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0xC4, 0x4E, 0xC7, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02,
+0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x69, 0x82, 0x80, 0x12, 0xBB, 0x34, 0x39, 0x91, 0xDA,
+0x0D, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x94, 0xD8, 0xE9,
+0x18, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x20, 0x4D, 0x10,
+0x50, 0x62, 0x97, 0x26, 0x27, 0x52, 0xBB, 0xA1, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x28, 0x02, 0x8A, 0x80, 0x12, 0x3B, 0x1D, 0x03, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A,
+0x80, 0x22, 0xA0, 0x08, 0xA4, 0x09, 0x02, 0x4A, 0xEC, 0xD2, 0xE4, 0x44, 0x6A, 0x37, 0x14, 0x01,
+0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x62, 0xA7, 0x63, 0x40, 0x11,
+0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x81, 0x34, 0x41, 0x40, 0x89, 0x5D,
+0x9A, 0x9C, 0x48, 0xED, 0x86, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28,
+0x02, 0x4A, 0xEC, 0x74, 0x0C, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80,
+0x22, 0x90, 0x26, 0x08, 0x28, 0xB1, 0x4B, 0x93, 0x13, 0xA9, 0xDD, 0x50, 0x04, 0x14, 0x01, 0x45,
+0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x89, 0x9D, 0x8E, 0x01, 0x45, 0x40, 0x11, 0x50,
+0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0xD2, 0x04, 0x01, 0x25, 0x76, 0x69, 0x72, 0x22,
+0xB5, 0x1B, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0xB1,
+0xD3, 0x31, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x40, 0x9A,
+0x20, 0xA0, 0xC4, 0x2E, 0x4D, 0x4E, 0xA4, 0x76, 0x43, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40,
+0x11, 0x50, 0x04, 0x14, 0x01, 0x25, 0x76, 0x3A, 0x06, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04,
+0x14, 0x01, 0x45, 0x40, 0x11, 0x48, 0x13, 0x04, 0x94, 0xD8, 0xA5, 0xC9, 0x89, 0xD4, 0x6E, 0x28,
+0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0xC4, 0x4E, 0xC7, 0x80,
+0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x69, 0x82, 0x80, 0x12,
+0xBB, 0x34, 0x39, 0x91, 0xDA, 0x0D, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11,
+0x50, 0x04, 0x94, 0xD8, 0xE9, 0x18, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14,
+0x01, 0x45, 0x20, 0x4D, 0x10, 0x50, 0x62, 0x97, 0x26, 0x27, 0x52, 0xBB, 0xA1, 0x08, 0x28, 0x02,
+0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x12, 0x3B, 0x1D, 0x03, 0x8A, 0x80, 0x22,
+0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0xA4, 0x09, 0x02, 0x4A, 0xEC, 0xD2, 0xE4,
+0x44, 0x6A, 0x37, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50,
+0x62, 0xA7, 0x63, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x81,
+0x34, 0x41, 0x40, 0x89, 0x5D, 0x9A, 0x9C, 0x48, 0xED, 0x86, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A,
+0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x4A, 0xEC, 0x74, 0x0C, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0,
+0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0x90, 0x26, 0x08, 0x28, 0xB1, 0x4B, 0x93, 0x13, 0xA9, 0xDD,
+0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x89, 0x9D, 0x8E,
+0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0xD2, 0x04, 0x01,
+0x25, 0x76, 0x69, 0x72, 0x22, 0xB5, 0x1B, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80,
+0x22, 0xA0, 0x08, 0x28, 0xB1, 0xD3, 0x31, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08,
+0x28, 0x02, 0x8A, 0x40, 0x9A, 0x20, 0xA0, 0xC4, 0x2E, 0x4D, 0x4E, 0xA4, 0x76, 0x43, 0x11, 0x50,
+0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x25, 0x76, 0x3A, 0x06, 0x14, 0x01,
+0x45, 0x40, 0x11, 0x50, 0x04, 0x14, 0x01, 0x45, 0x40, 0x11, 0x48, 0x13, 0x04, 0x94, 0xD8, 0xA5,
+0xC9, 0x89, 0xD4, 0x6E, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22,
+0xA0, 0xC4, 0x4E, 0xC7, 0x80, 0x22, 0xA0, 0x08, 0x28, 0x02, 0x8A, 0x80, 0x22, 0xA0, 0x08, 0x28,
+0x02, 0x69, 0x82, 0xC0, 0xFF, 0x07, 0xC8, 0x95, 0xBB, 0x50, 0xD6, 0xE3, 0x27, 0x57, 0x00, 0x00,
+0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+
+
+
+#endif /** DATA_TRANSFER_H_ **/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..a58b95cad
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,519 @@
+/**
+ ******************************************************************************
+ * File Name : Target/hw_ipcc.c
+ * Description : Hardware IPCC source file for STM32WPAN Middleware.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+#include "mbox_def.h"
+
+/* Global variables ---------------------------------------------------------*/
+/* Private defines -----------------------------------------------------------*/
+#define HW_IPCC_TX_PENDING( channel ) ( !(LL_C1_IPCC_IsActiveFlag_CHx( IPCC, channel )) ) && (((~(IPCC->C1MR)) & (channel << 16U)))
+#define HW_IPCC_RX_PENDING( channel ) (LL_C2_IPCC_IsActiveFlag_CHx( IPCC, channel )) && (((~(IPCC->C1MR)) & (channel << 0U)))
+
+/* Private macros ------------------------------------------------------------*/
+/* Private typedef -----------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static void (*FreeBufCb)( void );
+
+/* Private function prototypes -----------------------------------------------*/
+static void HW_IPCC_BLE_EvtHandler( void );
+static void HW_IPCC_BLE_AclDataEvtHandler( void );
+static void HW_IPCC_MM_FreeBufHandler( void );
+static void HW_IPCC_SYS_CmdEvtHandler( void );
+static void HW_IPCC_SYS_EvtHandler( void );
+static void HW_IPCC_TRACES_EvtHandler( void );
+
+#ifdef THREAD_WB
+static void HW_IPCC_OT_CmdEvtHandler( void );
+static void HW_IPCC_THREAD_NotEvtHandler( void );
+static void HW_IPCC_THREAD_CliNotEvtHandler( void );
+#endif
+
+#ifdef MAC_802_15_4_WB
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void );
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
+#endif
+
+#ifdef ZIGBEE_WB
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
+#endif
+
+/* Public function definition -----------------------------------------------*/
+
+/******************************************************************************
+ * INTERRUPT HANDLER
+ ******************************************************************************/
+void HW_IPCC_Rx_Handler( void )
+{
+ if (HW_IPCC_RX_PENDING( HW_IPCC_SYSTEM_EVENT_CHANNEL ))
+ {
+ HW_IPCC_SYS_EvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_NotEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_NotEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ {
+ HW_IPCC_THREAD_CliNotEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackNotifEvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
+ {
+ HW_IPCC_BLE_EvtHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_TRACES_CHANNEL ))
+ {
+ HW_IPCC_TRACES_EvtHandler();
+ }
+
+ return;
+}
+
+void HW_IPCC_Tx_Handler( void )
+{
+ if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+#ifdef MAC_802_15_4_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_MAC_802_15_4_CmdEvtHandler();
+ }
+#endif /* MAC_802_15_4_WB */
+#ifdef THREAD_WB
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_OT_CmdEvtHandler();
+ }
+#endif /* THREAD_WB */
+#ifdef ZIGBEE_WB
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
+ {
+ HW_IPCC_ZIGBEE_CmdEvtHandler();
+ }
+#endif /* ZIGBEE_WB */
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_SYSTEM_CMD_RSP_CHANNEL ))
+ {
+ HW_IPCC_SYS_CmdEvtHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ))
+ {
+ HW_IPCC_MM_FreeBufHandler();
+ }
+ else if (HW_IPCC_TX_PENDING( HW_IPCC_HCI_ACL_DATA_CHANNEL ))
+ {
+ HW_IPCC_BLE_AclDataEvtHandler();
+ }
+
+ return;
+}
+/******************************************************************************
+ * GENERAL
+ ******************************************************************************/
+void HW_IPCC_Enable( void )
+{
+ /**
+ * When the device is out of standby, it is required to use the EXTI mechanism to wakeup CPU2
+ */
+ LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
+ LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
+
+ /**
+ * In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
+ * In that case, to keep the mechanism transparent to the user application, it shall call the system command
+ * SHCI_C2_Reinit( ) before jumping to the application.
+ * When the CPU2 receives that command, it waits for its event input to be set to restart the CPU2 firmware.
+ * This is required because once C2BOOT has been set once, a clear/set on C2BOOT has no effect.
+ * When SHCI_C2_Reinit( ) is not called, generating an event to the CPU2 does not have any effect
+ * So, by default, the application shall both set the event flag and set the C2BOOT bit.
+ */
+ __SEV( ); /* Set the internal event flag and send an event to the CPU2 */
+ __WFE( ); /* Clear the internal event flag */
+ LL_PWR_EnableBootC2( );
+
+ return;
+}
+
+void HW_IPCC_Init( void )
+{
+ LL_AHB3_GRP1_EnableClock( LL_AHB3_GRP1_PERIPH_IPCC );
+
+ LL_C1_IPCC_EnableIT_RXO( IPCC );
+ LL_C1_IPCC_EnableIT_TXF( IPCC );
+
+ HAL_NVIC_EnableIRQ(IPCC_C1_RX_IRQn);
+ HAL_NVIC_EnableIRQ(IPCC_C1_TX_IRQn);
+
+ return;
+}
+
+/******************************************************************************
+ * BLE
+ ******************************************************************************/
+void HW_IPCC_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_BLE_CMD_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_EvtHandler( void )
+{
+ HW_IPCC_BLE_RxEvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_BLE_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_BLE_SendAclData( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_BLE_AclDataEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_HCI_ACL_DATA_CHANNEL );
+
+ HW_IPCC_BLE_AclDataAckNot();
+
+ return;
+}
+
+__weak void HW_IPCC_BLE_AclDataAckNot( void ){};
+__weak void HW_IPCC_BLE_RxEvtNot( void ){};
+
+/******************************************************************************
+ * SYSTEM
+ ******************************************************************************/
+void HW_IPCC_SYS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_SYS_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_SYS_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL );
+
+ HW_IPCC_SYS_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_SYS_EvtHandler( void )
+{
+ HW_IPCC_SYS_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_SYSTEM_EVENT_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_SYS_CmdEvtNot( void ){};
+__weak void HW_IPCC_SYS_EvtNot( void ){};
+
+/******************************************************************************
+ * MAC 802.15.4
+ ******************************************************************************/
+#ifdef MAC_802_15_4_WB
+void HW_IPCC_MAC_802_15_4_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_MAC_802_15_4_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MAC_802_15_4_CMD_RSP_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_MAC_802_15_4_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_MAC_802_15_4_EvtNot();
+
+ return;
+}
+__weak void HW_IPCC_MAC_802_15_4_CmdEvtNot( void ){};
+__weak void HW_IPCC_MAC_802_15_4_EvtNot( void ){};
+#endif
+
+/******************************************************************************
+ * THREAD
+ ******************************************************************************/
+#ifdef THREAD_WB
+void HW_IPCC_THREAD_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_OT_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_CLI_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_SendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_THREAD_CliSendAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_OT_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+
+ HW_IPCC_OT_CmdEvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_NotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_EvtNot();
+
+ return;
+}
+
+static void HW_IPCC_THREAD_CliNotEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+
+ HW_IPCC_THREAD_CliEvtNot();
+
+ return;
+}
+
+__weak void HW_IPCC_OT_CmdEvtNot( void ){};
+__weak void HW_IPCC_CLI_CmdEvtNot( void ){};
+__weak void HW_IPCC_THREAD_EvtNot( void ){};
+
+#endif /* THREAD_WB */
+
+/******************************************************************************
+ * ZIGBEE
+ ******************************************************************************/
+#ifdef ZIGBEE_WB
+void HW_IPCC_ZIGBEE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+
+ return;
+}
+
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+
+ return;
+}
+
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+
+ return;
+}
+
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
+#endif /* ZIGBEE_WB */
+
+
+/******************************************************************************
+ * MEMORY MANAGER
+ ******************************************************************************/
+void HW_IPCC_MM_SendFreeBuf( void (*cb)( void ) )
+{
+ if ( LL_C1_IPCC_IsActiveFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL ) )
+ {
+ FreeBufCb = cb;
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+ else
+ {
+ cb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+ }
+
+ return;
+}
+
+static void HW_IPCC_MM_FreeBufHandler( void )
+{
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ FreeBufCb();
+
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_MM_RELEASE_BUFFER_CHANNEL );
+
+ return;
+}
+
+/******************************************************************************
+ * TRACES
+ ******************************************************************************/
+void HW_IPCC_TRACES_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+static void HW_IPCC_TRACES_EvtHandler( void )
+{
+ HW_IPCC_TRACES_EvtNot();
+
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_TRACES_CHANNEL );
+
+ return;
+}
+
+__weak void HW_IPCC_TRACES_EvtNot( void ){};
+
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.cproject b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.cproject
new file mode 100644
index 000000000..baa07261d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.cproject
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.928801775">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.928801775" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.928801775" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot; &amp;&amp; arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;">
+ <folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.928801775." name="/" resourcePath="">
+ <toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.1272664120" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
+ <option id="fr.ac6.managedbuild.option.gnu.cross.prefix.26416013" name="Prefix" superClass="fr.ac6.managedbuild.option.gnu.cross.prefix" value="arm-none-eabi-" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.mcu.315035259" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32WB55CGUx" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.board.529437081" name="Board" superClass="fr.ac6.managedbuild.option.gnu.cross.board" value="P-NUCLEO-WB55-USBDONGLE" valueType="string"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.core.1083960614" name="Core" superClass="fr.ac6.managedbuild.option.gnu.cross.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="ARM Cortex-M4"/>
+ <listOptionValue builtIn="false" value="CM4"/>
+ </option>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.instructionSet.217848361" name="Instruction Set" superClass="fr.ac6.managedbuild.option.gnu.cross.instructionSet" value="fr.ac6.managedbuild.option.gnu.cross.instructionSet.thumbII" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.fpu.1483427207" name="Floating point hardware" superClass="fr.ac6.managedbuild.option.gnu.cross.fpu" value="fr.ac6.managedbuild.option.gnu.cross.fpu.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="fr.ac6.managedbuild.option.gnu.cross.floatabi.1541303478" name="Floating-point ABI" superClass="fr.ac6.managedbuild.option.gnu.cross.floatabi" value="fr.ac6.managedbuild.option.gnu.cross.floatabi.hard" valueType="enumerated"/>
+ <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="fr.ac6.managedbuild.targetPlatform.gnu.cross.88882702" isAbstract="false" osList="all" superClass="fr.ac6.managedbuild.targetPlatform.gnu.cross"/>
+ <builder buildPath="${workspace_loc:/STM32WBxx_USBD_Thread_Coap_DataTransfer}/Debug" id="fr.ac6.managedbuild.builder.gnu.cross.765229814" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="fr.ac6.managedbuild.builder.gnu.cross">
+ <outputEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="outputPath" name="Debug"/>
+ </outputEntries>
+ </builder>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.132808064" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.277583965" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.debugging.level.894060934" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.2127090488" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle/"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/Target"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.497021948" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_USB_DONGLE"/>
+ <listOptionValue builtIn="false" value="THREAD_WB"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="ST_OT_DEBUG"/>
+ <listOptionValue builtIn="false" value="FRAMEWORK_1"/>
+ <listOptionValue builtIn="false" value="OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other.653352069" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1012558296" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.1153447973" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.2073796719" name="MCU G++ Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler">
+ <option defaultValue="gnu.cpp.optimization.level.none" id="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level.2043713109" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.cpp.optimization.level.size" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.debugging.level.1280559282" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.1180146728" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle/"/>
+ <listOptionValue builtIn="false" value="../../../Core/Inc"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/App"/>
+ <listOptionValue builtIn="false" value="../../../STM32_WPAN/Target"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/stack/include/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/thread/openthread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/utilities"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/lpm/tiny_lpm"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Utilities/sequencer"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc"/>
+ <listOptionValue builtIn="false" value="../../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.53586839" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="CORE_CM4"/>
+ <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
+ <listOptionValue builtIn="false" value="USE_STM32WBXX_USB_DONGLE"/>
+ <listOptionValue builtIn="false" value="THREAD_WB"/>
+ <listOptionValue builtIn="false" value="STM32WB55xx"/>
+ <listOptionValue builtIn="false" value="ST_OT_DEBUG"/>
+ <listOptionValue builtIn="false" value="FRAMEWORK_1"/>
+ <listOptionValue builtIn="false" value="OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_ftd.h&gt;"/>
+ </option>
+ <option id="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other.220537822" name="Other flags" superClass="fr.ac6.managedbuild.gnu.cpp.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0" valueType="string"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp.474159257" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.cpp"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s.1701576033" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.compiler.input.s"/>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.974032214" name="MCU GCC Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script.2015729868" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.c.link.option.libs.776632837" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
+ <option id="gnu.c.link.option.paths.14754055" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
+ <option id="gnu.c.link.option.ldflags.855924837" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.c.link.option.other.385117863" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.linker.input.119129069" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.531576294" name="MCU G++ Linker" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker">
+ <option id="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script.1958067015" name="Linker Script (-T)" superClass="fr.ac6.managedbuild.tool.gnu.cross.cpp.linker.script" value="../stm32wb55xx_flash_cm4.ld" valueType="string"/>
+ <option id="gnu.cpp.link.option.libs.1752570690" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
+ <option id="gnu.cpp.link.option.paths.136526736" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
+ <option id="gnu.cpp.link.option.flags.473827213" name="Linker flags" superClass="gnu.cpp.link.option.flags" value="-specs=nosys.specs -specs=nano.specs" valueType="string"/>
+ <option id="gnu.cpp.link.option.other.540541776" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other" useByScannerDiscovery="false"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2084862988" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool id="fr.ac6.managedbuild.tool.gnu.archiver.1796439964" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
+ <tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.1711616092" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
+ <option id="gnu.both.asm.option.include.paths.503230724" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.882537934" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ <inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.103784330" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="STM32WBxx_USBD_Thread_Coap_DataTransfer.fr.ac6.managedbuild.target.gnu.cross.exe.688355347" name="Executable" projectType="fr.ac6.managedbuild.target.gnu.cross.exe"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="fr.ac6.managedbuild.config.gnu.cross.exe.debug.928801775;fr.ac6.managedbuild.config.gnu.cross.exe.debug.928801775.;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.132808064;fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1012558296">
+ <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration artifactName="${ProjName}" configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="STM32WBxx_USBD_Thread_Coap_DataTransfer"/>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+</cproject>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.project b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.project
index a2e902f8a..1b761bfd7 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingDemo/SW4STM32/Lighting_Node/.project
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/.project
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><projectDescription>
- <name>Lighting_Node</name>
+ <name>STM32WBxx_USBD_Thread_Coap_DataTransfer</name>
<comment/>
<projects>
</projects>
@@ -18,6 +18,7 @@
</buildCommand>
</buildSpec>
<natures>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
@@ -35,184 +36,144 @@
</link>
<link>
- <name>Application/Core/app_debug.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/Core/Src/app_debug.c</location>
- </link>
- <link>
- <name>Application/Core/app_entry.c</name>
+ <name>Application/User/Core/src/app_entry.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Core/Src/app_entry.c</location>
</link>
<link>
- <name>Application/Core/hw_flash.c</name>
+ <name>Application/User/Core/src/stm32_lpm_if.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/Core/Src/hw_flash.c</location>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</location>
</link>
<link>
- <name>Application/Core/hw_timerserver.c</name>
+ <name>Application/User/Core/src/hw_timerserver.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Core/Src/hw_timerserver.c</location>
</link>
<link>
- <name>Application/Core/hw_uart.c</name>
+ <name>Application/User/Core/src/hw_uart.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Core/Src/hw_uart.c</location>
</link>
<link>
- <name>Application/Core/lp_timer.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/Core/Src/lp_timer.c</location>
- </link>
- <link>
- <name>Application/Core/main.c</name>
+ <name>Application/User/Core/src/main.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Core/Src/main.c</location>
</link>
<link>
- <name>Application/Core/stm32_lpm_if.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/Core/Src/stm32_lpm_if.c</location>
- </link>
- <link>
- <name>Application/Core/stm32wbxx_it.c</name>
+ <name>Application/User/Core/src/stm32wbxx_it.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Core/Src/stm32wbxx_it.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/app_ble.c</name>
+ <name>Application/User/Core/src/stm_logging.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/app_ble.c</location>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/stm_logging.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/appli_config_client.c</name>
+ <name>Application/User/Core/src/system_stm32wbxx.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_config_client.c</location>
- </link>
- <link>
- <name>Application/STM32_WPAN/app/appli_generic.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_generic.c</location>
- </link>
- <link>
- <name>Application/STM32_WPAN/app/appli_generic_client.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_generic_client.c</location>
- </link>
- <link>
- <name>Application/STM32_WPAN/app/appli_light.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light.c</location>
- </link>
- <link>
- <name>Application/STM32_WPAN/app/appli_light_client.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light_client.c</location>
- </link>
- <link>
- <name>Application/STM32_WPAN/app/appli_light_lc.c</name>
- <type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_light_lc.c</location>
+ <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/appli_mesh.c</name>
+ <name>Application/User/STM32_WPAN/app/app_thread.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_mesh.c</location>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/App/app_thread.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/appli_nvm.c</name>
+ <name>Application/User/STM32_WPAN/target/hw_ipcc.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_nvm.c</location>
+ <location>PARENT-2-PROJECT_LOC/STM32_WPAN/Target/hw_ipcc.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/appli_sensor.c</name>
+ <name>Doc/readme.txt</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_sensor.c</location>
+ <location>PARENT-2-PROJECT_LOC/readme.txt</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/appli_vendor.c</name>
+ <name>Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/appli_vendor.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/models_if.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/models_if.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/pal_nvm.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/pal_nvm.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/PWM_config.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_config.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/app/PWM_handlers.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/app/PWM_handlers.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</location>
</link>
<link>
- <name>Application/STM32_WPAN/target/hw_ipcc.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/STM32_WPAN/target/hw_ipcc.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</location>
</link>
<link>
- <name>Doc/readme.txt</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/readme.txt</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
</link>
<link>
- <name>Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_ipcc.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/BSP/P-NUCLEO-WB55.USBDongle/stm32wbxx_usb_dongle.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_ipcc.c</location>
</link>
<link>
- <name>Drivers/CMSIS/system_stm32wbxx.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
<type>1</type>
- <location>PARENT-2-PROJECT_LOC/Core/Src/system_stm32wbxx.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_cortex.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_cortex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_dma.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_dma.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_flash_ex.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_flash_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_gpio.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_gpio.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_i2c_ex.c</name>
+ <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_ll_usb.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_i2c_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</location>
</link>
<link>
<name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pcd.c</name>
@@ -225,219 +186,214 @@
<location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pcd_ex.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr.c</name>
- <type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr.c</location>
- </link>
- <link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_pwr_ex.c</name>
+ <name>Middlewares/STM32_USB_Device_Library/Class/CDC/usbd_cdc.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pwr_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc.c</name>
+ <name>Middlewares/STM32_USB_Device_Library/Core/usbd_core.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rcc_ex.c</name>
+ <name>Middlewares/STM32_USB_Device_Library/Core/usbd_ctlreq.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rcc_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc.c</name>
+ <name>Middlewares/STM32_USB_Device_Library/Core/usbd_ioreq.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_rtc_ex.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_rtc_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_tim_ex.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_tim_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_hal_uart_ex.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_uart_ex.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_thread_hci.c</location>
</link>
<link>
- <name>Drivers/STM32WBxx_HAL_Driver/stm32wbxx_ll_usb.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_ll_usb.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</location>
</link>
<link>
- <name>Middlewares/STM32_USB_Device_Library/usbd_cdc.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</location>
</link>
<link>
- <name>Middlewares/STM32_USB_Device_Library/usbd_core.c</name>
+ <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</location>
</link>
<link>
- <name>Middlewares/STM32_USB_Device_Library/usbd_ctlreq.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_manager.c</location>
</link>
<link>
- <name>Middlewares/STM32_USB_Device_Library/usbd_ioreq.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/channel_monitor.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/common.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/child_supervision.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/config_client.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/coap.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/generic.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/commissioner.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/generic_client.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/crypto.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/light_client.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dataset_ftd.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_client.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/mesh.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dhcp6_server.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/mesh_cfg.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/diag.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/sensors.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/dns.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/icmp6.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/time_scene.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/time_scene.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/instance.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/blesvc/vendor.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/ip6.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/core/ble_gap_aci.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/core/ble_gatt_aci.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/joiner.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/core/ble_hal_aci.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/link.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/core/ble_hci_le.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/link_raw.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/core/ble_l2cap_aci.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/message.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/message.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/ble/core/osal.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/netdata.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/network_time.cpp</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/hci_tl_if.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/server.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/server.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl_if.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/tasklet.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_conf.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/thread_ftd.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/usbd_desc.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/udp.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</name>
+ <name>Middlewares/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp/vcp.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/radio.c</location>
</link>
<link>
<name>Middlewares/STM32_WPAN/utilities/dbg_trace.c</name>
@@ -450,24 +406,24 @@
<location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/otp.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/utilities/stm32_lpm.c</name>
+ <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/utilities/stm32_seq.c</name>
+ <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
+ <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/utilities/stm_list.c</name>
+ <name>Utilities/stm32_lpm.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_list.c</location>
+ <location>PARENT-7-PROJECT_LOC/Utilities/lpm/tiny_lpm/stm32_lpm.c</location>
</link>
<link>
- <name>Middlewares/STM32_WPAN/utilities/stm_queue.c</name>
+ <name>Utilities/stm32_seq.c</name>
<type>1</type>
- <location>PARENT-7-PROJECT_LOC/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</location>
+ <location>PARENT-7-PROJECT_LOC/Utilities/sequencer/stm32_seq.c</location>
</link>
</linkedResources>
</projectDescription> \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld
new file mode 100644
index 000000000..a9ccd801e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/STM32WBxx_USBD_Thread_Coap_DataTransfer/stm32wb55xx_flash_cm4.ld
@@ -0,0 +1,187 @@
+/**
+*****************************************************************************
+**
+** File : stm32wb55xx_flash_cm4.ld
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed ā€œas is,ā€ without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+/* Highest address of the user mode stack */
+_estack = 0x20030000; /* end of RAM */
+/* Generate a link error if heap and stack don't fit into RAM */
+_Min_Heap_Size = 0x400; /* required amount of heap */
+_Min_Stack_Size = 0x1000; /* required amount of stack */
+
+/* Specify the memory areas */
+MEMORY
+{
+FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
+RAM1 (xrw) : ORIGIN = 0x20000004, LENGTH = 0x2FFFC
+RAM_SHARED (xrw) : ORIGIN = 0x20030000, LENGTH = 10K
+}
+
+/* Define output sections */
+SECTIONS
+{
+ /* The startup code goes first into FLASH */
+ .isr_vector :
+ {
+ . = ALIGN(4);
+ KEEP(*(.isr_vector)) /* Startup code */
+ . = ALIGN(4);
+ } >FLASH
+
+ /* The program code and other data goes into FLASH */
+ .text :
+ {
+ . = ALIGN(4);
+ *(.text) /* .text sections (code) */
+ *(.text*) /* .text* sections (code) */
+ *(.glue_7) /* glue arm to thumb code */
+ *(.glue_7t) /* glue thumb to arm code */
+ *(.eh_frame)
+
+ KEEP (*(.init))
+ KEEP (*(.fini))
+
+ . = ALIGN(4);
+ _etext = .; /* define a global symbols at end of code */
+ } >FLASH
+
+ /* Constant data goes into FLASH */
+ .rodata :
+ {
+ . = ALIGN(4);
+ *(.rodata) /* .rodata sections (constants, strings, etc.) */
+ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
+ . = ALIGN(4);
+ } >FLASH
+
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
+ .ARM : {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array*))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)))
+ KEEP (*(.fini_array*))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH
+
+ /* used by the startup to initialize data */
+ _sidata = LOADADDR(.data);
+
+ /* Initialized data sections goes into RAM, load LMA copy after code */
+ .data :
+ {
+ . = ALIGN(4);
+ _sdata = .; /* create a global symbol at data start */
+ *(.data) /* .data sections */
+ *(.data*) /* .data* sections */
+
+ . = ALIGN(4);
+ _edata = .; /* define a global symbol at data end */
+ } >RAM1 AT> FLASH
+
+
+ /* Uninitialized data section */
+ . = ALIGN(4);
+ .bss :
+ {
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .; /* define a global symbol at bss start */
+ __bss_start__ = _sbss;
+ *(.bss)
+ *(.bss*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ _ebss = .; /* define a global symbol at bss end */
+ __bss_end__ = _ebss;
+ } >RAM1
+
+ /* User_heap_stack section, used to check that there is enough RAM left */
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE ( end = . );
+ PROVIDE ( _end = . );
+ . = . + _Min_Heap_Size;
+ . = . + _Min_Stack_Size;
+ . = ALIGN(8);
+ } >RAM1
+
+
+
+ /* Remove information from the standard libraries */
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 : { *(.ARM.attributes) }
+ MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
+ MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
+ MB_MEM2 : { *(MB_MEM2) } >RAM_SHARED
+}
+
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..023c1b016
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/startup_stm32wb55xx_cm4.s
@@ -0,0 +1,427 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32wb55xx_cm4.s
+ * @author MCD Application Team
+ * @brief STM32WB55xx devices vector table GCC toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M4 processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m4
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr r0, =_estack
+ mov sp, r0 /* set stack pointer */
+
+/* Copy the data segment initializers from flash to SRAM */
+ ldr r0, =_sdata
+ ldr r1, =_edata
+ ldr r2, =_sidata
+ movs r3, #0
+ b LoopCopyDataInit
+
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+
+/* Zero fill the bss segment. */
+ ldr r2, =_sbss
+ ldr r4, =_ebss
+ movs r3, #0
+ b LoopFillZerobss
+
+FillZerobss:
+ str r3, [r2]
+ adds r2, r2, #4
+
+LoopFillZerobss:
+ cmp r2, r4
+ bcc FillZerobss
+
+/* Call the clock system intitialization function.*/
+ bl SystemInit
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application s entry point.*/
+ bl main
+
+LoopForever:
+ b LoopForever
+
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ *
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex-M4. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+ .word WWDG_IRQHandler
+ .word PVD_PVM_IRQHandler
+ .word TAMP_STAMP_LSECSS_IRQHandler
+ .word RTC_WKUP_IRQHandler
+ .word FLASH_IRQHandler
+ .word RCC_IRQHandler
+ .word EXTI0_IRQHandler
+ .word EXTI1_IRQHandler
+ .word EXTI2_IRQHandler
+ .word EXTI3_IRQHandler
+ .word EXTI4_IRQHandler
+ .word DMA1_Channel1_IRQHandler
+ .word DMA1_Channel2_IRQHandler
+ .word DMA1_Channel3_IRQHandler
+ .word DMA1_Channel4_IRQHandler
+ .word DMA1_Channel5_IRQHandler
+ .word DMA1_Channel6_IRQHandler
+ .word DMA1_Channel7_IRQHandler
+ .word ADC1_IRQHandler
+ .word USB_HP_IRQHandler
+ .word USB_LP_IRQHandler
+ .word C2SEV_PWR_C2H_IRQHandler
+ .word COMP_IRQHandler
+ .word EXTI9_5_IRQHandler
+ .word TIM1_BRK_IRQHandler
+ .word TIM1_UP_TIM16_IRQHandler
+ .word TIM1_TRG_COM_TIM17_IRQHandler
+ .word TIM1_CC_IRQHandler
+ .word TIM2_IRQHandler
+ .word PKA_IRQHandler
+ .word I2C1_EV_IRQHandler
+ .word I2C1_ER_IRQHandler
+ .word I2C3_EV_IRQHandler
+ .word I2C3_ER_IRQHandler
+ .word SPI1_IRQHandler
+ .word SPI2_IRQHandler
+ .word USART1_IRQHandler
+ .word LPUART1_IRQHandler
+ .word SAI1_IRQHandler
+ .word TSC_IRQHandler
+ .word EXTI15_10_IRQHandler
+ .word RTC_Alarm_IRQHandler
+ .word CRS_IRQHandler
+ .word PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .word IPCC_C1_RX_IRQHandler
+ .word IPCC_C1_TX_IRQHandler
+ .word HSEM_IRQHandler
+ .word LPTIM1_IRQHandler
+ .word LPTIM2_IRQHandler
+ .word LCD_IRQHandler
+ .word QUADSPI_IRQHandler
+ .word AES1_IRQHandler
+ .word AES2_IRQHandler
+ .word RNG_IRQHandler
+ .word FPU_IRQHandler
+ .word DMA2_Channel1_IRQHandler
+ .word DMA2_Channel2_IRQHandler
+ .word DMA2_Channel3_IRQHandler
+ .word DMA2_Channel4_IRQHandler
+ .word DMA2_Channel5_IRQHandler
+ .word DMA2_Channel6_IRQHandler
+ .word DMA2_Channel7_IRQHandler
+ .word DMAMUX1_OVR_IRQHandler
+
+/*******************************************************************************
+*
+* Provide weak aliases for each Exception handler to the Default_Handler.
+* As they are weak aliases, any function with the same name will override
+* this definition.
+*
+*******************************************************************************/
+ .weak NMI_Handler
+ .thumb_set NMI_Handler,Default_Handler
+
+ .weak HardFault_Handler
+ .thumb_set HardFault_Handler,Default_Handler
+
+ .weak MemManage_Handler
+ .thumb_set MemManage_Handler,Default_Handler
+
+ .weak BusFault_Handler
+ .thumb_set BusFault_Handler,Default_Handler
+
+ .weak UsageFault_Handler
+ .thumb_set UsageFault_Handler,Default_Handler
+
+ .weak SVC_Handler
+ .thumb_set SVC_Handler,Default_Handler
+
+ .weak DebugMon_Handler
+ .thumb_set DebugMon_Handler,Default_Handler
+
+ .weak PendSV_Handler
+ .thumb_set PendSV_Handler,Default_Handler
+
+ .weak SysTick_Handler
+ .thumb_set SysTick_Handler,Default_Handler
+
+ .weak WWDG_IRQHandler
+ .thumb_set WWDG_IRQHandler,Default_Handler
+
+ .weak PVD_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak TAMP_STAMP_LSECSS_IRQHandler
+ .thumb_set TAMP_STAMP_LSECSS_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel1_IRQHandler
+ .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel2_IRQHandler
+ .thumb_set DMA1_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel3_IRQHandler
+ .thumb_set DMA1_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel4_IRQHandler
+ .thumb_set DMA1_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel5_IRQHandler
+ .thumb_set DMA1_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel6_IRQHandler
+ .thumb_set DMA1_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA1_Channel7_IRQHandler
+ .thumb_set DMA1_Channel7_IRQHandler,Default_Handler
+
+ .weak ADC1_IRQHandler
+ .thumb_set ADC1_IRQHandler,Default_Handler
+
+ .weak USB_HP_IRQHandler
+ .thumb_set USB_HP_IRQHandler,Default_Handler
+
+ .weak USB_LP_IRQHandler
+ .thumb_set USB_LP_IRQHandler,Default_Handler
+
+ .weak C2SEV_PWR_C2H_IRQHandler
+ .thumb_set C2SEV_PWR_C2H_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_TIM16_IRQHandler
+ .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_TIM17_IRQHandler
+ .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak PKA_IRQHandler
+ .thumb_set PKA_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak TSC_IRQHandler
+ .thumb_set TSC_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler
+ .thumb_set PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_RX_IRQHandler
+ .thumb_set IPCC_C1_RX_IRQHandler,Default_Handler
+
+ .weak IPCC_C1_TX_IRQHandler
+ .thumb_set IPCC_C1_TX_IRQHandler,Default_Handler
+
+ .weak HSEM_IRQHandler
+ .thumb_set HSEM_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LCD_IRQHandler
+ .thumb_set LCD_IRQHandler,Default_Handler
+
+ .weak QUADSPI_IRQHandler
+ .thumb_set QUADSPI_IRQHandler,Default_Handler
+
+ .weak AES1_IRQHandler
+ .thumb_set AES1_IRQHandler,Default_Handler
+
+ .weak AES2_IRQHandler
+ .thumb_set AES2_IRQHandler,Default_Handler
+
+ .weak RNG_IRQHandler
+ .thumb_set RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel1_IRQHandler
+ .thumb_set DMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel2_IRQHandler
+ .thumb_set DMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel3_IRQHandler
+ .thumb_set DMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel4_IRQHandler
+ .thumb_set DMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel5_IRQHandler
+ .thumb_set DMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel6_IRQHandler
+ .thumb_set DMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak DMA2_Channel7_IRQHandler
+ .thumb_set DMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c
new file mode 100644
index 000000000..e266506b6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/SW4STM32/syscalls.c
@@ -0,0 +1,204 @@
+/**
+*****************************************************************************
+**
+** File : syscalls.c
+**
+** Abstract : System Workbench Minimal System calls file
+**
+** For more information about which c-functions
+** need which of these lowlevel functions
+** please consult the Newlib libc-manual
+**
+** Environment : System Workbench for MCU
+**
+** Distribution: The file is distributed “as is,” without any warranty
+** of any kind.
+**
+*****************************************************************************
+**
+** <h2><center>&copy; COPYRIGHT(c) 2019 Ac6</center></h2>
+**
+** 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 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 Ac6 nor the names of its contributors
+** may be used to endorse or promote products derived from this software
+** without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+**
+*****************************************************************************
+*/
+
+/* Includes */
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+
+
+/* Variables */
+//#undef errno
+extern int errno;
+extern int __io_putchar(int ch) __attribute__((weak));
+extern int __io_getchar(void) __attribute__((weak));
+
+register char * stack_ptr asm("sp");
+
+char *__env[1] = { 0 };
+char **environ = __env;
+
+
+/* Functions */
+void initialise_monitor_handles()
+{
+}
+
+int _getpid(void)
+{
+ return 1;
+}
+
+int _kill(int pid, int sig)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+void _exit (int status)
+{
+ _kill(status, -1);
+ while (1) {} /* Make sure we hang here */
+}
+
+__attribute__((weak)) int _read(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+caddr_t _sbrk(int incr)
+{
+ extern char end asm("end");
+ static char *heap_end;
+ char *prev_heap_end;
+
+ if (heap_end == 0)
+ heap_end = &end;
+
+ prev_heap_end = heap_end;
+ if (heap_end + incr > stack_ptr)
+ {
+// write(1, "Heap and stack collision\n", 25);
+// abort();
+ errno = ENOMEM;
+ return (caddr_t) -1;
+ }
+
+ heap_end += incr;
+
+ return (caddr_t) prev_heap_end;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/readme.txt
new file mode 100644
index 000000000..17e590456
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/readme.txt
@@ -0,0 +1,197 @@
+/**
+ @page Thread_Coap_DataTransfer application
+
+ @verbatim
+ ******************************************************************************
+ * @file Thread/Thread_Coap_DataTransfer/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Thread_Coap_DataTransfer application
+ ******************************************************************************
+ *
+ * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ @endverbatim
+
+@par Application Description
+
+How to transfer large blocks of data through the CoAP messaging protocol.
+
+This application requires the use of at least two STM32WB55xx_Dongle boards.It demonstrates the
+ability to transfer large blocks of data through the CoAP messaging protocol. This application could be
+further developed into an Over The Air Firmware Update. However at the current state it stands as a
+Proof of Concept for the ability of transferring large blocks of data through the network. Namely
+5 blocks of data of 128bits length.
+
+In a Thread network, IPv6 addressing is split into 3 modes and 3 scopes.
+Multicast, Unicast and Anycast modes:
+ Multicast is used to communicate messages to multiple devices at once depending on the scope used in the address.
+Unicast is used to communicate messages to a specific node in the network.
+Anycast is used when the thread interface's routing locator is unknown.
+
+The scope determines the level of network access to be targeted :
+Link-Local scope : all interfaces are reachable through a single radio transmission hop.
+Mesh-Local scope : all interfaces reachable from within the same thread network.
+Global scope : all interfaces reachable from within and outside the same thread network.
+
+In our application, we will use the MEsh-local scope and multicast addressing types to probe the
+mesh-local IP addresses of the child devices to which the File would be transferred.
+ nodes are split into two forwarding roles: Router or End Device.
+The Thread Leader is a Router that is responsible for managing the set of Routers in a
+Thread network. An End Device (or child) communicates primarily with a single Router.
+
+In our Application, which uses two devices, one device will act as a Leader (Router)
+and the other one will act as an End Device (child mode)
+
+After the reset of the 2 boards, one board will be in Leader mode (Green LED2 ON) and
+the other one will be in Child mode (Red LED3 ON) Once the child mode is established for
+one of the devices, it starts the provisioning procedure in multicast mode in order to probe
+the IP address of the leader device. Then this is used to start the File transfer procedure
+in unicast mode, which success is marked by the lightening of the blue LED.
+
+
+ ___________________________ ___________________________
+ | Device 1 | | Device 2 |
+ |_________________________| |_________________________|
+ | | | |
+ | | | Provisioning enabled() |
+ | | | |
+ | | | |
+ | | | |
+ | Provisioning Request | | |
+ | send() |======> COAP =========>|------------- |
+ | |Resource "provisioning"| | |
+ | |Mode : Multicast | v |
+ | |Type : Non-Confirmable | Provisioning Request |
+ | |Code : Get | Handler() |
+ | |Payload: empty | | |
+ | | | v |
+ | | | Provisioning Response |
+ | | | send() |
+ | | | | |
+ | -------------|<===== COAP ========== |<------------ |
+ | | |Resource "provisioning"| |
+ | v |Mode : Multicast | |
+ | Provisioning Response |Type : Non Confirmable | |
+ | Handler() |Code : Put | |
+ | | |Payload : MeshLocal EUI| |
+ | | | | |
+ | | | | |
+ | v | | |
+ | ---->Get_NextBuffer() | | |
+ || | | | |
+ || v | | |
+ || Unicast_Data_Send() | | |
+ || | | |
+ || | | | |
+ || v | | |
+ || ----------->|=====>CoAP============>|------------- |
+ || |Resource : "File" | | |
+ || |Mode : Unicast | v |
+ || |Type : Confirmable | Data_Request_Handler() |
+ || |Code : Put | |
+ || |Payload : Buffer[] | | |
+ || | | v |
+ || | | Check_Message_Validity |
+ || | | | |
+ || | | v |
+ || | | Data_Response_Send() |
+ || | | |
+ || | | | |
+ || Data_Response_Handler()|<=====CoAP=============|<------------ |
+ || |Resource: "File" | |
+ || | |Mode : Unicast | |
+ || | |Type : Acknowledgment |
+ || | |Code : Changed | |
+ || | |Payload : empty | |
+ || v | | |
+ || /\ | | |
+ || / \ | | |
+ || Yes / \ | | |
+ | <---- /ID <5?\ | | |
+ | \ / | | |
+ | \ / | | |
+ | \ / | | |
+ | \/ | | |
+ | | NO | | |
+ | v | | |
+ | Blue Led ON | | |
+ | | | |
+ | | | |
+ | | | |
+ --------------------------- ---------------------------
+ | Role : Child | | Role : Leader |
+ | | | |
+ | LED : Red | | LED : Green |
+ | | | |
+ |_________________________| |_________________________|
+
+
+@par Keywords
+
+COAP,THREAD
+
+@par Directory contents
+
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h Header for all modules with common definition
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/app_conf.h Parameters configuration file of the application
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/app_entry.h Parameters configuration file of the application
+ - Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.h Header for app_thread.c module
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/data_transfer.h Array definition for Data Transfer application
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/hw_conf.h Configuration file of the HW
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/main.h Header for main.c module
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm32wbxx_it.h Interrupt header file
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/system_infra.h System infrastructure header file
+ - Thread/Thread_Coap_DataTransfer/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c Initialization of the application
+ - Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c Thread application implementation
+ - Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - Thread/Thread_Coap_DataTransfer/Core/Src/hw_uart.c UART driver
+ - Thread/Thread_Coap_DataTransfer/Core/Src/main.c Main program
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm_logging.c Logging module for traces
+ - Thread/Thread_Coap_DataTransfer/Core/Src/stm32xx_it.c Interrupt handlers
+ - Thread/Thread_Coap_DataTransfer/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+@par Hardware and Software environment
+
+ - This example runs on STM32WB55xx devices (Nucleo board and dongle).
+
+ - This example has been tested with an STMicroelectronics STM32WB55RG-Dongle
+ board and can be easily tailored to any other supported device
+ and development board.
+
+
+@par How to use it ?
+
+This application requests having the stm32wb5x_Thread_FTD_fw.bin binary flashed on the Wireless Coprocessor.
+If it is not the case, you need to use STM32CubeProgrammer to load the appropriate binary.
+All available binaries are located under /Projects/STM32_Copro_Wireless_Binaries directory.
+Refer to UM2237 to learn how to use/install STM32CubeProgrammer.
+Refer to /Projects/STM32_Copro_Wireless_Binaries/ReleaseNote.html for the detailed procedure to change the
+Wireless Coprocessor binary.
+
+
+In order to make the program work, you must do the following:
+ - Connect 2 STM32WB55xx_Dongle boards to your PC
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example on one board first wait until it switches to Leader Role
+ (indicated through the lightning of a green LED)
+ - Run the example on the second board and wait until it switches to Child Role
+ (indicated through the lightning of the Red LED)
+ - After a few seconds, if everything goes right, a blue LED should be lit indicating the end of the File transfer
+ - If the above step didn't go as planned, you should look through the traces to locate the source of the error.
+
+ Note: when LED1, LED2 and LED3 are toggling it is indicating an error has occurred on application.
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
index 0f839543a..a58b95cad 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -53,7 +53,8 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
#ifdef ZIGBEE_WB
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void );
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void );
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void );
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void );
+
#endif
/* Public function definition -----------------------------------------------*/
@@ -84,13 +85,13 @@ void HW_IPCC_Rx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
HW_IPCC_ZIGBEE_StackNotifEvtHandler();
}
- else if (HW_IPCC_RX_PENDING( HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL ))
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL ))
{
- HW_IPCC_ZIGBEE_CliNotifEvtHandler();
+ HW_IPCC_ZIGBEE_StackM0RequestHandler();
}
#endif /* ZIGBEE_WB */
else if (HW_IPCC_RX_PENDING( HW_IPCC_BLE_EVENT_CHANNEL ))
@@ -124,7 +125,7 @@ void HW_IPCC_Tx_Handler( void )
}
#endif /* THREAD_WB */
#ifdef ZIGBEE_WB
- if (HW_IPCC_TX_PENDING( HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL ))
+ if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
HW_IPCC_ZIGBEE_CmdEvtHandler();
}
@@ -154,7 +155,7 @@ void HW_IPCC_Enable( void )
*/
LL_C2_EXTI_EnableEvent_32_63( LL_EXTI_LINE_41 );
LL_EXTI_EnableRisingTrig_32_63( LL_EXTI_LINE_41 );
-
+
/**
* In case the SBSFU is implemented, it may have already set the C2BOOT bit to startup the CPU2.
* In that case, to keep the mechanism transparent to the user application, it shall call the system command
@@ -399,75 +400,70 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#ifdef ZIGBEE_WB
void HW_IPCC_ZIGBEE_Init( void )
{
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+void HW_IPCC_ZIGBEE_SendM4RequestToM0( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
- LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_EnableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
-{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
-
- return;
-}
-
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
- LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
return;
}
-static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
return;
}
-static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+void HW_IPCC_ZIGBEE_SendM4AckToM0Request( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
-
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- return;
+ return;
}
-__weak void HW_IPCC_ZIGBEE_AppliCmdNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_AppliAsyncEvtNotification( void ){};
-__weak void HW_IPCC_ZIGBEE_CliEvtNotification( void ){};
+
+__weak void HW_IPCC_ZIGBEE_RecvAppliAckFromM0( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
+__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
+
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c
index c39a88a3b..7062df7a5 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c
@@ -267,12 +267,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c
index d5d4bdfd7..c82a48169 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -44,6 +44,12 @@
#define COMPANY_NAME "ST"
#define METER_TYPE_ID GENERIC_METER_TYPE
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+/* external definition */
+extern const uint8_t sec_key_ha[ZB_SEC_KEYSIZE];
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -396,8 +402,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c
index 4169334f1..ddfa8c2d8 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c
@@ -267,12 +267,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c
index ef0d61a59..93cac7b17 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 13
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -353,8 +356,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c
index c39a88a3b..7062df7a5 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c
@@ -267,12 +267,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c
index 7a3ccc81f..df375a05e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -40,6 +40,9 @@
#define SW1_GROUP_ADDR 0x0001
#define CHANNEL 13
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -418,8 +421,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c
index 04d7419dc..a304ef94a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c
@@ -267,12 +267,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
+ switch (ErrorCode)
{
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ case ERR_ZIGBEE_UNKNOWN_CMD:
APP_DBG("** ERR_ZIGBEE : UNKNOWN_CMD \n");
break;
default:
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c
index dffefc00d..1a1c28291 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c
@@ -46,6 +46,9 @@
#define ENERGY_REMOTE 0 /* False */
#define SCHEDULE_MODE ZCL_PWR_PROF_SCHED_MODE_CHEAPEST
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
/* Private function prototypes -----------------------------------------------*/
static void APP_ZIGBEE_StackLayersInit(void);
static void APP_ZIGBEE_ConfigEndpoints(void);
@@ -702,8 +705,11 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
APP_DBG("VERSION ID = %d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
switch (p_wireless_info->StackType) {
- case INFO_STACK_TYPE_ZIGBEE:
- APP_DBG("FW Type : Zigbee stack");
+ case INFO_STACK_TYPE_ZIGBEE_FFD:
+ APP_DBG("FW Type : FFD Zigbee stack");
+ break;
+ case INFO_STACK_TYPE_ZIGBEE_RFD:
+ APP_DBG("FW Type : RFD Zigbee stack");
break;
default:
/* No Zigbee device supported ! */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html b/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html
index 669d497c0..967ce5733 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html
@@ -41,14 +41,26 @@
<ul>
<li>Projects\NUCLEO-WB55.USBDongle\Applications\BLE</li>
<li>Projects\NUCLEO-WB55.USBDongle\Applications\Thread</li>
+<li>Projects\NUCLEO-WB55.USBDongle\Applications\Zigbee</li>
</ul>
</div>
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section6" checked aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<input type="checkbox" id="collapse-section7" checked aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.6.0 / 27-March-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<h3 id="add-ble-mesh-split-of-ble_meshlightingdemo-project-in">Add BLE Mesh split of BLE_MeshLightingDemo project in:</h3>
+<ul>
+<li>BLE_MeshLightingLPN (Low Power Node),</li>
+<li>BLE_MeshLightingPRFNode (Proxy Relay Friend Node),</li>
+</ul>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<h3 id="maintenance">Maintenance</h3>
<ul>
<li><strong>Zigbee</strong>:
@@ -66,7 +78,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.4.0 / 06-December-2019</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<h3 id="maintenance-1">Maintenance</h3>
<ul>
<li><strong>Zigbee</strong>:
@@ -83,7 +95,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.3.0 / 11-September-2019</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<h3 id="maintenance-2">Maintenance</h3>
<ul>
<li>Ensure compatibility with STM32CubeMX V5.4.</li>
@@ -94,7 +106,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.2.0 / 26-June-2019</label>
<div>
-<h2 id="main-changes-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<h3 id="maintenance-3">Maintenance</h3>
<p>Adapt applications to new utility directory tree.</p>
</div>
@@ -102,7 +114,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.1.0 / 05-April-2019</label>
<div>
-<h2 id="main-changes-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<h3 id="remove-binaries-addition-of-new-examples">Remove binaries, Addition of new examples</h3>
<p>Change directory name to reflect board RPN: <a href="https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/stm32-nucleo-expansion-boards/p-nucleo-wb55.html">P-NUCLEO-WB55</a></p>
<p>Add USB Device applications:</p>
@@ -115,7 +127,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.0.0 / 06-February-2019</label>
<div>
-<h2 id="main-changes-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<h3 id="first-release">First release</h3>
<p>First official release.</p>
</div>
diff --git a/Projects/STM32CubeProjectsList.html b/Projects/STM32CubeProjectsList.html
index 28eb2f062..b8537bcf0 100644
--- a/Projects/STM32CubeProjectsList.html
+++ b/Projects/STM32CubeProjectsList.html
@@ -2330,8 +2330,8 @@ the STM32WBxx UART HAL and LL API, the LL API being used for performance improve
<td>8</td>
</tr>
<tr align=center>
- <td style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" rowspan=67><p id="Applications">Applications</p></td>
- <td align=left rowspan=20><p id="BLE">BLE</p></td>
+ <td style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" rowspan=83><p id="Applications">Applications</p></td>
+ <td align=left rowspan=25><p id="BLE">BLE</p></td>
<td align=left><p id="BLE_Beacon">BLE_Beacon</p></td>
<td align=left>
How to advertize 3 types of beacon ( tlm, uuid, url ).
@@ -2395,6 +2395,28 @@ How to use the Heart Rate profile as specified by the BLE SIG.
<td><font size="5" color=green>X</font></td>
</tr>
<tr align=center>
+ <td align=left><p id="BLE_HeartRateFreeRTOS_ANCS">BLE_HeartRateFreeRTOS_ANCS</p></td>
+ <td align=left>
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification at:
+https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/
+and also use the Heart Rate profile as specified by the BLE SIG.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="BLE_HeartRate_ANCS">BLE_HeartRate_ANCS</p></td>
+ <td align=left>
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification at:
+https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/
+and also use the Heart Rate profile as specified by the BLE SIG.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left><p id="BLE_HeartRate_ota">BLE_HeartRate_ota</p></td>
<td align=left>
How to use the Heart Rate profile as specified by the BLE SIG.
@@ -2413,7 +2435,7 @@ How to use the Human Interface Device profile as specified by the BLE SIG.
<td>-</td>
</tr>
<tr align=center>
- <td align=left><p id="BLE_MeshLightingDemo">BLE_MeshLightingDemo</p></td>
+ <td align=left><p id="BLE_MeshLightingLPN">BLE_MeshLightingLPN</p></td>
<td align=left>This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
</td>
<td><font size="5" color=green>X</font></td>
@@ -2421,6 +2443,22 @@ How to use the Human Interface Device profile as specified by the BLE SIG.
<td>-</td>
</tr>
<tr align=center>
+ <td align=left><p id="BLE_MeshLightingPRFNode">BLE_MeshLightingPRFNode</p></td>
+ <td align=left>This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
+</td>
+ <td><font size="5" color=green>X</font></td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="BLE_MeshLightingProvisioner">BLE_MeshLightingProvisioner</p></td>
+ <td align=left>This is the implementation of the BLE Mesh Lighting profile as specified by the BLE SIG.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left><p id="BLE_MultiAppAt">BLE_MultiAppAt</p></td>
<td align=left>
How to use multi BLE applications using a network processor architecture.
@@ -2457,6 +2495,15 @@ How to use the Proximity profile as specified by the BLE SIG.
<td>-</td>
</tr>
<tr align=center>
+ <td align=left><p id="BLE_RfWithFlash">BLE_RfWithFlash</p></td>
+ <td align=left>
+This example is to demonstrate the capability to erase/write the flash while a Point-to-Point communication using BLE component is active.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left><p id="BLE_TransparentMode">BLE_TransparentMode</p></td>
<td align=left>
How to communicate with the STM32CubeMonitor-RF Tool using the transparent mode.
@@ -2662,7 +2709,7 @@ How to use MAC 802.15.4 Association and Data exchange.
<td>-</td>
</tr>
<tr align=center>
- <td align=left rowspan=11><p id="Thread">Thread</p></td>
+ <td align=left rowspan=12><p id="Thread">Thread</p></td>
<td align=left><p id="Thread_Cli_Cmd">Thread_Cli_Cmd</p></td>
<td align=left>
How to control the Thread stack via Cli commands.
@@ -2762,6 +2809,15 @@ How to exchange a Coap message using the Thread protocol.
<td>-</td>
</tr>
<tr align=center>
+ <td align=left><p id="Thread_Udp">Thread_Udp</p></td>
+ <td align=left>
+How to transfer data using UDP.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left rowspan=1><p id="TouchSensing">TouchSensing</p></td>
<td align=left><p id="TouchSensing_1touchKey">TouchSensing_1touchKey</p></td>
<td align=left>
@@ -2810,7 +2866,25 @@ How to use the USB device application based on the Mass Storage Class (MSC) on t
<td><font size="5" color=green>CubeMx</font></td>
</tr>
<tr align=center>
- <td align=left rowspan=14><p id="Zigbee">Zigbee</p></td>
+ <td align=left rowspan=24><p id="Zigbee">Zigbee</p></td>
+ <td align=left><p id="Zigbee_Commissioning_Client_Coord">Zigbee_Commissioning_Client_Coord</p></td>
+ <td align=left>
+How to use Commissioning cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_Commissioning_Server_Router">Zigbee_Commissioning_Server_Router</p></td>
+ <td align=left>
+How to use Commissioning cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left><p id="Zigbee_DevTemp_Client_Router">Zigbee_DevTemp_Client_Router</p></td>
<td align=left>
How to use DevTemp cluster on a Centralized Zigbee network with device acting as router.
@@ -2829,6 +2903,60 @@ How to use DevTemp cluster on a Centralized Zigbee network with device acting as
<td>-</td>
</tr>
<tr align=center>
+ <td align=left><p id="Zigbee_Diagnostic_Client_Router">Zigbee_Diagnostic_Client_Router</p></td>
+ <td align=left>
+How to use Diagnostic cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_Diagnostic_Server_Coord">Zigbee_Diagnostic_Server_Coord</p></td>
+ <td align=left>
+How to use Diagnostic cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_DoorLock_Client_Router">Zigbee_DoorLock_Client_Router</p></td>
+ <td align=left>
+How to use Door Lock cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_DoorLock_Server_Coord">Zigbee_DoorLock_Server_Coord</p></td>
+ <td align=left>
+How to use Door Lock cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_IAS_WD_Client_Router">Zigbee_IAS_WD_Client_Router</p></td>
+ <td align=left>
+How to use IAS WD cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_IAS_WD_Server_Coord">Zigbee_IAS_WD_Server_Coord</p></td>
+ <td align=left>
+How to use IAS WD cluster as a server on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left><p id="Zigbee_MeterId_Client_Router">Zigbee_MeterId_Client_Router</p></td>
<td align=left>
How to use Meter Identification cluster as a client on a centralized Zigbee network.
@@ -2883,6 +3011,24 @@ How to use OnOff cluster as a server on a distributed Zigbee network.
<td>-</td>
</tr>
<tr align=center>
+ <td align=left><p id="Zigbee_PollControl_Client_Coord">Zigbee_PollControl_Client_Coord</p></td>
+ <td align=left>
+How to use Poll Control cluster as a client on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Zigbee_PollControl_Server_SED">Zigbee_PollControl_Server_SED</p></td>
+ <td align=left>
+How to use Poll Control cluster as a server on a centralized Zigbee network.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ <td>-</td>
+ </tr>
+ <tr align=center>
<td align=left><p id="Zigbee_PowerProfile_Client_Coord">Zigbee_PowerProfile_Client_Coord</p></td>
<td align=left>
How to use Power Profile cluster as a client on a centralized Zigbee network.
@@ -2937,9 +3083,9 @@ How to use SE Messaging cluster on a Centralized Zigbee network with device acti
<td>-</td>
</tr>
<tr style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" align=center>
- <td colspan="3"><b>Total number of applications: 97</b></td>
- <td>17</td>
- <td>65</td>
+ <td colspan="3"><b>Total number of applications: 114</b></td>
+ <td>18</td>
+ <td>81</td>
<td>15</td>
</tr>
<tr align=center>
@@ -2961,9 +3107,9 @@ Cortex-M devices that can be plugged on a STM32 Nucleo board.
<td>1</td>
</tr>
<tr style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" align=center>
- <td colspan="4"><b>Total number of projects: 390</b></td>
- <td>18</td>
- <td>271</td>
+ <td colspan="4"><b>Total number of projects: 407</b></td>
+ <td>19</td>
+ <td>287</td>
<td>101</td>
</tr>
</table>
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html
index f534603ed..6b5f077ae 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html
@@ -40,29 +40,35 @@
<li>stm32wb3x_BLE_Stack_full_fw.bin
<ul>
<li>Full BLE Stack 5.0 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database</li>
-<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/59722">Declaration ID D042164</a></li>
+<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/59722">Declaration ID D042164</a>
+<ul>
+<li>Following features are kept:
+<ul>
+<li>GAP peripheral, central (LL slave up to 2 links, LL master up to 6 links)</li>
+<li>GATT server, client</li>
+<li>Data length extension</li>
+<li>2Mbit PHY / PHY update</li>
+<li>Privacy / White list</li>
+<li>Legacy Pairing, LE secure connections</li>
+<li>HCI interface (full, like stm32wb5x_BLE_HCILayer_fw.bin)</li>
+<li>Direct Test Mode</li>
+</ul></li>
+</ul></li>
</ul></li>
<li>stm32wb3x_BLE_Stack_light_fw.bin
<ul>
-<li>Erase/Write Flash of Wireless Stack Non Volatile Memory while BLE link is active (Min Interval 28ms)</li>
-<li>Fix IFS (Inter Frame Spacing) sometimes longer than 152us</li>
+<li>Full BLE Stack 5.0 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database</li>
+<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/59722">Declaration ID D042164</a></li>
<li>Wireless Ble stack Light configuration ā€“ Slave Only
<ul>
<li>Following features are kept:
<ul>
-<li>GAP peripheral / LL slave</li>
+<li>GAP peripheral only (LL slave up to 2 links)</li>
<li>GATT server</li>
<li>Data length extension</li>
-<li>Double LL slave</li>
-</ul></li>
-<li>Following Feature are removed
-<ul>
-<li>GAP central / LL master</li>
-<li>GATT client</li>
-<li>Privacy / White list</li>
-<li>Secure connections</li>
-<li>2 MB / PHY update</li>
-<li>HCI interface (useless functions are removed)</li>
+<li>Legacy Pairing</li>
+<li>HCI interface (reduced)</li>
+<li>Direct Test Mode</li>
</ul></li>
</ul></li>
</ul></li>
@@ -87,7 +93,7 @@
<li>To be used for MAC FFD and RFD devices</li>
</ul></li>
</ul>
-<p><mark>How to flash the Wireless Coprocessor Binary via USB</mark></p>
+<p><mark>How to flash the Wireless Coprocessor Binary via USB (Command Line Interface)</mark></p>
<ul>
<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
<li><p>STEP 1: Use STM32CubeProgrammer</p>
@@ -107,18 +113,18 @@
</ul></li>
</ul></li>
</ul></li>
-<li><p>STEP 3 : Delete current wireless stack :</p>
+<li><p>STEP 3 : Delete current wireless stack</p>
<ul>
<li><em>STM32_Programmer_CLI.exe -c port=usb1 -fwdelete</em></li>
</ul></li>
-<li>STEP 4 : Read and upgrade FUS Version
+<li><p>STEP 4 : Read and upgrade FUS Version</p>
<ul>
<li><em>STM32_Programmer_CLI.exe -c port=usb1 -r32 0x20008030 1</em>
<ul>
<li>*0x20008030 : 01000000 : FUSv1.0.x =&gt; <strong>Up to date, you can download the new wireless stack using STEP6.</strong></li>
</ul></li>
</ul></li>
-<li>STEP 5 : Download new FUS : Not Applicable
+<li><p>STEP 5 :Download latest FUS [ Not Applicable ]</p>
<ul>
<li><em>STM32_Programmer_CLI.exe -c port=usb1 -fwupgrade [FUS_Binary] [Install@] firstinstall=0</em> Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
</ul></li>
@@ -129,49 +135,242 @@
<p>Please check <strong>Wireless Coprocessor Binary Table</strong> for Install@ parameter depending of the binary.</p></li>
<li><p>STEP 7 : Revert STEP 2 procedure to put back device in normal mode.</p></li>
</ul>
-<p><mark>How to flash the Wireless Coprocessor Binary via SWD/JTAG</mark></p>
+<p><mark>How to flash the Wireless Coprocessor Binary via SWD/JTAG by ST-LINK (Command Line Interface)</mark></p>
<ul>
<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
<li><p>STEP 1: Use STM32CubeProgrammer</p>
<ul>
-<li><p>Version 2.2.0 or higher.</p></li>
+<li><p>Version 2.4.0 or higher.</p></li>
<li><p>It gives access to Firmware Upgrade Service (FUS) (<a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00513965.pdf">AN5185</a> : ST firmware upgrade services for STM32WB Series.) through Bootloader.</p></li>
<li><p>It is currently available as Command Line Interface (CLI) mode.</p></li>
</ul></li>
-<li>STEP 2 : Read and upgrade FUS Version
+<li><p>STEP 2: Access to SWD Interface (system flash)</p>
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=usb1 -r32 0x20030030 1</em>
+<li>For NUCLEO-WB35CE :
<ul>
-<li>*0x20030030 : 01000000 : FUSv1.0.x =&gt; <strong>Up to date, you can download the new wireless stack using STEP 4.</strong></li>
+<li>Power ON via ST-LINK and Jumper JP1(USB_STL)</li>
</ul></li>
</ul></li>
-<li>STEP 3 :Download new FUS : Not Applicable
+<li><p>STEP 3: Delete current wireless stack</p>
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade [FUS_Binary] [Install@] firstinstall=0</em> Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+<li><em>STM32_Programmer_CLI.exe -c port=swd -fwdelete</em></li>
</ul></li>
-<li><p>STEP 4 : Download new wireless stack :</p>
+<li><p>STEP 4 : Read and upgrade FUS Version (if unknown FUS version)</p>
+<ul>
+<li>it can been obtained with Transparent Mode application from STM32CubeMonitor-RF interface or using other flashing method via USB described in RN.
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade [Wireless_Coprocessor_Binary] [Install@] firstinstall=1</em></li>
+<li>*0x20030030 : 01000000 : FUSv1.0.x =&gt; <strong>Up to date, you can download the new wireless stack using STEP 5.</strong></li>
+</ul></li>
+</ul></li>
+<li><p>STEP 5 :Download latest FUS [ Not Applicable ]</p>
+<ul>
+<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -fwupgrade [FUS_Binary] [Install@] firstinstall=0</em> Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 6 : Download new wireless stack :</p>
+<ul>
+<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -fwupgrade [Wireless_Coprocessor_Binary] [Install@] firstinstall=1</em></li>
</ul>
<p>Please check <strong>Wireless Coprocessor Binary Table</strong> for Install@ parameter depending of the binary.</p></li>
+<li><p>STEP 7 : Revert to default OB configuration :</p>
+<ul>
+<li>*STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=1 nboot1=1 nboot0=1</li>
+</ul></li>
+</ul>
+<p><mark>How to flash the Wireless Coprocessor Binary via USB (STM32CubeProgrammer GUI)</mark></p>
+<ul>
+<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
+<li><p>STEP 1: Use STM32CubeProgrammer</p>
+<ul>
+<li><p>Version 2.4.0 or higher.</p></li>
+<li><p>It gives access to Firmware Upgrade Service (FUS) (<a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00513965.pdf">AN5185</a> : ST firmware upgrade services for STM32WB Series.) through Bootloader.</p></li>
+<li><p>It is currently available as Command Line Interface (CLI) mode.</p></li>
+</ul></li>
+<li><p>STEP 2: Access to Bootloader USB Interface (system flash)</p>
+<ul>
+<li>Boot mode selected by Boot0 pin set to VDD
+<ul>
+<li>For P-NUCLEO-WB35.Nucleo :
+<ul>
+<li>Jumper between CN7.5(VDD) and CN7.7(Boot0)</li>
+<li>Power ON via USB_USER and Jumper JP1(USB_MCU)</li>
+</ul></li>
+</ul></li>
+<li>open STM32CubeProgrammer GUI and select ā€œUSBā€</li>
+<li>in USB configuration: (Port: USB1) then select ā€œConnectā€</li>
+</ul></li>
+<li><p>STEP 3 : Delete current wireless stack</p>
+<ul>
+<li>in Firmware Upgrade Services: select ā€œDelete Firmwareā€</li>
+</ul></li>
+<li><p>STEP 4 : Read and upgrade FUS Version</p>
+<ul>
+<li>in Firmware Upgrade Services: select ā€œRead FUS stateā€
+<ul>
+<li>*0x20008030 : 01000000 : FUSv1.0.x =&gt; <strong>Up to date, you can download the new wireless stack using STEP 6.</strong></li>
+</ul></li>
+</ul></li>
+<li>STEP 5 : Download latest FUS [ Not Applicable ]
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [FUS_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 6 : Download new wireless stack :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [Wireless_Coprocessor_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ with ā€œVerify downloadā€ and ā€œStart stack after upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 7 : Revert STEP 2 procedure to put back device in normal mode.</p></li>
+</ul>
+<p><mark>How to flash the Wireless Coprocessor Binary via SWD/JTAG by ST-LINK (STM32CubeProgrammer GUI)</mark></p>
+<ul>
+<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
+<li><p>STEP 1: Use STM32CubeProgrammer GUI</p>
+<ul>
+<li><p>Version 2.4.0 or higher.</p></li>
+<li><p>It gives access to Firmware Upgrade Service (FUS) (<a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00513965.pdf">AN5185</a> : ST firmware upgrade services for STM32WB Series.) through Bootloader.</p></li>
+<li><p>It is currently available as Graphical User Interface (GUI) mode (or Command Line Interface (CLI) mode).</p></li>
+</ul></li>
+<li><p>STEP 2: Access to SWD Interface (system flash)</p>
+<ul>
+<li>For P-NUCLEO-WB35.Nucleo :
+<ul>
+<li>Power ON via ST-LINK and Jumper JP1(USB_STL)</li>
+</ul></li>
+<li>open STM32CubeProgrammer GUI and select ā€œST-LINKā€</li>
+<li>in ST-LINK configuration: (Port: SWD) then select ā€œConnectā€</li>
+</ul></li>
+<li><p>STEP 3: Delete current wireless stack</p>
+<ul>
+<li>in Firmware Upgrade Services: select ā€œDelete Firmwareā€</li>
+</ul></li>
+<li><p>STEP 4 : Read and upgrade FUS Version (if unknown FUS version)</p>
+<ul>
+<li>it can been obtained with Transparent Mode application from STM32CubeMonitor-RF interface or using other flashing method via USB described in RN.</li>
+<li>*0x20008030 : 01000000 : FUSv1.0.x =&gt; <strong>Up to date, you can download the new wireless stack using STEP 6.</strong></li>
+</ul></li>
+<li><p>STEP 5 : Download latest FUS [ Not Applicable ]</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [FUS_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 6 : Download new wireless stack :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [Wireless_Coprocessor_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ with ā€œVerify downloadā€ and ā€œStart stack after upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 7 : Revert to default configuration: in Option Bytes menu for User Configuration set: nSWboot0=1 (checked) nboot1=1 nboot0=1</p></li>
</ul>
+<div class="collapse">
+<input type="checkbox" id="collapse-section7" checked aria-hidden="true"> <label for="collapse-section7" aria-hidden="false">Notes </label>
+<div>
<p><mark>How to compute available flash size </mark></p>
<ul>
-<li><p>The default linker file provided in [\Drivers\CMSIS\Device\ST32WBxx\Source\Templates] allows the application to use a fixed amount of flash.</p>
+<li><p>The default linker file is provided in [\Drivers\CMSIS\Device\ST32WBxx\Source\Templates].</p>
<p>The maximum flash memory that can be used by the application is up to the Secure Flash Start Address (SFSA) that can be read from the option byte.</p>
<p>The <strong>ICFEDIT_region_ROM_end</strong> in the linker can be modified with a value up to : (0x08000000 + (SFSA &lt;&lt; 12)) - 1.</p></li>
<li><p><strong>Example</strong>: When the SFSA option byte is set to 0x32, the maximum value to be used for __ICFEDIT_region_ROM_end is 0x08031FFF ā€“ which is 200KB of flash</p></li>
-<li><p><strong>Note</strong>: The SFSA option byte can only be set by the CPU2. The user cannot modify that value.</p></li>
+<li><strong>Note</strong>: The SFSA option byte can only be set by the CPU2. The user cannot modify that value.</li>
</ul>
</div>
+</div>
+</div>
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section1" checked aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<input type="checkbox" id="collapse-section2" checked aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.6.0 / 27-March-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
+<li>MAC:
+<ul>
+<li>ID 81423 - Exceeding max Pending Data crashed the board</li>
+<li>ID 81426 - Beacon Ind msg wrongly issued</li>
+</ul></li>
+<li>THREAD:
+<ul>
+<li>Parameter check updates for notification to the application.</li>
+<li>ID 80054 - Coap Default Handler fixed</li>
+<li>ID 82579 - Some commands such as otLinkGetExtendedAddress return data in the SRAM2a section</li>
+</ul></li>
+<li>BLE:
+<ul>
+<li>BLE stack updates:</li>
+<li>Fix vulnerability referenced as CVE-2019-19192</li>
+<li>ID 82231 - The PESD bit is kept high when BLE Mesh un-provisioning is requested by AT Command</li>
+<li>ID 68815 - Min connection interval does not allow scan @ master side</li>
+<li>ID 76341 - Ellisys LL/SEC/ADV/BV-03-C test fail due to wrong RPA Timeout value 10.7s vs 10s expected</li>
+<li>ID 74352 - STM32WB BLE Stack DoS deadlock vulnerability</li>
+<li>ID 81795 - STM32WB BLE stack blocks at some commands following ACI_HAL_RX_START</li>
+<li>ID 81758 - Apply specific workarounds and RF trimming parameters when using ACI_HAL_TONE_START</li>
+<li>ID 77395 - Ellisys LL/CON/INI/BV-04 issue on connection supervision timeout</li>
+<li>ID 82288 - BLE stack: behavior of HCI SC key events in full stack mode</li>
+<li>ID 79038 - SMP changes to avoid master pairing without ā€œforce rebondā€ working after bond lost</li>
+<li>ID 68859 - Multilink Secure Pairing Collision make pairing failing</li>
+<li>ID 75302 - SMP: no more possible from master or slave to redo a new refresh key, or force rebond if master send several GAP_send_pairing_REQ before HCI_ENCRYPTION event issue.</li>
+<li>ID 76809 - PTS: SM/MAS/SCOB/BV-01-C issue on GAP_AUTHENTICATON that modifies OOB data</li>
+<li>ID 79042 - SMP: bond lost event on master side</li>
+<li>ID 81007 - HCI_Data_Buffer_Overflow event to be removed as useless</li>
+<li>ID 82059 - BLE stack init: change handling of a too large number of links parameter</li>
+</ul></li>
+</ul>
+<p><strong>Binary Install Address and version</strong> : Provides Install address for the targeted binary to be used in flash procedure ā€œSTEP 6ā€ via USB or ā€œSTEP 4ā€ via SWD/JTAG.</p>
+<table>
+<thead>
+<tr class="header">
+<th>Wireless Coprocessor Binary</th>
+<th>STM32WB3x(512K)</th>
+<th>Version</th>
+<th>Date</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>stm32wb3x_BLE_HCILayer_fw.bin</td>
+<td>0x805C000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_BLE_Stack_full_fw.bin</td>
+<td>0x804B000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb3x_BLE_Stack_light_fw.bin</td>
+<td>0x8059000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_Mac_802_15_4_fw.bin</td>
+<td>0x8064000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb3x_Thread_FTD_fw.bin</td>
+<td>0x801F000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_Thread_MTD_fw.bin</td>
+<td>0x8034000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
+<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
+<ul>
<li>Initial version of Wireless Coprocessor Binary compatible with STM32WB3x.</li>
<li>Thread
<ul>
@@ -182,6 +381,14 @@
<ul>
<li>Support of 802_15_4 MAC stack on STM32WB35</li>
</ul></li>
+<li>BLE
+<ul>
+<li>Introduction of new binary <strong>stm32wb3x_BLE_Stack_light_fw.bin</strong> for supporting Slave only (cf previous detailed description).</li>
+<li><strong>WARNING</strong>: when using the stm32wb3x_BLE_Stack_light_fw.bin binary, the maximum number of simultaneous connections that the device will support is 2<br />
+then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
+<li>Erase/Write Flash of Wireless Stack Non Volatile Memory while BLE link is active (Min Interval 28ms)</li>
+<li>Fix IFS (Inter Frame Spacing) sometimes longer than 152us</li>
+</ul></li>
</ul>
<p><strong>Binary Install Address and version</strong> : Provides Install address for the targeted binary to be used in flash procedure ā€œSTEP 6ā€ via USB or ā€œSTEP 4ā€ via SWD/JTAG.</p>
<table>
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCILayer_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCILayer_fw.bin
index 54953f222..30466931c 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCILayer_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCILayer_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_full_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_full_fw.bin
index 67c618f17..aa61b124b 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_full_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_full_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_light_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_light_fw.bin
index 96e0e61ef..b619f1e8d 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_light_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_light_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Mac_802_15_4_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Mac_802_15_4_fw.bin
index 5148ea7a0..448fc15d1 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Mac_802_15_4_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Mac_802_15_4_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_FTD_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_FTD_fw.bin
index 89965c8cd..f7d9e8890 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_FTD_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_FTD_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_MTD_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_MTD_fw.bin
index 7d024e7c5..b5588193f 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_MTD_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_MTD_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html
index 1afb58839..9ec3fa4a2 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html
@@ -40,30 +40,39 @@
<li>stm32wb5x_BLE_Stack_full_fw.bin
<ul>
<li>Full BLE Stack 5.0 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database</li>
-<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/59722">Declaration ID D042164</a></li>
+<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/59722">Declaration ID D042164</a>
+<ul>
+<li>Following features are kept:
+<ul>
+<li>GAP peripheral, central (LL slave up to 2 links, LL master up to 6 links)</li>
+<li>GATT server, client</li>
+<li>Data length extension</li>
+<li>2Mbit PHY / PHY update</li>
+<li>Privacy / White list</li>
+<li>Legacy Pairing, LE secure connections</li>
+<li>HCI interface (full, like stm32wb5x_BLE_HCILayer_fw.bin)</li>
+<li>Direct Test Mode</li>
+</ul></li>
+</ul></li>
</ul></li>
<li>stm32wb5x_BLE_Stack_light_fw.bin
<ul>
-<li>Erase/Write Flash of Wireless Stack Non Volatile Memory while BLE link is active (Min Interval 28ms)</li>
-<li>Fix IFS (Inter Frame Spacing) sometimes longer than 152us</li>
+<li>Full BLE Stack 5.0 certified : Link Layer, HCI, L2CAP, ATT, SM, GAP and GATT database</li>
+<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/59722">Declaration ID D042164</a></li>
<li>Wireless Ble stack Light configuration ā€“ Slave Only
<ul>
<li>Following features are kept:
<ul>
-<li>GAP peripheral / LL slave</li>
+<li>GAP peripheral only (LL slave up to 2 links)</li>
<li>GATT server</li>
<li>Data length extension</li>
-<li>Double LL slave</li>
-</ul></li>
-<li>Following Feature are removed
-<ul>
-<li>GAP central / LL master</li>
-<li>GATT client</li>
-<li>Privacy / White list</li>
-<li>Secure connections</li>
-<li>2 MB / PHY update</li>
-<li>HCI interface (useless functions are removed)</li>
+<li>Legacy Pairing</li>
+<li>HCI interface (reduced)</li>
+<li>Direct Test Mode</li>
</ul></li>
+<li>BLE ā€œSlave Onlyā€ stack implies that with this stack configuration, STM32WB is not able to scan and request a BLE connection.</li>
+<li>It will just advertise, and accept incoming connection request from other master devices (e.g.Ā Smartphone).</li>
+<li>While with the ā€œfull featureā€ BLE stack, STM32WB55xx is able to support both master and slave roles on different links (with the limitation of max 8 links in parallel, from which max 2 slave links).</li>
</ul></li>
</ul></li>
<li>stm32wb5x_BLE_HCILayer_fw.bin
@@ -101,6 +110,12 @@
<li>Zigbee Compliant Platform certified</li>
<li>Supports Full Function Device (FFD)</li>
</ul></li>
+<li>stm32wb5x_Zigbee_RFD_fw.bin
+<ul>
+<li>Zigbee Reduced Function Device</li>
+<li>Zigbee Compliant Platform certified</li>
+<li>To be used for End Device Zigbee role</li>
+</ul></li>
<li>stm32wb5x_BLE_Zigbee_FFD_static_fw.bin
<ul>
<li>Static Concurrent Mode BLE Zigbee</li>
@@ -119,7 +134,7 @@
<li>Latest version of the FUS</li>
</ul></li>
</ul>
-<p><mark>How to flash the Wireless Coprocessor Binary via USB</mark></p>
+<p><mark>How to flash the Wireless Coprocessor Binary via USB (Command Line Interface)</mark></p>
<ul>
<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
<li><p>STEP 1: Use STM32CubeProgrammer</p>
@@ -144,7 +159,7 @@
</ul></li>
</ul></li>
</ul></li>
-<li><p>STEP 3 : Delete current wireless stack :</p>
+<li><p>STEP 3 : Delete current wireless stack</p>
<ul>
<li><em>STM32_Programmer_CLI.exe -c port=usb1 -fwdelete</em></li>
</ul></li>
@@ -174,39 +189,169 @@
<p>Please check <strong>Wireless Coprocessor Binary Table</strong> for Install@ parameter depending of the binary.</p></li>
<li><p>STEP 8 : Revert STEP 2 procedure to put back device in normal mode.</p></li>
</ul>
-<p><mark>How to flash the Wireless Coprocessor Binary via SWD/JTAG</mark></p>
+<p><mark>How to flash the Wireless Coprocessor Binary via SWD/JTAG by ST-LINK (Command Line Interface)</mark></p>
<ul>
<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
<li><p>STEP 1: Use STM32CubeProgrammer</p>
<ul>
-<li><p>Version 2.2.0 or higher.</p></li>
+<li><p>Version 2.4.0 or higher.</p></li>
<li><p>It gives access to Firmware Upgrade Service (FUS) (<a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00513965.pdf">AN5185</a> : ST firmware upgrade services for STM32WB Series.) through Bootloader.</p></li>
<li><p>It is currently available as Command Line Interface (CLI) mode.</p></li>
</ul></li>
-<li>STEP 2 : Read and upgrade FUS Version
+<li><p>STEP 2: Access to SWD Interface (system flash)</p>
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=usb1 -r32 0x20030030 1</em>
+<li>For P-NUCLEO-WB55.Nucleo :
+<ul>
+<li>Power ON via ST-LINK and Jumper JP1(USB_STL)</li>
+</ul></li>
+<li>For P-NUCLEO-WB55.USBDongle :
+<ul>
+<li>remain switch SW2 to Boot1</li>
+<li>Connect P-NUCLEO-WB55.USBDongle</li>
+</ul></li>
+</ul></li>
+<li><p>STEP 3: Delete current wireless stack</p>
+<ul>
+<li><em>STM32_Programmer_CLI.exe -c port=swd -fwdelete</em></li>
+</ul></li>
+<li><p>STEP 4 : Read and upgrade FUS Version (if unknown FUS version)</p>
+<ul>
+<li>it can been obtained with Transparent Mode application from STM32CubeMonitor-RF interface or using other flashing method via USB described in RN.
<ul>
-<li><em>0x20030030 : 00050300</em> : FUSv0.5.3 =&gt; <strong>Must be updated using STEP 3.</strong></li>
-<li><em>0x20030030 : 01000100 or 01000200</em> : FUSv1.0.x =&gt; <strong>Must be updated using using STEP 4.</strong></li>
-<li><em>0x20030030 : 0x10100000</em> : FUSv1.1.0 =&gt; <strong>Up to date, you can download the new wireless stack using STEP 5.</strong></li>
+<li><em>0x20030030 : 00050300</em> : FUSv0.5.3 =&gt; <strong>Must be updated using STEP 5.</strong></li>
+<li><em>0x20030030 : 01000100 or 01000200</em> : FUSv1.0.x =&gt; <strong>Must be updated using using STEP 6.</strong></li>
+<li><em>0x20030030 : 0x10100000</em> : FUSv1.1.0 =&gt; <strong>Up to date, you can download the new wireless stack using STEP 7.</strong></li>
</ul></li>
</ul></li>
-<li><p>STEP 3 : Download FUS 1.0.2 (stm32wb5x_FUS_fw_1_0_2.bin) :</p>
+<li><p>STEP 5 : Download FUS v1.0.2:</p>
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade stm32wb5x_FUS_fw_1_0_2.bin [Install@] firstinstall=0</em></li>
+<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -fwupgrade stm32wb5x_FUS_fw_1_0_2.bin [Install@] firstinstall=0</em></li>
</ul>
<p>Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</p></li>
-<li><p>STEP 4 :Download latest FUS :</p>
+<li><p>STEP 6 :Download latest FUS v1.1.0:</p>
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade [FUS_Binary] [Install@] firstinstall=0</em></li>
+<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -fwupgrade [FUS_Binary] [Install@] firstinstall=0</em></li>
</ul>
<p>Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</p></li>
-<li><p>STEP 5 : Download new wireless stack :</p>
+<li><p>STEP 7 : Download new wireless stack :</p>
<ul>
-<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=0 nboot1=1 nboot0=1 -fwupgrade [Wireless_Coprocessor_Binary] [Install@] firstinstall=1</em></li>
+<li><em>STM32_Programmer_CLI.exe -c port=swd mode=UR -fwupgrade [Wireless_Coprocessor_Binary] [Install@] firstinstall=1</em></li>
</ul>
<p>Please check <strong>Wireless Coprocessor Binary Table</strong> for Install@ parameter depending of the binary.</p></li>
+<li><p>STEP 8 : Revert to default OB configuration :</p>
+<ul>
+<li>*STM32_Programmer_CLI.exe -c port=swd mode=UR -ob nSWboot0=1 nboot1=1 nboot0=1</li>
+</ul></li>
+</ul>
+<p><mark>How to flash the Wireless Coprocessor Binary via USB (STM32CubeProgrammer GUI)</mark></p>
+<ul>
+<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
+<li><p>STEP 1: Use STM32CubeProgrammer GUI</p>
+<ul>
+<li><p>Version 2.4.0 or higher.</p></li>
+<li><p>It gives access to Firmware Upgrade Service (FUS) (<a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00513965.pdf">AN5185</a> : ST firmware upgrade services for STM32WB Series.) through Bootloader.</p></li>
+<li><p>It is currently available as Graphical User Interface (GUI) mode (or Command Line Interface (CLI) mode).</p></li>
+</ul></li>
+<li><p>STEP 2: Access to Bootloader USB Interface (system flash)</p>
+<ul>
+<li>Boot mode selected by Boot0 pin set to VDD
+<ul>
+<li>For P-NUCLEO-WB55.Nucleo :
+<ul>
+<li>Jumper between CN7.5(VDD) and CN7.7(Boot0)</li>
+<li>Power ON via USB_USER and Jumper JP1(USB_MCU)</li>
+</ul></li>
+<li>For P-NUCLEO-WB55.USBDongle :
+<ul>
+<li>Move switch SW2 to Boot0</li>
+<li>Connect P-NUCLEO-WB55.USBDongle</li>
+</ul></li>
+</ul></li>
+<li>open STM32CubeProgrammer GUI and select ā€œUSBā€</li>
+<li>in USB configuration: (Port: USB1) then select ā€œConnectā€</li>
+</ul></li>
+<li><p>STEP 3 : Delete current wireless stack</p>
+<ul>
+<li>in Firmware Upgrade Services: select ā€œDelete Firmwareā€</li>
+</ul></li>
+<li><p>STEP 4 : Read and upgrade FUS Version</p>
+<ul>
+<li>in Firmware Upgrade Services: select ā€œRead FUS stateā€
+<ul>
+<li><em>0x20030030 : 00050300</em> : FUSv0.5.3 =&gt; <strong>Must be updated using STEP 5.</strong></li>
+<li><em>0x20030030 : 01000100 or 01000200</em> : FUSv1.0.x =&gt; <strong>Must be updated using using STEP 6.</strong></li>
+<li><em>0x20030030 : 0x10100000</em> : FUSv1.1.0 =&gt; **Up to date, you can download the new wireless stack using STEP 7.</li>
+</ul></li>
+</ul></li>
+<li><p>STEP 5 : Download FUS v1.0.2 :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [stm32wb5x_FUS_fw_1_0_2.bin], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 6 :Download latest FUS v1.1.0 :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [FUS_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 7 : Download new wireless stack :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [Wireless_Coprocessor_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ with ā€œVerify downloadā€ and ā€œStart stack after upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 8 : Revert STEP 2 procedure to put back device in normal mode.</p></li>
+</ul>
+<p><mark>How to flash the Wireless Coprocessor Binary via SWD/JTAG by ST-LINK (STM32CubeProgrammer GUI)</mark></p>
+<ul>
+<li><p><em>Inside the below procedure, the references to binaries name and install address are provided in the section <strong>Main Changes</strong> of this file.</em></p></li>
+<li><p>STEP 1: Use STM32CubeProgrammer GUI</p>
+<ul>
+<li><p>Version 2.4.0 or higher.</p></li>
+<li><p>It gives access to Firmware Upgrade Service (FUS) (<a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00513965.pdf">AN5185</a> : ST firmware upgrade services for STM32WB Series.) through Bootloader.</p></li>
+<li><p>It is currently available as Graphical User Interface (GUI) mode (or Command Line Interface (CLI) mode).</p></li>
+</ul></li>
+<li><p>STEP 2: Access to SWD Interface (system flash)</p>
+<ul>
+<li>For P-NUCLEO-WB55.Nucleo :
+<ul>
+<li>Power ON via ST-LINK and Jumper JP1(USB_STL)</li>
+</ul></li>
+<li>For P-NUCLEO-WB55.USBDongle :
+<ul>
+<li>remain switch SW2 to Boot1</li>
+<li>Connect P-NUCLEO-WB55.USBDongle</li>
+</ul></li>
+<li>open STM32CubeProgrammer GUI and select ā€œST-LINKā€</li>
+<li>in ST-LINK configuration: (Port: SWD) then select ā€œConnectā€</li>
+</ul></li>
+<li><p>STEP 3: Delete current wireless stack</p>
+<ul>
+<li>in Firmware Upgrade Services: select ā€œDelete Firmwareā€</li>
+</ul></li>
+<li><p>STEP 4 : Read and upgrade FUS Version (if unknown FUS version)</p>
+<ul>
+<li>it can been obtained with Transparent Mode application from STM32CubeMonitor-RF interface or using other flashing method via USB described in RN.
+<ul>
+<li><em>0x20030030 : 00050300</em> : FUSv0.5.3 =&gt; <strong>Must be updated using STEP 5.</strong></li>
+<li><em>0x20030030 : 01000100 or 01000200</em> : FUSv1.0.x =&gt; <strong>Must be updated using using STEP 6.</strong></li>
+<li><em>0x20030030 : 0x10100000</em> : FUSv1.1.0 =&gt; **Up to date, you can download the new wireless stack using STEP 7.</li>
+</ul></li>
+</ul></li>
+<li><p>STEP 5 : Download FUS v1.0.2 :</p>
+<ul>
+<li>in Firmware Upgrade Services: (File Path: [stm32wb5x_FUS_fw_1_0_2.bin], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 6 :Download latest FUS v1.1.0 :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [FUS_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 7 : Download new wireless stack :</p>
+<ul>
+<li>in Firmware Upgrade Service: (File Path: [Wireless_Coprocessor_Binary], Start Adress: [Install@])</li>
+<li>then select ā€œFirmware Upgradeā€ with ā€œVerify downloadā€ and ā€œStart stack after upgradeā€ Please check <strong>Firmware Upgrade Services Binary Table</strong> for Install@ parameter depending of the binary.</li>
+</ul></li>
+<li><p>STEP 8 : Revert to default configuration: in Option Bytes menu for User Configuration set: nSWboot0=1 (checked) nboot1=1 nboot0=1</p></li>
</ul>
<p><mark>How to compute available flash size </mark></p>
<ul>
@@ -220,11 +365,207 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section7" checked aria-hidden="true"> <label for="collapse-section7" aria-hidden="false">V1.5.0 / 14-February-2020</label>
+<input type="checkbox" id="collapse-section8" checked aria-hidden="true"> <label for="collapse-section8" aria-hidden="false">V1.6.0 / 27-March-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
+<li>MAC:
+<ul>
+<li>ID 81423 - Exceeding max Pending Data crashed the board</li>
+<li>ID 81426 - Beacon Ind msg wrongly issued</li>
+</ul></li>
+<li>ZIGBEE:
+<ul>
+<li>Introducing <strong>stm32wb5x_Zigbee_RFD_fw.bin</strong> (targeted for Zigbee End Device)<br />
+</li>
+<li>MAC layer bug fixed</li>
+</ul></li>
+<li>THREAD:
+<ul>
+<li>Parameter check updates for notification to the application.</li>
+<li>ID 80054 - Coap Default Handler fixed</li>
+<li>ID 82579 - Some commands such as otLinkGetExtendedAddress return data in the SRAM2a section</li>
+</ul></li>
+<li>BLE:
+<ul>
+<li>BLE stack updates:</li>
+<li>Fix vulnerability referenced as CVE-2019-19192</li>
+<li>ID 82231 - The PESD bit is kept high when BLE Mesh un-provisioning is requested by AT Command</li>
+<li>ID 68815 - Min connection interval does not allow scan @ master side</li>
+<li>ID 76341 - Ellisys LL/SEC/ADV/BV-03-C test fail due to wrong RPA Timeout value 10.7s vs 10s expected</li>
+<li>ID 74352 - STM32WB BLE Stack DoS deadlock vulnerability</li>
+<li>ID 81795 - STM32WB BLE stack blocks at some commands following ACI_HAL_RX_START</li>
+<li>ID 81758 - Apply specific workarounds and RF trimming parameters when using ACI_HAL_TONE_START</li>
+<li>ID 77395 - Ellisys LL/CON/INI/BV-04 issue on connection supervision timeout</li>
+<li>ID 82288 - BLE stack: behavior of HCI SC key events in full stack mode</li>
+<li>ID 79038 - SMP changes to avoid master pairing without ā€œforce rebondā€ working after bond lost</li>
+<li>ID 68859 - Multilink Secure Pairing Collision make pairing failing</li>
+<li>ID 75302 - SMP: no more possible from master or slave to redo a new refresh key, or force rebond if master send several GAP_send_pairing_REQ before HCI_ENCRYPTION event issue.</li>
+<li>ID 76809 - PTS: SM/MAS/SCOB/BV-01-C issue on GAP_AUTHENTICATON that modifies OOB data</li>
+<li>ID 79042 - SMP: bond lost event on master side</li>
+<li>ID 81007 - HCI_Data_Buffer_Overflow event to be removed as useless</li>
+<li>ID 82059 - BLE stack init: change handling of a too large number of links parameter</li>
+</ul></li>
+</ul>
+<p><strong>Firmware Upgrade Services Binary Table</strong>: Provides Install address for the targeted binary to be used in flash procedure ā€œSTEP 5ā€ via USB or ā€œSTEP 3ā€ via SWD/JTAG.</p>
+<table style="width:100%;">
+<colgroup>
+<col style="width: 47%" />
+<col style="width: 14%" />
+<col style="width: 14%" />
+<col style="width: 14%" />
+<col style="width: 6%" />
+<col style="width: 3%" />
+</colgroup>
+<thead>
+<tr class="header">
+<th>Wireless Coprocessor Binary</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
+<th>Version</th>
+<th>Date</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>stm32wb5x_FUS_fw_1_0_2.bin</td>
+<td>0x080<strong>EC</strong>000</td>
+<td>0x080<strong>7A</strong>000</td>
+<td>0x080<strong>3A</strong>000</td>
+<td>v1.0.2</td>
+<td>04/10/2019</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_FUS_fw.bin</td>
+<td>0x080<strong>EC</strong>000</td>
+<td>0x080<strong>7A</strong>000</td>
+<td>0x080<strong>3A</strong>000</td>
+<td><strong>v1.1.0</strong></td>
+<td>02/10/2020</td>
+</tr>
+</tbody>
+</table>
+<p><strong>Wireless Coprocessor Binary Table</strong>: Provides Install address for the targeted binary to be used in flash procedure ā€œSTEP 6ā€ via USB or ā€œSTEP 4ā€ via SWD/JTAG.</p>
+<table style="width:100%;">
+<colgroup>
+<col style="width: 50%" />
+<col style="width: 13%" />
+<col style="width: 13%" />
+<col style="width: 13%" />
+<col style="width: 4%" />
+<col style="width: 3%" />
+</colgroup>
+<thead>
+<tr class="header">
+<th>Wireless Coprocessor Binary</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
+<th>Version</th>
+<th>Date</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>stm32wb5x_BLE_HCILayer_fw.bin</td>
+<td>0x080DC000</td>
+<td>0x08068000</td>
+<td>0x08028000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_Stack_full_fw.bin</td>
+<td>0x080CB000</td>
+<td>0x08057000</td>
+<td>0x08017000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_Stack_light_fw.bin</td>
+<td>0x80D9000</td>
+<td>0x8065000</td>
+<td>0x8025000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_Thread_fw.bin</td>
+<td>0x08078000</td>
+<td>NA</td>
+<td>NA</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_Zigbee_FFD_static_fw.bin</td>
+<td>0x0807C000</td>
+<td>NA</td>
+<td>NA</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_Mac_802_15_4_fw.bin</td>
+<td>0x080E4000</td>
+<td>0x08070000</td>
+<td>0x08030000</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_rfmonitor_phy802_15_4_fw.bin</td>
+<td>0x080EC000</td>
+<td>0x08078000</td>
+<td>0x08038000</td>
+<td>v1.1.0</td>
+<td>04/05/2019</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_Thread_FTD_fw.bin</td>
+<td>0x0809F000</td>
+<td>0x0802B000</td>
+<td>NA</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_Thread_MTD_fw.bin</td>
+<td>0x080B4000</td>
+<td>0x08040000</td>
+<td>NA</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_Zigbee_FFD_Full_fw.bin</td>
+<td>0x080A9000Ā </td>
+<td>0x08035000</td>
+<td>NA</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_Zigbee_RFD_fw.bin</td>
+<td>0x080B3000Ā </td>
+<td>0x0803F000</td>
+<td>NA</td>
+<td><strong>v1.6.0</strong></td>
+<td>03/27/2020</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="false">V1.5.0 / 14-February-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
+<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
+<ul>
<li>FUS:
<ul>
<li><strong>New revision</strong></li>
@@ -263,6 +604,8 @@
<li>Introduction of new binary <strong>stm32wb5x_BLE_Stack_light_fw.bin</strong> for supporting Slave only (cf previous detailed description).</li>
<li><strong>WARNING</strong>: when using the stm32wb5x_BLE_Stack_light_fw.bin binary, the maximum number of simultaneous connections that the device will support is 2<br />
then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
+<li>Erase/Write Flash of Wireless Stack Non Volatile Memory while BLE link is active (Min Interval 28ms)</li>
+<li>Fix IFS (Inter Frame Spacing) sometimes longer than 152us</li>
</ul></li>
</ul>
<p><strong>Firmware Upgrade Services Binary Table</strong>: Provides Install address for the targeted binary to be used in flash procedure ā€œSTEP 5ā€ via USB or ā€œSTEP 3ā€ via SWD/JTAG.</p>
@@ -278,9 +621,9 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<thead>
<tr class="header">
<th>Wireless Coprocessor Binary</th>
-<th>STM32WB5xG(1M)</th>
-<th>STM32WB5xE(512K)</th>
-<th>STM32WB5xC(256K)</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
<th>Version</th>
<th>Date</th>
</tr>
@@ -317,9 +660,9 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<thead>
<tr class="header">
<th>Wireless Coprocessor Binary</th>
-<th>STM32WB5xG(1M)</th>
-<th>STM32WB5xE(512K)</th>
-<th>STM32WB5xC(256K)</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
<th>Version</th>
<th>Date</th>
</tr>
@@ -412,7 +755,7 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<div class="collapse">
<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="false">V1.4.0 / 22-November-2019</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>ZIGBEE :
@@ -447,9 +790,9 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<thead>
<tr class="header">
<th>Wireless Coprocessor Binary</th>
-<th>STM32WB5xG(1M)</th>
-<th>STM32WB5xE(512K)</th>
-<th>STM32WB5xC(256K)</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
<th>Version</th>
<th>Date</th>
</tr>
@@ -478,9 +821,9 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<thead>
<tr class="header">
<th>Wireless Coprocessor Binary</th>
-<th>STM32WB5xG(1M)</th>
-<th>STM32WB5xE(512K)</th>
-<th>STM32WB5xC(256K)</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
<th>Version</th>
<th>Date</th>
</tr>
@@ -557,7 +900,7 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<div class="collapse">
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.3.0 / 09-September-2019</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>ZIGBEE :
@@ -587,9 +930,9 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<thead>
<tr class="header">
<th>Wireless Coprocessor Binary</th>
-<th>STM32WB5xG(1M)</th>
-<th>STM32WB5xE(512K)</th>
-<th>STM32WB5xC(256K)</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
<th>Version</th>
<th>Date</th>
</tr>
@@ -618,9 +961,9 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<thead>
<tr class="header">
<th>Wireless Coprocessor Binary</th>
-<th>STM32WB5xG(1M)</th>
-<th>STM32WB5xE(512K)</th>
-<th>STM32WB5xC(256K)</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxE(512K)</th>
+<th>STM32WB5xxC(256K)</th>
<th>Version</th>
<th>Date</th>
</tr>
@@ -697,7 +1040,7 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<div class="collapse">
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.2.0 / 3rd-July-2019</label>
<div>
-<h2 id="main-changes-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>BLE Link layer : fix issues with pairing</li>
@@ -729,21 +1072,21 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<tbody>
<tr class="odd">
<td>stm32wb5x_FUS_fw.bin</td>
-<td>STM32WB5xC(256K)</td>
+<td>STM32WB5xxC(256K)</td>
<td>0x080<strong>3E</strong>000</td>
<td>v1.0.2</td>
<td>04/10/2019</td>
</tr>
<tr class="even">
<td>stm32wb5x_FUS_fw.bin</td>
-<td>STM32WB5xE(512K)</td>
+<td>STM32WB5xxE(512K)</td>
<td>0x080<strong>7E</strong>000</td>
<td>v1.0.2</td>
<td>04/10/2019</td>
</tr>
<tr class="odd">
<td>stm32wb5x_FUS_fw.bin</td>
-<td>STM32WB5xG(1M)</td>
+<td>STM32WB5xxG(1M)</td>
<td>0x080<strong>EC</strong>000</td>
<td>v1.0.2</td>
<td>04/10/2019</td>
@@ -810,7 +1153,7 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<div class="collapse">
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.1.1 / 10-May-2019</label>
<div>
-<h2 id="main-changes-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<p><strong>Associated changes in Firmware Upgrade Services (FUS)</strong>:</p>
<ul>
<li>Add support for STM32WB5xE(512K) and STM32WB5xC(256K) devices.</li>
@@ -830,21 +1173,21 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<tbody>
<tr class="odd">
<td>stm32wb5x_FUS_fw.bin</td>
-<td><strong>STM32WB5xC</strong>(256K)</td>
+<td><strong>STM32WB5xxC</strong>(256K)</td>
<td>0x080<strong>3E</strong>000</td>
<td><strong>v1.0.2</strong></td>
<td>04/10/2019</td>
</tr>
<tr class="even">
<td>stm32wb5x_FUS_fw.bin</td>
-<td><strong>STM32WB5xE</strong>(512K)</td>
+<td><strong>STM32WB5xxE</strong>(512K)</td>
<td>0x080<strong>7E</strong>000</td>
<td><strong>v1.0.2</strong></td>
<td>04/10/2019</td>
</tr>
<tr class="odd">
<td>stm32wb5x_FUS_fw.bin</td>
-<td><strong>STM32WB5xG</strong>(1M)</td>
+<td><strong>STM32WB5xxG</strong>(1M)</td>
<td>0x080<strong>EC</strong>000</td>
<td><strong>v1.0.2</strong></td>
<td>04/10/2019</td>
@@ -916,7 +1259,7 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<div class="collapse">
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.1.0 / 05-April-2019</label>
<div>
-<h2 id="main-changes-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<p><strong>Introduction of the Firmware Upgrade Services (FUS)</strong>:</p>
<ul>
<li>This feature is embedded inside stm32wb5x_FUS_fw.bin.</li>
@@ -1025,7 +1368,7 @@ then #define CFG_BLE_NUM_LINK in app_conf.h shall be updated accordingly.</li>
<div class="collapse">
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.0.0 / 06-February-2019</label>
<div>
-<h2 id="main-changes-6">Main Changes</h2>
+<h2 id="main-changes-7">Main Changes</h2>
<h3 id="first-release">First release</h3>
<p>First official release.</p>
<p><strong>Binary Install Address and version</strong> : Provides Install address for the targeted binary to be used in ā€œSTEP 6ā€ of flash procedure.</p>
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCILayer_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCILayer_fw.bin
index 88fc5932c..df10391ba 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCILayer_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCILayer_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_full_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_full_fw.bin
index 9d50edf02..e9c7de181 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_full_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_full_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_light_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_light_fw.bin
index 2e90ea558..c595d0e02 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_light_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_light_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_fw.bin
index 4f2825f7d..a922fa284 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_static_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_static_fw.bin
index 823320190..80b4f9177 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_static_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_static_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_FUS_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_FUS_fw.bin
index 7d7bb6394..2273fb162 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_FUS_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_FUS_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Mac_802_15_4_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Mac_802_15_4_fw.bin
index 8a060c08b..274f7b1ac 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Mac_802_15_4_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Mac_802_15_4_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_FTD_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_FTD_fw.bin
index 8846045b3..24061755d 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_FTD_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_FTD_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_MTD_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_MTD_fw.bin
index 7d88e9777..cfd0bba79 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_MTD_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_MTD_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_Full_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_Full_fw.bin
index 9c69798d5..ecc08cf21 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_Full_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_Full_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.bin
new file mode 100644
index 000000000..f4658ca3f
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.bin
Binary files differ
diff --git a/README.md b/README.md
index 0f1106c87..22c50b543 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,12 @@
**STM32Cube** is an STMicroelectronics original initiative to ease the developers life by reducing efforts, time and cost.
-**STM32Cube** covers the overall STM32 products portfolio. It includes a comprehensive embedded software platform (this repo), delivered for each series (such as the STM32CubeWB for the STM32WB series).
- * The CMSIS modules (core and device) corresponding to the ARM-tm core implemented in this STM32 product
- * The STM32 HAL-LL drivers : an abstraction drivers layer, the API ensuring maximized portability across the STM32 portfolio
- * The BSP Drivers of each evaluation or demonstration board provided by this STM32 series
+**STM32Cube** covers the overall STM32 products portfolio. It includes a comprehensive embedded software platform (this repository), delivered for each series (such as the STM32CubeWB for the STM32WB series).
+ * The CMSIS modules (core and device) corresponding to the ARM-tm core implemented in this STM32 product.
+ * The STM32 HAL-LL drivers : an abstraction drivers layer, the API ensuring maximized portability across the STM32 portfolio.
+ * The BSP Drivers of each evaluation or demonstration board provided by this STM32 series.
* A consistent set of middlewares components such as FreeRTOS, FatFS, USB, BLE, Thread...
- * A full set of software projects (basic examples, applications or demonstrations) for each board provided by this STM32 series
+ * A full set of software projects (basic examples, applications or demonstrations) for each board provided by this STM32 series.
The **STM32CubeWB MCU Package** projects are directly running on the STM32WB series boards. You can find in each Projects/*Board name* directories a set of software projects (Applications/Demonstration/Examples).
diff --git a/Release_Notes.html b/Release_Notes.html
index a8e0d2e98..dc54c5d67 100644
--- a/Release_Notes.html
+++ b/Release_Notes.html
@@ -72,9 +72,487 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section7" checked aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<input type="checkbox" id="collapse-section8" checked aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.6.0 / 3-April-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<h3 id="add-the-support-of-several-additional-zigbee-clusters">Add the support of several additional Zigbee clusters</h3>
+<ul>
+<li><strong>Zigbee</strong>
+<ul>
+<li>You can refer to <a href="Middlewares/ST/STM32_WPAN/zigbee/STM32WB_ZigbeeGettingStarted.pdf">STM32WB_ZigbeeGettingStarted.pdf</a> for a quick overview of Zigbee on STM32WB.</li>
+<li><strong>The package now supports the following cluster list (47 clusters)</strong>
+<ul>
+<li>Alarms</li>
+<li>Ballast Configuration</li>
+<li>Basic</li>
+<li>Color control</li>
+<li>Commissioning</li>
+<li>Dehumidification Control</li>
+<li>Demand Response and Load Control</li>
+<li>Device Temperature Configuration</li>
+<li>Diagnostics</li>
+<li>Door Lock</li>
+<li>Electrical Measurement</li>
+<li>Fan Control</li>
+<li>Green Power Proxy</li>
+<li>Groups</li>
+<li>IAS Ancillary Control Equipment (ACE)</li>
+<li>IAS Warning Device (WD)</li>
+<li>IAS Zone</li>
+<li>Identify6</li>
+<li>Illuminance Level Sensing</li>
+<li>Illuminance Measurement</li>
+<li>Key Establishment</li>
+<li>Level Control</li>
+<li>Messaging</li>
+<li>Meter Identification</li>
+<li>Metering</li>
+<li>Nearest Gateway Cluster</li>
+<li>OTA Upgrade</li>
+<li>Occupancy Sensing</li>
+<li>On/Off</li>
+<li>On/Off Switch Configuration</li>
+<li>Poll Control</li>
+<li>Power Configuration</li>
+<li>Power Profile Cluster</li>
+<li>Pressure Measurement</li>
+<li>Price</li>
+<li>Pump Configuration and Control</li>
+<li>RSSI Location</li>
+<li>Relative Humidity Measurement</li>
+<li>Scenes</li>
+<li>Smart Energy Tunneling (Complex Metering)</li>
+<li>Temperature Measurement</li>
+<li>Thermostat</li>
+<li>Thermostat User Interface Configuration</li>
+<li>Time</li>
+<li>Touchlink</li>
+<li>Voice Over ZigBee</li>
+<li>Window Covering</li>
+</ul></li>
+<li><strong>3 wireless stacks are available</strong>
+<ul>
+<li>stm32wb5x_Zigbee_FFD_Full_fw.bin (Full Function Device)</li>
+<li>stm32wb5x_Zigbee_RFD_fw.bin (new, Reduced Function Device to be used for End Device Zigbee role)</li>
+<li>stm32wb5x_BLE_Zigbee_FFD_static_fw.bin (Static Concurrent Mode BLE (Full BLE Stack 5.0) and Zigbee (FFD))</li>
+</ul></li>
+<li><strong>To demonstrate those clusters, several new applications are available</strong>
+<ul>
+<li>Zigbee_Commissioning_Client_Coord (Commissioning cluster)</li>
+<li>Zigbee_Commissioning_Server_Router (Commissioning cluster)</li>
+<li>Zigbee_Diagnostic_Client_Router (Diagnostics cluster)</li>
+<li>Zigbee_Diagnostic_Server_Coord (Diagnostics cluster)</li>
+<li>Zigbee_DoorLock_Client_Router (Door Lock cluster)</li>
+<li>Zigbee_DoorLock_Server_Coord (Door Lock cluster)</li>
+<li>Zigbee_IAS_WD_Client_Router (IAS Warning Device cluster)</li>
+<li>Zigbee_IAS_WD_Server_Coord (IAS Warning Device cluster)</li>
+<li>Zigbee_PollControl_Client_Coord (Poll Control cluster)</li>
+<li>Zigbee_PollControl_Server_SED (Poll Control cluster)</li>
+<li>(<a href="Projects/STM32CubeProjectsList.html">Complete list</a>)</li>
+</ul></li>
+</ul></li>
+<li><p><strong>BLE</strong></p>
+<ul>
+<li>BLE stack update to fix vulnerability referenced as CVE-2019-19192</li>
+</ul></li>
+<li><p><strong>BLE-Mesh</strong></p>
+<ul>
+<li><strong>Split the BLE_MeshLightingDemo project in two</strong>
+<ul>
+<li>BLE_MeshLightingLPN (Low Power Node)</li>
+<li>BLE_MeshLightingPRFNode (Proxy Relay Friend Node)</li>
+</ul></li>
+<li><strong>BLE-Mesh library version 1.12.007</strong>
+<ul>
+<li>Updated for Delta level set binding to Light lightness</li>
+<li>Multi Key updates.</li>
+<li>Correction of FSM issues in the LC Model: no way to consume a packet internally.</li>
+<li>Correction of Sensor_LC_Light_Publish sending wrong property (and LC Model handling wrong property).</li>
+<li>Updates on Generic Models for Certification tests: Generic OnOff, Level, Power OnOff, Transition Time<br />
+</li>
+<li>Update Multi elements support</li>
+<li>Changes for DYNAMIC_PROVISIONER in Provisioner project</li>
+</ul></li>
+</ul></li>
+</ul>
+<h2 id="contents">Contents</h2>
+<h3 id="projects">Projects</h3>
+<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
+<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
+<ul>
+<li><strong>P-NUCLEO-WB55.Nucleo</strong> (<a href="Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html">release notes</a>)</li>
+<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>)</li>
+<li><strong>NUCLEO-WB35CE</strong> (<a href="Projects/NUCLEO-WB35CE/Release_Notes.html">release notes</a>) (<a href="Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
+</ul>
+<h3 id="components">Components</h3>
+<table>
+<caption>STM32WB5x Firmware Upgrade Services Binary</caption>
+<thead>
+<tr class="header">
+<th style="text-align: left;">Name</th>
+<th style="text-align: left;">Version</th>
+<th>License</th>
+<th>Release note</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_FUS_fw_1_0_2.bin</td>
+<td style="text-align: left;">V1.0.2</td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb5x_FUS_fw.bin</td>
+<td style="text-align: left;"><strong>V1.1.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+</tbody>
+</table>
+<table>
+<caption>STM32WB5x Coprocessor Wireless Binaries</caption>
+<thead>
+<tr class="header">
+<th style="text-align: left;">Name</th>
+<th style="text-align: left;">Version</th>
+<th>License</th>
+<th>Release note</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_BLE_HCILayer_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb5x_BLE_Stack_full_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_BLE_Stack_light_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb5x_BLE_Thread_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_BLE_Zigbee_FFD_static_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb5x_Mac_802_15_4_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_rfmonitor_phy802_15_4_fw.bin</td>
+<td style="text-align: left;">v1.1.0</td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb5x_Thread_FTD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_Thread_MTD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb5x_Zigbee_FFD_Full_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb5x_Zigbee_RFD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note</a></td>
+</tr>
+</tbody>
+</table>
+<table>
+<caption>STM32WB3x Coprocessor Wireless Binaries</caption>
+<thead>
+<tr class="header">
+<th style="text-align: left;">Name</th>
+<th style="text-align: left;">Version</th>
+<th>License</th>
+<th>Release note</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td style="text-align: left;">stm32wb3x_BLE_HCILayer_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb3x_BLE_Stack_full_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb3x_BLE_Stack_light_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb3x_Mac_802_15_4_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">stm32wb3x_Thread_FTD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">stm32wb3x_Thread_MTD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044 (binary release)</a></td>
+<td><a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note</a></td>
+</tr>
+</tbody>
+</table>
+<table>
+<caption>Drivers</caption>
+<thead>
+<tr class="header">
+<th style="text-align: left;">Name</th>
+<th>Version</th>
+<th>License</th>
+<th>Release note</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td style="text-align: left;">Cortex-M CMSIS</td>
+<td>V5.4.0</td>
+<td><a href="Drivers/CMSIS/LICENSE.txt">Apache License 2.0</a></td>
+<td><a href="Drivers/CMSIS/README.md">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">STM32WB CMSIS</td>
+<td>V1.4.0</td>
+<td><a href="Drivers/CMSIS/LICENSE.txt">Apache License 2.0</a></td>
+<td><a href="Drivers/CMSIS/Device/ST/STM32WBxx/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">STM32WBxx_HAL_Driver</td>
+<td>V1.5.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/STM32WBxx_HAL_Driver/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">P-NUCLEO-WB55.USBDongle</td>
+<td>V1.0.1</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/BSP/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">P-NUCLEO-WB55.Nucleo</td>
+<td>V1.0.1</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/BSP/P-NUCLEO-WB55.Nucleo/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">NUCLEO-WB35CE</td>
+<td>V1.0.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/BSP/NUCLEO-WB35CE/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">BSP Adafruit Shield</td>
+<td>V3.0.3</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/BSP/Adafruit_Shield/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">BSP Common</td>
+<td>V5.0.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/BSP/Components/Common/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">BSP st7735</td>
+<td>V1.1.2</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Drivers/BSP/Components/st7735/Release_Notes.html">release notes</a></td>
+</tr>
+</tbody>
+</table>
+<table>
+<caption>Middleware</caption>
+<thead>
+<tr class="header">
+<th style="text-align: left;">Name</th>
+<th style="text-align: left;">Version</th>
+<th>License</th>
+<th>Release note</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td style="text-align: left;">STM32 USB Device Library</td>
+<td style="text-align: left;">V2.5.3</td>
+<td><a href="http://www.st.com/SLA0044">SLA0044</a></td>
+<td><a href="Middlewares/ST/STM32_USB_Device_Library/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">STM32 WPAN</td>
+<td style="text-align: left;"><strong>V1.6.0</strong></td>
+<td><a href="http://www.st.com/SLA0044">SLA0044</a></td>
+<td><a href="Middlewares/ST/STM32_WPAN/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">FatFS</td>
+<td style="text-align: left;">R0.12c</td>
+<td><a href="Middlewares/Third_Party/FatFs/doc/en/appnote.html#license">FatFs License</a></td>
+<td><a href="Middlewares/Third_Party/FatFs/doc/updates.txt">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;"></td>
+<td style="text-align: left;">ST modified 20191011</td>
+<td><a href="http://www.st.com/SLA0044">SLA0044</a></td>
+<td><a href="Middlewares/Third_Party/FatFs/src/st_readme.txt">release notes ST</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">FreeRTOS</td>
+<td style="text-align: left;">V10.2.1</td>
+<td><a href="Middlewares/Third_Party/FreeRTOS/License/license.txt">MIT</a></td>
+<td><a href="Middlewares/Third_Party/FreeRTOS/Source/readme.txt">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;"></td>
+<td style="text-align: left;">ST modified 20191213</td>
+<td><a href="http://www.st.com/SLA0044">SLA0044</a></td>
+<td><a href="Middlewares/Third_Party/FreeRTOS/Source/st_readme.txt">release notes ST</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">STM32_TouchSensing_Library</td>
+<td style="text-align: left;">V2.2.4</td>
+<td><a href="http://www.st.com/SLA0044">SLA0044</a></td>
+<td><a href="Middlewares/ST/STM32_TouchSensing_Library/Release_Notes.html">release notes</a></td>
+</tr>
+</tbody>
+</table>
+<table>
+<caption>Utilities</caption>
+<thead>
+<tr class="header">
+<th style="text-align: left;">Name</th>
+<th style="text-align: left;">Version</th>
+<th>License</th>
+<th>Release note</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td style="text-align: left;">CPU</td>
+<td style="text-align: left;">V1.1.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Utilities/CPU/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">Fonts</td>
+<td style="text-align: left;">V1.0.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Utilities/Fonts/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">Log</td>
+<td style="text-align: left;">V1.0.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Utilities/Log/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">conf</td>
+<td style="text-align: left;">V1.3.1</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Utilities/conf/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="odd">
+<td style="text-align: left;">lpm</td>
+<td style="text-align: left;">V1.1.0</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Utilities/lpm/tiny_lpm/Release_Notes.html">release notes</a></td>
+</tr>
+<tr class="even">
+<td style="text-align: left;">sequencer</td>
+<td style="text-align: left;">V1.2.1</td>
+<td><a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a></td>
+<td><a href="Utilities/sequencer/Release_Notes.html">release notes</a></td>
+</tr>
+</tbody>
+</table>
+<h2 id="known-limitations">Known Limitations</h2>
+<ul>
+<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
+<ul>
+<li>Moving from stm32wb5x_BLE_Stack_fw.bin to stm32wb5x_BLE_Thread_fw.bin</li>
+</ul></li>
+</ul>
+<h2 id="development-toolchains-and-compilers">Development Toolchains and Compilers</h2>
+<ul>
+<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
+<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
+<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
+<li>STM32CubeIDE toolchain V1.2.0 + ST-Link</li>
+</ul>
+<h2 id="supported-devices-and-boards">Supported Devices and boards</h2>
+<ul>
+<li>STM32WB55xx, STM32WB50xx, STM32WB35xx and STM32WB30xx devices.</li>
+<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
+<li>NUCLEO-WB35CE board.</li>
+</ul>
+<h2 id="dependencies">Dependencies</h2>
+<p>This software release is compatible with:</p>
+<ul>
+<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
+</ul>
+<p>Several applications (BLE (Bluetooth low energy), Thread or Mac 802-15-4) are available under:</p>
+<ul>
+<li>Projects/P-NUCLEO-WB55.Nucleo/Applications</li>
+<li>Projects/P-NUCLEO-WB55.USBDongle/Applications</li>
+</ul>
+<p>All of them are provided in source code and some of them are also available in binary format directly for ready to use usage:</p>
+<ul>
+<li>Projects/P-NUCLEO-WB55.Nucleo/Applications/xxx/Binary/<projectName>.hex</li>
+<li>Projects/P-NUCLEO-WB55.USBDongle/Applications/xxx/Binary/<projectName>.hex</li>
+<li>Projects/NUCLEO-WB35CE/Applications/xxx/Binary/<projectName>.hex</li>
+</ul>
+<p>Each of them require a different coprocessor binary in order to behave correctly. This is documented inside each readme.txt of those applications.</p>
+<p>You can refer to the <a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html">release note for STM32WB5x</a> or <a href="Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html">release note for STM32WB3x</a> of the binaries for a detailed explanation on how to use and how to flash them.</p>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.5.0 / 14-February-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<h3 id="introduction-of-stm32wb5mxx-stm32wb35xx-stm32wb30xx-product-and-blezigbee-static-concurrent-mode">Introduction of STM32WB5Mxx, STM32WB35xx, STM32WB30xx product and BLE/Zigbee static concurrent mode</h3>
<ul>
<li><strong>STM32WB35xx</strong>:
@@ -187,8 +665,8 @@
<li>Introduce the support od STM32WB5Mxx inside the cmsis device, the HAL and the LL library.</li>
</ul></li>
</ul>
-<h2 id="contents">Contents</h2>
-<h3 id="projects">Projects</h3>
+<h2 id="contents-1">Contents</h2>
+<h3 id="projects-1">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
@@ -196,7 +674,7 @@
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>)</li>
<li><strong>NUCLEO-WB35CE</strong> (<a href="Projects/NUCLEO-WB35CE/Release_Notes.html">release notes</a>) (<a href="Projects/NUCLEO-WB35CE/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
-<h3 id="components">Components</h3>
+<h3 id="components-1">Components</h3>
<table>
<caption>STM32WB5x Firmware Upgrade Services Binary</caption>
<thead>
@@ -509,7 +987,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations">Known Limitations</h2>
+<h2 id="known-limitations-1">Known Limitations</h2>
<ul>
<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
<ul>
@@ -517,20 +995,20 @@
</ul></li>
<li>The example RCC/RCC_ClockConfig encounter a hard fault after few keypressed. This will be corrected inside the next release.</li>
</ul>
-<h2 id="development-toolchains-and-compilers">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-1">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
<li>STM32CubeIDE toolchain V1.2.0 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-1">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx, STM32WB50xx, STM32WB35xx and STM32WB30xx devices.</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
<li>NUCLEO-WB35CE board.</li>
</ul>
-<h2 id="dependencies">Dependencies</h2>
+<h2 id="dependencies-1">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -553,7 +1031,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.4.0 / 06-December-2019</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<h3 id="maintenance-release">Maintenance Release</h3>
<ul>
<li><strong>BLE</strong>:
@@ -578,15 +1056,15 @@
</ul></li>
<li>Maintenance release for HAL and LL drivers.</li>
</ul>
-<h2 id="contents-1">Contents</h2>
-<h3 id="projects-1">Projects</h3>
+<h2 id="contents-2">Contents</h2>
+<h3 id="projects-2">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
<li><strong>P-NUCLEO-WB55.Nucleo</strong> (<a href="Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt">default application</a>)</li>
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
-<h3 id="components-1">Components</h3>
+<h3 id="components-2">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -832,7 +1310,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-1">Known Limitations</h2>
+<h2 id="known-limitations-2">Known Limitations</h2>
<ul>
<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
<ul>
@@ -840,18 +1318,18 @@
</ul></li>
<li>BLE_MeshLightingDemo application is not functionnal under Linux platform.</li>
</ul>
-<h2 id="development-toolchains-and-compilers-1">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-2">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards-1">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-2">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx and STM32WB50xx devices</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
</ul>
-<h2 id="dependencies-1">Dependencies</h2>
+<h2 id="dependencies-2">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -873,7 +1351,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.3.0 / 11-September-2019</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<h3 id="introduction-of-zigbee-support">Introduction of ZIGBEE support</h3>
<p>STM32WB ecosystem keeps growing, now with the introduction of ZigBee protocol supportĀ as <strong>certified compliant platform</strong>, running on <strong>certified 802.15.4 2015 LLD MAC and PHY</strong>.</p>
<p>The wireless stack is based on <strong>ZigBee pro 2017, R22 release version</strong> in order to propose a ZigBee 3.0 solution. First ON/OFF cluster is coming in this STM32CubeWB Firmware Package delivery release.</p>
@@ -902,15 +1380,15 @@
<li>Integration of BLE Mesh library v1.10.004</li>
<li>Maintenance release for CMSIS, HAL and LL drivers.</li>
</ul>
-<h2 id="contents-2">Contents</h2>
-<h3 id="projects-2">Projects</h3>
+<h2 id="contents-3">Contents</h2>
+<h3 id="projects-3">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
<li><strong>P-NUCLEO-WB55.Nucleo</strong> (<a href="Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt">default application</a>)</li>
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
-<h3 id="components-2">Components</h3>
+<h3 id="components-3">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -1150,7 +1628,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-2">Known Limitations</h2>
+<h2 id="known-limitations-3">Known Limitations</h2>
<ul>
<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
<ul>
@@ -1159,18 +1637,18 @@
<li>Mac 802-15-4 applications are provided with EWARM IDE. MDK-ARM and SW4STM32 IDE are planned for a future release.</li>
<li>BLE_MeshLightingDemo application is not functionnal under Linux platform.</li>
</ul>
-<h2 id="development-toolchains-and-compilers-2">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-3">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards-2">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-3">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx and STM32WB50xx devices</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
</ul>
-<h2 id="dependencies-2">Dependencies</h2>
+<h2 id="dependencies-3">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -1192,7 +1670,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.2.0 / 3rd-July-2019</label>
<div>
-<h2 id="main-changes-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<h3 id="stm32wb50xx-introduction-and-new-features-addition">STM32WB50xx introduction and new features addition</h3>
<p>This release introduces the following feature:</p>
<ul>
@@ -1219,15 +1697,15 @@
<li>Mesh Library V1.10.000</li>
</ul></li>
</ul>
-<h2 id="contents-3">Contents</h2>
-<h3 id="projects-3">Projects</h3>
+<h2 id="contents-4">Contents</h2>
+<h3 id="projects-4">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
<li><strong>P-NUCLEO-WB55.Nucleo</strong> (<a href="Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt">default application</a>)</li>
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
-<h3 id="components-3">Components</h3>
+<h3 id="components-4">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -1467,7 +1945,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-3">Known Limitations</h2>
+<h2 id="known-limitations-4">Known Limitations</h2>
<ul>
<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
<ul>
@@ -1477,18 +1955,18 @@
<li>BLE_MeshLightingDemo application is not functionnal under Linux platform.</li>
<li>Zigbee supports only OnOff cluster.</li>
</ul>
-<h2 id="development-toolchains-and-compilers-3">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-4">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards-3">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-4">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx and STM32WB50xx devices</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
</ul>
-<h2 id="dependencies-3">Dependencies</h2>
+<h2 id="dependencies-4">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -1510,7 +1988,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.1.1 / 17-May-2019</label>
<div>
-<h2 id="main-changes-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<h3 id="patch-release-for-fus-v1.0.2wireless-coprocessor-binary-bug-fix-and-ble-mesh-library-improvements">Patch release for FUS V1.0.2,Wireless Coprocessor Binary bug fix and BLE Mesh Library improvements</h3>
<p>This release introduces the following feature:</p>
<ul>
@@ -1536,8 +2014,8 @@
</ul></li>
</ul></li>
</ul>
-<h2 id="contents-4">Contents</h2>
-<h3 id="projects-4">Projects</h3>
+<h2 id="contents-5">Contents</h2>
+<h3 id="projects-5">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
@@ -1545,7 +2023,7 @@
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
<p><em>Please note that the path of the example projects have been change to P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle.</em></p>
-<h3 id="components-4">Components</h3>
+<h3 id="components-5">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -1767,7 +2245,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-4">Known Limitations</h2>
+<h2 id="known-limitations-5">Known Limitations</h2>
<ul>
<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
<ul>
@@ -1785,18 +2263,18 @@
<li>SW4STM32 project is compiled without optimisation. (With optimised size compilation, the virtual com port required for the application is not functionnal)</li>
</ul></li>
</ul>
-<h2 id="development-toolchains-and-compilers-4">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-5">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards-4">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-5">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx devices</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
</ul>
-<h2 id="dependencies-4">Dependencies</h2>
+<h2 id="dependencies-5">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -1818,7 +2296,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.1.0 / 05-April-2019</label>
<div>
-<h2 id="main-changes-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<h3 id="new-features-introduction-and-maintenance-release">New features introduction and maintenance release</h3>
<p>This release introduces the following feature:</p>
<ul>
@@ -1880,8 +2358,8 @@
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\BLE</li>
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\Thread</li>
</ul>
-<h2 id="contents-5">Contents</h2>
-<h3 id="projects-5">Projects</h3>
+<h2 id="contents-6">Contents</h2>
+<h3 id="projects-6">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
@@ -1889,7 +2367,7 @@
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
<p><em>Please note that the path of the example projects have been change to P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle.</em></p>
-<h3 id="components-5">Components</h3>
+<h3 id="components-6">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -2111,7 +2589,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-5">Known Limitations</h2>
+<h2 id="known-limitations-6">Known Limitations</h2>
<ul>
<li>With the ability to change the Coprocessor Wireless Binaries Over The Air (OTA), it is possible to switch from one binary to another. Only, the following case is not possible due to available memory size:
<ul>
@@ -2129,18 +2607,18 @@
<li>SW4STM32 project is compiled without optimisation. (With optimised size compilation, the virtual com port required for the application is not functionnal)</li>
</ul></li>
</ul>
-<h2 id="development-toolchains-and-compilers-5">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-6">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards-5">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-6">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx devices</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
</ul>
-<h2 id="dependencies-5">Dependencies</h2>
+<h2 id="dependencies-6">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -2162,7 +2640,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.0.0 / 06-February-2019</label>
<div>
-<h2 id="main-changes-6">Main Changes</h2>
+<h2 id="main-changes-7">Main Changes</h2>
<h3 id="first-release">First release</h3>
<p>First release of STM32CubeWB (STM32Cube for STM32WB Series) supporting STM32WB55xx devices.</p>
<p>In the STM32CubeWB MCU Package, most of the examples and applications projects are generated with the STM32CubeMX tool to initialize the system, peripherals and middleware stacks.</p>
@@ -2178,15 +2656,15 @@
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\BLE</li>
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\Thread</li>
</ul>
-<h2 id="contents-6">Contents</h2>
-<h3 id="projects-6">Projects</h3>
+<h2 id="contents-7">Contents</h2>
+<h3 id="projects-7">Projects</h3>
<p>The STM32CubeWB Firmware package comes with a rich set of examples running on STMicroelectronics boards, organized by board and provided with preconfigured projects for the main supported toolchains.</p>
<p>The exhaustive list of projects and their short description is provided in this table (<a href="Projects/STM32CubeProjectsList.html">STM32CubeProjectsList.html</a>).</p>
<ul>
<li><strong>P-NUCLEO-WB55.Nucleo</strong> (<a href="Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt">default application</a>)</li>
<li><strong>P-NUCLEO-WB55.USBDongle</strong> (<a href="Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html">release notes</a>) (<a href="Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt">default application</a>)</li>
</ul>
-<h3 id="components-6">Components</h3>
+<h3 id="components-7">Components</h3>
<table>
<caption>Coprocessor Wireless Binaries</caption>
<thead>
@@ -2377,7 +2855,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-6">Known Limitations</h2>
+<h2 id="known-limitations-7">Known Limitations</h2>
<ul>
<li>BLE\BLE_p2pClient is provided with EWARM and MDK-ARM IDE. A connection issue with BLE_p2pServer is encounter with SW4STM32.</li>
<li>BLE\BLE_p2pRouter is provided with EWARM and MDK-ARM IDE. A connection issue with BLE_p2pServer is encounter with SW4STM32.</li>
@@ -2407,18 +2885,18 @@
</ul></li>
</ul></li>
</ul>
-<h2 id="development-toolchains-and-compilers-6">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-7">Development Toolchains and Compilers</h2>
<ul>
<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2 + ST-Link</li>
<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25 + ST-Link</li>
<li>System Workbench for STM32 (SW4STM32) toolchain V2.7 + ST-Link</li>
</ul>
-<h2 id="supported-devices-and-boards-6">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-7">Supported Devices and boards</h2>
<ul>
<li>STM32WB55xx devices</li>
<li>P-NUCLEO-WB55 kit composed of P-NUCLEO-WB55.Nucleo and P-NUCLEO-WB55.USBDongle</li>
</ul>
-<h2 id="dependencies-6">Dependencies</h2>
+<h2 id="dependencies-7">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
diff --git a/Utilities/lpm/tiny_lpm/Release_Notes.md b/Utilities/lpm/tiny_lpm/Release_Notes.md
new file mode 100644
index 000000000..c808f595e
--- /dev/null
+++ b/Utilities/lpm/tiny_lpm/Release_Notes.md
@@ -0,0 +1,116 @@
+---
+pagetitle: Release Notes for STM32 TINY low power manager
+lang: en
+---
+
+::: {.row}
+::: {.col-sm-12 .col-lg-4}
+
+::: {.card .fluid}
+::: {.sectione .dark}
+<center>
+# <small>Release Notes for</small> STM32 TINY low power manger
+Copyright &copy; 2019 STMicroelectronics\
+
+[![ST logo](_htmresc/st_logo.png)](https://www.st.com){.logo}
+</center>
+:::
+:::
+
+# License
+
+This software component is licensed by ST under BSD 3-Clause license, the "License";
+You may not use this file except in compliance with the License. You may obtain a copy of the License at:
+
+ [https://opensource.org/licenses/BSD-3-Clause]
+
+# Purpose
+
+The code source delivered is an utility to help customer to build a low power application.
+:::
+
+::: {.col-sm-12 .col-lg-8}
+# Update History
+
+::: {.collapse}
+<input type="checkbox" id="collapse-section1" checked aria-hidden="true">
+<label for="collapse-section1" aria-hidden="true">V1.1.0 / 04-June-2019</label>
+<div>
+
+## Main Changes
+
+### release V1.1.0
+
+## Contents
+
+ Headline
+ --------
+ Add CubeMx tag inside the template file.
+
+ : Fixed bugs list
+\
+
+## known limitations
+
+## Development Toolchains and Compilers
+
+- IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2
+- RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25
+- System Workbench STM32 (SW4STM32) toolchain V2.7.2
+
+## Supported Devices and boards
+
+## backward compatibility
+
+## Dependencies
+
+
+</div>
+:::
+
+::: {.collapse}
+<input type="checkbox" id="collapse-section2" aria-hidden="true">
+<label for="collapse-section2" aria-hidden="true">V1.0.0 / 13-May-2019</label>
+<div>
+
+## Main Changes
+
+### first release
+
+
+## Contents
+
+ Headline
+ --------
+ first official release
+
+ : Fixed bugs list
+\
+
+## known limitations
+
+## Development Toolchains and Compilers
+
+- IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2
+- RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25
+- System Workbench STM32 (SW4STM32) toolchain V2.7.2
+
+## Supported Devices and boards
+
+## backward compatibility
+
+## Dependencies
+
+
+</div>
+:::
+
+:::
+:::
+
+<footer class="sticky">
+For complete documentation on STM32,visit: [[www.st.com/stm32](http://www.st.com)]
+
+This release note uses up to date web standards and, for this reason, should not be opened with Internet Explorer
+but preferably with popular browsers such as Google Chrome, Mozilla Firefox, Opera or Microsoft Edge.
+</footer>
diff --git a/package.xml b/package.xml
index ee8363330..cc9e14d7d 100644
--- a/package.xml
+++ b/package.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Package DBVersion="2.0">
- <PackDescription Release="FW.WB.1.5.0">
+ <PackDescription Release="FW.WB.1.6.0">
<Note Release="ReleaseNotes.html"/>
</PackDescription>
</Package> \ No newline at end of file